Title: [100408] trunk/Source/WebCore
Revision
100408
Author
[email protected]
Date
2011-11-15 22:46:27 -0800 (Tue, 15 Nov 2011)

Log Message

Incorrect type checks in RenderTheme media code
https://bugs.webkit.org/show_bug.cgi?id=72184

Reviewed by Eric Carlson.

No tests added. Ideally this patch should be revised to add tests!

* accessibility/AccessibilityMediaControls.cpp:
(WebCore::AccessibilityMediaControl::create): Use mediaControlElementType.
(WebCore::AccessibilityMediaControl::controlType): Ditto.
(WebCore::AccessibilityMediaTimeline::valueDescription): Use early return
rather than an assertion to check type of input element.

* html/shadow/MediaControlElements.cpp:
(WebCore::mediaControlElementType): Added. A type-safe way to get the
media control element type after checking isMediaControlElement but with
no other assumptions.
* html/shadow/MediaControlElements.h: Added mediaControlElementType.

* platform/efl/RenderThemeEfl.cpp:
(WebCore::RenderThemeEfl::paintMediaPlayButton): Use mediaControlElementType.
(WebCore::RenderThemeEfl::paintMediaSeekBackButton): Use mediaControlElementType.
(WebCore::RenderThemeEfl::paintMediaSeekForwardButton): Use mediaControlElementType.
* platform/gtk/RenderThemeGtk.cpp:
(WebCore::RenderThemeGtk::paintMediaPlayButton): Check isMediaControlElement and
use mediaControlElementType.
* rendering/RenderThemeMac.mm:
(WebCore::RenderThemeMac::paintMediaMuteButton): Ditto. Also remove uneeded
redundant null check.
(WebCore::RenderThemeMac::paintMediaPlayButton): Ditto.
(WebCore::RenderThemeMac::paintMediaToggleClosedCaptionsButton): Ditto.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (100407 => 100408)


--- trunk/Source/WebCore/ChangeLog	2011-11-16 06:41:17 UTC (rev 100407)
+++ trunk/Source/WebCore/ChangeLog	2011-11-16 06:46:27 UTC (rev 100408)
@@ -1,3 +1,37 @@
+2011-11-15  Darin Adler  <[email protected]>
+
+        Incorrect type checks in RenderTheme media code
+        https://bugs.webkit.org/show_bug.cgi?id=72184
+
+        Reviewed by Eric Carlson.
+
+        No tests added. Ideally this patch should be revised to add tests!
+
+        * accessibility/AccessibilityMediaControls.cpp:
+        (WebCore::AccessibilityMediaControl::create): Use mediaControlElementType.
+        (WebCore::AccessibilityMediaControl::controlType): Ditto.
+        (WebCore::AccessibilityMediaTimeline::valueDescription): Use early return
+        rather than an assertion to check type of input element.
+
+        * html/shadow/MediaControlElements.cpp:
+        (WebCore::mediaControlElementType): Added. A type-safe way to get the
+        media control element type after checking isMediaControlElement but with
+        no other assumptions.
+        * html/shadow/MediaControlElements.h: Added mediaControlElementType.
+
+        * platform/efl/RenderThemeEfl.cpp:
+        (WebCore::RenderThemeEfl::paintMediaPlayButton): Use mediaControlElementType.
+        (WebCore::RenderThemeEfl::paintMediaSeekBackButton): Use mediaControlElementType.
+        (WebCore::RenderThemeEfl::paintMediaSeekForwardButton): Use mediaControlElementType.
+        * platform/gtk/RenderThemeGtk.cpp:
+        (WebCore::RenderThemeGtk::paintMediaPlayButton): Check isMediaControlElement and
+        use mediaControlElementType.
+        * rendering/RenderThemeMac.mm:
+        (WebCore::RenderThemeMac::paintMediaMuteButton): Ditto. Also remove uneeded
+        redundant null check.
+        (WebCore::RenderThemeMac::paintMediaPlayButton): Ditto.
+        (WebCore::RenderThemeMac::paintMediaToggleClosedCaptionsButton): Ditto.
+
 2011-11-15  Jeff Timanus  <[email protected]>
 
         [chromium] During tear down, prevent the WebGLLayerChromium instance from attempting to stop a timer for a NULL context.

Modified: trunk/Source/WebCore/accessibility/AccessibilityMediaControls.cpp (100407 => 100408)


--- trunk/Source/WebCore/accessibility/AccessibilityMediaControls.cpp	2011-11-16 06:41:17 UTC (rev 100407)
+++ trunk/Source/WebCore/accessibility/AccessibilityMediaControls.cpp	2011-11-16 06:46:27 UTC (rev 100408)
@@ -53,17 +53,9 @@
 
 PassRefPtr<AccessibilityObject> AccessibilityMediaControl::create(RenderObject* renderer)
 {
-    ASSERT(renderer->node() && renderer->node()->isMediaControlElement());
+    ASSERT(renderer->node());
 
-    Node* node = renderer->node();
-    MediaControlElementType controlType;
-
-    if (node->hasTagName(inputTag))
-        controlType = static_cast<MediaControlInputElement*>(node)->displayType();
-    else
-        controlType = static_cast<MediaControlElement*>(node)->displayType();
-
-    switch (controlType) {
+    switch (mediaControlElementType(renderer->node())) {
     case MediaSlider:
         return AccessibilityMediaTimeline::create(renderer);
 
@@ -84,12 +76,7 @@
     if (!renderer() || !renderer()->node())
         return MediaTimelineContainer; // Timeline container is not accessible.
 
-    Node* node = renderer()->node();
-
-    if (node->hasTagName(inputTag))
-        return static_cast<MediaControlInputElement*>(node)->displayType();
-
-    return static_cast<MediaControlElement*>(node)->displayType();
+    return mediaControlElementType(renderer()->node());
 }
 
 String AccessibilityMediaControl::controlTypeName() const
@@ -264,9 +251,11 @@
 
 String AccessibilityMediaTimeline::valueDescription() const
 {
-    ASSERT(m_renderer->node()->hasTagName(inputTag));
+    Node* node = m_renderer->node();
+    if (!node->hasTagName(inputTag))
+        return String();
 
-    float time = static_cast<HTMLInputElement*>(m_renderer->node())->value().toFloat();
+    float time = static_cast<HTMLInputElement*>(node)->value().toFloat();
     return localizedMediaTimeDescription(time);
 }
 

Modified: trunk/Source/WebCore/html/shadow/MediaControlElements.cpp (100407 => 100408)


--- trunk/Source/WebCore/html/shadow/MediaControlElements.cpp	2011-11-16 06:41:17 UTC (rev 100407)
+++ trunk/Source/WebCore/html/shadow/MediaControlElements.cpp	2011-11-16 06:46:27 UTC (rev 100408)
@@ -54,6 +54,12 @@
 
 using namespace HTMLNames;
 
+// FIXME: These constants may need to be tweaked to better match the seeking in the QuickTime plug-in.
+static const float cSkipRepeatDelay = 0.1f;
+static const float cSkipTime = 0.2f;
+static const float cScanRepeatDelay = 1.5f;
+static const float cScanMaximumRate = 8;
+
 HTMLMediaElement* toParentMediaElement(Node* node)
 {
     Node* mediaNode = node ? node->shadowAncestorNode() : 0;
@@ -63,11 +69,14 @@
     return static_cast<HTMLMediaElement*>(mediaNode);
 }
 
-// FIXME: These constants may need to be tweaked to better match the seeking in the QuickTime plug-in.
-static const float cSkipRepeatDelay = 0.1f;
-static const float cSkipTime = 0.2f;
-static const float cScanRepeatDelay = 1.5f;
-static const float cScanMaximumRate = 8;
+MediaControlElementType mediaControlElementType(Node* node)
+{
+    ASSERT(node->isMediaControlElement());
+    HTMLElement* element = toHTMLElement(node);
+    if (element->hasTagName(inputTag))
+        return static_cast<MediaControlInputElement*>(element)->displayType();
+    return static_cast<MediaControlElement*>(element)->displayType();
+}
 
 // ----------------------------
 

Modified: trunk/Source/WebCore/html/shadow/MediaControlElements.h (100407 => 100408)


--- trunk/Source/WebCore/html/shadow/MediaControlElements.h	2011-11-16 06:41:17 UTC (rev 100407)
+++ trunk/Source/WebCore/html/shadow/MediaControlElements.h	2011-11-16 06:46:27 UTC (rev 100408)
@@ -73,6 +73,8 @@
 HTMLMediaElement* toParentMediaElement(Node*);
 inline HTMLMediaElement* toParentMediaElement(RenderObject* renderer) { return toParentMediaElement(renderer->node()); }
 
+MediaControlElementType mediaControlElementType(Node*);
+
 // ----------------------------
 
 class MediaControlElement : public HTMLDivElement {

Modified: trunk/Source/WebCore/platform/efl/RenderThemeEfl.cpp (100407 => 100408)


--- trunk/Source/WebCore/platform/efl/RenderThemeEfl.cpp	2011-11-16 06:41:17 UTC (rev 100407)
+++ trunk/Source/WebCore/platform/efl/RenderThemeEfl.cpp	2011-11-16 06:46:27 UTC (rev 100408)
@@ -1202,8 +1202,7 @@
     if (!node || !node->isMediaControlElement())
         return false;
 
-    MediaControlPlayButtonElement* button = static_cast<MediaControlPlayButtonElement*>(node);
-    if (!emitMediaButtonSignal(PlayPauseButton, button->displayType(), rect))
+    if (!emitMediaButtonSignal(PlayPauseButton, mediaControlElementType(node), rect))
         return false;
 
     return paintThemePart(object, PlayPauseButton, info, rect);
@@ -1215,8 +1214,7 @@
     if (!node || !node->isMediaControlElement())
         return 0;
 
-    MediaControlSeekButtonElement* button = static_cast<MediaControlSeekButtonElement*>(node);
-    if (!emitMediaButtonSignal(SeekBackwardButton, button->displayType(), rect))
+    if (!emitMediaButtonSignal(SeekBackwardButton, mediaControlElementType(node), rect))
         return false;
 
     return paintThemePart(object, SeekBackwardButton, info, rect);
@@ -1228,8 +1226,7 @@
     if (!node || !node->isMediaControlElement())
         return 0;
 
-    MediaControlSeekButtonElement* button = static_cast<MediaControlSeekButtonElement*>(node);
-    if (!emitMediaButtonSignal(SeekForwardButton, button->displayType(), rect))
+    if (!emitMediaButtonSignal(SeekForwardButton, mediaControlElementType(node), rect))
         return false;
 
     return paintThemePart(object, SeekForwardButton, info, rect);

Modified: trunk/Source/WebCore/platform/gtk/RenderThemeGtk.cpp (100407 => 100408)


--- trunk/Source/WebCore/platform/gtk/RenderThemeGtk.cpp	2011-11-16 06:41:17 UTC (rev 100407)
+++ trunk/Source/WebCore/platform/gtk/RenderThemeGtk.cpp	2011-11-16 06:46:27 UTC (rev 100408)
@@ -525,9 +525,10 @@
     Node* node = renderObject->node();
     if (!node)
         return false;
+    if (!node->isMediaControlElement())
+        return false;
 
-    MediaControlPlayButtonElement* button = static_cast<MediaControlPlayButtonElement*>(node);
-    return paintMediaButton(renderObject, paintInfo.context, rect, button->displayType() == MediaPlayButton ? GTK_STOCK_MEDIA_PLAY : GTK_STOCK_MEDIA_PAUSE);
+    return paintMediaButton(renderObject, paintInfo.context, rect, mediaControlElementType(node) == MediaPlayButton ? GTK_STOCK_MEDIA_PLAY : GTK_STOCK_MEDIA_PAUSE);
 }
 
 bool RenderThemeGtk::paintMediaSeekBackButton(RenderObject* renderObject, const PaintInfo& paintInfo, const IntRect& rect)

Modified: trunk/Source/WebCore/rendering/RenderThemeMac.mm (100407 => 100408)


--- trunk/Source/WebCore/rendering/RenderThemeMac.mm	2011-11-16 06:41:17 UTC (rev 100407)
+++ trunk/Source/WebCore/rendering/RenderThemeMac.mm	2011-11-16 06:46:27 UTC (rev 100408)
@@ -1774,10 +1774,9 @@
     if (!mediaNode || (!mediaNode->hasTagName(videoTag) && !mediaNode->hasTagName(audioTag)))
         return false;
 
-    if (MediaControlMuteButtonElement* btn = static_cast<MediaControlMuteButtonElement*>(node)) {
+    if (node->isMediaControlElement()) {
         LocalCurrentGraphicsContext localContext(paintInfo.context);
-        wkDrawMediaUIPart(btn->displayType(), mediaControllerTheme(), localContext.cgContext(), r, getMediaUIPartStateFlags(node));
-
+        wkDrawMediaUIPart(mediaControlElementType(node), mediaControllerTheme(), localContext.cgContext(), r, getMediaUIPartStateFlags(node));
     }
     return false;
 }
@@ -1789,9 +1788,9 @@
     if (!mediaNode || (!mediaNode->hasTagName(videoTag) && !mediaNode->hasTagName(audioTag)))
         return false;
 
-    if (MediaControlPlayButtonElement* btn = static_cast<MediaControlPlayButtonElement*>(node)) {
+    if (node->isMediaControlElement()) {
         LocalCurrentGraphicsContext localContext(paintInfo.context);
-        wkDrawMediaUIPart(btn->displayType(), mediaControllerTheme(), localContext.cgContext(), r, getMediaUIPartStateFlags(node));
+        wkDrawMediaUIPart(mediaControlElementType(node), mediaControllerTheme(), localContext.cgContext(), r, getMediaUIPartStateFlags(node));
     }
     return false;
 }
@@ -1881,17 +1880,14 @@
 
 bool RenderThemeMac::paintMediaToggleClosedCaptionsButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
 {
-    HTMLInputElement* node = static_cast<HTMLInputElement*>(o->node());
+    Node* node = o->node();
     if (!node)
         return false;
-    
-    MediaControlToggleClosedCaptionsButtonElement* btn = static_cast<MediaControlToggleClosedCaptionsButtonElement*>(node);
-    if (!btn)
+    if (!node->isMediaControlElement())
         return false;
 
     LocalCurrentGraphicsContext localContext(paintInfo.context);
-    wkDrawMediaUIPart(btn->displayType(), mediaControllerTheme(), localContext.cgContext(), r, getMediaUIPartStateFlags(node));
-
+    wkDrawMediaUIPart(mediaControlElementType(node), mediaControllerTheme(), localContext.cgContext(), r, getMediaUIPartStateFlags(node));
     return false;
 }
  
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to