[scenic] web_view: view_provider->base_view

All topaz clients expose both the V1 and V2 ViewProvider interfaces,
prepping them for the full move to eventpairs.

No dependencies remain on ui/view_framework in web_view or web_runner.

TEST: set_root_view web_view

SCN-898 #comment
SCN-993 #comment

Change-Id: Iaeaa3deaaad30148a102c0fec086788a02d4f97f
diff --git a/runtime/web_runner_prototype/BUILD.gn b/runtime/web_runner_prototype/BUILD.gn
index 2bd767b..a3c25e2 100644
--- a/runtime/web_runner_prototype/BUILD.gn
+++ b/runtime/web_runner_prototype/BUILD.gn
@@ -21,6 +21,7 @@
 
     public_deps = [
       "//garnet/public/fidl/fuchsia.sys",
+      "//garnet/public/fidl/fuchsia.ui.app",
       "//garnet/public/fidl/fuchsia.ui.viewsv1",
       "//garnet/public/lib/component/cpp",
       "//topaz/runtime/web_runner/services",
diff --git a/runtime/web_runner_prototype/component_controller.cc b/runtime/web_runner_prototype/component_controller.cc
index a5ca94a..e03a3d4 100644
--- a/runtime/web_runner_prototype/component_controller.cc
+++ b/runtime/web_runner_prototype/component_controller.cc
@@ -12,10 +12,15 @@
 
 ComponentController::ComponentController(Runner* runner)
     : runner_(runner), binding_(this) {
+  service_provider_.AddService<fuchsia::ui::app::ViewProvider>(
+      [this](fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider> request) {
+        view_provider_bindings_.AddBinding(this, std::move(request));
+      });
+
   service_provider_.AddService<fuchsia::ui::viewsv1::ViewProvider>(
       [this](
           fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider> request) {
-        view_provider_bindings_.AddBinding(this, std::move(request));
+        v1_view_provider_bindings_.AddBinding(this, std::move(request));
       });
 }
 
@@ -50,6 +55,15 @@
 }
 
 void ComponentController::CreateView(
+    zx::eventpair view_token,
+    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
+    fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services) {
+  CreateView(fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>(
+                 zx::channel(view_token.release())),
+             std::move(incoming_services));
+}
+
+void ComponentController::CreateView(
     fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> view_owner,
     fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> services) {
   fuchsia::sys::ServiceProviderPtr view_services;
diff --git a/runtime/web_runner_prototype/component_controller.h b/runtime/web_runner_prototype/component_controller.h
index 8b6465e..575f721 100644
--- a/runtime/web_runner_prototype/component_controller.h
+++ b/runtime/web_runner_prototype/component_controller.h
@@ -6,6 +6,7 @@
 #define TOPAZ_RUNTIME_WEB_RUNNER_PROTOTYPE_COMPONENT_CONTROLLER_H_
 
 #include <fuchsia/sys/cpp/fidl.h>
+#include <fuchsia/ui/app/cpp/fidl.h>
 #include <fuchsia/ui/viewsv1/cpp/fidl.h>
 #include <fuchsia/webview/cpp/fidl.h>
 
@@ -17,9 +18,11 @@
 #include "lib/svc/cpp/service_provider_bridge.h"
 
 namespace web {
+
 class Runner;
 
 class ComponentController : public fuchsia::sys::ComponentController,
+                            public fuchsia::ui::app::ViewProvider,
                             public fuchsia::ui::viewsv1::ViewProvider {
  public:
   explicit ComponentController(Runner* runner);
@@ -37,6 +40,13 @@
   void Kill() final;
   void Detach() final;
 
+  // |fuchsia::ui::app::ViewProvider|:
+  void CreateView(
+      zx::eventpair view_token,
+      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
+      fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services)
+      final;
+
   // |fuchsia::ui::viewsv1::ViewProvider|:
   void CreateView(
       fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> view_owner,
@@ -45,7 +55,9 @@
   Runner* runner_;
   component::ServiceProviderBridge service_provider_;
   fidl::Binding<fuchsia::sys::ComponentController> binding_;
-  fidl::BindingSet<fuchsia::ui::viewsv1::ViewProvider> view_provider_bindings_;
+  fidl::BindingSet<fuchsia::ui::app::ViewProvider> view_provider_bindings_;
+  fidl::BindingSet<fuchsia::ui::viewsv1::ViewProvider>
+      v1_view_provider_bindings_;
   std::string url_;
 
   fuchsia::sys::ComponentControllerPtr web_view_controller_;
diff --git a/runtime/web_runner_prototype/runner_unittest.cc b/runtime/web_runner_prototype/runner_unittest.cc
index d44e2fb..c271e77 100644
--- a/runtime/web_runner_prototype/runner_unittest.cc
+++ b/runtime/web_runner_prototype/runner_unittest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <fuchsia/ui/app/cpp/fidl.h>
 #include <fuchsia/ui/viewsv1/cpp/fidl.h>
 #include <fuchsia/webview/cpp/fidl.h>
 
@@ -12,11 +13,13 @@
 namespace web {
 namespace testing {
 
-class FakeWebView : public fuchsia::ui::viewsv1::ViewProvider,
+class FakeWebView : public fuchsia::ui::app::ViewProvider,
+                    public fuchsia::ui::viewsv1::ViewProvider,
                     public fuchsia::webview::WebView {
  public:
   FakeWebView() {
     component_.AddPublicService(view_provider_bindings_.GetHandler(this));
+    component_.AddPublicService(v1_view_provider_bindings_.GetHandler(this));
     service_provider_.AddService(web_view_bindings_.GetHandler(this));
   }
 
@@ -24,12 +27,23 @@
     component_.Register("web_view", fake_launcher);
   }
 
+  // |fuchsia::ui::app::ViewProvider|:
+  void CreateView(
+      zx::eventpair view_token,
+      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
+      fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services)
+      final {
+    ++create_view_count_;
+    service_provider_.AddBinding(std::move(incoming_services));
+  }
+
   // |fuchsia::ui::viewsv1::ViewProvider|:
   void CreateView(
-      fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> view_owner,
+      fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
+          view_owner_request,
       fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> services) final {
-    ++create_view_count_;
-    service_provider_.AddBinding(std::move(services));
+    CreateView(zx::eventpair(view_owner_request.TakeChannel().release()),
+               std::move(services), nullptr);
   }
 
   // |fuchsia::webview::WebView|:
@@ -46,7 +60,9 @@
 
  private:
   component::testing::FakeComponent component_;
-  fidl::BindingSet<fuchsia::ui::viewsv1::ViewProvider> view_provider_bindings_;
+  fidl::BindingSet<fuchsia::ui::app::ViewProvider> view_provider_bindings_;
+  fidl::BindingSet<fuchsia::ui::viewsv1::ViewProvider>
+      v1_view_provider_bindings_;
   fidl::BindingSet<fuchsia::webview::WebView> web_view_bindings_;
   component::ServiceProviderImpl service_provider_;
 };
diff --git a/runtime/web_view/BUILD.gn b/runtime/web_view/BUILD.gn
index 041d791..a56d960 100644
--- a/runtime/web_view/BUILD.gn
+++ b/runtime/web_view/BUILD.gn
@@ -7,9 +7,9 @@
 import("//topaz/runtime/web_view/config.gni")
 
 if (enable_chromium_based_web_runner) {
-# If chromium is the web runner, we don't need any of these targets.
-# Leave empty build & package targets for package configurations that still
-# reference these.
+  # If chromium is the web runner, we don't need any of these targets.
+  # Leave empty build & package targets for package configurations that still
+  # reference these.
   package("web_view") {
     deprecated_system_image = true
     # Empty
@@ -38,11 +38,12 @@
     deps = [
       ":webkit",
       "//garnet/public/fidl/fuchsia.math",
+      "//garnet/public/fidl/fuchsia.ui.app",
       "//garnet/public/fidl/fuchsia.ui.viewsv1",
       "//garnet/public/lib/component/cpp",
       "//garnet/public/lib/fxl",
       "//garnet/public/lib/icu_data/cpp",
-      "//garnet/public/lib/ui/view_framework:view_provider",
+      "//garnet/public/lib/ui/base_view/cpp",
       "//garnet/public/lib/url",
       "//peridot/lib/rapidjson",
       "//peridot/public/fidl/fuchsia.modular",
diff --git a/runtime/web_view/tests/web_view_provider_test_module.cc b/runtime/web_view/tests/web_view_provider_test_module.cc
index 8dd2004..9178bc4 100644
--- a/runtime/web_view/tests/web_view_provider_test_module.cc
+++ b/runtime/web_view/tests/web_view_provider_test_module.cc
@@ -2,6 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <fuchsia/ui/app/cpp/fidl.h>
+#include <fuchsia/ui/viewsv1/cpp/fidl.h>
+
 #include <lib/app_driver/cpp/module_driver.h>
 #include <lib/async-loop/cpp/loop.h>
 #include <lib/fsl/vmo/strings.h>
@@ -19,9 +22,9 @@
 // root/null Link) back into an output link ("output_url").
 class TestModule : fuchsia::modular::LinkWatcher {
  public:
-  TestModule(modular::ModuleHost* const module_host,
+  TestModule(modular::ModuleHost* module_host,
              fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
+                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
       : module_host_(module_host),
         module_context_(module_host_->module_context()),
         output_url_link_watcher_binding_(this) {
@@ -29,6 +32,13 @@
     StartTest();
   }
 
+  TestModule(modular::ModuleHost* const module_host,
+             fidl::InterfaceRequest<
+                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
+      : TestModule(
+            module_host,
+            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
+
   // Step 1: Start `web_view` and give it a URL (via root link), and setup
   // observation for output URL (via "output_url" link).
   void StartTest() {
@@ -118,4 +128,4 @@
                                            [&loop] { loop.Quit(); });
   loop.Run();
   return 0;
-}
\ No newline at end of file
+}
diff --git a/runtime/web_view/web_view_impl.cpp b/runtime/web_view/web_view_impl.cpp
index 97eaeff..e2a8edc 100644
--- a/runtime/web_view/web_view_impl.cpp
+++ b/runtime/web_view/web_view_impl.cpp
@@ -63,16 +63,10 @@
   }
 }
 
-WebViewImpl::WebViewImpl(
-    fuchsia::ui::viewsv1::ViewManagerPtr view_manager,
-    fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-        view_owner_request,
-    fuchsia::ui::input::ImeServicePtr ime_service,
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-        outgoing_services_request,
-    const std::string& url)
-    : BaseView(std::move(view_manager), std::move(view_owner_request),
-               "WebView"),
+WebViewImpl::WebViewImpl(scenic::ViewContext view_context,
+                         fuchsia::ui::input::ImeServicePtr ime_service,
+                         const std::string& url)
+    : V1BaseView(std::move(view_context), "WebView"),
       ime_service_(std::move(ime_service)),
       ime_client_binding_(this),
       weak_factory_(this),
@@ -85,7 +79,7 @@
   web_view_.setup_once();
 
   std::function<void(bool)> focusDelegate = [=](bool focused) {
-      this->HandleWebRequestsFocusEvent(focused);
+    this->HandleWebRequestsFocusEvent(focused);
   };
 
   web_view_.setInputFocusDelegate(focusDelegate);
@@ -93,26 +87,23 @@
   SetNeedSquareMetrics(true);
   parent_node().AddChild(image_cycler_);
 
-  if (outgoing_services_request) {
-    // Expose |WebView| interface to caller
-    outgoing_services_.AddService<fuchsia::webview::WebView>(
-        [this](fidl::InterfaceRequest<fuchsia::webview::WebView> request) {
-          FXL_LOG(INFO) << "web view service request";
-          web_view_interface_bindings_.AddBinding(this, std::move(request));
-        });
-    outgoing_services_.AddBinding(std::move(outgoing_services_request));
-  }
+  // Expose |WebView| interface to caller.
+  outgoing_services().AddService<fuchsia::webview::WebView>(
+      [this](fidl::InterfaceRequest<fuchsia::webview::WebView> request) {
+        FXL_LOG(INFO) << "web view service request";
+        web_view_interface_bindings_.AddBinding(this, std::move(request));
+      });
 
-  async::PostTask(async_get_default_dispatcher(), ([weak = weak_factory_.GetWeakPtr()]() {
+  async::PostTask(async_get_default_dispatcher(),
+                  ([weak = weak_factory_.GetWeakPtr()]() {
                     if (weak)
                       weak->CallIdle();
                   }));
 }
 
-WebViewImpl::~WebViewImpl() {}
-
 void WebViewImpl::HandleWebRequestsFocusEvent(bool focused) {
-  FXL_LOG(INFO) << "WebView: web requests input focus:" << (focused ? "focused" : "unfocused");
+  FXL_LOG(INFO) << "WebView: web requests input focus:"
+                << (focused ? "focused" : "unfocused");
   web_requests_input_ = focused;
   UpdateInputConnection();
 }
@@ -125,9 +116,10 @@
     ime_client_binding_.Bind(client_ptr.NewRequest());
     auto state = fuchsia::ui::input::TextInputState{};
     state.text = "";
-    ime_service_->GetInputMethodEditor(fuchsia::ui::input::KeyboardType::TEXT, fuchsia::ui::input::InputMethodAction::SEND,
-                                       std::move(state), std::move(client_ptr),
-                                       ime_.NewRequest());
+    ime_service_->GetInputMethodEditor(
+        fuchsia::ui::input::KeyboardType::TEXT,
+        fuchsia::ui::input::InputMethodAction::SEND, std::move(state),
+        std::move(client_ptr), ime_.NewRequest());
   } else if (ime_client_binding_.is_bound()) {
     ime_service_->HideKeyboard();
     ime_client_binding_.Unbind();
@@ -136,7 +128,7 @@
 
 // |fuchsia::ui::input::InputMethodEditorClient|
 void WebViewImpl::DidUpdateState(fuchsia::ui::input::TextInputState state,
-                    fuchsia::ui::input::InputEventPtr event) {
+                                 fuchsia::ui::input::InputEventPtr event) {
   if (event != nullptr && event->is_keyboard() && has_scenic_focus_) {
     HandleKeyboardEvent(*event);
   }
@@ -158,8 +150,6 @@
   }
 }
 
-
-
 // |WebView|:
 void WebViewImpl::SetUrl(fidl::StringPtr url) {
   url_ = url;
@@ -266,13 +256,14 @@
   }
 }
 
-void WebViewImpl::HandleFocusEvent(const fuchsia::ui::input::FocusEvent& focus) {
+void WebViewImpl::HandleFocusEvent(
+    const fuchsia::ui::input::FocusEvent& focus) {
   has_scenic_focus_ = focus.focused;
   web_view_.setFocused(focus.focused);
   UpdateInputConnection();
 }
 
-// |BaseView|:
+// |scenic::V1BaseView|
 bool WebViewImpl::OnInputEvent(fuchsia::ui::input::InputEvent event) {
   bool handled = false;
   web_view_.setVisible(true);
@@ -296,7 +287,7 @@
   return handled;
 }
 
-// |BaseView|:
+// |scenic::V1BaseView|
 void WebViewImpl::OnSceneInvalidated(
     fuchsia::images::PresentationInfo presentation_info) {
   if (!has_physical_size())
@@ -346,7 +337,8 @@
 void WebViewImpl::CallIdle() {
   web_view_.iterateEventLoop();
   InvalidateScene();
-  async::PostTask(async_get_default_dispatcher(), ([weak = weak_factory_.GetWeakPtr()]() {
+  async::PostTask(async_get_default_dispatcher(),
+                  ([weak = weak_factory_.GetWeakPtr()]() {
                     if (weak)
                       weak->CallIdle();
                   }));
diff --git a/runtime/web_view/web_view_impl.h b/runtime/web_view/web_view_impl.h
index 4828bb4..17545d1 100644
--- a/runtime/web_view/web_view_impl.h
+++ b/runtime/web_view/web_view_impl.h
@@ -5,15 +5,15 @@
 #ifndef TOPAZ_RUNTIME_WEB_VIEW_WEB_VIEW_IMPL_H_
 #define TOPAZ_RUNTIME_WEB_VIEW_WEB_VIEW_IMPL_H_
 
-#include <fuchsia/webview/cpp/fidl.h>
 #include <fuchsia/ui/input/cpp/fidl.h>
+#include <fuchsia/webview/cpp/fidl.h>
 
 #include "lib/component/cpp/service_provider_impl.h"
 #include "lib/fidl/cpp/binding_set.h"
 #include "lib/fxl/macros.h"
 #include "lib/fxl/memory/weak_ptr.h"
+#include "lib/ui/base_view/cpp/v1_base_view.h"
 #include "lib/ui/scenic/cpp/host_image_cycler.h"
-#include "lib/ui/view_framework/base_view.h"
 
 #ifdef EXPERIMENTAL_WEB_ENTITY_EXTRACTION
 #include "topaz/runtime/web_view/schema_org_context.h"
@@ -36,18 +36,14 @@
   bool is_drag_;
 };
 
-class WebViewImpl : public mozart::BaseView, public fuchsia::webview::WebView,
+class WebViewImpl : public scenic::V1BaseView,
+                    public fuchsia::webview::WebView,
                     fuchsia::ui::input::InputMethodEditorClient {
  public:
-  WebViewImpl(fuchsia::ui::viewsv1::ViewManagerPtr view_manager,
-              fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-                  view_owner_request,
+  WebViewImpl(scenic::ViewContext view_context,
               fuchsia::ui::input::ImeServicePtr ime_service,
-              fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-                  outgoing_services_request,
               const std::string& url);
-
-  ~WebViewImpl();
+  ~WebViewImpl() = default;
 
 #ifdef EXPERIMENTAL_WEB_ENTITY_EXTRACTION
   void set_context_writer(fuchsia::modular::ContextWriterPtr context_writer) {
@@ -85,10 +81,8 @@
   void HandleWebRequestsFocusEvent(bool focused);
   void UpdateInputConnection();
 
-  // |BaseView|:
+  // |scenic::V1BaseView|
   bool OnInputEvent(fuchsia::ui::input::InputEvent event) override;
-
-  // |BaseView|:
   void OnSceneInvalidated(
       fuchsia::images::PresentationInfo presentation_info) override;
 
@@ -99,7 +93,8 @@
   ::WebView web_view_;
   fuchsia::ui::input::ImeServicePtr ime_service_;
   fuchsia::ui::input::InputMethodEditorPtr ime_ = nullptr;
-  fidl::Binding<fuchsia::ui::input::InputMethodEditorClient> ime_client_binding_;
+  fidl::Binding<fuchsia::ui::input::InputMethodEditorClient>
+      ime_client_binding_;
   fxl::WeakPtrFactory<WebViewImpl> weak_factory_;
   bool url_set_ = false;
   bool has_scenic_focus_ = false;
diff --git a/runtime/web_view/web_view_provider.cpp b/runtime/web_view/web_view_provider.cpp
index 00697ec..a8c6643 100644
--- a/runtime/web_view/web_view_provider.cpp
+++ b/runtime/web_view/web_view_provider.cpp
@@ -13,6 +13,7 @@
     : loop_(loop),
       url_(url),
       context_(component::StartupContext::CreateFromStartupInfo()),
+      old_view_provider_binding_(this),
       view_provider_binding_(this),
       lifecycle_binding_(this),
       main_link_watcher_binding_(this) {
@@ -21,11 +22,17 @@
     FXL_LOG(WARNING) << "Could not load ICU data";
   }
 
-  context_->outgoing().AddPublicService<fuchsia::ui::viewsv1::ViewProvider>(
-      [this](fidl::InterfaceRequest<ViewProvider> request) {
+  context_->outgoing().AddPublicService<fuchsia::ui::app::ViewProvider>(
+      [this](fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider> request) {
         FXL_LOG(INFO) << "Add ViewProvider binding";
         view_provider_binding_.Bind(std::move(request));
       });
+  context_->outgoing().AddPublicService<fuchsia::ui::viewsv1::ViewProvider>(
+      [this](
+          fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider> request) {
+        FXL_LOG(INFO) << "Add V1 ViewProvider binding";
+        old_view_provider_binding_.Bind(std::move(request));
+      });
   context_->outgoing().AddPublicService<fuchsia::modular::Lifecycle>(
       [this](fidl::InterfaceRequest<fuchsia::modular::Lifecycle> request) {
         FXL_LOG(INFO) << "got request for lifecycle service";
@@ -50,17 +57,26 @@
 }
 
 void WebViewProvider::CreateView(
-    fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-        view_owner_request,
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> view_services) {
+    zx::eventpair view_token,
+    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
+    fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services) {
   FXL_LOG(INFO) << "CreateView";
   FXL_DCHECK(!view_);
+
+  auto scenic =
+      context_->ConnectToEnvironmentService<fuchsia::ui::scenic::Scenic>();
+  scenic::ViewContext view_context = {
+      .session_and_listener_request =
+          scenic::CreateScenicSessionPtrAndListenerRequest(scenic.get()),
+      .view_token = std::move(view_token),
+      .incoming_services = std::move(incoming_services),
+      .outgoing_services = std::move(outgoing_services),
+      .startup_context = context_.get(),
+  };
   view_ = std::make_unique<WebViewImpl>(
-      context_
-          ->ConnectToEnvironmentService<fuchsia::ui::viewsv1::ViewManager>(),
-      std::move(view_owner_request),
+      std::move(view_context),
       context_->ConnectToEnvironmentService<fuchsia::ui::input::ImeService>(),
-      std::move(view_services), url_);
+      url_);
 #ifdef EXPERIMENTAL_WEB_ENTITY_EXTRACTION
   if (context_writer_) {
     view_->set_context_writer(std::move(context_writer_));
@@ -76,6 +92,14 @@
   });
 }
 
+void WebViewProvider::CreateView(
+    fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
+        view_owner_request,
+    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> view_services) {
+  CreateView(zx::eventpair(view_owner_request.TakeChannel().release()),
+             std::move(view_services), nullptr);
+}
+
 void WebViewProvider::Terminate() { loop_->Quit(); }
 
 void WebViewProvider::Notify(fuchsia::mem::Buffer json) {
diff --git a/runtime/web_view/web_view_provider.h b/runtime/web_view/web_view_provider.h
index 3f7b40d..a353f12 100644
--- a/runtime/web_view/web_view_provider.h
+++ b/runtime/web_view/web_view_provider.h
@@ -6,13 +6,15 @@
 #define TOPAZ_RUNTIME_WEB_VIEW_WEB_VIEW_PROVIDER_H_
 
 #include <fuchsia/modular/cpp/fidl.h>
+#include <fuchsia/ui/app/cpp/fidl.h>
 #include <fuchsia/ui/viewsv1/cpp/fidl.h>
 #include <lib/async-loop/cpp/loop.h>
 
 #include "lib/component/cpp/startup_context.h"
 #include "topaz/runtime/web_view/web_view_impl.h"
 
-class WebViewProvider : fuchsia::ui::viewsv1::ViewProvider,
+class WebViewProvider : fuchsia::ui::app::ViewProvider,
+                        fuchsia::ui::viewsv1::ViewProvider,
                         fuchsia::modular::Lifecycle,
                         fuchsia::modular::LinkWatcher {
  public:
@@ -20,6 +22,13 @@
 
  private:
   // |ViewProvider|
+  void CreateView(
+      zx::eventpair view_token,
+      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
+      fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services)
+      override;
+
+  // |ViewProvider|
   void CreateView(fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
                       view_owner_request,
                   fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
@@ -37,7 +46,8 @@
   std::unique_ptr<WebViewImpl> view_;
   // Link state, used to gather URL updates for the story
   fuchsia::modular::LinkPtr main_link_;
-  fidl::Binding<ViewProvider> view_provider_binding_;
+  fidl::Binding<fuchsia::ui::viewsv1::ViewProvider> old_view_provider_binding_;
+  fidl::Binding<fuchsia::ui::app::ViewProvider> view_provider_binding_;
   fidl::Binding<fuchsia::modular::Lifecycle> lifecycle_binding_;
   fidl::Binding<fuchsia::modular::LinkWatcher> main_link_watcher_binding_;
   fuchsia::modular::ModuleContextPtr module_context_;