15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_handle.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_contents.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/web_contents.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrerenderHandle::Observer::Observer() { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrerenderHandle::Observer::~Observer() { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrerenderHandle::~PrerenderHandle() { 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (prerender_data_.get()) { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_data_->contents()->RemoveObserver(this); 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrerenderHandle::SetObserver(Observer* observer) { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_NE(static_cast<Observer*>(NULL), observer); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_ = observer; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrerenderHandle::OnNavigateAway() { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (prerender_data_.get()) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_data_->OnHandleNavigatedAway(this); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrerenderHandle::OnCancel() { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (prerender_data_.get()) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_data_->OnHandleCanceled(this); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PrerenderHandle::IsPrerendering() const { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return prerender_data_.get() != NULL; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PrerenderHandle::IsFinishedLoading() const { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!prerender_data_.get()) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_data_->contents()->has_finished_loading(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool PrerenderHandle::IsAbandoned() const { 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(CalledOnValidThread()); 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return prerender_data_ && !prerender_data_->abandon_time().is_null(); 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)PrerenderContents* PrerenderHandle::contents() const { 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(CalledOnValidThread()); 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return prerender_data_ ? prerender_data_->contents() : NULL; 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 66a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool PrerenderHandle::Matches( 67a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const GURL& url, 68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const content::SessionStorageNamespace* session_storage_namespace) const { 69a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(CalledOnValidThread()); 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!prerender_data_.get()) 71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 72a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return prerender_data_->contents()->Matches(url, session_storage_namespace); 73a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 74a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrerenderHandle::PrerenderHandle( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderData* prerender_data) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : observer_(NULL), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_(this) { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (prerender_data) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_data_ = prerender_data->AsWeakPtr(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_data->OnHandleCreated(this); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrerenderHandle::OnPrerenderStart(PrerenderContents* prerender_contents) { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(prerender_data_.get()); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(prerender_data_->contents(), prerender_contents); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (observer_) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_->OnPrerenderStart(this); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrerenderHandle::OnPrerenderStopLoading( 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderContents* prerender_contents) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(prerender_data_.get()); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(prerender_data_->contents(), prerender_contents); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (observer_) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_->OnPrerenderStopLoading(this); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrerenderHandle::OnPrerenderDomContentLoaded( 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderContents* prerender_contents) { 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(CalledOnValidThread()); 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(prerender_data_.get()); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(prerender_data_->contents(), prerender_contents); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (observer_) 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer_->OnPrerenderDomContentLoaded(this); 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrerenderHandle::OnPrerenderStop(PrerenderContents* prerender_contents) { 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (observer_) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_->OnPrerenderStop(this); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrerenderHandle::OnPrerenderCreatedMatchCompleteReplacement( 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderContents* contents, PrerenderContents* replacement) { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This should occur in the middle of the surgery on the PrerenderData, and 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // so we expect to not have our new contents in our PrerenderData yet. The 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // switch occurs in 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PrerenderManager::PrerenderData::MakeIntoMatchCompleteReplacement, so 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this method only needs to switch observing. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents->RemoveObserver(this); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement->AddObserver(this); 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (observer_) 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) observer_->OnPrerenderCreatedMatchCompleteReplacement(this); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool PrerenderHandle::RepresentingSamePrerenderAs( 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PrerenderHandle* other) const { 1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return other && other->prerender_data_.get() && prerender_data_.get() 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) && prerender_data_.get() == other->prerender_data_.get(); 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)content::SessionStorageNamespace* 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)PrerenderHandle::GetSessionStorageNamespace() const { 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!prerender_data_.get()) 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return NULL; 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return prerender_data_->contents()->GetSessionStorageNamespace(); 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)int PrerenderHandle::GetChildId() const { 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!prerender_data_.get()) 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return -1; 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return prerender_data_->contents()->child_id(); 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 153