diff --git a/dom/broadcastchannel/BroadcastChannel.cpp b/dom/broadcastchannel/BroadcastChannel.cpp index 59d60d6fa8f2..c3f4101cbbfa 100644 --- a/dom/broadcastchannel/BroadcastChannel.cpp +++ b/dom/broadcastchannel/BroadcastChannel.cpp @@ -328,60 +328,28 @@ private: } }; -bool -CheckPermission(nsIPrincipal* aPrincipal) -{ - // First of all, the general pref has to be turned on. - bool enabled = false; - Preferences::GetBool("dom.broadcastChannel.enabled", &enabled); - if (!enabled) { - return false; - } - - if (!aPrincipal) { - return false; - } - - uint16_t status; - if (NS_FAILED(aPrincipal->GetAppStatus(&status))) { - return false; - } - - // Only support BroadcastChannel API for certified apps and desktop builds. - return status == nsIPrincipal::APP_STATUS_CERTIFIED || - status == nsIPrincipal::APP_STATUS_NOT_INSTALLED; -} - -// A WorkerMainThreadRunnable to synchronously dispatch the call of -// CheckPermission() from the worker thread to the main thread. -class CheckPermissionRunnable MOZ_FINAL - : public workers::WorkerMainThreadRunnable +class PrefEnabledRunnable MOZ_FINAL : public WorkerMainThreadRunnable { public: - bool mResult; + explicit PrefEnabledRunnable(WorkerPrivate* aWorkerPrivate) + : WorkerMainThreadRunnable(aWorkerPrivate) + , mEnabled(false) + { } - explicit CheckPermissionRunnable(workers::WorkerPrivate* aWorkerPrivate) - : workers::WorkerMainThreadRunnable(aWorkerPrivate) - , mResult(false) + bool MainThreadRun() MOZ_OVERRIDE { - MOZ_ASSERT(aWorkerPrivate); - aWorkerPrivate->AssertIsOnWorkerThread(); - } - -protected: - virtual bool - MainThreadRun() MOZ_OVERRIDE - { - workers::AssertIsOnMainThread(); - - nsIPrincipal* principal = GetPrincipalFromWorkerPrivate(mWorkerPrivate); - if (!principal) { - return true; - } - - mResult = CheckPermission(principal); + AssertIsOnMainThread(); + mEnabled = Preferences::GetBool("dom.broadcastChannel.enabled", false); return true; } + + bool IsEnabled() const + { + return mEnabled; + } + +private: + bool mEnabled; }; } // anonymous namespace @@ -390,34 +358,18 @@ protected: BroadcastChannel::IsEnabled(JSContext* aCx, JSObject* aGlobal) { if (NS_IsMainThread()) { - JS::Rooted global(aCx, aGlobal); - - nsCOMPtr win = Navigator::GetWindowFromGlobal(global); - if (!win) { - return false; - } - - nsIDocument* doc = win->GetExtantDoc(); - if (!doc) { - return false; - } - - return CheckPermission(doc->NodePrincipal()); + return Preferences::GetBool("dom.broadcastChannel.enabled", false); } - workers::WorkerPrivate* workerPrivate = - workers::GetWorkerPrivateFromContext(aCx); + WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); + MOZ_ASSERT(workerPrivate); workerPrivate->AssertIsOnWorkerThread(); - nsRefPtr runnable = - new CheckPermissionRunnable(workerPrivate); + nsRefPtr runnable = + new PrefEnabledRunnable(workerPrivate); + runnable->Dispatch(workerPrivate->GetJSContext()); - if (!runnable->Dispatch(aCx)) { - JS_ClearPendingException(aCx); - return false; - } - - return runnable->mResult; + return runnable->IsEnabled(); } BroadcastChannel::BroadcastChannel(nsPIDOMWindow* aWindow, diff --git a/dom/broadcastchannel/tests/test_broadcastchannel_basic.html b/dom/broadcastchannel/tests/test_broadcastchannel_basic.html index 584f7154f426..eeb748138123 100644 --- a/dom/broadcastchannel/tests/test_broadcastchannel_basic.html +++ b/dom/broadcastchannel/tests/test_broadcastchannel_basic.html @@ -36,7 +36,7 @@ function runTest() { is(evt.target, bc, "MessageEvent.target is bc"); is(evt.target.name, 'foobar', "MessageEvent.target.name is foobar"); is(evt.target.name, bc.name, "MessageEvent.target.name == bc.name"); - is(evt.origin, 'http://mochi.test:8888', "MessageEvent.origin is correct"); + ok(evt.origin.indexOf('http://mochi.test:8888') == 0, "MessageEvent.origin is correct"); is(evt.data, "Hello world from the iframe!", "The message from the iframe has been received!"); SimpleTest.finish(); }