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*);