ScriptController.h [plain text]
#pragma once
#include "FrameLoaderTypes.h"
#include "JSDOMWindowShell.h"
#include <JavaScriptCore/JSBase.h>
#include <heap/Strong.h>
#include <wtf/Forward.h>
#include <wtf/RefPtr.h>
#include <wtf/text/TextPosition.h>
#if PLATFORM(COCOA)
#include <wtf/RetainPtr.h>
OBJC_CLASS JSContext;
OBJC_CLASS WebScriptObject;
#endif
struct NPObject;
namespace Deprecated {
class ScriptValue;
}
namespace JSC {
class ExecState;
class JSGlobalObject;
class JSInternalPromise;
class JSModuleRecord;
namespace Bindings {
class Instance;
class RootObject;
}
}
namespace WebCore {
class CachedModuleScript;
class Frame;
class HTMLDocument;
class HTMLPlugInElement;
class SecurityOrigin;
class ScriptSourceCode;
class Widget;
typedef HashMap<void*, RefPtr<JSC::Bindings::RootObject>> RootObjectMap;
enum ReasonForCallingCanExecuteScripts {
AboutToExecuteScript,
NotAboutToExecuteScript
};
class ScriptController {
WTF_MAKE_FAST_ALLOCATED;
typedef HashMap<RefPtr<DOMWrapperWorld>, JSC::Strong<JSDOMWindowShell>> ShellMap;
public:
explicit ScriptController(Frame&);
~ScriptController();
WEBCORE_EXPORT static Ref<DOMWrapperWorld> createWorld();
JSDOMWindowShell& createWindowShell(DOMWrapperWorld&);
void destroyWindowShell(DOMWrapperWorld&);
Vector<JSC::Strong<JSDOMWindowShell>> windowShells();
JSDOMWindowShell* windowShell(DOMWrapperWorld& world)
{
ShellMap::iterator iter = m_windowShells.find(&world);
return (iter != m_windowShells.end()) ? iter->value.get() : initScript(world);
}
JSDOMWindowShell* existingWindowShell(DOMWrapperWorld& world) const
{
ShellMap::const_iterator iter = m_windowShells.find(&world);
return (iter != m_windowShells.end()) ? iter->value.get() : 0;
}
JSDOMWindow* globalObject(DOMWrapperWorld& world)
{
return windowShell(world)->window();
}
static void getAllWorlds(Vector<Ref<DOMWrapperWorld>>&);
JSC::JSValue executeScript(const ScriptSourceCode&, ExceptionDetails* = nullptr);
WEBCORE_EXPORT JSC::JSValue executeScript(const String& script, bool forceUserGesture = false, ExceptionDetails* = nullptr);
WEBCORE_EXPORT JSC::JSValue executeScriptInWorld(DOMWrapperWorld&, const String& script, bool forceUserGesture = false);
bool executeIfJavaScriptURL(const URL&, ShouldReplaceDocumentIfJavaScriptURL shouldReplaceDocumentIfJavaScriptURL = ReplaceDocumentIfJavaScriptURL);
static void initializeThreading();
JSC::JSValue evaluate(const ScriptSourceCode&, ExceptionDetails* = nullptr);
JSC::JSValue evaluateInWorld(const ScriptSourceCode&, DOMWrapperWorld&, ExceptionDetails* = nullptr);
void loadModuleScriptInWorld(CachedModuleScript&, const String& moduleName, DOMWrapperWorld&, Element&);
void loadModuleScript(CachedModuleScript&, const String& moduleName, Element&);
void loadModuleScriptInWorld(CachedModuleScript&, const ScriptSourceCode&, DOMWrapperWorld&, Element&);
void loadModuleScript(CachedModuleScript&, const ScriptSourceCode&, Element&);
JSC::JSValue linkAndEvaluateModuleScriptInWorld(CachedModuleScript& , DOMWrapperWorld&, Element&);
JSC::JSValue linkAndEvaluateModuleScript(CachedModuleScript&, Element&);
JSC::JSValue evaluateModule(const URL&, JSC::JSModuleRecord&, DOMWrapperWorld&);
JSC::JSValue evaluateModule(const URL&, JSC::JSModuleRecord&);
WTF::TextPosition eventHandlerPosition() const;
void enableEval();
void disableEval(const String& errorMessage);
WEBCORE_EXPORT static bool processingUserGesture();
WEBCORE_EXPORT static bool processingUserGestureForMedia();
static bool canAccessFromCurrentOrigin(Frame*);
WEBCORE_EXPORT bool canExecuteScripts(ReasonForCallingCanExecuteScripts);
void attachDebugger(JSC::Debugger*); void attachDebugger(JSDOMWindowShell*, JSC::Debugger*);
void setPaused(bool b) { m_paused = b; }
bool isPaused() const { return m_paused; }
const String* sourceURL() const { return m_sourceURL; }
const JSC::PrivateName& moduleLoaderAlreadyReportedErrorSymbol() const { return m_moduleLoaderAlreadyReportedErrorSymbol; }
const JSC::PrivateName& moduleLoaderFetchingIsCanceledSymbol() const { return m_moduleLoaderFetchingIsCanceledSymbol; }
void clearWindowShellsNotMatchingDOMWindow(DOMWindow*, bool goingIntoPageCache);
void setDOMWindowForWindowShell(DOMWindow*);
void updateDocument();
void namedItemAdded(HTMLDocument*, const AtomicString&) { }
void namedItemRemoved(HTMLDocument*, const AtomicString&) { }
void clearScriptObjects();
WEBCORE_EXPORT void cleanupScriptObjectsForPlugin(void*);
void updatePlatformScriptObjects();
RefPtr<JSC::Bindings::Instance> createScriptInstanceForWidget(Widget*);
WEBCORE_EXPORT JSC::Bindings::RootObject* bindingRootObject();
JSC::Bindings::RootObject* cacheableBindingRootObject();
WEBCORE_EXPORT RefPtr<JSC::Bindings::RootObject> createRootObject(void* nativeHandle);
void collectIsolatedContexts(Vector<std::pair<JSC::ExecState*, SecurityOrigin*>>&);
#if PLATFORM(COCOA)
WEBCORE_EXPORT WebScriptObject* windowScriptObject();
WEBCORE_EXPORT JSContext *javaScriptContext();
#endif
WEBCORE_EXPORT JSC::JSObject* jsObjectForPluginElement(HTMLPlugInElement*);
#if ENABLE(NETSCAPE_PLUGIN_API)
WEBCORE_EXPORT NPObject* windowScriptNPObject();
#endif
private:
WEBCORE_EXPORT JSDOMWindowShell* initScript(DOMWrapperWorld&);
void setupModuleScriptHandlers(CachedModuleScript&, JSC::JSInternalPromise&, DOMWrapperWorld&);
void disconnectPlatformScriptObjects();
ShellMap m_windowShells;
Frame& m_frame;
const String* m_sourceURL;
bool m_paused;
JSC::PrivateName m_moduleLoaderAlreadyReportedErrorSymbol;
JSC::PrivateName m_moduleLoaderFetchingIsCanceledSymbol;
RefPtr<JSC::Bindings::RootObject> m_bindingRootObject;
RefPtr<JSC::Bindings::RootObject> m_cacheableBindingRootObject;
RootObjectMap m_rootObjects;
#if ENABLE(NETSCAPE_PLUGIN_API)
NPObject* m_windowScriptNPObject;
#endif
#if PLATFORM(COCOA)
RetainPtr<WebScriptObject> m_windowScriptObject;
#endif
};
}