Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(276)

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 358973005: Navigation transitions: Pass is_transition_navigation flag up to the embedder (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Test fix Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_view_browsertest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 1699 matching lines...) Expand 10 before | Expand all | Expand 10 after
1710 } else if (policy == blink::WebNavigationPolicyDownloadTo) { 1710 } else if (policy == blink::WebNavigationPolicyDownloadTo) {
1711 render_view_->Send(new ViewHostMsg_DownloadUrl(render_view_->GetRoutingID(), 1711 render_view_->Send(new ViewHostMsg_DownloadUrl(render_view_->GetRoutingID(),
1712 request.url(), referrer, 1712 request.url(), referrer,
1713 suggested_name, true)); 1713 suggested_name, true));
1714 } else { 1714 } else {
1715 OpenURL(frame, request.url(), referrer, policy); 1715 OpenURL(frame, request.url(), referrer, policy);
1716 } 1716 }
1717 } 1717 }
1718 1718
1719 blink::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( 1719 blink::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation(
1720 blink::WebLocalFrame* frame, 1720 const NavigationPolicyInfo& info) {
1721 blink::WebDataSource::ExtraData* extra_data, 1721 DCHECK(!frame_ || frame_ == info.frame);
1722 const blink::WebURLRequest& request, 1722 return DecidePolicyForNavigation(this, info);
1723 blink::WebNavigationType type,
1724 blink::WebNavigationPolicy default_policy,
1725 bool is_redirect) {
1726 DCHECK(!frame_ || frame_ == frame);
1727 return DecidePolicyForNavigation(
1728 this, frame, extra_data, request, type, default_policy, is_redirect);
1729 } 1723 }
1730 1724
1731 blink::WebHistoryItem RenderFrameImpl::historyItemForNewChildFrame( 1725 blink::WebHistoryItem RenderFrameImpl::historyItemForNewChildFrame(
1732 blink::WebFrame* frame) { 1726 blink::WebFrame* frame) {
1733 DCHECK(!frame_ || frame_ == frame); 1727 DCHECK(!frame_ || frame_ == frame);
1734 return render_view_->history_controller()->GetItemForNewChildFrame(this); 1728 return render_view_->history_controller()->GetItemForNewChildFrame(this);
1735 } 1729 }
1736 1730
1737 void RenderFrameImpl::willSendSubmitEvent(blink::WebLocalFrame* frame, 1731 void RenderFrameImpl::willSendSubmitEvent(blink::WebLocalFrame* frame,
1738 const blink::WebFormElement& form) { 1732 const blink::WebFormElement& form) {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1779 render_view_->didCreateDataSource(frame, datasource); 1773 render_view_->didCreateDataSource(frame, datasource);
1780 1774
1781 // Create the serviceworker's per-document network observing object. 1775 // Create the serviceworker's per-document network observing object.
1782 scoped_ptr<ServiceWorkerNetworkProvider> 1776 scoped_ptr<ServiceWorkerNetworkProvider>
1783 network_provider(new ServiceWorkerNetworkProvider()); 1777 network_provider(new ServiceWorkerNetworkProvider());
1784 ServiceWorkerNetworkProvider::AttachToDocumentState( 1778 ServiceWorkerNetworkProvider::AttachToDocumentState(
1785 DocumentState::FromDataSource(datasource), 1779 DocumentState::FromDataSource(datasource),
1786 network_provider.Pass()); 1780 network_provider.Pass());
1787 } 1781 }
1788 1782
1789 void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame) { 1783 void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame,
1784 bool is_transition_navigation) {
1790 DCHECK(!frame_ || frame_ == frame); 1785 DCHECK(!frame_ || frame_ == frame);
1791 WebDataSource* ds = frame->provisionalDataSource(); 1786 WebDataSource* ds = frame->provisionalDataSource();
1792 1787
1793 // In fast/loader/stop-provisional-loads.html, we abort the load before this 1788 // In fast/loader/stop-provisional-loads.html, we abort the load before this
1794 // callback is invoked. 1789 // callback is invoked.
1795 if (!ds) 1790 if (!ds)
1796 return; 1791 return;
1797 1792
1798 DocumentState* document_state = DocumentState::FromDataSource(ds); 1793 DocumentState* document_state = DocumentState::FromDataSource(ds);
1799 1794
(...skipping 23 matching lines...) Expand all
1823 // marked with AUTO_SUBFRAME. See also didFailProvisionalLoad for how we 1818 // marked with AUTO_SUBFRAME. See also didFailProvisionalLoad for how we
1824 // handle loading of error pages. 1819 // handle loading of error pages.
1825 document_state->navigation_state()->set_transition_type( 1820 document_state->navigation_state()->set_transition_type(
1826 PAGE_TRANSITION_AUTO_SUBFRAME); 1821 PAGE_TRANSITION_AUTO_SUBFRAME);
1827 } 1822 }
1828 1823
1829 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 1824 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(),
1830 DidStartProvisionalLoad(frame)); 1825 DidStartProvisionalLoad(frame));
1831 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidStartProvisionalLoad()); 1826 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidStartProvisionalLoad());
1832 1827
1833 Send(new FrameHostMsg_DidStartProvisionalLoadForFrame(routing_id_, 1828 Send(new FrameHostMsg_DidStartProvisionalLoadForFrame(
1834 ds->request().url())); 1829 routing_id_, ds->request().url(), is_transition_navigation));
1835 } 1830 }
1836 1831
1837 void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad( 1832 void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad(
1838 blink::WebLocalFrame* frame) { 1833 blink::WebLocalFrame* frame) {
1839 DCHECK(!frame_ || frame_ == frame); 1834 DCHECK(!frame_ || frame_ == frame);
1840 render_view_->history_controller()->RemoveChildrenForRedirect(this); 1835 render_view_->history_controller()->RemoveChildrenForRedirect(this);
1841 if (frame->parent()) 1836 if (frame->parent())
1842 return; 1837 return;
1843 // Received a redirect on the main frame. 1838 // Received a redirect on the main frame.
1844 WebDataSource* data_source = frame->provisionalDataSource(); 1839 WebDataSource* data_source = frame->provisionalDataSource();
(...skipping 1343 matching lines...) Expand 10 before | Expand all | Expand 10 after
3188 renderer_accessibility_->HandleWebAccessibilityEvent(obj, event); 3183 renderer_accessibility_->HandleWebAccessibilityEvent(obj, event);
3189 } 3184 }
3190 3185
3191 void RenderFrameImpl::FocusedNodeChanged(const WebNode& node) { 3186 void RenderFrameImpl::FocusedNodeChanged(const WebNode& node) {
3192 if (renderer_accessibility_) 3187 if (renderer_accessibility_)
3193 renderer_accessibility_->FocusedNodeChanged(node); 3188 renderer_accessibility_->FocusedNodeChanged(node);
3194 } 3189 }
3195 3190
3196 WebNavigationPolicy RenderFrameImpl::DecidePolicyForNavigation( 3191 WebNavigationPolicy RenderFrameImpl::DecidePolicyForNavigation(
3197 RenderFrame* render_frame, 3192 RenderFrame* render_frame,
3198 WebFrame* frame, 3193 const NavigationPolicyInfo& info) {
3199 WebDataSource::ExtraData* extraData,
3200 const WebURLRequest& request,
3201 WebNavigationType type,
3202 WebNavigationPolicy default_policy,
3203 bool is_redirect) {
3204 #ifdef OS_ANDROID 3194 #ifdef OS_ANDROID
3205 // The handlenavigation API is deprecated and will be removed once 3195 // The handlenavigation API is deprecated and will be removed once
3206 // crbug.com/325351 is resolved. 3196 // crbug.com/325351 is resolved.
3207 if (request.url() != GURL(kSwappedOutURL) && 3197 if (info.urlRequest.url() != GURL(kSwappedOutURL) &&
3208 GetContentClient()->renderer()->HandleNavigation( 3198 GetContentClient()->renderer()->HandleNavigation(
3209 render_frame, 3199 render_frame,
3210 static_cast<DocumentState*>(extraData), 3200 static_cast<DocumentState*>(info.extraData),
3211 render_view_->opener_id_, 3201 render_view_->opener_id_,
3212 frame, 3202 info.frame,
3213 request, 3203 info.urlRequest,
3214 type, 3204 info.navigationType,
3215 default_policy, 3205 info.defaultPolicy,
3216 is_redirect)) { 3206 info.isRedirect)) {
3217 return blink::WebNavigationPolicyIgnore; 3207 return blink::WebNavigationPolicyIgnore;
3218 } 3208 }
3219 #endif 3209 #endif
3220 3210
3221 Referrer referrer(RenderViewImpl::GetReferrerFromRequest(frame, request)); 3211 Referrer referrer(RenderViewImpl::GetReferrerFromRequest(info.frame,
3212 info.urlRequest));
3222 3213
3223 if (is_swapped_out_ || render_view_->is_swapped_out()) { 3214 if (is_swapped_out_ || render_view_->is_swapped_out()) {
3224 if (request.url() != GURL(kSwappedOutURL)) { 3215 if (info.urlRequest.url() != GURL(kSwappedOutURL)) {
3225 // Targeted links may try to navigate a swapped out frame. Allow the 3216 // Targeted links may try to navigate a swapped out frame. Allow the
3226 // browser process to navigate the tab instead. Note that it is also 3217 // browser process to navigate the tab instead. Note that it is also
3227 // possible for non-targeted navigations (from this view) to arrive 3218 // possible for non-targeted navigations (from this view) to arrive
3228 // here just after we are swapped out. It's ok to send them to the 3219 // here just after we are swapped out. It's ok to send them to the
3229 // browser, as long as they're for the top level frame. 3220 // browser, as long as they're for the top level frame.
3230 // TODO(creis): Ensure this supports targeted form submissions when 3221 // TODO(creis): Ensure this supports targeted form submissions when
3231 // fixing http://crbug.com/101395. 3222 // fixing http://crbug.com/101395.
3232 if (frame->parent() == NULL) { 3223 if (info.frame->parent() == NULL) {
3233 OpenURL(frame, request.url(), referrer, default_policy); 3224 OpenURL(info.frame, info.urlRequest.url(), referrer,
3225 info.defaultPolicy);
3234 return blink::WebNavigationPolicyIgnore; // Suppress the load here. 3226 return blink::WebNavigationPolicyIgnore; // Suppress the load here.
3235 } 3227 }
3236 3228
3237 // We should otherwise ignore in-process iframe navigations, if they 3229 // We should otherwise ignore in-process iframe navigations, if they
3238 // arrive just after we are swapped out. 3230 // arrive just after we are swapped out.
3239 return blink::WebNavigationPolicyIgnore; 3231 return blink::WebNavigationPolicyIgnore;
3240 } 3232 }
3241 3233
3242 // Allow kSwappedOutURL to complete. 3234 // Allow kSwappedOutURL to complete.
3243 return default_policy; 3235 return info.defaultPolicy;
3244 } 3236 }
3245 3237
3246 // Webkit is asking whether to navigate to a new URL. 3238 // Webkit is asking whether to navigate to a new URL.
3247 // This is fine normally, except if we're showing UI from one security 3239 // This is fine normally, except if we're showing UI from one security
3248 // context and they're trying to navigate to a different context. 3240 // context and they're trying to navigate to a different context.
3249 const GURL& url = request.url(); 3241 const GURL& url = info.urlRequest.url();
3250 3242
3251 // A content initiated navigation may have originated from a link-click, 3243 // A content initiated navigation may have originated from a link-click,
3252 // script, drag-n-drop operation, etc. 3244 // script, drag-n-drop operation, etc.
3253 bool is_content_initiated = static_cast<DocumentState*>(extraData)-> 3245 bool is_content_initiated = static_cast<DocumentState*>(info.extraData)->
3254 navigation_state()->is_content_initiated(); 3246 navigation_state()->is_content_initiated();
3255 3247
3256 // Experimental: 3248 // Experimental:
3257 // If --enable-strict-site-isolation or --site-per-process is enabled, send 3249 // If --enable-strict-site-isolation or --site-per-process is enabled, send
3258 // all top-level navigations to the browser to let it swap processes when 3250 // all top-level navigations to the browser to let it swap processes when
3259 // crossing site boundaries. This is currently expected to break some script 3251 // crossing site boundaries. This is currently expected to break some script
3260 // calls and navigations, such as form submissions. 3252 // calls and navigations, such as form submissions.
3261 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 3253 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
3262 bool force_swap_due_to_flag = 3254 bool force_swap_due_to_flag =
3263 command_line.HasSwitch(switches::kEnableStrictSiteIsolation) || 3255 command_line.HasSwitch(switches::kEnableStrictSiteIsolation) ||
3264 command_line.HasSwitch(switches::kSitePerProcess); 3256 command_line.HasSwitch(switches::kSitePerProcess);
3265 if (force_swap_due_to_flag && 3257 if (force_swap_due_to_flag &&
3266 !frame->parent() && (is_content_initiated || is_redirect)) { 3258 !info.frame->parent() && (is_content_initiated || info.isRedirect)) {
3267 WebString origin_str = frame->document().securityOrigin().toString(); 3259 WebString origin_str = info.frame->document().securityOrigin().toString();
3268 GURL frame_url(origin_str.utf8().data()); 3260 GURL frame_url(origin_str.utf8().data());
3269 // TODO(cevans): revisit whether this site check is still necessary once 3261 // TODO(cevans): revisit whether this site check is still necessary once
3270 // crbug.com/101395 is fixed. 3262 // crbug.com/101395 is fixed.
3271 bool same_domain_or_host = 3263 bool same_domain_or_host =
3272 net::registry_controlled_domains::SameDomainOrHost( 3264 net::registry_controlled_domains::SameDomainOrHost(
3273 frame_url, 3265 frame_url,
3274 url, 3266 url,
3275 net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); 3267 net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
3276 if (!same_domain_or_host || frame_url.scheme() != url.scheme()) { 3268 if (!same_domain_or_host || frame_url.scheme() != url.scheme()) {
3277 OpenURL(frame, url, referrer, default_policy); 3269 OpenURL(info.frame, url, referrer, info.defaultPolicy);
3278 return blink::WebNavigationPolicyIgnore; 3270 return blink::WebNavigationPolicyIgnore;
3279 } 3271 }
3280 } 3272 }
3281 3273
3282 // If the browser is interested, then give it a chance to look at the request. 3274 // If the browser is interested, then give it a chance to look at the request.
3283 if (is_content_initiated) { 3275 if (is_content_initiated) {
3284 bool is_form_post = ((type == blink::WebNavigationTypeFormSubmitted) || 3276 bool is_form_post =
3285 (type == blink::WebNavigationTypeFormResubmitted)) && 3277 ((info.navigationType == blink::WebNavigationTypeFormSubmitted) ||
3286 EqualsASCII(request.httpMethod(), "POST"); 3278 (info.navigationType == blink::WebNavigationTypeFormResubmitted)) &&
3279 EqualsASCII(info.urlRequest.httpMethod(), "POST");
3287 bool browser_handles_request = 3280 bool browser_handles_request =
3288 render_view_->renderer_preferences_ 3281 render_view_->renderer_preferences_
3289 .browser_handles_non_local_top_level_requests 3282 .browser_handles_non_local_top_level_requests
3290 && IsNonLocalTopLevelNavigation(url, frame, type, is_form_post); 3283 && IsNonLocalTopLevelNavigation(url, info.frame, info.navigationType,
3284 is_form_post);
3291 if (!browser_handles_request) { 3285 if (!browser_handles_request) {
3292 browser_handles_request = IsTopLevelNavigation(frame) && 3286 browser_handles_request = IsTopLevelNavigation(info.frame) &&
3293 render_view_->renderer_preferences_ 3287 render_view_->renderer_preferences_
3294 .browser_handles_all_top_level_requests; 3288 .browser_handles_all_top_level_requests;
3295 } 3289 }
3296 3290
3297 if (browser_handles_request) { 3291 if (browser_handles_request) {
3298 // Reset these counters as the RenderView could be reused for the next 3292 // Reset these counters as the RenderView could be reused for the next
3299 // navigation. 3293 // navigation.
3300 render_view_->page_id_ = -1; 3294 render_view_->page_id_ = -1;
3301 render_view_->last_page_id_sent_to_browser_ = -1; 3295 render_view_->last_page_id_sent_to_browser_ = -1;
3302 OpenURL(frame, url, referrer, default_policy); 3296 OpenURL(info.frame, url, referrer, info.defaultPolicy);
3303 return blink::WebNavigationPolicyIgnore; // Suppress the load here. 3297 return blink::WebNavigationPolicyIgnore; // Suppress the load here.
3304 } 3298 }
3305 } 3299 }
3306 3300
3307 // Use the frame's original request's URL rather than the document's URL for 3301 // Use the frame's original request's URL rather than the document's URL for
3308 // subsequent checks. For a popup, the document's URL may become the opener 3302 // subsequent checks. For a popup, the document's URL may become the opener
3309 // window's URL if the opener has called document.write(). 3303 // window's URL if the opener has called document.write().
3310 // See http://crbug.com/93517. 3304 // See http://crbug.com/93517.
3311 GURL old_url(frame->dataSource()->request().url()); 3305 GURL old_url(info.frame->dataSource()->request().url());
3312 3306
3313 // Detect when we're crossing a permission-based boundary (e.g. into or out of 3307 // Detect when we're crossing a permission-based boundary (e.g. into or out of
3314 // an extension or app origin, leaving a WebUI page, etc). We only care about 3308 // an extension or app origin, leaving a WebUI page, etc). We only care about
3315 // top-level navigations (not iframes). But we sometimes navigate to 3309 // top-level navigations (not iframes). But we sometimes navigate to
3316 // about:blank to clear a tab, and we want to still allow that. 3310 // about:blank to clear a tab, and we want to still allow that.
3317 // 3311 //
3318 // Note: this is known to break POST submissions when crossing process 3312 // Note: this is known to break POST submissions when crossing process
3319 // boundaries until http://crbug.com/101395 is fixed. This is better for 3313 // boundaries until http://crbug.com/101395 is fixed. This is better for
3320 // security than loading a WebUI, extension or app page in the wrong process. 3314 // security than loading a WebUI, extension or app page in the wrong process.
3321 // POST requests don't work because this mechanism does not preserve form 3315 // POST requests don't work because this mechanism does not preserve form
3322 // POST data. We will need to send the request's httpBody data up to the 3316 // POST data. We will need to send the request's httpBody data up to the
3323 // browser process, and issue a special POST navigation in WebKit (via 3317 // browser process, and issue a special POST navigation in WebKit (via
3324 // FrameLoader::loadFrameRequest). See ResourceDispatcher and WebURLLoaderImpl 3318 // FrameLoader::loadFrameRequest). See ResourceDispatcher and WebURLLoaderImpl
3325 // for examples of how to send the httpBody data. 3319 // for examples of how to send the httpBody data.
3326 if (!frame->parent() && is_content_initiated && 3320 if (!info.frame->parent() && is_content_initiated &&
3327 !url.SchemeIs(url::kAboutScheme)) { 3321 !url.SchemeIs(url::kAboutScheme)) {
3328 bool send_referrer = false; 3322 bool send_referrer = false;
3329 3323
3330 // All navigations to or from WebUI URLs or within WebUI-enabled 3324 // All navigations to or from WebUI URLs or within WebUI-enabled
3331 // RenderProcesses must be handled by the browser process so that the 3325 // RenderProcesses must be handled by the browser process so that the
3332 // correct bindings and data sources can be registered. 3326 // correct bindings and data sources can be registered.
3333 // Similarly, navigations to view-source URLs or within ViewSource mode 3327 // Similarly, navigations to view-source URLs or within ViewSource mode
3334 // must be handled by the browser process (except for reloads - those are 3328 // must be handled by the browser process (except for reloads - those are
3335 // safe to leave within the renderer). 3329 // safe to leave within the renderer).
3336 // Lastly, access to file:// URLs from non-file:// URL pages must be 3330 // Lastly, access to file:// URLs from non-file:// URL pages must be
3337 // handled by the browser so that ordinary renderer processes don't get 3331 // handled by the browser so that ordinary renderer processes don't get
3338 // blessed with file permissions. 3332 // blessed with file permissions.
3339 int cumulative_bindings = RenderProcess::current()->GetEnabledBindings(); 3333 int cumulative_bindings = RenderProcess::current()->GetEnabledBindings();
3340 bool is_initial_navigation = render_view_->page_id_ == -1; 3334 bool is_initial_navigation = render_view_->page_id_ == -1;
3341 bool should_fork = HasWebUIScheme(url) || HasWebUIScheme(old_url) || 3335 bool should_fork = HasWebUIScheme(url) || HasWebUIScheme(old_url) ||
3342 (cumulative_bindings & BINDINGS_POLICY_WEB_UI) || 3336 (cumulative_bindings & BINDINGS_POLICY_WEB_UI) ||
3343 url.SchemeIs(kViewSourceScheme) || 3337 url.SchemeIs(kViewSourceScheme) ||
3344 (frame->isViewSourceModeEnabled() && 3338 (info.frame->isViewSourceModeEnabled() &&
3345 type != blink::WebNavigationTypeReload); 3339 info.navigationType != blink::WebNavigationTypeReload);
3346 3340
3347 if (!should_fork && url.SchemeIs(url::kFileScheme)) { 3341 if (!should_fork && url.SchemeIs(url::kFileScheme)) {
3348 // Fork non-file to file opens. Check the opener URL if this is the 3342 // Fork non-file to file opens. Check the opener URL if this is the
3349 // initial navigation in a newly opened window. 3343 // initial navigation in a newly opened window.
3350 GURL source_url(old_url); 3344 GURL source_url(old_url);
3351 if (is_initial_navigation && source_url.is_empty() && frame->opener()) 3345 if (is_initial_navigation && source_url.is_empty() &&
3352 source_url = frame->opener()->top()->document().url(); 3346 info.frame->opener())
3347 source_url = info.frame->opener()->top()->document().url();
3353 DCHECK(!source_url.is_empty()); 3348 DCHECK(!source_url.is_empty());
3354 should_fork = !source_url.SchemeIs(url::kFileScheme); 3349 should_fork = !source_url.SchemeIs(url::kFileScheme);
3355 } 3350 }
3356 3351
3357 if (!should_fork) { 3352 if (!should_fork) {
3358 // Give the embedder a chance. 3353 // Give the embedder a chance.
3359 should_fork = GetContentClient()->renderer()->ShouldFork( 3354 should_fork = GetContentClient()->renderer()->ShouldFork(
3360 frame, url, request.httpMethod().utf8(), is_initial_navigation, 3355 info.frame, url, info.urlRequest.httpMethod().utf8(),
3361 is_redirect, &send_referrer); 3356 is_initial_navigation, info.isRedirect, &send_referrer);
3362 } 3357 }
3363 3358
3364 if (should_fork) { 3359 if (should_fork) {
3365 OpenURL( 3360 OpenURL(info.frame, url, send_referrer ? referrer : Referrer(),
3366 frame, url, send_referrer ? referrer : Referrer(), default_policy); 3361 info.defaultPolicy);
3367 return blink::WebNavigationPolicyIgnore; // Suppress the load here. 3362 return blink::WebNavigationPolicyIgnore; // Suppress the load here.
3368 } 3363 }
3369 } 3364 }
3370 3365
3371 // Detect when a page is "forking" a new tab that can be safely rendered in 3366 // Detect when a page is "forking" a new tab that can be safely rendered in
3372 // its own process. This is done by sites like Gmail that try to open links 3367 // its own process. This is done by sites like Gmail that try to open links
3373 // in new windows without script connections back to the original page. We 3368 // in new windows without script connections back to the original page. We
3374 // treat such cases as browser navigations (in which we will create a new 3369 // treat such cases as browser navigations (in which we will create a new
3375 // renderer for a cross-site navigation), rather than WebKit navigations. 3370 // renderer for a cross-site navigation), rather than WebKit navigations.
3376 // 3371 //
3377 // We use the following heuristic to decide whether to fork a new page in its 3372 // We use the following heuristic to decide whether to fork a new page in its
3378 // own process: 3373 // own process:
3379 // The parent page must open a new tab to about:blank, set the new tab's 3374 // The parent page must open a new tab to about:blank, set the new tab's
3380 // window.opener to null, and then redirect the tab to a cross-site URL using 3375 // window.opener to null, and then redirect the tab to a cross-site URL using
3381 // JavaScript. 3376 // JavaScript.
3382 // 3377 //
3383 // TODO(creis): Deprecate this logic once we can rely on rel=noreferrer 3378 // TODO(creis): Deprecate this logic once we can rely on rel=noreferrer
3384 // (see below). 3379 // (see below).
3385 bool is_fork = 3380 bool is_fork =
3386 // Must start from a tab showing about:blank, which is later redirected. 3381 // Must start from a tab showing about:blank, which is later redirected.
3387 old_url == GURL(url::kAboutBlankURL) && 3382 old_url == GURL(url::kAboutBlankURL) &&
3388 // Must be the first real navigation of the tab. 3383 // Must be the first real navigation of the tab.
3389 render_view_->historyBackListCount() < 1 && 3384 render_view_->historyBackListCount() < 1 &&
3390 render_view_->historyForwardListCount() < 1 && 3385 render_view_->historyForwardListCount() < 1 &&
3391 // The parent page must have set the child's window.opener to null before 3386 // The parent page must have set the child's window.opener to null before
3392 // redirecting to the desired URL. 3387 // redirecting to the desired URL.
3393 frame->opener() == NULL && 3388 info.frame->opener() == NULL &&
3394 // Must be a top-level frame. 3389 // Must be a top-level frame.
3395 frame->parent() == NULL && 3390 info.frame->parent() == NULL &&
3396 // Must not have issued the request from this page. 3391 // Must not have issued the request from this page.
3397 is_content_initiated && 3392 is_content_initiated &&
3398 // Must be targeted at the current tab. 3393 // Must be targeted at the current tab.
3399 default_policy == blink::WebNavigationPolicyCurrentTab && 3394 info.defaultPolicy == blink::WebNavigationPolicyCurrentTab &&
3400 // Must be a JavaScript navigation, which appears as "other". 3395 // Must be a JavaScript navigation, which appears as "other".
3401 type == blink::WebNavigationTypeOther; 3396 info.navigationType == blink::WebNavigationTypeOther;
3402 3397
3403 if (is_fork) { 3398 if (is_fork) {
3404 // Open the URL via the browser, not via WebKit. 3399 // Open the URL via the browser, not via WebKit.
3405 OpenURL(frame, url, Referrer(), default_policy); 3400 OpenURL(info.frame, url, Referrer(), info.defaultPolicy);
3406 return blink::WebNavigationPolicyIgnore; 3401 return blink::WebNavigationPolicyIgnore;
3407 } 3402 }
3408 3403
3409 return default_policy; 3404 return info.defaultPolicy;
3410 } 3405 }
3411 3406
3412 void RenderFrameImpl::OpenURL(WebFrame* frame, 3407 void RenderFrameImpl::OpenURL(WebFrame* frame,
3413 const GURL& url, 3408 const GURL& url,
3414 const Referrer& referrer, 3409 const Referrer& referrer,
3415 WebNavigationPolicy policy) { 3410 WebNavigationPolicy policy) {
3416 DCHECK_EQ(frame_, frame); 3411 DCHECK_EQ(frame_, frame);
3417 3412
3418 FrameHostMsg_OpenURL_Params params; 3413 FrameHostMsg_OpenURL_Params params;
3419 params.url = url; 3414 params.url = url;
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
3625 3620
3626 #if defined(ENABLE_BROWSER_CDMS) 3621 #if defined(ENABLE_BROWSER_CDMS)
3627 RendererCdmManager* RenderFrameImpl::GetCdmManager() { 3622 RendererCdmManager* RenderFrameImpl::GetCdmManager() {
3628 if (!cdm_manager_) 3623 if (!cdm_manager_)
3629 cdm_manager_ = new RendererCdmManager(this); 3624 cdm_manager_ = new RendererCdmManager(this);
3630 return cdm_manager_; 3625 return cdm_manager_;
3631 } 3626 }
3632 #endif // defined(ENABLE_BROWSER_CDMS) 3627 #endif // defined(ENABLE_BROWSER_CDMS)
3633 3628
3634 } // namespace content 3629 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_view_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698