1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
|
// 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 <set>
#include "base/callback.h"
#include "base/macros.h"
#include "components/html_viewer/ax_provider_impl.h"
#include "components/html_viewer/touch_handler.h"
#include "components/view_manager/public/cpp/view_manager_client_factory.h"
#include "components/view_manager/public/cpp/view_manager_delegate.h"
#include "components/view_manager/public/cpp/view_observer.h"
#include "mandoline/services/navigation/public/interfaces/navigation.mojom.h"
#include "mojo/application/public/cpp/app_lifetime_helper.h"
#include "mojo/application/public/cpp/interface_factory.h"
#include "mojo/application/public/cpp/lazy_interface_ptr.h"
#include "mojo/application/public/cpp/service_provider_impl.h"
#include "mojo/application/public/interfaces/application.mojom.h"
#include "mojo/application/public/interfaces/content_handler.mojom.h"
#include "mojo/services/network/public/interfaces/url_loader.mojom.h"
#include "third_party/WebKit/public/web/WebFrameClient.h"
#include "third_party/WebKit/public/web/WebSandboxFlags.h"
#include "third_party/WebKit/public/web/WebViewClient.h"
namespace base {
class SingleThreadTaskRunner;
}
namespace mojo {
class ViewManager;
class View;
}
namespace html_viewer {
class AxProviderImpl;
class DevToolsAgentImpl;
class GeolocationClientImpl;
class GlobalState;
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 blink::WebViewClient,
public blink::WebFrameClient,
public mojo::ViewManagerDelegate,
public mojo::ViewObserver,
public mojo::InterfaceFactory<mojo::AxProvider> {
public:
using DeleteCallback = base::Callback<void(HTMLDocument*)>;
struct CreateParams {
CreateParams(mojo::ApplicationImpl* html_document_app,
mojo::ApplicationConnection* connection,
mojo::URLResponsePtr response,
GlobalState* global_state,
const DeleteCallback& delete_callback);
~CreateParams();
mojo::ApplicationImpl* html_document_app;
mojo::ApplicationConnection* connection;
mojo::URLResponsePtr response;
GlobalState* global_state;
DeleteCallback delete_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).
explicit HTMLDocument(CreateParams* params);
// Deletes this object.
void Destroy();
blink::WebView* web_view() const { return web_view_; }
protected:
~HTMLDocument() override;
// WebViewClient methods:
virtual blink::WebStorageNamespace* createSessionStorageNamespace();
// WebWidgetClient methods:
void initializeLayerTreeView() override;
blink::WebLayerTreeView* layerTreeView() override;
// WebFrameClient methods:
virtual blink::WebMediaPlayer* createMediaPlayer(
blink::WebLocalFrame* frame,
const blink::WebURL& url,
blink::WebMediaPlayerClient* client,
blink::WebMediaPlayerEncryptedMediaClient* encrypted_client,
blink::WebContentDecryptionModule* initial_cdm);
virtual blink::WebFrame* createChildFrame(
blink::WebLocalFrame* parent,
blink::WebTreeScopeType scope,
const blink::WebString& frameName,
blink::WebSandboxFlags sandboxFlags);
virtual void frameDetached(blink::WebFrame* frame, DetachType type);
virtual blink::WebCookieJar* cookieJar(blink::WebLocalFrame* frame);
virtual blink::WebNavigationPolicy decidePolicyForNavigation(
const NavigationPolicyInfo& info);
virtual blink::WebGeolocationClient* geolocationClient();
virtual void didAddMessageToConsole(const blink::WebConsoleMessage& message,
const blink::WebString& source_name,
unsigned source_line,
const blink::WebString& stack_trace);
virtual void didFinishLoad(blink::WebLocalFrame* frame);
virtual void didNavigateWithinPage(blink::WebLocalFrame* frame,
const blink::WebHistoryItem& history_item,
blink::WebHistoryCommitType commit_type);
virtual blink::WebEncryptedMediaClient* encryptedMediaClient();
private:
// Data associated with a child iframe.
struct ChildFrameData {
mojo::View* view;
blink::WebTreeScopeType scope;
};
// Updates the size and scale factor of the webview and related classes from
// |root_|.
void UpdateWebviewSizeFromViewSize();
void InitGlobalStateAndLoadIfNecessary();
// ViewManagerDelegate methods:
void OnEmbed(mojo::View* root) override;
void OnViewManagerDestroyed(mojo::ViewManager* view_manager) override;
// ViewObserver methods:
void OnViewBoundsChanged(mojo::View* view,
const mojo::Rect& old_bounds,
const mojo::Rect& new_bounds) override;
void OnViewViewportMetricsChanged(
mojo::View* view,
const mojo::ViewportMetrics& old_metrics,
const mojo::ViewportMetrics& new_metrics) override;
void OnViewDestroyed(mojo::View* view) override;
void OnViewInputEvent(mojo::View* view, const mojo::EventPtr& event) override;
void OnViewFocusChanged(mojo::View* gained_focus,
mojo::View* lost_focus) override;
// mojo::InterfaceFactory<mojo::AxProvider>
void Create(mojo::ApplicationConnection* connection,
mojo::InterfaceRequest<mojo::AxProvider> request) override;
void Load(mojo::URLResponsePtr response);
// Converts a WebLocalFrame to a WebRemoteFrame. Used once we know the
// url of a frame to trigger the navigation.
void ConvertLocalFrameToRemoteFrame(blink::WebLocalFrame* frame);
// Updates the focus state of |web_view_| based on the focus state of |root_|.
void UpdateFocus();
scoped_ptr<mojo::AppRefCount> app_refcount_;
mojo::ApplicationImpl* html_document_app_;
mojo::URLResponsePtr response_;
mojo::LazyInterfacePtr<mojo::NavigatorHost> navigator_host_;
blink::WebView* web_view_;
mojo::View* root_;
mojo::ViewManagerClientFactory view_manager_client_factory_;
scoped_ptr<WebLayerTreeViewImpl> web_layer_tree_view_impl_;
scoped_refptr<base::SingleThreadTaskRunner> compositor_thread_;
scoped_ptr<GeolocationClientImpl> geolocation_client_impl_;
// HTMLDocument owns these pointers; binding requests after document load.
std::set<mojo::InterfaceRequest<mojo::AxProvider>*> ax_provider_requests_;
std::set<AxProviderImpl*> ax_providers_;
// A flag set on didFinishLoad.
bool did_finish_load_ = false;
GlobalState* global_state_;
scoped_ptr<TouchHandler> touch_handler_;
scoped_ptr<DevToolsAgentImpl> devtools_agent_;
DeleteCallback delete_callback_;
DISALLOW_COPY_AND_ASSIGN(HTMLDocument);
};
} // namespace html_viewer
#endif // COMPONENTS_HTML_VIEWER_HTML_DOCUMENT_H_
|