OLD | NEW |
| (Empty) |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "components/html_viewer/html_widget.h" | |
6 | |
7 #include <stdint.h> | |
8 #include <utility> | |
9 | |
10 #include "base/command_line.h" | |
11 #include "components/html_viewer/blink_settings.h" | |
12 #include "components/html_viewer/global_state.h" | |
13 #include "components/html_viewer/ime_controller.h" | |
14 #include "components/html_viewer/stats_collection_controller.h" | |
15 #include "components/html_viewer/web_layer_tree_view_impl.h" | |
16 #include "components/html_viewer/web_storage_namespace_impl.h" | |
17 #include "components/mus/public/cpp/window.h" | |
18 #include "mojo/services/tracing/public/interfaces/tracing.mojom.h" | |
19 #include "mojo/shell/public/cpp/shell.h" | |
20 #include "third_party/WebKit/public/web/WebFrameWidget.h" | |
21 #include "third_party/WebKit/public/web/WebSettings.h" | |
22 #include "third_party/WebKit/public/web/WebView.h" | |
23 #include "ui/gfx/geometry/dip_util.h" | |
24 | |
25 namespace html_viewer { | |
26 namespace { | |
27 | |
28 scoped_ptr<WebLayerTreeViewImpl> CreateWebLayerTreeView( | |
29 GlobalState* global_state) { | |
30 return make_scoped_ptr(new WebLayerTreeViewImpl( | |
31 global_state->compositor_thread(), | |
32 global_state->gpu_memory_buffer_manager(), | |
33 global_state->raster_thread_helper()->task_graph_runner())); | |
34 } | |
35 | |
36 void InitializeWebLayerTreeView(WebLayerTreeViewImpl* web_layer_tree_view, | |
37 mojo::Shell* shell, | |
38 mus::Window* window, | |
39 blink::WebWidget* widget) { | |
40 DCHECK(window); | |
41 mus::mojom::GpuPtr gpu_service; | |
42 shell->ConnectToService("mojo:mus", &gpu_service); | |
43 web_layer_tree_view->Initialize(std::move(gpu_service), window, widget); | |
44 } | |
45 | |
46 void UpdateWebViewSizeFromViewSize(mus::Window* window, | |
47 blink::WebWidget* web_widget, | |
48 WebLayerTreeViewImpl* web_layer_tree_view) { | |
49 const gfx::Size size_in_pixels(window->bounds().size()); | |
50 const gfx::Size size_in_dips = gfx::ConvertSizeToDIP( | |
51 window->viewport_metrics().device_pixel_ratio, size_in_pixels); | |
52 web_widget->resize( | |
53 blink::WebSize(size_in_dips.width(), size_in_dips.height())); | |
54 web_layer_tree_view->setViewportSize(size_in_pixels); | |
55 } | |
56 | |
57 } // namespace | |
58 | |
59 // HTMLWidgetRootRemote ------------------------------------------------------- | |
60 | |
61 HTMLWidgetRootRemote::HTMLWidgetRootRemote(GlobalState* global_state) | |
62 : web_view_(blink::WebView::create(this)) { | |
63 global_state->blink_settings()->ApplySettingsToWebView(web_view_); | |
64 } | |
65 | |
66 HTMLWidgetRootRemote::~HTMLWidgetRootRemote() {} | |
67 | |
68 blink::WebStorageNamespace* | |
69 HTMLWidgetRootRemote::createSessionStorageNamespace() { | |
70 return new WebStorageNamespaceImpl(); | |
71 } | |
72 | |
73 bool HTMLWidgetRootRemote::allowsBrokenNullLayerTreeView() const { | |
74 return true; | |
75 } | |
76 | |
77 blink::WebWidget* HTMLWidgetRootRemote::GetWidget() { | |
78 return web_view_; | |
79 } | |
80 | |
81 void HTMLWidgetRootRemote::OnWindowBoundsChanged(mus::Window* window) {} | |
82 | |
83 // HTMLWidgetRootLocal -------------------------------------------------------- | |
84 | |
85 HTMLWidgetRootLocal::CreateParams::CreateParams(mojo::Shell* shell, | |
86 GlobalState* global_state, | |
87 mus::Window* window) | |
88 : shell(shell), global_state(global_state), window(window) {} | |
89 | |
90 HTMLWidgetRootLocal::CreateParams::~CreateParams() {} | |
91 | |
92 HTMLWidgetRootLocal::HTMLWidgetRootLocal(CreateParams* create_params) | |
93 : shell_(create_params->shell), | |
94 global_state_(create_params->global_state), | |
95 window_(create_params->window), | |
96 web_view_(nullptr) { | |
97 web_view_ = blink::WebView::create(this); | |
98 ime_controller_.reset(new ImeController(window_, web_view_)); | |
99 // Creating the widget calls initializeLayerTreeView() to create the | |
100 // |web_layer_tree_view_impl_|. As we haven't yet assigned the |web_view_| | |
101 // we have to set it here. | |
102 if (web_layer_tree_view_impl_) { | |
103 InitializeWebLayerTreeView(web_layer_tree_view_impl_.get(), shell_, window_, | |
104 web_view_); | |
105 UpdateWebViewSizeFromViewSize(window_, web_view_, | |
106 web_layer_tree_view_impl_.get()); | |
107 } | |
108 global_state_->blink_settings()->ApplySettingsToWebView(web_view_); | |
109 } | |
110 | |
111 HTMLWidgetRootLocal::~HTMLWidgetRootLocal() {} | |
112 | |
113 blink::WebStorageNamespace* | |
114 HTMLWidgetRootLocal::createSessionStorageNamespace() { | |
115 return new WebStorageNamespaceImpl(); | |
116 } | |
117 | |
118 void HTMLWidgetRootLocal::initializeLayerTreeView() { | |
119 web_layer_tree_view_impl_ = CreateWebLayerTreeView(global_state_); | |
120 } | |
121 | |
122 blink::WebLayerTreeView* HTMLWidgetRootLocal::layerTreeView() { | |
123 return web_layer_tree_view_impl_.get(); | |
124 } | |
125 | |
126 void HTMLWidgetRootLocal::didMeaningfulLayout( | |
127 blink::WebMeaningfulLayout layout_type) { | |
128 static bool called = false; | |
129 if (!called && layout_type == blink::WebMeaningfulLayout::VisuallyNonEmpty) { | |
130 const int64_t ticks = base::TimeTicks::Now().ToInternalValue(); | |
131 tracing::StartupPerformanceDataCollectorPtr collector = | |
132 StatsCollectionController::ConnectToDataCollector(shell_); | |
133 if (collector) | |
134 collector->SetFirstVisuallyNonEmptyLayoutTicks(ticks); | |
135 called = true; | |
136 } | |
137 } | |
138 | |
139 void HTMLWidgetRootLocal::resetInputMethod() { | |
140 ime_controller_->ResetInputMethod(); | |
141 } | |
142 | |
143 void HTMLWidgetRootLocal::didHandleGestureEvent( | |
144 const blink::WebGestureEvent& event, | |
145 bool event_cancelled) { | |
146 ime_controller_->DidHandleGestureEvent(event, event_cancelled); | |
147 } | |
148 | |
149 void HTMLWidgetRootLocal::didUpdateTextOfFocusedElementByNonUserInput() { | |
150 ime_controller_->DidUpdateTextOfFocusedElementByNonUserInput(); | |
151 } | |
152 | |
153 void HTMLWidgetRootLocal::showImeIfNeeded() { | |
154 ime_controller_->ShowImeIfNeeded(); | |
155 } | |
156 | |
157 blink::WebWidget* HTMLWidgetRootLocal::GetWidget() { | |
158 return web_view_; | |
159 } | |
160 | |
161 void HTMLWidgetRootLocal::OnWindowBoundsChanged(mus::Window* window) { | |
162 UpdateWebViewSizeFromViewSize(window, web_view_, | |
163 web_layer_tree_view_impl_.get()); | |
164 } | |
165 | |
166 // HTMLWidgetLocalRoot -------------------------------------------------------- | |
167 | |
168 HTMLWidgetLocalRoot::HTMLWidgetLocalRoot(mojo::Shell* shell, | |
169 GlobalState* global_state, | |
170 mus::Window* window, | |
171 blink::WebLocalFrame* web_local_frame) | |
172 : shell_(shell), global_state_(global_state), web_frame_widget_(nullptr) { | |
173 web_frame_widget_ = blink::WebFrameWidget::create(this, web_local_frame); | |
174 ime_controller_.reset(new ImeController(window, web_frame_widget_)); | |
175 // Creating the widget calls initializeLayerTreeView() to create the | |
176 // |web_layer_tree_view_impl_|. As we haven't yet assigned the | |
177 // |web_frame_widget_| | |
178 // we have to set it here. | |
179 if (web_layer_tree_view_impl_) { | |
180 InitializeWebLayerTreeView(web_layer_tree_view_impl_.get(), shell_, window, | |
181 web_frame_widget_); | |
182 UpdateWebViewSizeFromViewSize(window, web_frame_widget_, | |
183 web_layer_tree_view_impl_.get()); | |
184 } | |
185 } | |
186 | |
187 HTMLWidgetLocalRoot::~HTMLWidgetLocalRoot() {} | |
188 | |
189 blink::WebWidget* HTMLWidgetLocalRoot::GetWidget() { | |
190 return web_frame_widget_; | |
191 } | |
192 | |
193 void HTMLWidgetLocalRoot::OnWindowBoundsChanged(mus::Window* window) { | |
194 UpdateWebViewSizeFromViewSize(window, web_frame_widget_, | |
195 web_layer_tree_view_impl_.get()); | |
196 } | |
197 | |
198 void HTMLWidgetLocalRoot::initializeLayerTreeView() { | |
199 web_layer_tree_view_impl_ = CreateWebLayerTreeView(global_state_); | |
200 } | |
201 | |
202 blink::WebLayerTreeView* HTMLWidgetLocalRoot::layerTreeView() { | |
203 return web_layer_tree_view_impl_.get(); | |
204 } | |
205 | |
206 void HTMLWidgetLocalRoot::resetInputMethod() { | |
207 ime_controller_->ResetInputMethod(); | |
208 } | |
209 | |
210 void HTMLWidgetLocalRoot::didHandleGestureEvent( | |
211 const blink::WebGestureEvent& event, | |
212 bool event_cancelled) { | |
213 ime_controller_->DidHandleGestureEvent(event, event_cancelled); | |
214 } | |
215 | |
216 void HTMLWidgetLocalRoot::didUpdateTextOfFocusedElementByNonUserInput() { | |
217 ime_controller_->DidUpdateTextOfFocusedElementByNonUserInput(); | |
218 } | |
219 | |
220 void HTMLWidgetLocalRoot::showImeIfNeeded() { | |
221 ime_controller_->ShowImeIfNeeded(); | |
222 } | |
223 | |
224 } // namespace html_viewer | |
OLD | NEW |