Title: [87631] branches/safari-534-branch/Source/WebCore

Diff

Modified: branches/safari-534-branch/Source/WebCore/ChangeLog (87630 => 87631)


--- branches/safari-534-branch/Source/WebCore/ChangeLog	2011-05-29 02:42:53 UTC (rev 87630)
+++ branches/safari-534-branch/Source/WebCore/ChangeLog	2011-05-29 02:44:48 UTC (rev 87631)
@@ -1,5 +1,42 @@
 2011-05-28  Mark Rowe  <[email protected]>
 
+        Merge r87622.
+
+    2011-05-28  Jer Noble  <[email protected]>
+
+        Reviewed by Maciej Stachowiak.
+
+        Mouse clicks propagate outside full-screen media controls.
+        https://bugs.webkit.org/show_bug.cgi?id=61689
+
+        Mouse click events are propagating out of the media controls, so mouse click
+        listeners registered on the video element are getting fired when the user
+        clicks on media controller buttons.  By default, block propagation of click 
+        events from MediaControlElements by overriding preDispatchEventHandler, and
+        convert all instances of defaultEventHandler -> preDispatchEventHandler.  Change
+        all calls of event->setDefaultHandled() to event->stopPropagation().
+
+        * html/shadow/MediaControlElements.cpp:
+        (WebCore::MediaControlElement::preDispatchEventHandler): Added.  Block 
+            propagation of all mouse click events.
+        (WebCore::MediaControlVolumeSliderContainerElement::preDispatchEventHandler):
+            Renamed from setDefaultHandled.
+        (WebCore::MediaControlMuteButtonElement::preDispatchEventHandler): Ditto.
+        (WebCore::MediaControlPanelMuteButtonElement::preDispatchEventHandler): Ditto.
+        (WebCore::MediaControlPlayButtonElement::preDispatchEventHandler): Ditto.
+        (WebCore::MediaControlSeekButtonElement::preDispatchEventHandler): Ditto.
+        (WebCore::MediaControlRewindButtonElement::preDispatchEventHandler): Ditto.
+        (WebCore::MediaControlReturnToRealtimeButtonElement::preDispatchEventHandler): Ditto.
+        (WebCore::MediaControlToggleClosedCaptionsButtonElement::preDispatchEventHandler): Ditto.
+        (WebCore::MediaControlTimelineElement::preDispatchEventHandler): Ditto.
+        (WebCore::MediaControlVolumeSliderElement::preDispatchEventHandler): Ditto.
+        (WebCore::MediaControlFullscreenButtonElement::preDispatchEventHandler): Ditto.
+        (WebCore::MediaControlFullscreenVolumeMinButtonElement::preDispatchEventHandler): Ditto.
+        (WebCore::MediaControlFullscreenVolumeMaxButtonElement::preDispatchEventHandler): Ditto.
+        * html/shadow/MediaControlElements.h:
+
+2011-05-28  Mark Rowe  <[email protected]>
+
         Merge r87598.
 
     2011-05-27  Simon Fraser  <[email protected]>

Modified: branches/safari-534-branch/Source/WebCore/html/shadow/MediaControlElements.cpp (87630 => 87631)


--- branches/safari-534-branch/Source/WebCore/html/shadow/MediaControlElements.cpp	2011-05-29 02:42:53 UTC (rev 87630)
+++ branches/safari-534-branch/Source/WebCore/html/shadow/MediaControlElements.cpp	2011-05-29 02:44:48 UTC (rev 87631)
@@ -75,6 +75,14 @@
 {
 }
 
+void* MediaControlElement::preDispatchEventHandler(Event* event)
+{
+    if (event->type() == eventNames().clickEvent)
+        event->stopPropagation();
+    
+    return 0;
+}
+
 static const String& displayString()
 {
     DEFINE_STATIC_LOCAL(String, s, ("display"));
@@ -195,20 +203,21 @@
     return new (arena) RenderMediaVolumeSliderContainer(this);
 }
 
-void MediaControlVolumeSliderContainerElement::defaultEventHandler(Event* event)
+void* MediaControlVolumeSliderContainerElement::preDispatchEventHandler(Event* event)
 {
     if (!event->isMouseEvent() || event->type() != eventNames().mouseoutEvent)
-        return;
+        return 0;
 
     // Poor man's mouseleave event detection.
     MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
     if (!mouseEvent->relatedTarget() || !mouseEvent->relatedTarget()->toNode())
-        return;
+        return 0;
 
     if (this->containsIncludingShadowDOM(mouseEvent->relatedTarget()->toNode()))
-        return;
+        return 0;
 
     hide();
+    return 0;
 }
 
 
@@ -324,14 +333,14 @@
 {
 }
 
-void MediaControlMuteButtonElement::defaultEventHandler(Event* event)
+void* MediaControlMuteButtonElement::preDispatchEventHandler(Event* event)
 {
     if (event->type() == eventNames().clickEvent) {
         mediaElement()->setMuted(!mediaElement()->muted());
-        event->setDefaultHandled();
+        event->stopPropagation();
     }
 
-    HTMLInputElement::defaultEventHandler(event);
+    return 0;
 }
 
 void MediaControlMuteButtonElement::changedMute()
@@ -361,12 +370,12 @@
     return button.release();
 }
 
-void MediaControlPanelMuteButtonElement::defaultEventHandler(Event* event)
+void* MediaControlPanelMuteButtonElement::preDispatchEventHandler(Event* event)
 {
     if (event->type() == eventNames().mouseoverEvent)
         m_controls->showVolumeSlider();
 
-    MediaControlMuteButtonElement::defaultEventHandler(event);
+    return 0;
 }
 
 const AtomicString& MediaControlPanelMuteButtonElement::shadowPseudoId() const
@@ -409,14 +418,14 @@
     return button.release();
 }
 
-void MediaControlPlayButtonElement::defaultEventHandler(Event* event)
+void* MediaControlPlayButtonElement::preDispatchEventHandler(Event* event)
 {
     if (event->type() == eventNames().clickEvent) {
         mediaElement()->togglePlayState();
         updateDisplayType();
-        event->setDefaultHandled();
+        event->stopPropagation();
     }
-    HTMLInputElement::defaultEventHandler(event);
+    return 0;
 }
 
 void MediaControlPlayButtonElement::updateDisplayType()
@@ -440,7 +449,7 @@
 {
 }
 
-void MediaControlSeekButtonElement::defaultEventHandler(Event* event)
+void* MediaControlSeekButtonElement::preDispatchEventHandler(Event* event)
 {
     if (event->type() == eventNames().mousedownEvent) {
         if (Frame* frame = document()->frame()) {
@@ -449,7 +458,7 @@
         }
         mediaElement()->pause(event->fromUserGesture());
         m_seekTimer.startRepeating(cSeekRepeatDelay);
-        event->setDefaultHandled();
+        event->stopPropagation();
     } else if (event->type() == eventNames().mouseupEvent) {
         if (m_capturing)
             if (Frame* frame = document()->frame()) {
@@ -464,10 +473,10 @@
             }
             m_seekTimer.stop();
             m_seeking = false;
-            event->setDefaultHandled();
+            event->stopPropagation();
         }
     }
-    HTMLInputElement::defaultEventHandler(event);
+    return 0;
 }
 
 void MediaControlSeekButtonElement::seekTimerFired(Timer<MediaControlSeekButtonElement>*)
@@ -541,13 +550,13 @@
     return button.release();
 }
 
-void MediaControlRewindButtonElement::defaultEventHandler(Event* event)
+void* MediaControlRewindButtonElement::preDispatchEventHandler(Event* event)
 {
     if (event->type() == eventNames().clickEvent) {
         mediaElement()->rewind(30);
-        event->setDefaultHandled();
+        event->stopPropagation();
     }    
-    HTMLInputElement::defaultEventHandler(event);
+    return 0;
 }
 
 const AtomicString& MediaControlRewindButtonElement::shadowPseudoId() const
@@ -571,13 +580,13 @@
     return button.release();
 }
 
-void MediaControlReturnToRealtimeButtonElement::defaultEventHandler(Event* event)
+void* MediaControlReturnToRealtimeButtonElement::preDispatchEventHandler(Event* event)
 {
     if (event->type() == eventNames().clickEvent) {
         mediaElement()->returnToRealtime();
-        event->setDefaultHandled();
+        event->stopPropagation();
     }
-    HTMLInputElement::defaultEventHandler(event);
+    return 0;
 }
 
 const AtomicString& MediaControlReturnToRealtimeButtonElement::shadowPseudoId() const
@@ -601,16 +610,16 @@
     return button.release();
 }
 
-void MediaControlToggleClosedCaptionsButtonElement::defaultEventHandler(Event* event)
+void* MediaControlToggleClosedCaptionsButtonElement::preDispatchEventHandler(Event* event)
 {
     if (event->type() == eventNames().clickEvent) {
         mediaElement()->setClosedCaptionsVisible(!mediaElement()->closedCaptionsVisible());
         setChecked(mediaElement()->closedCaptionsVisible());
         updateDisplayType();
-        event->setDefaultHandled();
+        event->stopPropagation();
     }
 
-    HTMLInputElement::defaultEventHandler(event);
+    return 0;
 }
 
 void MediaControlToggleClosedCaptionsButtonElement::updateDisplayType()
@@ -642,14 +651,14 @@
     return timeline.release();
 }
 
-void MediaControlTimelineElement::defaultEventHandler(Event* event)
+void* MediaControlTimelineElement::preDispatchEventHandler(Event* event)
 {
     // Left button is 0. Rejects mouse events not from left button.
     if (event->isMouseEvent() && static_cast<MouseEvent*>(event)->button())
-        return;
+        return 0;
 
     if (!attached())
-        return;
+        return 0;
 
     if (event->type() == eventNames().mousedownEvent)
         mediaElement()->beginScrubbing();
@@ -657,7 +666,7 @@
     MediaControlInputElement::defaultEventHandler(event);
 
     if (event->type() == eventNames().mouseoverEvent || event->type() == eventNames().mouseoutEvent || event->type() == eventNames().mousemoveEvent)
-        return;
+        return 0;
 
     float time = narrowPrecisionToFloat(value().toDouble());
     if (time != mediaElement()->currentTime()) {
@@ -672,6 +681,7 @@
 
     if (event->type() == eventNames().mouseupEvent)
         mediaElement()->endScrubbing();
+    return 0;
 }
 
 void MediaControlTimelineElement::setPosition(float currentTime) 
@@ -708,19 +718,19 @@
     return slider.release();
 }
 
-void MediaControlVolumeSliderElement::defaultEventHandler(Event* event)
+void* MediaControlVolumeSliderElement::preDispatchEventHandler(Event* event)
 {
     // Left button is 0. Rejects mouse events not from left button.
     if (event->isMouseEvent() && static_cast<MouseEvent*>(event)->button())
-        return;
+        return 0;
 
     if (!attached())
-        return;
+        return 0;
 
     MediaControlInputElement::defaultEventHandler(event);
 
     if (event->type() == eventNames().mouseoverEvent || event->type() == eventNames().mouseoutEvent || event->type() == eventNames().mousemoveEvent)
-        return;
+        return 0;
 
     float volume = narrowPrecisionToFloat(value().toDouble());
     if (volume != mediaElement()->volume()) {
@@ -728,6 +738,7 @@
         mediaElement()->setVolume(volume, ec);
         ASSERT(!ec);
     }
+    return 0;
 }
 
 void MediaControlVolumeSliderElement::setVolume(float volume)
@@ -783,7 +794,7 @@
     return button.release();
 }
 
-void MediaControlFullscreenButtonElement::defaultEventHandler(Event* event)
+void* MediaControlFullscreenButtonElement::preDispatchEventHandler(Event* event)
 {
     if (event->type() == eventNames().clickEvent) {
 #if ENABLE(FULLSCREEN_API)
@@ -803,9 +814,9 @@
         } else
 #endif
             mediaElement()->enterFullscreen();
-        event->setDefaultHandled();
+        event->stopPropagation();
     }
-    HTMLInputElement::defaultEventHandler(event);
+    return 0;
 }
 
 const AtomicString& MediaControlFullscreenButtonElement::shadowPseudoId() const
@@ -828,14 +839,14 @@
     return button.release();
 }
 
-void MediaControlFullscreenVolumeMinButtonElement::defaultEventHandler(Event* event)
+void* MediaControlFullscreenVolumeMinButtonElement::preDispatchEventHandler(Event* event)
 {
     if (event->type() == eventNames().clickEvent) {
         ExceptionCode code = 0;
         mediaElement()->setVolume(0, code);
-        event->setDefaultHandled();
+        event->stopPropagation();
     }
-    HTMLInputElement::defaultEventHandler(event);
+    return 0;
 }
 
 const AtomicString& MediaControlFullscreenVolumeMinButtonElement::shadowPseudoId() const
@@ -858,14 +869,14 @@
     return button.release();
 }
 
-void MediaControlFullscreenVolumeMaxButtonElement::defaultEventHandler(Event* event)
+void* MediaControlFullscreenVolumeMaxButtonElement::preDispatchEventHandler(Event* event)
 {
     if (event->type() == eventNames().clickEvent) {
         ExceptionCode code = 0;
         mediaElement()->setVolume(1, code);
-        event->setDefaultHandled();
+        event->stopPropagation();
     }
-    HTMLInputElement::defaultEventHandler(event);
+    return 0;
 }
 
 const AtomicString& MediaControlFullscreenVolumeMaxButtonElement::shadowPseudoId() const

Modified: branches/safari-534-branch/Source/WebCore/html/shadow/MediaControlElements.h (87630 => 87631)


--- branches/safari-534-branch/Source/WebCore/html/shadow/MediaControlElements.h	2011-05-29 02:42:53 UTC (rev 87630)
+++ branches/safari-534-branch/Source/WebCore/html/shadow/MediaControlElements.h	2011-05-29 02:44:48 UTC (rev 87631)
@@ -87,6 +87,7 @@
     MediaControlElement(HTMLMediaElement*);
 
 private:
+    virtual void *preDispatchEventHandler(Event*);
     virtual bool isMediaControlElement() const { return true; }
 
     HTMLMediaElement* m_mediaElement;   
@@ -126,7 +127,7 @@
 private:
     MediaControlVolumeSliderContainerElement(HTMLMediaElement*);
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
-    virtual void defaultEventHandler(Event*);
+    virtual void *preDispatchEventHandler(Event*);
     virtual MediaControlElementType displayType() const;
     virtual const AtomicString& shadowPseudoId() const;
 };
@@ -182,7 +183,7 @@
 
 protected:
     MediaControlMuteButtonElement(HTMLMediaElement*, MediaControlElementType);
-    virtual void defaultEventHandler(Event*);
+    virtual void *preDispatchEventHandler(Event*);
 
 
 private:
@@ -198,7 +199,7 @@
 private:
     MediaControlPanelMuteButtonElement(HTMLMediaElement*, MediaControls*);
 
-    virtual void defaultEventHandler(Event*);
+    virtual void *preDispatchEventHandler(Event*);
     virtual const AtomicString& shadowPseudoId() const;
 
     MediaControls* m_controls;
@@ -223,7 +224,7 @@
 public:
     static PassRefPtr<MediaControlPlayButtonElement> create(HTMLMediaElement*);
 
-    virtual void defaultEventHandler(Event*);
+    virtual void *preDispatchEventHandler(Event*);
     virtual void updateDisplayType();
 
 private:
@@ -236,7 +237,7 @@
 
 class MediaControlSeekButtonElement : public MediaControlInputElement {
 public:
-    virtual void defaultEventHandler(Event*);
+    virtual void *preDispatchEventHandler(Event*);
 
 protected:
     MediaControlSeekButtonElement(HTMLMediaElement*, MediaControlElementType);
@@ -284,7 +285,7 @@
 public:
     static PassRefPtr<MediaControlRewindButtonElement> create(HTMLMediaElement*);
 
-    virtual void defaultEventHandler(Event*);
+    virtual void *preDispatchEventHandler(Event*);
 
 private:
     MediaControlRewindButtonElement(HTMLMediaElement*);
@@ -298,7 +299,7 @@
 public:
     static PassRefPtr<MediaControlReturnToRealtimeButtonElement> create(HTMLMediaElement*);
 
-    virtual void defaultEventHandler(Event*);
+    virtual void *preDispatchEventHandler(Event*);
 
 private:
     MediaControlReturnToRealtimeButtonElement(HTMLMediaElement*);
@@ -312,7 +313,7 @@
 public:
     static PassRefPtr<MediaControlToggleClosedCaptionsButtonElement> create(HTMLMediaElement*);
 
-    virtual void defaultEventHandler(Event*);
+    virtual void *preDispatchEventHandler(Event*);
     virtual void updateDisplayType();
 
 private:
@@ -327,7 +328,7 @@
 public:
     static PassRefPtr<MediaControlTimelineElement> create(HTMLMediaElement*, MediaControls*);
 
-    virtual void defaultEventHandler(Event*);
+    virtual void *preDispatchEventHandler(Event*);
     void setPosition(float);
     void setDuration(float);
 
@@ -345,7 +346,7 @@
 public:
     static PassRefPtr<MediaControlVolumeSliderElement> create(HTMLMediaElement*);
 
-    virtual void defaultEventHandler(Event*);
+    virtual void *preDispatchEventHandler(Event*);
     void setVolume(float);
 
 protected:
@@ -361,7 +362,7 @@
 public:
     static PassRefPtr<MediaControlFullscreenButtonElement> create(HTMLMediaElement*, MediaControls*);
 
-    virtual void defaultEventHandler(Event*);
+    virtual void *preDispatchEventHandler(Event*);
 
 private:
     MediaControlFullscreenButtonElement(HTMLMediaElement*, MediaControls*);
@@ -389,7 +390,7 @@
 public:
     static PassRefPtr<MediaControlFullscreenVolumeMinButtonElement> create(HTMLMediaElement*);
     
-    virtual void defaultEventHandler(Event*);
+    virtual void *preDispatchEventHandler(Event*);
     
 private:
     MediaControlFullscreenVolumeMinButtonElement(HTMLMediaElement*);
@@ -403,7 +404,7 @@
 public:
     static PassRefPtr<MediaControlFullscreenVolumeMaxButtonElement> create(HTMLMediaElement*);
     
-    virtual void defaultEventHandler(Event*);
+    virtual void *preDispatchEventHandler(Event*);
     
 private:
     MediaControlFullscreenVolumeMaxButtonElement(HTMLMediaElement*);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to