Chromium Code Reviews| 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/browser/web_contents/web_contents_impl.h" | 5 #include "content/browser/web_contents/web_contents_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 4067 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4078 void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) { | 4078 void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) { |
| 4079 // Tell the active RenderViewHost to run unload handlers and close, as long | 4079 // Tell the active RenderViewHost to run unload handlers and close, as long |
| 4080 // as the request came from a RenderViewHost in the same BrowsingInstance. | 4080 // as the request came from a RenderViewHost in the same BrowsingInstance. |
| 4081 // In most cases, we receive this from a swapped out RenderViewHost. | 4081 // In most cases, we receive this from a swapped out RenderViewHost. |
| 4082 // It is possible to receive it from one that has just been swapped in, | 4082 // It is possible to receive it from one that has just been swapped in, |
| 4083 // in which case we might as well deliver the message anyway. | 4083 // in which case we might as well deliver the message anyway. |
| 4084 if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) | 4084 if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) |
| 4085 GetRenderViewHost()->ClosePage(); | 4085 GetRenderViewHost()->ClosePage(); |
| 4086 } | 4086 } |
| 4087 | 4087 |
| 4088 void WebContentsImpl::RouteMessageEvent( | 4088 bool WebContentsImpl::ShouldRouteMessageEvent( |
| 4089 RenderViewHost* rvh, | 4089 RenderFrameHost* target_rfh, |
| 4090 const ViewMsg_PostMessage_Params& params) { | 4090 SiteInstance* source_site_instance) const { |
| 4091 // Only deliver the message to the active RenderViewHost if the request | 4091 // Only deliver the message if the request came from a RenderFrameHost in the |
| 4092 // came from a RenderViewHost in the same BrowsingInstance or if this | 4092 // same BrowsingInstance or if this WebContents is dedicated to a browser |
| 4093 // WebContents is dedicated to a browser plugin guest. | 4093 // plugin guest. |
| 4094 // Note: This check means that an embedder could theoretically receive a | 4094 // Note: This check means that an embedder could theoretically receive a |
| 4095 // postMessage from anyone (not just its own guests). However, this is | 4095 // postMessage from anyone (not just its own guests). However, this is |
| 4096 // probably not a risk for apps since other pages won't have references | 4096 // probably not a risk for apps since other pages won't have references to |
| 4097 // to App windows. | 4097 // App windows. |
| 4098 if (!rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance()) && | 4098 SiteInstance* target_site_instance = target_rfh->GetSiteInstance(); |
| 4099 !GetBrowserPluginGuest() && !GetBrowserPluginEmbedder()) | 4099 return target_site_instance->IsRelatedSiteInstance(source_site_instance) || |
| 4100 return; | 4100 GetBrowserPluginGuest() || GetBrowserPluginEmbedder(); |
|
alexmos
2015/04/02 23:17:00
I really wanted to do the related SiteInstance che
Charlie Reis
2015/04/06 16:18:55
Actually, I think it would be better to move the r
| |
| 4101 } | |
| 4101 | 4102 |
| 4102 ViewMsg_PostMessage_Params new_params(params); | 4103 int WebContentsImpl::EnsureOpenerRenderViewsExist( |
| 4104 RenderFrameHost* render_frame_host) { | |
| 4105 WebContentsImpl* web_contents = NULL; | |
| 4106 if (render_frame_host) { | |
| 4107 web_contents = static_cast<WebContentsImpl*>( | |
| 4108 static_cast<RenderFrameHostImpl*>(render_frame_host) | |
| 4109 ->delegate() | |
| 4110 ->GetAsWebContents()); | |
| 4111 } | |
| 4103 | 4112 |
| 4104 // If there is a source_routing_id, translate it to the routing ID for | 4113 if (web_contents) { |
| 4105 // the equivalent swapped out RVH in the target process. If we need | 4114 if (GetBrowserPluginGuest()) { |
| 4106 // to create a swapped out RVH for the source tab, we create its opener | 4115 // We create a swapped out RenderView for the embedder in the guest's |
| 4107 // chain as well, since those will also be accessible to the target page. | 4116 // render process but we intentionally do not expose the embedder's |
| 4108 if (new_params.source_routing_id != MSG_ROUTING_NONE) { | 4117 // opener chain to it. |
| 4109 // Try to look up the WebContents for the source page. | 4118 return web_contents->CreateSwappedOutRenderView(GetSiteInstance()); |
| 4110 WebContentsImpl* source_contents = NULL; | |
| 4111 RenderViewHostImpl* source_rvh = RenderViewHostImpl::FromID( | |
| 4112 rvh->GetProcess()->GetID(), params.source_routing_id); | |
| 4113 if (source_rvh) { | |
| 4114 source_contents = static_cast<WebContentsImpl*>( | |
| 4115 source_rvh->GetDelegate()->GetAsWebContents()); | |
| 4116 } | |
| 4117 | |
| 4118 if (source_contents) { | |
| 4119 if (GetBrowserPluginGuest()) { | |
| 4120 // We create a swapped out RenderView for the embedder in the guest's | |
| 4121 // render process but we intentionally do not expose the embedder's | |
| 4122 // opener chain to it. | |
| 4123 new_params.source_routing_id = | |
| 4124 source_contents->CreateSwappedOutRenderView(GetSiteInstance()); | |
| 4125 } else { | |
| 4126 new_params.source_routing_id = | |
| 4127 source_contents->CreateOpenerRenderViews(GetSiteInstance()); | |
| 4128 } | |
| 4129 } else { | 4119 } else { |
| 4130 // We couldn't find it, so don't pass a source frame. | 4120 return web_contents->CreateOpenerRenderViews(GetSiteInstance()); |
| 4131 new_params.source_routing_id = MSG_ROUTING_NONE; | |
| 4132 } | 4121 } |
| 4133 } | 4122 } |
| 4134 | 4123 |
| 4135 // In most cases, we receive this from a swapped out RenderViewHost. | 4124 return MSG_ROUTING_NONE; |
| 4136 // It is possible to receive it from one that has just been swapped in, | |
| 4137 // in which case we might as well deliver the message anyway. | |
| 4138 if (!params.message_ports.empty()) { | |
| 4139 // Updating the message port information has to be done in the IO thread; | |
| 4140 // MessagePortMessageFilter::RouteMessageEventWithMessagePorts will send | |
| 4141 // ViewMsg_PostMessageEvent after it's done. Note that a trivial solution | |
| 4142 // would've been to post a task on the IO thread to do the IO-thread-bound | |
| 4143 // work, and make that post a task back to WebContentsImpl in the UI | |
| 4144 // thread. But we cannot do that, since there's nothing to guarantee that | |
| 4145 // WebContentsImpl stays alive during the round trip. | |
| 4146 scoped_refptr<MessagePortMessageFilter> message_port_message_filter( | |
| 4147 static_cast<RenderProcessHostImpl*>(GetRenderProcessHost()) | |
| 4148 ->message_port_message_filter()); | |
| 4149 BrowserThread::PostTask( | |
| 4150 BrowserThread::IO, FROM_HERE, | |
| 4151 base::Bind(&MessagePortMessageFilter::RouteMessageEventWithMessagePorts, | |
| 4152 message_port_message_filter, GetRoutingID(), new_params)); | |
| 4153 } else { | |
| 4154 Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params)); | |
| 4155 } | |
| 4156 } | 4125 } |
| 4157 | 4126 |
| 4158 bool WebContentsImpl::AddMessageToConsole(int32 level, | 4127 bool WebContentsImpl::AddMessageToConsole(int32 level, |
| 4159 const base::string16& message, | 4128 const base::string16& message, |
| 4160 int32 line_no, | 4129 int32 line_no, |
| 4161 const base::string16& source_id) { | 4130 const base::string16& source_id) { |
| 4162 if (!delegate_) | 4131 if (!delegate_) |
| 4163 return false; | 4132 return false; |
| 4164 return delegate_->AddMessageToConsole(this, level, message, line_no, | 4133 return delegate_->AddMessageToConsole(this, level, message, line_no, |
| 4165 source_id); | 4134 source_id); |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4648 node->render_manager()->ResumeResponseDeferredAtStart(); | 4617 node->render_manager()->ResumeResponseDeferredAtStart(); |
| 4649 } | 4618 } |
| 4650 | 4619 |
| 4651 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { | 4620 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { |
| 4652 force_disable_overscroll_content_ = force_disable; | 4621 force_disable_overscroll_content_ = force_disable; |
| 4653 if (view_) | 4622 if (view_) |
| 4654 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); | 4623 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); |
| 4655 } | 4624 } |
| 4656 | 4625 |
| 4657 } // namespace content | 4626 } // namespace content |
| OLD | NEW |