// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef WEBRUNNER_BROWSER_FRAME_IMPL_H_ #define WEBRUNNER_BROWSER_FRAME_IMPL_H_ #include #include #include #include #include #include "base/macros.h" #include "content/public/browser/web_contents_delegate.h" #include "content/public/browser/web_contents_observer.h" #include "ui/aura/window_tree_host.h" #include "ui/wm/core/focus_controller.h" #include "url/gurl.h" #include "webrunner/fidl/chromium/web/cpp/fidl.h" namespace aura { class WindowTreeHost; } // namespace aura namespace content { class WebContents; } // namespace content namespace webrunner { class ContextImpl; // Implementation of Frame from //webrunner/fidl/frame.fidl. // Implements a Frame service, which is a wrapper for a WebContents instance. class FrameImpl : public chromium::web::Frame, public chromium::web::NavigationController, public content::WebContentsObserver, public content::WebContentsDelegate { public: FrameImpl(std::unique_ptr web_contents, ContextImpl* context, fidl::InterfaceRequest frame_request); ~FrameImpl() override; zx::unowned_channel GetBindingChannelForTest() const; content::WebContents* web_contents_for_test() { return web_contents_.get(); } // chromium::web::Frame implementation. void CreateView( fidl::InterfaceRequest view_owner, fidl::InterfaceRequest services) override; void GetNavigationController( fidl::InterfaceRequest controller) override; // chromium::web::NavigationController implementation. void LoadUrl(fidl::StringPtr url, std::unique_ptr params) override; void GoBack() override; void GoForward() override; void Stop() override; void Reload(chromium::web::ReloadType type) override; void GetVisibleEntry(GetVisibleEntryCallback callback) override; void SetNavigationEventObserver( fidl::InterfaceHandle observer) override; private: FRIEND_TEST_ALL_PREFIXES(FrameImplTest, DelayedNavigationEventAck); FRIEND_TEST_ALL_PREFIXES(FrameImplTest, NavigationObserverDisconnected); FRIEND_TEST_ALL_PREFIXES(FrameImplTest, NoNavigationObserverAttached); FRIEND_TEST_ALL_PREFIXES(FrameImplTest, ReloadFrame); FRIEND_TEST_ALL_PREFIXES(FrameImplTest, Stop); aura::Window* root_window() const { return window_tree_host_->window(); } // Sends |pending_navigation_event_| to the observer if there are any changes // to be reported. void MaybeSendNavigationEvent(); // content::WebContentsDelegate implementation. bool ShouldCreateWebContents( content::WebContents* web_contents, content::RenderFrameHost* opener, content::SiteInstance* source_site_instance, int32_t route_id, int32_t main_frame_route_id, int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, const GURL& target_url, const std::string& partition_id, content::SessionStorageNamespace* session_storage_namespace) override; // content::WebContentsObserver implementation. void DidFinishLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url) override; std::unique_ptr window_tree_host_; std::unique_ptr web_contents_; std::unique_ptr focus_controller_; chromium::web::NavigationEventObserverPtr navigation_observer_; chromium::web::NavigationEntry cached_navigation_state_; chromium::web::NavigationEvent pending_navigation_event_; bool waiting_for_navigation_event_ack_; bool pending_navigation_event_is_dirty_; ContextImpl* context_ = nullptr; fidl::Binding binding_; fidl::BindingSet controller_bindings_; DISALLOW_COPY_AND_ASSIGN(FrameImpl); }; } // namespace webrunner #endif // WEBRUNNER_BROWSER_FRAME_IMPL_H_