| Index: chrome/browser/prerender/prerender_manager.cc
|
| diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
|
| index dc1f78006fdc69b5eaa1c6942eea181cec7ef8e9..7e63ec7ea5fadd6e038fce6fdcb4604d0928a7aa 100644
|
| --- a/chrome/browser/prerender/prerender_manager.cc
|
| +++ b/chrome/browser/prerender/prerender_manager.cc
|
| @@ -427,6 +427,14 @@ bool PrerenderManager::MaybeUsePrerenderedPage(WebContents* web_contents,
|
| prerender_data->contents()->prerender_contents()) {
|
| if (web_contents == new_web_contents)
|
| return false; // Do not swap in to ourself.
|
| +
|
| + // We cannot swap in if there is no last committed entry, because we would
|
| + // show a blank page under an existing entry from the current tab. Even if
|
| + // there is a pending entry, it may not commit.
|
| + // TODO(creis): If there is a pending navigation and no last committed
|
| + // entry, we might be able to transfer the network request instead.
|
| + if (!new_web_contents->GetController().CanPruneAllButVisible())
|
| + return false;
|
| }
|
|
|
| // Do not use the prerendered version if there is an opener object.
|
| @@ -520,8 +528,8 @@ bool PrerenderManager::MaybeUsePrerenderedPage(WebContents* web_contents,
|
| MarkWebContentsAsPrerendered(new_web_contents, prerender_contents->origin());
|
|
|
| // Merge the browsing history.
|
| - new_web_contents->GetController().CopyStateFromAndPrune(
|
| - &old_web_contents->GetController());
|
| + CHECK(new_web_contents->GetController().CopyStateFromAndPrune(
|
| + &old_web_contents->GetController()));
|
| CoreTabHelper::FromWebContents(old_web_contents)->delegate()->
|
| SwapTabContents(old_web_contents, new_web_contents);
|
| prerender_contents->CommitHistory(new_web_contents);
|
|
|