| /* |
| * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
| * Copyright (C) 2012 Google Inc. All Rights Reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| */ |
| |
| #ifndef ExecutionContext_h |
| #define ExecutionContext_h |
| |
| #include "core/CoreExport.h" |
| #include "core/dom/ContextLifecycleNotifier.h" |
| #include "core/dom/ContextLifecycleObserver.h" |
| #include "core/dom/SecurityContext.h" |
| #include "core/dom/SuspendableTask.h" |
| #include "core/fetch/AccessControlStatus.h" |
| #include "platform/Supplementable.h" |
| #include "platform/heap/Handle.h" |
| #include "platform/weborigin/KURL.h" |
| #include "platform/weborigin/ReferrerPolicy.h" |
| #include "public/platform/WebTraceLocation.h" |
| #include "wtf/Deque.h" |
| #include "wtf/Noncopyable.h" |
| #include <memory> |
| |
| namespace blink { |
| |
| class ActiveDOMObject; |
| class ConsoleMessage; |
| class DOMTimerCoordinator; |
| class ErrorEvent; |
| class EventQueue; |
| class EventTarget; |
| class ExecutionContextTask; |
| class LocalDOMWindow; |
| class PublicURLManager; |
| class SecurityOrigin; |
| class SourceLocation; |
| |
| class CORE_EXPORT ExecutionContext : public ContextLifecycleNotifier, public Supplementable<ExecutionContext> { |
| WTF_MAKE_NONCOPYABLE(ExecutionContext); |
| public: |
| DECLARE_VIRTUAL_TRACE(); |
| |
| // Used to specify whether |isSecureContext| should walk the |
| // ancestor tree to decide whether to restrict usage of a powerful |
| // feature. |
| enum SecureContextCheck { |
| StandardSecureContextCheck, |
| WebCryptoSecureContextCheck |
| }; |
| |
| virtual bool isDocument() const { return false; } |
| virtual bool isWorkerGlobalScope() const { return false; } |
| virtual bool isWorkletGlobalScope() const { return false; } |
| virtual bool isMainThreadWorkletGlobalScope() const { return false; } |
| virtual bool isDedicatedWorkerGlobalScope() const { return false; } |
| virtual bool isSharedWorkerGlobalScope() const { return false; } |
| virtual bool isServiceWorkerGlobalScope() const { return false; } |
| virtual bool isCompositorWorkerGlobalScope() const { return false; } |
| virtual bool isAnimationWorkletGlobalScope() const { return false; } |
| virtual bool isPaintWorkletGlobalScope() const { return false; } |
| virtual bool isThreadedWorkletGlobalScope() const { return false; } |
| virtual bool isJSExecutionForbidden() const { return false; } |
| |
| virtual bool isContextThread() const { return true; } |
| |
| SecurityOrigin* getSecurityOrigin(); |
| ContentSecurityPolicy* contentSecurityPolicy(); |
| const KURL& url() const; |
| KURL completeURL(const String& url) const; |
| virtual void disableEval(const String& errorMessage) = 0; |
| virtual LocalDOMWindow* executingWindow() const { return 0; } |
| virtual String userAgent() const = 0; |
| virtual void postTask(const WebTraceLocation&, std::unique_ptr<ExecutionContextTask>, const String& taskNameForInstrumentation = emptyString()) = 0; // Executes the task on context's thread asynchronously. |
| |
| // Gets the DOMTimerCoordinator which maintains the "active timer |
| // list" of tasks created by setTimeout and setInterval. The |
| // DOMTimerCoordinator is owned by the ExecutionContext and should |
| // not be used after the ExecutionContext is destroyed. |
| virtual DOMTimerCoordinator* timers() = 0; |
| |
| virtual SecurityContext& securityContext() = 0; |
| KURL contextURL() const { return virtualURL(); } |
| KURL contextCompleteURL(const String& url) const { return virtualCompleteURL(url); } |
| |
| bool shouldSanitizeScriptError(const String& sourceURL, AccessControlStatus); |
| void dispatchErrorEvent(ErrorEvent*, AccessControlStatus); |
| |
| virtual void addConsoleMessage(ConsoleMessage*) = 0; |
| virtual void exceptionThrown(ErrorEvent*) = 0; |
| |
| PublicURLManager& publicURLManager(); |
| |
| virtual void removeURLFromMemoryCache(const KURL&); |
| |
| void suspendActiveDOMObjects(); |
| void resumeActiveDOMObjects(); |
| void stopActiveDOMObjects(); |
| void postSuspendableTask(std::unique_ptr<SuspendableTask>); |
| void notifyContextDestroyed() override; |
| |
| virtual void suspendScheduledTasks(); |
| virtual void resumeScheduledTasks(); |
| virtual bool tasksNeedSuspension() { return false; } |
| virtual void tasksWereSuspended() { } |
| virtual void tasksWereResumed() { } |
| |
| bool activeDOMObjectsAreSuspended() const { return m_activeDOMObjectsAreSuspended; } |
| bool activeDOMObjectsAreStopped() const { return m_activeDOMObjectsAreStopped; } |
| |
| // Called after the construction of an ActiveDOMObject to synchronize suspend state. |
| void suspendActiveDOMObjectIfNeeded(ActiveDOMObject*); |
| |
| // Gets the next id in a circular sequence from 1 to 2^31-1. |
| int circularSequentialID(); |
| |
| virtual EventTarget* errorEventTarget() = 0; |
| virtual EventQueue* getEventQueue() const = 0; |
| |
| // Methods related to window interaction. It should be used to manage window |
| // focusing and window creation permission for an ExecutionContext. |
| void allowWindowInteraction(); |
| void consumeWindowInteraction(); |
| bool isWindowInteractionAllowed() const; |
| |
| // Decides whether this context is privileged, as described in |
| // https://w3c.github.io/webappsec/specs/powerfulfeatures/#settings-privileged. |
| virtual bool isSecureContext(String& errorMessage, const SecureContextCheck = StandardSecureContextCheck) const = 0; |
| virtual bool isSecureContext(const SecureContextCheck = StandardSecureContextCheck) const; |
| |
| virtual String outgoingReferrer() const; |
| // Parses a comma-separated list of referrer policy tokens, and sets |
| // the context's referrer policy to the last one that is a valid |
| // policy. Logs a message to the console if none of the policy |
| // tokens are valid policies. |
| void parseAndSetReferrerPolicy(const String& policies); |
| void setReferrerPolicy(ReferrerPolicy); |
| ReferrerPolicy getReferrerPolicy() const { return m_referrerPolicy; } |
| |
| protected: |
| ExecutionContext(); |
| virtual ~ExecutionContext(); |
| |
| virtual const KURL& virtualURL() const = 0; |
| virtual KURL virtualCompleteURL(const String&) const = 0; |
| |
| private: |
| bool dispatchErrorEventInternal(ErrorEvent*, AccessControlStatus); |
| void runSuspendableTasks(); |
| |
| unsigned m_circularSequentialID; |
| |
| bool m_inDispatchErrorEvent; |
| HeapVector<Member<ErrorEvent>> m_pendingExceptions; |
| |
| bool m_activeDOMObjectsAreSuspended; |
| bool m_activeDOMObjectsAreStopped; |
| |
| Member<PublicURLManager> m_publicURLManager; |
| |
| // Counter that keeps track of how many window interaction calls are allowed |
| // for this ExecutionContext. Callers are expected to call |
| // |allowWindowInteraction()| and |consumeWindowInteraction()| in order to |
| // increment and decrement the counter. |
| int m_windowInteractionTokens; |
| |
| Deque<std::unique_ptr<SuspendableTask>> m_suspendedTasks; |
| bool m_isRunSuspendableTasksScheduled; |
| |
| ReferrerPolicy m_referrerPolicy; |
| }; |
| |
| } // namespace blink |
| |
| #endif // ExecutionContext_h |