1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/public/browser/web_contents_observer.h" 6 7 #include "content/browser/web_contents/web_contents_impl.h" 8 #include "content/public/browser/navigation_details.h" 9 #include "content/public/browser/render_view_host.h" 10 11 namespace content { 12 13 WebContentsObserver::WebContentsObserver(WebContents* web_contents) 14 : web_contents_(NULL) { 15 Observe(web_contents); 16 } 17 18 WebContentsObserver::WebContentsObserver() 19 : web_contents_(NULL) { 20 } 21 22 WebContentsObserver::~WebContentsObserver() { 23 if (web_contents_) 24 web_contents_->RemoveObserver(this); 25 } 26 27 WebContents* WebContentsObserver::web_contents() const { 28 return web_contents_; 29 } 30 31 void WebContentsObserver::Observe(WebContents* web_contents) { 32 if (web_contents == web_contents_) { 33 // Early exit to avoid infinite loops if we're in the middle of a callback. 34 return; 35 } 36 if (web_contents_) 37 web_contents_->RemoveObserver(this); 38 web_contents_ = static_cast<WebContentsImpl*>(web_contents); 39 if (web_contents_) { 40 web_contents_->AddObserver(this); 41 } 42 } 43 44 bool WebContentsObserver::OnMessageReceived(const IPC::Message& message) { 45 return false; 46 } 47 48 bool WebContentsObserver::Send(IPC::Message* message) { 49 if (!web_contents_) { 50 delete message; 51 return false; 52 } 53 54 return web_contents_->Send(message); 55 } 56 57 int WebContentsObserver::routing_id() const { 58 if (!web_contents_) 59 return MSG_ROUTING_NONE; 60 61 return web_contents_->GetRoutingID(); 62 } 63 64 void WebContentsObserver::WebContentsImplDestroyed() { 65 // Do cleanup so that 'this' can safely be deleted from WebContentsDestroyed. 66 web_contents_->RemoveObserver(this); 67 WebContentsImpl* contents = web_contents_; 68 web_contents_ = NULL; 69 WebContentsDestroyed(contents); 70 } 71 72 } // namespace content 73