diff options
author | shishir@chromium.org <shishir@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-07 19:11:59 +0000 |
---|---|---|
committer | shishir@chromium.org <shishir@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-07 19:11:59 +0000 |
commit | 57b9396ce02f494dee0eb42a7eafde525aea1028 (patch) | |
tree | 3d0b99609965a76e85d711bb19a6eb727149be56 /content/renderer | |
parent | d7b10554d4bbe6d8224be2a14775e1a4b8089d99 (diff) | |
download | chromium_src-57b9396ce02f494dee0eb42a7eafde525aea1028.zip chromium_src-57b9396ce02f494dee0eb42a7eafde525aea1028.tar.gz chromium_src-57b9396ce02f494dee0eb42a7eafde525aea1028.tar.bz2 |
Changes for cross domain prerenders to not cancel when there is a window.opener set.
This change will only cancel prerenders with window.opener set where the
prerender is in the same domain as the page doing the prerendering.
The window.opener case can be broken down into two cases:
1. When the page embedding the "link rel=prerender" does not have an opener
set, but the opener is set only for the prerendered page.
2. The embedder page itself has the opener set and the prerendered page
inherits it.
This CL fixes both cases.
BUG=85042
TEST=PrerenderBrowserTest
Review URL: http://codereview.chromium.org/7906017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@104538 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer')
-rw-r--r-- | content/renderer/render_view.cc | 13 | ||||
-rw-r--r-- | content/renderer/render_view.h | 3 |
2 files changed, 12 insertions, 4 deletions
diff --git a/content/renderer/render_view.cc b/content/renderer/render_view.cc index 0e58757..348c506 100644 --- a/content/renderer/render_view.cc +++ b/content/renderer/render_view.cc @@ -2311,9 +2311,8 @@ void RenderView::didStartProvisionalLoad(WebFrame* frame) { FOR_EACH_OBSERVER( RenderViewObserver, observers_, DidStartProvisionalLoad(frame)); - bool has_opener_set = opener_id_ != MSG_ROUTING_NONE; Send(new ViewHostMsg_DidStartProvisionalLoadForFrame( - routing_id_, frame->identifier(), is_top_most, has_opener_set, + routing_id_, frame->identifier(), is_top_most, GetOpenerUrl(), ds->request().url())); } @@ -2330,9 +2329,8 @@ void RenderView::didReceiveServerRedirectForProvisionalLoad(WebFrame* frame) { std::vector<GURL> redirects; GetRedirectChain(data_source, &redirects); if (redirects.size() >= 2) { - bool has_opener_set = opener_id_ != MSG_ROUTING_NONE; Send(new ViewHostMsg_DidRedirectProvisionalLoad(routing_id_, page_id_, - has_opener_set, redirects[redirects.size() - 2], redirects.back())); + GetOpenerUrl(), redirects[redirects.size() - 2], redirects.back())); } } @@ -3093,6 +3091,13 @@ GURL RenderView::GetAlternateErrorPageURL(const GURL& failed_url, return url; } +GURL RenderView::GetOpenerUrl() const { + if (opener_id_ == MSG_ROUTING_NONE || opener_suppressed_) + return GURL(); + else + return creator_url_; +} + WebUIBindings* RenderView::GetWebUIBindings() { if (!web_ui_bindings_.get()) { web_ui_bindings_.reset(new WebUIBindings(this, routing_id_)); diff --git a/content/renderer/render_view.h b/content/renderer/render_view.h index b1728b3..37899c0 100644 --- a/content/renderer/render_view.h +++ b/content/renderer/render_view.h @@ -904,6 +904,9 @@ class RenderView : public RenderWidget, // Locates a sub frame with given xpath WebKit::WebFrame* GetChildFrame(const string16& frame_xpath) const; + // Returns the opener url if present, else an empty url. + GURL GetOpenerUrl() const; + WebUIBindings* GetWebUIBindings(); // Should only be called if this object wraps a PluginDocument. |