ScriptController.h [plain text]
#pragma once
#include "FrameLoaderTypes.h"
#include "JSDOMWindowProxy.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 JSC {
class ExecState;
class JSGlobalObject;
class JSInternalPromise;
class JSModuleRecord;
namespace Bindings {
class Instance;
class RootObject;
}
}
namespace WebCore {
class CachedScriptFetcher;
class Frame;
class HTMLDocument;
class HTMLPlugInElement;
class LoadableModuleScript;
class ScriptSourceCode;
class SecurityOrigin;
class URL;
class Widget;
struct ExceptionDetails;
enum ReasonForCallingCanExecuteScripts {
AboutToExecuteScript,
NotAboutToExecuteScript
};
class ScriptController {
WTF_MAKE_FAST_ALLOCATED;
using ProxyMap = HashMap<RefPtr<DOMWrapperWorld>, JSC::Strong<JSDOMWindowProxy>>;
using RootObjectMap = HashMap<void*, Ref<JSC::Bindings::RootObject>>;
public:
explicit ScriptController(Frame&);
~ScriptController();
WEBCORE_EXPORT static Ref<DOMWrapperWorld> createWorld();
JSDOMWindowProxy& createWindowProxy(DOMWrapperWorld&);
void destroyWindowProxy(DOMWrapperWorld&);
Vector<JSC::Strong<JSDOMWindowProxy>> windowProxies();
JSDOMWindowProxy* windowProxy(DOMWrapperWorld& world)
{
auto iter = m_windowProxies.find(&world);
return (iter != m_windowProxies.end()) ? iter->value.get() : initScript(world);
}
JSDOMWindowProxy* existingWindowProxy(DOMWrapperWorld& world) const
{
auto iter = m_windowProxies.find(&world);
return (iter != m_windowProxies.end()) ? iter->value.get() : 0;
}
JSDOMWindow* globalObject(DOMWrapperWorld& world)
{
return windowProxy(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(LoadableModuleScript&, const String& moduleName, DOMWrapperWorld&);
void loadModuleScript(LoadableModuleScript&, const String& moduleName);
void loadModuleScriptInWorld(LoadableModuleScript&, const ScriptSourceCode&, DOMWrapperWorld&);
void loadModuleScript(LoadableModuleScript&, const ScriptSourceCode&);
JSC::JSValue linkAndEvaluateModuleScriptInWorld(LoadableModuleScript& , DOMWrapperWorld&);
JSC::JSValue linkAndEvaluateModuleScript(LoadableModuleScript&);
JSC::JSValue evaluateModule(const URL&, JSC::JSModuleRecord&, DOMWrapperWorld&);
JSC::JSValue evaluateModule(const URL&, JSC::JSModuleRecord&);
WTF::TextPosition eventHandlerPosition() const;
void enableEval();
void enableWebAssembly();
void disableEval(const String& errorMessage);
void disableWebAssembly(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(JSDOMWindowProxy*, JSC::Debugger*);
void setPaused(bool b) { m_paused = b; }
bool isPaused() const { return m_paused; }
const String* sourceURL() const { return m_sourceURL; }
void clearWindowProxiesNotMatchingDOMWindow(DOMWindow*, bool goingIntoPageCache);
void setDOMWindowForWindowProxy(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 Ref<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 JSDOMWindowProxy* initScript(DOMWrapperWorld&);
void setupModuleScriptHandlers(LoadableModuleScript&, JSC::JSInternalPromise&, DOMWrapperWorld&);
void disconnectPlatformScriptObjects();
ProxyMap m_windowProxies;
Frame& m_frame;
const String* m_sourceURL;
bool m_paused;
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
};
}