// Copyright 2015 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 COMPONENTS_WEB_VIEW_WEB_VIEW_IMPL_H_ #define COMPONENTS_WEB_VIEW_WEB_VIEW_IMPL_H_ #include #include #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "components/mus/public/cpp/window_observer.h" #include "components/mus/public/cpp/window_tree_delegate.h" #include "components/web_view/find_controller.h" #include "components/web_view/find_controller_delegate.h" #include "components/web_view/frame_devtools_agent_delegate.h" #include "components/web_view/frame_tree_delegate.h" #include "components/web_view/navigation_controller.h" #include "components/web_view/navigation_controller_delegate.h" #include "components/web_view/public/interfaces/frame.mojom.h" #include "components/web_view/public/interfaces/web_view.mojom.h" #include "mojo/public/cpp/bindings/strong_binding.h" namespace mojo { class ApplicationImpl; } namespace web_view { class Frame; class FrameDevToolsAgent; class FrameTree; class PendingWebViewLoad; class URLRequestCloneable; namespace mojom { class HTMLMessageEvent; } class WebViewImpl : public mojom::WebView, public mus::WindowTreeDelegate, public mus::WindowObserver, public FrameTreeDelegate, public FrameDevToolsAgentDelegate, public NavigationControllerDelegate, public FindControllerDelegate { public: WebViewImpl(mojo::ApplicationImpl* app, mojom::WebViewClientPtr client, mojo::InterfaceRequest request); ~WebViewImpl() override; private: friend class PendingWebViewLoad; // See description above |pending_load_| for details. void OnLoad(const GURL& pending_url); // Flatten the frame tree in pre-order, depth first. void PreOrderDepthFirstTraverseTree(Frame* node, std::vector* output); // Overridden from WebView: void LoadRequest(mojo::URLRequestPtr request) override; void GetWindowTreeClient(mojo::InterfaceRequest window_tree_client) override; void Find(const mojo::String& search_text, bool forward_direction) override; void StopFinding() override; void GoBack() override; void GoForward() override; // Overridden from mus::WindowTreeDelegate: void OnEmbed(mus::Window* root) override; void OnConnectionLost(mus::WindowTreeConnection* connection) override; // Overridden from mus::WindowObserver: void OnWindowBoundsChanged(mus::Window* window, const gfx::Rect& old_bounds, const gfx::Rect& new_bounds) override; void OnWindowDestroyed(mus::Window* window) override; // Overridden from FrameTreeDelegate: scoped_ptr CreateUserDataForNewFrame( mojom::FrameClientPtr frame_client) override; bool CanPostMessageEventToFrame(const Frame* source, const Frame* target, mojom::HTMLMessageEvent* event) override; void LoadingStateChanged(bool loading, double progress) override; void TitleChanged(const mojo::String& title) override; void NavigateTopLevel(Frame* source, mojo::URLRequestPtr request) override; void CanNavigateFrame(Frame* target, mojo::URLRequestPtr request, const CanNavigateFrameCallback& callback) override; void DidStartNavigation(Frame* frame) override; void DidCommitProvisionalLoad(Frame* frame) override; void DidNavigateLocally(Frame* source, const GURL& url) override; void DidDestroyFrame(Frame* frame) override; void OnFindInFrameCountUpdated(int32_t request_id, Frame* frame, int32_t count, bool final_update) override; void OnFindInPageSelectionUpdated(int32_t request_id, Frame* frame, int32_t active_match_ordinal) override; // Overridden from FrameDevToolsAgent::Delegate: void HandlePageNavigateRequest(const GURL& url) override; // Overridden from NavigationControllerDelegate: void OnNavigate(mojo::URLRequestPtr request) override; void OnDidNavigate() override; // Overridden from FindControllerDelegate: std::vector GetAllFrames() override; mojom::WebViewClient* GetWebViewClient() override; mojo::ApplicationImpl* app_; mojom::WebViewClientPtr client_; mojo::StrongBinding binding_; mus::Window* root_; mus::Window* content_; // |find_controller_| is referenced by frame_tree_'s frames at destruction. FindController find_controller_; scoped_ptr frame_tree_; // When LoadRequest() is called a PendingWebViewLoad is created to wait for // state needed to process the request. When the state is obtained OnLoad() // is invoked. scoped_ptr pending_load_; scoped_ptr devtools_agent_; NavigationController navigation_controller_; DISALLOW_COPY_AND_ASSIGN(WebViewImpl); }; } // namespace web_view #endif // COMPONENTS_WEB_VIEW_WEB_VIEW_IMPL_H_