diff options
Diffstat (limited to 'Source/WebCore/page/DOMWindow.h')
-rw-r--r-- | Source/WebCore/page/DOMWindow.h | 704 |
1 files changed, 308 insertions, 396 deletions
diff --git a/Source/WebCore/page/DOMWindow.h b/Source/WebCore/page/DOMWindow.h index b681f77c3..584ba5afc 100644 --- a/Source/WebCore/page/DOMWindow.h +++ b/Source/WebCore/page/DOMWindow.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006, 2007, 2009, 2010 Apple Inc. All rights reserved. + * Copyright (C) 2006-2017 Apple Inc. All rights reserved. * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) * * Redistribution and use in source and binary forms, with or without @@ -11,501 +11,413 @@ * 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 + * THIS SOFTWARE IS PROVIDED BY APPLE 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 + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE 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. + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef DOMWindow_h -#define DOMWindow_h +#pragma once +#include "Base64Utilities.h" #include "ContextDestructionObserver.h" #include "EventTarget.h" +#include "ExceptionOr.h" #include "FrameDestructionObserver.h" -#include "URL.h" +#include "ScrollToOptions.h" #include "Supplementable.h" -#include <functional> +#include <wtf/HashSet.h> +#include <wtf/WeakPtr.h> -namespace WebCore { - - class BarProp; - class CSSRuleList; - class CSSStyleDeclaration; - class Console; - class Crypto; - class DOMApplicationCache; - class DOMSelection; - class DOMURL; - class DOMWindowProperty; - class Database; - class DatabaseCallback; - class Document; - class Element; - class EventListener; - class FloatRect; - class Frame; - class History; - class IDBFactory; - class Location; - class MediaQueryList; - class MessageEvent; - class Navigator; - class Node; - class Page; - class PageConsole; - class Performance; - class PostMessageTimer; - class ScheduledAction; - class Screen; - class ScriptCallStack; - class SecurityOrigin; - class SerializedScriptValue; - class Storage; - class StyleMedia; - class WebKitPoint; - class DOMWindowCSS; - -#if ENABLE(REQUEST_ANIMATION_FRAME) - class RequestAnimationFrameCallback; -#endif - - struct WindowFeatures; - - typedef Vector<RefPtr<MessagePort>, 1> MessagePortArray; - - typedef int ExceptionCode; - - enum SetLocationLocking { LockHistoryBasedOnGestureState, LockHistoryAndBackForwardList }; - - // FIXME: DOMWindow shouldn't subclass FrameDestructionObserver and instead should get to Frame via its Document. - class DOMWindow final - : public RefCounted<DOMWindow> - , public EventTargetWithInlineData - , public ContextDestructionObserver - , public FrameDestructionObserver - , public Supplementable<DOMWindow> { - public: - static PassRefPtr<DOMWindow> create(Document* document) { return adoptRef(new DOMWindow(document)); } - virtual ~DOMWindow(); - - // In some rare cases, we'll re-used a DOMWindow for a new Document. For example, - // when a script calls window.open("..."), the browser gives JavaScript a window - // synchronously but kicks off the load in the window asynchronously. Web sites - // expect that modifications that they make to the window object synchronously - // won't be blown away when the network load commits. To make that happen, we - // "securely transition" the existing DOMWindow to the Document that results from - // the network load. See also SecurityContext::isSecureTransitionTo. - void didSecureTransitionTo(Document*); +namespace JSC { +class ExecState; +class JSObject; +class JSValue; +template<typename> class Strong; +} - virtual EventTargetInterface eventTargetInterface() const override { return DOMWindowEventTargetInterfaceType; } - virtual ScriptExecutionContext* scriptExecutionContext() const override { return ContextDestructionObserver::scriptExecutionContext(); } - - virtual DOMWindow* toDOMWindow() override; - - void registerProperty(DOMWindowProperty*); - void unregisterProperty(DOMWindowProperty*); - - void resetUnlessSuspendedForPageCache(); - void suspendForPageCache(); - void resumeFromPageCache(); - - PassRefPtr<MediaQueryList> matchMedia(const String&); +namespace WebCore { - unsigned pendingUnloadEventListeners() const; +class BarProp; +class CSSRuleList; +class CSSStyleDeclaration; +class Crypto; +class CustomElementRegistry; +class DOMApplicationCache; +class DOMSelection; +class DOMWindowProperty; +class DOMWrapperWorld; +class Document; +class Element; +class EventListener; +class FloatRect; +class History; +class Location; +class MediaQueryList; +class Navigator; +class Node; +class NodeList; +class Page; +class PageConsoleClient; +class Performance; +class PostMessageTimer; +class RequestAnimationFrameCallback; +class ScheduledAction; +class Screen; +class Storage; +class StyleMedia; +class WebKitNamespace; +class WebKitPoint; + +struct WindowFeatures; + +enum SetLocationLocking { LockHistoryBasedOnGestureState, LockHistoryAndBackForwardList }; + +// FIXME: DOMWindow shouldn't subclass FrameDestructionObserver and instead should get to Frame via its Document. +class DOMWindow final + : public RefCounted<DOMWindow> + , public EventTargetWithInlineData + , public ContextDestructionObserver + , public FrameDestructionObserver + , public Base64Utilities + , public Supplementable<DOMWindow> { +public: + static Ref<DOMWindow> create(Document& document) { return adoptRef(*new DOMWindow(document)); } + WEBCORE_EXPORT virtual ~DOMWindow(); + + // In some rare cases, we'll reuse a DOMWindow for a new Document. For example, + // when a script calls window.open("..."), the browser gives JavaScript a window + // synchronously but kicks off the load in the window asynchronously. Web sites + // expect that modifications that they make to the window object synchronously + // won't be blown away when the network load commits. To make that happen, we + // "securely transition" the existing DOMWindow to the Document that results from + // the network load. See also SecurityContext::isSecureTransitionTo. + void didSecureTransitionTo(Document&); + + void registerProperty(DOMWindowProperty&); + void unregisterProperty(DOMWindowProperty&); + + void resetUnlessSuspendedForDocumentSuspension(); + void suspendForDocumentSuspension(); + void resumeFromDocumentSuspension(); + + RefPtr<MediaQueryList> matchMedia(const String&); + + WEBCORE_EXPORT unsigned pendingUnloadEventListeners() const; + + WEBCORE_EXPORT static bool dispatchAllPendingBeforeUnloadEvents(); + WEBCORE_EXPORT static void dispatchAllPendingUnloadEvents(); + + static FloatRect adjustWindowRect(Page&, const FloatRect& pendingChanges); + + bool allowPopUp(); // Call on first window, not target window. + static bool allowPopUp(Frame& firstFrame); + static bool canShowModalDialog(const Frame&); + WEBCORE_EXPORT void setCanShowModalDialogOverride(bool); + + Screen* screen() const; + History* history() const; + Crypto* crypto() const; + BarProp* locationbar() const; + BarProp* menubar() const; + BarProp* personalbar() const; + BarProp* scrollbars() const; + BarProp* statusbar() const; + BarProp* toolbar() const; + Navigator* navigator() const; + Navigator* clientInformation() const { return navigator(); } + + Location* location() const; + void setLocation(DOMWindow& activeWindow, DOMWindow& firstWindow, const String& location, SetLocationLocking = LockHistoryBasedOnGestureState); + + DOMSelection* getSelection(); + + Element* frameElement() const; + + WEBCORE_EXPORT void focus(bool allowFocus = false); + void focus(DOMWindow& callerWindow); + void blur(); + WEBCORE_EXPORT void close(); + void close(Document&); + void print(); + void stop(); + + WEBCORE_EXPORT RefPtr<DOMWindow> open(const String& urlString, const AtomicString& frameName, const String& windowFeaturesString, DOMWindow& activeWindow, DOMWindow& firstWindow); + + void showModalDialog(const String& urlString, const String& dialogFeaturesString, DOMWindow& activeWindow, DOMWindow& firstWindow, std::function<void(DOMWindow&)> prepareDialogFunction); + + void alert(const String& message = emptyString()); + bool confirm(const String& message); + String prompt(const String& message, const String& defaultValue); - static bool dispatchAllPendingBeforeUnloadEvents(); - static void dispatchAllPendingUnloadEvents(); + bool find(const String&, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) const; - static FloatRect adjustWindowRect(Page*, const FloatRect& pendingChanges); + bool offscreenBuffering() const; - bool allowPopUp(); // Call on first window, not target window. - static bool allowPopUp(Frame* firstFrame); - static bool canShowModalDialog(const Frame*); - static bool canShowModalDialogNow(const Frame*); + int outerHeight() const; + int outerWidth() const; + int innerHeight() const; + int innerWidth() const; + int screenX() const; + int screenY() const; + int screenLeft() const { return screenX(); } + int screenTop() const { return screenY(); } + int scrollX() const; + int scrollY() const; - // DOM Level 0 + bool closed() const; - Screen* screen() const; - History* history() const; - Crypto* crypto() const; - BarProp* locationbar() const; - BarProp* menubar() const; - BarProp* personalbar() const; - BarProp* scrollbars() const; - BarProp* statusbar() const; - BarProp* toolbar() const; - Navigator* navigator() const; - Navigator* clientInformation() const { return navigator(); } + unsigned length() const; - Location* location() const; - void setLocation(const String& location, DOMWindow& activeWindow, DOMWindow& firstWindow, - SetLocationLocking = LockHistoryBasedOnGestureState); + String name() const; + void setName(const String&); - DOMSelection* getSelection(); + String status() const; + void setStatus(const String&); + String defaultStatus() const; + void setDefaultStatus(const String&); - Element* frameElement() const; + // Self-referential attributes - void focus(ScriptExecutionContext* = 0); - void blur(); - void close(ScriptExecutionContext* = 0); - void print(); - void stop(); + DOMWindow* self() const; + DOMWindow* window() const { return self(); } + DOMWindow* frames() const { return self(); } - PassRefPtr<DOMWindow> open(const String& urlString, const AtomicString& frameName, const String& windowFeaturesString, - DOMWindow& activeWindow, DOMWindow& firstWindow); + DOMWindow* opener() const; + DOMWindow* parent() const; + DOMWindow* top() const; - void showModalDialog(const String& urlString, const String& dialogFeaturesString, DOMWindow& activeWindow, DOMWindow& firstWindow, std::function<void (DOMWindow&)> prepareDialogFunction); + // DOM Level 2 AbstractView Interface - void alert(const String& message); - bool confirm(const String& message); - String prompt(const String& message, const String& defaultValue); - String btoa(const String& stringToEncode, ExceptionCode&); - String atob(const String& encodedString, ExceptionCode&); + WEBCORE_EXPORT Document* document() const; - bool find(const String&, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) const; + // CSSOM View Module - bool offscreenBuffering() const; + RefPtr<StyleMedia> styleMedia() const; - int outerHeight() const; - int outerWidth() const; - int innerHeight() const; - int innerWidth() const; - int screenX() const; - int screenY() const; - int screenLeft() const { return screenX(); } - int screenTop() const { return screenY(); } - int scrollX() const; - int scrollY() const; - int pageXOffset() const { return scrollX(); } - int pageYOffset() const { return scrollY(); } + // DOM Level 2 Style Interface - bool closed() const; + WEBCORE_EXPORT Ref<CSSStyleDeclaration> getComputedStyle(Element&, const String& pseudoElt) const; - unsigned length() const; + // WebKit extensions - String name() const; - void setName(const String&); + WEBCORE_EXPORT RefPtr<CSSRuleList> getMatchedCSSRules(Element*, const String& pseudoElt, bool authorOnly = true) const; + double devicePixelRatio() const; - String status() const; - void setStatus(const String&); - String defaultStatus() const; - void setDefaultStatus(const String&); + RefPtr<WebKitPoint> webkitConvertPointFromPageToNode(Node*, const WebKitPoint*) const; + RefPtr<WebKitPoint> webkitConvertPointFromNodeToPage(Node*, const WebKitPoint*) const; - // Self-referential attributes + PageConsoleClient* console() const; - DOMWindow* self() const; - DOMWindow* window() const { return self(); } - DOMWindow* frames() const { return self(); } + void printErrorMessage(const String&); + String crossDomainAccessErrorMessage(const DOMWindow& activeWindow); - DOMWindow* opener() const; - DOMWindow* parent() const; - DOMWindow* top() const; + ExceptionOr<void> postMessage(JSC::ExecState&, DOMWindow& callerWindow, JSC::JSValue message, const String& targetOrigin, Vector<JSC::Strong<JSC::JSObject>>&&); + void postMessageTimerFired(PostMessageTimer&); - // DOM Level 2 AbstractView Interface + void languagesChanged(); - Document* document() const; + void scrollBy(const ScrollToOptions&) const; + void scrollBy(double x, double y) const; + void scrollTo(const ScrollToOptions&) const; + void scrollTo(double x, double y) const; - // CSSOM View Module + void moveBy(float x, float y) const; + void moveTo(float x, float y) const; - PassRefPtr<StyleMedia> styleMedia() const; + void resizeBy(float x, float y) const; + void resizeTo(float width, float height) const; - // DOM Level 2 Style Interface + // Timers + ExceptionOr<int> setTimeout(std::unique_ptr<ScheduledAction>, int timeout); + void clearTimeout(int timeoutId); + ExceptionOr<int> setInterval(std::unique_ptr<ScheduledAction>, int timeout); + void clearInterval(int timeoutId); - PassRefPtr<CSSStyleDeclaration> getComputedStyle(Element*, const String& pseudoElt) const; + int requestAnimationFrame(Ref<RequestAnimationFrameCallback>&&); + int webkitRequestAnimationFrame(Ref<RequestAnimationFrameCallback>&&); + void cancelAnimationFrame(int id); - // WebKit extensions + // Events + // EventTarget API + bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, const AddEventListenerOptions&) final; + bool removeEventListener(const AtomicString& eventType, EventListener&, const ListenerOptions&) final; + void removeAllEventListeners() final; - PassRefPtr<CSSRuleList> getMatchedCSSRules(Element*, const String& pseudoElt, bool authorOnly = true) const; - double devicePixelRatio() const; + using EventTarget::dispatchEvent; + bool dispatchEvent(Event&, EventTarget*); - PassRefPtr<WebKitPoint> webkitConvertPointFromPageToNode(Node*, const WebKitPoint*) const; - PassRefPtr<WebKitPoint> webkitConvertPointFromNodeToPage(Node*, const WebKitPoint*) const; + void dispatchLoadEvent(); - Console* console() const; - PageConsole* pageConsole() const; + void captureEvents(); + void releaseEvents(); - void printErrorMessage(const String&); - String crossDomainAccessErrorMessage(const DOMWindow& activeWindow); + void finishedLoading(); - void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, const String& targetOrigin, DOMWindow& source, ExceptionCode&); - // Needed for Objective-C bindings (see bug 28774). - void postMessage(PassRefPtr<SerializedScriptValue> message, MessagePort*, const String& targetOrigin, DOMWindow& source, ExceptionCode&); - void postMessageTimerFired(PassOwnPtr<PostMessageTimer>); - void dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTargetOrigin, PassRefPtr<Event>, PassRefPtr<ScriptCallStack>); + using RefCounted::ref; + using RefCounted::deref; - void scrollBy(int x, int y) const; - void scrollTo(int x, int y) const; - void scroll(int x, int y) const { scrollTo(x, y); } + // HTML 5 key/value storage + ExceptionOr<Storage*> sessionStorage() const; + ExceptionOr<Storage*> localStorage() const; + Storage* optionalSessionStorage() const { return m_sessionStorage.get(); } + Storage* optionalLocalStorage() const { return m_localStorage.get(); } - void moveBy(float x, float y) const; - void moveTo(float x, float y) const; + DOMApplicationCache* applicationCache() const; + DOMApplicationCache* optionalApplicationCache() const { return m_applicationCache.get(); } - void resizeBy(float x, float y) const; - void resizeTo(float width, float height) const; + CustomElementRegistry* customElementRegistry() { return m_customElementRegistry.get(); } + CustomElementRegistry& ensureCustomElementRegistry(); - // Timers - int setTimeout(PassOwnPtr<ScheduledAction>, int timeout, ExceptionCode&); - void clearTimeout(int timeoutId); - int setInterval(PassOwnPtr<ScheduledAction>, int timeout, ExceptionCode&); - void clearInterval(int timeoutId); + ExceptionOr<Ref<NodeList>> collectMatchingElementsInFlatTree(Node&, const String& selectors); + ExceptionOr<RefPtr<Element>> matchingElementInFlatTree(Node&, const String& selectors); - // WebKit animation extensions -#if ENABLE(REQUEST_ANIMATION_FRAME) - int requestAnimationFrame(PassRefPtr<RequestAnimationFrameCallback>); - int webkitRequestAnimationFrame(PassRefPtr<RequestAnimationFrameCallback>); - void cancelAnimationFrame(int id); +#if ENABLE(ORIENTATION_EVENTS) + // This is the interface orientation in degrees. Some examples are: + // 0 is straight up; -90 is when the device is rotated 90 clockwise; + // 90 is when rotated counter clockwise. + int orientation() const; #endif -#if ENABLE(CSS3_CONDITIONAL_RULES) - DOMWindowCSS* css(); +#if ENABLE(WEB_TIMING) + Performance* performance() const; #endif - // Events - // EventTarget API - virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture) override; - virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture) override; - virtual void removeAllEventListeners() override; - - using EventTarget::dispatchEvent; - bool dispatchEvent(PassRefPtr<Event> prpEvent, PassRefPtr<EventTarget> prpTarget); - - void dispatchLoadEvent(); - - DEFINE_ATTRIBUTE_EVENT_LISTENER(abort); - DEFINE_ATTRIBUTE_EVENT_LISTENER(beforeunload); - DEFINE_ATTRIBUTE_EVENT_LISTENER(blur); - DEFINE_ATTRIBUTE_EVENT_LISTENER(canplay); - DEFINE_ATTRIBUTE_EVENT_LISTENER(canplaythrough); - DEFINE_ATTRIBUTE_EVENT_LISTENER(change); - DEFINE_ATTRIBUTE_EVENT_LISTENER(click); - DEFINE_ATTRIBUTE_EVENT_LISTENER(contextmenu); - DEFINE_ATTRIBUTE_EVENT_LISTENER(dblclick); - DEFINE_ATTRIBUTE_EVENT_LISTENER(drag); - DEFINE_ATTRIBUTE_EVENT_LISTENER(dragend); - DEFINE_ATTRIBUTE_EVENT_LISTENER(dragenter); - DEFINE_ATTRIBUTE_EVENT_LISTENER(dragleave); - DEFINE_ATTRIBUTE_EVENT_LISTENER(dragover); - DEFINE_ATTRIBUTE_EVENT_LISTENER(dragstart); - DEFINE_ATTRIBUTE_EVENT_LISTENER(drop); - DEFINE_ATTRIBUTE_EVENT_LISTENER(durationchange); - DEFINE_ATTRIBUTE_EVENT_LISTENER(emptied); - DEFINE_ATTRIBUTE_EVENT_LISTENER(ended); - DEFINE_ATTRIBUTE_EVENT_LISTENER(error); - DEFINE_ATTRIBUTE_EVENT_LISTENER(focus); - DEFINE_ATTRIBUTE_EVENT_LISTENER(hashchange); - DEFINE_ATTRIBUTE_EVENT_LISTENER(input); - DEFINE_ATTRIBUTE_EVENT_LISTENER(invalid); - DEFINE_ATTRIBUTE_EVENT_LISTENER(keydown); - DEFINE_ATTRIBUTE_EVENT_LISTENER(keypress); - DEFINE_ATTRIBUTE_EVENT_LISTENER(keyup); - DEFINE_ATTRIBUTE_EVENT_LISTENER(load); - DEFINE_ATTRIBUTE_EVENT_LISTENER(loadeddata); - DEFINE_ATTRIBUTE_EVENT_LISTENER(loadedmetadata); - DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart); - DEFINE_ATTRIBUTE_EVENT_LISTENER(message); - DEFINE_ATTRIBUTE_EVENT_LISTENER(mousedown); - DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseenter); - DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseleave); - DEFINE_ATTRIBUTE_EVENT_LISTENER(mousemove); - DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseout); - DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseover); - DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseup); - DEFINE_ATTRIBUTE_EVENT_LISTENER(mousewheel); - DEFINE_ATTRIBUTE_EVENT_LISTENER(offline); - DEFINE_ATTRIBUTE_EVENT_LISTENER(online); - DEFINE_ATTRIBUTE_EVENT_LISTENER(pagehide); - DEFINE_ATTRIBUTE_EVENT_LISTENER(pageshow); - DEFINE_ATTRIBUTE_EVENT_LISTENER(pause); - DEFINE_ATTRIBUTE_EVENT_LISTENER(play); - DEFINE_ATTRIBUTE_EVENT_LISTENER(playing); - DEFINE_ATTRIBUTE_EVENT_LISTENER(popstate); - DEFINE_ATTRIBUTE_EVENT_LISTENER(progress); - DEFINE_ATTRIBUTE_EVENT_LISTENER(ratechange); - DEFINE_ATTRIBUTE_EVENT_LISTENER(reset); - DEFINE_ATTRIBUTE_EVENT_LISTENER(resize); - DEFINE_ATTRIBUTE_EVENT_LISTENER(scroll); - DEFINE_ATTRIBUTE_EVENT_LISTENER(search); - DEFINE_ATTRIBUTE_EVENT_LISTENER(seeked); - DEFINE_ATTRIBUTE_EVENT_LISTENER(seeking); - DEFINE_ATTRIBUTE_EVENT_LISTENER(select); - DEFINE_ATTRIBUTE_EVENT_LISTENER(stalled); - DEFINE_ATTRIBUTE_EVENT_LISTENER(storage); - DEFINE_ATTRIBUTE_EVENT_LISTENER(submit); - DEFINE_ATTRIBUTE_EVENT_LISTENER(suspend); - DEFINE_ATTRIBUTE_EVENT_LISTENER(timeupdate); - DEFINE_ATTRIBUTE_EVENT_LISTENER(unload); - DEFINE_ATTRIBUTE_EVENT_LISTENER(volumechange); - DEFINE_ATTRIBUTE_EVENT_LISTENER(waiting); - DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitbeginfullscreen); - DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitendfullscreen); - DEFINE_ATTRIBUTE_EVENT_LISTENER(wheel); - - DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationstart, webkitAnimationStart); - DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationiteration, webkitAnimationIteration); - DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationend, webkitAnimationEnd); - DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkittransitionend, webkitTransitionEnd); - DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(transitionend, transitionend); - - void captureEvents(); - void releaseEvents(); - - void finishedLoading(); - - using RefCounted<DOMWindow>::ref; - using RefCounted<DOMWindow>::deref; - -#if ENABLE(DEVICE_ORIENTATION) - DEFINE_ATTRIBUTE_EVENT_LISTENER(devicemotion); - DEFINE_ATTRIBUTE_EVENT_LISTENER(deviceorientation); -#endif + double nowTimestamp() const; -#if ENABLE(PROXIMITY_EVENTS) - DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitdeviceproximity); +#if PLATFORM(IOS) + void incrementScrollEventListenersCount(); + void decrementScrollEventListenersCount(); + unsigned scrollEventListenerCount() const { return m_scrollEventListenerCount; } #endif - // HTML 5 key/value storage - Storage* sessionStorage(ExceptionCode&) const; - Storage* localStorage(ExceptionCode&) const; - Storage* optionalSessionStorage() const { return m_sessionStorage.get(); } - Storage* optionalLocalStorage() const { return m_localStorage.get(); } + void resetAllGeolocationPermission(); - DOMApplicationCache* applicationCache() const; - DOMApplicationCache* optionalApplicationCache() const { return m_applicationCache.get(); } - -#if ENABLE(ORIENTATION_EVENTS) - // This is the interface orientation in degrees. Some examples are: - // 0 is straight up; -90 is when the device is rotated 90 clockwise; - // 90 is when rotated counter clockwise. - int orientation() const; - - DEFINE_ATTRIBUTE_EVENT_LISTENER(orientationchange); +#if ENABLE(IOS_TOUCH_EVENTS) || ENABLE(IOS_GESTURE_EVENTS) + bool hasTouchEventListeners() const { return m_touchEventListenerCount > 0; } #endif -#if ENABLE(TOUCH_EVENTS) - DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart); - DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove); - DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend); - DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel); +#if ENABLE(USER_MESSAGE_HANDLERS) + bool shouldHaveWebKitNamespaceForWorld(DOMWrapperWorld&); + WebKitNamespace* webkitNamespace() const; #endif -#if ENABLE(IOS_GESTURE_EVENTS) - DEFINE_ATTRIBUTE_EVENT_LISTENER(gesturestart); - DEFINE_ATTRIBUTE_EVENT_LISTENER(gesturechange); - DEFINE_ATTRIBUTE_EVENT_LISTENER(gestureend); -#endif + // FIXME: When this DOMWindow is no longer the active DOMWindow (i.e., + // when its document is no longer the document that is displayed in its + // frame), we would like to zero out m_frame to avoid being confused + // by the document that is currently active in m_frame. + bool isCurrentlyDisplayedInFrame() const; -#if ENABLE(WEB_TIMING) - Performance* performance() const; -#endif + void willDetachDocumentFromFrame(); + void willDestroyCachedFrame(); -#if PLATFORM(IOS) - void incrementScrollEventListenersCount(); - void decrementScrollEventListenersCount(); - unsigned scrollEventListenerCount() const { return m_scrollEventListenerCount; } -#endif + void enableSuddenTermination(); + void disableSuddenTermination(); - void resetAllGeolocationPermission(); + WeakPtr<DOMWindow> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); } -#if ENABLE(IOS_TOUCH_EVENTS) || ENABLE(IOS_GESTURE_EVENTS) - bool hasTouchEventListeners() const { return m_touchEventListenerCount > 0; } -#endif +private: + explicit DOMWindow(Document&); - // FIXME: When this DOMWindow is no longer the active DOMWindow (i.e., - // when its document is no longer the document that is displayed in its - // frame), we would like to zero out m_frame to avoid being confused - // by the document that is currently active in m_frame. - bool isCurrentlyDisplayedInFrame() const; + EventTargetInterface eventTargetInterface() const final { return DOMWindowEventTargetInterfaceType; } + ScriptExecutionContext* scriptExecutionContext() const final { return ContextDestructionObserver::scriptExecutionContext(); } - void willDetachDocumentFromFrame(); - void willDestroyCachedFrame(); + DOMWindow* toDOMWindow() final; - void enableSuddenTermination(); - void disableSuddenTermination(); + Page* page(); + bool allowedToChangeWindowGeometry() const; - private: - explicit DOMWindow(Document*); + void frameDestroyed() final; + void willDetachPage() final; - Page* page(); - bool allowedToChangeWindowGeometry() const; + void refEventTarget() final { ref(); } + void derefEventTarget() final { deref(); } - virtual void frameDestroyed() override; - virtual void willDetachPage() override; + static RefPtr<Frame> createWindow(const String& urlString, const AtomicString& frameName, const WindowFeatures&, DOMWindow& activeWindow, Frame& firstFrame, Frame& openerFrame, std::function<void(DOMWindow&)> prepareDialogFunction = nullptr); + bool isInsecureScriptAccess(DOMWindow& activeWindow, const String& urlString); - virtual void refEventTarget() override { ref(); } - virtual void derefEventTarget() override { deref(); } + void resetDOMWindowProperties(); + void disconnectDOMWindowProperties(); + void reconnectDOMWindowProperties(); + void willDestroyDocumentInFrame(); - static PassRefPtr<Frame> createWindow(const String& urlString, const AtomicString& frameName, const WindowFeatures&, DOMWindow& activeWindow, Frame* firstFrame, Frame* openerFrame, std::function<void (DOMWindow&)> prepareDialogFunction = nullptr); - bool isInsecureScriptAccess(DOMWindow& activeWindow, const String& urlString); + bool isSameSecurityOriginAsMainFrame() const; + +#if ENABLE(GAMEPAD) + void incrementGamepadEventListenerCount(); + void decrementGamepadEventListenerCount(); +#endif - void resetDOMWindowProperties(); - void disconnectDOMWindowProperties(); - void reconnectDOMWindowProperties(); - void willDestroyDocumentInFrame(); + bool m_shouldPrintWhenFinishedLoading { false }; + bool m_suspendedForDocumentSuspension { false }; + std::optional<bool> m_canShowModalDialogOverride; - bool m_shouldPrintWhenFinishedLoading; - bool m_suspendedForPageCache; + HashSet<DOMWindowProperty*> m_properties; - HashSet<DOMWindowProperty*> m_properties; + mutable RefPtr<Crypto> m_crypto; + mutable RefPtr<History> m_history; + mutable RefPtr<BarProp> m_locationbar; + mutable RefPtr<StyleMedia> m_media; + mutable RefPtr<BarProp> m_menubar; + mutable RefPtr<Navigator> m_navigator; + mutable RefPtr<BarProp> m_personalbar; + mutable RefPtr<Screen> m_screen; + mutable RefPtr<BarProp> m_scrollbars; + mutable RefPtr<DOMSelection> m_selection; + mutable RefPtr<BarProp> m_statusbar; + mutable RefPtr<BarProp> m_toolbar; + mutable RefPtr<Location> m_location; - mutable RefPtr<Screen> m_screen; - mutable RefPtr<History> m_history; - mutable RefPtr<Crypto> m_crypto; - mutable RefPtr<BarProp> m_locationbar; - mutable RefPtr<BarProp> m_menubar; - mutable RefPtr<BarProp> m_personalbar; - mutable RefPtr<BarProp> m_scrollbars; - mutable RefPtr<BarProp> m_statusbar; - mutable RefPtr<BarProp> m_toolbar; - mutable RefPtr<Console> m_console; - mutable RefPtr<Navigator> m_navigator; - mutable RefPtr<Location> m_location; - mutable RefPtr<StyleMedia> m_media; + String m_status; + String m_defaultStatus; - String m_status; - String m_defaultStatus; + enum class PageStatus { None, Shown, Hidden }; + PageStatus m_lastPageStatus { PageStatus::None }; - enum PageStatus { PageStatusNone, PageStatusShown, PageStatusHidden }; - PageStatus m_lastPageStatus; + WeakPtrFactory<DOMWindow> m_weakPtrFactory; #if PLATFORM(IOS) - unsigned m_scrollEventListenerCount; + unsigned m_scrollEventListenerCount { 0 }; #endif #if ENABLE(IOS_TOUCH_EVENTS) || ENABLE(IOS_GESTURE_EVENTS) - unsigned m_touchEventListenerCount; + unsigned m_touchEventListenerCount { 0 }; #endif - mutable RefPtr<Storage> m_sessionStorage; - mutable RefPtr<Storage> m_localStorage; - mutable RefPtr<DOMApplicationCache> m_applicationCache; +#if ENABLE(GAMEPAD) + unsigned m_gamepadEventListenerCount { 0 }; +#endif + + mutable RefPtr<Storage> m_sessionStorage; + mutable RefPtr<Storage> m_localStorage; + mutable RefPtr<DOMApplicationCache> m_applicationCache; + + RefPtr<CustomElementRegistry> m_customElementRegistry; #if ENABLE(WEB_TIMING) - mutable RefPtr<Performance> m_performance; + mutable RefPtr<Performance> m_performance; #endif -#if ENABLE(CSS3_CONDITIONAL_RULES) - mutable RefPtr<DOMWindowCSS> m_css; +#if ENABLE(USER_MESSAGE_HANDLERS) + mutable RefPtr<WebKitNamespace> m_webkitNamespace; #endif - }; +}; - inline String DOMWindow::status() const - { - return m_status; - } +inline String DOMWindow::status() const +{ + return m_status; +} - inline String DOMWindow::defaultStatus() const - { - return m_defaultStatus; - } +inline String DOMWindow::defaultStatus() const +{ + return m_defaultStatus; +} } // namespace WebCore - -#endif // DOMWindow_h |