| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/html_viewer/frame.h" | 5 #include "components/html_viewer/html_frame.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
| 11 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
| 12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
| 13 #include "base/thread_task_runner_handle.h" | 13 #include "base/thread_task_runner_handle.h" |
| 14 #include "components/html_viewer/ax_provider_impl.h" | 14 #include "components/html_viewer/ax_provider_impl.h" |
| 15 #include "components/html_viewer/blink_basic_type_converters.h" | 15 #include "components/html_viewer/blink_basic_type_converters.h" |
| 16 #include "components/html_viewer/blink_input_events_type_converters.h" | 16 #include "components/html_viewer/blink_input_events_type_converters.h" |
| 17 #include "components/html_viewer/blink_url_request_type_converters.h" | 17 #include "components/html_viewer/blink_url_request_type_converters.h" |
| 18 #include "components/html_viewer/frame_tree_manager.h" | |
| 19 #include "components/html_viewer/geolocation_client_impl.h" | 18 #include "components/html_viewer/geolocation_client_impl.h" |
| 20 #include "components/html_viewer/global_state.h" | 19 #include "components/html_viewer/global_state.h" |
| 20 #include "components/html_viewer/html_frame_tree_manager.h" |
| 21 #include "components/html_viewer/media_factory.h" | 21 #include "components/html_viewer/media_factory.h" |
| 22 #include "components/html_viewer/touch_handler.h" | 22 #include "components/html_viewer/touch_handler.h" |
| 23 #include "components/html_viewer/web_layer_impl.h" | 23 #include "components/html_viewer/web_layer_impl.h" |
| 24 #include "components/html_viewer/web_layer_tree_view_impl.h" | 24 #include "components/html_viewer/web_layer_tree_view_impl.h" |
| 25 #include "components/html_viewer/web_storage_namespace_impl.h" | 25 #include "components/html_viewer/web_storage_namespace_impl.h" |
| 26 #include "components/html_viewer/web_url_loader_impl.h" | 26 #include "components/html_viewer/web_url_loader_impl.h" |
| 27 #include "components/view_manager/ids.h" | 27 #include "components/view_manager/ids.h" |
| 28 #include "components/view_manager/public/cpp/view.h" | 28 #include "components/view_manager/public/cpp/view.h" |
| 29 #include "components/view_manager/public/cpp/view_manager.h" | 29 #include "components/view_manager/public/cpp/view_manager.h" |
| 30 #include "components/view_manager/public/interfaces/surfaces.mojom.h" | 30 #include "components/view_manager/public/interfaces/surfaces.mojom.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 namespace { | 67 namespace { |
| 68 | 68 |
| 69 void ConfigureSettings(blink::WebSettings* settings) { | 69 void ConfigureSettings(blink::WebSettings* settings) { |
| 70 settings->setCookieEnabled(true); | 70 settings->setCookieEnabled(true); |
| 71 settings->setDefaultFixedFontSize(13); | 71 settings->setDefaultFixedFontSize(13); |
| 72 settings->setDefaultFontSize(16); | 72 settings->setDefaultFontSize(16); |
| 73 settings->setLoadsImagesAutomatically(true); | 73 settings->setLoadsImagesAutomatically(true); |
| 74 settings->setJavaScriptEnabled(true); | 74 settings->setJavaScriptEnabled(true); |
| 75 } | 75 } |
| 76 | 76 |
| 77 Frame* GetPreviousSibling(Frame* frame) { | 77 HTMLFrame* GetPreviousSibling(HTMLFrame* frame) { |
| 78 DCHECK(frame->parent()); | 78 DCHECK(frame->parent()); |
| 79 auto iter = std::find(frame->parent()->children().begin(), | 79 auto iter = std::find(frame->parent()->children().begin(), |
| 80 frame->parent()->children().end(), frame); | 80 frame->parent()->children().end(), frame); |
| 81 return (iter == frame->parent()->children().begin()) ? nullptr : *(--iter); | 81 return (iter == frame->parent()->children().begin()) ? nullptr : *(--iter); |
| 82 } | 82 } |
| 83 | 83 |
| 84 } // namespace | 84 } // namespace |
| 85 | 85 |
| 86 Frame::Frame(const Frame::CreateParams& params) | 86 HTMLFrame::HTMLFrame(const HTMLFrame::CreateParams& params) |
| 87 : frame_tree_manager_(params.manager), | 87 : frame_tree_manager_(params.manager), |
| 88 parent_(params.parent), | 88 parent_(params.parent), |
| 89 view_(nullptr), | 89 view_(nullptr), |
| 90 id_(params.id), | 90 id_(params.id), |
| 91 web_frame_(nullptr), | 91 web_frame_(nullptr), |
| 92 web_widget_(nullptr), | 92 web_widget_(nullptr), |
| 93 scope_(blink::WebTreeScopeType::Document), | 93 scope_(blink::WebTreeScopeType::Document), |
| 94 weak_factory_(this) { | 94 weak_factory_(this) { |
| 95 if (parent_) | 95 if (parent_) |
| 96 parent_->children_.push_back(this); | 96 parent_->children_.push_back(this); |
| 97 } | 97 } |
| 98 | 98 |
| 99 void Frame::Init(mojo::View* local_view, | 99 void HTMLFrame::Init(mojo::View* local_view, |
| 100 const blink::WebString& remote_frame_name, | 100 const blink::WebString& remote_frame_name, |
| 101 const blink::WebString& remote_origin) { | 101 const blink::WebString& remote_origin) { |
| 102 if (local_view->id() == id_) | 102 if (local_view->id() == id_) |
| 103 SetView(local_view); | 103 SetView(local_view); |
| 104 | 104 |
| 105 // TODO(sky): need to plumb through scope and other args correctly for frame | 105 // TODO(sky): need to plumb through scope and other args correctly for frame |
| 106 // creation. | 106 // creation. |
| 107 if (!parent_) { | 107 if (!parent_) { |
| 108 CreateWebWidget(); | 108 CreateWebWidget(); |
| 109 // This is the root of the tree (aka the main frame). | 109 // This is the root of the tree (aka the main frame). |
| 110 // Expected order for creating webframes is: | 110 // Expected order for creating webframes is: |
| 111 // . Create local webframe (first webframe must always be local). | 111 // . Create local webframe (first webframe must always be local). |
| (...skipping 14 matching lines...) Expand all Loading... |
| 126 web_view()->setDeviceScaleFactor(global_state()->device_pixel_ratio()); | 126 web_view()->setDeviceScaleFactor(global_state()->device_pixel_ratio()); |
| 127 if (id_ != local_view->id()) { | 127 if (id_ != local_view->id()) { |
| 128 blink::WebRemoteFrame* remote_web_frame = blink::WebRemoteFrame::create( | 128 blink::WebRemoteFrame* remote_web_frame = blink::WebRemoteFrame::create( |
| 129 blink::WebTreeScopeType::Document, this); | 129 blink::WebTreeScopeType::Document, this); |
| 130 local_web_frame->swap(remote_web_frame); | 130 local_web_frame->swap(remote_web_frame); |
| 131 // local_web_frame->close(); | 131 // local_web_frame->close(); |
| 132 web_frame_ = remote_web_frame; | 132 web_frame_ = remote_web_frame; |
| 133 } | 133 } |
| 134 } else if (id_ == local_view->id()) { | 134 } else if (id_ == local_view->id()) { |
| 135 // Frame represents the local frame. | 135 // Frame represents the local frame. |
| 136 Frame* previous_sibling = GetPreviousSibling(this); | 136 HTMLFrame* previous_sibling = GetPreviousSibling(this); |
| 137 blink::WebFrame* previous_web_frame = | 137 blink::WebFrame* previous_web_frame = |
| 138 previous_sibling ? previous_sibling->web_frame() : nullptr; | 138 previous_sibling ? previous_sibling->web_frame() : nullptr; |
| 139 DCHECK(!parent_->IsLocal()); | 139 DCHECK(!parent_->IsLocal()); |
| 140 web_frame_ = parent_->web_frame()->toWebRemoteFrame()->createLocalChild( | 140 web_frame_ = parent_->web_frame()->toWebRemoteFrame()->createLocalChild( |
| 141 blink::WebTreeScopeType::Document, "", blink::WebSandboxFlags::None, | 141 blink::WebTreeScopeType::Document, "", blink::WebSandboxFlags::None, |
| 142 this, previous_web_frame); | 142 this, previous_web_frame); |
| 143 CreateWebWidget(); | 143 CreateWebWidget(); |
| 144 } else if (parent_->web_frame()->isWebLocalFrame()) { | 144 } else if (parent_->web_frame()->isWebLocalFrame()) { |
| 145 blink::WebLocalFrame* local_web_frame = | 145 blink::WebLocalFrame* local_web_frame = |
| 146 blink::WebLocalFrame::create(blink::WebTreeScopeType::Document, this); | 146 blink::WebLocalFrame::create(blink::WebTreeScopeType::Document, this); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 159 if (!IsLocal()) { | 159 if (!IsLocal()) { |
| 160 blink::WebRemoteFrame* remote_web_frame = web_frame_->toWebRemoteFrame(); | 160 blink::WebRemoteFrame* remote_web_frame = web_frame_->toWebRemoteFrame(); |
| 161 if (remote_web_frame) { | 161 if (remote_web_frame) { |
| 162 remote_web_frame->setReplicatedName(remote_frame_name); | 162 remote_web_frame->setReplicatedName(remote_frame_name); |
| 163 remote_web_frame->setReplicatedOrigin( | 163 remote_web_frame->setReplicatedOrigin( |
| 164 blink::WebSecurityOrigin::createFromString(remote_origin)); | 164 blink::WebSecurityOrigin::createFromString(remote_origin)); |
| 165 } | 165 } |
| 166 } | 166 } |
| 167 } | 167 } |
| 168 | 168 |
| 169 void Frame::Close() { | 169 void HTMLFrame::Close() { |
| 170 if (web_widget_) { | 170 if (web_widget_) { |
| 171 // Closing the widget implicitly detaches the frame. | 171 // Closing the widget implicitly detaches the frame. |
| 172 web_widget_->close(); | 172 web_widget_->close(); |
| 173 } else { | 173 } else { |
| 174 web_frame_->detach(); | 174 web_frame_->detach(); |
| 175 } | 175 } |
| 176 } | 176 } |
| 177 | 177 |
| 178 const Frame* Frame::FindFrame(uint32_t id) const { | 178 const HTMLFrame* HTMLFrame::FindFrame(uint32_t id) const { |
| 179 if (id == id_) | 179 if (id == id_) |
| 180 return this; | 180 return this; |
| 181 | 181 |
| 182 for (const Frame* child : children_) { | 182 for (const HTMLFrame* child : children_) { |
| 183 const Frame* match = child->FindFrame(id); | 183 const HTMLFrame* match = child->FindFrame(id); |
| 184 if (match) | 184 if (match) |
| 185 return match; | 185 return match; |
| 186 } | 186 } |
| 187 return nullptr; | 187 return nullptr; |
| 188 } | 188 } |
| 189 | 189 |
| 190 blink::WebView* Frame::web_view() { | 190 blink::WebView* HTMLFrame::web_view() { |
| 191 return web_widget_ && web_widget_->isWebView() | 191 return web_widget_ && web_widget_->isWebView() |
| 192 ? static_cast<blink::WebView*>(web_widget_) | 192 ? static_cast<blink::WebView*>(web_widget_) |
| 193 : nullptr; | 193 : nullptr; |
| 194 } | 194 } |
| 195 | 195 |
| 196 Frame::~Frame() { | 196 HTMLFrame::~HTMLFrame() { |
| 197 DCHECK(children_.empty()); | 197 DCHECK(children_.empty()); |
| 198 | 198 |
| 199 if (parent_) { | 199 if (parent_) { |
| 200 auto iter = | 200 auto iter = |
| 201 std::find(parent_->children_.begin(), parent_->children_.end(), this); | 201 std::find(parent_->children_.begin(), parent_->children_.end(), this); |
| 202 parent_->children_.erase(iter); | 202 parent_->children_.erase(iter); |
| 203 } | 203 } |
| 204 parent_ = nullptr; | 204 parent_ = nullptr; |
| 205 | 205 |
| 206 frame_tree_manager_->OnFrameDestroyed(this); | 206 frame_tree_manager_->OnFrameDestroyed(this); |
| 207 | 207 |
| 208 if (view_) { | 208 if (view_) { |
| 209 view_->RemoveObserver(this); | 209 view_->RemoveObserver(this); |
| 210 view_->Destroy(); | 210 view_->Destroy(); |
| 211 } | 211 } |
| 212 } | 212 } |
| 213 | 213 |
| 214 void Frame::SetRemoteFrameName(const mojo::String& name) { | 214 void HTMLFrame::SetRemoteFrameName(const mojo::String& name) { |
| 215 if (IsLocal()) | 215 if (IsLocal()) |
| 216 return; | 216 return; |
| 217 | 217 |
| 218 blink::WebRemoteFrame* remote_frame = web_frame_->toWebRemoteFrame(); | 218 blink::WebRemoteFrame* remote_frame = web_frame_->toWebRemoteFrame(); |
| 219 if (remote_frame) | 219 if (remote_frame) |
| 220 remote_frame->setReplicatedName(name.To<blink::WebString>()); | 220 remote_frame->setReplicatedName(name.To<blink::WebString>()); |
| 221 } | 221 } |
| 222 | 222 |
| 223 bool Frame::IsLocal() const { | 223 bool HTMLFrame::IsLocal() const { |
| 224 return web_frame_->isWebLocalFrame(); | 224 return web_frame_->isWebLocalFrame(); |
| 225 } | 225 } |
| 226 | 226 |
| 227 void Frame::SetView(mojo::View* view) { | 227 void HTMLFrame::SetView(mojo::View* view) { |
| 228 DCHECK(!view_); | 228 DCHECK(!view_); |
| 229 view_ = view; | 229 view_ = view; |
| 230 view_->AddObserver(this); | 230 view_->AddObserver(this); |
| 231 } | 231 } |
| 232 | 232 |
| 233 void Frame::CreateWebWidget() { | 233 void HTMLFrame::CreateWebWidget() { |
| 234 DCHECK(!web_widget_); | 234 DCHECK(!web_widget_); |
| 235 if (parent_) { | 235 if (parent_) { |
| 236 // TODO(sky): this isn't quite right. I should only have a WebFrameWidget | 236 // TODO(sky): this isn't quite right. I should only have a WebFrameWidget |
| 237 // for local roots. And the cast to local fram definitely isn't right. | 237 // for local roots. And the cast to local fram definitely isn't right. |
| 238 web_widget_ = | 238 web_widget_ = |
| 239 blink::WebFrameWidget::create(this, web_frame_->toWebLocalFrame()); | 239 blink::WebFrameWidget::create(this, web_frame_->toWebLocalFrame()); |
| 240 } else if (view_ && view_->id() == id_) { | 240 } else if (view_ && view_->id() == id_) { |
| 241 web_widget_ = blink::WebView::create(this); | 241 web_widget_ = blink::WebView::create(this); |
| 242 } else { | 242 } else { |
| 243 web_widget_ = blink::WebView::create(nullptr); | 243 web_widget_ = blink::WebView::create(nullptr); |
| 244 } | 244 } |
| 245 | 245 |
| 246 // Creating the widget calls initializeLayerTreeView() to create the | 246 // Creating the widget calls initializeLayerTreeView() to create the |
| 247 // |web_layer_tree_view_impl_|. As we haven't yet assigned the |web_widget_| | 247 // |web_layer_tree_view_impl_|. As we haven't yet assigned the |web_widget_| |
| 248 // we have to set it here. | 248 // we have to set it here. |
| 249 if (web_layer_tree_view_impl_) { | 249 if (web_layer_tree_view_impl_) { |
| 250 web_layer_tree_view_impl_->set_widget(web_widget_); | 250 web_layer_tree_view_impl_->set_widget(web_widget_); |
| 251 web_layer_tree_view_impl_->set_view(view_); | 251 web_layer_tree_view_impl_->set_view(view_); |
| 252 UpdateWebViewSizeFromViewSize(); | 252 UpdateWebViewSizeFromViewSize(); |
| 253 } | 253 } |
| 254 | 254 |
| 255 if (web_view()) | 255 if (web_view()) |
| 256 ConfigureSettings(web_view()->settings()); | 256 ConfigureSettings(web_view()->settings()); |
| 257 } | 257 } |
| 258 | 258 |
| 259 void Frame::UpdateFocus() { | 259 void HTMLFrame::UpdateFocus() { |
| 260 if (!web_widget_ || !view_) | 260 if (!web_widget_ || !view_) |
| 261 return; | 261 return; |
| 262 const bool is_focused = view_ && view_->HasFocus(); | 262 const bool is_focused = view_ && view_->HasFocus(); |
| 263 web_widget_->setFocus(is_focused); | 263 web_widget_->setFocus(is_focused); |
| 264 if (web_widget_->isWebView()) | 264 if (web_widget_->isWebView()) |
| 265 static_cast<blink::WebView*>(web_widget_)->setIsActive(is_focused); | 265 static_cast<blink::WebView*>(web_widget_)->setIsActive(is_focused); |
| 266 } | 266 } |
| 267 | 267 |
| 268 void Frame::UpdateWebViewSizeFromViewSize() { | 268 void HTMLFrame::UpdateWebViewSizeFromViewSize() { |
| 269 if (!web_widget_ || !view_) | 269 if (!web_widget_ || !view_) |
| 270 return; | 270 return; |
| 271 | 271 |
| 272 const gfx::Size size_in_pixels(view_->bounds().width, view_->bounds().height); | 272 const gfx::Size size_in_pixels(view_->bounds().width, view_->bounds().height); |
| 273 const gfx::Size size_in_dips = gfx::ConvertSizeToDIP( | 273 const gfx::Size size_in_dips = gfx::ConvertSizeToDIP( |
| 274 view_->viewport_metrics().device_pixel_ratio, size_in_pixels); | 274 view_->viewport_metrics().device_pixel_ratio, size_in_pixels); |
| 275 web_widget_->resize( | 275 web_widget_->resize( |
| 276 blink::WebSize(size_in_dips.width(), size_in_dips.height())); | 276 blink::WebSize(size_in_dips.width(), size_in_dips.height())); |
| 277 web_layer_tree_view_impl_->setViewportSize(size_in_pixels); | 277 web_layer_tree_view_impl_->setViewportSize(size_in_pixels); |
| 278 } | 278 } |
| 279 | 279 |
| 280 void Frame::SwapToRemote(const blink::WebURLRequest& request) { | 280 void HTMLFrame::SwapToRemote(const blink::WebURLRequest& request) { |
| 281 DCHECK(IsLocal()); | 281 DCHECK(IsLocal()); |
| 282 mojo::URLRequestPtr url_request = mojo::URLRequest::From(request); | 282 mojo::URLRequestPtr url_request = mojo::URLRequest::From(request); |
| 283 view_->EmbedAllowingReembed(url_request.Pass()); | 283 view_->EmbedAllowingReembed(url_request.Pass()); |
| 284 | 284 |
| 285 // TODO(sky): I tried swapping the frame types here, but that resulted in | 285 // TODO(sky): I tried swapping the frame types here, but that resulted in |
| 286 // the view never getting sized. Figure out why. | 286 // the view never getting sized. Figure out why. |
| 287 base::MessageLoop::current()->PostTask( | 287 base::MessageLoop::current()->PostTask( |
| 288 FROM_HERE, | 288 FROM_HERE, |
| 289 base::Bind(&Frame::FinishSwapToRemote, weak_factory_.GetWeakPtr())); | 289 base::Bind(&HTMLFrame::FinishSwapToRemote, weak_factory_.GetWeakPtr())); |
| 290 } | 290 } |
| 291 | 291 |
| 292 void Frame::FinishSwapToRemote() { | 292 void HTMLFrame::FinishSwapToRemote() { |
| 293 if (web_frame_->isWebRemoteFrame()) | 293 if (web_frame_->isWebRemoteFrame()) |
| 294 return; // We already did the swap. | 294 return; // We already did the swap. |
| 295 | 295 |
| 296 blink::WebRemoteFrame* remote_frame = | 296 blink::WebRemoteFrame* remote_frame = |
| 297 blink::WebRemoteFrame::create(scope_, this); | 297 blink::WebRemoteFrame::create(scope_, this); |
| 298 remote_frame->initializeFromFrame(web_frame_->toWebLocalFrame()); | 298 remote_frame->initializeFromFrame(web_frame_->toWebLocalFrame()); |
| 299 // swap() ends up calling us back and we then close the frame. | 299 // swap() ends up calling us back and we then close the frame. |
| 300 web_frame_->swap(remote_frame); | 300 web_frame_->swap(remote_frame); |
| 301 web_layer_.reset(new WebLayerImpl(this)); | 301 web_layer_.reset(new WebLayerImpl(this)); |
| 302 remote_frame->setRemoteWebLayer(web_layer_.get()); | 302 remote_frame->setRemoteWebLayer(web_layer_.get()); |
| 303 web_frame_ = remote_frame; | 303 web_frame_ = remote_frame; |
| 304 } | 304 } |
| 305 | 305 |
| 306 Frame* Frame::FindFrameWithWebFrame(blink::WebFrame* web_frame) { | 306 HTMLFrame* HTMLFrame::FindFrameWithWebFrame(blink::WebFrame* web_frame) { |
| 307 if (web_frame_ == web_frame) | 307 if (web_frame_ == web_frame) |
| 308 return this; | 308 return this; |
| 309 for (Frame* child_frame : children_) { | 309 for (HTMLFrame* child_frame : children_) { |
| 310 Frame* result = child_frame->FindFrameWithWebFrame(web_frame); | 310 HTMLFrame* result = child_frame->FindFrameWithWebFrame(web_frame); |
| 311 if (result) | 311 if (result) |
| 312 return result; | 312 return result; |
| 313 } | 313 } |
| 314 return nullptr; | 314 return nullptr; |
| 315 } | 315 } |
| 316 | 316 |
| 317 void Frame::FrameDetachedImpl(blink::WebFrame* web_frame) { | 317 void HTMLFrame::FrameDetachedImpl(blink::WebFrame* web_frame) { |
| 318 DCHECK_EQ(web_frame_, web_frame); | 318 DCHECK_EQ(web_frame_, web_frame); |
| 319 | 319 |
| 320 while (!children_.empty()) { | 320 while (!children_.empty()) { |
| 321 Frame* child = children_.front(); | 321 HTMLFrame* child = children_.front(); |
| 322 child->Close(); | 322 child->Close(); |
| 323 DCHECK(children_.empty() || children_.front() != child); | 323 DCHECK(children_.empty() || children_.front() != child); |
| 324 } | 324 } |
| 325 | 325 |
| 326 if (web_frame->parent()) | 326 if (web_frame->parent()) |
| 327 web_frame->parent()->removeChild(web_frame); | 327 web_frame->parent()->removeChild(web_frame); |
| 328 | 328 |
| 329 delete this; | 329 delete this; |
| 330 } | 330 } |
| 331 | 331 |
| 332 void Frame::OnViewBoundsChanged(View* view, | 332 void HTMLFrame::OnViewBoundsChanged(View* view, |
| 333 const Rect& old_bounds, | 333 const Rect& old_bounds, |
| 334 const Rect& new_bounds) { | 334 const Rect& new_bounds) { |
| 335 DCHECK_EQ(view, view_); | 335 DCHECK_EQ(view, view_); |
| 336 UpdateWebViewSizeFromViewSize(); | 336 UpdateWebViewSizeFromViewSize(); |
| 337 } | 337 } |
| 338 | 338 |
| 339 void Frame::OnViewDestroyed(View* view) { | 339 void HTMLFrame::OnViewDestroyed(View* view) { |
| 340 DCHECK_EQ(view, view_); | 340 DCHECK_EQ(view, view_); |
| 341 view_->RemoveObserver(this); | 341 view_->RemoveObserver(this); |
| 342 view_ = nullptr; | 342 view_ = nullptr; |
| 343 Close(); | 343 Close(); |
| 344 } | 344 } |
| 345 | 345 |
| 346 void Frame::OnViewInputEvent(View* view, const mojo::EventPtr& event) { | 346 void HTMLFrame::OnViewInputEvent(View* view, const mojo::EventPtr& event) { |
| 347 if (event->pointer_data) { | 347 if (event->pointer_data) { |
| 348 // Blink expects coordintes to be in DIPs. | 348 // Blink expects coordintes to be in DIPs. |
| 349 event->pointer_data->x /= global_state()->device_pixel_ratio(); | 349 event->pointer_data->x /= global_state()->device_pixel_ratio(); |
| 350 event->pointer_data->y /= global_state()->device_pixel_ratio(); | 350 event->pointer_data->y /= global_state()->device_pixel_ratio(); |
| 351 event->pointer_data->screen_x /= global_state()->device_pixel_ratio(); | 351 event->pointer_data->screen_x /= global_state()->device_pixel_ratio(); |
| 352 event->pointer_data->screen_y /= global_state()->device_pixel_ratio(); | 352 event->pointer_data->screen_y /= global_state()->device_pixel_ratio(); |
| 353 } | 353 } |
| 354 | 354 |
| 355 if (!touch_handler_ && web_widget_) | 355 if (!touch_handler_ && web_widget_) |
| 356 touch_handler_.reset(new TouchHandler(web_widget_)); | 356 touch_handler_.reset(new TouchHandler(web_widget_)); |
| 357 | 357 |
| 358 if ((event->action == mojo::EVENT_TYPE_POINTER_DOWN || | 358 if ((event->action == mojo::EVENT_TYPE_POINTER_DOWN || |
| 359 event->action == mojo::EVENT_TYPE_POINTER_UP || | 359 event->action == mojo::EVENT_TYPE_POINTER_UP || |
| 360 event->action == mojo::EVENT_TYPE_POINTER_CANCEL || | 360 event->action == mojo::EVENT_TYPE_POINTER_CANCEL || |
| 361 event->action == mojo::EVENT_TYPE_POINTER_MOVE) && | 361 event->action == mojo::EVENT_TYPE_POINTER_MOVE) && |
| 362 event->pointer_data->kind == mojo::POINTER_KIND_TOUCH) { | 362 event->pointer_data->kind == mojo::POINTER_KIND_TOUCH) { |
| 363 touch_handler_->OnTouchEvent(*event); | 363 touch_handler_->OnTouchEvent(*event); |
| 364 return; | 364 return; |
| 365 } | 365 } |
| 366 | 366 |
| 367 if (!web_widget_) | 367 if (!web_widget_) |
| 368 return; | 368 return; |
| 369 | 369 |
| 370 scoped_ptr<blink::WebInputEvent> web_event = | 370 scoped_ptr<blink::WebInputEvent> web_event = |
| 371 event.To<scoped_ptr<blink::WebInputEvent>>(); | 371 event.To<scoped_ptr<blink::WebInputEvent>>(); |
| 372 if (web_event) | 372 if (web_event) |
| 373 web_widget_->handleInputEvent(*web_event); | 373 web_widget_->handleInputEvent(*web_event); |
| 374 } | 374 } |
| 375 | 375 |
| 376 void Frame::OnViewFocusChanged(mojo::View* gained_focus, | 376 void HTMLFrame::OnViewFocusChanged(mojo::View* gained_focus, |
| 377 mojo::View* lost_focus) { | 377 mojo::View* lost_focus) { |
| 378 UpdateFocus(); | 378 UpdateFocus(); |
| 379 } | 379 } |
| 380 | 380 |
| 381 void Frame::initializeLayerTreeView() { | 381 void HTMLFrame::initializeLayerTreeView() { |
| 382 mojo::URLRequestPtr request(mojo::URLRequest::New()); | 382 mojo::URLRequestPtr request(mojo::URLRequest::New()); |
| 383 request->url = mojo::String::From("mojo:surfaces_service"); | 383 request->url = mojo::String::From("mojo:surfaces_service"); |
| 384 mojo::SurfacePtr surface; | 384 mojo::SurfacePtr surface; |
| 385 frame_tree_manager_->app()->ConnectToService(request.Pass(), &surface); | 385 frame_tree_manager_->app()->ConnectToService(request.Pass(), &surface); |
| 386 | 386 |
| 387 // TODO(jamesr): Should be mojo:gpu_service | 387 // TODO(jamesr): Should be mojo:gpu_service |
| 388 mojo::URLRequestPtr request2(mojo::URLRequest::New()); | 388 mojo::URLRequestPtr request2(mojo::URLRequest::New()); |
| 389 request2->url = mojo::String::From("mojo:view_manager"); | 389 request2->url = mojo::String::From("mojo:view_manager"); |
| 390 mojo::GpuPtr gpu_service; | 390 mojo::GpuPtr gpu_service; |
| 391 frame_tree_manager_->app()->ConnectToService(request2.Pass(), &gpu_service); | 391 frame_tree_manager_->app()->ConnectToService(request2.Pass(), &gpu_service); |
| 392 web_layer_tree_view_impl_.reset(new WebLayerTreeViewImpl( | 392 web_layer_tree_view_impl_.reset(new WebLayerTreeViewImpl( |
| 393 global_state()->compositor_thread(), | 393 global_state()->compositor_thread(), |
| 394 global_state()->gpu_memory_buffer_manager(), | 394 global_state()->gpu_memory_buffer_manager(), |
| 395 global_state()->raster_thread_helper()->task_graph_runner(), | 395 global_state()->raster_thread_helper()->task_graph_runner(), |
| 396 surface.Pass(), gpu_service.Pass())); | 396 surface.Pass(), gpu_service.Pass())); |
| 397 } | 397 } |
| 398 | 398 |
| 399 blink::WebLayerTreeView* Frame::layerTreeView() { | 399 blink::WebLayerTreeView* HTMLFrame::layerTreeView() { |
| 400 return web_layer_tree_view_impl_.get(); | 400 return web_layer_tree_view_impl_.get(); |
| 401 } | 401 } |
| 402 | 402 |
| 403 blink::WebStorageNamespace* Frame::createSessionStorageNamespace() { | 403 blink::WebStorageNamespace* HTMLFrame::createSessionStorageNamespace() { |
| 404 return new WebStorageNamespaceImpl(); | 404 return new WebStorageNamespaceImpl(); |
| 405 } | 405 } |
| 406 | 406 |
| 407 blink::WebMediaPlayer* Frame::createMediaPlayer( | 407 blink::WebMediaPlayer* HTMLFrame::createMediaPlayer( |
| 408 blink::WebLocalFrame* frame, | 408 blink::WebLocalFrame* frame, |
| 409 const blink::WebURL& url, | 409 const blink::WebURL& url, |
| 410 blink::WebMediaPlayerClient* client, | 410 blink::WebMediaPlayerClient* client, |
| 411 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, | 411 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, |
| 412 blink::WebContentDecryptionModule* initial_cdm) { | 412 blink::WebContentDecryptionModule* initial_cdm) { |
| 413 return global_state()->media_factory()->CreateMediaPlayer( | 413 return global_state()->media_factory()->CreateMediaPlayer( |
| 414 frame, url, client, encrypted_client, initial_cdm, | 414 frame, url, client, encrypted_client, initial_cdm, |
| 415 frame_tree_manager_->app()->shell()); | 415 frame_tree_manager_->app()->shell()); |
| 416 } | 416 } |
| 417 | 417 |
| 418 blink::WebFrame* Frame::createChildFrame(blink::WebLocalFrame* parent, | 418 blink::WebFrame* HTMLFrame::createChildFrame( |
| 419 blink::WebTreeScopeType scope, | 419 blink::WebLocalFrame* parent, |
| 420 const blink::WebString& frame_name, | 420 blink::WebTreeScopeType scope, |
| 421 blink::WebSandboxFlags sandbox_flags) { | 421 const blink::WebString& frame_name, |
| 422 blink::WebSandboxFlags sandbox_flags) { |
| 422 DCHECK(IsLocal()); // Can't create children of remote frames. | 423 DCHECK(IsLocal()); // Can't create children of remote frames. |
| 423 DCHECK_EQ(parent, web_frame_); | 424 DCHECK_EQ(parent, web_frame_); |
| 424 DCHECK(view_); // If we're local we have to have a view. | 425 DCHECK(view_); // If we're local we have to have a view. |
| 425 // Create the view that will house the frame now. We embed once we know the | 426 // Create the view that will house the frame now. We embed once we know the |
| 426 // url (see decidePolicyForNavigation()). | 427 // url (see decidePolicyForNavigation()). |
| 427 mojo::View* child_view = view_->view_manager()->CreateView(); | 428 mojo::View* child_view = view_->view_manager()->CreateView(); |
| 428 child_view->SetVisible(true); | 429 child_view->SetVisible(true); |
| 429 view_->AddChild(child_view); | 430 view_->AddChild(child_view); |
| 430 | 431 |
| 431 // TODO(sky): the act of creating needs to notify the browser side, not | 432 // TODO(sky): the act of creating needs to notify the browser side, not |
| 432 // navigation. | 433 // navigation. |
| 433 Frame::CreateParams params(frame_tree_manager_, this, child_view->id()); | 434 HTMLFrame::CreateParams params(frame_tree_manager_, this, child_view->id()); |
| 434 Frame* child_frame = new Frame(params); | 435 HTMLFrame* child_frame = new HTMLFrame(params); |
| 435 child_frame->scope_ = scope; | 436 child_frame->scope_ = scope; |
| 436 | 437 |
| 437 child_frame->SetView(child_view); | 438 child_frame->SetView(child_view); |
| 438 | 439 |
| 439 blink::WebLocalFrame* child_web_frame = | 440 blink::WebLocalFrame* child_web_frame = |
| 440 blink::WebLocalFrame::create(scope, child_frame); | 441 blink::WebLocalFrame::create(scope, child_frame); |
| 441 child_frame->web_frame_ = child_web_frame; | 442 child_frame->web_frame_ = child_web_frame; |
| 442 parent->appendChild(child_web_frame); | 443 parent->appendChild(child_web_frame); |
| 443 return child_web_frame; | 444 return child_web_frame; |
| 444 } | 445 } |
| 445 | 446 |
| 446 void Frame::frameDetached(blink::WebFrame* web_frame, | 447 void HTMLFrame::frameDetached(blink::WebFrame* web_frame, |
| 447 blink::WebFrameClient::DetachType type) { | 448 blink::WebFrameClient::DetachType type) { |
| 448 if (type == blink::WebFrameClient::DetachType::Swap) { | 449 if (type == blink::WebFrameClient::DetachType::Swap) { |
| 449 web_frame->close(); | 450 web_frame->close(); |
| 450 return; | 451 return; |
| 451 } | 452 } |
| 452 | 453 |
| 453 DCHECK(type == blink::WebFrameClient::DetachType::Remove); | 454 DCHECK(type == blink::WebFrameClient::DetachType::Remove); |
| 454 FrameDetachedImpl(web_frame); | 455 FrameDetachedImpl(web_frame); |
| 455 } | 456 } |
| 456 | 457 |
| 457 blink::WebCookieJar* Frame::cookieJar(blink::WebLocalFrame* frame) { | 458 blink::WebCookieJar* HTMLFrame::cookieJar(blink::WebLocalFrame* frame) { |
| 458 // TODO(darin): Blink does not fallback to the Platform provided WebCookieJar. | 459 // TODO(darin): Blink does not fallback to the Platform provided WebCookieJar. |
| 459 // Either it should, as it once did, or we should find another solution here. | 460 // Either it should, as it once did, or we should find another solution here. |
| 460 return blink::Platform::current()->cookieJar(); | 461 return blink::Platform::current()->cookieJar(); |
| 461 } | 462 } |
| 462 | 463 |
| 463 blink::WebNavigationPolicy Frame::decidePolicyForNavigation( | 464 blink::WebNavigationPolicy HTMLFrame::decidePolicyForNavigation( |
| 464 const NavigationPolicyInfo& info) { | 465 const NavigationPolicyInfo& info) { |
| 465 if (parent_ && parent_->IsLocal()) { | 466 if (parent_ && parent_->IsLocal()) { |
| 466 SwapToRemote(info.urlRequest); | 467 SwapToRemote(info.urlRequest); |
| 467 return blink::WebNavigationPolicyIgnore; | 468 return blink::WebNavigationPolicyIgnore; |
| 468 } | 469 } |
| 469 | 470 |
| 470 return frame_tree_manager_->DecidePolicyForNavigation(this, info); | 471 return frame_tree_manager_->DecidePolicyForNavigation(this, info); |
| 471 } | 472 } |
| 472 | 473 |
| 473 void Frame::didAddMessageToConsole(const blink::WebConsoleMessage& message, | 474 void HTMLFrame::didAddMessageToConsole(const blink::WebConsoleMessage& message, |
| 474 const blink::WebString& source_name, | 475 const blink::WebString& source_name, |
| 475 unsigned source_line, | 476 unsigned source_line, |
| 476 const blink::WebString& stack_trace) { | 477 const blink::WebString& stack_trace) { |
| 477 VLOG(1) << "[" << source_name.utf8() << "(" << source_line << ")] " | 478 VLOG(1) << "[" << source_name.utf8() << "(" << source_line << ")] " |
| 478 << message.text.utf8(); | 479 << message.text.utf8(); |
| 479 } | 480 } |
| 480 | 481 |
| 481 void Frame::didFinishLoad(blink::WebLocalFrame* frame) { | 482 void HTMLFrame::didFinishLoad(blink::WebLocalFrame* frame) { |
| 482 frame_tree_manager_->OnFrameDidFinishLoad(this); | 483 frame_tree_manager_->OnFrameDidFinishLoad(this); |
| 483 } | 484 } |
| 484 | 485 |
| 485 void Frame::didNavigateWithinPage(blink::WebLocalFrame* frame, | 486 void HTMLFrame::didNavigateWithinPage(blink::WebLocalFrame* frame, |
| 486 const blink::WebHistoryItem& history_item, | 487 const blink::WebHistoryItem& history_item, |
| 487 blink::WebHistoryCommitType commit_type) { | 488 blink::WebHistoryCommitType commit_type) { |
| 488 frame_tree_manager_->OnFrameDidNavigateLocally( | 489 frame_tree_manager_->OnFrameDidNavigateLocally( |
| 489 this, history_item.urlString().utf8()); | 490 this, history_item.urlString().utf8()); |
| 490 } | 491 } |
| 491 | 492 |
| 492 blink::WebGeolocationClient* Frame::geolocationClient() { | 493 blink::WebGeolocationClient* HTMLFrame::geolocationClient() { |
| 493 if (!geolocation_client_impl_) | 494 if (!geolocation_client_impl_) |
| 494 geolocation_client_impl_.reset(new GeolocationClientImpl); | 495 geolocation_client_impl_.reset(new GeolocationClientImpl); |
| 495 return geolocation_client_impl_.get(); | 496 return geolocation_client_impl_.get(); |
| 496 } | 497 } |
| 497 | 498 |
| 498 blink::WebEncryptedMediaClient* Frame::encryptedMediaClient() { | 499 blink::WebEncryptedMediaClient* HTMLFrame::encryptedMediaClient() { |
| 499 return global_state()->media_factory()->GetEncryptedMediaClient(); | 500 return global_state()->media_factory()->GetEncryptedMediaClient(); |
| 500 } | 501 } |
| 501 | 502 |
| 502 void Frame::didStartLoading(bool to_different_document) { | 503 void HTMLFrame::didStartLoading(bool to_different_document) { |
| 503 frame_tree_manager_->LoadingStarted(); | 504 frame_tree_manager_->LoadingStarted(); |
| 504 } | 505 } |
| 505 | 506 |
| 506 void Frame::didStopLoading() { | 507 void HTMLFrame::didStopLoading() { |
| 507 frame_tree_manager_->LoadingStopped(); | 508 frame_tree_manager_->LoadingStopped(); |
| 508 } | 509 } |
| 509 | 510 |
| 510 void Frame::didChangeLoadProgress(double load_progress) { | 511 void HTMLFrame::didChangeLoadProgress(double load_progress) { |
| 511 frame_tree_manager_->ProgressChanged(load_progress); | 512 frame_tree_manager_->ProgressChanged(load_progress); |
| 512 } | 513 } |
| 513 | 514 |
| 514 void Frame::didChangeName(blink::WebLocalFrame* frame, | 515 void HTMLFrame::didChangeName(blink::WebLocalFrame* frame, |
| 515 const blink::WebString& name) { | 516 const blink::WebString& name) { |
| 516 frame_tree_manager_->OnFrameDidChangeName(this, name); | 517 frame_tree_manager_->OnFrameDidChangeName(this, name); |
| 517 } | 518 } |
| 518 | 519 |
| 519 void Frame::frameDetached(blink::WebRemoteFrameClient::DetachType type) { | 520 void HTMLFrame::frameDetached(blink::WebRemoteFrameClient::DetachType type) { |
| 520 if (type == blink::WebRemoteFrameClient::DetachType::Swap) { | 521 if (type == blink::WebRemoteFrameClient::DetachType::Swap) { |
| 521 web_frame_->close(); | 522 web_frame_->close(); |
| 522 return; | 523 return; |
| 523 } | 524 } |
| 524 | 525 |
| 525 DCHECK(type == blink::WebRemoteFrameClient::DetachType::Remove); | 526 DCHECK(type == blink::WebRemoteFrameClient::DetachType::Remove); |
| 526 FrameDetachedImpl(web_frame_); | 527 FrameDetachedImpl(web_frame_); |
| 527 } | 528 } |
| 528 | 529 |
| 529 void Frame::postMessageEvent(blink::WebLocalFrame* source_frame, | 530 void HTMLFrame::postMessageEvent(blink::WebLocalFrame* source_frame, |
| 530 blink::WebRemoteFrame* target_frame, | 531 blink::WebRemoteFrame* target_frame, |
| 531 blink::WebSecurityOrigin target_origin, | 532 blink::WebSecurityOrigin target_origin, |
| 532 blink::WebDOMMessageEvent event) { | 533 blink::WebDOMMessageEvent event) { |
| 533 NOTIMPLEMENTED(); | 534 NOTIMPLEMENTED(); |
| 534 } | 535 } |
| 535 | 536 |
| 536 void Frame::initializeChildFrame(const blink::WebRect& frame_rect, | 537 void HTMLFrame::initializeChildFrame(const blink::WebRect& frame_rect, |
| 537 float scale_factor) { | 538 float scale_factor) { |
| 538 // TODO(sky): frame_rect is in dips. Need to convert. | 539 // TODO(sky): frame_rect is in dips. Need to convert. |
| 539 mojo::Rect rect; | 540 mojo::Rect rect; |
| 540 rect.x = frame_rect.x; | 541 rect.x = frame_rect.x; |
| 541 rect.y = frame_rect.y; | 542 rect.y = frame_rect.y; |
| 542 rect.width = frame_rect.width; | 543 rect.width = frame_rect.width; |
| 543 rect.height = frame_rect.height; | 544 rect.height = frame_rect.height; |
| 544 view_->SetBounds(rect); | 545 view_->SetBounds(rect); |
| 545 } | 546 } |
| 546 | 547 |
| 547 void Frame::navigate(const blink::WebURLRequest& request, | 548 void HTMLFrame::navigate(const blink::WebURLRequest& request, |
| 548 bool should_replace_current_entry) { | 549 bool should_replace_current_entry) { |
| 549 NOTIMPLEMENTED(); | 550 NOTIMPLEMENTED(); |
| 550 } | 551 } |
| 551 | 552 |
| 552 void Frame::reload(bool ignore_cache, bool is_client_redirect) { | 553 void HTMLFrame::reload(bool ignore_cache, bool is_client_redirect) { |
| 553 NOTIMPLEMENTED(); | 554 NOTIMPLEMENTED(); |
| 554 } | 555 } |
| 555 | 556 |
| 556 void Frame::forwardInputEvent(const blink::WebInputEvent* event) { | 557 void HTMLFrame::forwardInputEvent(const blink::WebInputEvent* event) { |
| 557 NOTIMPLEMENTED(); | 558 NOTIMPLEMENTED(); |
| 558 } | 559 } |
| 559 | 560 |
| 560 } // namespace mojo | 561 } // namespace mojo |
| OLD | NEW |