Reviewed by Simon Fraser.
<rdar://problem/
6518119>
Add a rewind button and hide the timeline for live broadcasts when
in MediaUI mode.
* css/CSSPrimitiveValueMappings.h:
(WebCore::CSSPrimitiveValue::CSSPrimitiveValue): Add the new pseudo element.
* css/CSSSelector.cpp:
(WebCore::CSSSelector::extractPseudoType): Ditto.
* css/CSSSelector.h:
* css/CSSStyleSelector.cpp:
(WebCore::CSSStyleSelector::SelectorChecker::checkOneSelector): Ditto.
* css/CSSValueKeywords.in: Ditto.
* css/mediaControls.css: Ditto.
* css/mediaControlsQT.css: Ditto.
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::rewind): New.
(WebCore::HTMLMediaElement::returnToRealTime): New.
(WebCore::HTMLMediaElement::isStreaming): New.
* html/HTMLMediaElement.h:
* page/mac/WebCoreViewFactory.h: Declare mediaElementLoadingStateText and mediaElementLiveBroadcastStateText.
* platform/LocalizedStrings.h: Add localized media state messages.
* platform/ThemeTypes.h: Add the new pseudo element.
* platform/mac/LocalizedStringsMac.mm:
(WebCore::mediaElementLoadingStateText): Add localized media state.
(WebCore::mediaElementLiveBroadcastStateText): Ditto.
* platform/mac/WebCoreSystemInterface.h: Change BOOL param wkDrawMediaUIPart to an int to support
multiple states.
* platform/mac/WebCoreSystemInterface.mm: Ditto.
* rendering/MediaControlElements.cpp:
(WebCore::MediaControlElement::MediaControlElement): Deal with new elements.
(WebCore::MediaControlElement::attachToParent): Ditto.
(WebCore::MediaControlElement::update): Ditto.
(WebCore::MediaControlElement::updateStyle): Ditto.
(WebCore::MediaControlTimelineContainerElement::MediaControlTimelineContainerElement): Ditto.
(WebCore::MediaControlTimelineContainerElement::rendererIsNeeded): Ditto.
(WebCore::MediaControlStatusDisplayElement::MediaControlStatusDisplayElement): Ditto.
(WebCore::MediaControlStatusDisplayElement::update): Ditto.
(WebCore::MediaControlStatusDisplayElement::rendererIsNeeded): Ditto.
(WebCore::MediaControlInputElement::MediaControlInputElement): Ditto.
(WebCore::MediaControlInputElement::attachToParent): Ditto.
(WebCore::MediaControlInputElement::updateStyle): Ditto.
(WebCore::MediaControlRewindButtonElement::MediaControlRewindButtonElement): Ditto.
(WebCore::MediaControlRewindButtonElement::defaultEventHandler): Ditto.
(WebCore::MediaControlReturnToRealtimeButtonElement::MediaControlReturnToRealtimeButtonElement): Ditto.
(WebCore::MediaControlReturnToRealtimeButtonElement::defaultEventHandler): Ditto.
(WebCore::MediaControlReturnToRealtimeButtonElement::rendererIsNeeded): Ditto.
(WebCore::MediaControlTimelineElement::defaultEventHandler): Ditto.
(WebCore::MediaControlTimelineElement::update): Ditto.
(WebCore::MediaControlFullscreenButtonElement::rendererIsNeeded): Ditto.
* rendering/MediaControlElements.h: Ditto.
* rendering/RenderMedia.cpp:
(WebCore::RenderMedia::styleDidChange): Deal with the new elements.
(WebCore::RenderMedia::createPanel): Ditto.
(WebCore::RenderMedia::createRewindButton): Ditto.
(WebCore::RenderMedia::createReturnToRealtimeButton): Ditto.
(WebCore::RenderMedia::createStatusDisplay): Ditto.
(WebCore::RenderMedia::createTimelineContainer): Ditto.
(WebCore::RenderMedia::createCurrentTimeDisplay): Ditto.
(WebCore::RenderMedia::createTimeRemainingDisplay): Ditto.
(WebCore::RenderMedia::updateControls): Ditto.
(WebCore::RenderMedia::forwardEvent): Ditto.
* rendering/RenderMedia.h:
* rendering/RenderTheme.cpp:
(WebCore::RenderTheme::paint): Deal with the new elements.
* rendering/RenderTheme.h:
(WebCore::RenderTheme::paintMediaRewindButton): Deal with the new elements.
(WebCore::RenderTheme::paintMediaReturnToRealtimeButton): Ditto.
(WebCore::RenderTheme::paintMediaControlsBackground): Ditto.
* rendering/RenderThemeMac.h:
* rendering/RenderThemeMac.mm:
(WebCore::RenderThemeMac::paintMediaRewindButton): Deal with the new elements.
(WebCore::RenderThemeMac::paintMediaReturnToRealtimeButton): Ditto.
(WebCore::RenderThemeMac::paintMediaControlsBackground): Ditto.
* rendering/style/RenderStyleConstants.h: Add constants for the new elements.
2009-07-02 Pierre d'Herbemont <pdherbemont@apple.com>
Reviewed by Simon Fraser.
<rdar://problem/
6518119>
Add localized strings for media controller status messages.
* English.lproj/Localizable.strings: Localized text.
2009-07-02 Pierre d'Herbemont <pdherbemont@apple.com>
Reviewed by Simon Fraser.
<rdar://problem/
6518119>
Add localized strings for media controller status.
* WebCoreSupport/WebViewFactory.mm: Add new localized text.
(-[WebViewFactory mediaElementLoadingStateText]):
(-[WebViewFactory mediaElementLiveBroadcastStateText]):
2009-07-02 Pierre d'Herbemont <pdherbemont@apple.com>
Reviewed by Simon Fraser.
Update WebKitSystemInterface for <rdar://problem/
6518119>
* WebKitSystemInterface.h:
* libWebKitSystemInterfaceLeopard.a:
* libWebKitSystemInterfaceSnowLeopard.a:
* libWebKitSystemInterfaceTiger.a:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@45474
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2009-07-02 Eric Carlson <eric.carlson@apple.com>
+
+ Reviewed by Simon Fraser.
+
+ <rdar://problem/6518119>
+
+ Delay dumping the render tree because the media controller may not be done with
+ layout immediately.
+
+ * media/video-empty-source.html:
+
2009-07-02 Antonio Gomes <antonio.gomes@openbossa.org>
Reviewed by Simon Hausmann.
-<body>
-<p>Slider drawing with no source. The controls should render correctly.</p>
-<video src="" controls style="border:1px solid black"></video>
-</div>
-</body>
+<html>
+ <head>
+ <script>
+ if (window.layoutTestController)
+ layoutTestController.waitUntilDone();
+
+ function test()
+ {
+ if (window.layoutTestController)
+ layoutTestController.notifyDone();
+ }
+ </script>
+ </head>
+ <body onload="setTimeout(test, 250)">
+ <p>Slider drawing with no source. The controls should render correctly.</p>
+ <video src="" controls style="border:1px solid black"></video>
+ </body>
+</html>
+2009-07-02 Pierre d'Herbemont <pdherbemont@apple.com>
+
+ Reviewed by Simon Fraser.
+
+ <rdar://problem/6518119>
+
+ Add a rewind button and hide the timeline for live broadcasts when
+ in MediaUI mode.
+
+ * css/CSSPrimitiveValueMappings.h:
+ (WebCore::CSSPrimitiveValue::CSSPrimitiveValue): Add the new pseudo element.
+
+ * css/CSSSelector.cpp:
+ (WebCore::CSSSelector::extractPseudoType): Ditto.
+ * css/CSSSelector.h:
+
+ * css/CSSStyleSelector.cpp:
+ (WebCore::CSSStyleSelector::SelectorChecker::checkOneSelector): Ditto.
+
+ * css/CSSValueKeywords.in: Ditto.
+ * css/mediaControls.css: Ditto.
+ * css/mediaControlsQT.css: Ditto.
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::rewind): New.
+ (WebCore::HTMLMediaElement::returnToRealTime): New.
+ (WebCore::HTMLMediaElement::isStreaming): New.
+ * html/HTMLMediaElement.h:
+
+ * page/mac/WebCoreViewFactory.h: Declare mediaElementLoadingStateText and mediaElementLiveBroadcastStateText.
+
+ * platform/LocalizedStrings.h: Add localized media state messages.
+
+ * platform/ThemeTypes.h: Add the new pseudo element.
+
+ * platform/mac/LocalizedStringsMac.mm:
+ (WebCore::mediaElementLoadingStateText): Add localized media state.
+ (WebCore::mediaElementLiveBroadcastStateText): Ditto.
+
+ * platform/mac/WebCoreSystemInterface.h: Change BOOL param wkDrawMediaUIPart to an int to support
+ multiple states.
+ * platform/mac/WebCoreSystemInterface.mm: Ditto.
+
+ * rendering/MediaControlElements.cpp:
+ (WebCore::MediaControlElement::MediaControlElement): Deal with new elements.
+ (WebCore::MediaControlElement::attachToParent): Ditto.
+ (WebCore::MediaControlElement::update): Ditto.
+ (WebCore::MediaControlElement::updateStyle): Ditto.
+ (WebCore::MediaControlTimelineContainerElement::MediaControlTimelineContainerElement): Ditto.
+ (WebCore::MediaControlTimelineContainerElement::rendererIsNeeded): Ditto.
+ (WebCore::MediaControlStatusDisplayElement::MediaControlStatusDisplayElement): Ditto.
+ (WebCore::MediaControlStatusDisplayElement::update): Ditto.
+ (WebCore::MediaControlStatusDisplayElement::rendererIsNeeded): Ditto.
+ (WebCore::MediaControlInputElement::MediaControlInputElement): Ditto.
+ (WebCore::MediaControlInputElement::attachToParent): Ditto.
+ (WebCore::MediaControlInputElement::updateStyle): Ditto.
+ (WebCore::MediaControlRewindButtonElement::MediaControlRewindButtonElement): Ditto.
+ (WebCore::MediaControlRewindButtonElement::defaultEventHandler): Ditto.
+ (WebCore::MediaControlReturnToRealtimeButtonElement::MediaControlReturnToRealtimeButtonElement): Ditto.
+ (WebCore::MediaControlReturnToRealtimeButtonElement::defaultEventHandler): Ditto.
+ (WebCore::MediaControlReturnToRealtimeButtonElement::rendererIsNeeded): Ditto.
+ (WebCore::MediaControlTimelineElement::defaultEventHandler): Ditto.
+ (WebCore::MediaControlTimelineElement::update): Ditto.
+ (WebCore::MediaControlFullscreenButtonElement::rendererIsNeeded): Ditto.
+ * rendering/MediaControlElements.h: Ditto.
+
+ * rendering/RenderMedia.cpp:
+ (WebCore::RenderMedia::styleDidChange): Deal with the new elements.
+ (WebCore::RenderMedia::createPanel): Ditto.
+ (WebCore::RenderMedia::createRewindButton): Ditto.
+ (WebCore::RenderMedia::createReturnToRealtimeButton): Ditto.
+ (WebCore::RenderMedia::createStatusDisplay): Ditto.
+ (WebCore::RenderMedia::createTimelineContainer): Ditto.
+ (WebCore::RenderMedia::createCurrentTimeDisplay): Ditto.
+ (WebCore::RenderMedia::createTimeRemainingDisplay): Ditto.
+ (WebCore::RenderMedia::updateControls): Ditto.
+ (WebCore::RenderMedia::forwardEvent): Ditto.
+ * rendering/RenderMedia.h:
+
+ * rendering/RenderTheme.cpp:
+ (WebCore::RenderTheme::paint): Deal with the new elements.
+
+ * rendering/RenderTheme.h:
+ (WebCore::RenderTheme::paintMediaRewindButton): Deal with the new elements.
+ (WebCore::RenderTheme::paintMediaReturnToRealtimeButton): Ditto.
+ (WebCore::RenderTheme::paintMediaControlsBackground): Ditto.
+
+ * rendering/RenderThemeMac.h:
+ * rendering/RenderThemeMac.mm:
+ (WebCore::RenderThemeMac::paintMediaRewindButton): Deal with the new elements.
+ (WebCore::RenderThemeMac::paintMediaReturnToRealtimeButton): Ditto.
+ (WebCore::RenderThemeMac::paintMediaControlsBackground): Ditto.
+
+ * rendering/style/RenderStyleConstants.h: Add constants for the new elements.
+
2009-07-01 John Abd-El-Malek <jam@chromium.org>
Reviewed by Darin Fisher.
case MediaSeekForwardButtonPart:
m_value.ident = CSSValueMediaSeekForwardButton;
break;
+ case MediaRewindButtonPart:
+ m_value.ident = CSSValueMediaRewindButton;
+ break;
+ case MediaReturnToRealtimeButtonPart:
+ m_value.ident = CSSValueMediaReturnToRealtimeButton;
+ break;
case MediaSliderPart:
m_value.ident = CSSValueMediaSlider;
break;
case MediaSliderThumbPart:
m_value.ident = CSSValueMediaSliderthumb;
break;
- case MediaTimelineContainerPart:
- m_value.ident = CSSValueMediaTimelineContainer;
+ case MediaControlsBackgroundPart:
+ m_value.ident = CSSValueMediaControlsBackground;
break;
case MediaCurrentTimePart:
m_value.ident = CSSValueMediaCurrentTimeDisplay;
DEFINE_STATIC_LOCAL(AtomicString, mediaControlsTimeline, ("-webkit-media-controls-timeline"));
DEFINE_STATIC_LOCAL(AtomicString, mediaControlsSeekBackButton, ("-webkit-media-controls-seek-back-button"));
DEFINE_STATIC_LOCAL(AtomicString, mediaControlsSeekForwardButton, ("-webkit-media-controls-seek-forward-button"));
+ DEFINE_STATIC_LOCAL(AtomicString, mediaControlsRewindButton, ("-webkit-media-controls-rewind-button"));
+ DEFINE_STATIC_LOCAL(AtomicString, mediaControlsReturnToRealtimeButton, ("-webkit-media-controls-return-to-realtime-button"));
+ DEFINE_STATIC_LOCAL(AtomicString, mediaControlsStatusDisplay, ("-webkit-media-controls-status-display"));
DEFINE_STATIC_LOCAL(AtomicString, mediaControlsFullscreenButton, ("-webkit-media-controls-fullscreen-button"));
DEFINE_STATIC_LOCAL(AtomicString, mediaControlsTimelineContainer, ("-webkit-media-controls-timeline-container"));
DEFINE_STATIC_LOCAL(AtomicString, mediaControlsCurrentTimeDisplay, ("-webkit-media-controls-current-time-display"));
} else if (m_value == mediaControlsSeekForwardButton) {
m_pseudoType = PseudoMediaControlsSeekForwardButton;
element = true;
+ } else if (m_value == mediaControlsRewindButton) {
+ m_pseudoType = PseudoMediaControlsRewindButton;
+ element = true;
+ } else if (m_value == mediaControlsReturnToRealtimeButton) {
+ m_pseudoType = PseudoMediaControlsReturnToRealtimeButton;
+ element = true;
+ } else if (m_value == mediaControlsStatusDisplay) {
+ m_pseudoType = PseudoMediaControlsStatusDisplay;
+ element = true;
} else if (m_value == mediaControlsFullscreenButton) {
m_pseudoType = PseudoMediaControlsFullscreenButton;
element = true;
PseudoMediaControlsTimeline,
PseudoMediaControlsSeekBackButton,
PseudoMediaControlsSeekForwardButton,
+ PseudoMediaControlsRewindButton,
+ PseudoMediaControlsReturnToRealtimeButton,
+ PseudoMediaControlsStatusDisplay,
PseudoMediaControlsFullscreenButton
};
case CSSSelector::PseudoMediaControlsSeekForwardButton:
dynamicPseudo = MEDIA_CONTROLS_SEEK_FORWARD_BUTTON;
return true;
+ case CSSSelector::PseudoMediaControlsRewindButton:
+ dynamicPseudo = MEDIA_CONTROLS_REWIND_BUTTON;
+ return true;
+ case CSSSelector::PseudoMediaControlsReturnToRealtimeButton:
+ dynamicPseudo = MEDIA_CONTROLS_RETURN_TO_REALTIME_BUTTON;
+ return true;
+ case CSSSelector::PseudoMediaControlsStatusDisplay:
+ dynamicPseudo = MEDIA_CONTROLS_STATUS_DISPLAY;
+ return true;
case CSSSelector::PseudoMediaControlsFullscreenButton:
dynamicPseudo = MEDIA_CONTROLS_FULLSCREEN_BUTTON;
return true;
media-play-button
media-seek-back-button
media-seek-forward-button
+media-rewind-button
+media-return-to-realtime-button
media-slider
media-sliderthumb
-media-timeline-container
+media-controls-background
media-current-time-display
media-time-remaining-display
menulist
audio::-webkit-media-controls-panel, video::-webkit-media-controls-panel {
display: -webkit-box;
-webkit-box-orient: horizontal;
+ -webkit-box-align: center;
-webkit-user-select: none;
position: absolute;
bottom: 0;
}
audio::-webkit-media-controls-timeline-container, video::-webkit-media-controls-timeline-container {
- -webkit-appearance: media-timeline-container;
+ -webkit-appearance: media-controls-background;
display: -webkit-box;
-webkit-box-orient: horizontal;
-webkit-box-align: center;
}
audio::-webkit-media-controls-fullscreen-button, video::-webkit-media-controls-fullscreen-button {
+ -webkit-appearance: media-fullscreen-button;
+ display: -webkit-box;
+ width: 16px;
+ height: 16px;
+}
+
+audio::-webkit-media-controls-rewind-button, video::-webkit-media-controls-rewind-button {
display: none;
}
+audio::-webkit-media-controls-return-to-realtime-button, video::-webkit-media-controls-return-to-realtime-button {
+ display: none;
+}
audio::-webkit-media-controls-panel, video::-webkit-media-controls-panel {
/* In mediaControls.css */
+ -webkit-appearance: media-controls-background;
height: 25px;
}
}
audio::-webkit-media-controls-mute-button, video::-webkit-media-controls-mute-button {
- -webkit-box-ordinal-group: 2; /* At the end of the controller bar */
- width: 30px;
- height: 25px;
+ -webkit-box-ordinal-group: 2; /* Before the fullscreen button */
+ width: 16px;
+ height: 16px;
+ margin-left: 7px;
+ margin-right: 7px;
}
audio::-webkit-media-controls-play-button, video::-webkit-media-controls-play-button {
- width: 30px;
- height: 25px;
+ width: 16px;
+ height: 16px;
+ margin-left: 7px;
+ margin-right: 7px;
}
audio::-webkit-media-controls-timeline-container, video::-webkit-media-controls-timeline-container {
+ -webkit-appearance: none;
height: 25px;
}
text-align: center;
overflow: hidden;
line-height: 13px;
- height: 14px;
+ height: 13px;
width: 45px;
}
text-align: center;
overflow: hidden;
line-height: 13px;
- height: 14px;
+ height: 13px;
width: 45px;
}
}
audio::-webkit-media-controls-fullscreen-button, video::-webkit-media-controls-fullscreen-button {
- display: none;
+ width: 16px;
+ height: 16px;
+ margin-left: 7px;
+ margin-right: 7px;
+ -webkit-box-ordinal-group: 3; /* At the very end */
+}
+
+audio::-webkit-media-controls-rewind-button, video::-webkit-media-controls-rewind-button {
+ -webkit-appearance: media-rewind-button;
+ display: -webkit-box;
+ width: 16px;
+ height: 16px;
+ margin-left: 7px;
+ margin-right: 7px;
+}
+
+audio::-webkit-media-controls-return-to-realtime-button, video::-webkit-media-controls-return-to-realtime-button {
+ -webkit-appearance: media-return-to-realtime-button;
+ display: -webkit-box;
+ width: 16px;
+ height: 16px;
+ margin-left: 7px;
+ margin-right: 7px;
+}
+
+audio::-webkit-media-controls-status-display, video::-webkit-media-controls-status-display {
+ -webkit-user-select: none;
+ display: -webkit-box;
+ -webkit-box-flex: 1;
+ font: -webkit-small-control;
+ color: white;
+ font-size: 0.6em;
+ line-height: 13px;
+ overflow: hidden;
+ text-shadow: 1px 1px 0px black;
+ margin-left: 10px;
+ margin-right: 10px;
}
}
}
+void HTMLMediaElement::rewind(float timeDelta)
+{
+ ExceptionCode e;
+ setCurrentTime(max(currentTime() - timeDelta, minTimeSeekable()), e);
+}
+
+void HTMLMediaElement::returnToRealtime()
+{
+ ExceptionCode e;
+ setCurrentTime(maxTimeSeekable(), e);
+}
+
void HTMLMediaElement::seek(float time, ExceptionCode& ec)
{
// 4.8.10.10. Seeking
return m_readyState;
}
+bool HTMLMediaElement::isStreaming() const
+{
+ MediaPlayer::MovieLoadType loadType = m_player ? m_player->movieLoadType() : MediaPlayer::Unknown;
+ return loadType == MediaPlayer::LiveStream;
+}
+
bool HTMLMediaElement::seeking() const
{
return m_seeking;
PassRefPtr<TimeRanges> HTMLMediaElement::seekable() const
{
// FIXME real ranges support
- if (!m_player || !m_player->maxTimeSeekable())
+ if (!maxTimeSeekable())
return TimeRanges::create();
- return TimeRanges::create(0, m_player->maxTimeSeekable());
+ return TimeRanges::create(minTimeSeekable(), maxTimeSeekable());
}
bool HTMLMediaElement::potentiallyPlaying() const
return false;
}
+float HTMLMediaElement::minTimeSeekable() const
+{
+ return 0;
+}
+
+float HTMLMediaElement::maxTimeSeekable() const
+{
+ return m_player ? m_player->maxTimeSeekable() : 0;
+}
+
void HTMLMediaElement::updateVolume()
{
if (!m_player)
virtual bool isVideo() const { return false; }
virtual bool hasVideo() const { return false; }
+ void rewind(float timeDelta);
+ void returnToRealtime();
+
virtual bool supportsFullscreen() const { return false; }
void scheduleLoad();
void load(ExceptionCode&);
String canPlayType(const String& mimeType) const;
+ bool isStreaming() const;
+
// ready state
enum ReadyState { HAVE_NOTHING, HAVE_METADATA, HAVE_CURRENT_DATA, HAVE_FUTURE_DATA, HAVE_ENOUGH_DATA };
ReadyState readyState() const;
bool stoppedDueToErrors() const;
bool pausedForUserInteraction() const;
+ float minTimeSeekable() const;
+ float maxTimeSeekable() const;
+
// Restrictions to change default behaviors. This is a effectively a compile time choice at the moment
// because there are no accessor methods.
enum BehaviorRestrictions
// FTP Directory Related
- (NSString *)unknownFileSizeText;
+- (NSString *)mediaElementLoadingStateText;
+- (NSString *)mediaElementLiveBroadcastStateText;
+
@end
@interface WebCoreViewFactory : NSObject
#endif
String imageTitle(const String& filename, const IntSize& size);
+
+ String mediaElementLoadingStateText();
+ String mediaElementLiveBroadcastStateText();
}
#endif
typedef unsigned ControlStates;
+// Must follow CSSValueKeywords.in order
enum ControlPart {
NoControlPart, CheckboxPart, RadioPart, PushButtonPart, SquareButtonPart, ButtonPart,
ButtonBevelPart, DefaultButtonPart, ListboxPart, ListItemPart,
MediaFullscreenButtonPart, MediaMuteButtonPart, MediaPlayButtonPart, MediaSeekBackButtonPart,
- MediaSeekForwardButtonPart, MediaSliderPart, MediaSliderThumbPart, MediaTimelineContainerPart,
- MediaCurrentTimePart, MediaTimeRemainingPart,
+ MediaSeekForwardButtonPart, MediaRewindButtonPart, MediaReturnToRealtimeButtonPart,
+ MediaSliderPart,
+ MediaSliderThumbPart, MediaControlsBackgroundPart,
+ MediaCurrentTimePart, MediaTimeRemainingPart,
MenulistPart, MenulistButtonPart, MenulistTextPart, MenulistTextFieldPart,
SliderHorizontalPart, SliderVerticalPart, SliderThumbHorizontalPart,
SliderThumbVerticalPart, CaretPart, SearchFieldPart, SearchFieldDecorationPart,
return String();
}
+String mediaElementLoadingStateText()
+{
+ BEGIN_BLOCK_OBJC_EXCEPTIONS;
+ return [[WebCoreViewFactory sharedFactory] mediaElementLoadingStateText];
+ END_BLOCK_OBJC_EXCEPTIONS;
+ return String();
+}
+
+String mediaElementLiveBroadcastStateText()
+{
+ BEGIN_BLOCK_OBJC_EXCEPTIONS;
+ return [[WebCoreViewFactory sharedFactory] mediaElementLiveBroadcastStateText];
+ END_BLOCK_OBJC_EXCEPTIONS;
+ return String();
+}
+
}
extern NSFont* (*wkGetFontInLanguageForCharacter)(NSFont*, UniChar);
extern BOOL (*wkGetGlyphTransformedAdvances)(CGFontRef, NSFont*, CGAffineTransform*, ATSGlyphRef*, CGSize* advance);
extern void (*wkDrawMediaSliderTrack)(int themeStyle, CGContextRef context, CGRect rect, float timeLoaded, float currentTime, float duration);
-extern void (*wkDrawMediaUIPart)(int part, int themeStyle, CGContextRef context, CGRect rect, BOOL active);
+extern void (*wkDrawMediaUIPart)(int part, int themeStyle, CGContextRef context, CGRect rect, int state);
extern NSString* (*wkGetPreferredExtensionForMIMEType)(NSString*);
extern NSArray* (*wkGetExtensionsForMIMEType)(NSString*);
extern NSString* (*wkGetMIMETypeForExtension)(NSString*);
BOOL (*wkGetGlyphTransformedAdvances)(CGFontRef, NSFont*, CGAffineTransform*, ATSGlyphRef*, CGSize* advance);
void (*wkDrawMediaSliderTrack)(int themeStyle, CGContextRef context, CGRect rect, float timeLoaded, float currentTime, float duration);
BOOL (*wkHitTestMediaUIPart)(int part, int themeStyle, CGRect bounds, CGPoint point);
-void (*wkDrawMediaUIPart)(int part, int themeStyle, CGContextRef context, CGRect rect, BOOL active);
+void (*wkDrawMediaUIPart)(int part, int themeStyle, CGContextRef context, CGRect rect, int state);
void (*wkMeasureMediaUIPart)(int part, int themeStyle, CGRect *bounds, CGSize *naturalSize);
NSString* (*wkGetPreferredExtensionForMIMEType)(NSString*);
NSArray* (*wkGetExtensionsForMIMEType)(NSString*);
#include "MediaControlElements.h"
+#import "LocalizedStrings.h"
#include "EventNames.h"
#include "FloatConversion.h"
#include "Frame.h"
#include "RenderMedia.h"
#include "RenderSlider.h"
#include "RenderTheme.h"
+#include "CString.h"
namespace WebCore {
}
}
+
// ----------------------------
+
-MediaTextDisplayElement::MediaTextDisplayElement(Document* doc, PseudoId pseudo, HTMLMediaElement* mediaElement)
+MediaControlElement::MediaControlElement(Document* doc, PseudoId pseudo, HTMLMediaElement* mediaElement)
: HTMLDivElement(divTag, doc)
, m_mediaElement(mediaElement)
, m_pseudoStyleId(pseudo)
{
- RenderStyle* style = m_mediaElement->renderer()->getCachedPseudoStyle(m_pseudoStyleId);
- RenderObject* renderer = createRenderer(m_mediaElement->renderer()->renderArena(), style);
- if (renderer) {
- setRenderer(renderer);
- renderer->setStyle(style);
- }
- setAttached();
setInDocument(true);
}
-void MediaTextDisplayElement::attachToParent(Element* parent)
+void MediaControlElement::attachToParent(Element* parent)
{
parent->addChild(this);
- if (renderer() && parent->renderer())
- parent->renderer()->addChild(renderer());
}
-void MediaTextDisplayElement::update()
+void MediaControlElement::update()
{
if (renderer())
renderer()->updateFromElement();
updateStyle();
}
-void MediaTextDisplayElement::updateStyle()
+void MediaControlElement::updateStyle()
{
- if (renderer() && m_mediaElement->renderer()) {
- RenderStyle* style = m_mediaElement->renderer()->getCachedPseudoStyle(m_pseudoStyleId);
+ if (!m_mediaElement || !m_mediaElement->renderer())
+ return;
+
+ RenderStyle* style = m_mediaElement->renderer()->getCachedPseudoStyle(m_pseudoStyleId);
+ if (!style)
+ return;
+
+ bool needsRenderer = rendererIsNeeded(style) && parent() && parent()->renderer();
+ if (renderer() && !needsRenderer)
+ detach();
+ else if (!renderer() && needsRenderer) {
+ RenderObject* renderer = createRenderer(m_mediaElement->renderer()->renderArena(), style);
+ if (!renderer)
+ return;
+ renderer->setStyle(style);
+ setRenderer(renderer);
+ setAttached();
+ if (parent() && parent()->renderer()) {
+ // Find next sibling with a renderer to determine where to insert.
+ Node* sibling = nextSibling();
+ while (sibling && !sibling->renderer())
+ sibling = sibling->nextSibling();
+ parent()->renderer()->addChild(renderer, sibling ? sibling->renderer() : 0);
+ }
+ } else if (renderer())
renderer()->setStyle(style);
- }
}
-MediaTimeDisplayElement::MediaTimeDisplayElement(Document* doc, HTMLMediaElement* element, bool currentTime)
- : MediaTextDisplayElement(doc, currentTime ? MEDIA_CONTROLS_CURRENT_TIME_DISPLAY : MEDIA_CONTROLS_TIME_REMAINING_DISPLAY, element)
+// ----------------------------
+
+MediaControlTimelineContainerElement::MediaControlTimelineContainerElement(Document* doc, HTMLMediaElement* element)
+: MediaControlElement(doc, MEDIA_CONTROLS_TIMELINE_CONTAINER, element)
+{
+}
+
+bool MediaControlTimelineContainerElement::rendererIsNeeded(RenderStyle* style)
{
+ if (!HTMLDivElement::rendererIsNeeded(style))
+ return false;
+
+ // This is for MediaControllerThemeClassic:
+ // If there is no style for MediaControlStatusDisplayElement style, don't hide
+ // the timeline.
+ if (!m_mediaElement->renderer()->getCachedPseudoStyle(MEDIA_CONTROLS_STATUS_DISPLAY))
+ return true;
+
+ float duration = m_mediaElement->duration();
+ return !isnan(duration) && !isinf(duration);
}
+
// ----------------------------
+MediaControlStatusDisplayElement::MediaControlStatusDisplayElement(Document* doc, HTMLMediaElement* element)
+: MediaControlElement(doc, MEDIA_CONTROLS_STATUS_DISPLAY, element)
+, m_stateBeingDisplayed(Nothing)
+{
+}
+
+void MediaControlStatusDisplayElement::update()
+{
+ MediaControlElement::update();
+
+ // Get the new state that we'll have to display.
+ StateBeingDisplayed newStateToDisplay = Nothing;
+ if (m_mediaElement->readyState() != HTMLMediaElement::HAVE_ENOUGH_DATA)
+ newStateToDisplay = Loading;
+ else if (m_mediaElement->isStreaming())
+ newStateToDisplay = LiveBroadcast;
+
+ // Propagate only if needed.
+ if (newStateToDisplay == m_stateBeingDisplayed)
+ return;
+ m_stateBeingDisplayed = newStateToDisplay;
+
+ ExceptionCode e;
+ switch (m_stateBeingDisplayed) {
+ case Nothing:
+ setInnerText("", e);
+ break;
+ case Loading:
+ setInnerText(mediaElementLoadingStateText(), e);
+ break;
+ case LiveBroadcast:
+ setInnerText(mediaElementLiveBroadcastStateText(), e);
+ break;
+ }
+}
+
+bool MediaControlStatusDisplayElement::rendererIsNeeded(RenderStyle* style)
+{
+ if (!HTMLDivElement::rendererIsNeeded(style))
+ return false;
+ float duration = m_mediaElement->duration();
+ return (isnan(duration) || isinf(duration));
+}
+
+// ----------------------------
+
MediaControlInputElement::MediaControlInputElement(Document* doc, PseudoId pseudo, const String& type, HTMLMediaElement* mediaElement, MediaControlElementType displayType)
: HTMLInputElement(inputTag, doc)
, m_mediaElement(mediaElement)
, m_displayType(displayType)
{
setInputType(type);
- updateStyle();
setInDocument(true);
}
void MediaControlInputElement::attachToParent(Element* parent)
{
parent->addChild(this);
- if (renderer() && parent->renderer())
- parent->renderer()->addChild(renderer());
}
void MediaControlInputElement::update()
{
if (!m_mediaElement || !m_mediaElement->renderer())
return;
-
+
RenderStyle* style = m_mediaElement->renderer()->getCachedPseudoStyle(m_pseudoStyleId);
-
- bool needsRenderer = rendererIsNeeded(style);
+ if (!style)
+ return;
+
+ bool needsRenderer = rendererIsNeeded(style) && parent() && parent()->renderer();
if (renderer() && !needsRenderer)
detach();
else if (!renderer() && needsRenderer) {
// ----------------------------
+MediaControlRewindButtonElement::MediaControlRewindButtonElement(Document* doc, HTMLMediaElement* element)
+: MediaControlInputElement(doc, MEDIA_CONTROLS_REWIND_BUTTON, "button", element, MediaRewindButton)
+{
+}
+
+void MediaControlRewindButtonElement::defaultEventHandler(Event* event)
+{
+ if (event->type() == eventNames().clickEvent) {
+ m_mediaElement->rewind(30);
+ event->setDefaultHandled();
+ }
+ HTMLInputElement::defaultEventHandler(event);
+}
+
+// ----------------------------
+
+MediaControlReturnToRealtimeButtonElement::MediaControlReturnToRealtimeButtonElement(Document* doc, HTMLMediaElement* element)
+: MediaControlInputElement(doc, MEDIA_CONTROLS_RETURN_TO_REALTIME_BUTTON, "button", element, MediaReturnToRealtimeButton)
+{
+}
+
+void MediaControlReturnToRealtimeButtonElement::defaultEventHandler(Event* event)
+{
+ if (event->type() == eventNames().clickEvent) {
+ m_mediaElement->returnToRealtime();
+ event->setDefaultHandled();
+ }
+ HTMLInputElement::defaultEventHandler(event);
+}
+
+bool MediaControlReturnToRealtimeButtonElement::rendererIsNeeded(RenderStyle* style)
+{
+ return HTMLInputElement::rendererIsNeeded(style) && m_mediaElement->isStreaming();
+}
+
+// ----------------------------
+
MediaControlTimelineElement::MediaControlTimelineElement(Document* document, HTMLMediaElement* element)
: MediaControlInputElement(document, MEDIA_CONTROLS_TIMELINE, "range", element, MediaTimelineContainer)
{
if (event->type() == eventNames().mousedownEvent)
m_mediaElement->beginScrubbing();
- HTMLInputElement::defaultEventHandler(event);
+ MediaControlInputElement::defaultEventHandler(event);
if (event->type() == eventNames().mouseoverEvent || event->type() == eventNames().mouseoutEvent || event->type() == eventNames().mousemoveEvent ) {
return;
setAttribute(maxAttr, String::number(isfinite(dur) ? dur : 0));
}
setValue(String::number(m_mediaElement->currentTime()));
+ MediaControlInputElement::update();
}
// ----------------------------
bool MediaControlFullscreenButtonElement::rendererIsNeeded(RenderStyle* style)
{
- return m_mediaElement->supportsFullscreen() && MediaControlInputElement::rendererIsNeeded(style);
+ return MediaControlInputElement::rendererIsNeeded(style) && m_mediaElement->supportsFullscreen();
}
class Event;
class Frame;
+// Must match WebKitSystemInterface.h
enum MediaControlElementType {
- MediaFullscreenButton, MediaMuteButton, MediaPlayButton,
- MediaSeekBackButton, MediaSeekForwardButton, MediaSlider, MediaSliderThumb,
- MediaUnMuteButton, MediaPauseButton, MediaTimelineContainer, MediaCurrentTimeDisplay,
- MediaTimeRemainingDisplay, MediaControlsPanel
+ MediaFullscreenButton = 0,
+ MediaMuteButton,
+ MediaPlayButton,
+ MediaSeekBackButton,
+ MediaSeekForwardButton,
+ MediaSlider,
+ MediaSliderThumb,
+ MediaRewindButton,
+ MediaReturnToRealtimeButton,
+ MediaUnMuteButton,
+ MediaPauseButton,
+ MediaTimelineContainer,
+ MediaCurrentTimeDisplay,
+ MediaTimeRemainingDisplay,
+ MediaStatusDisplay,
+ MediaControlsPanel
};
class MediaControlShadowRootElement : public HTMLDivElement {
HTMLMediaElement* m_mediaElement;
};
- // ----------------------------
-
-class MediaTextDisplayElement : public HTMLDivElement
+// ----------------------------
+
+class MediaControlElement : public HTMLDivElement
{
public:
- MediaTextDisplayElement(Document*, PseudoId, HTMLMediaElement*);
+ MediaControlElement(Document*, PseudoId, HTMLMediaElement*);
void attachToParent(Element*);
void update();
void updateStyle();
// ----------------------------
-class MediaTimeDisplayElement : public MediaTextDisplayElement {
+class MediaControlTimelineContainerElement : public MediaControlElement {
public:
- MediaTimeDisplayElement(Document*, HTMLMediaElement*, bool currentTime);
+ MediaControlTimelineContainerElement(Document*, HTMLMediaElement*);
+ virtual bool rendererIsNeeded(RenderStyle* style);
+};
+
+// ----------------------------
+
+class MediaControlStatusDisplayElement : public MediaControlElement {
+public:
+ MediaControlStatusDisplayElement(Document*, HTMLMediaElement*);
+ virtual void update();
+ virtual bool rendererIsNeeded(RenderStyle* style);
+private:
+ enum StateBeingDisplayed { Nothing, Loading, LiveBroadcast };
+ StateBeingDisplayed m_stateBeingDisplayed;
};
// ----------------------------
bool m_capturing;
Timer<MediaControlSeekButtonElement> m_seekTimer;
};
+
+// ----------------------------
+
+class MediaControlRewindButtonElement : public MediaControlInputElement {
+public:
+ MediaControlRewindButtonElement(Document*, HTMLMediaElement*);
+ virtual void defaultEventHandler(Event*);
+};
+
+// ----------------------------
+
+class MediaControlReturnToRealtimeButtonElement : public MediaControlInputElement {
+public:
+ MediaControlReturnToRealtimeButtonElement(Document*, HTMLMediaElement*);
+ virtual void defaultEventHandler(Event*);
+ virtual bool rendererIsNeeded(RenderStyle*);
+};
// ----------------------------
RenderMediaControlShadowRoot(Element* e) : RenderBlock(e) { }
void setParent(RenderObject* p) { RenderObject::setParent(p); }
};
-
+
// ----------------------------
} //namespace WebCore
RenderReplaced::styleDidChange(diff, oldStyle);
if (m_controlsShadowRoot) {
- if (m_panel->renderer())
- m_panel->renderer()->setStyle(getCachedPseudoStyle(MEDIA_CONTROLS_PANEL));
-
- if (m_timelineContainer->renderer())
- m_timelineContainer->renderer()->setStyle(getCachedPseudoStyle(MEDIA_CONTROLS_TIMELINE_CONTAINER));
-
+ m_panel->updateStyle();
m_muteButton->updateStyle();
m_playButton->updateStyle();
m_seekBackButton->updateStyle();
m_seekForwardButton->updateStyle();
+ m_rewindButton->updateStyle();
+ m_returnToRealtimeButton->updateStyle();
+ m_statusDisplay->updateStyle();
+ m_timelineContainer->updateStyle();
m_timeline->updateStyle();
m_fullscreenButton->updateStyle();
m_currentTimeDisplay->updateStyle();
void RenderMedia::createPanel()
{
ASSERT(!m_panel);
- RenderStyle* style = getCachedPseudoStyle(MEDIA_CONTROLS_PANEL);
- m_panel = new HTMLDivElement(HTMLNames::divTag, document());
- RenderObject* renderer = m_panel->createRenderer(renderArena(), style);
- if (renderer) {
- m_panel->setRenderer(renderer);
- renderer->setStyle(style);
- m_panel->setAttached();
- m_panel->setInDocument(true);
- m_controlsShadowRoot->addChild(m_panel);
- m_controlsShadowRoot->renderer()->addChild(renderer);
- }
+ m_panel = new MediaControlElement(document(), MEDIA_CONTROLS_PANEL, mediaElement());
+ m_panel->attachToParent(m_controlsShadowRoot.get());
}
void RenderMedia::createMuteButton()
m_seekForwardButton->attachToParent(m_panel.get());
}
+void RenderMedia::createRewindButton()
+{
+ ASSERT(!m_rewindButton);
+ m_rewindButton = new MediaControlRewindButtonElement(document(), mediaElement());
+ m_rewindButton->attachToParent(m_panel.get());
+}
+
+void RenderMedia::createReturnToRealtimeButton()
+{
+ ASSERT(!m_returnToRealtimeButton);
+ m_returnToRealtimeButton = new MediaControlReturnToRealtimeButtonElement(document(), mediaElement());
+ m_returnToRealtimeButton->attachToParent(m_panel.get());
+}
+
+void RenderMedia::createStatusDisplay()
+{
+ ASSERT(!m_statusDisplay);
+ m_statusDisplay = new MediaControlStatusDisplayElement(document(), mediaElement());
+ m_statusDisplay->attachToParent(m_panel.get());
+}
+
void RenderMedia::createTimelineContainer()
{
ASSERT(!m_timelineContainer);
- RenderStyle* style = getCachedPseudoStyle(MEDIA_CONTROLS_TIMELINE_CONTAINER);
- m_timelineContainer = new HTMLDivElement(HTMLNames::divTag, document());
- RenderObject* renderer = m_timelineContainer->createRenderer(renderArena(), style);
- if (renderer) {
- m_timelineContainer->setRenderer(renderer);
- renderer->setStyle(style);
- m_timelineContainer->setAttached();
- m_timelineContainer->setInDocument(true);
- m_panel->addChild(m_timelineContainer);
- m_panel->renderer()->addChild(renderer);
- }
+ m_timelineContainer = new MediaControlTimelineContainerElement(document(), mediaElement());
+ m_timelineContainer->attachToParent(m_panel.get());
}
void RenderMedia::createTimeline()
m_timeline->setAttribute(precisionAttr, "float");
m_timeline->attachToParent(m_timelineContainer.get());
}
-
+
void RenderMedia::createCurrentTimeDisplay()
{
ASSERT(!m_currentTimeDisplay);
- m_currentTimeDisplay = new MediaTimeDisplayElement(document(), mediaElement(), true);
+ m_currentTimeDisplay = new MediaControlElement(document(), MEDIA_CONTROLS_CURRENT_TIME_DISPLAY, mediaElement());
m_currentTimeDisplay->attachToParent(m_timelineContainer.get());
}
void RenderMedia::createTimeRemainingDisplay()
{
ASSERT(!m_timeRemainingDisplay);
- m_timeRemainingDisplay = new MediaTimeDisplayElement(document(), mediaElement(), false);
+ m_timeRemainingDisplay = new MediaControlElement(document(), MEDIA_CONTROLS_TIME_REMAINING_DISPLAY, mediaElement());
m_timeRemainingDisplay->attachToParent(m_timelineContainer.get());
}
m_panel = 0;
m_muteButton = 0;
m_playButton = 0;
+ m_statusDisplay = 0;
m_timelineContainer = 0;
m_timeline = 0;
m_seekBackButton = 0;
m_seekForwardButton = 0;
+ m_rewindButton = 0;
+ m_returnToRealtimeButton = 0;
m_currentTimeDisplay = 0;
m_timeRemainingDisplay = 0;
m_fullscreenButton = 0;
if (!m_controlsShadowRoot) {
createControlsShadowRoot();
createPanel();
- if (m_panel && m_panel->renderer()) {
+ if (m_panel) {
+ createRewindButton();
createMuteButton();
createPlayButton();
+ createReturnToRealtimeButton();
+ createStatusDisplay();
createTimelineContainer();
createSeekBackButton();
createSeekForwardButton();
- createFullscreenButton();
+ createFullscreenButton();
}
- if (m_timelineContainer && m_timelineContainer->renderer()) {
+ if (m_timelineContainer) {
createCurrentTimeDisplay();
createTimeline();
createTimeRemainingDisplay();
m_previousVisible = style()->visibility();
+ if (m_panel)
+ m_panel->update();
if (m_muteButton)
m_muteButton->update();
if (m_playButton)
m_playButton->update();
+ if (m_timelineContainer)
+ m_timelineContainer->update();
if (m_timeline)
m_timeline->update();
if (m_currentTimeDisplay)
m_seekBackButton->update();
if (m_seekForwardButton)
m_seekForwardButton->update();
+ if (m_rewindButton)
+ m_rewindButton->update();
+ if (m_returnToRealtimeButton)
+ m_returnToRealtimeButton->update();
+ if (m_statusDisplay)
+ m_statusDisplay->update();
if (m_fullscreenButton)
m_fullscreenButton->update();
updateTimeDisplay();
if (m_seekForwardButton && m_seekForwardButton->hitTest(point))
m_seekForwardButton->defaultEventHandler(event);
+ if (m_rewindButton && m_rewindButton->hitTest(point))
+ m_rewindButton->defaultEventHandler(event);
+
+ if (m_returnToRealtimeButton && m_returnToRealtimeButton->hitTest(point))
+ m_returnToRealtimeButton->defaultEventHandler(event);
+
if (m_timeline && m_timeline->hitTest(point))
m_timeline->defaultEventHandler(event);
class MediaControlMuteButtonElement;
class MediaControlPlayButtonElement;
class MediaControlSeekButtonElement;
+class MediaControlRewindButtonElement;
+class MediaControlReturnToRealtimeButtonElement;
class MediaControlTimelineElement;
class MediaControlFullscreenButtonElement;
-class MediaTimeDisplayElement;
+class MediaControlTimeDisplayElement;
+class MediaControlStatusDisplayElement;
+class MediaControlTimelineContainerElement;
+class MediaControlElement;
class MediaPlayer;
class RenderMedia : public RenderReplaced {
void createPlayButton();
void createSeekBackButton();
void createSeekForwardButton();
+ void createRewindButton();
+ void createReturnToRealtimeButton();
+ void createStatusDisplay();
void createTimelineContainer();
void createTimeline();
void createCurrentTimeDisplay();
virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
RefPtr<HTMLElement> m_controlsShadowRoot;
- RefPtr<HTMLElement> m_panel;
+ RefPtr<MediaControlElement> m_panel;
RefPtr<MediaControlMuteButtonElement> m_muteButton;
RefPtr<MediaControlPlayButtonElement> m_playButton;
RefPtr<MediaControlSeekButtonElement> m_seekBackButton;
RefPtr<MediaControlSeekButtonElement> m_seekForwardButton;
+ RefPtr<MediaControlRewindButtonElement> m_rewindButton;
+ RefPtr<MediaControlReturnToRealtimeButtonElement> m_returnToRealtimeButton;
RefPtr<MediaControlTimelineElement> m_timeline;
RefPtr<MediaControlFullscreenButtonElement> m_fullscreenButton;
- RefPtr<HTMLElement> m_timelineContainer;
- RefPtr<MediaTimeDisplayElement> m_currentTimeDisplay;
- RefPtr<MediaTimeDisplayElement> m_timeRemainingDisplay;
+ RefPtr<MediaControlTimelineContainerElement> m_timelineContainer;
+ RefPtr<MediaControlElement> m_currentTimeDisplay;
+ RefPtr<MediaControlElement> m_timeRemainingDisplay;
+ RefPtr<MediaControlStatusDisplayElement> m_statusDisplay;
RenderObjectChildList m_children;
Node* m_lastUnderNode;
Node* m_nodeUnderMouse;
return paintMediaSeekBackButton(o, paintInfo, r);
case MediaSeekForwardButtonPart:
return paintMediaSeekForwardButton(o, paintInfo, r);
+ case MediaRewindButtonPart:
+ return paintMediaRewindButton(o, paintInfo, r);
+ case MediaReturnToRealtimeButtonPart:
+ return paintMediaReturnToRealtimeButton(o, paintInfo, r);
case MediaSliderPart:
return paintMediaSliderTrack(o, paintInfo, r);
case MediaSliderThumbPart:
return paintMediaTimeRemaining(o, paintInfo, r);
case MediaCurrentTimePart:
return paintMediaCurrentTime(o, paintInfo, r);
- case MediaTimelineContainerPart:
- return paintMediaTimelineContainer(o, paintInfo, r);
+ case MediaControlsBackgroundPart:
+ return paintMediaControlsBackground(o, paintInfo, r);
case MenulistButtonPart:
case TextFieldPart:
case TextAreaPart:
virtual bool paintMediaSeekForwardButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
virtual bool paintMediaSliderTrack(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
virtual bool paintMediaSliderThumb(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
- virtual bool paintMediaTimelineContainer(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
+ virtual bool paintMediaRewindButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
+ virtual bool paintMediaReturnToRealtimeButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
+ virtual bool paintMediaControlsBackground(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
virtual bool paintMediaCurrentTime(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
virtual bool paintMediaTimeRemaining(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { return true; }
virtual bool paintMediaSeekForwardButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
virtual bool paintMediaSliderTrack(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
virtual bool paintMediaSliderThumb(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
- virtual bool paintMediaTimelineContainer(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
+ virtual bool paintMediaRewindButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
+ virtual bool paintMediaReturnToRealtimeButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
+ virtual bool paintMediaControlsBackground(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
virtual bool paintMediaCurrentTime(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
virtual bool paintMediaTimeRemaining(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
wkDrawMediaUIPart(MediaSliderThumb, mediaControllerTheme(), paintInfo.context->platformContext(), r, node->active());
return false;
}
+
+bool RenderThemeMac::paintMediaRewindButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
+{
+ Node* node = o->node();
+ if (!node)
+ return false;
+
+ LocalCurrentGraphicsContext localContext(paintInfo.context);
+ wkDrawMediaUIPart(MediaRewindButton, mediaControllerTheme(), paintInfo.context->platformContext(), r, node->active());
+ return false;
+}
+
+bool RenderThemeMac::paintMediaReturnToRealtimeButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
+{
+ Node* node = o->node();
+ if (!node)
+ return false;
+
+ LocalCurrentGraphicsContext localContext(paintInfo.context);
+ wkDrawMediaUIPart(MediaReturnToRealtimeButton, mediaControllerTheme(), paintInfo.context->platformContext(), r, node->active());
+ return false;
+}
+
-bool RenderThemeMac::paintMediaTimelineContainer(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
+bool RenderThemeMac::paintMediaControlsBackground(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
{
Node* node = o->node();
if (!node)
SLIDER_THUMB, SEARCH_CANCEL_BUTTON, SEARCH_DECORATION, SEARCH_RESULTS_DECORATION, SEARCH_RESULTS_BUTTON, MEDIA_CONTROLS_PANEL,
MEDIA_CONTROLS_PLAY_BUTTON, MEDIA_CONTROLS_MUTE_BUTTON, MEDIA_CONTROLS_TIMELINE, MEDIA_CONTROLS_TIMELINE_CONTAINER,
MEDIA_CONTROLS_CURRENT_TIME_DISPLAY, MEDIA_CONTROLS_TIME_REMAINING_DISPLAY, MEDIA_CONTROLS_SEEK_BACK_BUTTON,
- MEDIA_CONTROLS_SEEK_FORWARD_BUTTON, MEDIA_CONTROLS_FULLSCREEN_BUTTON,
+ MEDIA_CONTROLS_SEEK_FORWARD_BUTTON, MEDIA_CONTROLS_FULLSCREEN_BUTTON, MEDIA_CONTROLS_REWIND_BUTTON,
+ MEDIA_CONTROLS_RETURN_TO_REALTIME_BUTTON, MEDIA_CONTROLS_STATUS_DISPLAY,
SCROLLBAR_THUMB, SCROLLBAR_BUTTON, SCROLLBAR_TRACK, SCROLLBAR_TRACK_PIECE, SCROLLBAR_CORNER, RESIZER,
FIRST_INTERNAL_PSEUDOID = FILE_UPLOAD_BUTTON
+2009-07-02 Pierre d'Herbemont <pdherbemont@apple.com>
+
+ Reviewed by Simon Fraser.
+
+ <rdar://problem/6518119>
+
+ Add localized strings for media controller status messages.
+
+ * English.lproj/Localizable.strings: Localized text.
+
2009-06-08 Dan Bernstein <mitz@apple.com>
Rubber-stamped by Mark Rowe.
+2009-07-02 Pierre d'Herbemont <pdherbemont@apple.com>
+
+ Reviewed by Simon Fraser.
+
+ <rdar://problem/6518119>
+
+ Add localized strings for media controller status messages.
+
+ * WebCoreSupport/WebViewFactory.mm: Add new localized text.
+ (-[WebViewFactory mediaElementLoadingStateText]):
+ (-[WebViewFactory mediaElementLiveBroadcastStateText]):
+
2009-07-01 Brady Eidson <beidson@apple.com>
Reviewed by Sam Weinig.
return [NSString stringWithFormat:UI_STRING("%@ %d×%d pixels", "window title for a standalone image (uses multiplication symbol, not x)"), filename, width, height];
}
+- (NSString*)mediaElementLoadingStateText
+{
+ return UI_STRING("Loading...", "text that shows up in the media controller when the media is loading");
+}
+
+- (NSString*)mediaElementLiveBroadcastStateText
+{
+ return UI_STRING("Live Broadcast", "text that shows up in the media controller when watching a live broadcast");
+}
+
@end
+2009-07-02 Pierre d'Herbemont <pdherbemont@apple.com>
+
+ Reviewed by Simon Fraser.
+
+ Update WebKitSystemInterface for <rdar://problem/6518119>
+
+ * WebKitSystemInterface.h:
+ * libWebKitSystemInterfaceLeopard.a:
+ * libWebKitSystemInterfaceSnowLeopard.a:
+ * libWebKitSystemInterfaceTiger.a:
+
2009-07-01 Eric Carlson <eric.carlson@apple.com>
Reviewed by Simon Fraser.
typedef enum {
WKMediaUIPartFullscreenButton = 0,
- WKMediaUIPartMuteButton = 1,
- WKMediaUIPartPlayButton = 2,
- WKMediaUIPartSeekBackButton = 3,
- WKMediaUIPartSeekForwardButton = 4,
- WKMediaUIPartSlider = 5,
- WKMediaUIPartSliderThumb = 6,
- WKMediaUIPartUnMuteButton = 7,
- WKMediaUIPartPauseButton = 8,
- WKMediaUIPartTimelineContainer = 9,
- WKMediaUIPartCurrentTimeDisplay = 10,
- WKMediaUIPartTimeRemainingDisplay= 11
+ WKMediaUIPartMuteButton,
+ WKMediaUIPartPlayButton,
+ WKMediaUIPartSeekBackButton,
+ WKMediaUIPartSeekForwardButton,
+ WKMediaUIPartSlider,
+ WKMediaUIPartSliderThumb,
+ WKMediaUIPartRewindButton,
+ WKMediaUIPartSeekToRealtimeButton,
+ WKMediaUIPartUnMuteButton,
+ WKMediaUIPartPauseButton,
+ WKMediaUIPartBackground,
+ WKMediaUIPartCurrentTimeDisplay,
+ WKMediaUIPartTimeRemainingDisplay
} WKMediaUIPart;
typedef enum {
WKMediaControllerThemeQT = 2
} WKMediaControllerThemeStyle;
+typedef enum {
+ WKMediaControllerStateNormal = 0,
+ WKMediaControllerStateActivated = 1,
+ WKMediaControllerStateDisabled = 2
+} WKMediaControllerThemeState;
+
BOOL WKHitTestMediaUIPart(int part, int themeStyle, CGRect bounds, CGPoint point);
void WKMeasureMediaUIPart(int part, int themeStyle, CGRect *bounds, CGSize *naturalSize);
-void WKDrawMediaUIPart(int part, int themeStyle, CGContextRef context, CGRect rect, BOOL active);
+void WKDrawMediaUIPart(int part, int themeStyle, CGContextRef context, CGRect rect, int state);
void WKDrawMediaSliderTrack(int themeStyle, CGContextRef context, CGRect rect, float timeLoaded, float currentTime, float duration);
#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && defined(__x86_64__)