Title: [98802] trunk/Source/WebCore
Revision
98802
Author
aba...@webkit.org
Date
2011-10-29 02:10:31 -0700 (Sat, 29 Oct 2011)

Log Message

DOMURL should keep its own state rather than storing it on ScriptExecutionContext
https://bugs.webkit.org/show_bug.cgi?id=71169

Reviewed by Eric Seidel.

This patch untwists this code.  I think this code was originally
twisted because these APIs moved onto DOMURL after they were first
implemented.

* dom/ScriptExecutionContext.cpp:
(WebCore::ScriptExecutionContext::~ScriptExecutionContext):
* dom/ScriptExecutionContext.h:
* fileapi/FileWriter.h:
* html/DOMURL.cpp:
(WebCore::DOMURL::contextDestroyed):
(WebCore::DOMURL::createObjectURL):
(WebCore::DOMURL::revokeObjectURL):
* html/DOMURL.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (98801 => 98802)


--- trunk/Source/WebCore/ChangeLog	2011-10-29 08:21:28 UTC (rev 98801)
+++ trunk/Source/WebCore/ChangeLog	2011-10-29 09:10:31 UTC (rev 98802)
@@ -1,3 +1,24 @@
+2011-10-29  Adam Barth  <aba...@webkit.org>
+
+        DOMURL should keep its own state rather than storing it on ScriptExecutionContext
+        https://bugs.webkit.org/show_bug.cgi?id=71169
+
+        Reviewed by Eric Seidel.
+
+        This patch untwists this code.  I think this code was originally
+        twisted because these APIs moved onto DOMURL after they were first
+        implemented.
+
+        * dom/ScriptExecutionContext.cpp:
+        (WebCore::ScriptExecutionContext::~ScriptExecutionContext):
+        * dom/ScriptExecutionContext.h:
+        * fileapi/FileWriter.h:
+        * html/DOMURL.cpp:
+        (WebCore::DOMURL::contextDestroyed):
+        (WebCore::DOMURL::createObjectURL):
+        (WebCore::DOMURL::revokeObjectURL):
+        * html/DOMURL.h:
+
 2011-10-29  Sheriff Bot  <webkit.review....@gmail.com>
 
         Unreviewed, rolling out r98795.

Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.cpp (98801 => 98802)


--- trunk/Source/WebCore/dom/ScriptExecutionContext.cpp	2011-10-29 08:21:28 UTC (rev 98801)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.cpp	2011-10-29 09:10:31 UTC (rev 98802)
@@ -28,11 +28,8 @@
 #include "ScriptExecutionContext.h"
 
 #include "ActiveDOMObject.h"
-#include "Blob.h"
-#include "BlobURL.h"
 #include "ContentSecurityPolicy.h"
 #include "DOMTimer.h"
-#include "DOMURL.h"
 #include "Database.h"
 #include "DatabaseTask.h"
 #include "DatabaseThread.h"
@@ -44,7 +41,6 @@
 #include "ScriptCallStack.h"
 #include "SecurityOrigin.h"
 #include "Settings.h"
-#include "ThreadableBlobRegistry.h"
 #include "WorkerContext.h"
 #include "WorkerThread.h"
 #include <wtf/MainThread.h>
@@ -52,14 +48,10 @@
 #include <wtf/Vector.h>
 
 #if USE(JSC)
+// FIXME: This is a layering violation.
 #include "JSDOMWindow.h"
 #endif
 
-#if ENABLE(MEDIA_STREAM)
-#include "MediaStream.h"
-#include "MediaStreamRegistry.h"
-#endif
-
 namespace WebCore {
 
 class ProcessMessagesSoonTask : public ScriptExecutionContext::Task {
@@ -129,18 +121,6 @@
         m_fileThread = 0;
     }
 #endif
-
-#if ENABLE(BLOB)
-    HashSet<String>::iterator publicBlobURLsEnd = m_publicBlobURLs.end();
-    for (HashSet<String>::iterator iter = m_publicBlobURLs.begin(); iter != publicBlobURLsEnd; ++iter)
-        ThreadableBlobRegistry::unregisterBlobURL(KURL(ParsedURLString, *iter));
-#endif
-
-#if ENABLE(MEDIA_STREAM)
-    HashSet<String>::iterator publicStreamURLsEnd = m_publicStreamURLs.end();
-    for (HashSet<String>::iterator iter = m_publicStreamURLs.begin(); iter != publicStreamURLsEnd; ++iter)
-        MediaStreamRegistry::registry().unregisterMediaStreamURL(KURL(ParsedURLString, *iter));
-#endif
 }
 
 #if ENABLE(SQL_DATABASE)
@@ -387,54 +367,6 @@
     return m_timeouts.get(timeoutId);
 }
 
-#if ENABLE(BLOB)
-
-#if ENABLE(MEDIA_STREAM)
-KURL ScriptExecutionContext::createPublicBlobURL(MediaStream* stream)
-{
-    if (!stream)
-        return KURL();
-
-    KURL publicURL = BlobURL::createPublicURL(securityOrigin());
-
-    // Since WebWorkers cannot obtain Stream objects, we should be on the main thread.
-    ASSERT(isMainThread());
-    MediaStreamRegistry::registry().registerMediaStreamURL(publicURL, stream);
-    m_publicStreamURLs.add(publicURL.string());
-    return publicURL;
-}
-#endif // ENABLE(MEDIA_STREAM)
-
-KURL ScriptExecutionContext::createPublicBlobURL(Blob* blob)
-{
-    if (!blob)
-        return KURL();
-    KURL publicURL = BlobURL::createPublicURL(securityOrigin());
-    if (publicURL.isEmpty())
-        return KURL();
-    ThreadableBlobRegistry::registerBlobURL(publicURL, blob->url());
-    m_publicBlobURLs.add(publicURL.string());
-    return publicURL;
-}
-
-void ScriptExecutionContext::revokePublicBlobURL(const KURL& url)
-{
-    if (m_publicBlobURLs.contains(url.string())) {
-        ThreadableBlobRegistry::unregisterBlobURL(url);
-        m_publicBlobURLs.remove(url.string());
-    }
-#if ENABLE(MEDIA_STREAM)
-    if (m_publicStreamURLs.contains(url.string())) {
-        // FIXME: make sure of this assertion below. Raise a spec question if required.
-        // Since WebWorkers cannot obtain Stream objects, we should be on the main thread.
-        ASSERT(isMainThread());
-        MediaStreamRegistry::registry().unregisterMediaStreamURL(url);
-        m_publicStreamURLs.remove(url.string());
-    }
-#endif // ENABLE(MEDIA_STREAM)
-}
-#endif // ENABLE(BLOB)
-
 #if ENABLE(BLOB) || ENABLE(FILE_SYSTEM)
 FileThread* ScriptExecutionContext::fileThread()
 {

Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.h (98801 => 98802)


--- trunk/Source/WebCore/dom/ScriptExecutionContext.h	2011-10-29 08:21:28 UTC (rev 98801)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.h	2011-10-29 09:10:31 UTC (rev 98802)
@@ -47,10 +47,8 @@
 
 namespace WebCore {
 
-class Blob;
 class ContentSecurityPolicy;
 class DOMTimer;
-class DOMURL;
 class EventListener;
 class EventQueue;
 class EventTarget;
@@ -68,10 +66,6 @@
 class FileThread;
 #endif
 
-#if ENABLE(MEDIA_STREAM)
-class MediaStream;
-#endif
-
 class ScriptExecutionContext {
 public:
     ScriptExecutionContext();
@@ -153,14 +147,6 @@
     void removeTimeout(int timeoutId);
     DOMTimer* findTimeout(int timeoutId);
 
-#if ENABLE(BLOB)
-#if ENABLE(MEDIA_STREAM)
-    KURL createPublicBlobURL(MediaStream*);
-#endif // ENABLE(MEDIA_STREAM)
-    KURL createPublicBlobURL(Blob*);
-    void revokePublicBlobURL(const KURL&);
-#endif // ENABLE(BLOB)
-
 #if USE(JSC)
     JSC::JSGlobalData* globalData();
 #endif
@@ -206,11 +192,6 @@
     typedef HashMap<int, DOMTimer*> TimeoutMap;
     TimeoutMap m_timeouts;
 
-#if ENABLE(BLOB)
-    HashSet<String> m_publicBlobURLs;
-    HashSet<String> m_publicStreamURLs;
-#endif
-
     virtual void refScriptExecutionContext() = 0;
     virtual void derefScriptExecutionContext() = 0;
 

Modified: trunk/Source/WebCore/fileapi/FileWriter.h (98801 => 98802)


--- trunk/Source/WebCore/fileapi/FileWriter.h	2011-10-29 08:21:28 UTC (rev 98801)
+++ trunk/Source/WebCore/fileapi/FileWriter.h	2011-10-29 09:10:31 UTC (rev 98802)
@@ -43,6 +43,7 @@
 
 namespace WebCore {
 
+class Blob;
 class ScriptExecutionContext;
 
 class FileWriter : public FileWriterBase, public ActiveDOMObject, public EventTarget, public AsyncFileWriterClient {

Modified: trunk/Source/WebCore/html/DOMURL.cpp (98801 => 98802)


--- trunk/Source/WebCore/html/DOMURL.cpp	2011-10-29 08:21:28 UTC (rev 98801)
+++ trunk/Source/WebCore/html/DOMURL.cpp	2011-10-29 09:10:31 UTC (rev 98802)
@@ -29,9 +29,18 @@
 
 #include "DOMURL.h"
 
+#include "Blob.h"
+#include "BlobURL.h"
 #include "KURL.h"
 #include "ScriptExecutionContext.h"
+#include "ThreadableBlobRegistry.h"
+#include <wtf/MainThread.h>
 
+#if ENABLE(MEDIA_STREAM)
+#include "MediaStream.h"
+#include "MediaStreamRegistry.h"
+#endif
+
 namespace WebCore {
 
 DOMURL::DOMURL(ScriptExecutionContext* scriptExecutionContext)
@@ -43,27 +52,77 @@
 {
 }
 
+void DOMURL::contextDestroyed()
+{
+    ContextDestructionObserver::contextDestroyed();
+
+    HashSet<String>::iterator publicBlobURLsEnd = m_publicBlobURLs.end();
+    for (HashSet<String>::iterator iter = m_publicBlobURLs.begin(); iter != publicBlobURLsEnd; ++iter)
+        ThreadableBlobRegistry::unregisterBlobURL(KURL(ParsedURLString, *iter));
+
 #if ENABLE(MEDIA_STREAM)
+    HashSet<String>::iterator publicStreamURLsEnd = m_publicStreamURLs.end();
+    for (HashSet<String>::iterator iter = m_publicStreamURLs.begin(); iter != publicStreamURLsEnd; ++iter)
+        MediaStreamRegistry::registry().unregisterMediaStreamURL(KURL(ParsedURLString, *iter));
+#endif
+}
+
+#if ENABLE(MEDIA_STREAM)
 String DOMURL::createObjectURL(MediaStream* stream)
 {
-    if (!m_scriptExecutionContext)
+    if (!m_scriptExecutionContext || !stream)
         return String();
-    return m_scriptExecutionContext->createPublicBlobURL(stream).string();
+
+    KURL publicURL = BlobURL::createPublicURL(scriptExecutionContext()->securityOrigin());
+    if (publicURL.isEmpty())
+        return String();
+
+    // Since WebWorkers cannot obtain Stream objects, we should be on the main thread.
+    ASSERT(isMainThread());
+
+    MediaStreamRegistry::registry().registerMediaStreamURL(publicURL, stream);
+    m_publicStreamURLs.add(publicURL.string());
+
+    return publicURL.string();
 }
 #endif
 
 String DOMURL::createObjectURL(Blob* blob)
 {
-    if (!m_scriptExecutionContext)
+    if (!m_scriptExecutionContext || !blob)
         return String();
-    return m_scriptExecutionContext->createPublicBlobURL(blob).string();
+
+    KURL publicURL = BlobURL::createPublicURL(scriptExecutionContext()->securityOrigin());
+    if (publicURL.isEmpty())
+        return String();
+
+    ThreadableBlobRegistry::registerBlobURL(publicURL, blob->url());
+    m_publicBlobURLs.add(publicURL.string());
+
+    return publicURL.string();
 }
 
 void DOMURL::revokeObjectURL(const String& urlString)
 {
     if (!m_scriptExecutionContext)
         return;
-    m_scriptExecutionContext->revokePublicBlobURL(KURL(KURL(), urlString));
+
+    KURL url(KURL(), urlString);
+
+    if (m_publicBlobURLs.contains(url.string())) {
+        ThreadableBlobRegistry::unregisterBlobURL(url);
+        m_publicBlobURLs.remove(url.string());
+    }
+
+#if ENABLE(MEDIA_STREAM)
+    if (m_publicStreamURLs.contains(url.string())) {
+        // FIXME: make sure of this assertion below. Raise a spec question if required.
+        // Since WebWorkers cannot obtain Stream objects, we should be on the main thread.
+        ASSERT(isMainThread());
+        MediaStreamRegistry::registry().unregisterMediaStreamURL(url);
+        m_publicStreamURLs.remove(url.string());
+    }
+#endif
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/html/DOMURL.h (98801 => 98802)


--- trunk/Source/WebCore/html/DOMURL.h	2011-10-29 08:21:28 UTC (rev 98801)
+++ trunk/Source/WebCore/html/DOMURL.h	2011-10-29 09:10:31 UTC (rev 98802)
@@ -30,6 +30,7 @@
 
 #include "ActiveDOMObject.h"
 #include "PlatformString.h"
+#include <wtf/HashSet.h>
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
 
@@ -52,6 +53,13 @@
 
 private:
     explicit DOMURL(ScriptExecutionContext*);
+
+    virtual void contextDestroyed();
+
+    HashSet<String> m_publicBlobURLs;
+#if ENABLE(MEDIA_STREAM)
+    HashSet<String> m_publicStreamURLs;
+#endif
 };
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to