Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / content / renderer / java / gin_java_bridge_object.cc
index a153f2a..b4cf3bf 100644 (file)
@@ -5,6 +5,7 @@
 #include "content/renderer/java/gin_java_bridge_object.h"
 
 #include "base/strings/utf_string_conversions.h"
+#include "content/common/android/gin_java_bridge_errors.h"
 #include "content/common/android/gin_java_bridge_value.h"
 #include "content/public/renderer/v8_value_converter.h"
 #include "content/renderer/java/gin_java_bridge_value_converter.h"
@@ -82,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,
@@ -125,11 +134,12 @@ v8::Handle<v8::Value> GinJavaBridgeObject::InvokeMethod(
     }
   }
 
-  scoped_ptr<base::Value> result =
-      dispatcher_->InvokeJavaMethod(object_id_, name, arguments);
+  GinJavaBridgeError error;
+  scoped_ptr<base::Value> result = dispatcher_->InvokeJavaMethod(
+      object_id_, name, arguments, &error);
   if (!result.get()) {
     args->isolate()->ThrowException(v8::Exception::Error(gin::StringToV8(
-        args->isolate(), kMethodInvocationErrorMessage)));
+        args->isolate(), GinJavaBridgeErrorToString(error))));
     return v8::Undefined(args->isolate());
   }
   if (!result->IsType(base::Value::TYPE_BINARY)) {