| 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/html_frame.h" | 5 #include "components/html_viewer/html_frame.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 #include "ui/gfx/geometry/size.h" | 65 #include "ui/gfx/geometry/size.h" |
| 66 #include "url/gurl.h" | 66 #include "url/gurl.h" |
| 67 #include "url/origin.h" | 67 #include "url/origin.h" |
| 68 #include "url/url_constants.h" | 68 #include "url/url_constants.h" |
| 69 | 69 |
| 70 using mojo::AxProvider; | 70 using mojo::AxProvider; |
| 71 using mojo::Rect; | 71 using mojo::Rect; |
| 72 using mojo::ServiceProviderPtr; | 72 using mojo::ServiceProviderPtr; |
| 73 using mojo::URLResponsePtr; | 73 using mojo::URLResponsePtr; |
| 74 using mus::View; | 74 using mus::View; |
| 75 using web_view::HTMLMessageEvent; | 75 using web_view::mojom::HTMLMessageEvent; |
| 76 using web_view::HTMLMessageEventPtr; | 76 using web_view::mojom::HTMLMessageEventPtr; |
| 77 | 77 |
| 78 namespace html_viewer { | 78 namespace html_viewer { |
| 79 namespace { | 79 namespace { |
| 80 | 80 |
| 81 const size_t kMaxTitleChars = 4 * 1024; | 81 const size_t kMaxTitleChars = 4 * 1024; |
| 82 | 82 |
| 83 web_view::NavigationTargetType WebNavigationPolicyToNavigationTarget( | 83 web_view::mojom::NavigationTargetType WebNavigationPolicyToNavigationTarget( |
| 84 blink::WebNavigationPolicy policy) { | 84 blink::WebNavigationPolicy policy) { |
| 85 switch (policy) { | 85 switch (policy) { |
| 86 case blink::WebNavigationPolicyCurrentTab: | 86 case blink::WebNavigationPolicyCurrentTab: |
| 87 return web_view::NAVIGATION_TARGET_TYPE_EXISTING_FRAME; | 87 return web_view::mojom::NAVIGATION_TARGET_TYPE_EXISTING_FRAME; |
| 88 case blink::WebNavigationPolicyNewBackgroundTab: | 88 case blink::WebNavigationPolicyNewBackgroundTab: |
| 89 case blink::WebNavigationPolicyNewForegroundTab: | 89 case blink::WebNavigationPolicyNewForegroundTab: |
| 90 case blink::WebNavigationPolicyNewWindow: | 90 case blink::WebNavigationPolicyNewWindow: |
| 91 case blink::WebNavigationPolicyNewPopup: | 91 case blink::WebNavigationPolicyNewPopup: |
| 92 return web_view::NAVIGATION_TARGET_TYPE_NEW_FRAME; | 92 return web_view::mojom::NAVIGATION_TARGET_TYPE_NEW_FRAME; |
| 93 default: | 93 default: |
| 94 return web_view::NAVIGATION_TARGET_TYPE_NO_PREFERENCE; | 94 return web_view::mojom::NAVIGATION_TARGET_TYPE_NO_PREFERENCE; |
| 95 } | 95 } |
| 96 } | 96 } |
| 97 | 97 |
| 98 HTMLFrame* GetPreviousSibling(HTMLFrame* frame) { | 98 HTMLFrame* GetPreviousSibling(HTMLFrame* frame) { |
| 99 DCHECK(frame->parent()); | 99 DCHECK(frame->parent()); |
| 100 auto iter = std::find(frame->parent()->children().begin(), | 100 auto iter = std::find(frame->parent()->children().begin(), |
| 101 frame->parent()->children().end(), frame); | 101 frame->parent()->children().end(), frame); |
| 102 return (iter == frame->parent()->children().begin()) ? nullptr : *(--iter); | 102 return (iter == frame->parent()->children().begin()) ? nullptr : *(--iter); |
| 103 } | 103 } |
| 104 | 104 |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 view_->AddChild(child_view); | 307 view_->AddChild(child_view); |
| 308 | 308 |
| 309 HTMLFrame::CreateParams params(frame_tree_manager_, this, child_view->id(), | 309 HTMLFrame::CreateParams params(frame_tree_manager_, this, child_view->id(), |
| 310 child_view, client_properties, nullptr); | 310 child_view, client_properties, nullptr); |
| 311 params.is_local_create_child = true; | 311 params.is_local_create_child = true; |
| 312 HTMLFrame* child_frame = GetFirstAncestorWithDelegate() | 312 HTMLFrame* child_frame = GetFirstAncestorWithDelegate() |
| 313 ->delegate_->GetHTMLFactory() | 313 ->delegate_->GetHTMLFactory() |
| 314 ->CreateHTMLFrame(¶ms); | 314 ->CreateHTMLFrame(¶ms); |
| 315 child_frame->owned_view_.reset(new mus::ScopedViewPtr(child_view)); | 315 child_frame->owned_view_.reset(new mus::ScopedViewPtr(child_view)); |
| 316 | 316 |
| 317 web_view::FrameTreeClientPtr client_ptr; | 317 web_view::mojom::FrameClientPtr client_ptr; |
| 318 child_frame->frame_tree_client_binding_.reset( | 318 child_frame->frame_client_binding_.reset( |
| 319 new mojo::Binding<web_view::FrameTreeClient>( | 319 new mojo::Binding<web_view::mojom::FrameClient>( |
| 320 child_frame, mojo::GetProxy(&client_ptr))); | 320 child_frame, mojo::GetProxy(&client_ptr))); |
| 321 server_->OnCreatedFrame(GetProxy(&(child_frame->server_)), client_ptr.Pass(), | 321 server_->OnCreatedFrame(GetProxy(&(child_frame->server_)), client_ptr.Pass(), |
| 322 child_view->id(), client_properties.Pass()); | 322 child_view->id(), client_properties.Pass()); |
| 323 return child_frame->web_frame_; | 323 return child_frame->web_frame_; |
| 324 } | 324 } |
| 325 | 325 |
| 326 void HTMLFrame::frameDetached(blink::WebFrame* web_frame, | 326 void HTMLFrame::frameDetached(blink::WebFrame* web_frame, |
| 327 blink::WebFrameClient::DetachType type) { | 327 blink::WebFrameClient::DetachType type) { |
| 328 if (type == blink::WebFrameClient::DetachType::Swap) { | 328 if (type == blink::WebFrameClient::DetachType::Swap) { |
| 329 web_frame->close(); | 329 web_frame->close(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 350 return blink::WebNavigationPolicyCurrentTab; | 350 return blink::WebNavigationPolicyCurrentTab; |
| 351 } | 351 } |
| 352 | 352 |
| 353 // about:blank is treated as the same origin and is always allowed for | 353 // about:blank is treated as the same origin and is always allowed for |
| 354 // frames. | 354 // frames. |
| 355 if (parent_ && info.urlRequest.url() == GURL(url::kAboutBlankURL) && | 355 if (parent_ && info.urlRequest.url() == GURL(url::kAboutBlankURL) && |
| 356 info.defaultPolicy == blink::WebNavigationPolicyCurrentTab) { | 356 info.defaultPolicy == blink::WebNavigationPolicyCurrentTab) { |
| 357 return blink::WebNavigationPolicyCurrentTab; | 357 return blink::WebNavigationPolicyCurrentTab; |
| 358 } | 358 } |
| 359 | 359 |
| 360 // Ask the FrameTreeServer to handle the navigation. By returning | 360 // Ask the Frame to handle the navigation. By returning |
| 361 // WebNavigationPolicyIgnore the load is suppressed. | 361 // WebNavigationPolicyIgnore the load is suppressed. |
| 362 mojo::URLRequestPtr url_request = mojo::URLRequest::From(info.urlRequest); | 362 mojo::URLRequestPtr url_request = mojo::URLRequest::From(info.urlRequest); |
| 363 server_->RequestNavigate( | 363 server_->RequestNavigate( |
| 364 WebNavigationPolicyToNavigationTarget(info.defaultPolicy), id_, | 364 WebNavigationPolicyToNavigationTarget(info.defaultPolicy), id_, |
| 365 url_request.Pass()); | 365 url_request.Pass()); |
| 366 | 366 |
| 367 return blink::WebNavigationPolicyIgnore; | 367 return blink::WebNavigationPolicyIgnore; |
| 368 } | 368 } |
| 369 | 369 |
| 370 void HTMLFrame::didHandleOnloadEvents(blink::WebLocalFrame* frame) { | 370 void HTMLFrame::didHandleOnloadEvents(blink::WebLocalFrame* frame) { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 blink::WebTextDirection direction) { | 453 blink::WebTextDirection direction) { |
| 454 // TODO(beng): handle |direction|. | 454 // TODO(beng): handle |direction|. |
| 455 mojo::String formatted; | 455 mojo::String formatted; |
| 456 if (!title.isNull()) { | 456 if (!title.isNull()) { |
| 457 formatted = | 457 formatted = |
| 458 mojo::String::From(base::string16(title).substr(0, kMaxTitleChars)); | 458 mojo::String::From(base::string16(title).substr(0, kMaxTitleChars)); |
| 459 } | 459 } |
| 460 server_->TitleChanged(formatted); | 460 server_->TitleChanged(formatted); |
| 461 } | 461 } |
| 462 | 462 |
| 463 void HTMLFrame::Bind(web_view::FrameTreeServerPtr frame_tree_server, | 463 void HTMLFrame::Bind( |
| 464 mojo::InterfaceRequest<web_view::FrameTreeClient> | 464 web_view::mojom::FramePtr frame, |
| 465 frame_tree_client_request) { | 465 mojo::InterfaceRequest<web_view::mojom::FrameClient> frame_client_request) { |
| 466 DCHECK(IsLocal()); | 466 DCHECK(IsLocal()); |
| 467 server_ = frame_tree_server.Pass(); | 467 server_ = frame.Pass(); |
| 468 server_.set_connection_error_handler( | 468 server_.set_connection_error_handler( |
| 469 base::Bind(&HTMLFrame::Close, base::Unretained(this))); | 469 base::Bind(&HTMLFrame::Close, base::Unretained(this))); |
| 470 frame_tree_client_binding_.reset(new mojo::Binding<web_view::FrameTreeClient>( | 470 frame_client_binding_.reset(new mojo::Binding<web_view::mojom::FrameClient>( |
| 471 this, frame_tree_client_request.Pass())); | 471 this, frame_client_request.Pass())); |
| 472 } | 472 } |
| 473 | 473 |
| 474 void HTMLFrame::SetValueFromClientProperty(const std::string& name, | 474 void HTMLFrame::SetValueFromClientProperty(const std::string& name, |
| 475 mojo::Array<uint8_t> new_data) { | 475 mojo::Array<uint8_t> new_data) { |
| 476 if (IsLocal()) | 476 if (IsLocal()) |
| 477 return; | 477 return; |
| 478 | 478 |
| 479 // Only the name and origin dynamically change. | 479 // Only the name and origin dynamically change. |
| 480 if (name == kPropertyFrameOrigin) { | 480 if (name == kPropertyFrameOrigin) { |
| 481 state_.origin = FrameOriginFromClientProperty(new_data); | 481 state_.origin = FrameOriginFromClientProperty(new_data); |
| 482 web_frame_->toWebRemoteFrame()->setReplicatedOrigin(state_.origin); | 482 web_frame_->toWebRemoteFrame()->setReplicatedOrigin(state_.origin); |
| 483 } else if (name == kPropertyFrameName) { | 483 } else if (name == kPropertyFrameName) { |
| 484 state_.name = FrameNameFromClientProperty(new_data); | 484 state_.name = FrameNameFromClientProperty(new_data); |
| 485 web_frame_->toWebRemoteFrame()->setReplicatedName(state_.name); | 485 web_frame_->toWebRemoteFrame()->setReplicatedName(state_.name); |
| 486 } | 486 } |
| 487 } | 487 } |
| 488 | 488 |
| 489 HTMLFrame* HTMLFrame::GetFirstAncestorWithDelegate() { | 489 HTMLFrame* HTMLFrame::GetFirstAncestorWithDelegate() { |
| 490 HTMLFrame* frame = this; | 490 HTMLFrame* frame = this; |
| 491 while (frame && !frame->delegate_) | 491 while (frame && !frame->delegate_) |
| 492 frame = frame->parent_; | 492 frame = frame->parent_; |
| 493 return frame; | 493 return frame; |
| 494 } | 494 } |
| 495 | 495 |
| 496 mojo::ApplicationImpl* HTMLFrame::GetApp() { | 496 mojo::ApplicationImpl* HTMLFrame::GetApp() { |
| 497 return GetFirstAncestorWithDelegate()->delegate_->GetApp(); | 497 return GetFirstAncestorWithDelegate()->delegate_->GetApp(); |
| 498 } | 498 } |
| 499 | 499 |
| 500 web_view::FrameTreeServer* HTMLFrame::GetFrameTreeServer() { | 500 web_view::mojom::Frame* HTMLFrame::GetServerFrame() { |
| 501 // Prefer an ancestor with a FrameTreeServer. | 501 // Prefer an ancestor with a server Frame. |
| 502 for (HTMLFrame* frame = this; frame; frame = frame->parent_) { | 502 for (HTMLFrame* frame = this; frame; frame = frame->parent_) { |
| 503 if (frame->server_.get()) | 503 if (frame->server_.get()) |
| 504 return frame->server_.get(); | 504 return frame->server_.get(); |
| 505 } | 505 } |
| 506 | 506 |
| 507 // No local root. This means we're a remote frame with no local frame | 507 // No local root. This means we're a remote frame with no local frame |
| 508 // ancestors. Use the local frame from the FrameTreeServer. | 508 // ancestors. Use the server Frame from the local root of the |
| 509 // HTMLFrameTreeManager. |
| 509 return frame_tree_manager_->local_root_->server_.get(); | 510 return frame_tree_manager_->local_root_->server_.get(); |
| 510 } | 511 } |
| 511 | 512 |
| 512 void HTMLFrame::SetView(mus::View* view) { | 513 void HTMLFrame::SetView(mus::View* view) { |
| 513 if (view_) | 514 if (view_) |
| 514 view_->RemoveObserver(this); | 515 view_->RemoveObserver(this); |
| 515 view_ = view; | 516 view_ = view; |
| 516 if (view_) | 517 if (view_) |
| 517 view_->AddObserver(this); | 518 view_->AddObserver(this); |
| 518 } | 519 } |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 567 remote_frame->setRemoteWebLayer(web_layer_.get()); | 568 remote_frame->setRemoteWebLayer(web_layer_.get()); |
| 568 remote_frame->setReplicatedName(state_.name); | 569 remote_frame->setReplicatedName(state_.name); |
| 569 remote_frame->setReplicatedOrigin(state_.origin); | 570 remote_frame->setReplicatedOrigin(state_.origin); |
| 570 remote_frame->setReplicatedSandboxFlags(state_.sandbox_flags); | 571 remote_frame->setReplicatedSandboxFlags(state_.sandbox_flags); |
| 571 // Tell the frame that it is actually loading. This prevents its parent | 572 // Tell the frame that it is actually loading. This prevents its parent |
| 572 // from prematurely dispatching load event. | 573 // from prematurely dispatching load event. |
| 573 remote_frame->didStartLoading(); | 574 remote_frame->didStartLoading(); |
| 574 web_frame_ = remote_frame; | 575 web_frame_ = remote_frame; |
| 575 SetView(nullptr); | 576 SetView(nullptr); |
| 576 server_.reset(); | 577 server_.reset(); |
| 577 frame_tree_client_binding_.reset(); | 578 frame_client_binding_.reset(); |
| 578 if (delegate) | 579 if (delegate) |
| 579 delegate->OnFrameSwappedToRemote(); | 580 delegate->OnFrameSwappedToRemote(); |
| 580 } | 581 } |
| 581 | 582 |
| 582 void HTMLFrame::SwapToLocal( | 583 void HTMLFrame::SwapToLocal( |
| 583 HTMLFrameDelegate* delegate, | 584 HTMLFrameDelegate* delegate, |
| 584 mus::View* view, | 585 mus::View* view, |
| 585 const mojo::Map<mojo::String, mojo::Array<uint8_t>>& properties) { | 586 const mojo::Map<mojo::String, mojo::Array<uint8_t>>& properties) { |
| 586 CHECK(!IsLocal()); | 587 CHECK(!IsLocal()); |
| 587 // It doesn't make sense for the root to swap to local. | 588 // It doesn't make sense for the root to swap to local. |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 event.To<scoped_ptr<blink::WebInputEvent>>(); | 681 event.To<scoped_ptr<blink::WebInputEvent>>(); |
| 681 if (web_event) | 682 if (web_event) |
| 682 web_widget->handleInputEvent(*web_event); | 683 web_widget->handleInputEvent(*web_event); |
| 683 } | 684 } |
| 684 | 685 |
| 685 void HTMLFrame::OnViewFocusChanged(mus::View* gained_focus, | 686 void HTMLFrame::OnViewFocusChanged(mus::View* gained_focus, |
| 686 mus::View* lost_focus) { | 687 mus::View* lost_focus) { |
| 687 UpdateFocus(); | 688 UpdateFocus(); |
| 688 } | 689 } |
| 689 | 690 |
| 690 void HTMLFrame::OnConnect(web_view::FrameTreeServerPtr server, | 691 void HTMLFrame::OnConnect(web_view::mojom::FramePtr frame, |
| 691 uint32_t change_id, | 692 uint32_t change_id, |
| 692 uint32_t view_id, | 693 uint32_t view_id, |
| 693 web_view::ViewConnectType view_connect_type, | 694 web_view::mojom::ViewConnectType view_connect_type, |
| 694 mojo::Array<web_view::FrameDataPtr> frame_data, | 695 mojo::Array<web_view::mojom::FrameDataPtr> frame_data, |
| 695 const OnConnectCallback& callback) { | 696 const OnConnectCallback& callback) { |
| 696 // This is called if this frame is created by way of OnCreatedFrame(). | 697 // This is called if this frame is created by way of OnCreatedFrame(). |
| 697 callback.Run(); | 698 callback.Run(); |
| 698 } | 699 } |
| 699 | 700 |
| 700 void HTMLFrame::OnFrameAdded(uint32_t change_id, | 701 void HTMLFrame::OnFrameAdded(uint32_t change_id, |
| 701 web_view::FrameDataPtr frame_data) { | 702 web_view::mojom::FrameDataPtr frame_data) { |
| 702 frame_tree_manager_->ProcessOnFrameAdded(this, change_id, frame_data.Pass()); | 703 frame_tree_manager_->ProcessOnFrameAdded(this, change_id, frame_data.Pass()); |
| 703 } | 704 } |
| 704 | 705 |
| 705 void HTMLFrame::OnFrameRemoved(uint32_t change_id, uint32_t frame_id) { | 706 void HTMLFrame::OnFrameRemoved(uint32_t change_id, uint32_t frame_id) { |
| 706 frame_tree_manager_->ProcessOnFrameRemoved(this, change_id, frame_id); | 707 frame_tree_manager_->ProcessOnFrameRemoved(this, change_id, frame_id); |
| 707 } | 708 } |
| 708 | 709 |
| 709 void HTMLFrame::OnFrameClientPropertyChanged(uint32_t frame_id, | 710 void HTMLFrame::OnFrameClientPropertyChanged(uint32_t frame_id, |
| 710 const mojo::String& name, | 711 const mojo::String& name, |
| 711 mojo::Array<uint8_t> new_value) { | 712 mojo::Array<uint8_t> new_value) { |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 827 global_state()->device_pixel_ratio(), rect_in_dip)); | 828 global_state()->device_pixel_ratio(), rect_in_dip)); |
| 828 const mojo::RectPtr mojo_rect_in_pixels(mojo::Rect::From(rect_in_pixels)); | 829 const mojo::RectPtr mojo_rect_in_pixels(mojo::Rect::From(rect_in_pixels)); |
| 829 view_->SetBounds(*mojo_rect_in_pixels); | 830 view_->SetBounds(*mojo_rect_in_pixels); |
| 830 } | 831 } |
| 831 | 832 |
| 832 void HTMLFrame::navigate(const blink::WebURLRequest& request, | 833 void HTMLFrame::navigate(const blink::WebURLRequest& request, |
| 833 bool should_replace_current_entry) { | 834 bool should_replace_current_entry) { |
| 834 // TODO: support |should_replace_current_entry|. | 835 // TODO: support |should_replace_current_entry|. |
| 835 NOTIMPLEMENTED(); // for |should_replace_current_entry | 836 NOTIMPLEMENTED(); // for |should_replace_current_entry |
| 836 mojo::URLRequestPtr url_request = mojo::URLRequest::From(request); | 837 mojo::URLRequestPtr url_request = mojo::URLRequest::From(request); |
| 837 GetFrameTreeServer()->RequestNavigate( | 838 GetServerFrame()->RequestNavigate( |
| 838 web_view::NAVIGATION_TARGET_TYPE_EXISTING_FRAME, id_, url_request.Pass()); | 839 web_view::mojom::NAVIGATION_TARGET_TYPE_EXISTING_FRAME, id_, |
| 840 url_request.Pass()); |
| 839 } | 841 } |
| 840 | 842 |
| 841 void HTMLFrame::reload(bool ignore_cache, bool is_client_redirect) { | 843 void HTMLFrame::reload(bool ignore_cache, bool is_client_redirect) { |
| 842 NOTIMPLEMENTED(); | 844 NOTIMPLEMENTED(); |
| 843 } | 845 } |
| 844 | 846 |
| 845 void HTMLFrame::forwardInputEvent(const blink::WebInputEvent* event) { | 847 void HTMLFrame::forwardInputEvent(const blink::WebInputEvent* event) { |
| 846 NOTIMPLEMENTED(); | 848 NOTIMPLEMENTED(); |
| 847 } | 849 } |
| 848 | 850 |
| 849 } // namespace mojo | 851 } // namespace mojo |
| OLD | NEW |