java_bridge_dispatcher_host_manager.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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/browser/renderer_host/java/java_bridge_dispatcher_host_manager.h" 6 7#include "base/logging.h" 8#include "base/utf_string_conversions.h" 9#include "content/browser/renderer_host/java/java_bridge_dispatcher_host.h" 10#include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h" 11 12namespace content { 13 14JavaBridgeDispatcherHostManager::JavaBridgeDispatcherHostManager( 15 WebContents* web_contents) 16 : WebContentsObserver(web_contents) { 17} 18 19JavaBridgeDispatcherHostManager::~JavaBridgeDispatcherHostManager() { 20 for (ObjectMap::iterator iter = objects_.begin(); iter != objects_.end(); 21 ++iter) { 22 WebKit::WebBindings::releaseObject(iter->second); 23 } 24 DCHECK_EQ(0U, instances_.size()); 25} 26 27void JavaBridgeDispatcherHostManager::AddNamedObject(const string16& name, 28 NPObject* object) { 29 // Record this object in a map so that we can add it into RenderViewHosts 30 // created later. The JavaBridgeDispatcherHost instances will take a 31 // reference to the object, but we take one too, because this method can be 32 // called before there are any such instances. 33 WebKit::WebBindings::retainObject(object); 34 objects_[name] = object; 35 36 for (InstanceMap::iterator iter = instances_.begin(); 37 iter != instances_.end(); ++iter) { 38 iter->second->AddNamedObject(name, object); 39 } 40} 41 42void JavaBridgeDispatcherHostManager::RemoveNamedObject(const string16& name) { 43 ObjectMap::iterator iter = objects_.find(name); 44 if (iter == objects_.end()) { 45 return; 46 } 47 48 WebKit::WebBindings::releaseObject(iter->second); 49 objects_.erase(iter); 50 51 for (InstanceMap::iterator iter = instances_.begin(); 52 iter != instances_.end(); ++iter) { 53 iter->second->RemoveNamedObject(name); 54 } 55} 56 57void JavaBridgeDispatcherHostManager::RenderViewCreated( 58 RenderViewHost* render_view_host) { 59 // Creates a JavaBridgeDispatcherHost for the specified RenderViewHost and 60 // adds all currently registered named objects to the new instance. 61 scoped_refptr<JavaBridgeDispatcherHost> instance = 62 new JavaBridgeDispatcherHost(render_view_host); 63 64 for (ObjectMap::const_iterator iter = objects_.begin(); 65 iter != objects_.end(); ++iter) { 66 instance->AddNamedObject(iter->first, iter->second); 67 } 68 69 instances_[render_view_host] = instance; 70} 71 72void JavaBridgeDispatcherHostManager::RenderViewDeleted( 73 RenderViewHost* render_view_host) { 74 instances_.erase(render_view_host); 75} 76 77void JavaBridgeDispatcherHostManager::WebContentsDestroyed( 78 WebContents* web_contents) { 79 // When a WebContents is shutting down, it clears its observers before 80 // it kills all of its RenderViewHosts, so we won't get a call to 81 // RenderViewDeleted() for all RenderViewHosts. 82 instances_.clear(); 83} 84 85} // namespace content 86