ScriptController.h [plain text]
#ifndef ScriptController_h
#define ScriptController_h
#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 JSGlobalObject;
class ExecState;
namespace Bindings {
class Instance;
class RootObject;
}
}
namespace WebCore {
class Frame;
class HTMLDocument;
class HTMLPlugInElement;
class ScriptSourceCode;
class SecurityOrigin;
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();
static PassRefPtr<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>>&);
Deprecated::ScriptValue executeScript(const ScriptSourceCode&);
Deprecated::ScriptValue executeScript(const String& script, bool forceUserGesture = false);
Deprecated::ScriptValue executeScriptInWorld(DOMWrapperWorld&, const String& script, bool forceUserGesture = false);
bool executeIfJavaScriptURL(const URL&, ShouldReplaceDocumentIfJavaScriptURL shouldReplaceDocumentIfJavaScriptURL = ReplaceDocumentIfJavaScriptURL);
static void initializeThreading();
Deprecated::ScriptValue evaluate(const ScriptSourceCode&);
Deprecated::ScriptValue evaluateInWorld(const ScriptSourceCode&, DOMWrapperWorld&);
WTF::TextPosition eventHandlerPosition() const;
void enableEval();
void disableEval(const String& errorMessage);
static bool processingUserGesture();
static bool canAccessFromCurrentOrigin(Frame*);
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; }
void clearWindowShell(DOMWindow* newDOMWindow, bool goingIntoPageCache);
void updateDocument();
void namedItemAdded(HTMLDocument*, const AtomicString&) { }
void namedItemRemoved(HTMLDocument*, const AtomicString&) { }
void clearScriptObjects();
void cleanupScriptObjectsForPlugin(void*);
void updatePlatformScriptObjects();
PassRefPtr<JSC::Bindings::Instance> createScriptInstanceForWidget(Widget*);
JSC::Bindings::RootObject* bindingRootObject();
JSC::Bindings::RootObject* cacheableBindingRootObject();
PassRefPtr<JSC::Bindings::RootObject> createRootObject(void* nativeHandle);
#if ENABLE(INSPECTOR)
void collectIsolatedContexts(Vector<std::pair<JSC::ExecState*, SecurityOrigin*>>&);
#endif
#if PLATFORM(COCOA)
WebScriptObject* windowScriptObject();
JSContext *javaScriptContext();
#endif
JSC::JSObject* jsObjectForPluginElement(HTMLPlugInElement*);
#if ENABLE(NETSCAPE_PLUGIN_API)
NPObject* createScriptObjectForPluginElement(HTMLPlugInElement*);
NPObject* windowScriptNPObject();
#endif
bool shouldBypassMainWorldContentSecurityPolicy();
private:
JSDOMWindowShell* initScript(DOMWrapperWorld&);
void disconnectPlatformScriptObjects();
ShellMap m_windowShells;
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
};
}
#endif // ScriptController_h