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/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 2984 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2995 // It is possible to receive it from one that has just been swapped in, | 2995 // It is possible to receive it from one that has just been swapped in, |
| 2996 // in which case we might as well deliver the message anyway. | 2996 // in which case we might as well deliver the message anyway. |
| 2997 if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) | 2997 if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) |
| 2998 GetRenderViewHost()->ClosePage(); | 2998 GetRenderViewHost()->ClosePage(); |
| 2999 } | 2999 } |
| 3000 | 3000 |
| 3001 void WebContentsImpl::RouteMessageEvent( | 3001 void WebContentsImpl::RouteMessageEvent( |
| 3002 RenderViewHost* rvh, | 3002 RenderViewHost* rvh, |
| 3003 const ViewMsg_PostMessage_Params& params) { | 3003 const ViewMsg_PostMessage_Params& params) { |
| 3004 // Only deliver the message to the active RenderViewHost if the request | 3004 // Only deliver the message to the active RenderViewHost if the request |
| 3005 // came from a RenderViewHost in the same BrowsingInstance. | 3005 // came from a RenderViewHost in the same BrowsingInstance or if this |
| 3006 if (!rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) | 3006 // WebContents is dedicated to a browser plugin guest. |
| 3007 // Note: This check means that an embedder could theoretically receive a | |
| 3008 // postMessage from anyone (not just its own guests). However, this is | |
| 3009 // probably not a risk for apps since other pages won't have references | |
| 3010 // to App windows. | |
| 3011 if (!rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance()) && | |
| 3012 !GetBrowserPluginGuest() && !GetBrowserPluginEmbedder()) | |
| 3007 return; | 3013 return; |
| 3008 | 3014 |
| 3009 ViewMsg_PostMessage_Params new_params(params); | 3015 ViewMsg_PostMessage_Params new_params(params); |
| 3010 | 3016 |
| 3011 // If the renderer has changed while the post message is being routed, | 3017 // If the renderer has changed while the post message is being routed, |
| 3012 // drop the message, as it will not be delivered to the right target. | 3018 // drop the message, as it will not be delivered to the right target. |
| 3013 // TODO(nasko): Check for process ID and target frame id mismatch, once | 3019 // TODO(nasko): Check for process ID and target frame id mismatch, once |
| 3014 // http://crbug.com/153701 is fixed. | 3020 // http://crbug.com/153701 is fixed. |
| 3015 | 3021 |
| 3016 // If there is a source_routing_id, translate it to the routing ID for | 3022 // If there is a source_routing_id, translate it to the routing ID for |
| 3017 // the equivalent swapped out RVH in the target process. If we need | 3023 // the equivalent swapped out RVH in the target process. If we need |
| 3018 // to create a swapped out RVH for the source tab, we create its opener | 3024 // to create a swapped out RVH for the source tab, we create its opener |
| 3019 // chain as well, since those will also be accessible to the target page. | 3025 // chain as well, since those will also be accessible to the target page. |
| 3020 if (new_params.source_routing_id != MSG_ROUTING_NONE) { | 3026 if (new_params.source_routing_id != MSG_ROUTING_NONE) { |
| 3021 // Try to look up the WebContents for the source page. | 3027 // Try to look up the WebContents for the source page. |
| 3022 WebContentsImpl* source_contents = NULL; | 3028 WebContentsImpl* source_contents = NULL; |
| 3023 RenderViewHostImpl* source_rvh = RenderViewHostImpl::FromID( | 3029 RenderViewHostImpl* source_rvh = RenderViewHostImpl::FromID( |
| 3024 rvh->GetProcess()->GetID(), params.source_routing_id); | 3030 rvh->GetProcess()->GetID(), params.source_routing_id); |
| 3025 if (source_rvh) { | 3031 if (source_rvh) { |
| 3026 source_contents = static_cast<WebContentsImpl*>( | 3032 source_contents = static_cast<WebContentsImpl*>( |
| 3027 source_rvh->GetDelegate()->GetAsWebContents()); | 3033 source_rvh->GetDelegate()->GetAsWebContents()); |
| 3028 } | 3034 } |
| 3029 | 3035 |
| 3030 if (source_contents) { | 3036 if (source_contents) { |
| 3031 new_params.source_routing_id = | 3037 // We create a swapped out RenderView for the embedder in the guest's |
| 3032 source_contents->CreateOpenerRenderViews(GetSiteInstance()); | 3038 // render process but we intentionally do not expose the embedder's |
| 3039 // opener chain to it. | |
|
Charlie Reis
2012/10/15 23:10:09
nit: Move this below the if statement (which will
Fady Samuel
2012/10/16 19:17:08
Done. Wow, I don't know what happened there. Dysle
| |
| 3040 if (GetBrowserPluginGuest()) { | |
| 3041 new_params.source_routing_id = | |
| 3042 source_contents->CreateSwappedOutRenderView(GetSiteInstance()); | |
| 3043 } else { | |
| 3044 new_params.source_routing_id = | |
| 3045 source_contents->CreateOpenerRenderViews(GetSiteInstance()); | |
| 3046 } | |
| 3033 } else { | 3047 } else { |
| 3034 // We couldn't find it, so don't pass a source frame. | 3048 // We couldn't find it, so don't pass a source frame. |
| 3035 new_params.source_routing_id = MSG_ROUTING_NONE; | 3049 new_params.source_routing_id = MSG_ROUTING_NONE; |
| 3036 } | 3050 } |
| 3037 } | 3051 } |
| 3038 | 3052 |
| 3039 // In most cases, we receive this from a swapped out RenderViewHost. | 3053 // In most cases, we receive this from a swapped out RenderViewHost. |
| 3040 // It is possible to receive it from one that has just been swapped in, | 3054 // It is possible to receive it from one that has just been swapped in, |
| 3041 // in which case we might as well deliver the message anyway. | 3055 // in which case we might as well deliver the message anyway. |
| 3042 Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params)); | 3056 Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params)); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3125 } | 3139 } |
| 3126 | 3140 |
| 3127 WebPreferences WebContentsImpl::GetWebkitPrefs() { | 3141 WebPreferences WebContentsImpl::GetWebkitPrefs() { |
| 3128 // We want to base the page config off of the real URL, rather than the | 3142 // We want to base the page config off of the real URL, rather than the |
| 3129 // display URL. | 3143 // display URL. |
| 3130 GURL url = controller_.GetActiveEntry() | 3144 GURL url = controller_.GetActiveEntry() |
| 3131 ? controller_.GetActiveEntry()->GetURL() : GURL::EmptyGURL(); | 3145 ? controller_.GetActiveEntry()->GetURL() : GURL::EmptyGURL(); |
| 3132 return GetWebkitPrefs(GetRenderViewHost(), url); | 3146 return GetWebkitPrefs(GetRenderViewHost(), url); |
| 3133 } | 3147 } |
| 3134 | 3148 |
| 3149 int WebContentsImpl::CreateSwappedOutRenderView( | |
| 3150 content::SiteInstance* instance) { | |
| 3151 return render_manager_.CreateRenderView(instance, MSG_ROUTING_NONE, true); | |
| 3152 } | |
| 3153 | |
| 3135 void WebContentsImpl::OnUserGesture() { | 3154 void WebContentsImpl::OnUserGesture() { |
| 3136 // Notify observers. | 3155 // Notify observers. |
| 3137 FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserGesture()); | 3156 FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserGesture()); |
| 3138 | 3157 |
| 3139 ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); | 3158 ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); |
| 3140 if (rdh) // NULL in unittests. | 3159 if (rdh) // NULL in unittests. |
| 3141 rdh->OnUserGesture(this); | 3160 rdh->OnUserGesture(this); |
| 3142 } | 3161 } |
| 3143 | 3162 |
| 3144 void WebContentsImpl::OnIgnoredUIEvent() { | 3163 void WebContentsImpl::OnIgnoredUIEvent() { |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3404 } | 3423 } |
| 3405 } | 3424 } |
| 3406 | 3425 |
| 3407 content::BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() { | 3426 content::BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() { |
| 3408 return browser_plugin_guest_.get(); | 3427 return browser_plugin_guest_.get(); |
| 3409 } | 3428 } |
| 3410 | 3429 |
| 3411 content::BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() { | 3430 content::BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() { |
| 3412 return browser_plugin_embedder_.get(); | 3431 return browser_plugin_embedder_.get(); |
| 3413 } | 3432 } |
| OLD | NEW |