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