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

Unified Diff: content/renderer/browser_plugin/browser_plugin_bindings.cc

Issue 11116003: browser-plugin: Refactor the code for binding methods on the plugin. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: tot-merge Created 8 years, 2 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
« no previous file with comments | « content/renderer/browser_plugin/browser_plugin_bindings.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « content/renderer/browser_plugin/browser_plugin_bindings.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698