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;
}