Attachment #829002: window.navigator stubs for ServiceWorker. for bug #903441

View | Details | Raw Unified | Return to bug 903441
Collapse All | Expand All

(-)a/dom/base/Navigator.cpp (-5 / +36 lines)
Line     Link Here 
 Lines 1814-1847   bool Navigator::HasUserMediaSupport(JSCo Link Here 
1814
{
1814
{
1815
  // Make enabling peerconnection enable getUserMedia() as well
1815
  // Make enabling peerconnection enable getUserMedia() as well
1816
  return Preferences::GetBool("media.navigator.enabled", false) ||
1816
  return Preferences::GetBool("media.navigator.enabled", false) ||
1817
         Preferences::GetBool("media.peerconnection.enabled", false);
1817
         Preferences::GetBool("media.peerconnection.enabled", false);
1818
}
1818
}
1819
#endif // MOZ_MEDIA_NAVIGATOR
1819
#endif // MOZ_MEDIA_NAVIGATOR
1820
1820
1821
/* static */
1821
/* static */
1822
bool Navigator::HasPushNotificationsSupport(JSContext* /* unused */,
1822
bool
1823
                                            JSObject* aGlobal)
1823
Navigator::HasPushNotificationsSupport(JSContext* /* unused */,
1824
                                       JSObject* aGlobal)
1824
{
1825
{
1825
  nsCOMPtr<nsPIDOMWindow> win = GetWindowFromGlobal(aGlobal);
1826
  nsCOMPtr<nsPIDOMWindow> win = GetWindowFromGlobal(aGlobal);
1826
  return win && Preferences::GetBool("services.push.enabled", false) && CheckPermission(win, "push");
1827
  return win && Preferences::GetBool("services.push.enabled", false) &&
1828
         CheckPermission(win, "push");
1827
}
1829
}
1828
1830
1829
/* static */
1831
/* static */
1830
bool Navigator::HasInputMethodSupport(JSContext* /* unused */,
1832
bool
1831
                                      JSObject* aGlobal)
1833
Navigator::HasInputMethodSupport(JSContext* /* unused */,
1834
                                 JSObject* aGlobal)
1832
{
1835
{
1833
  nsCOMPtr<nsPIDOMWindow> win = GetWindowFromGlobal(aGlobal);
1836
  nsCOMPtr<nsPIDOMWindow> win = GetWindowFromGlobal(aGlobal);
1834
  return Preferences::GetBool("dom.mozInputMethod.testing", false) ||
1837
  return Preferences::GetBool("dom.mozInputMethod.testing", false) ||
1835
         (Preferences::GetBool("dom.mozInputMethod.enabled", false) &&
1838
         (Preferences::GetBool("dom.mozInputMethod.enabled", false) &&
1836
          win && CheckPermission(win, "input"));
1839
          win && CheckPermission(win, "input"));
1837
}
1840
}
1838
1841
1839
/* static */
1842
/* static */
1843
bool
1844
Navigator::HasServiceWorkerSupport(JSContext* /* unused */,
1845
                                   JSObject* aGlobal)
1846
{
1847
  nsCOMPtr<nsPIDOMWindow> win = GetWindowFromGlobal(aGlobal);
1848
  return win && Preferences::GetBool("dom.workers.serviceWorkers.enabled", false);
1849
}
1850
1851
already_AddRefed<Promise>
1852
Navigator::RegisterServiceWorker(const nsAString &scope,
1853
                                 const nsAString &scriptURL,
1854
                                 ErrorResult& aRv)
1855
{
1856
  AutoSafeJSContext cx;
1857
  JS::Rooted<JS::Value> reason(cx, JS::UndefinedValue());
1858
  return Promise::Reject(GetWindow(), cx, reason, aRv);
1859
}
1860
1861
already_AddRefed<Promise>
1862
Navigator::UnregisterServiceWorker(const nsAString &scope,
1863
                                   ErrorResult& aRv)
1864
{
1865
  AutoSafeJSContext cx;
1866
  JS::Rooted<JS::Value> reason(cx, JS::UndefinedValue());
1867
  return Promise::Reject(GetWindow(), cx, reason, aRv);
1868
}
1869
1870
/* static */
1840
already_AddRefed<nsPIDOMWindow>
1871
already_AddRefed<nsPIDOMWindow>
1841
Navigator::GetWindowFromGlobal(JSObject* aGlobal)
1872
Navigator::GetWindowFromGlobal(JSObject* aGlobal)
1842
{
1873
{
1843
  nsCOMPtr<nsPIDOMWindow> win =
1874
  nsCOMPtr<nsPIDOMWindow> win =
1844
    do_QueryInterface(nsJSUtils::GetStaticScriptGlobal(aGlobal));
1875
    do_QueryInterface(nsJSUtils::GetStaticScriptGlobal(aGlobal));
1845
  MOZ_ASSERT(!win || win->IsInnerWindow());
1876
  MOZ_ASSERT(!win || win->IsInnerWindow());
1846
  return win.forget();
1877
  return win.forget();
1847
}
1878
}
(-)a/dom/base/Navigator.h (+7 lines)
Line     Link Here 
 Lines 245-260   public: Link Here 
245
                       NavigatorUserMediaSuccessCallback& aOnSuccess,
245
                       NavigatorUserMediaSuccessCallback& aOnSuccess,
246
                       NavigatorUserMediaErrorCallback& aOnError,
246
                       NavigatorUserMediaErrorCallback& aOnError,
247
                       ErrorResult& aRv);
247
                       ErrorResult& aRv);
248
  void MozGetUserMediaDevices(const MediaStreamConstraintsInternal& aConstraints,
248
  void MozGetUserMediaDevices(const MediaStreamConstraintsInternal& aConstraints,
249
                              MozGetUserMediaDevicesSuccessCallback& aOnSuccess,
249
                              MozGetUserMediaDevicesSuccessCallback& aOnSuccess,
250
                              NavigatorUserMediaErrorCallback& aOnError,
250
                              NavigatorUserMediaErrorCallback& aOnError,
251
                              ErrorResult& aRv);
251
                              ErrorResult& aRv);
252
#endif // MOZ_MEDIA_NAVIGATOR
252
#endif // MOZ_MEDIA_NAVIGATOR
253
254
  already_AddRefed<Promise> RegisterServiceWorker(const nsAString &scope, const nsAString &scriptURL, ErrorResult& aRv);
255
  already_AddRefed<Promise> UnregisterServiceWorker(const nsAString &scope, ErrorResult& aRv);
256
253
  bool DoNewResolve(JSContext* aCx, JS::Handle<JSObject*> aObject,
257
  bool DoNewResolve(JSContext* aCx, JS::Handle<JSObject*> aObject,
254
                    JS::Handle<jsid> aId, JS::MutableHandle<JS::Value> aValue);
258
                    JS::Handle<jsid> aId, JS::MutableHandle<JS::Value> aValue);
255
  void GetOwnPropertyNames(JSContext* aCx, nsTArray<nsString>& aNames,
259
  void GetOwnPropertyNames(JSContext* aCx, nsTArray<nsString>& aNames,
256
                           ErrorResult& aRv);
260
                           ErrorResult& aRv);
257
261
258
  // WebIDL helper methods
262
  // WebIDL helper methods
259
  static bool HasBatterySupport(JSContext* /* unused*/, JSObject* /*unused */);
263
  static bool HasBatterySupport(JSContext* /* unused*/, JSObject* /*unused */);
260
  static bool HasPowerSupport(JSContext* /* unused */, JSObject* aGlobal);
264
  static bool HasPowerSupport(JSContext* /* unused */, JSObject* aGlobal);
 Lines 296-311   public: Link Here 
296
                                  JSObject* /* unused */);
300
                                  JSObject* /* unused */);
297
#endif // MOZ_MEDIA_NAVIGATOR
301
#endif // MOZ_MEDIA_NAVIGATOR
298
302
299
  static bool HasPushNotificationsSupport(JSContext* /* unused */,
303
  static bool HasPushNotificationsSupport(JSContext* /* unused */,
300
                                          JSObject* aGlobal);
304
                                          JSObject* aGlobal);
301
305
302
  static bool HasInputMethodSupport(JSContext* /* unused */, JSObject* aGlobal);
306
  static bool HasInputMethodSupport(JSContext* /* unused */, JSObject* aGlobal);
303
307
308
  static bool HasServiceWorkerSupport(JSContext* /* unused */,
309
                                      JSObject* aGlobal);
310
304
  nsPIDOMWindow* GetParentObject() const
311
  nsPIDOMWindow* GetParentObject() const
305
  {
312
  {
306
    return GetWindow();
313
    return GetWindow();
307
  }
314
  }
308
315
309
  virtual JSObject* WrapObject(JSContext* cx,
316
  virtual JSObject* WrapObject(JSContext* cx,
310
                               JS::Handle<JSObject*> scope) MOZ_OVERRIDE;
317
                               JS::Handle<JSObject*> scope) MOZ_OVERRIDE;
311
318
(-)a/dom/promise/Promise.cpp (-2 / +18 lines)
Line     Link Here 
 Lines 443-459   Promise::Resolve(const GlobalObject& aGl Link Here 
443
  if (MOZ_LIKELY(NS_IsMainThread())) {
443
  if (MOZ_LIKELY(NS_IsMainThread())) {
444
    window = do_QueryInterface(aGlobal.GetAsSupports());
444
    window = do_QueryInterface(aGlobal.GetAsSupports());
445
    if (!window) {
445
    if (!window) {
446
      aRv.Throw(NS_ERROR_UNEXPECTED);
446
      aRv.Throw(NS_ERROR_UNEXPECTED);
447
      return nullptr;
447
      return nullptr;
448
    }
448
    }
449
  }
449
  }
450
450
451
  nsRefPtr<Promise> promise = new Promise(window);
451
  return Resolve(window, aCx, aValue, aRv);
452
}
453
454
/* static */ already_AddRefed<Promise>
455
Promise::Resolve(nsPIDOMWindow* aWindow, JSContext* aCx,
456
                JS::Handle<JS::Value> aValue, ErrorResult& aRv)
457
{
458
  // aWindow may be null.
459
  nsRefPtr<Promise> promise = new Promise(aWindow);
452
460
453
  Optional<JS::Handle<JS::Value> > value(aCx, aValue);
461
  Optional<JS::Handle<JS::Value> > value(aCx, aValue);
454
  promise->MaybeResolveInternal(aCx, value);
462
  promise->MaybeResolveInternal(aCx, value);
455
  return promise.forget();
463
  return promise.forget();
456
}
464
}
457
465
458
/* static */ already_AddRefed<Promise>
466
/* static */ already_AddRefed<Promise>
459
Promise::Reject(const GlobalObject& aGlobal, JSContext* aCx,
467
Promise::Reject(const GlobalObject& aGlobal, JSContext* aCx,
 Lines 463-479   Promise::Reject(const GlobalObject& aGlo Link Here 
463
  if (MOZ_LIKELY(NS_IsMainThread())) {
471
  if (MOZ_LIKELY(NS_IsMainThread())) {
464
    window = do_QueryInterface(aGlobal.GetAsSupports());
472
    window = do_QueryInterface(aGlobal.GetAsSupports());
465
    if (!window) {
473
    if (!window) {
466
      aRv.Throw(NS_ERROR_UNEXPECTED);
474
      aRv.Throw(NS_ERROR_UNEXPECTED);
467
      return nullptr;
475
      return nullptr;
468
    }
476
    }
469
  }
477
  }
470
478
471
  nsRefPtr<Promise> promise = new Promise(window);
479
  return Reject(window, aCx, aValue, aRv);
480
}
481
482
/* static */ already_AddRefed<Promise>
483
Promise::Reject(nsPIDOMWindow* aWindow, JSContext* aCx,
484
                JS::Handle<JS::Value> aValue, ErrorResult& aRv)
485
{
486
  // aWindow may be null.
487
  nsRefPtr<Promise> promise = new Promise(aWindow);
472
488
473
  Optional<JS::Handle<JS::Value> > value(aCx, aValue);
489
  Optional<JS::Handle<JS::Value> > value(aCx, aValue);
474
  promise->MaybeRejectInternal(aCx, value);
490
  promise->MaybeRejectInternal(aCx, value);
475
  return promise.forget();
491
  return promise.forget();
476
}
492
}
477
493
478
already_AddRefed<Promise>
494
already_AddRefed<Promise>
479
Promise::Then(const Optional<OwningNonNull<AnyCallback> >& aResolveCallback,
495
Promise::Then(const Optional<OwningNonNull<AnyCallback> >& aResolveCallback,
(-)a/dom/promise/Promise.h (+8 lines)
Line     Link Here 
 Lines 64-82   public: Link Here 
64
  Constructor(const GlobalObject& aGlobal, PromiseInit& aInit,
64
  Constructor(const GlobalObject& aGlobal, PromiseInit& aInit,
65
              ErrorResult& aRv);
65
              ErrorResult& aRv);
66
66
67
  static already_AddRefed<Promise>
67
  static already_AddRefed<Promise>
68
  Resolve(const GlobalObject& aGlobal, JSContext* aCx,
68
  Resolve(const GlobalObject& aGlobal, JSContext* aCx,
69
          JS::Handle<JS::Value> aValue, ErrorResult& aRv);
69
          JS::Handle<JS::Value> aValue, ErrorResult& aRv);
70
70
71
  static already_AddRefed<Promise>
71
  static already_AddRefed<Promise>
72
  Resolve(nsPIDOMWindow* aWindow, JSContext* aCx,
73
          JS::Handle<JS::Value> aValue, ErrorResult& aRv);
74
75
  static already_AddRefed<Promise>
72
  Reject(const GlobalObject& aGlobal, JSContext* aCx,
76
  Reject(const GlobalObject& aGlobal, JSContext* aCx,
73
         JS::Handle<JS::Value> aValue, ErrorResult& aRv);
77
         JS::Handle<JS::Value> aValue, ErrorResult& aRv);
74
78
79
  static already_AddRefed<Promise>
80
  Reject(nsPIDOMWindow* aWindow, JSContext* aCx,
81
         JS::Handle<JS::Value> aValue, ErrorResult& aRv);
82
75
  already_AddRefed<Promise>
83
  already_AddRefed<Promise>
76
  Then(const Optional<OwningNonNull<AnyCallback> >& aResolveCallback,
84
  Then(const Optional<OwningNonNull<AnyCallback> >& aResolveCallback,
77
       const Optional<OwningNonNull<AnyCallback> >& aRejectCallback);
85
       const Optional<OwningNonNull<AnyCallback> >& aRejectCallback);
78
86
79
87
80
  already_AddRefed<Promise>
88
  already_AddRefed<Promise>
81
  Catch(const Optional<OwningNonNull<AnyCallback> >& aRejectCallback);
89
  Catch(const Optional<OwningNonNull<AnyCallback> >& aRejectCallback);
82
90
(-)a/dom/webidl/Navigator.webidl (+8 lines)
Line     Link Here 
 Lines 338-345   partial interface Navigator { Link Here 
338
callback MozGetUserMediaDevicesSuccessCallback = void (nsIVariant? devices);
338
callback MozGetUserMediaDevicesSuccessCallback = void (nsIVariant? devices);
339
partial interface Navigator {
339
partial interface Navigator {
340
  [Throws, ChromeOnly]
340
  [Throws, ChromeOnly]
341
  void mozGetUserMediaDevices(MediaStreamConstraintsInternal constraints,
341
  void mozGetUserMediaDevices(MediaStreamConstraintsInternal constraints,
342
                              MozGetUserMediaDevicesSuccessCallback onsuccess,
342
                              MozGetUserMediaDevicesSuccessCallback onsuccess,
343
                              NavigatorUserMediaErrorCallback onerror);
343
                              NavigatorUserMediaErrorCallback onerror);
344
};
344
};
345
#endif // MOZ_MEDIA_NAVIGATOR
345
#endif // MOZ_MEDIA_NAVIGATOR
346
347
// Service Workers/Navigation Controllers
348
partial interface Navigator {
349
  [Throws, Func="Navigator::HasServiceWorkerSupport"]
350
  Promise registerServiceWorker(DOMString scope, DOMString scriptURL);
351
  [Throws, Func="Navigator::HasServiceWorkerSupport"]
352
  Promise unregisterServiceWorker(DOMString scope);
353
};
(-)a/modules/libpref/src/init/all.js (+3 lines)
Line     Link Here 
 Lines 101-116   pref("dom.indexedDB.experimental", false Link Here 
101
// Whether or not Web Workers are enabled.
101
// Whether or not Web Workers are enabled.
102
pref("dom.workers.enabled", true);
102
pref("dom.workers.enabled", true);
103
// The number of workers per domain allowed to run concurrently.
103
// The number of workers per domain allowed to run concurrently.
104
pref("dom.workers.maxPerDomain", 20);
104
pref("dom.workers.maxPerDomain", 20);
105
105
106
// Whether or not Shared Web Workers are enabled.
106
// Whether or not Shared Web Workers are enabled.
107
pref("dom.workers.sharedWorkers.enabled", true);
107
pref("dom.workers.sharedWorkers.enabled", true);
108
108
109
// Service workers
110
pref("dom.workers.serviceWorkers.enabled", true);
111
109
// Whether nonzero values can be returned from performance.timing.*
112
// Whether nonzero values can be returned from performance.timing.*
110
pref("dom.enable_performance", true);
113
pref("dom.enable_performance", true);
111
114
112
// Whether the Gamepad API is enabled
115
// Whether the Gamepad API is enabled
113
#ifdef RELEASE_BUILD
116
#ifdef RELEASE_BUILD
114
pref("dom.gamepad.enabled", false);
117
pref("dom.gamepad.enabled", false);
115
pref("dom.gamepad.non_standard_events.enabled", false);
118
pref("dom.gamepad.non_standard_events.enabled", false);
116
#else
119
#else

Return to bug 903441