Commit 0febaab1 authored by sandersd@chromium.org's avatar sandersd@chromium.org

Validate finiteness of HTMLMediaElement properties.

BUG=357707

Review URL: https://codereview.chromium.org/217053009

git-svn-id: svn://svn.chromium.org/blink/trunk@170495 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 4719c2f3
RUN(controller = video.controller) RUN(controller = video.controller)
EVENT(canplaythrough) EVENT(canplaythrough)
TEST(controller.currentTime = -Infinity) THROWS("TypeError: Failed to set the 'currentTime' property on 'MediaController': The value provided is infinite.") OK
TEST(controller.currentTime = Infinity) THROWS("TypeError: Failed to set the 'currentTime' property on 'MediaController': The value provided is infinite.") OK
TEST(controller.currentTime = NaN) THROWS("TypeError: Failed to set the 'currentTime' property on 'MediaController': The value provided is not a number.") OK
RUN(controller.play()) RUN(controller.play())
EVENT(playing) EVENT(playing)
EXPECTED (controller.paused == 'false') OK EXPECTED (controller.paused == 'false') OK
......
...@@ -22,6 +22,11 @@ ...@@ -22,6 +22,11 @@
function canplaythrough() { function canplaythrough() {
consoleWrite("EVENT(canplaythrough)"); consoleWrite("EVENT(canplaythrough)");
controller.removeEventListener('canplaythrough', canplaythrough, true); controller.removeEventListener('canplaythrough', canplaythrough, true);
testException("controller.currentTime = -Infinity", '"TypeError: Failed to set the \'currentTime\' property on \'MediaController\': The value provided is infinite."');
testException("controller.currentTime = Infinity", '"TypeError: Failed to set the \'currentTime\' property on \'MediaController\': The value provided is infinite."');
testException("controller.currentTime = NaN", '"TypeError: Failed to set the \'currentTime\' property on \'MediaController\': The value provided is not a number."');
controller.addEventListener('playing', playing, true); controller.addEventListener('playing', playing, true);
run('controller.play()'); run('controller.play()');
} }
......
EVENT(canplay) EVENT(canplay)
TEST(video.controller.defaultPlaybackRate = -Infinity) THROWS("TypeError: Failed to set the 'defaultPlaybackRate' property on 'MediaController': The value provided is infinite.") OK
TEST(video.controller.defaultPlaybackRate = Infinity) THROWS("TypeError: Failed to set the 'defaultPlaybackRate' property on 'MediaController': The value provided is infinite.") OK
TEST(video.controller.defaultPlaybackRate = NaN) THROWS("TypeError: Failed to set the 'defaultPlaybackRate' property on 'MediaController': The value provided is not a number.") OK
TEST(video.controller.playbackRate = -Infinity) THROWS("TypeError: Failed to set the 'playbackRate' property on 'MediaController': The value provided is infinite.") OK
TEST(video.controller.playbackRate = Infinity) THROWS("TypeError: Failed to set the 'playbackRate' property on 'MediaController': The value provided is infinite.") OK
TEST(video.controller.playbackRate = NaN) THROWS("TypeError: Failed to set the 'playbackRate' property on 'MediaController': The value provided is not a number.") OK
EVENT(play) EVENT(play)
EVENT(timeupdate) EVENT(timeupdate)
EXPECTED (video.currentTime != '0') OK EXPECTED (video.currentTime != '0') OK
......
...@@ -12,6 +12,16 @@ ...@@ -12,6 +12,16 @@
var canplay = function() { var canplay = function() {
video.mediaGroup = "group"; video.mediaGroup = "group";
// Test non-finite rates.
testException("video.controller.defaultPlaybackRate = -Infinity", '"TypeError: Failed to set the \'defaultPlaybackRate\' property on \'MediaController\': The value provided is infinite."');
testException("video.controller.defaultPlaybackRate = Infinity", '"TypeError: Failed to set the \'defaultPlaybackRate\' property on \'MediaController\': The value provided is infinite."');
testException("video.controller.defaultPlaybackRate = NaN", '"TypeError: Failed to set the \'defaultPlaybackRate\' property on \'MediaController\': The value provided is not a number."');
testException("video.controller.playbackRate = -Infinity", '"TypeError: Failed to set the \'playbackRate\' property on \'MediaController\': The value provided is infinite."');
testException("video.controller.playbackRate = Infinity", '"TypeError: Failed to set the \'playbackRate\' property on \'MediaController\': The value provided is infinite."');
testException("video.controller.playbackRate = NaN", '"TypeError: Failed to set the \'playbackRate\' property on \'MediaController\': The value provided is not a number."');
// Test that the controller rate sets the video rate.
video.playbackRate = 0; video.playbackRate = 0;
video.defaultPlaybackRate = 0; video.defaultPlaybackRate = 0;
video.controller.playbackRate = 0; video.controller.playbackRate = 0;
...@@ -34,4 +44,4 @@ ...@@ -34,4 +44,4 @@
<body onload="start()"> <body onload="start()">
<video controls></video> <video controls></video>
</body> </body>
</html> </html>
\ No newline at end of file
EVENT(canplay)
EXPECTED (video.controller.volume == '1') OK
RUN(video.controller.volume = 0.5)
EXPECTED (video.controller.volume == '0.5') OK
RUN(video.controller.volume = Number.MIN_VALUE)
EXPECTED (video.controller.volume == '5e-324') OK
RUN(video.controller.volume = 0)
EXPECTED (video.controller.volume == '0') OK
TEST(video.controller.volume = 1.5) THROWS(DOMException.INDEX_SIZE_ERR: Failed to set the 'volume' property on 'MediaController': The volume provided (1.5) is outside the range [0, 1].) OK
TEST(video.controller.volume = -0.5) THROWS(DOMException.INDEX_SIZE_ERR: Failed to set the 'volume' property on 'MediaController': The volume provided (-0.5) is outside the range [0, 1].) OK
TEST(video.controller.volume = -Infinity) THROWS("TypeError: Failed to set the 'volume' property on 'MediaController': The value provided is infinite.") OK
TEST(video.controller.volume = Infinity) THROWS("TypeError: Failed to set the 'volume' property on 'MediaController': The value provided is infinite.") OK
TEST(video.controller.volume = NaN) THROWS("TypeError: Failed to set the 'volume' property on 'MediaController': The value provided is not a number.") OK
END OF TEST
<!DOCTYPE html>
<html>
<head>
<title>MediaController - volume test</title>
<script src=video-test.js></script>
<script src=media-file.js></script>
<script>
function start()
{
findMediaElement();
waitForEvent('canplay', canplay);
video.src = findMediaFile("video", "content/test");
};
function canplay()
{
testExpected("video.controller.volume", 1.0);
run("video.controller.volume = 0.5");
testExpected("video.controller.volume", 0.5);
run("video.controller.volume = Number.MIN_VALUE");
testExpected("video.controller.volume", Number.MIN_VALUE);
run("video.controller.volume = 0");
testExpected("video.controller.volume", 0);
testDOMException("video.controller.volume = 1.5", "DOMException.INDEX_SIZE_ERR");
testDOMException("video.controller.volume = -0.5", "DOMException.INDEX_SIZE_ERR");
testException("video.controller.volume = -Infinity", '"TypeError: Failed to set the \'volume\' property on \'MediaController\': The value provided is infinite."');
testException("video.controller.volume = Infinity", '"TypeError: Failed to set the \'volume\' property on \'MediaController\': The value provided is infinite."');
testException("video.controller.volume = NaN", '"TypeError: Failed to set the \'volume\' property on \'MediaController\': The value provided is not a number."');
endTest();
};
</script>
</head>
<body>
<body onload="start()">
<video id="video" mediaGroup="group" controls autoplay></video>
</body>
</body>
</html>
EVENT(canplaythrough) EVENT(canplaythrough)
TEST(video.currentTime = -Infinity) THROWS("TypeError: Failed to set the 'currentTime' property on 'HTMLMediaElement': The value provided is infinite.") OK
TEST(video.currentTime = Infinity) THROWS("TypeError: Failed to set the 'currentTime' property on 'HTMLMediaElement': The value provided is infinite.") OK
TEST(video.currentTime = NaN) THROWS("TypeError: Failed to set the 'currentTime' property on 'HTMLMediaElement': The value provided is not a number.") OK
EXPECTED (video.currentTime.toFixed(1) == '1.5') OK EXPECTED (video.currentTime.toFixed(1) == '1.5') OK
EXPECTED (video.currentTime.toFixed(1) == '3.1') OK EXPECTED (video.currentTime.toFixed(1) == '3.1') OK
END OF TEST END OF TEST
......
...@@ -2,12 +2,15 @@ ...@@ -2,12 +2,15 @@
<script src=media-file.js></script> <script src=media-file.js></script>
<script src=video-test.js></script> <script src=video-test.js></script>
<script> <script>
waitForEvent('canplaythrough', waitForEvent('canplaythrough',
function () { function () {
video.currentTime = 1.5; testException("video.currentTime = -Infinity", '"TypeError: Failed to set the \'currentTime\' property on \'HTMLMediaElement\': The value provided is infinite."');
testException("video.currentTime = Infinity", '"TypeError: Failed to set the \'currentTime\' property on \'HTMLMediaElement\': The value provided is infinite."');
testException("video.currentTime = NaN", '"TypeError: Failed to set the \'currentTime\' property on \'HTMLMediaElement\': The value provided is not a number."');
video.currentTime = 1.5;
testExpected("video.currentTime.toFixed(1)", 1.5); testExpected("video.currentTime.toFixed(1)", 1.5);
video.play(); video.play();
video.currentTime = 3.1; video.currentTime = 3.1;
testExpected("video.currentTime.toFixed(1)", 3.1); testExpected("video.currentTime.toFixed(1)", 3.1);
endTest(); endTest();
}); });
......
...@@ -55,5 +55,14 @@ EXPECTED (video.playbackRate == '5e-324') OK ...@@ -55,5 +55,14 @@ EXPECTED (video.playbackRate == '5e-324') OK
RUN(video.playbackRate = Number.MAX_VALUE) RUN(video.playbackRate = Number.MAX_VALUE)
EXPECTED (video.playbackRate == '1.7976931348623157e+308') OK EXPECTED (video.playbackRate == '1.7976931348623157e+308') OK
Test non-finite playback rates
TEST(video.defaultPlaybackRate = -Infinity) THROWS("TypeError: Failed to set the 'defaultPlaybackRate' property on 'HTMLMediaElement': The value provided is infinite.") OK
TEST(video.defaultPlaybackRate = Infinity) THROWS("TypeError: Failed to set the 'defaultPlaybackRate' property on 'HTMLMediaElement': The value provided is infinite.") OK
TEST(video.defaultPlaybackRate = NaN) THROWS("TypeError: Failed to set the 'defaultPlaybackRate' property on 'HTMLMediaElement': The value provided is not a number.") OK
TEST(video.playbackRate = -Infinity) THROWS("TypeError: Failed to set the 'playbackRate' property on 'HTMLMediaElement': The value provided is infinite.") OK
TEST(video.playbackRate = Infinity) THROWS("TypeError: Failed to set the 'playbackRate' property on 'HTMLMediaElement': The value provided is infinite.") OK
TEST(video.playbackRate = NaN) THROWS("TypeError: Failed to set the 'playbackRate' property on 'HTMLMediaElement': The value provided is not a number.") OK
END OF TEST END OF TEST
...@@ -79,6 +79,18 @@ ...@@ -79,6 +79,18 @@
run("video.playbackRate = Number.MAX_VALUE"); run("video.playbackRate = Number.MAX_VALUE");
testExpected("video.playbackRate", Number.MAX_VALUE); testExpected("video.playbackRate", Number.MAX_VALUE);
consoleWrite(""); consoleWrite("");
consoleWrite("Test non-finite playback rates");
testException("video.defaultPlaybackRate = -Infinity", '"TypeError: Failed to set the \'defaultPlaybackRate\' property on \'HTMLMediaElement\': The value provided is infinite."');
testException("video.defaultPlaybackRate = Infinity", '"TypeError: Failed to set the \'defaultPlaybackRate\' property on \'HTMLMediaElement\': The value provided is infinite."');
testException("video.defaultPlaybackRate = NaN", '"TypeError: Failed to set the \'defaultPlaybackRate\' property on \'HTMLMediaElement\': The value provided is not a number."');
consoleWrite("");
testException("video.playbackRate = -Infinity", '"TypeError: Failed to set the \'playbackRate\' property on \'HTMLMediaElement\': The value provided is infinite."');
testException("video.playbackRate = Infinity", '"TypeError: Failed to set the \'playbackRate\' property on \'HTMLMediaElement\': The value provided is infinite."');
testException("video.playbackRate = NaN", '"TypeError: Failed to set the \'playbackRate\' property on \'HTMLMediaElement\': The value provided is not a number."');
consoleWrite("");
endTest(); endTest();
} }
......
...@@ -9,6 +9,9 @@ RUN(video.volume = 0) ...@@ -9,6 +9,9 @@ RUN(video.volume = 0)
EXPECTED (video.volume == '0') OK EXPECTED (video.volume == '0') OK
TEST(video.volume = 1.5) THROWS(DOMException.INDEX_SIZE_ERR: Failed to set the 'volume' property on 'HTMLMediaElement': The volume provided (1.5) is outside the range [0, 1].) OK TEST(video.volume = 1.5) THROWS(DOMException.INDEX_SIZE_ERR: Failed to set the 'volume' property on 'HTMLMediaElement': The volume provided (1.5) is outside the range [0, 1].) OK
TEST(video.volume = -0.5) THROWS(DOMException.INDEX_SIZE_ERR: Failed to set the 'volume' property on 'HTMLMediaElement': The volume provided (-0.5) is outside the range [0, 1].) OK TEST(video.volume = -0.5) THROWS(DOMException.INDEX_SIZE_ERR: Failed to set the 'volume' property on 'HTMLMediaElement': The volume provided (-0.5) is outside the range [0, 1].) OK
TEST(video.volume = -Infinity) THROWS("TypeError: Failed to set the 'volume' property on 'HTMLMediaElement': The value provided is infinite.") OK
TEST(video.volume = Infinity) THROWS("TypeError: Failed to set the 'volume' property on 'HTMLMediaElement': The value provided is infinite.") OK
TEST(video.volume = NaN) THROWS("TypeError: Failed to set the 'volume' property on 'HTMLMediaElement': The value provided is not a number.") OK
RUN(video.load()) RUN(video.load())
EVENT(canplaythrough) EVENT(canplaythrough)
EXPECTED (video.volume == '0') OK EXPECTED (video.volume == '0') OK
......
...@@ -12,6 +12,9 @@ ...@@ -12,6 +12,9 @@
testExpected("video.volume", 0); testExpected("video.volume", 0);
testDOMException("video.volume = 1.5", "DOMException.INDEX_SIZE_ERR"); testDOMException("video.volume = 1.5", "DOMException.INDEX_SIZE_ERR");
testDOMException("video.volume = -0.5", "DOMException.INDEX_SIZE_ERR"); testDOMException("video.volume = -0.5", "DOMException.INDEX_SIZE_ERR");
testException("video.volume = -Infinity", '"TypeError: Failed to set the \'volume\' property on \'HTMLMediaElement\': The value provided is infinite."');
testException("video.volume = Infinity", '"TypeError: Failed to set the \'volume\' property on \'HTMLMediaElement\': The value provided is infinite."');
testException("video.volume = NaN", '"TypeError: Failed to set the \'volume\' property on \'HTMLMediaElement\': The value provided is not a number."');
video.src = findMediaFile("video", "content/test"); video.src = findMediaFile("video", "content/test");
run("video.load()"); run("video.load()");
waitForEvent("canplaythrough", function () { waitForEvent("canplaythrough", function () {
......
...@@ -668,7 +668,7 @@ void HTMLMediaElement::prepareForLoad() ...@@ -668,7 +668,7 @@ void HTMLMediaElement::prepareForLoad()
} }
// 5 - Set the playbackRate attribute to the value of the defaultPlaybackRate attribute. // 5 - Set the playbackRate attribute to the value of the defaultPlaybackRate attribute.
setPlaybackRate(defaultPlaybackRate()); setPlaybackRate(defaultPlaybackRate(), IGNORE_EXCEPTION);
// 6 - Set the error attribute to null and the autoplaying flag to true. // 6 - Set the error attribute to null and the autoplaying flag to true.
m_error = nullptr; m_error = nullptr;
...@@ -1870,6 +1870,11 @@ double HTMLMediaElement::currentTime() const ...@@ -1870,6 +1870,11 @@ double HTMLMediaElement::currentTime() const
void HTMLMediaElement::setCurrentTime(double time, ExceptionState& exceptionState) void HTMLMediaElement::setCurrentTime(double time, ExceptionState& exceptionState)
{ {
// FIXME: generated bindings should check isfinite: http://crbug.com/354298
if (!std::isfinite(time)) {
exceptionState.throwTypeError(ExceptionMessages::notAFiniteNumber(time));
return;
}
if (m_mediaController) { if (m_mediaController) {
exceptionState.throwDOMException(InvalidStateError, "The element is slaved to a MediaController."); exceptionState.throwDOMException(InvalidStateError, "The element is slaved to a MediaController.");
return; return;
...@@ -1908,8 +1913,13 @@ double HTMLMediaElement::defaultPlaybackRate() const ...@@ -1908,8 +1913,13 @@ double HTMLMediaElement::defaultPlaybackRate() const
return m_defaultPlaybackRate; return m_defaultPlaybackRate;
} }
void HTMLMediaElement::setDefaultPlaybackRate(double rate) void HTMLMediaElement::setDefaultPlaybackRate(double rate, ExceptionState& exceptionState)
{ {
// FIXME: generated bindings should check isfinite: http://crbug.com/354298
if (!std::isfinite(rate)) {
exceptionState.throwTypeError(ExceptionMessages::notAFiniteNumber(rate));
return;
}
if (m_defaultPlaybackRate != rate) { if (m_defaultPlaybackRate != rate) {
m_defaultPlaybackRate = rate; m_defaultPlaybackRate = rate;
scheduleEvent(EventTypeNames::ratechange); scheduleEvent(EventTypeNames::ratechange);
...@@ -1921,10 +1931,16 @@ double HTMLMediaElement::playbackRate() const ...@@ -1921,10 +1931,16 @@ double HTMLMediaElement::playbackRate() const
return m_playbackRate; return m_playbackRate;
} }
void HTMLMediaElement::setPlaybackRate(double rate) void HTMLMediaElement::setPlaybackRate(double rate, ExceptionState& exceptionState)
{ {
WTF_LOG(Media, "HTMLMediaElement::setPlaybackRate(%f)", rate); WTF_LOG(Media, "HTMLMediaElement::setPlaybackRate(%f)", rate);
// FIXME: generated bindings should check isfinite: http://crbug.com/354298
if (!std::isfinite(rate)) {
exceptionState.throwTypeError(ExceptionMessages::notAFiniteNumber(rate));
return;
}
if (m_playbackRate != rate) { if (m_playbackRate != rate) {
m_playbackRate = rate; m_playbackRate = rate;
invalidateCachedTime(); invalidateCachedTime();
...@@ -2089,6 +2105,12 @@ void HTMLMediaElement::setVolume(double vol, ExceptionState& exceptionState) ...@@ -2089,6 +2105,12 @@ void HTMLMediaElement::setVolume(double vol, ExceptionState& exceptionState)
{ {
WTF_LOG(Media, "HTMLMediaElement::setVolume(%f)", vol); WTF_LOG(Media, "HTMLMediaElement::setVolume(%f)", vol);
// FIXME: generated bindings should check isfinite: http://crbug.com/354298
if (!std::isfinite(vol)) {
exceptionState.throwTypeError(ExceptionMessages::notAFiniteNumber(vol));
return;
}
if (vol < 0.0f || vol > 1.0f) { if (vol < 0.0f || vol > 1.0f) {
exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::indexOutsideRange("volume", vol, 0.0, ExceptionMessages::InclusiveBound, 1.0, ExceptionMessages::InclusiveBound)); exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::indexOutsideRange("volume", vol, 0.0, ExceptionMessages::InclusiveBound, 1.0, ExceptionMessages::InclusiveBound));
return; return;
......
...@@ -128,9 +128,9 @@ public: ...@@ -128,9 +128,9 @@ public:
virtual double duration() const OVERRIDE FINAL; virtual double duration() const OVERRIDE FINAL;
bool paused() const; bool paused() const;
double defaultPlaybackRate() const; double defaultPlaybackRate() const;
void setDefaultPlaybackRate(double); void setDefaultPlaybackRate(double, ExceptionState&);
double playbackRate() const; double playbackRate() const;
void setPlaybackRate(double); void setPlaybackRate(double, ExceptionState&);
void updatePlaybackRate(); void updatePlaybackRate();
PassRefPtr<TimeRanges> played(); PassRefPtr<TimeRanges> played();
PassRefPtr<TimeRanges> seekable() const; PassRefPtr<TimeRanges> seekable() const;
...@@ -391,8 +391,6 @@ private: ...@@ -391,8 +391,6 @@ private:
// Pauses playback without changing any states or generating events // Pauses playback without changing any states or generating events
void setPausedInternal(bool); void setPausedInternal(bool);
void setPlaybackRateInternal(double);
void setShouldDelayLoadEvent(bool); void setShouldDelayLoadEvent(bool);
void invalidateCachedTime(); void invalidateCachedTime();
void refreshCachedTime() const; void refreshCachedTime() const;
......
...@@ -57,11 +57,12 @@ ...@@ -57,11 +57,12 @@
readonly attribute boolean seeking; readonly attribute boolean seeking;
// playback state // playback state
// FIXME: generated bindings should check isfinite: http://crbug.com/354298
[RaisesException=Setter] attribute double currentTime; [RaisesException=Setter] attribute double currentTime;
readonly attribute double duration; readonly attribute double duration;
readonly attribute boolean paused; readonly attribute boolean paused;
attribute double defaultPlaybackRate; [RaisesException=Setter] attribute double defaultPlaybackRate;
attribute double playbackRate; [RaisesException=Setter] attribute double playbackRate;
readonly attribute TimeRanges played; readonly attribute TimeRanges played;
readonly attribute TimeRanges seekable; readonly attribute TimeRanges seekable;
readonly attribute boolean ended; readonly attribute boolean ended;
......
...@@ -160,6 +160,12 @@ double MediaController::currentTime() const ...@@ -160,6 +160,12 @@ double MediaController::currentTime() const
void MediaController::setCurrentTime(double time, ExceptionState& exceptionState) void MediaController::setCurrentTime(double time, ExceptionState& exceptionState)
{ {
// FIXME: generated bindings should check isfinite: http://crbug.com/354298
if (!std::isfinite(time)) {
exceptionState.throwTypeError(ExceptionMessages::notAFiniteNumber(time));
return;
}
// When the user agent is to seek the media controller to a particular new playback position, // When the user agent is to seek the media controller to a particular new playback position,
// it must follow these steps: // it must follow these steps:
// If the new playback position is less than zero, then set it to zero. // If the new playback position is less than zero, then set it to zero.
...@@ -218,8 +224,14 @@ void MediaController::pause() ...@@ -218,8 +224,14 @@ void MediaController::pause()
reportControllerState(); reportControllerState();
} }
void MediaController::setDefaultPlaybackRate(double rate) void MediaController::setDefaultPlaybackRate(double rate, ExceptionState& exceptionState)
{ {
// FIXME: generated bindings should check isfinite: http://crbug.com/354298
if (!std::isfinite(rate)) {
exceptionState.throwTypeError(ExceptionMessages::notAFiniteNumber(rate));
return;
}
if (m_defaultPlaybackRate == rate) if (m_defaultPlaybackRate == rate)
return; return;
...@@ -236,8 +248,14 @@ double MediaController::playbackRate() const ...@@ -236,8 +248,14 @@ double MediaController::playbackRate() const
return m_clock->playRate(); return m_clock->playRate();
} }
void MediaController::setPlaybackRate(double rate) void MediaController::setPlaybackRate(double rate, ExceptionState& exceptionState)
{ {
// FIXME: generated bindings should check isfinite: http://crbug.com/354298
if (!std::isfinite(rate)) {
exceptionState.throwTypeError(ExceptionMessages::notAFiniteNumber(rate));
return;
}
if (m_clock->playRate() == rate) if (m_clock->playRate() == rate)
return; return;
...@@ -254,6 +272,12 @@ void MediaController::setPlaybackRate(double rate) ...@@ -254,6 +272,12 @@ void MediaController::setPlaybackRate(double rate)
void MediaController::setVolume(double level, ExceptionState& exceptionState) void MediaController::setVolume(double level, ExceptionState& exceptionState)
{ {
// FIXME: generated bindings should check isfinite: http://crbug.com/354298
if (!std::isfinite(level)) {
exceptionState.throwTypeError(ExceptionMessages::notAFiniteNumber(level));
return;
}
if (m_volume == level) if (m_volume == level)
return; return;
......
...@@ -67,10 +67,10 @@ public: ...@@ -67,10 +67,10 @@ public:
void unpause(); void unpause();
double defaultPlaybackRate() const { return m_defaultPlaybackRate; } double defaultPlaybackRate() const { return m_defaultPlaybackRate; }
void setDefaultPlaybackRate(double); void setDefaultPlaybackRate(double, ExceptionState&);
double playbackRate() const; double playbackRate() const;
void setPlaybackRate(double); void setPlaybackRate(double, ExceptionState&);
double volume() const { return m_volume; } double volume() const { return m_volume; }
void setVolume(double, ExceptionState&); void setVolume(double, ExceptionState&);
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
readonly attribute TimeRanges seekable; readonly attribute TimeRanges seekable;
readonly attribute double duration; readonly attribute double duration;
// FIXME: generated bindings should check isfinite: http://crbug.com/354298
[RaisesException=Setter] attribute double currentTime; [RaisesException=Setter] attribute double currentTime;
readonly attribute boolean paused; readonly attribute boolean paused;
...@@ -41,8 +42,8 @@ ...@@ -41,8 +42,8 @@
void pause(); void pause();
void unpause(); void unpause();
attribute double defaultPlaybackRate; [RaisesException=Setter] attribute double defaultPlaybackRate;
attribute double playbackRate; [RaisesException=Setter] attribute double playbackRate;
[RaisesException=Setter] attribute double volume; [RaisesException=Setter] attribute double volume;
attribute boolean muted; attribute boolean muted;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment