1// Copyright 2014 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#ifndef CONTENT_RENDERER_JAVA_GIN_JAVA_BRIDGE_DISPATCHER_H_ 6#define CONTENT_RENDERER_JAVA_GIN_JAVA_BRIDGE_DISPATCHER_H_ 7 8#include <map> 9#include <set> 10 11#include "base/id_map.h" 12#include "base/memory/scoped_ptr.h" 13#include "base/memory/weak_ptr.h" 14#include "base/values.h" 15#include "content/common/android/gin_java_bridge_errors.h" 16#include "content/public/renderer/render_frame_observer.h" 17 18namespace blink { 19class WebFrame; 20} 21 22namespace content { 23 24class GinJavaBridgeObject; 25 26// This class handles injecting Java objects into the main frame of a 27// RenderView. The 'add' and 'remove' messages received from the browser 28// process modify the entries in a map of 'pending' objects. These objects are 29// bound to the window object of the main frame when that window object is next 30// cleared. These objects remain bound until the window object is cleared 31// again. 32class GinJavaBridgeDispatcher 33 : public base::SupportsWeakPtr<GinJavaBridgeDispatcher>, 34 public RenderFrameObserver { 35 public: 36 // GinJavaBridgeObjects are managed by gin. An object gets destroyed 37 // when it is no more referenced from JS. As GinJavaBridgeObject reports 38 // deletion of self to GinJavaBridgeDispatcher, we would not have stale 39 // pointers here. 40 typedef IDMap<GinJavaBridgeObject, IDMapExternalPointer> ObjectMap; 41 typedef ObjectMap::KeyType ObjectID; 42 43 explicit GinJavaBridgeDispatcher(RenderFrame* render_frame); 44 virtual ~GinJavaBridgeDispatcher(); 45 46 // RenderFrameObserver override: 47 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 48 virtual void DidClearWindowObject() OVERRIDE; 49 50 void GetJavaMethods(ObjectID object_id, std::set<std::string>* methods); 51 bool HasJavaMethod(ObjectID object_id, const std::string& method_name); 52 scoped_ptr<base::Value> InvokeJavaMethod(ObjectID object_id, 53 const std::string& method_name, 54 const base::ListValue& arguments, 55 GinJavaBridgeError* error); 56 GinJavaBridgeObject* GetObject(ObjectID object_id); 57 void OnGinJavaBridgeObjectDeleted(ObjectID object_id); 58 59 private: 60 void OnAddNamedObject(const std::string& name, 61 ObjectID object_id); 62 void OnRemoveNamedObject(const std::string& name); 63 void OnSetAllowObjectContentsInspection(bool allow); 64 65 typedef std::map<std::string, ObjectID> NamedObjectMap; 66 NamedObjectMap named_objects_; 67 ObjectMap objects_; 68 bool inside_did_clear_window_object_; 69 70 DISALLOW_COPY_AND_ASSIGN(GinJavaBridgeDispatcher); 71}; 72 73} // namespace content 74 75#endif // CONTENT_RENDERER_JAVA_GIN_JAVA_BRIDGE_DISPATCHER_H_ 76