Reviewed by Darin Adler.
https://bugs.webkit.org/show_bug.cgi?id=21923
Create an abstraction for script execution context
* GNUmakefile.am:
* WebCore.pro:
* WebCore.vcproj/WebCore.vcproj:
* WebCore.xcodeproj/project.pbxproj:
* WebCoreSources.bkl:
Added ScriptExecutionContext.{h,cpp}.
* bindings/js/JSAudioConstructor.cpp:
(WebCore::JSAudioConstructor::JSAudioConstructor):
* bindings/js/JSAudioConstructor.h:
* bindings/js/JSImageConstructor.cpp:
(WebCore::JSImageConstructor::JSImageConstructor):
* bindings/js/JSImageConstructor.h:
* bindings/js/JSOptionConstructor.cpp:
(WebCore::JSOptionConstructor::JSOptionConstructor):
* bindings/js/JSOptionConstructor.h:
* bindings/js/JSXMLHttpRequestConstructor.cpp:
(WebCore::JSXMLHttpRequestConstructor::JSXMLHttpRequestConstructor):
* bindings/js/JSXMLHttpRequestConstructor.h:
Pass ScriptExecutionContext instead of Document to make getDOMConstructor() happy.
Since these objects can only work within documents now, it is immediately converted back
to Document.
* bindings/js/JSMessageChannelConstructor.cpp:
(WebCore::JSMessageChannelConstructor::JSMessageChannelConstructor):
(WebCore::JSMessageChannelConstructor::construct):
* bindings/js/JSMessageChannelConstructor.h:
(WebCore::JSMessageChannelConstructor::scriptExecutionContext):
MessageChannel needs to be supported in workers right away, so the constructor operates with
it directly.
* dom/ActiveDOMObject.cpp:
(WebCore::ActiveDOMObject::ActiveDOMObject):
(WebCore::ActiveDOMObject::~ActiveDOMObject):
(WebCore::ActiveDOMObject::contextDestroyed):
* dom/ActiveDOMObject.h:
(WebCore::ActiveDOMObject::scriptExecutionContext):
* bindings/js/JSDOMBinding.cpp:
(WebCore::markActiveObjectsForContext):
(WebCore::markCrossHeapDependentObjectsForContext):
Use ScriptExecutionContext instead of Document, now that ActiveDOMObject and MessagePort
tracking is handled by ScriptExecutionContext.
* bindings/js/JSDOMBinding.h: (WebCore::getDOMPrototype): Moved to JSDOMGlobalObject.
* bindings/js/JSDOMGlobalObject.h:
(WebCore::getDOMConstructor): Moved to this file, as constructors live in JSDOMGlobalObject.
Also, the two-argument version that used to be in JSDOMWindowBase.cpp need to be accessible
to worker context implementation.
(WebCore::scriptExecutionContext): Added a pure virtual method to access
ScriptExecutionContext, implemented by subclasses.
* bindings/js/JSDOMWindowBase.h:
* bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::scriptExecutionContext):
Implement by returning the associated document. Note that this method currently gives bogus
results after navigation - DOMWindow Frame reference is not zeroed out, so we get a document
that is currently in the frame, not the one associated with this window.
* bindings/js/JSDedicatedWorkerConstructor.cpp: Removed unnecessary include of DOMWindow.h.
* bindings/js/JSDocumentCustom.cpp: (WebCore::JSDocument::mark):
Call markActiveObjectsForContext() by its new name.
* dom/DedicatedWorker.cpp:
(WebCore::DedicatedWorker::DedicatedWorker):
(WebCore::DedicatedWorker::document):
* dom/DedicatedWorker.h:
* xml/XMLHttpRequest.cpp:
(WebCore::XMLHttpRequest::document):
* xml/XMLHttpRequest.h:
Added a document() function that upcasts ScriptExecutionContext, as these objects only work
within documents currently (at least for XMLHttpRequest, this will change soon though).
* dom/Document.cpp:
(WebCore::Document::Document):
(WebCore::Document::~Document):
Moved active object and MessagePort tracking up to ScriptExecutionContext, to share code
with workers.
* dom/Document.h:
(WebCore::Document::isDocument):
(WebCore::Document::refScriptExecutionContext):
(WebCore::Document::derefScriptExecutionContext):
Inherit from ScriptExecutionContext.
* dom/MessageChannel.cpp:
(WebCore::MessageChannel::MessageChannel):
* dom/MessageChannel.h:
(WebCore::MessageChannel::create):
Use ScriptExecutionContext instead of Document.
* dom/MessagePort.cpp:
(WebCore::CloseMessagePortTimer::CloseMessagePortTimer): Make m_port a RefPtr, because
MessagePort doesn't ref() itself when posting this event any more (this is a fix for an
unrelated issue that was causing random crashes in layout tests).
(WebCore::MessagePort::MessagePort):
(WebCore::MessagePort::~MessagePort):
(WebCore::MessagePort::associatedFrame):
(WebCore::MessagePort::clone):
(WebCore::MessagePort::postMessage):
(WebCore::MessagePort::startConversation):
(WebCore::MessagePort::start):
(WebCore::MessagePort::contextDestroyed):
(WebCore::MessagePort::dispatchMessages):
* dom/MessagePort.h:
(WebCore::MessagePort::create):
(WebCore::MessagePort::scriptExecutionContext):
Use ScriptExecutionContext instead of Document. This is a step toward making MessagePort
work in worker contexts - we need to also make some its method thread safe for cross-thread
messaging, and make event dispatching thread safe.
* dom/ScriptExecutionContext.cpp: Added.
* dom/ScriptExecutionContext.h: Added.
ActiveDOMObject and MessagePort tracking is moved from Document.
It is debatable whether ScriptExecutionContext should be a parent of Document or DOMWindow,
but as I'm just moving Document code, and it is Document that is the main context object
in our implementation currently.
Changing ScriptExecutionContext to be a parent of DOMWindow causes a number of bugs that
seem non-trivial to fix, and isn't really a part of this task.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@37966 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/WebCore.pro b/WebCore/WebCore.pro
index 6d42f2d..dd68bff 100644
--- a/WebCore/WebCore.pro
+++ b/WebCore/WebCore.pro
@@ -563,6 +563,7 @@
dom/Range.cpp \
dom/RegisteredEventListener.cpp \
dom/ScriptElement.cpp \
+ dom/ScriptExecutionContext.cpp \
dom/SelectorNodeList.cpp \
dom/StaticNodeList.cpp \
dom/StyledElement.cpp \