Changeset 93713 in webkit


Ignore:
Timestamp:
Aug 24, 2011 11:07:43 AM (13 years ago)
Author:
commit-queue@webkit.org
Message:

MediaStream API: add createObjectURL functionality
https://bugs.webkit.org/show_bug.cgi?id=65925

Source/WebCore:

This patch introduces the functionality for generating the url associated with a MediaStream,
which can then be assigned to the src attribute of the <video> tag for example.

Patch by Tommy Widenflycht <tommyw@google.com> on 2011-08-24
Reviewed by Adam Barth.

  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • WebCore.gypi:
  • WebCore.pro:
  • WebCore.vcproj/WebCore.vcproj:
  • WebCore.xcodeproj/project.pbxproj:
  • dom/ScriptExecutionContext.cpp:

(WebCore::ScriptExecutionContext::~ScriptExecutionContext):
(WebCore::ScriptExecutionContext::createPublicBlobURL):
(WebCore::ScriptExecutionContext::revokePublicBlobURL):

  • dom/ScriptExecutionContext.h:
  • html/DOMURL.cpp:

(WebCore::DOMURL::createObjectURL):

  • html/DOMURL.h:
  • html/DOMURL.idl:
  • platform/MediaStreamRegistry.cpp: Added.

(WebCore::MediaStreamRegistry::registry):
(WebCore::MediaStreamRegistry::registerMediaStreamURL):
(WebCore::MediaStreamRegistry::unregisterMediaStreamURL):
(WebCore::MediaStreamRegistry::mediaStream):

  • platform/MediaStreamRegistry.h: Copied from Source/WebCore/html/DOMURL.h.

Tests for the Media Stream API will be provided by the bug 56587, pending enough landed code.

LayoutTests:

Patch by Tommy Widenflycht <tommyw@google.com> on 2011-08-24
Reviewed by Adam Barth.

  • fast/files/create-blob-url-crash-expected.txt:
Location:
trunk
Files:
1 added
14 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r93709 r93713  
     12011-08-24  Tommy Widenflycht  <tommyw@google.com>
     2
     3        MediaStream API: add createObjectURL functionality
     4        https://bugs.webkit.org/show_bug.cgi?id=65925
     5
     6        Reviewed by Adam Barth.
     7
     8        * fast/files/create-blob-url-crash-expected.txt:
     9
    1102011-08-23  David Levin  <levin@chromium.org>
    211
  • trunk/LayoutTests/fast/files/create-blob-url-crash-expected.txt

    r92327 r93713  
    11Test that createObjectURL with no argument should throw an exception.
    2 PASS: Not enough arguments
     2PASS: Type error
    33DONE
    44
  • trunk/Source/WebCore/CMakeLists.txt

    r93385 r93713  
    20482048        page/MediaStreamController.cpp
    20492049        page/MediaStreamFrameController.cpp
     2050        platform/MediaStreamRegistry.cpp
    20502051    )
    20512052
  • trunk/Source/WebCore/ChangeLog

    r93709 r93713  
     12011-08-24  Tommy Widenflycht  <tommyw@google.com>
     2
     3        MediaStream API: add createObjectURL functionality
     4        https://bugs.webkit.org/show_bug.cgi?id=65925
     5
     6        This patch introduces the functionality for generating the url associated with a MediaStream,
     7        which can then be assigned to the src attribute of the <video> tag for example.
     8
     9        Reviewed by Adam Barth.
     10
     11        * CMakeLists.txt:
     12        * GNUmakefile.list.am:
     13        * WebCore.gypi:
     14        * WebCore.pro:
     15        * WebCore.vcproj/WebCore.vcproj:
     16        * WebCore.xcodeproj/project.pbxproj:
     17        * dom/ScriptExecutionContext.cpp:
     18        (WebCore::ScriptExecutionContext::~ScriptExecutionContext):
     19        (WebCore::ScriptExecutionContext::createPublicBlobURL):
     20        (WebCore::ScriptExecutionContext::revokePublicBlobURL):
     21        * dom/ScriptExecutionContext.h:
     22        * html/DOMURL.cpp:
     23        (WebCore::DOMURL::createObjectURL):
     24        * html/DOMURL.h:
     25        * html/DOMURL.idl:
     26        * platform/MediaStreamRegistry.cpp: Added.
     27        (WebCore::MediaStreamRegistry::registry):
     28        (WebCore::MediaStreamRegistry::registerMediaStreamURL):
     29        (WebCore::MediaStreamRegistry::unregisterMediaStreamURL):
     30        (WebCore::MediaStreamRegistry::mediaStream):
     31        * platform/MediaStreamRegistry.h: Copied from Source/WebCore/html/DOMURL.h.
     32
     33        Tests for the Media Stream API will be provided by the bug 56587, pending enough landed code.
     34
    1352011-08-23  David Levin  <levin@chromium.org>
    236
  • trunk/Source/WebCore/GNUmakefile.list.am

    r93492 r93713  
    26452645        Source/WebCore/platform/MIMETypeRegistry.cpp \
    26462646        Source/WebCore/platform/MIMETypeRegistry.h \
     2647        Source/WebCore/platform/MediaStreamRegistry.cpp \
     2648        Source/WebCore/platform/MediaStreamRegistry.h \
    26472649        Source/WebCore/platform/MemoryPressureHandler.cpp \
    26482650        Source/WebCore/platform/MemoryPressureHandler.h \
  • trunk/Source/WebCore/WebCore.gypi

    r93705 r93713  
    30233023            'platform/LocalizedStrings.cpp',
    30243024            'platform/Logging.cpp',
     3025            'platform/MediaStreamRegistry.cpp',
     3026            'platform/MediaStreamRegistry.h',
    30253027            'platform/MemoryPressureHandler.cpp',
    30263028            'platform/MIMETypeRegistry.cpp',
  • trunk/Source/WebCore/WebCore.pro

    r93385 r93713  
    32613261        page/NavigatorUserMediaError.h \
    32623262        page/NavigatorUserMediaErrorCallback.h \
    3263         page/NavigatorUserMediaSuccessCallback.h
     3263        page/NavigatorUserMediaSuccessCallback.h \
     3264        platform/MediaStreamRegistry.h
    32643265
    32653266    SOURCES += \
     
    32723273        p2p/PeerConnection.cpp \
    32733274        page/MediaStreamController.cpp \
    3274         page/MediaStreamFrameController.cpp
     3275        page/MediaStreamFrameController.cpp \
     3276        platform/MediaStreamRegistry.cpp
    32753277
    32763278    v8 {
  • trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj

    r93705 r93713  
    2686326863                        </File>
    2686426864                        <File
     26865                                RelativePath="..\platform\MediaStreamRegistry.cpp"
     26866                                >
     26867                        </File>
     26868                        <File
     26869                                RelativePath="..\platform\MediaStreamRegistry.h"
     26870                                >
     26871                        </File>
     26872                        <File
    2686526873                                RelativePath="..\platform\MemoryPressureHandler.cpp"
    2686626874                                >
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r93385 r93713  
    11221122                4969B0F213D0B33F00DF3521 /* HitTestingTransformState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4969B0F013D0B33F00DF3521 /* HitTestingTransformState.cpp */; };
    11231123                4969B0F313D0B33F00DF3521 /* HitTestingTransformState.h in Headers */ = {isa = PBXBuildFile; fileRef = 4969B0F113D0B33F00DF3521 /* HitTestingTransformState.h */; };
     1124                49785EE013F192F000A795AD /* MediaStreamRegistry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49785EDE13F192F000A795AD /* MediaStreamRegistry.cpp */; };
     1125                49785EE113F192F000A795AD /* MediaStreamRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = 49785EDF13F192F000A795AD /* MediaStreamRegistry.h */; };
    11241126                4983913F0F1E767500C23782 /* JSWebKitCSSMatrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4983913D0F1E767500C23782 /* JSWebKitCSSMatrix.cpp */; };
    11251127                498391400F1E767500C23782 /* JSWebKitCSSMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = 4983913E0F1E767500C23782 /* JSWebKitCSSMatrix.h */; };
     
    77097711                4969B0F013D0B33F00DF3521 /* HitTestingTransformState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HitTestingTransformState.cpp; sourceTree = "<group>"; };
    77107712                4969B0F113D0B33F00DF3521 /* HitTestingTransformState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HitTestingTransformState.h; sourceTree = "<group>"; };
     7713                49785EDE13F192F000A795AD /* MediaStreamRegistry.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaStreamRegistry.cpp; sourceTree = "<group>"; };
     7714                49785EDF13F192F000A795AD /* MediaStreamRegistry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamRegistry.h; sourceTree = "<group>"; };
    77117715                4983913D0F1E767500C23782 /* JSWebKitCSSMatrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebKitCSSMatrix.cpp; sourceTree = "<group>"; };
    77127716                4983913E0F1E767500C23782 /* JSWebKitCSSMatrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebKitCSSMatrix.h; sourceTree = "<group>"; };
     
    1910919113                                A8239DFE09B3CF8A00B60641 /* Logging.cpp */,
    1911019114                                A8239DFF09B3CF8A00B60641 /* Logging.h */,
     19115                                49785EDE13F192F000A795AD /* MediaStreamRegistry.cpp */,
     19116                                49785EDF13F192F000A795AD /* MediaStreamRegistry.h */,
    1911119117                                657EDA061385CB97004E0645 /* MemoryPressureHandler.cpp */,
    1911219118                                657EDA071385CB97004E0645 /* MemoryPressureHandler.h */,
     
    2240622412                                B1E54596134629C10092A545 /* MediaStreamFrameController.h in Headers */,
    2240722413                                B14353D6138EA8ED00D53276 /* MediaStreamList.h in Headers */,
     22414                                49785EE113F192F000A795AD /* MediaStreamRegistry.h in Headers */,
    2240822415                                49C9F32613D574F90052600A /* MediaStreamTrack.h in Headers */,
    2240922416                                49C9F32313D574F90052600A /* MediaStreamTrackList.h in Headers */,
     
    2542325430                                B1E54595134629C10092A545 /* MediaStreamFrameController.cpp in Sources */,
    2542425431                                B14353D5138EA8ED00D53276 /* MediaStreamList.cpp in Sources */,
     25432                                49785EE013F192F000A795AD /* MediaStreamRegistry.cpp in Sources */,
    2542525433                                49C9F32713D574F90052600A /* MediaStreamTrack.cpp in Sources */,
    2542625434                                49C9F32413D574F90052600A /* MediaStreamTrackList.cpp in Sources */,
  • trunk/Source/WebCore/dom/ScriptExecutionContext.cpp

    r85094 r93713  
    4040#include "EventTarget.h"
    4141#include "FileThread.h"
     42#include "MediaStream.h"
     43#include "MediaStreamRegistry.h"
    4244#include "MessagePort.h"
    4345#include "ScriptCallStack.h"
     
    134136        (*iter)->contextDestroyed();
    135137    }
     138#endif
     139
     140#if ENABLE(MEDIA_STREAM)
     141    HashSet<String>::iterator publicStreamURLsEnd = m_publicStreamURLs.end();
     142    for (HashSet<String>::iterator iter = m_publicStreamURLs.begin(); iter != publicStreamURLsEnd; ++iter)
     143        MediaStreamRegistry::registry().unregisterMediaStreamURL(KURL(ParsedURLString, *iter));
    136144#endif
    137145}
     
    378386
    379387#if ENABLE(BLOB)
     388
     389#if ENABLE(MEDIA_STREAM)
     390KURL ScriptExecutionContext::createPublicBlobURL(MediaStream* stream)
     391{
     392    if (!stream)
     393        return KURL();
     394
     395    KURL publicURL = BlobURL::createPublicURL(securityOrigin());
     396
     397    // Since WebWorkers cannot obtain Stream objects, we should be on the main thread.
     398    ASSERT(isMainThread());
     399    MediaStreamRegistry::registry().registerMediaStreamURL(publicURL, stream);
     400    m_publicStreamURLs.add(publicURL.string());
     401    return publicURL;
     402}
     403#endif // ENABLE(MEDIA_STREAM)
     404
    380405KURL ScriptExecutionContext::createPublicBlobURL(Blob* blob)
    381406{
     
    396421        m_publicBlobURLs.remove(url.string());
    397422    }
    398 }
    399 #endif
     423#if ENABLE(MEDIA_STREAM)
     424    if (m_publicStreamURLs.contains(url.string())) {
     425        // FIXME: make sure of this assertion below. Raise a spec question if required.
     426        // Since WebWorkers cannot obtain Stream objects, we should be on the main thread.
     427        ASSERT(isMainThread());
     428        MediaStreamRegistry::registry().unregisterMediaStreamURL(url);
     429        m_publicStreamURLs.remove(url.string());
     430    }
     431#endif // ENABLE(MEDIA_STREAM)
     432}
     433#endif // ENABLE(BLOB)
    400434
    401435#if ENABLE(BLOB) || ENABLE(FILE_SYSTEM)
  • trunk/Source/WebCore/dom/ScriptExecutionContext.h

    r86251 r93713  
    6767#endif
    6868
     69#if ENABLE(MEDIA_STREAM)
     70    class MediaStream;
     71#endif
     72
    6973    class ScriptExecutionContext {
    7074    public:
     
    145149
    146150#if ENABLE(BLOB)
     151#if ENABLE(MEDIA_STREAM)
     152        KURL createPublicBlobURL(MediaStream*);
     153#endif // ENABLE(MEDIA_STREAM)
    147154        KURL createPublicBlobURL(Blob*);
    148155        void revokePublicBlobURL(const KURL&);
    149 #endif
     156#endif // ENABLE(BLOB)
    150157
    151158#if USE(JSC)
     
    191198#if ENABLE(BLOB)
    192199        HashSet<String> m_publicBlobURLs;
     200        HashSet<String> m_publicStreamURLs;
    193201        HashSet<DOMURL*> m_domUrls;
    194202#endif
  • trunk/Source/WebCore/html/DOMURL.cpp

    r77914 r93713  
    5454}
    5555
     56#if ENABLE(MEDIA_STREAM)
     57String DOMURL::createObjectURL(MediaStream* stream)
     58{
     59    if (!m_scriptExecutionContext)
     60        return String();
     61    return m_scriptExecutionContext->createPublicBlobURL(stream).string();
     62}
     63#endif
     64
    5665String DOMURL::createObjectURL(Blob* blob)
    5766{
  • trunk/Source/WebCore/html/DOMURL.h

    r76652 r93713  
    3636
    3737class Blob;
     38class MediaStream;
    3839class ScriptExecutionContext;
    3940
     
    4344    ~DOMURL();
    4445
     46#if ENABLE(MEDIA_STREAM)
     47    String createObjectURL(MediaStream*);
     48#endif
    4549    String createObjectURL(Blob*);
    4650    void revokeObjectURL(const String&);
  • trunk/Source/WebCore/html/DOMURL.idl

    r92327 r93713  
    3232        NoStaticTables
    3333    ] DOMURL {
     34#if defined(ENABLE_MEDIA_STREAM) && ENABLE_MEDIA_STREAM
     35        [ConvertNullStringTo=Undefined] DOMString createObjectURL(in MediaStream stream);
     36#endif
    3437        [ConvertNullStringTo=Undefined] DOMString createObjectURL(in Blob blob);
    3538        void revokeObjectURL(in DOMString url);
  • trunk/Source/WebCore/platform/MediaStreamRegistry.h

    r93712 r93713  
    55 * modification, are permitted provided that the following conditions
    66 * are met:
    7  *
    87 * 1.  Redistributions of source code must retain the above copyright
    98 *     notice, this list of conditions and the following disclaimer.
     
    1211 *     documentation and/or other materials provided with the distribution.
    1312 *
    14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
    1514 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    1615 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
    1817 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    1918 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
    23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2423 */
    2524
    26 #ifndef DOMURL_h
    27 #define DOMURL_h
     25#ifndef MediaStreamRegistry_h
     26#define MediaStreamRegistry_h
    2827
    29 #if ENABLE(BLOB)
    30 
    31 #include "PlatformString.h"
     28#include <wtf/HashMap.h>
    3229#include <wtf/PassRefPtr.h>
    33 #include <wtf/RefCounted.h>
     30#include <wtf/text/StringHash.h>
    3431
    3532namespace WebCore {
    3633
    37 class Blob;
    38 class ScriptExecutionContext;
     34class KURL;
     35class MediaStream;
    3936
    40 class DOMURL : public RefCounted<DOMURL> {
     37class MediaStreamRegistry {
    4138public:
    42     static PassRefPtr<DOMURL> create(ScriptExecutionContext* scriptExecutionContext) { return adoptRef(new DOMURL(scriptExecutionContext)); }
    43     ~DOMURL();
     39    // Returns a single instance of MediaStreamRegistry.
     40    static MediaStreamRegistry& registry();
    4441
    45     String createObjectURL(Blob*);
    46     void revokeObjectURL(const String&);
    47 
    48     void contextDestroyed();
    49     ScriptExecutionContext* scriptExecutionContext() const { return m_scriptExecutionContext; }
     42    // Registers a blob URL referring to the specified stream data.
     43    void registerMediaStreamURL(const KURL&, PassRefPtr<MediaStream>);
     44    void unregisterMediaStreamURL(const KURL&);
     45    MediaStream* mediaStream(const KURL&) const;
    5046
    5147private:
    52     explicit DOMURL(ScriptExecutionContext*);
    53 
    54     ScriptExecutionContext* m_scriptExecutionContext;
     48    typedef HashMap<String, RefPtr<MediaStream> > URLStreamMap;
     49    URLStreamMap m_streams;
    5550};
    5651
    5752} // namespace WebCore
    5853
    59 #endif // ENABLE(BLOB)
    60 
    61 #endif // DOMURL_h
     54#endif // MediaStreamRegistry_h
Note: See TracChangeset for help on using the changeset viewer.