Home | History | Annotate | Download | only in browser
      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