Chromium Code Reviews| 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 afb0556a27f35540af3215421dd71dc304f61857..f121bb5a304df3e1f4cbdf89b2050979c33b27e8 100644 |
| --- a/content/renderer/browser_plugin/browser_plugin_bindings.cc |
| +++ b/content/renderer/browser_plugin/browser_plugin_bindings.cc |
| @@ -37,77 +37,6 @@ namespace content { |
| namespace { |
| -const char kAddEventListener[] = "addEventListener"; |
| -const char kBackMethod[] = "back"; |
| -const char kCanGoBack[] = "canGoBack"; |
| -const char kCanGoForward[] = "canGoForward"; |
| -const char kForwardMethod[] = "forward"; |
| -const char kGetProcessId[] = "getProcessId"; |
| -const char kGoMethod[] = "go"; |
| -const char kPartitionAttribute[] = "partition"; |
| -const char kReloadMethod[] = "reload"; |
| -const char kRemoveEventListener[] = "removeEventListener"; |
| -const char kSrcAttribute[] = "src"; |
| -const char kStopMethod[] = "stop"; |
| -const char kTerminateMethod[] = "terminate"; |
| - |
| -BrowserPluginBindings* GetBindings(NPObject* object) { |
| - return static_cast<BrowserPluginBindings::BrowserPluginNPObject*>(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); |
| @@ -137,6 +66,33 @@ bool StringToNPVariant(const std::string &in, NPVariant *variant) { |
| return true; |
| } |
| +const char kAddEventListener[] = "addEventListener"; |
| +const char kBackMethod[] = "back"; |
| +const char kCanGoBack[] = "canGoBack"; |
| +const char kCanGoForward[] = "canGoForward"; |
| +const char kForwardMethod[] = "forward"; |
| +const char kGetProcessId[] = "getProcessId"; |
| +const char kGoMethod[] = "go"; |
| +const char kPartitionAttribute[] = "partition"; |
| +const char kReloadMethod[] = "reload"; |
| +const char kRemoveEventListener[] = "removeEventListener"; |
| +const char kSrcAttribute[] = "src"; |
| +const char kStopMethod[] = "stop"; |
| +const char kTerminateMethod[] = "terminate"; |
| + |
| +BrowserPluginBindings* GetBindings(NPObject* object) { |
| + return static_cast<BrowserPluginBindings::BrowserPluginNPObject*>(object)-> |
| + message_channel; |
| +} |
| + |
| +bool IdentifierIsPartitionAttribute(NPIdentifier identifier) { |
| + return WebBindings::getStringIdentifier(kPartitionAttribute) == identifier; |
| +} |
| + |
| +bool IdentifierIsSrcAttribute(NPIdentifier identifier) { |
| + return WebBindings::getStringIdentifier(kSrcAttribute) == identifier; |
| +} |
|
Charlie Reis
2012/10/15 22:19:33
nit: Why move these? Nice that a lot of this was
sadrul
2012/10/15 22:37:12
Done.
|
| + |
| //------------------------------------------------------------------------------ |
| // Implementations of NPClass functions. These are here to: |
| // - Implement src attribute. |
| @@ -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,90 +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 false; |
| + return bindings->InvokeMethod(name, args, arg_count, result); |
| } |
| bool BrowserPluginBindingsInvokeDefault(NPObject* np_obj, |
| @@ -384,6 +228,250 @@ NPClass browser_plugin_message_class = { |
| } // namespace |
| +namespace internal { |
| + |
| +class BrowserPluginBindingInterface { |
|
Charlie Reis
2012/10/15 22:19:33
nit: Interface suggests a class with only pure vir
sadrul
2012/10/15 22:37:12
Good point. Done.
|
| + public: |
| + BrowserPluginBindingInterface(const char name[], |
| + uint32 arg_count) |
| + : name_(name), |
| + arg_count_(arg_count) { |
| + } |
| + |
| + virtual ~BrowserPluginBindingInterface() {} |
| + |
| + bool MatchesName(NPIdentifier name) const { |
| + return WebBindings::getStringIdentifier(name_.c_str()) == name; |
| + } |
| + |
| + uint32 arg_count() const { return arg_count_; } |
| + |
| + virtual bool Invoked(BrowserPluginBindings* bindings, |
|
Charlie Reis
2012/10/15 22:19:33
Why past tense? Invoke seems clearer to me.
sadrul
2012/10/15 22:37:12
Done.
|
| + const NPVariant* args, |
| + NPVariant* result) = 0; |
| + |
| + private: |
| + std::string name_; |
| + uint32 arg_count_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingInterface); |
| +}; |
| + |
| +class BrowserPluginBindingAddListener : public BrowserPluginBindingInterface { |
| + public: |
| + BrowserPluginBindingAddListener() |
| + : BrowserPluginBindingInterface(kAddEventListener, 2) { |
| + } |
| + |
| + virtual bool Invoked(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 BrowserPluginBindingInterface { |
| + public: |
| + BrowserPluginBindingBack() |
| + : BrowserPluginBindingInterface(kBackMethod, 0) { |
| + } |
| + |
| + virtual bool Invoked(BrowserPluginBindings* bindings, |
| + const NPVariant* args, |
| + NPVariant* result) OVERRIDE { |
| + bindings->instance()->Back(); |
| + return true; |
| + } |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingBack); |
| +}; |
| + |
| +class BrowserPluginBindingCanGoBack : public BrowserPluginBindingInterface { |
| + public: |
| + BrowserPluginBindingCanGoBack() |
| + : BrowserPluginBindingInterface(kCanGoBack, 0) { |
| + } |
| + |
| + virtual bool Invoked(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 BrowserPluginBindingInterface { |
| + public: |
| + BrowserPluginBindingCanGoForward() |
| + : BrowserPluginBindingInterface(kCanGoForward, 0) { |
| + } |
| + |
| + virtual bool Invoked(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 BrowserPluginBindingInterface { |
| + public: |
| + BrowserPluginBindingForward() |
| + : BrowserPluginBindingInterface(kForwardMethod, 0) { |
| + } |
| + |
| + virtual bool Invoked(BrowserPluginBindings* bindings, |
| + const NPVariant* args, |
| + NPVariant* result) OVERRIDE { |
| + bindings->instance()->Forward(); |
| + return true; |
| + } |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingForward); |
| +}; |
| + |
| +class BrowserPluginBindingGetProcessID : public BrowserPluginBindingInterface { |
| + public: |
| + BrowserPluginBindingGetProcessID() |
| + : BrowserPluginBindingInterface(kGetProcessId, 0) { |
| + } |
| + |
| + virtual bool Invoked(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 BrowserPluginBindingInterface { |
| + public: |
| + BrowserPluginBindingGo() |
| + : BrowserPluginBindingInterface(kGoMethod, 1) { |
| + } |
| + |
| + virtual bool Invoked(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 BrowserPluginBindingInterface { |
| + public: |
| + BrowserPluginBindingReload() |
| + : BrowserPluginBindingInterface(kReloadMethod, 0) { |
| + } |
| + |
| + virtual bool Invoked(BrowserPluginBindings* bindings, |
| + const NPVariant* args, |
| + NPVariant* result) OVERRIDE { |
| + bindings->instance()->Reload(); |
| + return true; |
| + } |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingReload); |
| +}; |
| + |
| +class BrowserPluginBindingRemoveListener |
| + : public BrowserPluginBindingInterface { |
| + public: |
| + BrowserPluginBindingRemoveListener() |
| + : BrowserPluginBindingInterface(kRemoveEventListener, 2) { |
| + } |
| + |
| + virtual bool Invoked(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 BrowserPluginBindingInterface { |
| + public: |
| + BrowserPluginBindingStop() |
| + : BrowserPluginBindingInterface(kStopMethod, 0) { |
| + } |
| + |
| + virtual bool Invoked(BrowserPluginBindings* bindings, |
| + const NPVariant* args, |
| + NPVariant* result) OVERRIDE { |
| + bindings->instance()->Stop(); |
| + return true; |
| + } |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingStop); |
| +}; |
| + |
| +class BrowserPluginBindingTerminate : public BrowserPluginBindingInterface { |
| + public: |
| + BrowserPluginBindingTerminate() |
| + : BrowserPluginBindingInterface(kTerminateMethod, 0) { |
| + } |
| + |
| + virtual bool Invoked(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() { |
| @@ -400,10 +488,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(); |
|
Charlie Reis
2012/10/15 22:19:33
nit: wrong indent. (Should have one more space, t
sadrul
2012/10/15 22:37:12
Done.
|
| + ++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)->Invoked(this, args, result); |
| + } |
| + return false; |
| +} |
| + |
| } // namespace content |