// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef DOMWindow_h #define DOMWindow_h #include "core/CoreExport.h" #include "core/events/EventTarget.h" #include "core/frame/DOMWindowBase64.h" #include "core/frame/Location.h" #include "platform/heap/Handle.h" #include "platform/scroll/ScrollableArea.h" #include "wtf/Forward.h" namespace blink { class ApplicationCache; class BarProp; class CSSRuleList; class CSSStyleDeclaration; class Console; class DOMSelection; class DOMWindowCSS; class Document; class Element; class Frame; class FrameRequestCallback; class History; class IdleRequestCallback; class IdleRequestOptions; class LocalDOMWindow; class MediaQueryList; class Navigator; class Screen; class ScrollToOptions; class SerializedScriptValue; class Storage; class StyleMedia; typedef HeapVector, 1> MessagePortArray; class CORE_EXPORT DOMWindow : public EventTargetWithInlineData, public RefCountedWillBeNoBase, public DOMWindowBase64 { DEFINE_WRAPPERTYPEINFO(); REFCOUNTED_EVENT_TARGET(DOMWindow); public: ~DOMWindow() override; // RefCountedWillBeGarbageCollectedFinalized overrides: DECLARE_VIRTUAL_TRACE(); virtual bool isLocalDOMWindow() const { return false; } virtual bool isRemoteDOMWindow() const { return false; } virtual Frame* frame() const = 0; // ScriptWrappable overrides: v8::Local wrap(v8::Isolate*, v8::Local creationContext) final; v8::Local associateWithWrapper(v8::Isolate*, const WrapperTypeInfo*, v8::Local wrapper) final; // EventTarget overrides: const AtomicString& interfaceName() const override; // DOM Level 0 virtual Screen* screen() const = 0; virtual History* history() const = 0; virtual BarProp* locationbar() const = 0; virtual BarProp* menubar() const = 0; virtual BarProp* personalbar() const = 0; virtual BarProp* scrollbars() const = 0; virtual BarProp* statusbar() const = 0; virtual BarProp* toolbar() const = 0; virtual Navigator* navigator() const = 0; Navigator* clientInformation() const { return navigator(); } Location* location() const; virtual bool offscreenBuffering() const = 0; virtual int outerHeight() const = 0; virtual int outerWidth() const = 0; virtual int innerHeight() const = 0; virtual int innerWidth() const = 0; virtual int screenX() const = 0; virtual int screenY() const = 0; int screenLeft() const { return screenX(); } int screenTop() const { return screenY(); } virtual double scrollX() const = 0; virtual double scrollY() const = 0; double pageXOffset() const { return scrollX(); } double pageYOffset() const { return scrollY(); } bool closed() const; // FIXME: This is not listed as a cross-origin accessible attribute, but in // Blink, it's currently marked as DoNotCheckSecurity. unsigned length() const; virtual const AtomicString& name() const = 0; virtual void setName(const AtomicString&) = 0; virtual String status() const = 0; virtual void setStatus(const String&) = 0; virtual String defaultStatus() const = 0; virtual void setDefaultStatus(const String&) = 0; // Self-referential attributes DOMWindow* self() const; DOMWindow* window() const { return self(); } DOMWindow* frames() const { return self(); } DOMWindow* opener() const; DOMWindow* parent() const; DOMWindow* top() const; // DOM Level 2 AbstractView Interface virtual Document* document() const = 0; // CSSOM View Module virtual StyleMedia* styleMedia() const = 0; // WebKit extensions virtual double devicePixelRatio() const = 0; virtual ApplicationCache* applicationCache() const = 0; // 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. virtual int orientation() const = 0; virtual Console* console() const = 0; virtual DOMSelection* getSelection() = 0; void focus(ExecutionContext*); virtual void blur() = 0; void close(ExecutionContext*); virtual void print() = 0; virtual void stop() = 0; virtual void alert(const String& message = String()) = 0; virtual bool confirm(const String& message) = 0; virtual String prompt(const String& message, const String& defaultValue) = 0; virtual bool find(const String&, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) const = 0; virtual void scrollBy(double x, double y, ScrollBehavior = ScrollBehaviorAuto) const = 0; virtual void scrollBy(const ScrollToOptions&) const = 0; virtual void scrollTo(double x, double y) const = 0; virtual void scrollTo(const ScrollToOptions&) const = 0; void scroll(double x, double y) const { scrollTo(x, y); } void scroll(const ScrollToOptions& scrollToOptions) const { scrollTo(scrollToOptions); } virtual void moveBy(int x, int y) const = 0; virtual void moveTo(int x, int y) const = 0; virtual void resizeBy(int x, int y) const = 0; virtual void resizeTo(int width, int height) const = 0; virtual PassRefPtrWillBeRawPtr matchMedia(const String&) = 0; // DOM Level 2 Style Interface virtual PassRefPtrWillBeRawPtr getComputedStyle(Element*, const String& pseudoElt) const = 0; // WebKit extensions virtual PassRefPtrWillBeRawPtr getMatchedCSSRules(Element*, const String& pseudoElt) const = 0; // WebKit animation extensions virtual int requestAnimationFrame(FrameRequestCallback*) = 0; virtual int webkitRequestAnimationFrame(FrameRequestCallback*) = 0; virtual void cancelAnimationFrame(int id) = 0; // Idle callback extensions virtual int requestIdleCallback(IdleRequestCallback*, const IdleRequestOptions&) = 0; virtual void cancelIdleCallback(int id) = 0; void captureEvents() { } void releaseEvents() { } // FIXME: This handles both window[index] and window.frames[index]. However, // the spec exposes window.frames[index] across origins but not // window[index]... DOMWindow* anonymousIndexedGetter(uint32_t) const; void postMessage(PassRefPtr message, const MessagePortArray*, const String& targetOrigin, LocalDOMWindow* source, ExceptionState&); String sanitizedCrossDomainAccessErrorMessage(const LocalDOMWindow* callingWindow) const; String crossDomainAccessErrorMessage(const LocalDOMWindow* callingWindow) const; bool isInsecureScriptAccess(LocalDOMWindow& callingWindow, const String& urlString); // 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. // See https://bugs.webkit.org/show_bug.cgi?id=62054 bool isCurrentlyDisplayedInFrame() const; void resetLocation(); bool isSecureContext() const; DEFINE_ATTRIBUTE_EVENT_LISTENER(animationend); DEFINE_ATTRIBUTE_EVENT_LISTENER(animationiteration); DEFINE_ATTRIBUTE_EVENT_LISTENER(animationstart); DEFINE_ATTRIBUTE_EVENT_LISTENER(search); DEFINE_ATTRIBUTE_EVENT_LISTENER(transitionend); 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_ATTRIBUTE_EVENT_LISTENER(orientationchange); protected: DOMWindow(); // Set to true when close() has been called. Needed for // |window.closed| determinism; having it return 'true' // only after the layout widget's deferred window close // operation has been performed, exposes (confusing) // implementation details to scripts. bool m_windowIsClosing; private: mutable RefPtrWillBeMember m_location; }; } // namespace blink #endif // DOMWindow_h