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