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