#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"
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,
}
}
- 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)) {