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