| 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;
|
| }
|
| }
|
|
|
|
|