bbbfa95872e4a33e73425281e4accb4f7059b1c4
[WebKit-https.git] / Source / WebCore / page / DOMWindow.h
1 /*
2  * Copyright (C) 2006-2017 Apple Inc. All rights reserved.
3  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
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 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 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 #pragma once
28
29 #include "AbstractDOMWindow.h"
30 #include "Base64Utilities.h"
31 #include "ContextDestructionObserver.h"
32 #include "ExceptionOr.h"
33 #include "Frame.h"
34 #include "FrameDestructionObserver.h"
35 #include "ImageBitmap.h"
36 #include "ScrollToOptions.h"
37 #include "ScrollTypes.h"
38 #include "Supplementable.h"
39 #include <JavaScriptCore/HandleTypes.h>
40 #include <wtf/Function.h>
41 #include <wtf/HashSet.h>
42 #include <wtf/WeakPtr.h>
43
44 namespace JSC {
45 class ExecState;
46 class JSObject;
47 class JSValue;
48 template<typename> class Strong;
49 }
50
51 namespace WebCore {
52
53 class BarProp;
54 class CSSRuleList;
55 class CSSStyleDeclaration;
56 class Crypto;
57 class CustomElementRegistry;
58 class DOMApplicationCache;
59 class DOMSelection;
60 class DOMWindowProperty;
61 class DOMWrapperWorld;
62 class Document;
63 class Element;
64 class EventListener;
65 class FloatRect;
66 class History;
67 class Location;
68 class MediaQueryList;
69 class Navigator;
70 class Node;
71 class NodeList;
72 class Page;
73 class PageConsoleClient;
74 class Performance;
75 class PostMessageTimer;
76 class RequestAnimationFrameCallback;
77 class ScheduledAction;
78 class Screen;
79 class Storage;
80 class StyleMedia;
81 class VisualViewport;
82 class WebKitNamespace;
83 class WebKitPoint;
84
85 struct ImageBitmapOptions;
86 struct WindowFeatures;
87
88 enum SetLocationLocking { LockHistoryBasedOnGestureState, LockHistoryAndBackForwardList };
89 enum class IncludeTargetOrigin { No, Yes };
90
91 // FIXME: Rename DOMWindow to LocalWindow and AbstractDOMWindow to DOMWindow.
92 class DOMWindow final
93     : public AbstractDOMWindow
94     , public CanMakeWeakPtr<DOMWindow>
95     , public ContextDestructionObserver
96     , public Base64Utilities
97     , public Supplementable<DOMWindow> {
98 public:
99     static Ref<DOMWindow> create(Document& document) { return adoptRef(*new DOMWindow(document)); }
100     WEBCORE_EXPORT virtual ~DOMWindow();
101
102     // In some rare cases, we'll reuse a DOMWindow for a new Document. For example,
103     // when a script calls window.open("..."), the browser gives JavaScript a window
104     // synchronously but kicks off the load in the window asynchronously. Web sites
105     // expect that modifications that they make to the window object synchronously
106     // won't be blown away when the network load commits. To make that happen, we
107     // "securely transition" the existing DOMWindow to the Document that results from
108     // the network load. See also SecurityContext::isSecureTransitionTo.
109     void didSecureTransitionTo(Document&);
110
111     void registerProperty(DOMWindowProperty&);
112     void unregisterProperty(DOMWindowProperty&);
113
114     void resetUnlessSuspendedForDocumentSuspension();
115     void suspendForPageCache();
116     void resumeFromPageCache();
117
118     WEBCORE_EXPORT Frame* frame() const final;
119
120     RefPtr<MediaQueryList> matchMedia(const String&);
121
122     WEBCORE_EXPORT unsigned pendingUnloadEventListeners() const;
123
124     WEBCORE_EXPORT static bool dispatchAllPendingBeforeUnloadEvents();
125     WEBCORE_EXPORT static void dispatchAllPendingUnloadEvents();
126
127     static FloatRect adjustWindowRect(Page&, const FloatRect& pendingChanges);
128
129     bool allowPopUp(); // Call on first window, not target window.
130     static bool allowPopUp(Frame& firstFrame);
131     static bool canShowModalDialog(const Frame&);
132     WEBCORE_EXPORT void setCanShowModalDialogOverride(bool);
133
134     Screen& screen();
135     History& history();
136     Crypto& crypto() const;
137     BarProp& locationbar();
138     BarProp& menubar();
139     BarProp& personalbar();
140     BarProp& scrollbars();
141     BarProp& statusbar();
142     BarProp& toolbar();
143     Navigator& navigator();
144     Navigator* optionalNavigator() const { return m_navigator.get(); }
145     Navigator& clientInformation() { return navigator(); }
146
147     Location& location();
148     void setLocation(DOMWindow& activeWindow, const URL& completedURL, SetLocationLocking = LockHistoryBasedOnGestureState);
149
150     DOMSelection* getSelection();
151
152     Element* frameElement() const;
153
154     WEBCORE_EXPORT void focus(bool allowFocus = false);
155     void focus(DOMWindow& incumbentWindow);
156     void blur();
157     WEBCORE_EXPORT void close();
158     void close(Document&);
159     void print();
160     void stop();
161
162     WEBCORE_EXPORT ExceptionOr<RefPtr<WindowProxy>> open(DOMWindow& activeWindow, DOMWindow& firstWindow, const String& urlString, const AtomicString& frameName, const String& windowFeaturesString);
163
164     void showModalDialog(const String& urlString, const String& dialogFeaturesString, DOMWindow& activeWindow, DOMWindow& firstWindow, const WTF::Function<void(DOMWindow&)>& prepareDialogFunction);
165
166     void alert(const String& message = emptyString());
167     bool confirm(const String& message);
168     String prompt(const String& message, const String& defaultValue);
169
170     bool find(const String&, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) const;
171
172     bool offscreenBuffering() const;
173
174     int outerHeight() const;
175     int outerWidth() const;
176     int innerHeight() const;
177     int innerWidth() const;
178     int screenX() const;
179     int screenY() const;
180     int screenLeft() const { return screenX(); }
181     int screenTop() const { return screenY(); }
182     int scrollX() const;
183     int scrollY() const;
184
185     bool closed() const;
186
187     unsigned length() const;
188
189     String name() const;
190     void setName(const String&);
191
192     String status() const;
193     void setStatus(const String&);
194     String defaultStatus() const;
195     void setDefaultStatus(const String&);
196
197     WindowProxy* self() const;
198
199     WindowProxy* opener() const;
200     void disownOpener();
201     WindowProxy* parent() const;
202     WindowProxy* top() const;
203
204     String origin() const;
205
206     // DOM Level 2 AbstractView Interface
207
208     WEBCORE_EXPORT Document* document() const;
209
210     // CSSOM View Module
211
212     StyleMedia& styleMedia();
213
214     // DOM Level 2 Style Interface
215
216     WEBCORE_EXPORT Ref<CSSStyleDeclaration> getComputedStyle(Element&, const String& pseudoElt) const;
217
218     // WebKit extensions
219
220     WEBCORE_EXPORT RefPtr<CSSRuleList> getMatchedCSSRules(Element*, const String& pseudoElt, bool authorOnly = true) const;
221     double devicePixelRatio() const;
222
223     RefPtr<WebKitPoint> webkitConvertPointFromPageToNode(Node*, const WebKitPoint*) const;
224     RefPtr<WebKitPoint> webkitConvertPointFromNodeToPage(Node*, const WebKitPoint*) const;
225
226     PageConsoleClient* console() const;
227
228     void printErrorMessage(const String&);
229
230     String crossDomainAccessErrorMessage(const DOMWindow& activeWindow, IncludeTargetOrigin);
231
232     ExceptionOr<void> postMessage(JSC::ExecState&, DOMWindow& incumbentWindow, JSC::JSValue message, const String& targetOrigin, Vector<JSC::Strong<JSC::JSObject>>&&);
233     void postMessageTimerFired(PostMessageTimer&);
234
235     void languagesChanged();
236
237     void scrollBy(const ScrollToOptions&) const;
238     void scrollBy(double x, double y) const;
239     void scrollTo(const ScrollToOptions&, ScrollClamping = ScrollClamping::Clamped) const;
240     void scrollTo(double x, double y, ScrollClamping = ScrollClamping::Clamped) const;
241
242     void moveBy(float x, float y) const;
243     void moveTo(float x, float y) const;
244
245     void resizeBy(float x, float y) const;
246     void resizeTo(float width, float height) const;
247
248     VisualViewport& visualViewport();
249
250     // Timers
251     ExceptionOr<int> setTimeout(JSC::ExecState&, std::unique_ptr<ScheduledAction>, int timeout, Vector<JSC::Strong<JSC::Unknown>>&& arguments);
252     void clearTimeout(int timeoutId);
253     ExceptionOr<int> setInterval(JSC::ExecState&, std::unique_ptr<ScheduledAction>, int timeout, Vector<JSC::Strong<JSC::Unknown>>&& arguments);
254     void clearInterval(int timeoutId);
255
256     int requestAnimationFrame(Ref<RequestAnimationFrameCallback>&&);
257     int webkitRequestAnimationFrame(Ref<RequestAnimationFrameCallback>&&);
258     void cancelAnimationFrame(int id);
259
260     // ImageBitmap
261     void createImageBitmap(ImageBitmap::Source&&, ImageBitmapOptions&&, ImageBitmap::Promise&&);
262     void createImageBitmap(ImageBitmap::Source&&, int sx, int sy, int sw, int sh, ImageBitmapOptions&&, ImageBitmap::Promise&&);
263
264     // Secure Contexts
265     bool isSecureContext() const;
266
267     // Events
268     // EventTarget API
269     bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, const AddEventListenerOptions&) final;
270     bool removeEventListener(const AtomicString& eventType, EventListener&, const ListenerOptions&) final;
271     void removeAllEventListeners() final;
272
273     using EventTarget::dispatchEvent;
274     void dispatchEvent(Event&, EventTarget*);
275
276     void dispatchLoadEvent();
277
278     void captureEvents();
279     void releaseEvents();
280
281     void finishedLoading();
282
283     // HTML 5 key/value storage
284     ExceptionOr<Storage*> sessionStorage();
285     ExceptionOr<Storage*> localStorage();
286     Storage* optionalSessionStorage() const { return m_sessionStorage.get(); }
287     Storage* optionalLocalStorage() const { return m_localStorage.get(); }
288
289     DOMApplicationCache& applicationCache();
290     DOMApplicationCache* optionalApplicationCache() const { return m_applicationCache.get(); }
291
292     CustomElementRegistry* customElementRegistry() { return m_customElementRegistry.get(); }
293     CustomElementRegistry& ensureCustomElementRegistry();
294
295     ExceptionOr<Ref<NodeList>> collectMatchingElementsInFlatTree(Node&, const String& selectors);
296     ExceptionOr<RefPtr<Element>> matchingElementInFlatTree(Node&, const String& selectors);
297
298 #if ENABLE(ORIENTATION_EVENTS)
299     // This is the interface orientation in degrees. Some examples are:
300     //  0 is straight up; -90 is when the device is rotated 90 clockwise;
301     //  90 is when rotated counter clockwise.
302     int orientation() const;
303 #endif
304
305     Performance& performance() const;
306     WEBCORE_EXPORT double nowTimestamp() const;
307
308 #if PLATFORM(IOS_FAMILY)
309     void incrementScrollEventListenersCount();
310     void decrementScrollEventListenersCount();
311     unsigned scrollEventListenerCount() const { return m_scrollEventListenerCount; }
312 #endif
313
314     void resetAllGeolocationPermission();
315
316 #if ENABLE(IOS_TOUCH_EVENTS) || ENABLE(IOS_GESTURE_EVENTS)
317     bool hasTouchOrGestureEventListeners() const { return m_touchAndGestureEventListenerCount > 0; }
318 #endif
319
320 #if ENABLE(USER_MESSAGE_HANDLERS)
321     bool shouldHaveWebKitNamespaceForWorld(DOMWrapperWorld&);
322     WebKitNamespace* webkitNamespace();
323 #endif
324
325     // FIXME: When this DOMWindow is no longer the active DOMWindow (i.e.,
326     // when its document is no longer the document that is displayed in its
327     // frame), we would like to zero out m_frame to avoid being confused
328     // by the document that is currently active in m_frame.
329     bool isCurrentlyDisplayedInFrame() const;
330
331     void willDetachDocumentFromFrame();
332     void willDestroyCachedFrame();
333
334     void enableSuddenTermination();
335     void disableSuddenTermination();
336
337     void willDestroyDocumentInFrame();
338     void frameDestroyed();
339
340 private:
341     explicit DOMWindow(Document&);
342
343     ScriptExecutionContext* scriptExecutionContext() const final { return ContextDestructionObserver::scriptExecutionContext(); }
344
345     bool isLocalDOMWindow() const final { return true; }
346     bool isRemoteDOMWindow() const final { return false; }
347
348     Page* page();
349     bool allowedToChangeWindowGeometry() const;
350
351     static ExceptionOr<RefPtr<Frame>> createWindow(const String& urlString, const AtomicString& frameName, const WindowFeatures&, DOMWindow& activeWindow, Frame& firstFrame, Frame& openerFrame, const WTF::Function<void(DOMWindow&)>& prepareDialogFunction = nullptr);
352     bool isInsecureScriptAccess(DOMWindow& activeWindow, const String& urlString);
353
354     void resetDOMWindowProperties();
355
356 #if ENABLE(DEVICE_ORIENTATION)
357     void failedToRegisterDeviceMotionEventListener();
358 #endif
359
360     bool isSameSecurityOriginAsMainFrame() const;
361
362 #if ENABLE(GAMEPAD)
363     void incrementGamepadEventListenerCount();
364     void decrementGamepadEventListenerCount();
365 #endif
366
367     bool m_shouldPrintWhenFinishedLoading { false };
368     bool m_suspendedForDocumentSuspension { false };
369     Optional<bool> m_canShowModalDialogOverride;
370
371     HashSet<DOMWindowProperty*> m_properties;
372
373     mutable RefPtr<Crypto> m_crypto;
374     mutable RefPtr<History> m_history;
375     mutable RefPtr<BarProp> m_locationbar;
376     mutable RefPtr<StyleMedia> m_media;
377     mutable RefPtr<BarProp> m_menubar;
378     mutable RefPtr<Navigator> m_navigator;
379     mutable RefPtr<BarProp> m_personalbar;
380     mutable RefPtr<Screen> m_screen;
381     mutable RefPtr<BarProp> m_scrollbars;
382     mutable RefPtr<DOMSelection> m_selection;
383     mutable RefPtr<BarProp> m_statusbar;
384     mutable RefPtr<BarProp> m_toolbar;
385     mutable RefPtr<Location> m_location;
386     mutable RefPtr<VisualViewport> m_visualViewport;
387
388     String m_status;
389     String m_defaultStatus;
390
391     enum class PageStatus { None, Shown, Hidden };
392     PageStatus m_lastPageStatus { PageStatus::None };
393
394 #if PLATFORM(IOS_FAMILY)
395     unsigned m_scrollEventListenerCount { 0 };
396 #endif
397
398 #if ENABLE(IOS_TOUCH_EVENTS) || ENABLE(IOS_GESTURE_EVENTS)
399     unsigned m_touchAndGestureEventListenerCount { 0 };
400 #endif
401
402 #if ENABLE(GAMEPAD)
403     unsigned m_gamepadEventListenerCount { 0 };
404 #endif
405
406     mutable RefPtr<Storage> m_sessionStorage;
407     mutable RefPtr<Storage> m_localStorage;
408     mutable RefPtr<DOMApplicationCache> m_applicationCache;
409
410     RefPtr<CustomElementRegistry> m_customElementRegistry;
411
412     mutable RefPtr<Performance> m_performance;
413
414 #if ENABLE(USER_MESSAGE_HANDLERS)
415     mutable RefPtr<WebKitNamespace> m_webkitNamespace;
416 #endif
417 };
418
419 inline String DOMWindow::status() const
420 {
421     return m_status;
422 }
423
424 inline String DOMWindow::defaultStatus() const
425 {
426     return m_defaultStatus;
427 }
428
429 } // namespace WebCore
430
431 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::DOMWindow)
432     static bool isType(const WebCore::AbstractDOMWindow& window) { return window.isLocalDOMWindow(); }
433     static bool isType(const WebCore::EventTarget& target) { return target.eventTargetInterface() == WebCore::DOMWindowEventTargetInterfaceType; }
434 SPECIALIZE_TYPE_TRAITS_END()