Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2534)

Unified Diff: content/renderer/java/gin_java_bridge_dispatcher.cc

Issue 259033002: [Android] Implement renderer side of Gin Java Bridge (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/java/gin_java_bridge_dispatcher.cc
diff --git a/content/renderer/java/gin_java_bridge_dispatcher.cc b/content/renderer/java/gin_java_bridge_dispatcher.cc
new file mode 100644
index 0000000000000000000000000000000000000000..29f198e9e5d816d41032550c2ee151ba939512ce
--- /dev/null
+++ b/content/renderer/java/gin_java_bridge_dispatcher.cc
@@ -0,0 +1,134 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/renderer/java/gin_java_bridge_dispatcher.h"
+
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "content/common/gin_java_bridge_messages.h"
+#include "content/public/renderer/render_frame.h"
+#include "content/renderer/java/gin_java_bridge_object.h"
+#include "third_party/WebKit/public/web/WebFrame.h"
+#include "third_party/WebKit/public/web/WebView.h"
+
+namespace content {
+
+GinJavaBridgeDispatcher::GinJavaBridgeDispatcher(RenderFrame* render_frame)
+ : RenderFrameObserver(render_frame) {
+}
+
+GinJavaBridgeDispatcher::~GinJavaBridgeDispatcher() {
+}
+
+bool GinJavaBridgeDispatcher::OnMessageReceived(const IPC::Message& msg) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(GinJavaBridgeDispatcher, msg)
+ IPC_MESSAGE_HANDLER(GinJavaBridgeMsg_AddNamedObject, OnAddNamedObject)
+ IPC_MESSAGE_HANDLER(GinJavaBridgeMsg_RemoveNamedObject, OnRemoveNamedObject)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+ return handled;
+}
+
+void GinJavaBridgeDispatcher::DidClearWindowObject(int world_id) {
jochen (gone - plz use gerrit) 2014/04/29 13:50:16 for world_id != 0, you should exit early.
mnaganov (inactive) 2014/04/30 16:46:26 Done.
+ for (NamedObjectMap::const_iterator iter = named_objects_.begin();
+ iter != named_objects_.end(); ++iter) {
+ // A wrapper can already be collected, as we don't hold persistent
+ // handles for them to avoid memory leaks. However, we would like to try
+ // to reuse an existing wrapper as it may have properties set on the JS
+ // side.
+ GinJavaBridgeObject* object = objects_.Lookup(iter->second);
+ bool wrapper_created = false;
+ if (object) {
+ wrapper_created = GinJavaBridgeObject::InjectExisting(
+ render_frame()->GetWebFrame(),
+ object,
+ iter->first);
+ } else {
+ object = GinJavaBridgeObject::Inject(render_frame()->GetWebFrame(),
+ AsWeakPtr(),
+ iter->first,
+ iter->second);
+ if (object) {
+ wrapper_created = true;
+ objects_.AddWithID(object, iter->second);
+ }
+ }
+ if (!wrapper_created) {
+ // Inform the host about wrapper creation failure.
+ render_frame()->Send(new GinJavaBridgeHostMsg_ObjectWrapperDeleted(
+ routing_id(), iter->second));
+ }
+ }
+}
+
+void GinJavaBridgeDispatcher::OnAddNamedObject(
+ const std::string& name,
+ ObjectID object_id) {
+ // Added objects only become available after page reload, so here they
+ // are only added into the internal map.
+ named_objects_.insert(std::make_pair(name, object_id));
+}
+
+void GinJavaBridgeDispatcher::OnRemoveNamedObject(const std::string& name) {
+ // Removal becomes in effect on next reload. We simply removing the entry
+ // from the map here.
+ NamedObjectMap::iterator iter = named_objects_.find(name);
+ DCHECK(iter != named_objects_.end());
+ named_objects_.erase(iter);
+}
+
+void GinJavaBridgeDispatcher::GetJavaMethods(
+ ObjectID object_id,
+ std::set<std::string>* methods) {
+ render_frame()->Send(new GinJavaBridgeHostMsg_GetMethods(
+ routing_id(), object_id, methods));
+}
+
+bool GinJavaBridgeDispatcher::HasJavaMethod(ObjectID object_id,
+ const std::string& method_name) {
+ bool result;
+ render_frame()->Send(new GinJavaBridgeHostMsg_HasMethod(
+ routing_id(), object_id, method_name, &result));
+ return result;
+}
+
+scoped_ptr<base::Value> GinJavaBridgeDispatcher::InvokeJavaMethod(
+ ObjectID object_id,
+ const std::string& method_name,
+ const base::ListValue& arguments) {
+ base::ListValue result_wrapper;
+ render_frame()->Send(
+ new GinJavaBridgeHostMsg_InvokeMethod(routing_id(),
+ object_id,
+ method_name,
+ arguments,
+ &result_wrapper));
+ base::Value* result;
+ if (result_wrapper.Get(0, &result)) {
+ return scoped_ptr<base::Value>(result->DeepCopy());
+ } else {
+ return scoped_ptr<base::Value>();
+ }
+}
+
+GinJavaBridgeObject* GinJavaBridgeDispatcher::GetObject(ObjectID object_id) {
+ GinJavaBridgeObject* result = objects_.Lookup(object_id);
+ if (!result) {
+ result = GinJavaBridgeObject::InjectAnonymous(AsWeakPtr(), object_id);
+ if (result)
+ objects_.AddWithID(result, object_id);
+ }
+ return result;
+}
+
+void GinJavaBridgeDispatcher::OnGinJavaBridgeObjectDeleted(ObjectID object_id) {
+ if (!objects_.Lookup(object_id))
+ return;
+ objects_.Remove(object_id);
+ render_frame()->Send(
+ new GinJavaBridgeHostMsg_ObjectWrapperDeleted(routing_id(), object_id));
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698