Index: chrome/browser/prerender/prerender_manager.cc |
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc |
index ad9efda97a5178cd69ae1f28c43fd55c574fd971..dca59030552988cef2c0e54a064f9e348db6c84a 100644 |
--- a/chrome/browser/prerender/prerender_manager.cc |
+++ b/chrome/browser/prerender/prerender_manager.cc |
@@ -411,12 +411,20 @@ PrerenderContents* PrerenderManager::GetEntry(const GURL& url) { |
} |
bool PrerenderManager::MaybeUsePreloadedPageOld(TabContents* tab_contents, |
- const GURL& url) { |
+ const GURL& url, |
+ bool has_opener_set) { |
DCHECK(CalledOnValidThread()); |
scoped_ptr<PrerenderContents> prerender_contents(GetEntry(url)); |
if (prerender_contents.get() == NULL) |
return false; |
+ // Do not use the prerendered version if the opener window.property was |
+ // supposed to be set. |
+ if (has_opener_set) { |
+ prerender_contents.release()->Destroy(FINAL_STATUS_WINDOW_OPENER); |
+ return false; |
+ } |
+ |
// If we are just in the control group (which can be detected by noticing |
// that prerendering hasn't even started yet), record that |tab_contents| now |
// would be showing a prerendered contents, but otherwise, don't do anything. |
@@ -496,10 +504,12 @@ bool PrerenderManager::MaybeUsePreloadedPageOld(TabContents* tab_contents, |
} |
bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tab_contents, |
- const GURL& url) { |
+ const GURL& url, |
+ bool has_opener_set) { |
if (!PrerenderContents::UseTabContents()) { |
VLOG(1) << "Checking for prerender with LEGACY code"; |
- return PrerenderManager::MaybeUsePreloadedPageOld(tab_contents, url); |
+ return PrerenderManager::MaybeUsePreloadedPageOld(tab_contents, url, |
+ has_opener_set); |
} |
VLOG(1) << "Checking for prerender with NEW code"; |
DCHECK(CalledOnValidThread()); |
@@ -508,6 +518,13 @@ bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tab_contents, |
if (prerender_contents.get() == NULL) |
return false; |
+ // Do not use the prerendered version if the opener window.property was |
+ // supposed to be set. |
+ if (has_opener_set) { |
+ prerender_contents.release()->Destroy(FINAL_STATUS_WINDOW_OPENER); |
+ return false; |
+ } |
+ |
// If we are just in the control group (which can be detected by noticing |
// that prerendering hasn't even started yet), record that |tab_contents| now |
// would be showing a prerendered contents, but otherwise, don't do anything. |
@@ -578,23 +595,23 @@ void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry) { |
it != prerender_list_.end(); |
++it) { |
if (it->contents_ == entry) { |
- pending_delete_list_.push_back(*it); |
RemovePendingPreload(entry); |
prerender_list_.erase(it); |
break; |
} |
} |
+ pending_delete_list_.push_back(entry); |
DeleteOldEntries(); |
StartSchedulingPeriodicCleanups(); |
} |
bool PrerenderManager::IsPendingDelete(PrerenderContents* entry) const { |
DCHECK(CalledOnValidThread()); |
- for (std::list<PrerenderContentsData>::const_iterator it = |
+ for (std::list<PrerenderContents*>::const_iterator it = |
pending_delete_list_.begin(); |
it != pending_delete_list_.end(); |
++it) { |
- if (it->contents_ == entry) |
+ if (*it == entry) |
return true; |
} |
@@ -625,9 +642,9 @@ PrerenderContents* PrerenderManager::CreatePrerenderContents( |
void PrerenderManager::DeletePendingDeleteEntries() { |
while (!pending_delete_list_.empty()) { |
- PrerenderContentsData data = pending_delete_list_.front(); |
+ PrerenderContents* contents = pending_delete_list_.front(); |
pending_delete_list_.pop_front(); |
- delete data.contents_; |
+ delete contents; |
} |
} |