1 /* 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 3 * Copyright (C) 2012 Google Inc. All Rights Reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * 26 */ 27 28 #ifndef ExecutionContext_h 29 #define ExecutionContext_h 30 31 #include "core/dom/ActiveDOMObject.h" 32 #include "core/dom/ExecutionContextClient.h" 33 #include "core/dom/SandboxFlags.h" 34 #include "core/dom/SecurityContext.h" 35 #include "core/events/ErrorEvent.h" 36 #include "core/fetch/CrossOriginAccessControl.h" 37 #include "core/frame/ConsoleTypes.h" 38 #include "core/frame/DOMTimer.h" 39 #include "platform/LifecycleContext.h" 40 #include "platform/weborigin/KURL.h" 41 #include "wtf/Functional.h" 42 #include "wtf/OwnPtr.h" 43 #include "wtf/PassOwnPtr.h" 44 45 namespace WTF { 46 class OrdinalNumber; 47 } 48 49 namespace WebCore { 50 51 class ContextLifecycleNotifier; 52 class DOMWindow; 53 class EventListener; 54 class EventQueue; 55 class EventTarget; 56 class ExecutionContextTask; 57 class PublicURLManager; 58 class SecurityOrigin; 59 class ScriptCallStack; 60 class ScriptState; 61 62 class ExecutionContext : public LifecycleContext<ExecutionContext> { 63 public: 64 ExecutionContext(); 65 virtual ~ExecutionContext(); 66 67 // Delegating to ExecutionContextClient setClient(ExecutionContextClient * client)68 void setClient(ExecutionContextClient* client) { m_client = client; } isDocument()69 bool isDocument() const { return m_client && m_client->isDocument(); } isWorkerGlobalScope()70 bool isWorkerGlobalScope() const { return m_client && m_client->isWorkerGlobalScope(); } isJSExecutionForbidden()71 bool isJSExecutionForbidden() { return m_client && m_client->isJSExecutionForbidden(); } 72 SecurityOrigin* securityOrigin() const; 73 ContentSecurityPolicy* contentSecurityPolicy() const; 74 const KURL& url() const; 75 KURL completeURL(const String& url) const; 76 void userEventWasHandled(); 77 void disableEval(const String& errorMessage); 78 DOMWindow* executingWindow() const; 79 String userAgent(const KURL&) const; 80 void postTask(PassOwnPtr<ExecutionContextTask>); 81 void postTask(const Closure&); 82 double timerAlignmentInterval() const; 83 84 bool shouldSanitizeScriptError(const String& sourceURL, AccessControlStatus); 85 void reportException(PassRefPtr<ErrorEvent>, PassRefPtr<ScriptCallStack>, AccessControlStatus); 86 87 void addConsoleMessage(MessageSource, MessageLevel, const String& message, const String& sourceURL, unsigned lineNumber); 88 void addConsoleMessage(MessageSource, MessageLevel, const String& message, ScriptState* = 0); 89 90 PublicURLManager& publicURLManager(); 91 92 // Active objects are not garbage collected even if inaccessible, e.g. because their activity may result in callbacks being invoked. 93 bool hasPendingActivity(); 94 95 void suspendActiveDOMObjects(); 96 void resumeActiveDOMObjects(); 97 void stopActiveDOMObjects(); 98 99 virtual void suspendScheduledTasks(); 100 virtual void resumeScheduledTasks(); tasksNeedSuspension()101 virtual bool tasksNeedSuspension() { return false; } 102 activeDOMObjectsAreSuspended()103 bool activeDOMObjectsAreSuspended() const { return m_activeDOMObjectsAreSuspended; } activeDOMObjectsAreStopped()104 bool activeDOMObjectsAreStopped() const { return m_activeDOMObjectsAreStopped; } 105 bool isIteratingOverObservers() const; 106 107 // Called after the construction of an ActiveDOMObject to synchronize suspend state. 108 void suspendActiveDOMObjectIfNeeded(ActiveDOMObject*); 109 ref()110 void ref() { refExecutionContext(); } deref()111 void deref() { derefExecutionContext(); } 112 113 // Gets the next id in a circular sequence from 1 to 2^31-1. 114 int circularSequentialID(); 115 116 void didChangeTimerAlignmentInterval(); 117 sandboxFlags()118 SandboxFlags sandboxFlags() const { return m_sandboxFlags; } isSandboxed(SandboxFlags mask)119 bool isSandboxed(SandboxFlags mask) const { return m_sandboxFlags & mask; } 120 void enforceSandboxFlags(SandboxFlags mask); 121 122 PassOwnPtr<LifecycleNotifier<ExecutionContext> > createLifecycleNotifier(); 123 124 virtual EventQueue* eventQueue() const = 0; 125 126 protected: 127 128 ContextLifecycleNotifier& lifecycleNotifier(); 129 130 private: 131 friend class DOMTimer; // For installNewTimeout() and removeTimeoutByID() below. 132 133 bool dispatchErrorEvent(PassRefPtr<ErrorEvent>, AccessControlStatus); 134 135 virtual void refExecutionContext() = 0; 136 virtual void derefExecutionContext() = 0; 137 // LifecycleContext implementation. 138 139 // Implementation details for DOMTimer. No other classes should call these functions. 140 int installNewTimeout(PassOwnPtr<ScheduledAction>, int timeout, bool singleShot); 141 void removeTimeoutByID(int timeoutID); // This makes underlying DOMTimer instance destructed. 142 143 ExecutionContextClient* m_client; 144 SandboxFlags m_sandboxFlags; 145 146 int m_circularSequentialID; 147 typedef HashMap<int, OwnPtr<DOMTimer> > TimeoutMap; 148 TimeoutMap m_timeouts; 149 150 bool m_inDispatchErrorEvent; 151 class PendingException; 152 OwnPtr<Vector<OwnPtr<PendingException> > > m_pendingExceptions; 153 154 bool m_activeDOMObjectsAreSuspended; 155 bool m_activeDOMObjectsAreStopped; 156 157 OwnPtr<PublicURLManager> m_publicURLManager; 158 159 // The location of this member is important; to make sure contextDestroyed() notification on 160 // ExecutionContext's members (notably m_timeouts) is called before they are destructed, 161 // m_lifecycleNotifer should be placed *after* such members. 162 OwnPtr<ContextLifecycleNotifier> m_lifecycleNotifier; 163 }; 164 165 } // namespace WebCore 166 167 #endif // ExecutionContext_h 168