OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_frame_impl.h" | 5 #include "content/renderer/render_frame_impl.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 985 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
996 // The remote frame could've been detached while the remote-to-local | 996 // The remote frame could've been detached while the remote-to-local |
997 // navigation was being initiated in the browser process. Drop the | 997 // navigation was being initiated in the browser process. Drop the |
998 // navigation and don't create the frame in that case. See | 998 // navigation and don't create the frame in that case. See |
999 // https://crbug.com/526304. | 999 // https://crbug.com/526304. |
1000 if (!proxy) | 1000 if (!proxy) |
1001 return; | 1001 return; |
1002 | 1002 |
1003 render_frame = RenderFrameImpl::Create(proxy->render_view(), routing_id); | 1003 render_frame = RenderFrameImpl::Create(proxy->render_view(), routing_id); |
1004 render_frame->InitializeBlameContext(nullptr); | 1004 render_frame->InitializeBlameContext(nullptr); |
1005 render_frame->proxy_routing_id_ = proxy_routing_id; | 1005 render_frame->proxy_routing_id_ = proxy_routing_id; |
| 1006 proxy->set_provisional_frame_routing_id(routing_id); |
1006 web_frame = blink::WebLocalFrame::createProvisional( | 1007 web_frame = blink::WebLocalFrame::createProvisional( |
1007 render_frame, proxy->web_frame(), replicated_state.sandbox_flags); | 1008 render_frame, proxy->web_frame(), replicated_state.sandbox_flags); |
1008 } | 1009 } |
1009 render_frame->BindToWebFrame(web_frame); | 1010 render_frame->BindToWebFrame(web_frame); |
1010 CHECK(parent_routing_id != MSG_ROUTING_NONE || !web_frame->parent()); | 1011 CHECK(parent_routing_id != MSG_ROUTING_NONE || !web_frame->parent()); |
1011 | 1012 |
1012 if (widget_params.routing_id != MSG_ROUTING_NONE) { | 1013 if (widget_params.routing_id != MSG_ROUTING_NONE) { |
1013 CHECK(!web_frame->parent() || | 1014 CHECK(!web_frame->parent() || |
1014 SiteIsolationPolicy::AreCrossProcessFramesPossible()); | 1015 SiteIsolationPolicy::AreCrossProcessFramesPossible()); |
1015 render_frame->render_widget_ = RenderWidget::CreateForFrame( | 1016 render_frame->render_widget_ = RenderWidget::CreateForFrame( |
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1602 void RenderFrameImpl::OnAssociatedInterfaceRequest( | 1603 void RenderFrameImpl::OnAssociatedInterfaceRequest( |
1603 const std::string& interface_name, | 1604 const std::string& interface_name, |
1604 mojo::ScopedInterfaceEndpointHandle handle) { | 1605 mojo::ScopedInterfaceEndpointHandle handle) { |
1605 associated_interfaces_.BindRequest(interface_name, std::move(handle)); | 1606 associated_interfaces_.BindRequest(interface_name, std::move(handle)); |
1606 } | 1607 } |
1607 | 1608 |
1608 void RenderFrameImpl::OnNavigate( | 1609 void RenderFrameImpl::OnNavigate( |
1609 const CommonNavigationParams& common_params, | 1610 const CommonNavigationParams& common_params, |
1610 const StartNavigationParams& start_params, | 1611 const StartNavigationParams& start_params, |
1611 const RequestNavigationParams& request_params) { | 1612 const RequestNavigationParams& request_params) { |
1612 // If this RenderFrame is going to replace a RenderFrameProxy, it is possible | |
1613 // that the proxy was detached before this navigation request was received. | |
1614 // In that case, abort the navigation. See https://crbug.com/526304 and | |
1615 // https://crbug.com/568676. | |
1616 // TODO(nasko, alexmos): Eventually, the browser process will send an IPC to | |
1617 // clean this frame up after https://crbug.com/548275 is fixed. | |
1618 if (proxy_routing_id_ != MSG_ROUTING_NONE) { | |
1619 RenderFrameProxy* proxy = | |
1620 RenderFrameProxy::FromRoutingID(proxy_routing_id_); | |
1621 if (!proxy) | |
1622 return; | |
1623 } | |
1624 | |
1625 RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); | 1613 RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); |
1626 // Can be NULL in tests. | 1614 // Can be NULL in tests. |
1627 if (render_thread_impl) | 1615 if (render_thread_impl) |
1628 render_thread_impl->GetRendererScheduler()->OnNavigationStarted(); | 1616 render_thread_impl->GetRendererScheduler()->OnNavigationStarted(); |
1629 DCHECK(!IsBrowserSideNavigationEnabled()); | 1617 DCHECK(!IsBrowserSideNavigationEnabled()); |
1630 TRACE_EVENT2("navigation,rail", "RenderFrameImpl::OnNavigate", "id", | 1618 TRACE_EVENT2("navigation,rail", "RenderFrameImpl::OnNavigate", "id", |
1631 routing_id_, "url", common_params.url.possibly_invalid_spec()); | 1619 routing_id_, "url", common_params.url.possibly_invalid_spec()); |
1632 NavigateInternal(common_params, start_params, request_params, | 1620 NavigateInternal(common_params, start_params, request_params, |
1633 std::unique_ptr<StreamOverrideParameters>()); | 1621 std::unique_ptr<StreamOverrideParameters>()); |
1634 } | 1622 } |
(...skipping 1498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3133 type == DetachType::Remove) { | 3121 type == DetachType::Remove) { |
3134 frame->parent()->removeChild(frame); | 3122 frame->parent()->removeChild(frame); |
3135 } | 3123 } |
3136 | 3124 |
3137 // |frame| is invalid after here. Be sure to clear frame_ as well, since this | 3125 // |frame| is invalid after here. Be sure to clear frame_ as well, since this |
3138 // object may not be deleted immediately and other methods may try to access | 3126 // object may not be deleted immediately and other methods may try to access |
3139 // it. | 3127 // it. |
3140 frame->close(); | 3128 frame->close(); |
3141 frame_ = nullptr; | 3129 frame_ = nullptr; |
3142 | 3130 |
| 3131 // If this was a provisional frame with an associated proxy, tell the proxy |
| 3132 // that it's no longer associated with this frame. |
| 3133 if (proxy_routing_id_ != MSG_ROUTING_NONE) { |
| 3134 RenderFrameProxy* proxy = |
| 3135 RenderFrameProxy::FromRoutingID(proxy_routing_id_); |
| 3136 |
| 3137 // |proxy| should always exist. Detaching the proxy would've also detached |
| 3138 // this provisional frame. The proxy should also not be associated with |
| 3139 // another provisional frame at this point. |
| 3140 CHECK(proxy); |
| 3141 CHECK_EQ(routing_id_, proxy->provisional_frame_routing_id()); |
| 3142 |
| 3143 proxy->set_provisional_frame_routing_id(MSG_ROUTING_NONE); |
| 3144 } |
| 3145 |
3143 delete this; | 3146 delete this; |
3144 // Object is invalid after this point. | 3147 // Object is invalid after this point. |
3145 } | 3148 } |
3146 | 3149 |
3147 void RenderFrameImpl::frameFocused() { | 3150 void RenderFrameImpl::frameFocused() { |
3148 Send(new FrameHostMsg_FrameFocused(routing_id_)); | 3151 Send(new FrameHostMsg_FrameFocused(routing_id_)); |
3149 } | 3152 } |
3150 | 3153 |
3151 void RenderFrameImpl::willCommitProvisionalLoad(blink::WebLocalFrame* frame) { | 3154 void RenderFrameImpl::willCommitProvisionalLoad(blink::WebLocalFrame* frame) { |
3152 DCHECK_EQ(frame_, frame); | 3155 DCHECK_EQ(frame_, frame); |
(...skipping 1899 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5052 Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); | 5055 Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); |
5053 | 5056 |
5054 // If we end up reusing this WebRequest (for example, due to a #ref click), | 5057 // If we end up reusing this WebRequest (for example, due to a #ref click), |
5055 // we don't want the transition type to persist. Just clear it. | 5058 // we don't want the transition type to persist. Just clear it. |
5056 navigation_state->set_transition_type(ui::PAGE_TRANSITION_LINK); | 5059 navigation_state->set_transition_type(ui::PAGE_TRANSITION_LINK); |
5057 } | 5060 } |
5058 | 5061 |
5059 bool RenderFrameImpl::SwapIn() { | 5062 bool RenderFrameImpl::SwapIn() { |
5060 CHECK_NE(proxy_routing_id_, MSG_ROUTING_NONE); | 5063 CHECK_NE(proxy_routing_id_, MSG_ROUTING_NONE); |
5061 CHECK(!in_frame_tree_); | 5064 CHECK(!in_frame_tree_); |
| 5065 |
| 5066 // The proxy should always exist. If it was detached while the provisional |
| 5067 // LocalFrame was being navigated, the provisional frame would've been |
| 5068 // cleaned up by RenderFrameProxy::frameDetached. See |
| 5069 // https://crbug.com/526304 and https://crbug.com/568676 for context. |
5062 RenderFrameProxy* proxy = RenderFrameProxy::FromRoutingID(proxy_routing_id_); | 5070 RenderFrameProxy* proxy = RenderFrameProxy::FromRoutingID(proxy_routing_id_); |
5063 | 5071 CHECK(proxy); |
5064 // The proxy might have been detached while the provisional LocalFrame was | |
5065 // being navigated. In that case, don't swap the frame back in the tree | |
5066 // and return early (to avoid sending confusing IPCs to the browser | |
5067 // process). See https://crbug.com/526304 and https://crbug.com/568676. | |
5068 if (!proxy) | |
5069 return false; | |
5070 | 5072 |
5071 int proxy_routing_id = proxy_routing_id_; | 5073 int proxy_routing_id = proxy_routing_id_; |
5072 if (!proxy->web_frame()->swap(frame_)) | 5074 if (!proxy->web_frame()->swap(frame_)) |
5073 return false; | 5075 return false; |
5074 | 5076 |
5075 proxy_routing_id_ = MSG_ROUTING_NONE; | 5077 proxy_routing_id_ = MSG_ROUTING_NONE; |
5076 in_frame_tree_ = true; | 5078 in_frame_tree_ = true; |
5077 | 5079 |
5078 // If this is the main frame going from a remote frame to a local frame, | 5080 // If this is the main frame going from a remote frame to a local frame, |
5079 // it needs to set RenderViewImpl's pointer for the main frame to itself | 5081 // it needs to set RenderViewImpl's pointer for the main frame to itself |
(...skipping 1794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6874 // event target. Potentially a Pepper plugin will receive the event. | 6876 // event target. Potentially a Pepper plugin will receive the event. |
6875 // In order to tell whether a plugin gets the last mouse event and which it | 6877 // In order to tell whether a plugin gets the last mouse event and which it |
6876 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets | 6878 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets |
6877 // the event, it will notify us via DidReceiveMouseEvent() and set itself as | 6879 // the event, it will notify us via DidReceiveMouseEvent() and set itself as |
6878 // |pepper_last_mouse_event_target_|. | 6880 // |pepper_last_mouse_event_target_|. |
6879 pepper_last_mouse_event_target_ = nullptr; | 6881 pepper_last_mouse_event_target_ = nullptr; |
6880 #endif | 6882 #endif |
6881 } | 6883 } |
6882 | 6884 |
6883 } // namespace content | 6885 } // namespace content |
OLD | NEW |