/* * Copyright (C) 1999 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) * Copyright (C) 2008, 2016 Apple Inc. All rights reserved. * Copyright (C) 2008 Eric Seidel * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef ScriptController_h #define ScriptController_h #include "FrameLoaderTypes.h" #include "JSDOMWindowShell.h" #include #include #include #include #include #if PLATFORM(COCOA) #include 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> RootObjectMap; enum ReasonForCallingCanExecuteScripts { AboutToExecuteScript, NotAboutToExecuteScript }; class ScriptController { WTF_MAKE_FAST_ALLOCATED; typedef HashMap, JSC::Strong> ShellMap; public: explicit ScriptController(Frame&); ~ScriptController(); WEBCORE_EXPORT static Ref createWorld(); JSDOMWindowShell* createWindowShell(DOMWrapperWorld&); void destroyWindowShell(DOMWrapperWorld&); Vector> 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>&); Deprecated::ScriptValue executeScript(const ScriptSourceCode&, ExceptionDetails* = nullptr); WEBCORE_EXPORT Deprecated::ScriptValue executeScript(const String& script, bool forceUserGesture = false, ExceptionDetails* = nullptr); WEBCORE_EXPORT Deprecated::ScriptValue executeScriptInWorld(DOMWrapperWorld&, const String& script, bool forceUserGesture = false); // Returns true if argument is a JavaScript URL. bool executeIfJavaScriptURL(const URL&, ShouldReplaceDocumentIfJavaScriptURL shouldReplaceDocumentIfJavaScriptURL = ReplaceDocumentIfJavaScriptURL); // This function must be called from the main thread. It is safe to call it repeatedly. // Darwin is an exception to this rule: it is OK to call this function from any thread, even reentrantly. static void initializeThreading(); Deprecated::ScriptValue evaluate(const ScriptSourceCode&, ExceptionDetails* = nullptr); Deprecated::ScriptValue evaluateInWorld(const ScriptSourceCode&, DOMWrapperWorld&, ExceptionDetails* = nullptr); 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); // Debugger can be 0 to detach any existing Debugger. void attachDebugger(JSC::Debugger*); // Attaches/detaches in all worlds/window shells. 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; } // 0 if we are not evaluating any script void clearWindowShellsNotMatchingDOMWindow(DOMWindow* newDOMWindow, bool goingIntoPageCache); void setDOMWindowForWindowShell(DOMWindow* newDOMWindow); void updateDocument(); void namedItemAdded(HTMLDocument*, const AtomicString&) { } void namedItemRemoved(HTMLDocument*, const AtomicString&) { } void clearScriptObjects(); WEBCORE_EXPORT void cleanupScriptObjectsForPlugin(void*); void updatePlatformScriptObjects(); RefPtr createScriptInstanceForWidget(Widget*); JSC::Bindings::RootObject* bindingRootObject(); JSC::Bindings::RootObject* cacheableBindingRootObject(); WEBCORE_EXPORT RefPtr createRootObject(void* nativeHandle); void collectIsolatedContexts(Vector>&); #if PLATFORM(COCOA) WEBCORE_EXPORT WebScriptObject* windowScriptObject(); WEBCORE_EXPORT JSContext *javaScriptContext(); #endif WEBCORE_EXPORT JSC::JSObject* jsObjectForPluginElement(HTMLPlugInElement*); #if ENABLE(NETSCAPE_PLUGIN_API) NPObject* createScriptObjectForPluginElement(HTMLPlugInElement*); WEBCORE_EXPORT NPObject* windowScriptNPObject(); #endif private: WEBCORE_EXPORT JSDOMWindowShell* initScript(DOMWrapperWorld&); void disconnectPlatformScriptObjects(); ShellMap m_windowShells; Frame& m_frame; const String* m_sourceURL; bool m_paused; // The root object used for objects bound outside the context of a plugin, such // as NPAPI plugins. The plugins using these objects prevent a page from being cached so they // are safe to invalidate() when WebKit navigates away from the page that contains them. RefPtr m_bindingRootObject; // Unlike m_bindingRootObject these objects are used in pages that are cached, so they are not invalidate()'d. // This ensures they are still available when the page is restored. RefPtr m_cacheableBindingRootObject; RootObjectMap m_rootObjects; #if ENABLE(NETSCAPE_PLUGIN_API) NPObject* m_windowScriptNPObject; #endif #if PLATFORM(COCOA) RetainPtr m_windowScriptObject; #endif }; } // namespace WebCore #endif // ScriptController_h