ScriptController.h [plain text]
#ifndef ScriptController_h
#define ScriptController_h
#include "FrameLoaderTypes.h"
#include "JSDOMWindowShell.h"
#include "ScriptControllerBase.h"
#include "ScriptInstance.h"
#include <heap/Strong.h>
#include <wtf/Forward.h>
#include <wtf/RefPtr.h>
#include <wtf/text/TextPosition.h>
#if PLATFORM(MAC)
#include <wtf/RetainPtr.h>
OBJC_CLASS WebScriptObject;
#endif
struct NPObject;
namespace JSC {
class JSGlobalObject;
namespace Bindings {
class RootObject;
}
}
namespace WebCore {
class HTMLPlugInElement;
class Frame;
class ScriptSourceCode;
class ScriptValue;
class Widget;
typedef HashMap<void*, RefPtr<JSC::Bindings::RootObject> > RootObjectMap;
class ScriptController {
friend class ScriptCachedFrameData;
typedef WTF::HashMap< RefPtr<DOMWrapperWorld>, JSC::Strong<JSDOMWindowShell> > ShellMap;
public:
ScriptController(Frame*);
~ScriptController();
static PassRefPtr<DOMWrapperWorld> createWorld();
JSDOMWindowShell* createWindowShell(DOMWrapperWorld*);
void destroyWindowShell(DOMWrapperWorld*);
JSDOMWindowShell* windowShell(DOMWrapperWorld* world)
{
ShellMap::iterator iter = m_windowShells.find(world);
return (iter != m_windowShells.end()) ? iter->second.get() : initScript(world);
}
JSDOMWindowShell* existingWindowShell(DOMWrapperWorld* world) const
{
ShellMap::const_iterator iter = m_windowShells.find(world);
return (iter != m_windowShells.end()) ? iter->second.get() : 0;
}
JSDOMWindow* globalObject(DOMWrapperWorld* world)
{
return windowShell(world)->window();
}
static void getAllWorlds(Vector<RefPtr<DOMWrapperWorld> >&);
ScriptValue executeScript(const ScriptSourceCode&);
ScriptValue executeScript(const String& script, bool forceUserGesture = false);
ScriptValue executeScriptInWorld(DOMWrapperWorld*, const String& script, bool forceUserGesture = false);
bool executeIfJavaScriptURL(const KURL&, ShouldReplaceDocumentIfJavaScriptURL shouldReplaceDocumentIfJavaScriptURL = ReplaceDocumentIfJavaScriptURL);
static void initializeThreading();
ScriptValue evaluate(const ScriptSourceCode&);
ScriptValue evaluateInWorld(const ScriptSourceCode&, DOMWrapperWorld*);
WTF::TextPosition eventHandlerPosition() const;
void disableEval();
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(bool goingIntoPageCache = false);
void updateDocument();
void namedItemAdded(HTMLDocument*, const AtomicString&) { }
void namedItemRemoved(HTMLDocument*, const AtomicString&) { }
void updateSecurityOrigin();
void clearScriptObjects();
void cleanupScriptObjectsForPlugin(void*);
void updatePlatformScriptObjects();
PassScriptInstance createScriptInstanceForWidget(Widget*);
JSC::Bindings::RootObject* bindingRootObject();
JSC::Bindings::RootObject* cacheableBindingRootObject();
PassRefPtr<JSC::Bindings::RootObject> createRootObject(void* nativeHandle);
#if ENABLE(INSPECTOR)
static void setCaptureCallStackForUncaughtExceptions(bool);
#endif
#if PLATFORM(MAC)
#if ENABLE(JAVA_BRIDGE)
static void initJavaJSBindings();
#endif
WebScriptObject* windowScriptObject();
#endif
JSC::JSObject* jsObjectForPluginElement(HTMLPlugInElement*);
#if ENABLE(NETSCAPE_PLUGIN_API)
NPObject* createScriptObjectForPluginElement(HTMLPlugInElement*);
NPObject* windowScriptNPObject();
#endif
private:
JSDOMWindowShell* initScript(DOMWrapperWorld* world);
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(MAC)
RetainPtr<WebScriptObject> m_windowScriptObject;
#endif
};
}
#endif // ScriptController_h