Index: content/renderer/browser_plugin/browser_plugin_bindings.cc |
diff --git a/content/renderer/browser_plugin/browser_plugin_bindings.cc b/content/renderer/browser_plugin/browser_plugin_bindings.cc |
index f3fe5a815fae7c967e9c22e882c795d62818585b..bf948525ceeb166fd3fa699fa72a7f225e5c0fee 100644 |
--- a/content/renderer/browser_plugin/browser_plugin_bindings.cc |
+++ b/content/renderer/browser_plugin/browser_plugin_bindings.cc |
@@ -56,58 +56,14 @@ BrowserPluginBindings* GetBindings(NPObject* object) { |
message_channel; |
} |
-bool IdentifierIsAddEventListener(NPIdentifier identifier) { |
- return WebBindings::getStringIdentifier(kAddEventListener) == identifier; |
-} |
- |
-bool IdentifierIsBackMethod(NPIdentifier identifier) { |
- return WebBindings::getStringIdentifier(kBackMethod) == identifier; |
-} |
- |
-bool IdentifierIsCanGoBack(NPIdentifier identifier) { |
- return WebBindings::getStringIdentifier(kCanGoBack) == identifier; |
-} |
- |
-bool IdentifierIsCanGoForward(NPIdentifier identifier) { |
- return WebBindings::getStringIdentifier(kCanGoForward) == identifier; |
-} |
- |
-bool IdentifierIsForwardMethod(NPIdentifier identifier) { |
- return WebBindings::getStringIdentifier(kForwardMethod) == identifier; |
-} |
- |
-bool IdentifierIsGetProcessID(NPIdentifier identifier) { |
- return WebBindings::getStringIdentifier(kGetProcessId) == identifier; |
-} |
- |
-bool IdentifierIsGoMethod(NPIdentifier identifier) { |
- return WebBindings::getStringIdentifier(kGoMethod) == identifier; |
-} |
- |
bool IdentifierIsPartitionAttribute(NPIdentifier identifier) { |
return WebBindings::getStringIdentifier(kPartitionAttribute) == identifier; |
} |
-bool IdentifierIsReload(NPIdentifier identifier) { |
- return WebBindings::getStringIdentifier(kReloadMethod) == identifier; |
-} |
- |
-bool IdentifierIsRemoveEventListener(NPIdentifier identifier) { |
- return WebBindings::getStringIdentifier(kRemoveEventListener) == identifier; |
-} |
- |
bool IdentifierIsSrcAttribute(NPIdentifier identifier) { |
return WebBindings::getStringIdentifier(kSrcAttribute) == identifier; |
} |
-bool IdentifierIsStop(NPIdentifier identifier) { |
- return WebBindings::getStringIdentifier(kStopMethod) == identifier; |
-} |
- |
-bool IdentifierIsTerminate(NPIdentifier identifier) { |
- return WebBindings::getStringIdentifier(kTerminateMethod) == identifier; |
-} |
- |
int Int32FromNPVariant(const NPVariant& variant) { |
if (NPVARIANT_IS_INT32(variant)) |
return NPVARIANT_TO_INT32(variant); |
@@ -155,40 +111,11 @@ bool BrowserPluginBindingsHasMethod(NPObject* np_obj, NPIdentifier name) { |
if (!np_obj) |
return false; |
- if (IdentifierIsAddEventListener(name)) |
- return true; |
- |
- if (IdentifierIsBackMethod(name)) |
- return true; |
- |
- if (IdentifierIsCanGoBack(name)) |
- return true; |
- |
- if (IdentifierIsCanGoForward(name)) |
- return true; |
- |
- if (IdentifierIsForwardMethod(name)) |
- return true; |
- |
- if (IdentifierIsGetProcessID(name)) |
- return true; |
- |
- if (IdentifierIsGoMethod(name)) |
- return true; |
- |
- if (IdentifierIsReload(name)) |
- return true; |
- |
- if (IdentifierIsRemoveEventListener(name)) |
- return true; |
- |
- if (IdentifierIsStop(name)) |
- return true; |
- |
- if (IdentifierIsTerminate(name)) |
- return true; |
+ BrowserPluginBindings* bindings = GetBindings(np_obj); |
+ if (!bindings) |
+ return false; |
- return false; |
+ return bindings->HasMethod(name); |
} |
bool BrowserPluginBindingsInvoke(NPObject* np_obj, NPIdentifier name, |
@@ -201,91 +128,7 @@ bool BrowserPluginBindingsInvoke(NPObject* np_obj, NPIdentifier name, |
if (!bindings) |
return false; |
- if (IdentifierIsAddEventListener(name) && (arg_count == 2)) { |
- std::string event_name = StringFromNPVariant(args[0]); |
- if (event_name.empty()) |
- return false; |
- |
- v8::Local<v8::Value> value = |
- v8::Local<v8::Value>::New(WebBindings::toV8Value(&args[1])); |
- if (value.IsEmpty() || !value->IsFunction()) |
- return false; |
- |
- v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(value); |
- result->type = NPVariantType_Bool; |
- result->value.boolValue = |
- bindings->instance()->AddEventListener(event_name, function); |
- return true; |
- } |
- |
- if (IdentifierIsBackMethod(name) && !arg_count) { |
- bindings->instance()->Back(); |
- return true; |
- } |
- |
- if (IdentifierIsCanGoBack(name) && !arg_count) { |
- result->type = NPVariantType_Bool; |
- result->value.boolValue = bindings->instance()->CanGoBack(); |
- return true; |
- } |
- |
- if (IdentifierIsCanGoForward(name) && !arg_count) { |
- result->type = NPVariantType_Bool; |
- result->value.boolValue = bindings->instance()->CanGoForward(); |
- return true; |
- } |
- |
- if (IdentifierIsForwardMethod(name) && !arg_count) { |
- bindings->instance()->Forward(); |
- return true; |
- } |
- |
- if (IdentifierIsGetProcessID(name) && !arg_count) { |
- int process_id = bindings->instance()->process_id(); |
- result->type = NPVariantType_Int32; |
- result->value.intValue = process_id; |
- return true; |
- } |
- |
- if (IdentifierIsGoMethod(name) && arg_count == 1) { |
- bindings->instance()->Go(Int32FromNPVariant(args[0])); |
- return true; |
- } |
- |
- if (IdentifierIsReload(name) && !arg_count) { |
- bindings->instance()->Reload(); |
- return true; |
- } |
- |
- if (IdentifierIsRemoveEventListener(name) && arg_count == 2) { |
- std::string event_name = StringFromNPVariant(args[0]); |
- if (event_name.empty()) |
- return false; |
- |
- v8::Local<v8::Value> value = |
- v8::Local<v8::Value>::New(WebBindings::toV8Value(&args[1])); |
- |
- if (value.IsEmpty() || !value->IsFunction()) |
- return false; |
- |
- v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(value); |
- result->type = NPVariantType_Bool; |
- result->value.boolValue = |
- bindings->instance()->RemoveEventListener(event_name, function); |
- return true; |
- } |
- |
- if (IdentifierIsStop(name) && !arg_count) { |
- bindings->instance()->Stop(); |
- return true; |
- } |
- |
- if (IdentifierIsTerminate(name)) { |
- bindings->instance()->TerminateGuest(); |
- return true; |
- } |
- |
- return false; |
+ return bindings->InvokeMethod(name, args, arg_count, result); |
} |
bool BrowserPluginBindingsInvokeDefault(NPObject* np_obj, |
@@ -385,6 +228,248 @@ NPClass browser_plugin_message_class = { |
} // namespace |
+namespace internal { |
+ |
+class BrowserPluginMethodBinding { |
+ public: |
+ BrowserPluginMethodBinding(const char name[], uint32 arg_count) |
+ : name_(name), |
+ arg_count_(arg_count) { |
+ } |
+ |
+ virtual ~BrowserPluginMethodBinding() {} |
+ |
+ bool MatchesName(NPIdentifier name) const { |
+ return WebBindings::getStringIdentifier(name_.c_str()) == name; |
+ } |
+ |
+ uint32 arg_count() const { return arg_count_; } |
+ |
+ virtual bool Invoke(BrowserPluginBindings* bindings, |
+ const NPVariant* args, |
+ NPVariant* result) = 0; |
+ |
+ private: |
+ std::string name_; |
+ uint32 arg_count_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginMethodBinding); |
+}; |
+ |
+class BrowserPluginBindingAddListener : public BrowserPluginMethodBinding { |
+ public: |
+ BrowserPluginBindingAddListener() |
+ : BrowserPluginMethodBinding(kAddEventListener, 2) { |
+ } |
+ |
+ virtual bool Invoke(BrowserPluginBindings* bindings, |
+ const NPVariant* args, |
+ NPVariant* result) OVERRIDE { |
+ std::string event_name = StringFromNPVariant(args[0]); |
+ if (event_name.empty()) |
+ return false; |
+ |
+ v8::Local<v8::Value> value = |
+ v8::Local<v8::Value>::New(WebBindings::toV8Value(&args[1])); |
+ if (value.IsEmpty() || !value->IsFunction()) |
+ return false; |
+ |
+ v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(value); |
+ BOOLEAN_TO_NPVARIANT( |
+ bindings->instance()->AddEventListener(event_name, function), *result); |
+ return true; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingAddListener); |
+}; |
+ |
+class BrowserPluginBindingBack : public BrowserPluginMethodBinding { |
+ public: |
+ BrowserPluginBindingBack() |
+ : BrowserPluginMethodBinding(kBackMethod, 0) { |
+ } |
+ |
+ virtual bool Invoke(BrowserPluginBindings* bindings, |
+ const NPVariant* args, |
+ NPVariant* result) OVERRIDE { |
+ bindings->instance()->Back(); |
+ return true; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingBack); |
+}; |
+ |
+class BrowserPluginBindingCanGoBack : public BrowserPluginMethodBinding { |
+ public: |
+ BrowserPluginBindingCanGoBack() |
+ : BrowserPluginMethodBinding(kCanGoBack, 0) { |
+ } |
+ |
+ virtual bool Invoke(BrowserPluginBindings* bindings, |
+ const NPVariant* args, |
+ NPVariant* result) OVERRIDE { |
+ BOOLEAN_TO_NPVARIANT(bindings->instance()->CanGoBack(), *result); |
+ return true; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingCanGoBack); |
+}; |
+ |
+class BrowserPluginBindingCanGoForward : public BrowserPluginMethodBinding { |
+ public: |
+ BrowserPluginBindingCanGoForward() |
+ : BrowserPluginMethodBinding(kCanGoForward, 0) { |
+ } |
+ |
+ virtual bool Invoke(BrowserPluginBindings* bindings, |
+ const NPVariant* args, |
+ NPVariant* result) OVERRIDE { |
+ BOOLEAN_TO_NPVARIANT(bindings->instance()->CanGoForward(), *result); |
+ return true; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingCanGoForward); |
+}; |
+ |
+class BrowserPluginBindingForward : public BrowserPluginMethodBinding { |
+ public: |
+ BrowserPluginBindingForward() |
+ : BrowserPluginMethodBinding(kForwardMethod, 0) { |
+ } |
+ |
+ virtual bool Invoke(BrowserPluginBindings* bindings, |
+ const NPVariant* args, |
+ NPVariant* result) OVERRIDE { |
+ bindings->instance()->Forward(); |
+ return true; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingForward); |
+}; |
+ |
+class BrowserPluginBindingGetProcessID : public BrowserPluginMethodBinding { |
+ public: |
+ BrowserPluginBindingGetProcessID() |
+ : BrowserPluginMethodBinding(kGetProcessId, 0) { |
+ } |
+ |
+ virtual bool Invoke(BrowserPluginBindings* bindings, |
+ const NPVariant* args, |
+ NPVariant* result) OVERRIDE { |
+ int process_id = bindings->instance()->process_id(); |
+ INT32_TO_NPVARIANT(process_id, *result); |
+ return true; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingGetProcessID); |
+}; |
+ |
+class BrowserPluginBindingGo : public BrowserPluginMethodBinding { |
+ public: |
+ BrowserPluginBindingGo() |
+ : BrowserPluginMethodBinding(kGoMethod, 1) { |
+ } |
+ |
+ virtual bool Invoke(BrowserPluginBindings* bindings, |
+ const NPVariant* args, |
+ NPVariant* result) OVERRIDE { |
+ bindings->instance()->Go(Int32FromNPVariant(args[0])); |
+ return true; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingGo); |
+}; |
+ |
+class BrowserPluginBindingReload : public BrowserPluginMethodBinding { |
+ public: |
+ BrowserPluginBindingReload() |
+ : BrowserPluginMethodBinding(kReloadMethod, 0) { |
+ } |
+ |
+ virtual bool Invoke(BrowserPluginBindings* bindings, |
+ const NPVariant* args, |
+ NPVariant* result) OVERRIDE { |
+ bindings->instance()->Reload(); |
+ return true; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingReload); |
+}; |
+ |
+class BrowserPluginBindingRemoveListener : public BrowserPluginMethodBinding { |
+ public: |
+ BrowserPluginBindingRemoveListener() |
+ : BrowserPluginMethodBinding(kRemoveEventListener, 2) { |
+ } |
+ |
+ virtual bool Invoke(BrowserPluginBindings* bindings, |
+ const NPVariant* args, |
+ NPVariant* result) OVERRIDE { |
+ std::string event_name = StringFromNPVariant(args[0]); |
+ if (event_name.empty()) |
+ return false; |
+ |
+ v8::Local<v8::Value> value = |
+ v8::Local<v8::Value>::New(WebBindings::toV8Value(&args[1])); |
+ |
+ if (value.IsEmpty() || !value->IsFunction()) |
+ return false; |
+ |
+ v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(value); |
+ BOOLEAN_TO_NPVARIANT( |
+ bindings->instance()->RemoveEventListener(event_name, function), |
+ *result); |
+ return true; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingRemoveListener); |
+}; |
+ |
+class BrowserPluginBindingStop : public BrowserPluginMethodBinding { |
+ public: |
+ BrowserPluginBindingStop() |
+ : BrowserPluginMethodBinding(kStopMethod, 0) { |
+ } |
+ |
+ virtual bool Invoke(BrowserPluginBindings* bindings, |
+ const NPVariant* args, |
+ NPVariant* result) OVERRIDE { |
+ bindings->instance()->Stop(); |
+ return true; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingStop); |
+}; |
+ |
+class BrowserPluginBindingTerminate : public BrowserPluginMethodBinding { |
+ public: |
+ BrowserPluginBindingTerminate() |
+ : BrowserPluginMethodBinding(kTerminateMethod, 0) { |
+ } |
+ |
+ virtual bool Invoke(BrowserPluginBindings* bindings, |
+ const NPVariant* args, |
+ NPVariant* result) OVERRIDE { |
+ bindings->instance()->TerminateGuest(); |
+ return true; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingTerminate); |
+}; |
+ |
+} // namespace internal |
+ |
// BrowserPluginBindings ------------------------------------------------------ |
BrowserPluginBindings::BrowserPluginNPObject::BrowserPluginNPObject() { |
@@ -401,10 +486,45 @@ BrowserPluginBindings::BrowserPluginBindings(BrowserPlugin* instance) |
WebBindings::createObject(NULL, &browser_plugin_message_class); |
np_object_ = static_cast<BrowserPluginBindings::BrowserPluginNPObject*>(obj); |
np_object_->message_channel = weak_ptr_factory_.GetWeakPtr(); |
+ |
+ method_bindings_.push_back(new internal::BrowserPluginBindingAddListener); |
+ method_bindings_.push_back(new internal::BrowserPluginBindingBack); |
+ method_bindings_.push_back(new internal::BrowserPluginBindingCanGoBack); |
+ method_bindings_.push_back(new internal::BrowserPluginBindingCanGoForward); |
+ method_bindings_.push_back(new internal::BrowserPluginBindingForward); |
+ method_bindings_.push_back(new internal::BrowserPluginBindingGetProcessID); |
+ method_bindings_.push_back(new internal::BrowserPluginBindingGo); |
+ method_bindings_.push_back(new internal::BrowserPluginBindingReload); |
+ method_bindings_.push_back(new internal::BrowserPluginBindingRemoveListener); |
+ method_bindings_.push_back(new internal::BrowserPluginBindingStop); |
+ method_bindings_.push_back(new internal::BrowserPluginBindingTerminate); |
} |
BrowserPluginBindings::~BrowserPluginBindings() { |
WebBindings::releaseObject(np_object_); |
} |
+bool BrowserPluginBindings::HasMethod(NPIdentifier name) const { |
+ for (BindingList::const_iterator iter = method_bindings_.begin(); |
+ iter != method_bindings_.end(); |
+ ++iter) { |
+ if ((*iter)->MatchesName(name)) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+bool BrowserPluginBindings::InvokeMethod(NPIdentifier name, |
+ const NPVariant* args, |
+ uint32 arg_count, |
+ NPVariant* result) { |
+ for (BindingList::iterator iter = method_bindings_.begin(); |
+ iter != method_bindings_.end(); |
+ ++iter) { |
+ if ((*iter)->MatchesName(name) && (*iter)->arg_count() == arg_count) |
+ return (*iter)->Invoke(this, args, result); |
+ } |
+ return false; |
+} |
+ |
} // namespace content |