summaryrefslogtreecommitdiffstats
path: root/content/renderer/java
diff options
context:
space:
mode:
authormnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-10 16:22:08 +0000
committermnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-10 16:22:08 +0000
commitab3be5a113dad5063e5a8f168857804d975444d1 (patch)
tree51ab600837dbd19932481b95e863d6d1e8518e80 /content/renderer/java
parenta9471a7d255440039c8298fa502ba01eeddfbd1b (diff)
downloadchromium_src-ab3be5a113dad5063e5a8f168857804d975444d1.zip
chromium_src-ab3be5a113dad5063e5a8f168857804d975444d1.tar.gz
chromium_src-ab3be5a113dad5063e5a8f168857804d975444d1.tar.bz2
[Android] Cache injected Java objects' methods info on renderer side
Every invocation of Java method via an interface JS wrapper injected by Java bridge is preceded by a call to GetNamedProperty. As method presence can't change during Java object's lifetime, we should cache it on the renderer side, as every IPC call to the browser side is super-expensive. This optimization improves Cordova's "exec" benchmark speed by astonishing 60%, as we shave off half of the IPC calls. BUG=355644 Review URL: https://codereview.chromium.org/381683002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282345 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer/java')
-rw-r--r--content/renderer/java/gin_java_bridge_object.cc10
-rw-r--r--content/renderer/java/gin_java_bridge_object.h3
2 files changed, 11 insertions, 2 deletions
diff --git a/content/renderer/java/gin_java_bridge_object.cc b/content/renderer/java/gin_java_bridge_object.cc
index d2a2b60..b4cf3bf 100644
--- a/content/renderer/java/gin_java_bridge_object.cc
+++ b/content/renderer/java/gin_java_bridge_object.cc
@@ -83,7 +83,15 @@ gin::ObjectTemplateBuilder GinJavaBridgeObject::GetObjectTemplateBuilder(
v8::Local<v8::Value> GinJavaBridgeObject::GetNamedProperty(
v8::Isolate* isolate,
const std::string& property) {
- if (dispatcher_ && dispatcher_->HasJavaMethod(object_id_, property)) {
+ std::map<std::string, bool>::iterator method_pos =
+ known_methods_.find(property);
+ if (method_pos == known_methods_.end()) {
+ if (!dispatcher_) {
+ return v8::Local<v8::Value>();
+ }
+ known_methods_[property] = dispatcher_->HasJavaMethod(object_id_, property);
+ }
+ if (known_methods_[property]) {
return gin::CreateFunctionTemplate(
isolate,
base::Bind(&GinJavaBridgeObject::InvokeMethod,
diff --git a/content/renderer/java/gin_java_bridge_object.h b/content/renderer/java/gin_java_bridge_object.h
index 97b74c5..2f6c6e4 100644
--- a/content/renderer/java/gin_java_bridge_object.h
+++ b/content/renderer/java/gin_java_bridge_object.h
@@ -5,7 +5,7 @@
#ifndef CONTENT_RENDERER_JAVA_GIN_JAVA_BRIDGE_OBJECT_H_
#define CONTENT_RENDERER_JAVA_GIN_JAVA_BRIDGE_OBJECT_H_
-#include <set>
+#include <map>
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
@@ -61,6 +61,7 @@ class GinJavaBridgeObject : public gin::Wrappable<GinJavaBridgeObject>,
base::WeakPtr<GinJavaBridgeDispatcher> dispatcher_;
GinJavaBridgeDispatcher::ObjectID object_id_;
scoped_ptr<GinJavaBridgeValueConverter> converter_;
+ std::map<std::string, bool> known_methods_;
DISALLOW_COPY_AND_ASSIGN(GinJavaBridgeObject);
};