blob: 6495a2304707d0dee06aa4082e3eb3ecb66f8d88 [file] [log] [blame]
// 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_OOPIF_H_
#define COMPONENTS_HTML_VIEWER_HTML_DOCUMENT_OOPIF_H_
#include <set>
#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/view_manager/public/cpp/view_observer.h"
#include "components/view_manager/public/cpp/view_tree_delegate.h"
#include "mandoline/tab/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 mojo {
class View;
class ViewTreeConnection;
}
namespace html_viewer {
class AxProviderImpl;
class DocumentResourceWaiter;
class GlobalState;
class HTMLFactory;
class HTMLFrame;
class HTMLFrameTreeManager;
class TestHTMLViewerImpl;
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 HTMLDocumentOOPIF
: public mojo::ViewTreeDelegate,
public mojo::ViewObserver,
public HTMLFrameDelegate,
public mojo::InterfaceFactory<mojo::AxProvider>,
public mojo::InterfaceFactory<mandoline::FrameTreeClient>,
public mojo::InterfaceFactory<TestHTMLViewer>,
public mojo::InterfaceFactory<devtools_service::DevToolsAgent>,
public mojo::InterfaceFactory<mojo::ViewTreeClient> {
public:
using DeleteCallback = base::Callback<void(HTMLDocumentOOPIF*)>;
// 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).
HTMLDocumentOOPIF(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 LoadIfNecessary().
// 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<mojo::InterfaceRequest<mojo::AxProvider>*> ax_provider_requests;
std::set<mojo::InterfaceRequest<TestHTMLViewer>*> test_interface_requests;
};
~HTMLDocumentOOPIF() override;
void LoadIfNecessary();
void Load();
BeforeLoadCache* GetBeforeLoadCache();
// ViewTreeDelegate:
void OnEmbed(mojo::View* root) override;
void OnConnectionLost(mojo::ViewTreeConnection* connection) override;
// ViewObserver:
void OnViewViewportMetricsChanged(
mojo::View* view,
const mojo::ViewportMetrics& old_metrics,
const mojo::ViewportMetrics& new_metrics) override;
void OnViewDestroyed(mojo::View* view) override;
// HTMLFrameDelegate:
void OnFrameDidFinishLoad() override;
mojo::ApplicationImpl* GetApp() override;
HTMLFactory* GetHTMLFactory() override;
void OnFrameSwappedToRemote() override;
// mojo::InterfaceFactory<mojo::AxProvider>:
void Create(mojo::ApplicationConnection* connection,
mojo::InterfaceRequest<mojo::AxProvider> request) override;
// mojo::InterfaceFactory<mandoline::FrameTreeClient>:
void Create(
mojo::ApplicationConnection* connection,
mojo::InterfaceRequest<mandoline::FrameTreeClient> request) override;
// mojo::InterfaceFactory<TestHTMLViewer>:
void Create(mojo::ApplicationConnection* connection,
mojo::InterfaceRequest<TestHTMLViewer> request) override;
// mojo::InterfaceFactory<devtools_service::DevToolsAgent>:
void Create(
mojo::ApplicationConnection* connection,
mojo::InterfaceRequest<devtools_service::DevToolsAgent> request) override;
// mojo::InterfaceFactory<mojo::ViewTreeClient>:
void Create(mojo::ApplicationConnection* connection,
mojo::InterfaceRequest<mojo::ViewTreeClient> request) override;
scoped_ptr<mojo::AppRefCount> app_refcount_;
mojo::ApplicationImpl* html_document_app_;
mojo::ApplicationConnection* connection_;
// HTMLDocument owns these pointers; binding requests after document load.
std::set<AxProviderImpl*> ax_providers_;
ScopedVector<TestHTMLViewerImpl> 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<DocumentResourceWaiter> resource_waiter_;
scoped_ptr<BeforeLoadCache> before_load_cache_;
DeleteCallback delete_callback_;
HTMLFactory* factory_;
mojo::View* root_;
// Cache interface request of DevToolsAgent if |frame_| hasn't been
// initialized.
mojo::InterfaceRequest<devtools_service::DevToolsAgent>
devtools_agent_request_;
DISALLOW_COPY_AND_ASSIGN(HTMLDocumentOOPIF);
};
} // namespace html_viewer
#endif // COMPONENTS_HTML_VIEWER_HTML_DOCUMENT_OOPIF_H_