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 |