OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/renderer/render_view_impl.h" | 5 #include "content/renderer/render_view_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
604 &blink_settings); | 604 &blink_settings); |
605 for (const std::string& setting : blink_settings) { | 605 for (const std::string& setting : blink_settings) { |
606 size_t pos = setting.find('='); | 606 size_t pos = setting.find('='); |
607 settings->setFromStrings( | 607 settings->setFromStrings( |
608 blink::WebString::fromLatin1(setting.substr(0, pos)), | 608 blink::WebString::fromLatin1(setting.substr(0, pos)), |
609 blink::WebString::fromLatin1( | 609 blink::WebString::fromLatin1( |
610 pos == std::string::npos ? "" : setting.substr(pos + 1))); | 610 pos == std::string::npos ? "" : setting.substr(pos + 1))); |
611 } | 611 } |
612 } | 612 } |
613 | 613 |
| 614 // Looks up and returns the WebFrame corresponding to a given opener frame |
| 615 // routing ID. Also stores the opener's RenderView routing ID into |
| 616 // |opener_view_routing_id|. |
| 617 WebFrame* ResolveOpener(int opener_frame_routing_id, |
| 618 int* opener_view_routing_id) { |
| 619 *opener_view_routing_id = MSG_ROUTING_NONE; |
| 620 if (opener_frame_routing_id == MSG_ROUTING_NONE) |
| 621 return nullptr; |
| 622 |
| 623 // Opener routing ID could refer to either a RenderFrameProxy or a |
| 624 // RenderFrame, so need to check both. |
| 625 RenderFrameProxy* opener_proxy = |
| 626 RenderFrameProxy::FromRoutingID(opener_frame_routing_id); |
| 627 if (opener_proxy) { |
| 628 *opener_view_routing_id = opener_proxy->render_view()->GetRoutingID(); |
| 629 |
| 630 // TODO(nasko,alexmos): This check won't be needed once swapped-out:// is |
| 631 // gone. |
| 632 if (opener_proxy->IsMainFrameDetachedFromTree()) { |
| 633 DCHECK(!RenderFrameProxy::IsSwappedOutStateForbidden()); |
| 634 return opener_proxy->render_view()->webview()->mainFrame(); |
| 635 } else { |
| 636 return opener_proxy->web_frame(); |
| 637 } |
| 638 } |
| 639 |
| 640 RenderFrameImpl* opener_frame = |
| 641 RenderFrameImpl::FromRoutingID(opener_frame_routing_id); |
| 642 if (opener_frame) { |
| 643 *opener_view_routing_id = opener_frame->render_view()->GetRoutingID(); |
| 644 return opener_frame->GetWebFrame(); |
| 645 } |
| 646 |
| 647 return nullptr; |
| 648 } |
| 649 |
614 } // namespace | 650 } // namespace |
615 | 651 |
616 RenderViewImpl::RenderViewImpl(const ViewMsg_New_Params& params) | 652 RenderViewImpl::RenderViewImpl(const ViewMsg_New_Params& params) |
617 : RenderWidget(blink::WebPopupTypeNone, | 653 : RenderWidget(blink::WebPopupTypeNone, |
618 params.initial_size.screen_info, | 654 params.initial_size.screen_info, |
619 params.swapped_out, | 655 params.swapped_out, |
620 params.hidden, | 656 params.hidden, |
621 params.never_visible), | 657 params.never_visible), |
622 webkit_preferences_(params.web_preferences), | 658 webkit_preferences_(params.web_preferences), |
623 send_content_state_immediately_(false), | 659 send_content_state_immediately_(false), |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 enumeration_completion_id_(0), | 691 enumeration_completion_id_(0), |
656 session_storage_namespace_id_(params.session_storage_namespace_id), | 692 session_storage_namespace_id_(params.session_storage_namespace_id), |
657 page_scale_factor_is_one_(true) { | 693 page_scale_factor_is_one_(true) { |
658 } | 694 } |
659 | 695 |
660 void RenderViewImpl::Initialize(const ViewMsg_New_Params& params, | 696 void RenderViewImpl::Initialize(const ViewMsg_New_Params& params, |
661 CompositorDependencies* compositor_deps, | 697 CompositorDependencies* compositor_deps, |
662 bool was_created_by_renderer) { | 698 bool was_created_by_renderer) { |
663 routing_id_ = params.view_id; | 699 routing_id_ = params.view_id; |
664 surface_id_ = params.surface_id; | 700 surface_id_ = params.surface_id; |
665 if (params.opener_route_id != MSG_ROUTING_NONE && was_created_by_renderer) | 701 |
666 opener_id_ = params.opener_route_id; | 702 int opener_view_routing_id; |
| 703 WebFrame* opener_frame = |
| 704 ResolveOpener(params.opener_frame_route_id, &opener_view_routing_id); |
| 705 if (opener_view_routing_id != MSG_ROUTING_NONE && was_created_by_renderer) |
| 706 opener_id_ = opener_view_routing_id; |
| 707 |
667 display_mode_= params.initial_size.display_mode; | 708 display_mode_= params.initial_size.display_mode; |
668 | 709 |
669 // Ensure we start with a valid next_page_id_ from the browser. | 710 // Ensure we start with a valid next_page_id_ from the browser. |
670 DCHECK_GE(next_page_id_, 0); | 711 DCHECK_GE(next_page_id_, 0); |
671 | 712 |
672 if (params.main_frame_routing_id != MSG_ROUTING_NONE) { | 713 if (params.main_frame_routing_id != MSG_ROUTING_NONE) { |
673 main_render_frame_ = RenderFrameImpl::Create( | 714 main_render_frame_ = RenderFrameImpl::Create( |
674 this, params.main_frame_routing_id); | 715 this, params.main_frame_routing_id); |
675 // The main frame WebLocalFrame object is closed by | 716 // The main frame WebLocalFrame object is closed by |
676 // RenderFrameImpl::frameDetached(). | 717 // RenderFrameImpl::frameDetached(). |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 | 852 |
812 new IdleUserDetector(this); | 853 new IdleUserDetector(this); |
813 | 854 |
814 if (command_line.HasSwitch(switches::kDomAutomationController)) | 855 if (command_line.HasSwitch(switches::kDomAutomationController)) |
815 enabled_bindings_ |= BINDINGS_POLICY_DOM_AUTOMATION; | 856 enabled_bindings_ |= BINDINGS_POLICY_DOM_AUTOMATION; |
816 if (command_line.HasSwitch(switches::kStatsCollectionController)) | 857 if (command_line.HasSwitch(switches::kStatsCollectionController)) |
817 enabled_bindings_ |= BINDINGS_POLICY_STATS_COLLECTION; | 858 enabled_bindings_ |= BINDINGS_POLICY_STATS_COLLECTION; |
818 | 859 |
819 GetContentClient()->renderer()->RenderViewCreated(this); | 860 GetContentClient()->renderer()->RenderViewCreated(this); |
820 | 861 |
821 // If we have an opener_id but we weren't created by a renderer, then | 862 // If we have an opener_frame but we weren't created by a renderer, then it's |
822 // it's the browser asking us to set our opener to another RenderView. | 863 // the browser asking us to set our opener to another frame. |
823 if (params.opener_route_id != MSG_ROUTING_NONE && !was_created_by_renderer) { | 864 if (opener_frame && !was_created_by_renderer) |
824 RenderViewImpl* opener_view = FromRoutingID(params.opener_route_id); | 865 webview()->mainFrame()->setOpener(opener_frame); |
825 if (opener_view) | |
826 webview()->mainFrame()->setOpener(opener_view->webview()->mainFrame()); | |
827 } | |
828 | 866 |
829 // If we are initially swapped out, navigate to kSwappedOutURL. | 867 // If we are initially swapped out, navigate to kSwappedOutURL. |
830 // This ensures we are in a unique origin that others cannot script. | 868 // This ensures we are in a unique origin that others cannot script. |
831 if (is_swapped_out_ && webview()->mainFrame()->isWebLocalFrame()) | 869 if (is_swapped_out_ && webview()->mainFrame()->isWebLocalFrame()) |
832 main_render_frame_->NavigateToSwappedOutURL(); | 870 main_render_frame_->NavigateToSwappedOutURL(); |
833 } | 871 } |
834 | 872 |
835 RenderViewImpl::~RenderViewImpl() { | 873 RenderViewImpl::~RenderViewImpl() { |
836 for (BitmapMap::iterator it = disambiguation_bitmaps_.begin(); | 874 for (BitmapMap::iterator it = disambiguation_bitmaps_.begin(); |
837 it != disambiguation_bitmaps_.end(); | 875 it != disambiguation_bitmaps_.end(); |
(...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1603 | 1641 |
1604 ViewMsg_Resize_Params initial_size = ViewMsg_Resize_Params(); | 1642 ViewMsg_Resize_Params initial_size = ViewMsg_Resize_Params(); |
1605 initial_size.screen_info = screen_info_; | 1643 initial_size.screen_info = screen_info_; |
1606 | 1644 |
1607 // The initial hidden state for the RenderViewImpl here has to match what the | 1645 // The initial hidden state for the RenderViewImpl here has to match what the |
1608 // browser will eventually decide for the given disposition. Since we have to | 1646 // browser will eventually decide for the given disposition. Since we have to |
1609 // return from this call synchronously, we just have to make our best guess | 1647 // return from this call synchronously, we just have to make our best guess |
1610 // and rely on the browser sending a WasHidden / WasShown message if it | 1648 // and rely on the browser sending a WasHidden / WasShown message if it |
1611 // disagrees. | 1649 // disagrees. |
1612 ViewMsg_New_Params view_params; | 1650 ViewMsg_New_Params view_params; |
1613 view_params.opener_route_id = routing_id_; | 1651 |
| 1652 RenderFrameImpl* creator_frame = RenderFrameImpl::FromWebFrame(creator); |
| 1653 view_params.opener_frame_route_id = creator_frame->GetRoutingID(); |
| 1654 DCHECK_EQ(routing_id_, creator_frame->render_view()->GetRoutingID()); |
| 1655 |
1614 view_params.window_was_created_with_opener = true; | 1656 view_params.window_was_created_with_opener = true; |
1615 view_params.renderer_preferences = renderer_preferences_; | 1657 view_params.renderer_preferences = renderer_preferences_; |
1616 view_params.web_preferences = webkit_preferences_; | 1658 view_params.web_preferences = webkit_preferences_; |
1617 view_params.view_id = routing_id; | 1659 view_params.view_id = routing_id; |
1618 view_params.main_frame_routing_id = main_frame_routing_id; | 1660 view_params.main_frame_routing_id = main_frame_routing_id; |
1619 view_params.surface_id = surface_id; | 1661 view_params.surface_id = surface_id; |
1620 view_params.session_storage_namespace_id = | 1662 view_params.session_storage_namespace_id = |
1621 cloned_session_storage_namespace_id; | 1663 cloned_session_storage_namespace_id; |
1622 view_params.swapped_out = false; | 1664 view_params.swapped_out = false; |
1623 // WebCore will take care of setting the correct name. | 1665 // WebCore will take care of setting the correct name. |
(...skipping 2172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3796 std::vector<gfx::Size> sizes; | 3838 std::vector<gfx::Size> sizes; |
3797 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes); | 3839 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes); |
3798 if (!url.isEmpty()) | 3840 if (!url.isEmpty()) |
3799 urls.push_back( | 3841 urls.push_back( |
3800 FaviconURL(url, ToFaviconType(icon_urls[i].iconType()), sizes)); | 3842 FaviconURL(url, ToFaviconType(icon_urls[i].iconType()), sizes)); |
3801 } | 3843 } |
3802 SendUpdateFaviconURL(urls); | 3844 SendUpdateFaviconURL(urls); |
3803 } | 3845 } |
3804 | 3846 |
3805 } // namespace content | 3847 } // namespace content |
OLD | NEW |