diff options
Diffstat (limited to 'content')
-rw-r--r-- | content/renderer/browser_plugin/browser_plugin.cc | 116 | ||||
-rw-r--r-- | content/renderer/browser_plugin/browser_plugin.h | 13 |
2 files changed, 59 insertions, 70 deletions
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc index 5bf93ea..e777f7b 100644 --- a/content/renderer/browser_plugin/browser_plugin.cc +++ b/content/renderer/browser_plugin/browser_plugin.cc @@ -81,6 +81,8 @@ BrowserPlugin::BrowserPlugin( BrowserPluginManager::Get()->AddBrowserPlugin(instance_id, this); bindings_.reset(new BrowserPluginBindings(this)); + InitializeEvents(); + ParseAttributes(params); } @@ -223,6 +225,15 @@ float BrowserPlugin::GetDeviceScaleFactor() const { return render_view_->GetWebView()->deviceScaleFactor(); } +void BrowserPlugin::InitializeEvents() { + event_listener_map_[kCrashEventName] = EventListeners(); + event_listener_map_[kLoadAbortEventName] = EventListeners(); + event_listener_map_[kLoadCommitEventName] = EventListeners(); + event_listener_map_[kLoadRedirectEventName] = EventListeners(); + event_listener_map_[kLoadStartEventName] = EventListeners(); + event_listener_map_[kLoadStopEventName] = EventListeners(); +} + void BrowserPlugin::RemoveEventListeners() { EventListenerMap::iterator event_listener_map_iter = event_listener_map_.begin(); @@ -238,6 +249,30 @@ void BrowserPlugin::RemoveEventListeners() { event_listener_map_.clear(); } +bool BrowserPlugin::IsValidEvent(const std::string& event_name) { + return event_listener_map_.find(event_name) != event_listener_map_.end(); +} + +void BrowserPlugin::TriggerEvent(const std::string& event_name, + v8::Local<v8::Object>* event) { + WebKit::WebElement plugin = container()->element(); + WebKit::WebFrame* frame = plugin.document().frame(); + if (!frame) + return; + + // TODO(fsamuel): Copying the event listeners is insufficent because + // new persistent handles are not created when the copy constructor is + // called. See http://crbug.com/155044. + EventListeners listeners(event_listener_map_[event_name.c_str()]); + (*event)->Set(v8::String::New("name"), v8::String::New(event_name.c_str())); + v8::Local<v8::Value> argv[] = { *event }; + for (EventListeners::iterator it = listeners.begin(); + it != listeners.end(); + ++it) { + frame->callFunctionEvenIfScriptDisabled(*it, v8::Object::New(), 1, argv); + } +} + void BrowserPlugin::Back() { if (!navigate_src_sent_) return; @@ -347,16 +382,8 @@ void BrowserPlugin::GuestCrashed() { v8::Context::Scope context_scope( plugin.document().frame()->mainWorldScriptContext()); - // TODO(fsamuel): Copying the event listeners is insufficent because - // new persistent handles are not created when the copy constructor is - // called. See http://crbug.com/155044. - EventListeners listeners(event_listener_map_[kCrashEventName]); - EventListeners::iterator it = listeners.begin(); - for (; it != listeners.end(); ++it) { - WebKit::WebFrame* frame = plugin.document().frame(); - if (frame) - frame->callFunctionEvenIfScriptDisabled(*it, v8::Object::New(), 0, NULL); - } + v8::Local<v8::Object> event = v8::Object::New(); + TriggerEvent(kCrashEventName, &event); } void BrowserPlugin::LoadStart(const GURL& url, bool is_top_level) { @@ -374,18 +401,7 @@ void BrowserPlugin::LoadStart(const GURL& url, bool is_top_level) { v8::String::New(url.spec().data(), url.spec().size())); event->Set(v8::String::New(kIsTopLevel, sizeof(kIsTopLevel) - 1), v8::Boolean::New(is_top_level)); - v8::Local<v8::Value> val = event; - - // TODO(fsamuel): Copying the event listeners is insufficent because - // new persistent handles are not created when the copy constructor is - // called. See http://crbug.com/155044. - EventListeners listeners(event_listener_map_[kLoadStartEventName]); - EventListeners::iterator it = listeners.begin(); - for (; it != listeners.end(); ++it) { - WebKit::WebFrame* frame = plugin.document().frame(); - if (frame) - frame->callFunctionEvenIfScriptDisabled(*it, v8::Object::New(), 1, &val); - } + TriggerEvent(kLoadStartEventName, &event); } void BrowserPlugin::LoadCommit( @@ -412,18 +428,8 @@ void BrowserPlugin::LoadCommit( v8::String::New(src_.data(), src_.size())); event->Set(v8::String::New(kIsTopLevel, sizeof(kIsTopLevel) - 1), v8::Boolean::New(params.is_top_level)); - v8::Local<v8::Value> val = event; - // TODO(fsamuel): Copying the event listeners is insufficent because - // new persistent handles are not created when the copy constructor is - // called. See http://crbug.com/155044. - EventListeners listeners(event_listener_map_[kLoadCommitEventName]); - EventListeners::iterator it = listeners.begin(); - for (; it != listeners.end(); ++it) { - WebKit::WebFrame* frame = plugin.document().frame(); - if (frame) - frame->callFunctionEvenIfScriptDisabled(*it, v8::Object::New(), 1, &val); - } + TriggerEvent(kLoadCommitEventName, &event); } void BrowserPlugin::LoadStop() { @@ -437,18 +443,7 @@ void BrowserPlugin::LoadStop() { // Construct the loadStop event object. v8::Local<v8::Object> event = v8::Object::New(); - v8::Local<v8::Value> val = event; - - // TODO(fsamuel): Copying the event listeners is insufficent because - // new persistent handles are not created when the copy constructor is - // called. See http://crbug.com/155044. - EventListeners listeners(event_listener_map_[kLoadStopEventName]); - EventListeners::iterator it = listeners.begin(); - for (; it != listeners.end(); ++it) { - WebKit::WebFrame* frame = plugin.document().frame(); - if (frame) - frame->callFunctionEvenIfScriptDisabled(*it, v8::Object::New(), 1, &val); - } + TriggerEvent(kLoadStopEventName, &event); } void BrowserPlugin::LoadAbort(const GURL& url, @@ -470,18 +465,8 @@ void BrowserPlugin::LoadAbort(const GURL& url, v8::Boolean::New(is_top_level)); event->Set(v8::String::New(kType, sizeof(kType) - 1), v8::String::New(type.data(), type.size())); - v8::Local<v8::Value> val = event; - // TODO(fsamuel): Copying the event listeners is insufficent because - // new persistent handles are not created when the copy constructor is - // called. See http://crbug.com/155044. - EventListeners listeners(event_listener_map_[kLoadAbortEventName]); - EventListeners::iterator it = listeners.begin(); - for (; it != listeners.end(); ++it) { - WebKit::WebFrame* frame = plugin.document().frame(); - if (frame) - frame->callFunctionEvenIfScriptDisabled(*it, v8::Object::New(), 1, &val); - } + TriggerEvent(kLoadAbortEventName, &event); } void BrowserPlugin::LoadRedirect(const GURL& old_url, @@ -503,18 +488,8 @@ void BrowserPlugin::LoadRedirect(const GURL& old_url, v8::String::New(new_url.spec().data(), new_url.spec().size())); event->Set(v8::String::New(kIsTopLevel, sizeof(kIsTopLevel) - 1), v8::Boolean::New(is_top_level)); - v8::Local<v8::Value> val = event; - // TODO(fsamuel): Copying the event listeners is insufficent because - // new persistent handles are not created when the copy constructor is - // called. See http://crbug.com/155044. - EventListeners listeners(event_listener_map_[kLoadRedirectEventName]); - EventListeners::iterator it = listeners.begin(); - for (; it != listeners.end(); ++it) { - WebKit::WebFrame* frame = plugin.document().frame(); - if (frame) - frame->callFunctionEvenIfScriptDisabled(*it, v8::Object::New(), 1, &val); - } + TriggerEvent(kLoadRedirectEventName, &event); } void BrowserPlugin::AdvanceFocus(bool reverse) { @@ -534,11 +509,14 @@ void BrowserPlugin::SetAcceptTouchEvents(bool accept) { } bool BrowserPlugin::HasListeners(const std::string& event_name) { - return event_listener_map_.find(event_name) != event_listener_map_.end(); + return IsValidEvent(event_name) && + !event_listener_map_[event_name].empty(); } bool BrowserPlugin::AddEventListener(const std::string& event_name, v8::Local<v8::Function> function) { + if (!IsValidEvent(event_name)) + return false; EventListeners& listeners = event_listener_map_[event_name]; for (unsigned int i = 0; i < listeners.size(); ++i) { if (listeners[i] == function) @@ -552,7 +530,7 @@ bool BrowserPlugin::AddEventListener(const std::string& event_name, bool BrowserPlugin::RemoveEventListener(const std::string& event_name, v8::Local<v8::Function> function) { - if (event_listener_map_.find(event_name) == event_listener_map_.end()) + if (!HasListeners(event_name)) return false; EventListeners& listeners = event_listener_map_[event_name]; diff --git a/content/renderer/browser_plugin/browser_plugin.h b/content/renderer/browser_plugin/browser_plugin.h index 3f363a5..fa00957 100644 --- a/content/renderer/browser_plugin/browser_plugin.h +++ b/content/renderer/browser_plugin/browser_plugin.h @@ -149,7 +149,7 @@ class CONTENT_EXPORT BrowserPlugin : const WebKit::WebURL& url, void* notify_data, const WebKit::WebURLError& error) OVERRIDE; - protected: + private: friend class base::DeleteHelper<BrowserPlugin>; // Only the manager is allowed to create a BrowserPlugin. friend class BrowserPluginManagerImpl; @@ -186,9 +186,20 @@ class CONTENT_EXPORT BrowserPlugin : // with invalid transport dib otherwise. BrowserPluginHostMsg_ResizeGuest_Params* GetPendingResizeParams(); + // Initializes the valid events. + void InitializeEvents(); + // Cleanup event listener state to free v8 resources when a BrowserPlugin // is destroyed. void RemoveEventListeners(); + + // Returns whether |event_name| is a valid event. + bool IsValidEvent(const std::string& event_name); + + // Triggers the event-listeners for |event_name|. + void TriggerEvent(const std::string& event_name, + v8::Local<v8::Object>* event); + // Creates and maps transport dib. Overridden in tests. virtual TransportDIB* CreateTransportDIB(const size_t size); // Frees up the damage buffer. Overridden in tests. |