// Copyright 2014 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_HTML_VIEWER_HTML_DOCUMENT_H_ #define COMPONENTS_HTML_VIEWER_HTML_DOCUMENT_H_ #include #include "base/callback.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "components/devtools_service/public/interfaces/devtools_service.mojom.h" #include "components/html_viewer/ax_provider_impl.h" #include "components/html_viewer/html_frame_delegate.h" #include "components/html_viewer/public/interfaces/test_html_viewer.mojom.h" #include "components/mus/public/cpp/view_tree_delegate.h" #include "components/web_view/public/interfaces/frame_tree.mojom.h" #include "mojo/application/public/cpp/app_lifetime_helper.h" #include "mojo/application/public/cpp/interface_factory.h" #include "mojo/application/public/cpp/service_provider_impl.h" #include "mojo/application/public/interfaces/application.mojom.h" #include "mojo/services/network/public/interfaces/url_loader.mojom.h" namespace base { class SingleThreadTaskRunner; } namespace mus { class View; class ViewTreeConnection; } namespace html_viewer { class AxProviderImpl; class DocumentResourceWaiter; class GlobalState; class HTMLFactory; class HTMLFrame; class TestHTMLViewerImpl; class ViewTreeDelegateImpl; class WebLayerTreeViewImpl; // A view for a single HTML document. // // HTMLDocument is deleted in one of two ways: // . When the View the HTMLDocument is embedded in is destroyed. // . Explicitly by way of Destroy(). class HTMLDocument : public mus::ViewTreeDelegate, public HTMLFrameDelegate, public mojo::InterfaceFactory, public mojo::InterfaceFactory, public mojo::InterfaceFactory, public mojo::InterfaceFactory, public mojo::InterfaceFactory { public: using DeleteCallback = base::Callback; // Load a new HTMLDocument with |response|. // |html_document_app| is the application this app was created in, and // |connection| the specific connection triggering this new instance. // |setup| is used to obtain init type state (such as resources). HTMLDocument(mojo::ApplicationImpl* html_document_app, mojo::ApplicationConnection* connection, mojo::URLResponsePtr response, GlobalState* setup, const DeleteCallback& delete_callback, HTMLFactory* factory); // Deletes this object. void Destroy(); private: friend class DocumentResourceWaiter; // So it can call Load(). // Requests for interfaces before the document is loaded go here. Once // loaded the requests are bound and BeforeLoadCache is deleted. struct BeforeLoadCache { BeforeLoadCache(); ~BeforeLoadCache(); std::set*> ax_provider_requests; std::set*> test_interface_requests; }; // Any state that needs to be moved when rendering transfers from one frame // to another is stored here. struct TransferableState { TransferableState(); ~TransferableState(); // Takes the state from |other|. void Move(TransferableState* other); bool owns_view_tree_connection; mus::View* root; scoped_ptr view_tree_delegate_impl; }; ~HTMLDocument() override; void Load(); BeforeLoadCache* GetBeforeLoadCache(); // ViewTreeDelegate: void OnEmbed(mus::View* root) override; void OnConnectionLost(mus::ViewTreeConnection* connection) override; // HTMLFrameDelegate: mojo::ApplicationImpl* GetApp() override; HTMLFactory* GetHTMLFactory() override; void OnFrameDidFinishLoad() override; void OnFrameSwappedToRemote() override; void OnSwap(HTMLFrame* frame, HTMLFrameDelegate* old_delegate) override; void OnFrameDestroyed() override; // mojo::InterfaceFactory: void Create(mojo::ApplicationConnection* connection, mojo::InterfaceRequest request) override; // mojo::InterfaceFactory: void Create( mojo::ApplicationConnection* connection, mojo::InterfaceRequest request) override; // mojo::InterfaceFactory: void Create(mojo::ApplicationConnection* connection, mojo::InterfaceRequest request) override; // mojo::InterfaceFactory: void Create( mojo::ApplicationConnection* connection, mojo::InterfaceRequest request) override; // mojo::InterfaceFactory: void Create(mojo::ApplicationConnection* connection, mojo::InterfaceRequest request) override; scoped_ptr app_refcount_; mojo::ApplicationImpl* html_document_app_; mojo::ApplicationConnection* connection_; // HTMLDocument owns these pointers; binding requests after document load. std::set ax_providers_; ScopedVector test_html_viewers_; // Set to true when the local frame has finished loading. bool did_finish_local_frame_load_ = false; GlobalState* global_state_; HTMLFrame* frame_; scoped_ptr resource_waiter_; scoped_ptr before_load_cache_; DeleteCallback delete_callback_; HTMLFactory* factory_; TransferableState transferable_state_; // Cache interface request of DevToolsAgent if |frame_| hasn't been // initialized. mojo::InterfaceRequest devtools_agent_request_; DISALLOW_COPY_AND_ASSIGN(HTMLDocument); }; } // namespace html_viewer #endif // COMPONENTS_HTML_VIEWER_HTML_DOCUMENT_H_