|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* vim: set ts=2 sw=2 et tw=80: */ |
|
3 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 |
|
7 #ifndef nsGlobalWindow_h___ |
|
8 #define nsGlobalWindow_h___ |
|
9 |
|
10 #include "nsPIDOMWindow.h" |
|
11 |
|
12 #include "nsTHashtable.h" |
|
13 #include "nsHashKeys.h" |
|
14 #include "nsRefPtrHashtable.h" |
|
15 |
|
16 // Local Includes |
|
17 // Helper Classes |
|
18 #include "nsCOMPtr.h" |
|
19 #include "nsAutoPtr.h" |
|
20 #include "nsWeakReference.h" |
|
21 #include "nsDataHashtable.h" |
|
22 #include "nsJSThingHashtable.h" |
|
23 #include "nsCycleCollectionParticipant.h" |
|
24 |
|
25 // Interfaces Needed |
|
26 #include "nsIBrowserDOMWindow.h" |
|
27 #include "nsIDOMEventTarget.h" |
|
28 #include "nsIInterfaceRequestor.h" |
|
29 #include "nsIDOMJSWindow.h" |
|
30 #include "nsIDOMChromeWindow.h" |
|
31 #include "nsIScriptGlobalObject.h" |
|
32 #include "nsIScriptObjectPrincipal.h" |
|
33 #include "nsITimer.h" |
|
34 #include "nsIDOMModalContentWindow.h" |
|
35 #include "mozilla/EventListenerManager.h" |
|
36 #include "nsIPrincipal.h" |
|
37 #include "nsSize.h" |
|
38 #include "mozFlushType.h" |
|
39 #include "prclist.h" |
|
40 #include "nsIDOMStorageEvent.h" |
|
41 #include "nsFrameMessageManager.h" |
|
42 #include "mozilla/LinkedList.h" |
|
43 #include "mozilla/TimeStamp.h" |
|
44 #include "nsIInlineEventHandlers.h" |
|
45 #include "nsWrapperCacheInlines.h" |
|
46 #include "nsIIdleObserver.h" |
|
47 #include "nsIDocument.h" |
|
48 #include "nsIDOMTouchEvent.h" |
|
49 #include "mozilla/dom/EventTarget.h" |
|
50 #include "Units.h" |
|
51 #include "nsComponentManagerUtils.h" |
|
52 |
|
53 #ifdef MOZ_B2G |
|
54 #include "nsIDOMWindowB2G.h" |
|
55 #endif // MOZ_B2G |
|
56 |
|
57 #ifdef MOZ_WEBSPEECH |
|
58 #include "nsISpeechSynthesisGetter.h" |
|
59 #endif // MOZ_WEBSPEECH |
|
60 |
|
61 #define DEFAULT_HOME_PAGE "www.mozilla.org" |
|
62 #define PREF_BROWSER_STARTUP_HOMEPAGE "browser.startup.homepage" |
|
63 |
|
64 // Amount of time allowed between alert/prompt/confirm before enabling |
|
65 // the stop dialog checkbox. |
|
66 #define DEFAULT_SUCCESSIVE_DIALOG_TIME_LIMIT 3 // 3 sec |
|
67 |
|
68 // Maximum number of successive dialogs before we prompt users to disable |
|
69 // dialogs for this window. |
|
70 #define MAX_SUCCESSIVE_DIALOG_COUNT 5 |
|
71 |
|
72 // Idle fuzz time upper limit |
|
73 #define MAX_IDLE_FUZZ_TIME_MS 90000 |
|
74 |
|
75 // Min idle notification time in seconds. |
|
76 #define MIN_IDLE_NOTIFICATION_TIME_S 1 |
|
77 |
|
78 class nsIArray; |
|
79 class nsIBaseWindow; |
|
80 class nsIContent; |
|
81 class nsICSSDeclaration; |
|
82 class nsIDocShellTreeOwner; |
|
83 class nsIDOMCrypto; |
|
84 class nsIDOMOfflineResourceList; |
|
85 class nsIScrollableFrame; |
|
86 class nsIControllers; |
|
87 class nsIJSID; |
|
88 class nsIScriptContext; |
|
89 class nsIScriptTimeoutHandler; |
|
90 class nsIWebBrowserChrome; |
|
91 |
|
92 class nsDOMWindowList; |
|
93 class nsLocation; |
|
94 class nsScreen; |
|
95 class nsHistory; |
|
96 class nsGlobalWindowObserver; |
|
97 class nsGlobalWindow; |
|
98 class nsDOMWindowUtils; |
|
99 class nsIIdleService; |
|
100 struct nsIntSize; |
|
101 struct nsRect; |
|
102 |
|
103 class nsWindowSizes; |
|
104 |
|
105 namespace mozilla { |
|
106 class DOMEventTargetHelper; |
|
107 namespace dom { |
|
108 class BarProp; |
|
109 class Console; |
|
110 class External; |
|
111 class Function; |
|
112 class Gamepad; |
|
113 class MediaQueryList; |
|
114 class Navigator; |
|
115 class OwningExternalOrWindowProxy; |
|
116 class Selection; |
|
117 class SpeechSynthesis; |
|
118 class WakeLock; |
|
119 namespace indexedDB { |
|
120 class IDBFactory; |
|
121 } // namespace indexedDB |
|
122 } // namespace dom |
|
123 } // namespace mozilla |
|
124 |
|
125 extern nsresult |
|
126 NS_CreateJSTimeoutHandler(nsGlobalWindow *aWindow, |
|
127 bool *aIsInterval, |
|
128 int32_t *aInterval, |
|
129 nsIScriptTimeoutHandler **aRet); |
|
130 |
|
131 extern already_AddRefed<nsIScriptTimeoutHandler> |
|
132 NS_CreateJSTimeoutHandler(nsGlobalWindow *aWindow, |
|
133 mozilla::dom::Function& aFunction, |
|
134 const mozilla::dom::Sequence<JS::Value>& aArguments, |
|
135 mozilla::ErrorResult& aError); |
|
136 |
|
137 extern already_AddRefed<nsIScriptTimeoutHandler> |
|
138 NS_CreateJSTimeoutHandler(JSContext* aCx, nsGlobalWindow *aWindow, |
|
139 const nsAString& aExpression, |
|
140 mozilla::ErrorResult& aError); |
|
141 |
|
142 /* |
|
143 * Timeout struct that holds information about each script |
|
144 * timeout. Holds a strong reference to an nsIScriptTimeoutHandler, which |
|
145 * abstracts the language specific cruft. |
|
146 */ |
|
147 struct nsTimeout : mozilla::LinkedListElement<nsTimeout> |
|
148 { |
|
149 nsTimeout(); |
|
150 ~nsTimeout(); |
|
151 |
|
152 NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(nsTimeout) |
|
153 NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(nsTimeout) |
|
154 |
|
155 nsresult InitTimer(nsTimerCallbackFunc aFunc, uint32_t aDelay) |
|
156 { |
|
157 return mTimer->InitWithFuncCallback(aFunc, this, aDelay, |
|
158 nsITimer::TYPE_ONE_SHOT); |
|
159 } |
|
160 |
|
161 bool HasRefCntOne(); |
|
162 |
|
163 // Window for which this timeout fires |
|
164 nsRefPtr<nsGlobalWindow> mWindow; |
|
165 |
|
166 // The actual timer object |
|
167 nsCOMPtr<nsITimer> mTimer; |
|
168 |
|
169 // True if the timeout was cleared |
|
170 bool mCleared; |
|
171 |
|
172 // True if this is one of the timeouts that are currently running |
|
173 bool mRunning; |
|
174 |
|
175 // True if this is a repeating/interval timer |
|
176 bool mIsInterval; |
|
177 |
|
178 // Returned as value of setTimeout() |
|
179 uint32_t mPublicId; |
|
180 |
|
181 // Interval in milliseconds |
|
182 uint32_t mInterval; |
|
183 |
|
184 // mWhen and mTimeRemaining can't be in a union, sadly, because they |
|
185 // have constructors. |
|
186 // Nominal time to run this timeout. Use only when timeouts are not |
|
187 // suspended. |
|
188 mozilla::TimeStamp mWhen; |
|
189 // Remaining time to wait. Used only when timeouts are suspended. |
|
190 mozilla::TimeDuration mTimeRemaining; |
|
191 |
|
192 // Principal with which to execute |
|
193 nsCOMPtr<nsIPrincipal> mPrincipal; |
|
194 |
|
195 // stack depth at which timeout is firing |
|
196 uint32_t mFiringDepth; |
|
197 |
|
198 // |
|
199 uint32_t mNestingLevel; |
|
200 |
|
201 // The popup state at timeout creation time if not created from |
|
202 // another timeout |
|
203 PopupControlState mPopupState; |
|
204 |
|
205 // The language-specific information about the callback. |
|
206 nsCOMPtr<nsIScriptTimeoutHandler> mScriptHandler; |
|
207 }; |
|
208 |
|
209 struct IdleObserverHolder |
|
210 { |
|
211 nsCOMPtr<nsIIdleObserver> mIdleObserver; |
|
212 uint32_t mTimeInS; |
|
213 bool mPrevNotificationIdle; |
|
214 |
|
215 IdleObserverHolder() |
|
216 : mTimeInS(0), mPrevNotificationIdle(false) |
|
217 { |
|
218 MOZ_COUNT_CTOR(IdleObserverHolder); |
|
219 } |
|
220 |
|
221 IdleObserverHolder(const IdleObserverHolder& aOther) |
|
222 : mIdleObserver(aOther.mIdleObserver), mTimeInS(aOther.mTimeInS), |
|
223 mPrevNotificationIdle(aOther.mPrevNotificationIdle) |
|
224 { |
|
225 MOZ_COUNT_CTOR(IdleObserverHolder); |
|
226 } |
|
227 |
|
228 bool operator==(const IdleObserverHolder& aOther) const { |
|
229 return |
|
230 mIdleObserver == aOther.mIdleObserver && |
|
231 mTimeInS == aOther.mTimeInS; |
|
232 } |
|
233 |
|
234 ~IdleObserverHolder() |
|
235 { |
|
236 MOZ_COUNT_DTOR(IdleObserverHolder); |
|
237 } |
|
238 }; |
|
239 |
|
240 static inline already_AddRefed<nsIVariant> |
|
241 CreateVoidVariant() |
|
242 { |
|
243 nsCOMPtr<nsIWritableVariant> writable = |
|
244 do_CreateInstance(NS_VARIANT_CONTRACTID); |
|
245 writable->SetAsVoid(); |
|
246 return writable.forget(); |
|
247 } |
|
248 |
|
249 // Helper class to manage modal dialog arguments and all their quirks. |
|
250 // |
|
251 // Given our clunky embedding APIs, modal dialog arguments need to be passed |
|
252 // as an nsISupports parameter to WindowWatcher, get stuck inside an array of |
|
253 // length 1, and then passed back to the newly-created dialog. |
|
254 // |
|
255 // However, we need to track both the caller-passed value as well as the |
|
256 // caller's, so that we can do an origin check (even for primitives) when the |
|
257 // value is accessed. This class encapsulates that magic. |
|
258 // |
|
259 // We also use the same machinery for |returnValue|, which needs similar origin |
|
260 // checks. |
|
261 class DialogValueHolder : public nsISupports |
|
262 { |
|
263 public: |
|
264 NS_DECL_CYCLE_COLLECTING_ISUPPORTS |
|
265 NS_DECL_CYCLE_COLLECTION_CLASS(DialogValueHolder) |
|
266 |
|
267 DialogValueHolder(nsIPrincipal* aSubject, nsIVariant* aValue) |
|
268 : mOrigin(aSubject) |
|
269 , mValue(aValue) {} |
|
270 nsresult Get(nsIPrincipal* aSubject, nsIVariant** aResult) |
|
271 { |
|
272 nsCOMPtr<nsIVariant> result; |
|
273 if (aSubject->SubsumesConsideringDomain(mOrigin)) { |
|
274 result = mValue; |
|
275 } else { |
|
276 result = CreateVoidVariant(); |
|
277 } |
|
278 result.forget(aResult); |
|
279 return NS_OK; |
|
280 } |
|
281 void Get(JSContext* aCx, JS::Handle<JSObject*> aScope, nsIPrincipal* aSubject, |
|
282 JS::MutableHandle<JS::Value> aResult, mozilla::ErrorResult& aError) |
|
283 { |
|
284 if (aSubject->Subsumes(mOrigin)) { |
|
285 aError = nsContentUtils::XPConnect()->VariantToJS(aCx, aScope, |
|
286 mValue, aResult); |
|
287 } else { |
|
288 aResult.setUndefined(); |
|
289 } |
|
290 } |
|
291 virtual ~DialogValueHolder() {} |
|
292 private: |
|
293 nsCOMPtr<nsIPrincipal> mOrigin; |
|
294 nsCOMPtr<nsIVariant> mValue; |
|
295 }; |
|
296 |
|
297 //***************************************************************************** |
|
298 // nsGlobalWindow: Global Object for Scripting |
|
299 //***************************************************************************** |
|
300 // Beware that all scriptable interfaces implemented by |
|
301 // nsGlobalWindow will be reachable from JS, if you make this class |
|
302 // implement new interfaces you better know what you're |
|
303 // doing. Security wise this is very sensitive code. -- |
|
304 // jst@netscape.com |
|
305 |
|
306 // nsGlobalWindow inherits PRCList for maintaining a list of all inner |
|
307 // windows still in memory for any given outer window. This list is |
|
308 // needed to ensure that mOuterWindow doesn't end up dangling. The |
|
309 // nature of PRCList means that the window itself is always in the |
|
310 // list, and an outer window's list will also contain all inner window |
|
311 // objects that are still in memory (and in reality all inner window |
|
312 // object's lists also contain its outer and all other inner windows |
|
313 // belonging to the same outer window, but that's an unimportant |
|
314 // side effect of inheriting PRCList). |
|
315 |
|
316 class nsGlobalWindow : public mozilla::dom::EventTarget, |
|
317 public nsPIDOMWindow, |
|
318 public nsIScriptGlobalObject, |
|
319 public nsIScriptObjectPrincipal, |
|
320 public nsIDOMJSWindow, |
|
321 public nsSupportsWeakReference, |
|
322 public nsIInterfaceRequestor, |
|
323 public PRCListStr, |
|
324 public nsIDOMWindowPerformance, |
|
325 public nsITouchEventReceiver, |
|
326 public nsIInlineEventHandlers |
|
327 #ifdef MOZ_B2G |
|
328 , public nsIDOMWindowB2G |
|
329 #endif // MOZ_B2G |
|
330 #ifdef MOZ_WEBSPEECH |
|
331 , public nsISpeechSynthesisGetter |
|
332 #endif // MOZ_WEBSPEECH |
|
333 { |
|
334 public: |
|
335 typedef mozilla::TimeStamp TimeStamp; |
|
336 typedef mozilla::TimeDuration TimeDuration; |
|
337 typedef nsDataHashtable<nsUint64HashKey, nsGlobalWindow*> WindowByIdTable; |
|
338 |
|
339 // public methods |
|
340 nsPIDOMWindow* GetPrivateParent(); |
|
341 // callback for close event |
|
342 void ReallyCloseWindow(); |
|
343 |
|
344 // nsISupports |
|
345 NS_DECL_CYCLE_COLLECTING_ISUPPORTS |
|
346 |
|
347 // nsWrapperCache |
|
348 virtual JSObject *WrapObject(JSContext *cx) MOZ_OVERRIDE |
|
349 { |
|
350 NS_ASSERTION(IsOuterWindow(), |
|
351 "Inner window supports nsWrapperCache, fix WrapObject!"); |
|
352 return EnsureInnerWindow() ? GetWrapper() : nullptr; |
|
353 } |
|
354 |
|
355 // nsIGlobalJSObjectHolder |
|
356 virtual JSObject *GetGlobalJSObject(); |
|
357 |
|
358 // nsIScriptGlobalObject |
|
359 JSObject *FastGetGlobalJSObject() const |
|
360 { |
|
361 return GetWrapperPreserveColor(); |
|
362 } |
|
363 |
|
364 void TraceGlobalJSObject(JSTracer* aTrc); |
|
365 |
|
366 virtual nsresult EnsureScriptEnvironment(); |
|
367 |
|
368 virtual nsIScriptContext *GetScriptContext(); |
|
369 |
|
370 void PoisonOuterWindowProxy(JSObject *aObject); |
|
371 |
|
372 virtual bool IsBlackForCC(bool aTracingNeeded = true); |
|
373 |
|
374 static JSObject* OuterObject(JSContext* aCx, JS::Handle<JSObject*> aObj); |
|
375 |
|
376 // nsIScriptObjectPrincipal |
|
377 virtual nsIPrincipal* GetPrincipal(); |
|
378 |
|
379 // nsIDOMWindow |
|
380 NS_DECL_NSIDOMWINDOW |
|
381 |
|
382 #ifdef MOZ_B2G |
|
383 // nsIDOMWindowB2G |
|
384 NS_DECL_NSIDOMWINDOWB2G |
|
385 #endif // MOZ_B2G |
|
386 |
|
387 #ifdef MOZ_WEBSPEECH |
|
388 // nsISpeechSynthesisGetter |
|
389 NS_DECL_NSISPEECHSYNTHESISGETTER |
|
390 #endif // MOZ_WEBSPEECH |
|
391 |
|
392 // nsIDOMWindowPerformance |
|
393 NS_DECL_NSIDOMWINDOWPERFORMANCE |
|
394 |
|
395 // nsIDOMJSWindow |
|
396 NS_DECL_NSIDOMJSWINDOW |
|
397 |
|
398 // nsIDOMEventTarget |
|
399 NS_DECL_NSIDOMEVENTTARGET |
|
400 |
|
401 virtual mozilla::EventListenerManager* |
|
402 GetExistingListenerManager() const MOZ_OVERRIDE; |
|
403 |
|
404 virtual mozilla::EventListenerManager* |
|
405 GetOrCreateListenerManager() MOZ_OVERRIDE; |
|
406 |
|
407 using mozilla::dom::EventTarget::RemoveEventListener; |
|
408 virtual void AddEventListener(const nsAString& aType, |
|
409 mozilla::dom::EventListener* aListener, |
|
410 bool aUseCapture, |
|
411 const mozilla::dom::Nullable<bool>& aWantsUntrusted, |
|
412 mozilla::ErrorResult& aRv) MOZ_OVERRIDE; |
|
413 virtual nsIDOMWindow* GetOwnerGlobal() MOZ_OVERRIDE |
|
414 { |
|
415 if (IsOuterWindow()) { |
|
416 return this; |
|
417 } |
|
418 |
|
419 return GetOuterFromCurrentInner(this); |
|
420 } |
|
421 |
|
422 // nsITouchEventReceiver |
|
423 NS_DECL_NSITOUCHEVENTRECEIVER |
|
424 |
|
425 // nsIInlineEventHandlers |
|
426 NS_DECL_NSIINLINEEVENTHANDLERS |
|
427 |
|
428 // nsPIDOMWindow |
|
429 virtual NS_HIDDEN_(nsPIDOMWindow*) GetPrivateRoot(); |
|
430 |
|
431 // Outer windows only. |
|
432 virtual NS_HIDDEN_(void) ActivateOrDeactivate(bool aActivate); |
|
433 virtual NS_HIDDEN_(void) SetActive(bool aActive); |
|
434 virtual NS_HIDDEN_(void) SetIsBackground(bool aIsBackground); |
|
435 virtual NS_HIDDEN_(void) SetChromeEventHandler(mozilla::dom::EventTarget* aChromeEventHandler); |
|
436 |
|
437 virtual NS_HIDDEN_(void) SetInitialPrincipalToSubject(); |
|
438 |
|
439 virtual NS_HIDDEN_(PopupControlState) PushPopupControlState(PopupControlState state, bool aForce) const; |
|
440 virtual NS_HIDDEN_(void) PopPopupControlState(PopupControlState state) const; |
|
441 virtual NS_HIDDEN_(PopupControlState) GetPopupControlState() const; |
|
442 |
|
443 virtual already_AddRefed<nsISupports> SaveWindowState(); |
|
444 virtual NS_HIDDEN_(nsresult) RestoreWindowState(nsISupports *aState); |
|
445 virtual NS_HIDDEN_(void) SuspendTimeouts(uint32_t aIncrease = 1, |
|
446 bool aFreezeChildren = true); |
|
447 virtual NS_HIDDEN_(nsresult) ResumeTimeouts(bool aThawChildren = true); |
|
448 virtual NS_HIDDEN_(uint32_t) TimeoutSuspendCount(); |
|
449 virtual NS_HIDDEN_(nsresult) FireDelayedDOMEvents(); |
|
450 virtual NS_HIDDEN_(bool) IsFrozen() const |
|
451 { |
|
452 return mIsFrozen; |
|
453 } |
|
454 virtual NS_HIDDEN_(bool) IsRunningTimeout() { return mTimeoutFiringDepth > 0; } |
|
455 |
|
456 virtual NS_HIDDEN_(bool) WouldReuseInnerWindow(nsIDocument *aNewDocument); |
|
457 |
|
458 virtual NS_HIDDEN_(void) SetDocShell(nsIDocShell* aDocShell); |
|
459 virtual void DetachFromDocShell(); |
|
460 virtual NS_HIDDEN_(nsresult) SetNewDocument(nsIDocument *aDocument, |
|
461 nsISupports *aState, |
|
462 bool aForceReuseInnerWindow); |
|
463 void DispatchDOMWindowCreated(); |
|
464 virtual NS_HIDDEN_(void) SetOpenerWindow(nsIDOMWindow* aOpener, |
|
465 bool aOriginalOpener); |
|
466 |
|
467 // Outer windows only. |
|
468 virtual NS_HIDDEN_(void) EnsureSizeUpToDate(); |
|
469 |
|
470 virtual NS_HIDDEN_(void) EnterModalState(); |
|
471 virtual NS_HIDDEN_(void) LeaveModalState(); |
|
472 |
|
473 virtual NS_HIDDEN_(bool) CanClose(); |
|
474 virtual NS_HIDDEN_(nsresult) ForceClose(); |
|
475 |
|
476 virtual NS_HIDDEN_(void) MaybeUpdateTouchState(); |
|
477 virtual NS_HIDDEN_(void) UpdateTouchState(); |
|
478 virtual NS_HIDDEN_(bool) DispatchCustomEvent(const char *aEventName); |
|
479 virtual NS_HIDDEN_(bool) DispatchResizeEvent(const nsIntSize& aSize); |
|
480 virtual NS_HIDDEN_(void) RefreshCompartmentPrincipal(); |
|
481 virtual NS_HIDDEN_(nsresult) SetFullScreenInternal(bool aIsFullScreen, bool aRequireTrust); |
|
482 |
|
483 virtual NS_HIDDEN_(void) SetHasGamepadEventListener(bool aHasGamepad = true); |
|
484 |
|
485 // nsIInterfaceRequestor |
|
486 NS_DECL_NSIINTERFACEREQUESTOR |
|
487 |
|
488 // WebIDL interface. |
|
489 already_AddRefed<nsIDOMWindow> IndexedGetter(uint32_t aIndex, bool& aFound); |
|
490 |
|
491 void GetSupportedNames(nsTArray<nsString>& aNames); |
|
492 |
|
493 static bool IsChromeWindow(JSContext* /* unused */, JSObject* aObj); |
|
494 |
|
495 bool IsChrome() const; |
|
496 |
|
497 bool DoNewResolve(JSContext* aCx, JS::Handle<JSObject*> aObj, |
|
498 JS::Handle<jsid> aId, |
|
499 JS::MutableHandle<JSPropertyDescriptor> aDesc); |
|
500 |
|
501 void GetOwnPropertyNames(JSContext* aCx, nsTArray<nsString>& aNames, |
|
502 mozilla::ErrorResult& aRv); |
|
503 |
|
504 // Object Management |
|
505 nsGlobalWindow(nsGlobalWindow *aOuterWindow); |
|
506 |
|
507 static nsGlobalWindow *FromSupports(nsISupports *supports) |
|
508 { |
|
509 // Make sure this matches the casts we do in QueryInterface(). |
|
510 return (nsGlobalWindow *)(mozilla::dom::EventTarget *)supports; |
|
511 } |
|
512 static nsGlobalWindow *FromWrapper(nsIXPConnectWrappedNative *wrapper) |
|
513 { |
|
514 return FromSupports(wrapper->Native()); |
|
515 } |
|
516 |
|
517 /** |
|
518 * Wrap nsIDOMWindow::GetTop so we can overload the inline GetTop() |
|
519 * implementation below. (nsIDOMWindow::GetTop simply calls |
|
520 * nsIDOMWindow::GetRealTop().) |
|
521 */ |
|
522 nsresult GetTop(nsIDOMWindow **aWindow) |
|
523 { |
|
524 return nsIDOMWindow::GetTop(aWindow); |
|
525 } |
|
526 |
|
527 inline nsGlobalWindow *GetTop() |
|
528 { |
|
529 nsCOMPtr<nsIDOMWindow> top; |
|
530 GetTop(getter_AddRefs(top)); |
|
531 if (top) |
|
532 return static_cast<nsGlobalWindow *>(top.get()); |
|
533 return nullptr; |
|
534 } |
|
535 |
|
536 inline nsGlobalWindow* GetScriptableTop() |
|
537 { |
|
538 nsCOMPtr<nsIDOMWindow> top; |
|
539 GetScriptableTop(getter_AddRefs(top)); |
|
540 return static_cast<nsGlobalWindow *>(top.get()); |
|
541 } |
|
542 |
|
543 already_AddRefed<nsIDOMWindow> GetChildWindow(const nsAString& aName); |
|
544 |
|
545 // These return true if we've reached the state in this top level window |
|
546 // where we ask the user if further dialogs should be blocked. |
|
547 // |
|
548 // DialogsAreBeingAbused must be called on the scriptable top inner window. |
|
549 // |
|
550 // ShouldPromptToBlockDialogs is implemented in terms of |
|
551 // DialogsAreBeingAbused, and will get the scriptable top inner window |
|
552 // automatically. |
|
553 // Outer windows only. |
|
554 bool ShouldPromptToBlockDialogs(); |
|
555 // Inner windows only. |
|
556 bool DialogsAreBeingAbused(); |
|
557 |
|
558 // These functions are used for controlling and determining whether dialogs |
|
559 // (alert, prompt, confirm) are currently allowed in this window. |
|
560 void EnableDialogs(); |
|
561 void DisableDialogs(); |
|
562 bool AreDialogsEnabled(); |
|
563 |
|
564 nsIScriptContext *GetContextInternal() |
|
565 { |
|
566 if (mOuterWindow) { |
|
567 return GetOuterWindowInternal()->mContext; |
|
568 } |
|
569 |
|
570 return mContext; |
|
571 } |
|
572 |
|
573 nsGlobalWindow *GetOuterWindowInternal() |
|
574 { |
|
575 return static_cast<nsGlobalWindow *>(GetOuterWindow()); |
|
576 } |
|
577 |
|
578 nsGlobalWindow *GetCurrentInnerWindowInternal() const |
|
579 { |
|
580 return static_cast<nsGlobalWindow *>(mInnerWindow); |
|
581 } |
|
582 |
|
583 nsGlobalWindow *EnsureInnerWindowInternal() |
|
584 { |
|
585 return static_cast<nsGlobalWindow *>(EnsureInnerWindow()); |
|
586 } |
|
587 |
|
588 bool IsCreatingInnerWindow() const |
|
589 { |
|
590 return mCreatingInnerWindow; |
|
591 } |
|
592 |
|
593 bool IsChromeWindow() const |
|
594 { |
|
595 return mIsChrome; |
|
596 } |
|
597 |
|
598 using nsPIDOMWindow::IsModalContentWindow; |
|
599 static bool IsModalContentWindow(JSContext* aCx, JSObject* aGlobal); |
|
600 |
|
601 // GetScrollFrame does not flush. Callers should do it themselves as needed, |
|
602 // depending on which info they actually want off the scrollable frame. |
|
603 nsIScrollableFrame *GetScrollFrame(); |
|
604 |
|
605 nsresult Observe(nsISupports* aSubject, const char* aTopic, |
|
606 const char16_t* aData); |
|
607 |
|
608 // Outer windows only. |
|
609 void UnblockScriptedClosing(); |
|
610 |
|
611 static void Init(); |
|
612 static void ShutDown(); |
|
613 static void CleanupCachedXBLHandlers(nsGlobalWindow* aWindow); |
|
614 static bool IsCallerChrome(); |
|
615 |
|
616 static void RunPendingTimeoutsRecursive(nsGlobalWindow *aTopWindow, |
|
617 nsGlobalWindow *aWindow); |
|
618 |
|
619 friend class WindowStateHolder; |
|
620 |
|
621 NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsGlobalWindow, |
|
622 nsIDOMEventTarget) |
|
623 |
|
624 #ifdef DEBUG |
|
625 // Call Unlink on this window. This may cause bad things to happen, so use |
|
626 // with caution. |
|
627 void RiskyUnlink(); |
|
628 #endif |
|
629 |
|
630 virtual NS_HIDDEN_(JSObject*) |
|
631 GetCachedXBLPrototypeHandler(nsXBLPrototypeHandler* aKey); |
|
632 |
|
633 virtual NS_HIDDEN_(void) |
|
634 CacheXBLPrototypeHandler(nsXBLPrototypeHandler* aKey, |
|
635 JS::Handle<JSObject*> aHandler); |
|
636 |
|
637 virtual bool TakeFocus(bool aFocus, uint32_t aFocusMethod); |
|
638 virtual void SetReadyForFocus(); |
|
639 virtual void PageHidden(); |
|
640 virtual nsresult DispatchAsyncHashchange(nsIURI *aOldURI, nsIURI *aNewURI); |
|
641 virtual nsresult DispatchSyncPopState(); |
|
642 |
|
643 // Inner windows only. |
|
644 virtual void EnableDeviceSensor(uint32_t aType); |
|
645 virtual void DisableDeviceSensor(uint32_t aType); |
|
646 |
|
647 virtual void EnableTimeChangeNotifications(); |
|
648 virtual void DisableTimeChangeNotifications(); |
|
649 |
|
650 #ifdef MOZ_B2G |
|
651 // Inner windows only. |
|
652 virtual void EnableNetworkEvent(uint32_t aType); |
|
653 virtual void DisableNetworkEvent(uint32_t aType); |
|
654 #endif // MOZ_B2G |
|
655 |
|
656 virtual nsresult SetArguments(nsIArray *aArguments); |
|
657 |
|
658 void MaybeForgiveSpamCount(); |
|
659 bool IsClosedOrClosing() { |
|
660 return (mIsClosed || |
|
661 mInClose || |
|
662 mHavePendingClose || |
|
663 mCleanedUp); |
|
664 } |
|
665 |
|
666 static void FirePopupBlockedEvent(nsIDocument* aDoc, |
|
667 nsIDOMWindow *aRequestingWindow, nsIURI *aPopupURI, |
|
668 const nsAString &aPopupWindowName, |
|
669 const nsAString &aPopupWindowFeatures); |
|
670 |
|
671 virtual uint32_t GetSerial() { |
|
672 return mSerial; |
|
673 } |
|
674 |
|
675 static nsGlobalWindow* GetOuterWindowWithId(uint64_t aWindowID) { |
|
676 if (!sWindowsById) { |
|
677 return nullptr; |
|
678 } |
|
679 |
|
680 nsGlobalWindow* outerWindow = sWindowsById->Get(aWindowID); |
|
681 return outerWindow && !outerWindow->IsInnerWindow() ? outerWindow : nullptr; |
|
682 } |
|
683 |
|
684 static nsGlobalWindow* GetInnerWindowWithId(uint64_t aInnerWindowID) { |
|
685 if (!sWindowsById) { |
|
686 return nullptr; |
|
687 } |
|
688 |
|
689 nsGlobalWindow* innerWindow = sWindowsById->Get(aInnerWindowID); |
|
690 return innerWindow && innerWindow->IsInnerWindow() ? innerWindow : nullptr; |
|
691 } |
|
692 |
|
693 static WindowByIdTable* GetWindowsTable() { |
|
694 return sWindowsById; |
|
695 } |
|
696 |
|
697 void AddSizeOfIncludingThis(nsWindowSizes* aWindowSizes) const; |
|
698 |
|
699 void UnmarkGrayTimers(); |
|
700 |
|
701 void AddEventTargetObject(mozilla::DOMEventTargetHelper* aObject); |
|
702 void RemoveEventTargetObject(mozilla::DOMEventTargetHelper* aObject); |
|
703 |
|
704 void NotifyIdleObserver(IdleObserverHolder* aIdleObserverHolder, |
|
705 bool aCallOnidle); |
|
706 nsresult HandleIdleActiveEvent(); |
|
707 bool ContainsIdleObserver(nsIIdleObserver* aIdleObserver, uint32_t timeInS); |
|
708 void HandleIdleObserverCallback(); |
|
709 |
|
710 void AllowScriptsToClose() |
|
711 { |
|
712 mAllowScriptsToClose = true; |
|
713 } |
|
714 |
|
715 enum SlowScriptResponse { |
|
716 ContinueSlowScript = 0, |
|
717 AlwaysContinueSlowScript, |
|
718 KillSlowScript |
|
719 }; |
|
720 SlowScriptResponse ShowSlowScriptDialog(); |
|
721 |
|
722 #ifdef MOZ_GAMEPAD |
|
723 void AddGamepad(uint32_t aIndex, mozilla::dom::Gamepad* aGamepad); |
|
724 void RemoveGamepad(uint32_t aIndex); |
|
725 void GetGamepads(nsTArray<nsRefPtr<mozilla::dom::Gamepad> >& aGamepads); |
|
726 already_AddRefed<mozilla::dom::Gamepad> GetGamepad(uint32_t aIndex); |
|
727 void SetHasSeenGamepadInput(bool aHasSeen); |
|
728 bool HasSeenGamepadInput(); |
|
729 void SyncGamepadState(); |
|
730 static PLDHashOperator EnumGamepadsForSync(const uint32_t& aKey, |
|
731 mozilla::dom::Gamepad* aData, |
|
732 void* aUserArg); |
|
733 static PLDHashOperator EnumGamepadsForGet(const uint32_t& aKey, |
|
734 mozilla::dom::Gamepad* aData, |
|
735 void* aUserArg); |
|
736 #endif |
|
737 |
|
738 // Enable/disable updates for gamepad input. |
|
739 void EnableGamepadUpdates(); |
|
740 void DisableGamepadUpdates(); |
|
741 |
|
742 |
|
743 #define EVENT(name_, id_, type_, struct_) \ |
|
744 mozilla::dom::EventHandlerNonNull* GetOn##name_() \ |
|
745 { \ |
|
746 mozilla::EventListenerManager* elm = GetExistingListenerManager(); \ |
|
747 return elm ? elm->GetEventHandler(nsGkAtoms::on##name_, EmptyString()) \ |
|
748 : nullptr; \ |
|
749 } \ |
|
750 void SetOn##name_(mozilla::dom::EventHandlerNonNull* handler) \ |
|
751 { \ |
|
752 mozilla::EventListenerManager* elm = GetOrCreateListenerManager(); \ |
|
753 if (elm) { \ |
|
754 elm->SetEventHandler(nsGkAtoms::on##name_, EmptyString(), handler); \ |
|
755 } \ |
|
756 } |
|
757 #define ERROR_EVENT(name_, id_, type_, struct_) \ |
|
758 mozilla::dom::OnErrorEventHandlerNonNull* GetOn##name_() \ |
|
759 { \ |
|
760 mozilla::EventListenerManager* elm = GetExistingListenerManager(); \ |
|
761 return elm ? elm->GetOnErrorEventHandler() : nullptr; \ |
|
762 } \ |
|
763 void SetOn##name_(mozilla::dom::OnErrorEventHandlerNonNull* handler) \ |
|
764 { \ |
|
765 mozilla::EventListenerManager* elm = GetOrCreateListenerManager(); \ |
|
766 if (elm) { \ |
|
767 elm->SetEventHandler(handler); \ |
|
768 } \ |
|
769 } |
|
770 #define BEFOREUNLOAD_EVENT(name_, id_, type_, struct_) \ |
|
771 mozilla::dom::OnBeforeUnloadEventHandlerNonNull* GetOn##name_() \ |
|
772 { \ |
|
773 mozilla::EventListenerManager* elm = GetExistingListenerManager(); \ |
|
774 return elm ? elm->GetOnBeforeUnloadEventHandler() : nullptr; \ |
|
775 } \ |
|
776 void SetOn##name_(mozilla::dom::OnBeforeUnloadEventHandlerNonNull* handler) \ |
|
777 { \ |
|
778 mozilla::EventListenerManager* elm = GetOrCreateListenerManager(); \ |
|
779 if (elm) { \ |
|
780 elm->SetEventHandler(handler); \ |
|
781 } \ |
|
782 } |
|
783 #define WINDOW_ONLY_EVENT EVENT |
|
784 #define TOUCH_EVENT EVENT |
|
785 #include "mozilla/EventNameList.h" |
|
786 #undef TOUCH_EVENT |
|
787 #undef WINDOW_ONLY_EVENT |
|
788 #undef BEFOREUNLOAD_EVENT |
|
789 #undef ERROR_EVENT |
|
790 #undef EVENT |
|
791 |
|
792 nsISupports* GetParentObject() |
|
793 { |
|
794 return nullptr; |
|
795 } |
|
796 |
|
797 static bool WindowOnWebIDL(JSContext* /* unused */, JSObject* aObj); |
|
798 |
|
799 nsIDOMWindow* GetWindow(mozilla::ErrorResult& aError); |
|
800 nsIDOMWindow* GetSelf(mozilla::ErrorResult& aError); |
|
801 nsIDocument* GetDocument() |
|
802 { |
|
803 return GetDoc(); |
|
804 } |
|
805 void GetName(nsAString& aName, mozilla::ErrorResult& aError); |
|
806 void SetName(const nsAString& aName, mozilla::ErrorResult& aError); |
|
807 nsIDOMLocation* GetLocation(mozilla::ErrorResult& aError); |
|
808 nsHistory* GetHistory(mozilla::ErrorResult& aError); |
|
809 mozilla::dom::BarProp* GetLocationbar(mozilla::ErrorResult& aError); |
|
810 mozilla::dom::BarProp* GetMenubar(mozilla::ErrorResult& aError); |
|
811 mozilla::dom::BarProp* GetPersonalbar(mozilla::ErrorResult& aError); |
|
812 mozilla::dom::BarProp* GetScrollbars(mozilla::ErrorResult& aError); |
|
813 mozilla::dom::BarProp* GetStatusbar(mozilla::ErrorResult& aError); |
|
814 mozilla::dom::BarProp* GetToolbar(mozilla::ErrorResult& aError); |
|
815 void GetStatus(nsAString& aStatus, mozilla::ErrorResult& aError); |
|
816 void SetStatus(const nsAString& aStatus, mozilla::ErrorResult& aError); |
|
817 void Close(mozilla::ErrorResult& aError); |
|
818 bool GetClosed(mozilla::ErrorResult& aError); |
|
819 void Stop(mozilla::ErrorResult& aError); |
|
820 void Focus(mozilla::ErrorResult& aError); |
|
821 void Blur(mozilla::ErrorResult& aError); |
|
822 already_AddRefed<nsIDOMWindow> GetFrames(mozilla::ErrorResult& aError); |
|
823 uint32_t Length(); |
|
824 already_AddRefed<nsIDOMWindow> GetTop(mozilla::ErrorResult& aError) |
|
825 { |
|
826 nsCOMPtr<nsIDOMWindow> top; |
|
827 aError = GetScriptableTop(getter_AddRefs(top)); |
|
828 return top.forget(); |
|
829 } |
|
830 protected: |
|
831 nsIDOMWindow* GetOpenerWindow(mozilla::ErrorResult& aError); |
|
832 public: |
|
833 void GetOpener(JSContext* aCx, JS::MutableHandle<JS::Value> aRetval, |
|
834 mozilla::ErrorResult& aError); |
|
835 void SetOpener(JSContext* aCx, JS::Handle<JS::Value> aOpener, |
|
836 mozilla::ErrorResult& aError); |
|
837 using nsIDOMWindow::GetParent; |
|
838 already_AddRefed<nsIDOMWindow> GetParent(mozilla::ErrorResult& aError); |
|
839 mozilla::dom::Element* GetFrameElement(mozilla::ErrorResult& aError); |
|
840 already_AddRefed<nsIDOMWindow> Open(const nsAString& aUrl, |
|
841 const nsAString& aName, |
|
842 const nsAString& aOptions, |
|
843 mozilla::ErrorResult& aError); |
|
844 mozilla::dom::Navigator* GetNavigator(mozilla::ErrorResult& aError); |
|
845 nsIDOMOfflineResourceList* GetApplicationCache(mozilla::ErrorResult& aError); |
|
846 |
|
847 mozilla::dom::Console* GetConsole(mozilla::ErrorResult& aRv); |
|
848 |
|
849 void GetSidebar(mozilla::dom::OwningExternalOrWindowProxy& aResult, |
|
850 mozilla::ErrorResult& aRv); |
|
851 already_AddRefed<mozilla::dom::External> GetExternal(mozilla::ErrorResult& aRv); |
|
852 |
|
853 protected: |
|
854 bool AlertOrConfirm(bool aAlert, const nsAString& aMessage, |
|
855 mozilla::ErrorResult& aError); |
|
856 |
|
857 public: |
|
858 void Alert(const nsAString& aMessage, mozilla::ErrorResult& aError); |
|
859 bool Confirm(const nsAString& aMessage, mozilla::ErrorResult& aError); |
|
860 void Prompt(const nsAString& aMessage, const nsAString& aInitial, |
|
861 nsAString& aReturn, mozilla::ErrorResult& aError); |
|
862 void Print(mozilla::ErrorResult& aError); |
|
863 void ShowModalDialog(JSContext* aCx, const nsAString& aUrl, |
|
864 JS::Handle<JS::Value> aArgument, |
|
865 const nsAString& aOptions, |
|
866 JS::MutableHandle<JS::Value> aRetval, |
|
867 mozilla::ErrorResult& aError); |
|
868 void PostMessageMoz(JSContext* aCx, JS::Handle<JS::Value> aMessage, |
|
869 const nsAString& aTargetOrigin, |
|
870 const mozilla::dom::Optional<mozilla::dom::Sequence<JS::Value > >& aTransfer, |
|
871 mozilla::ErrorResult& aError); |
|
872 int32_t SetTimeout(JSContext* aCx, mozilla::dom::Function& aFunction, |
|
873 int32_t aTimeout, |
|
874 const mozilla::dom::Sequence<JS::Value>& aArguments, |
|
875 mozilla::ErrorResult& aError); |
|
876 int32_t SetTimeout(JSContext* aCx, const nsAString& aHandler, |
|
877 int32_t aTimeout, |
|
878 const mozilla::dom::Sequence<JS::Value>& /* unused */, |
|
879 mozilla::ErrorResult& aError); |
|
880 void ClearTimeout(int32_t aHandle, mozilla::ErrorResult& aError); |
|
881 int32_t SetInterval(JSContext* aCx, mozilla::dom::Function& aFunction, |
|
882 const mozilla::dom::Optional<int32_t>& aTimeout, |
|
883 const mozilla::dom::Sequence<JS::Value>& aArguments, |
|
884 mozilla::ErrorResult& aError); |
|
885 int32_t SetInterval(JSContext* aCx, const nsAString& aHandler, |
|
886 const mozilla::dom::Optional<int32_t>& aTimeout, |
|
887 const mozilla::dom::Sequence<JS::Value>& /* unused */, |
|
888 mozilla::ErrorResult& aError); |
|
889 void ClearInterval(int32_t aHandle, mozilla::ErrorResult& aError); |
|
890 void Atob(const nsAString& aAsciiBase64String, nsAString& aBinaryData, |
|
891 mozilla::ErrorResult& aError); |
|
892 void Btoa(const nsAString& aBinaryData, nsAString& aAsciiBase64String, |
|
893 mozilla::ErrorResult& aError); |
|
894 nsIDOMStorage* GetSessionStorage(mozilla::ErrorResult& aError); |
|
895 nsIDOMStorage* GetLocalStorage(mozilla::ErrorResult& aError); |
|
896 mozilla::dom::Selection* GetSelection(mozilla::ErrorResult& aError); |
|
897 mozilla::dom::indexedDB::IDBFactory* GetIndexedDB(mozilla::ErrorResult& aError); |
|
898 already_AddRefed<nsICSSDeclaration> |
|
899 GetComputedStyle(mozilla::dom::Element& aElt, const nsAString& aPseudoElt, |
|
900 mozilla::ErrorResult& aError); |
|
901 already_AddRefed<mozilla::dom::MediaQueryList> MatchMedia(const nsAString& aQuery, |
|
902 mozilla::ErrorResult& aError); |
|
903 nsScreen* GetScreen(mozilla::ErrorResult& aError); |
|
904 void MoveTo(int32_t aXPos, int32_t aYPos, mozilla::ErrorResult& aError); |
|
905 void MoveBy(int32_t aXDif, int32_t aYDif, mozilla::ErrorResult& aError); |
|
906 void ResizeTo(int32_t aWidth, int32_t aHeight, |
|
907 mozilla::ErrorResult& aError); |
|
908 void ResizeBy(int32_t aWidthDif, int32_t aHeightDif, |
|
909 mozilla::ErrorResult& aError); |
|
910 int32_t GetInnerWidth(mozilla::ErrorResult& aError); |
|
911 void SetInnerWidth(int32_t aInnerWidth, mozilla::ErrorResult& aError); |
|
912 int32_t GetInnerHeight(mozilla::ErrorResult& aError); |
|
913 void SetInnerHeight(int32_t aInnerHeight, mozilla::ErrorResult& aError); |
|
914 int32_t GetScrollX(mozilla::ErrorResult& aError); |
|
915 int32_t GetPageXOffset(mozilla::ErrorResult& aError) |
|
916 { |
|
917 return GetScrollX(aError); |
|
918 } |
|
919 int32_t GetScrollY(mozilla::ErrorResult& aError); |
|
920 int32_t GetPageYOffset(mozilla::ErrorResult& aError) |
|
921 { |
|
922 return GetScrollY(aError); |
|
923 } |
|
924 int32_t GetScreenX(mozilla::ErrorResult& aError); |
|
925 void SetScreenX(int32_t aScreenX, mozilla::ErrorResult& aError); |
|
926 int32_t GetScreenY(mozilla::ErrorResult& aError); |
|
927 void SetScreenY(int32_t aScreenY, mozilla::ErrorResult& aError); |
|
928 int32_t GetOuterWidth(mozilla::ErrorResult& aError); |
|
929 void SetOuterWidth(int32_t aOuterWidth, mozilla::ErrorResult& aError); |
|
930 int32_t GetOuterHeight(mozilla::ErrorResult& aError); |
|
931 void SetOuterHeight(int32_t aOuterHeight, mozilla::ErrorResult& aError); |
|
932 int32_t RequestAnimationFrame(mozilla::dom::FrameRequestCallback& aCallback, |
|
933 mozilla::ErrorResult& aError); |
|
934 void CancelAnimationFrame(int32_t aHandle, mozilla::ErrorResult& aError); |
|
935 nsPerformance* GetPerformance(mozilla::ErrorResult& aError); |
|
936 nsresult GetFirstPartyIsolationURI(nsIURI** aFirstPartyIsolationURI); |
|
937 |
|
938 #ifdef MOZ_WEBSPEECH |
|
939 mozilla::dom::SpeechSynthesis* |
|
940 GetSpeechSynthesis(mozilla::ErrorResult& aError); |
|
941 #endif |
|
942 already_AddRefed<nsICSSDeclaration> |
|
943 GetDefaultComputedStyle(mozilla::dom::Element& aElt, |
|
944 const nsAString& aPseudoElt, |
|
945 mozilla::ErrorResult& aError); |
|
946 mozilla::dom::indexedDB::IDBFactory* |
|
947 GetMozIndexedDB(mozilla::ErrorResult& aError) |
|
948 { |
|
949 return GetIndexedDB(aError); |
|
950 } |
|
951 int32_t MozRequestAnimationFrame(nsIFrameRequestCallback* aRequestCallback, |
|
952 mozilla::ErrorResult& aError); |
|
953 void MozCancelAnimationFrame(int32_t aHandle, mozilla::ErrorResult& aError) |
|
954 { |
|
955 return CancelAnimationFrame(aHandle, aError); |
|
956 } |
|
957 void MozCancelRequestAnimationFrame(int32_t aHandle, |
|
958 mozilla::ErrorResult& aError) |
|
959 { |
|
960 return CancelAnimationFrame(aHandle, aError); |
|
961 } |
|
962 int64_t GetMozAnimationStartTime(mozilla::ErrorResult& aError); |
|
963 void SizeToContent(mozilla::ErrorResult& aError); |
|
964 nsIDOMCrypto* GetCrypto(mozilla::ErrorResult& aError); |
|
965 nsIControllers* GetControllers(mozilla::ErrorResult& aError); |
|
966 float GetMozInnerScreenX(mozilla::ErrorResult& aError); |
|
967 float GetMozInnerScreenY(mozilla::ErrorResult& aError); |
|
968 float GetDevicePixelRatio(mozilla::ErrorResult& aError); |
|
969 int32_t GetScrollMaxX(mozilla::ErrorResult& aError); |
|
970 int32_t GetScrollMaxY(mozilla::ErrorResult& aError); |
|
971 bool GetFullScreen(mozilla::ErrorResult& aError); |
|
972 void SetFullScreen(bool aFullScreen, mozilla::ErrorResult& aError); |
|
973 void Back(mozilla::ErrorResult& aError); |
|
974 void Forward(mozilla::ErrorResult& aError); |
|
975 void Home(mozilla::ErrorResult& aError); |
|
976 bool Find(const nsAString& aString, bool aCaseSensitive, bool aBackwards, |
|
977 bool aWrapAround, bool aWholeWord, bool aSearchInFrames, |
|
978 bool aShowDialog, mozilla::ErrorResult& aError); |
|
979 uint64_t GetMozPaintCount(mozilla::ErrorResult& aError); |
|
980 already_AddRefed<nsIDOMWindow> OpenDialog(JSContext* aCx, |
|
981 const nsAString& aUrl, |
|
982 const nsAString& aName, |
|
983 const nsAString& aOptions, |
|
984 const mozilla::dom::Sequence<JS::Value>& aExtraArgument, |
|
985 mozilla::ErrorResult& aError); |
|
986 void GetContent(JSContext* aCx, |
|
987 JS::MutableHandle<JSObject*> aRetval, |
|
988 mozilla::ErrorResult& aError); |
|
989 void Get_content(JSContext* aCx, |
|
990 JS::MutableHandle<JSObject*> aRetval, |
|
991 mozilla::ErrorResult& aError) |
|
992 { |
|
993 if (mDoc) { |
|
994 mDoc->WarnOnceAbout(nsIDocument::eWindow_Content); |
|
995 } |
|
996 GetContent(aCx, aRetval, aError); |
|
997 } |
|
998 |
|
999 // ChromeWindow bits. Do NOT call these unless your window is in |
|
1000 // fact an nsGlobalChromeWindow. |
|
1001 uint16_t WindowState(); |
|
1002 nsIBrowserDOMWindow* GetBrowserDOMWindow(mozilla::ErrorResult& aError); |
|
1003 void SetBrowserDOMWindow(nsIBrowserDOMWindow* aBrowserWindow, |
|
1004 mozilla::ErrorResult& aError); |
|
1005 void GetAttention(mozilla::ErrorResult& aError); |
|
1006 void GetAttentionWithCycleCount(int32_t aCycleCount, |
|
1007 mozilla::ErrorResult& aError); |
|
1008 void SetCursor(const nsAString& aCursor, mozilla::ErrorResult& aError); |
|
1009 void Maximize(mozilla::ErrorResult& aError); |
|
1010 void Minimize(mozilla::ErrorResult& aError); |
|
1011 void Restore(mozilla::ErrorResult& aError); |
|
1012 void NotifyDefaultButtonLoaded(mozilla::dom::Element& aDefaultButton, |
|
1013 mozilla::ErrorResult& aError); |
|
1014 nsIMessageBroadcaster* GetMessageManager(mozilla::ErrorResult& aError); |
|
1015 void BeginWindowMove(mozilla::dom::Event& aMouseDownEvent, |
|
1016 mozilla::dom::Element* aPanel, |
|
1017 mozilla::ErrorResult& aError); |
|
1018 |
|
1019 void GetDialogArguments(JSContext* aCx, JS::MutableHandle<JS::Value> aRetval, |
|
1020 mozilla::ErrorResult& aError); |
|
1021 void GetReturnValue(JSContext* aCx, JS::MutableHandle<JS::Value> aReturnValue, |
|
1022 mozilla::ErrorResult& aError); |
|
1023 void SetReturnValue(JSContext* aCx, JS::Handle<JS::Value> aReturnValue, |
|
1024 mozilla::ErrorResult& aError); |
|
1025 |
|
1026 void GetInterface(JSContext* aCx, nsIJSID* aIID, |
|
1027 JS::MutableHandle<JS::Value> aRetval, |
|
1028 mozilla::ErrorResult& aError); |
|
1029 |
|
1030 protected: |
|
1031 // Array of idle observers that are notified of idle events. |
|
1032 nsTObserverArray<IdleObserverHolder> mIdleObservers; |
|
1033 |
|
1034 // Idle timer used for function callbacks to notify idle observers. |
|
1035 nsCOMPtr<nsITimer> mIdleTimer; |
|
1036 |
|
1037 // Idle fuzz time added to idle timer callbacks. |
|
1038 uint32_t mIdleFuzzFactor; |
|
1039 |
|
1040 // Index in mArrayIdleObservers |
|
1041 // Next idle observer to notify user idle status |
|
1042 int32_t mIdleCallbackIndex; |
|
1043 |
|
1044 // If false then the topic is "active" |
|
1045 // If true then the topic is "idle" |
|
1046 bool mCurrentlyIdle; |
|
1047 |
|
1048 // Set to true when a fuzz time needs to be applied |
|
1049 // to active notifications to the idle observer. |
|
1050 bool mAddActiveEventFuzzTime; |
|
1051 |
|
1052 nsCOMPtr <nsIIdleService> mIdleService; |
|
1053 |
|
1054 nsRefPtr<mozilla::dom::WakeLock> mWakeLock; |
|
1055 |
|
1056 static bool sIdleObserversAPIFuzzTimeDisabled; |
|
1057 |
|
1058 friend class HashchangeCallback; |
|
1059 friend class mozilla::dom::BarProp; |
|
1060 |
|
1061 // Object Management |
|
1062 virtual ~nsGlobalWindow(); |
|
1063 void DropOuterWindowDocs(); |
|
1064 void CleanUp(); |
|
1065 void ClearControllers(); |
|
1066 nsresult FinalClose(); |
|
1067 |
|
1068 inline void MaybeClearInnerWindow(nsGlobalWindow* aExpectedInner) |
|
1069 { |
|
1070 if(mInnerWindow == aExpectedInner) { |
|
1071 mInnerWindow = nullptr; |
|
1072 } |
|
1073 } |
|
1074 |
|
1075 void FreeInnerObjects(); |
|
1076 JSObject *CallerGlobal(); |
|
1077 nsGlobalWindow *CallerInnerWindow(); |
|
1078 |
|
1079 // Only to be called on an inner window. |
|
1080 // aDocument must not be null. |
|
1081 void InnerSetNewDocument(JSContext* aCx, nsIDocument* aDocument); |
|
1082 |
|
1083 nsresult DefineArgumentsProperty(nsIArray *aArguments); |
|
1084 |
|
1085 // Get the parent, returns null if this is a toplevel window |
|
1086 nsIDOMWindow* GetParentInternal(); |
|
1087 |
|
1088 // popup tracking |
|
1089 bool IsPopupSpamWindow() |
|
1090 { |
|
1091 if (IsInnerWindow() && !mOuterWindow) { |
|
1092 return false; |
|
1093 } |
|
1094 |
|
1095 return GetOuterWindowInternal()->mIsPopupSpam; |
|
1096 } |
|
1097 |
|
1098 void SetPopupSpamWindow(bool aPopup) |
|
1099 { |
|
1100 if (IsInnerWindow() && !mOuterWindow) { |
|
1101 NS_ERROR("SetPopupSpamWindow() called on inner window w/o an outer!"); |
|
1102 |
|
1103 return; |
|
1104 } |
|
1105 |
|
1106 GetOuterWindowInternal()->mIsPopupSpam = aPopup; |
|
1107 } |
|
1108 |
|
1109 // Window Control Functions |
|
1110 |
|
1111 virtual nsresult |
|
1112 OpenNoNavigate(const nsAString& aUrl, |
|
1113 const nsAString& aName, |
|
1114 const nsAString& aOptions, |
|
1115 nsIDOMWindow **_retval); |
|
1116 |
|
1117 /** |
|
1118 * @param aUrl the URL we intend to load into the window. If aNavigate is |
|
1119 * true, we'll actually load this URL into the window. Otherwise, |
|
1120 * aUrl is advisory; OpenInternal will not load the URL into the |
|
1121 * new window. |
|
1122 * |
|
1123 * @param aName the name to use for the new window |
|
1124 * |
|
1125 * @param aOptions the window options to use for the new window |
|
1126 * |
|
1127 * @param aDialog true when called from variants of OpenDialog. If this is |
|
1128 * true, this method will skip popup blocking checks. The aDialog |
|
1129 * argument is passed on to the window watcher. |
|
1130 * |
|
1131 * @param aCalledNoScript true when called via the [noscript] open() |
|
1132 * and openDialog() methods. When this is true, we do NOT want to use |
|
1133 * the JS stack for things like caller determination. |
|
1134 * |
|
1135 * @param aDoJSFixups true when this is the content-accessible JS version of |
|
1136 * window opening. When true, popups do not cause us to throw, we save |
|
1137 * the caller's principal in the new window for later consumption, and |
|
1138 * we make sure that there is a document in the newly-opened window. |
|
1139 * Note that this last will only be done if the newly-opened window is |
|
1140 * non-chrome. |
|
1141 * |
|
1142 * @param aNavigate true if we should navigate to the provided URL, false |
|
1143 * otherwise. When aNavigate is false, we also skip our can-load |
|
1144 * security check, on the assumption that whoever *actually* loads this |
|
1145 * page will do their own security check. |
|
1146 * |
|
1147 * @param argv The arguments to pass to the new window. The first |
|
1148 * three args, if present, will be aUrl, aName, and aOptions. So this |
|
1149 * param only matters if there are more than 3 arguments. |
|
1150 * |
|
1151 * @param argc The number of arguments in argv. |
|
1152 * |
|
1153 * @param aExtraArgument Another way to pass arguments in. This is mutually |
|
1154 * exclusive with the argv/argc approach. |
|
1155 * |
|
1156 * @param aJSCallerContext The calling script's context. This must be null |
|
1157 * when aCalledNoScript is true. |
|
1158 * |
|
1159 * @param aReturn [out] The window that was opened, if any. |
|
1160 */ |
|
1161 NS_HIDDEN_(nsresult) OpenInternal(const nsAString& aUrl, |
|
1162 const nsAString& aName, |
|
1163 const nsAString& aOptions, |
|
1164 bool aDialog, |
|
1165 bool aContentModal, |
|
1166 bool aCalledNoScript, |
|
1167 bool aDoJSFixups, |
|
1168 bool aNavigate, |
|
1169 nsIArray *argv, |
|
1170 nsISupports *aExtraArgument, |
|
1171 nsIPrincipal *aCalleePrincipal, |
|
1172 JSContext *aJSCallerContext, |
|
1173 nsIDOMWindow **aReturn); |
|
1174 |
|
1175 // Timeout Functions |
|
1176 // Language agnostic timeout function (all args passed). |
|
1177 // |interval| is in milliseconds. |
|
1178 nsresult SetTimeoutOrInterval(nsIScriptTimeoutHandler *aHandler, |
|
1179 int32_t interval, |
|
1180 bool aIsInterval, int32_t *aReturn); |
|
1181 int32_t SetTimeoutOrInterval(mozilla::dom::Function& aFunction, |
|
1182 int32_t aTimeout, |
|
1183 const mozilla::dom::Sequence<JS::Value>& aArguments, |
|
1184 bool aIsInterval, mozilla::ErrorResult& aError); |
|
1185 int32_t SetTimeoutOrInterval(JSContext* aCx, const nsAString& aHandler, |
|
1186 int32_t aTimeout, bool aIsInterval, |
|
1187 mozilla::ErrorResult& aError); |
|
1188 void ClearTimeoutOrInterval(int32_t aTimerID, |
|
1189 mozilla::ErrorResult& aError); |
|
1190 nsresult ClearTimeoutOrInterval(int32_t aTimerID) |
|
1191 { |
|
1192 mozilla::ErrorResult rv; |
|
1193 ClearTimeoutOrInterval(aTimerID, rv); |
|
1194 return rv.ErrorCode(); |
|
1195 } |
|
1196 |
|
1197 // JS specific timeout functions (JS args grabbed from context). |
|
1198 nsresult SetTimeoutOrInterval(bool aIsInterval, int32_t* aReturn); |
|
1199 nsresult ResetTimersForNonBackgroundWindow(); |
|
1200 |
|
1201 // The timeout implementation functions. |
|
1202 void RunTimeout(nsTimeout *aTimeout); |
|
1203 void RunTimeout() { RunTimeout(nullptr); } |
|
1204 // Return true if |aTimeout| was cleared while its handler ran. |
|
1205 bool RunTimeoutHandler(nsTimeout* aTimeout, nsIScriptContext* aScx); |
|
1206 // Return true if |aTimeout| needs to be reinserted into the timeout list. |
|
1207 bool RescheduleTimeout(nsTimeout* aTimeout, const TimeStamp& now, |
|
1208 bool aRunningPendingTimeouts); |
|
1209 |
|
1210 void ClearAllTimeouts(); |
|
1211 // Insert aTimeout into the list, before all timeouts that would |
|
1212 // fire after it, but no earlier than mTimeoutInsertionPoint, if any. |
|
1213 void InsertTimeoutIntoList(nsTimeout *aTimeout); |
|
1214 static void TimerCallback(nsITimer *aTimer, void *aClosure); |
|
1215 |
|
1216 // Helper Functions |
|
1217 already_AddRefed<nsIDocShellTreeOwner> GetTreeOwner(); |
|
1218 already_AddRefed<nsIBaseWindow> GetTreeOwnerWindow(); |
|
1219 already_AddRefed<nsIWebBrowserChrome> GetWebBrowserChrome(); |
|
1220 nsresult SecurityCheckURL(const char *aURL); |
|
1221 |
|
1222 bool PopupWhitelisted(); |
|
1223 PopupControlState RevisePopupAbuseLevel(PopupControlState); |
|
1224 void FireAbuseEvents(bool aBlocked, bool aWindow, |
|
1225 const nsAString &aPopupURL, |
|
1226 const nsAString &aPopupWindowName, |
|
1227 const nsAString &aPopupWindowFeatures); |
|
1228 void FireOfflineStatusEvent(); |
|
1229 |
|
1230 // Inner windows only. |
|
1231 nsresult ScheduleNextIdleObserverCallback(); |
|
1232 uint32_t GetFuzzTimeMS(); |
|
1233 nsresult ScheduleActiveTimerCallback(); |
|
1234 uint32_t FindInsertionIndex(IdleObserverHolder* aIdleObserver); |
|
1235 virtual nsresult RegisterIdleObserver(nsIIdleObserver* aIdleObserverPtr); |
|
1236 nsresult FindIndexOfElementToRemove(nsIIdleObserver* aIdleObserver, |
|
1237 int32_t* aRemoveElementIndex); |
|
1238 virtual nsresult UnregisterIdleObserver(nsIIdleObserver* aIdleObserverPtr); |
|
1239 |
|
1240 // Inner windows only. |
|
1241 nsresult FireHashchange(const nsAString &aOldURL, const nsAString &aNewURL); |
|
1242 |
|
1243 void FlushPendingNotifications(mozFlushType aType); |
|
1244 |
|
1245 // Outer windows only. |
|
1246 void EnsureReflowFlushAndPaint(); |
|
1247 void CheckSecurityWidthAndHeight(int32_t* width, int32_t* height); |
|
1248 void CheckSecurityLeftAndTop(int32_t* left, int32_t* top); |
|
1249 |
|
1250 // Outer windows only. |
|
1251 // Arguments to this function should have values in app units |
|
1252 void SetCSSViewportWidthAndHeight(nscoord width, nscoord height); |
|
1253 // Arguments to this function should have values in device pixels |
|
1254 nsresult SetDocShellWidthAndHeight(int32_t width, int32_t height); |
|
1255 |
|
1256 static bool CanSetProperty(const char *aPrefName); |
|
1257 |
|
1258 static void MakeScriptDialogTitle(nsAString &aOutTitle); |
|
1259 |
|
1260 // Outer windows only. |
|
1261 bool CanMoveResizeWindows(); |
|
1262 |
|
1263 // If aDoFlush is true, we'll flush our own layout; otherwise we'll try to |
|
1264 // just flush our parent and only flush ourselves if we think we need to. |
|
1265 mozilla::CSSIntPoint GetScrollXY(bool aDoFlush, mozilla::ErrorResult& aError); |
|
1266 nsresult GetScrollXY(int32_t* aScrollX, int32_t* aScrollY, bool aDoFlush); |
|
1267 void GetScrollMaxXY(int32_t* aScrollMaxX, int32_t* aScrollMaxY, |
|
1268 mozilla::ErrorResult& aError); |
|
1269 |
|
1270 // Outer windows only. |
|
1271 nsresult GetInnerSize(mozilla::CSSIntSize& aSize); |
|
1272 nsIntSize GetOuterSize(mozilla::ErrorResult& aError); |
|
1273 void SetOuterSize(int32_t aLengthCSSPixels, bool aIsWidth, |
|
1274 mozilla::ErrorResult& aError); |
|
1275 nsRect GetInnerScreenRect(); |
|
1276 |
|
1277 void ScrollTo(const mozilla::CSSIntPoint& aScroll); |
|
1278 |
|
1279 bool IsFrame() |
|
1280 { |
|
1281 return GetParentInternal() != nullptr; |
|
1282 } |
|
1283 |
|
1284 // Outer windows only. |
|
1285 // If aLookForCallerOnJSStack is true, this method will look at the JS stack |
|
1286 // to determine who the caller is. If it's false, it'll use |this| as the |
|
1287 // caller. |
|
1288 bool WindowExists(const nsAString& aName, bool aLookForCallerOnJSStack); |
|
1289 |
|
1290 already_AddRefed<nsIWidget> GetMainWidget(); |
|
1291 nsIWidget* GetNearestWidget(); |
|
1292 |
|
1293 void Freeze() |
|
1294 { |
|
1295 NS_ASSERTION(!IsFrozen(), "Double-freezing?"); |
|
1296 mIsFrozen = true; |
|
1297 NotifyDOMWindowFrozen(this); |
|
1298 } |
|
1299 |
|
1300 void Thaw() |
|
1301 { |
|
1302 mIsFrozen = false; |
|
1303 NotifyDOMWindowThawed(this); |
|
1304 } |
|
1305 |
|
1306 bool IsInModalState(); |
|
1307 |
|
1308 // Convenience functions for the many methods that need to scale |
|
1309 // from device to CSS pixels or vice versa. Note: if a presentation |
|
1310 // context is not available, they will assume a 1:1 ratio. |
|
1311 int32_t DevToCSSIntPixels(int32_t px); |
|
1312 int32_t CSSToDevIntPixels(int32_t px); |
|
1313 nsIntSize DevToCSSIntPixels(nsIntSize px); |
|
1314 nsIntSize CSSToDevIntPixels(nsIntSize px); |
|
1315 |
|
1316 virtual void SetFocusedNode(nsIContent* aNode, |
|
1317 uint32_t aFocusMethod = 0, |
|
1318 bool aNeedsFocus = false); |
|
1319 |
|
1320 virtual uint32_t GetFocusMethod(); |
|
1321 |
|
1322 virtual bool ShouldShowFocusRing(); |
|
1323 |
|
1324 virtual void SetKeyboardIndicators(UIStateChangeType aShowAccelerators, |
|
1325 UIStateChangeType aShowFocusRings); |
|
1326 virtual void GetKeyboardIndicators(bool* aShowAccelerators, |
|
1327 bool* aShowFocusRings); |
|
1328 |
|
1329 // Inner windows only. |
|
1330 void UpdateCanvasFocus(bool aFocusChanged, nsIContent* aNewContent); |
|
1331 |
|
1332 public: |
|
1333 virtual already_AddRefed<nsPIWindowRoot> GetTopWindowRoot() MOZ_OVERRIDE; |
|
1334 |
|
1335 protected: |
|
1336 static void NotifyDOMWindowDestroyed(nsGlobalWindow* aWindow); |
|
1337 void NotifyWindowIDDestroyed(const char* aTopic); |
|
1338 |
|
1339 static void NotifyDOMWindowFrozen(nsGlobalWindow* aWindow); |
|
1340 static void NotifyDOMWindowThawed(nsGlobalWindow* aWindow); |
|
1341 |
|
1342 void ClearStatus(); |
|
1343 |
|
1344 virtual void UpdateParentTarget(); |
|
1345 |
|
1346 inline int32_t DOMMinTimeoutValue() const; |
|
1347 |
|
1348 nsresult CloneStorageEvent(const nsAString& aType, |
|
1349 nsCOMPtr<nsIDOMStorageEvent>& aEvent); |
|
1350 |
|
1351 // Outer windows only. |
|
1352 nsDOMWindowList* GetWindowList(); |
|
1353 |
|
1354 // Helper for getComputedStyle and getDefaultComputedStyle |
|
1355 already_AddRefed<nsICSSDeclaration> |
|
1356 GetComputedStyleHelper(mozilla::dom::Element& aElt, |
|
1357 const nsAString& aPseudoElt, |
|
1358 bool aDefaultStylesOnly, |
|
1359 mozilla::ErrorResult& aError); |
|
1360 nsresult GetComputedStyleHelper(nsIDOMElement* aElt, |
|
1361 const nsAString& aPseudoElt, |
|
1362 bool aDefaultStylesOnly, |
|
1363 nsIDOMCSSStyleDeclaration** aReturn); |
|
1364 |
|
1365 void PreloadLocalStorage(); |
|
1366 |
|
1367 // Returns device pixels. Outer windows only. |
|
1368 nsIntPoint GetScreenXY(mozilla::ErrorResult& aError); |
|
1369 |
|
1370 int32_t RequestAnimationFrame(const nsIDocument::FrameRequestCallbackHolder& aCallback, |
|
1371 mozilla::ErrorResult& aError); |
|
1372 |
|
1373 nsGlobalWindow* InnerForSetTimeoutOrInterval(mozilla::ErrorResult& aError); |
|
1374 |
|
1375 mozilla::dom::Element* GetRealFrameElement(mozilla::ErrorResult& aError); |
|
1376 |
|
1377 void PostMessageMoz(JSContext* aCx, JS::Handle<JS::Value> aMessage, |
|
1378 const nsAString& aTargetOrigin, |
|
1379 JS::Handle<JS::Value> aTransfer, |
|
1380 mozilla::ErrorResult& aError); |
|
1381 |
|
1382 already_AddRefed<nsIVariant> |
|
1383 ShowModalDialog(const nsAString& aUrl, nsIVariant* aArgument, |
|
1384 const nsAString& aOptions, mozilla::ErrorResult& aError); |
|
1385 |
|
1386 already_AddRefed<nsIDOMWindow> |
|
1387 GetContentInternal(mozilla::ErrorResult& aError); |
|
1388 |
|
1389 // Ask the user if further dialogs should be blocked, if dialogs are currently |
|
1390 // being abused. This is used in the cases where we have no modifiable UI to |
|
1391 // show, in that case we show a separate dialog to ask this question. |
|
1392 bool ConfirmDialogIfNeeded(); |
|
1393 |
|
1394 // When adding new member variables, be careful not to create cycles |
|
1395 // through JavaScript. If there is any chance that a member variable |
|
1396 // could own objects that are implemented in JavaScript, then those |
|
1397 // objects will keep the global object (this object) alive. To prevent |
|
1398 // these cycles, ownership of such members must be released in |
|
1399 // |CleanUp| and |DetachFromDocShell|. |
|
1400 |
|
1401 // This member is also used on both inner and outer windows, but |
|
1402 // for slightly different purposes. On inner windows it means the |
|
1403 // inner window is held onto by session history and should not |
|
1404 // change. On outer windows it means that the window is in a state |
|
1405 // where we don't want to force creation of a new inner window since |
|
1406 // we're in the middle of doing just that. |
|
1407 bool mIsFrozen : 1; |
|
1408 |
|
1409 // These members are only used on outer window objects. Make sure |
|
1410 // you never set any of these on an inner object! |
|
1411 bool mFullScreen : 1; |
|
1412 bool mIsClosed : 1; |
|
1413 bool mInClose : 1; |
|
1414 // mHavePendingClose means we've got a termination function set to |
|
1415 // close us when the JS stops executing or that we have a close |
|
1416 // event posted. If this is set, just ignore window.close() calls. |
|
1417 bool mHavePendingClose : 1; |
|
1418 bool mHadOriginalOpener : 1; |
|
1419 bool mIsPopupSpam : 1; |
|
1420 |
|
1421 // Indicates whether scripts are allowed to close this window. |
|
1422 bool mBlockScriptedClosingFlag : 1; |
|
1423 |
|
1424 // Track what sorts of events we need to fire when thawed |
|
1425 bool mFireOfflineStatusChangeEventOnThaw : 1; |
|
1426 bool mNotifyIdleObserversIdleOnThaw : 1; |
|
1427 bool mNotifyIdleObserversActiveOnThaw : 1; |
|
1428 |
|
1429 // Indicates whether we're in the middle of creating an initializing |
|
1430 // a new inner window object. |
|
1431 bool mCreatingInnerWindow : 1; |
|
1432 |
|
1433 // Fast way to tell if this is a chrome window (without having to QI). |
|
1434 bool mIsChrome : 1; |
|
1435 |
|
1436 // Hack to indicate whether a chrome window needs its message manager |
|
1437 // to be disconnected, since clean up code is shared in the global |
|
1438 // window superclass. |
|
1439 bool mCleanMessageManager : 1; |
|
1440 |
|
1441 // Indicates that the current document has never received a document focus |
|
1442 // event. |
|
1443 bool mNeedsFocus : 1; |
|
1444 bool mHasFocus : 1; |
|
1445 |
|
1446 // whether to show keyboard accelerators |
|
1447 bool mShowAccelerators : 1; |
|
1448 |
|
1449 // whether to show focus rings |
|
1450 bool mShowFocusRings : 1; |
|
1451 |
|
1452 // when true, show focus rings for the current focused content only. |
|
1453 // This will be reset when another element is focused |
|
1454 bool mShowFocusRingForContent : 1; |
|
1455 |
|
1456 // true if tab navigation has occurred for this window. Focus rings |
|
1457 // should be displayed. |
|
1458 bool mFocusByKeyOccurred : 1; |
|
1459 |
|
1460 // Ensure that a call to ResumeTimeouts() after FreeInnerObjects() does nothing. |
|
1461 // This member is only used by inner windows. |
|
1462 bool mInnerObjectsFreed : 1; |
|
1463 |
|
1464 // Indicates whether this window wants gamepad input events |
|
1465 bool mHasGamepad : 1; |
|
1466 #ifdef MOZ_GAMEPAD |
|
1467 nsRefPtrHashtable<nsUint32HashKey, mozilla::dom::Gamepad> mGamepads; |
|
1468 bool mHasSeenGamepadInput; |
|
1469 #endif |
|
1470 |
|
1471 // whether we've sent the destroy notification for our window id |
|
1472 bool mNotifiedIDDestroyed : 1; |
|
1473 // whether scripts may close the window, |
|
1474 // even if "dom.allow_scripts_to_close_windows" is false. |
|
1475 bool mAllowScriptsToClose : 1; |
|
1476 |
|
1477 nsCOMPtr<nsIScriptContext> mContext; |
|
1478 nsWeakPtr mOpener; |
|
1479 nsCOMPtr<nsIControllers> mControllers; |
|
1480 |
|
1481 // For |window.arguments|, via |openDialog|. |
|
1482 nsCOMPtr<nsIArray> mArguments; |
|
1483 |
|
1484 // For |window.dialogArguments|, via |showModalDialog|. |
|
1485 nsRefPtr<DialogValueHolder> mDialogArguments; |
|
1486 |
|
1487 // Only used in the outer. |
|
1488 nsRefPtr<DialogValueHolder> mReturnValue; |
|
1489 |
|
1490 nsRefPtr<mozilla::dom::Navigator> mNavigator; |
|
1491 nsRefPtr<nsScreen> mScreen; |
|
1492 nsRefPtr<nsDOMWindowList> mFrames; |
|
1493 nsRefPtr<mozilla::dom::BarProp> mMenubar; |
|
1494 nsRefPtr<mozilla::dom::BarProp> mToolbar; |
|
1495 nsRefPtr<mozilla::dom::BarProp> mLocationbar; |
|
1496 nsRefPtr<mozilla::dom::BarProp> mPersonalbar; |
|
1497 nsRefPtr<mozilla::dom::BarProp> mStatusbar; |
|
1498 nsRefPtr<mozilla::dom::BarProp> mScrollbars; |
|
1499 nsRefPtr<nsDOMWindowUtils> mWindowUtils; |
|
1500 nsString mStatus; |
|
1501 nsString mDefaultStatus; |
|
1502 nsGlobalWindowObserver* mObserver; // Inner windows only. |
|
1503 nsCOMPtr<nsIDOMCrypto> mCrypto; |
|
1504 nsRefPtr<mozilla::dom::Console> mConsole; |
|
1505 // We need to store an nsISupports pointer to this object because the |
|
1506 // mozilla::dom::External class doesn't exist on b2g and using the type |
|
1507 // forward declared here means that ~nsGlobalWindow wouldn't compile because |
|
1508 // it wouldn't see the ~External function's declaration. |
|
1509 nsCOMPtr<nsISupports> mExternal; |
|
1510 |
|
1511 nsCOMPtr<nsIDOMStorage> mLocalStorage; |
|
1512 nsCOMPtr<nsIDOMStorage> mSessionStorage; |
|
1513 |
|
1514 // These member variable are used only on inner windows. |
|
1515 nsRefPtr<mozilla::EventListenerManager> mListenerManager; |
|
1516 // mTimeouts is generally sorted by mWhen, unless mTimeoutInsertionPoint is |
|
1517 // non-null. In that case, the dummy timeout pointed to by |
|
1518 // mTimeoutInsertionPoint may have a later mWhen than some of the timeouts |
|
1519 // that come after it. |
|
1520 mozilla::LinkedList<nsTimeout> mTimeouts; |
|
1521 // If mTimeoutInsertionPoint is non-null, insertions should happen after it. |
|
1522 // This is a dummy timeout at the moment; if that ever changes, the logic in |
|
1523 // ResetTimersForNonBackgroundWindow needs to change. |
|
1524 nsTimeout* mTimeoutInsertionPoint; |
|
1525 uint32_t mTimeoutPublicIdCounter; |
|
1526 uint32_t mTimeoutFiringDepth; |
|
1527 nsRefPtr<nsLocation> mLocation; |
|
1528 nsRefPtr<nsHistory> mHistory; |
|
1529 |
|
1530 // These member variables are used on both inner and the outer windows. |
|
1531 nsCOMPtr<nsIPrincipal> mDocumentPrincipal; |
|
1532 |
|
1533 typedef nsCOMArray<nsIDOMStorageEvent> nsDOMStorageEventArray; |
|
1534 nsDOMStorageEventArray mPendingStorageEvents; |
|
1535 |
|
1536 uint32_t mTimeoutsSuspendDepth; |
|
1537 |
|
1538 // the method that was used to focus mFocusedNode |
|
1539 uint32_t mFocusMethod; |
|
1540 |
|
1541 uint32_t mSerial; |
|
1542 |
|
1543 #ifdef DEBUG |
|
1544 bool mSetOpenerWindowCalled; |
|
1545 nsCOMPtr<nsIURI> mLastOpenedURI; |
|
1546 #endif |
|
1547 |
|
1548 #ifdef MOZ_B2G |
|
1549 bool mNetworkUploadObserverEnabled; |
|
1550 bool mNetworkDownloadObserverEnabled; |
|
1551 #endif // MOZ_B2G |
|
1552 |
|
1553 bool mCleanedUp; |
|
1554 |
|
1555 nsCOMPtr<nsIDOMOfflineResourceList> mApplicationCache; |
|
1556 |
|
1557 nsAutoPtr<nsJSThingHashtable<nsPtrHashKey<nsXBLPrototypeHandler>, JSObject*> > mCachedXBLPrototypeHandlers; |
|
1558 |
|
1559 // mSuspendedDoc is only set on outer windows. It's useful when we get matched |
|
1560 // EnterModalState/LeaveModalState calls, in which case the outer window is |
|
1561 // responsible for unsuspending events on the document. If we don't (for |
|
1562 // example, if the outer window is closed before the LeaveModalState call), |
|
1563 // then the inner window whose mDoc is our mSuspendedDoc is responsible for |
|
1564 // unsuspending it. |
|
1565 nsCOMPtr<nsIDocument> mSuspendedDoc; |
|
1566 |
|
1567 nsRefPtr<mozilla::dom::indexedDB::IDBFactory> mIndexedDB; |
|
1568 |
|
1569 // This counts the number of windows that have been opened in rapid succession |
|
1570 // (i.e. within dom.successive_dialog_time_limit of each other). It is reset |
|
1571 // to 0 once a dialog is opened after dom.successive_dialog_time_limit seconds |
|
1572 // have elapsed without any other dialogs. |
|
1573 uint32_t mDialogAbuseCount; |
|
1574 |
|
1575 // This holds the time when the last modal dialog was shown. If more than |
|
1576 // MAX_DIALOG_LIMIT dialogs are shown within the time span defined by |
|
1577 // dom.successive_dialog_time_limit, we show a checkbox or confirmation prompt |
|
1578 // to allow disabling of further dialogs from this window. |
|
1579 TimeStamp mLastDialogQuitTime; |
|
1580 |
|
1581 // This flag keeps track of whether dialogs are |
|
1582 // currently enabled on this window. |
|
1583 bool mAreDialogsEnabled; |
|
1584 |
|
1585 nsTHashtable<nsPtrHashKey<mozilla::DOMEventTargetHelper> > mEventTargetObjects; |
|
1586 |
|
1587 nsTArray<uint32_t> mEnabledSensors; |
|
1588 |
|
1589 #ifdef MOZ_WEBSPEECH |
|
1590 // mSpeechSynthesis is only used on inner windows. |
|
1591 nsRefPtr<mozilla::dom::SpeechSynthesis> mSpeechSynthesis; |
|
1592 #endif |
|
1593 |
|
1594 friend class nsDOMScriptableHelper; |
|
1595 friend class nsDOMWindowUtils; |
|
1596 friend class PostMessageEvent; |
|
1597 friend class DesktopNotification; |
|
1598 |
|
1599 static WindowByIdTable* sWindowsById; |
|
1600 static bool sWarnedAboutWindowInternal; |
|
1601 }; |
|
1602 |
|
1603 inline nsISupports* |
|
1604 ToSupports(nsGlobalWindow *p) |
|
1605 { |
|
1606 return static_cast<nsIDOMEventTarget*>(p); |
|
1607 } |
|
1608 |
|
1609 inline nsISupports* |
|
1610 ToCanonicalSupports(nsGlobalWindow *p) |
|
1611 { |
|
1612 return static_cast<nsIDOMEventTarget*>(p); |
|
1613 } |
|
1614 |
|
1615 /* |
|
1616 * nsGlobalChromeWindow inherits from nsGlobalWindow. It is the global |
|
1617 * object created for a Chrome Window only. |
|
1618 */ |
|
1619 class nsGlobalChromeWindow : public nsGlobalWindow, |
|
1620 public nsIDOMChromeWindow |
|
1621 { |
|
1622 public: |
|
1623 // nsISupports |
|
1624 NS_DECL_ISUPPORTS_INHERITED |
|
1625 |
|
1626 // nsIDOMChromeWindow interface |
|
1627 NS_DECL_NSIDOMCHROMEWINDOW |
|
1628 |
|
1629 nsGlobalChromeWindow(nsGlobalWindow *aOuterWindow) |
|
1630 : nsGlobalWindow(aOuterWindow) |
|
1631 { |
|
1632 mIsChrome = true; |
|
1633 mCleanMessageManager = true; |
|
1634 } |
|
1635 |
|
1636 ~nsGlobalChromeWindow() |
|
1637 { |
|
1638 NS_ABORT_IF_FALSE(mCleanMessageManager, |
|
1639 "chrome windows may always disconnect the msg manager"); |
|
1640 if (mMessageManager) { |
|
1641 static_cast<nsFrameMessageManager *>( |
|
1642 mMessageManager.get())->Disconnect(); |
|
1643 } |
|
1644 |
|
1645 mCleanMessageManager = false; |
|
1646 } |
|
1647 |
|
1648 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsGlobalChromeWindow, |
|
1649 nsGlobalWindow) |
|
1650 |
|
1651 using nsGlobalWindow::GetBrowserDOMWindow; |
|
1652 using nsGlobalWindow::SetBrowserDOMWindow; |
|
1653 using nsGlobalWindow::GetAttention; |
|
1654 using nsGlobalWindow::GetAttentionWithCycleCount; |
|
1655 using nsGlobalWindow::SetCursor; |
|
1656 using nsGlobalWindow::Maximize; |
|
1657 using nsGlobalWindow::Minimize; |
|
1658 using nsGlobalWindow::Restore; |
|
1659 using nsGlobalWindow::NotifyDefaultButtonLoaded; |
|
1660 using nsGlobalWindow::GetMessageManager; |
|
1661 using nsGlobalWindow::BeginWindowMove; |
|
1662 |
|
1663 nsCOMPtr<nsIBrowserDOMWindow> mBrowserDOMWindow; |
|
1664 nsCOMPtr<nsIMessageBroadcaster> mMessageManager; |
|
1665 }; |
|
1666 |
|
1667 /* |
|
1668 * nsGlobalModalWindow inherits from nsGlobalWindow. It is the global |
|
1669 * object created for a modal content windows only (i.e. not modal |
|
1670 * chrome dialogs). |
|
1671 */ |
|
1672 class nsGlobalModalWindow : public nsGlobalWindow, |
|
1673 public nsIDOMModalContentWindow |
|
1674 { |
|
1675 public: |
|
1676 nsGlobalModalWindow(nsGlobalWindow *aOuterWindow) |
|
1677 : nsGlobalWindow(aOuterWindow) |
|
1678 { |
|
1679 mIsModalContentWindow = true; |
|
1680 } |
|
1681 |
|
1682 NS_DECL_ISUPPORTS_INHERITED |
|
1683 NS_DECL_NSIDOMMODALCONTENTWINDOW |
|
1684 }; |
|
1685 |
|
1686 /* factory function */ |
|
1687 inline already_AddRefed<nsGlobalWindow> |
|
1688 NS_NewScriptGlobalObject(bool aIsChrome, bool aIsModalContentWindow) |
|
1689 { |
|
1690 nsRefPtr<nsGlobalWindow> global; |
|
1691 |
|
1692 if (aIsChrome) { |
|
1693 global = new nsGlobalChromeWindow(nullptr); |
|
1694 } else if (aIsModalContentWindow) { |
|
1695 global = new nsGlobalModalWindow(nullptr); |
|
1696 } else { |
|
1697 global = new nsGlobalWindow(nullptr); |
|
1698 } |
|
1699 |
|
1700 return global.forget(); |
|
1701 } |
|
1702 |
|
1703 #endif /* nsGlobalWindow_h___ */ |