Modifying RTCSessionDescription object construction to match the spec

https://bugs.webkit.org/show_bug.cgi?id=124212

Patch by Thiago de Barros Lacerda <thiago.lacerda@openbossa.org> on 2013-11-13
Reviewed by Eric Carlson.

According to the spec the RTCSessionDescriptionInit parameter in RTCSessionDescription constructor is optional,
which must not be nullable. If the 'type' and/or 'sdp' keys are not present, the string object that stores
them in the RTCSessionDescription class, must be null in those cases. Also, if an object that is not a
Dictionary is passed as argument to the constructor, an exception must be raised.

Source/WebCore:

Existing test was updated.

* GNUmakefile.list.am:
* Modules/mediastream/RTCSessionDescription.cpp:
(WebCore::RTCSessionDescription::create):
* Modules/mediastream/RTCSessionDescription.idl:
* UseJSC.cmake:
* WebCore.vcxproj/WebCore.vcxproj:
* WebCore.vcxproj/WebCore.vcxproj.filters:
* WebCore.xcodeproj/project.pbxproj:
* bindings/js/JSRTCSessionDescriptionCustom.cpp: Added.
(WebCore::JSRTCSessionDescriptionConstructor::constructJSRTCSessionDescription):

LayoutTests:

* fast/mediastream/RTCSessionDescription-expected.txt:
* fast/mediastream/RTCSessionDescription.html:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@159230 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent 71116e05
2013-11-13 Thiago de Barros Lacerda <thiago.lacerda@openbossa.org>
Modifying RTCSessionDescription object construction to match the spec
https://bugs.webkit.org/show_bug.cgi?id=124212
Reviewed by Eric Carlson.
According to the spec the RTCSessionDescriptionInit parameter in RTCSessionDescription constructor is optional,
which must not be nullable. If the 'type' and/or 'sdp' keys are not present, the string object that stores
them in the RTCSessionDescription class, must be null in those cases. Also, if an object that is not a
Dictionary is passed as argument to the constructor, an exception must be raised.
* fast/mediastream/RTCSessionDescription-expected.txt:
* fast/mediastream/RTCSessionDescription.html:
2013-11-09 Martin Robinson <mrobinson@igalia.com>
[MathML] The double bar vertical delimiter does not stretch properly
......
......@@ -3,6 +3,7 @@ Tests RTCSessionDescription.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS sessionDescription = new RTCSessionDescription(); did not throw exception.
PASS sessionDescription = new RTCSessionDescription(initializer); did not throw exception.
PASS sessionDescription.type is "offer"
PASS sessionDescription.sdp is "foobar"
......@@ -10,11 +11,12 @@ PASS initializer = JSON.parse(JSON.stringify(sessionDescription)); did not throw
PASS sessionDescription = new RTCSessionDescription(initializer); did not throw exception.
PASS sessionDescription.type is "offer"
PASS sessionDescription.sdp is "foobar"
PASS new RTCSessionDescription({}); threw exception Error: TypeMismatchError: DOM Exception 17.
PASS new RTCSessionDescription(5); threw exception TypeError: Not an object..
PASS new RTCSessionDescription('foobar'); threw exception TypeError: Not an object..
PASS new RTCSessionDescription({type:'foobar', sdp:'x'}); threw exception Error: TypeMismatchError: DOM Exception 17.
PASS new RTCSessionDescription({type:'offer', sdp:''}); threw exception Error: TypeMismatchError: DOM Exception 17.
PASS new RTCSessionDescription(null); threw exception TypeError: Optional description init argument of RTCSessionDescription must be a valid Dictionary.
PASS new RTCSessionDescription(5); threw exception TypeError: Optional description init argument of RTCSessionDescription must be a valid Dictionary.
PASS new RTCSessionDescription('foobar'); threw exception TypeError: Optional description init argument of RTCSessionDescription must be a valid Dictionary.
PASS new RTCSessionDescription({type:'foobar', sdp:'x'}); threw exception TypeError: Invalid RTCSessionDescription constructor arguments.
PASS new RTCSessionDescription({type:'offer', sdp:''}); threw exception TypeError: Invalid RTCSessionDescription constructor arguments.
PASS new RTCSessionDescription({}); did not throw exception.
PASS new RTCSessionDescription({type:'offer', sdp:'x'}); did not throw exception.
PASS new RTCSessionDescription({type:'answer', sdp:'x'}); did not throw exception.
PASS new RTCSessionDescription({type:'pranswer', sdp:'x'}); did not throw exception.
......
......@@ -11,6 +11,7 @@
var initializer = {type:"offer", sdp:"foobar"};
var sessionDescription;
shouldNotThrow("sessionDescription = new RTCSessionDescription();");
shouldNotThrow("sessionDescription = new RTCSessionDescription(initializer);");
shouldBe('sessionDescription.type', '"offer"');
shouldBe('sessionDescription.sdp', '"foobar"');
......@@ -21,12 +22,13 @@
shouldBe('sessionDescription.type', '"offer"');
shouldBe('sessionDescription.sdp', '"foobar"');
shouldThrow("new RTCSessionDescription({});");
shouldThrow("new RTCSessionDescription(null);");
shouldThrow("new RTCSessionDescription(5);");
shouldThrow("new RTCSessionDescription('foobar');");
shouldThrow("new RTCSessionDescription({type:'foobar', sdp:'x'});");
shouldThrow("new RTCSessionDescription({type:'offer', sdp:''});");
shouldNotThrow("new RTCSessionDescription({});");
shouldNotThrow("new RTCSessionDescription({type:'offer', sdp:'x'});");
shouldNotThrow("new RTCSessionDescription({type:'answer', sdp:'x'});");
shouldNotThrow("new RTCSessionDescription({type:'pranswer', sdp:'x'});");
......
2013-11-13 Thiago de Barros Lacerda <thiago.lacerda@openbossa.org>
Modifying RTCSessionDescription object construction to match the spec
https://bugs.webkit.org/show_bug.cgi?id=124212
Reviewed by Eric Carlson.
According to the spec the RTCSessionDescriptionInit parameter in RTCSessionDescription constructor is optional,
which must not be nullable. If the 'type' and/or 'sdp' keys are not present, the string object that stores
them in the RTCSessionDescription class, must be null in those cases. Also, if an object that is not a
Dictionary is passed as argument to the constructor, an exception must be raised.
Existing test was updated.
* GNUmakefile.list.am:
* Modules/mediastream/RTCSessionDescription.cpp:
(WebCore::RTCSessionDescription::create):
* Modules/mediastream/RTCSessionDescription.idl:
* UseJSC.cmake:
* WebCore.vcxproj/WebCore.vcxproj:
* WebCore.vcxproj/WebCore.vcxproj.filters:
* WebCore.xcodeproj/project.pbxproj:
* bindings/js/JSRTCSessionDescriptionCustom.cpp: Added.
(WebCore::JSRTCSessionDescriptionConstructor::constructJSRTCSessionDescription):
2013-11-13 Tim Horton <timothy_horton@apple.com>
Fix release build after r159224.
......
......@@ -2389,6 +2389,7 @@ webcore_sources += \
Source/WebCore/bindings/js/JSSQLTransactionCustom.cpp \
Source/WebCore/bindings/js/JSSQLTransactionSyncCustom.cpp \
Source/WebCore/bindings/js/JSRTCPeerConnectionCustom.cpp \
Source/WebCore/bindings/js/JSRTCSessionDescriptionCustom.cpp \
Source/WebCore/bindings/js/JSRTCStatsResponseCustom.cpp \
Source/WebCore/bindings/js/JSSharedWorkerCustom.cpp \
Source/WebCore/bindings/js/JSStorageCustom.cpp \
......
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
* Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -49,14 +50,14 @@ PassRefPtr<RTCSessionDescription> RTCSessionDescription::create(const Dictionary
{
String type;
bool ok = dictionary.get("type", type);
if (!ok || !verifyType(type)) {
if (ok && !verifyType(type)) {
ec = TYPE_MISMATCH_ERR;
return 0;
}
String sdp;
ok = dictionary.get("sdp", sdp);
if (!ok || sdp.isEmpty()) {
if (ok && sdp.isEmpty()) {
ec = TYPE_MISMATCH_ERR;
return 0;
}
......
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
* Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -30,7 +31,7 @@
[
Conditional=MEDIA_STREAM,
Constructor(Dictionary dictionary),
CustomConstructor(optional Dictionary dictionary),
ConstructorRaisesException
] interface RTCSessionDescription {
[SetterRaisesException] attribute DOMString type;
......
......@@ -244,6 +244,7 @@ if (ENABLE_MEDIA_STREAM)
bindings/js/JSMediaSourceStatesCustom.cpp
bindings/js/JSMediaStreamCapabilitiesCustom.cpp
bindings/js/JSRTCPeerConnectionCustom.cpp
bindings/js/JSRTCSessionDescriptionCustom.cpp
bindings/js/JSRTCStatsResponseCustom.cpp
)
endif ()
......
......@@ -16907,6 +16907,20 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\bindings\js\JSRTCSessionDescriptionCustom.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\bindings\js\JSRTCStatsResponseCustom.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
......@@ -4476,6 +4476,9 @@
<ClCompile Include="..\bindings\js\JSRTCPeerConnectionCustom.cpp">
<Filter>bindings\js</Filter>
</ClCompile>
<ClCompile Include="..\bindings\js\JSRTCSessionDescriptionCustom.cpp">
<Filter>bindings\js</Filter>
</ClCompile>
<ClCompile Include="..\bindings\js\JSRTCStatsResponseCustom.cpp">
<Filter>bindings\js</Filter>
</ClCompile>
......@@ -15098,4 +15101,4 @@
<Filter>platform\win</Filter>
</MASM>
</ItemGroup>
</Project>
\ No newline at end of file
</Project>
......@@ -321,6 +321,7 @@
07C59B7617F7D0DB000FBCBB /* CapabilityRange.h in Headers */ = {isa = PBXBuildFile; fileRef = 07C59B7417F7D09D000FBCBB /* CapabilityRange.h */; };
07CA120E182D67D800D12197 /* JSRTCPeerConnectionCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07CA120D182D67D800D12197 /* JSRTCPeerConnectionCustom.cpp */; };
07CE77D516712A6A00C55A47 /* InbandTextTrackPrivateClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 07CE77D416712A6A00C55A47 /* InbandTextTrackPrivateClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
07D07B141834158800ABDD3C /* JSRTCSessionDescriptionCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07D07B131834158800ABDD3C /* JSRTCSessionDescriptionCustom.cpp */; };
07DC5FD417D3EEE90099F890 /* JSRTCStatsResponseCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07DC5FD317D3EEE90099F890 /* JSRTCStatsResponseCustom.cpp */; };
07E116B11489C9A100EC5ACE /* JSTextTrackCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07E116B01489C9A100EC5ACE /* JSTextTrackCustom.cpp */; };
07E117071489EBEB00EC5ACE /* JSTextTrackCueCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07E117061489EBEB00EC5ACE /* JSTextTrackCueCustom.cpp */; };
......@@ -6862,6 +6863,7 @@
07C59B7517F7D09D000FBCBB /* CapabilityRange.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CapabilityRange.idl; sourceTree = "<group>"; };
07CA120D182D67D800D12197 /* JSRTCPeerConnectionCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSRTCPeerConnectionCustom.cpp; sourceTree = "<group>"; };
07CE77D416712A6A00C55A47 /* InbandTextTrackPrivateClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrackPrivateClient.h; sourceTree = "<group>"; };
07D07B131834158800ABDD3C /* JSRTCSessionDescriptionCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSRTCSessionDescriptionCustom.cpp; sourceTree = "<group>"; };
07DC5FD317D3EEE90099F890 /* JSRTCStatsResponseCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSRTCStatsResponseCustom.cpp; sourceTree = "<group>"; };
07E116B01489C9A100EC5ACE /* JSTextTrackCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackCustom.cpp; sourceTree = "<group>"; };
07E117061489EBEB00EC5ACE /* JSTextTrackCueCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackCueCustom.cpp; sourceTree = "<group>"; };
......@@ -19612,6 +19614,7 @@
BC4EDEF70C08F414007EDD49 /* Custom */ = {
isa = PBXGroup;
children = (
07D07B131834158800ABDD3C /* JSRTCSessionDescriptionCustom.cpp */,
0705851617FB40E9005F2BCB /* JSMediaStreamCapabilitiesCustom.cpp */,
07C59B6D17F794F6000FBCBB /* JSMediaSourceStatesCustom.cpp */,
BC2ED6BB0C6BD2F000920BFF /* JSAttrCustom.cpp */,
......@@ -25703,6 +25706,7 @@
41D015CB0F4B5C71004A662F /* ContentType.cpp in Sources */,
97627B8D14FB3CEE002CDCA1 /* ContextDestructionObserver.cpp in Sources */,
065AD4F60B0C2EDA005A2B1D /* ContextMenuController.cpp in Sources */,
07D07B141834158800ABDD3C /* JSRTCSessionDescriptionCustom.cpp in Sources */,
06027CB30B1CC03D00884B2D /* ContextMenuItemMac.mm in Sources */,
93B6A0EA0B0BCA8400F5027A /* ContextMenuMac.mm in Sources */,
FD31602812B0267600C1A359 /* ConvolverNode.cpp in Sources */,
/*
* Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#if ENABLE(MEDIA_STREAM)
#include "JSRTCSessionDescription.h"
#include "Dictionary.h"
#include "ExceptionCode.h"
using namespace JSC;
namespace WebCore {
EncodedJSValue JSC_HOST_CALL JSRTCSessionDescriptionConstructor::constructJSRTCSessionDescription(ExecState* exec)
{
ExceptionCode ec = 0;
Dictionary sessionInit;
if (exec->argumentCount() > 0) {
sessionInit = Dictionary(exec, exec->argument(0));
if (!sessionInit.isObject())
return throwVMError(exec, createTypeError(exec, "Optional RTCSessionDescription constructor argument must be a valid Dictionary"));
if (exec->hadException())
return JSValue::encode(jsUndefined());
}
JSRTCSessionDescriptionConstructor* jsConstructor = jsCast<JSRTCSessionDescriptionConstructor*>(exec->callee());
RefPtr<RTCSessionDescription> sessionDescription = RTCSessionDescription::create(sessionInit, ec);
if (ec == TYPE_MISMATCH_ERR) {
setDOMException(exec, ec);
return throwVMError(exec, createTypeError(exec, "Invalid RTCSessionDescription constructor arguments"));
}
if (ec) {
setDOMException(exec, ec);
return throwVMError(exec, createTypeError(exec, "Error creating RTCSessionDescription"));
}
return JSValue::encode(CREATE_DOM_WRAPPER(exec, jsConstructor->globalObject(), RTCSessionDescription, sessionDescription.get()));
}
} // namespace WebCore
#endif // ENABLE(MEDIA_STREAM)
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