Bug 1188091 - Fix the exposure of Push interfaces; r=dougt,bzbarsky,nsm

Currently we don't check the dom.push.enabled pref in some cases for
some of these interfaces.  This patch unifies how all of these
interfaces are exposed to Window, Worker, and ServiceWorker.
This commit is contained in:
Ehsan Akhgari 2015-07-27 15:35:28 -04:00
Родитель 4fffaa9e34
Коммит 547404788d
16 изменённых файлов: 61 добавлений и 31 удалений

Просмотреть файл

@ -51,6 +51,7 @@
#include "mozilla/dom/TextDecoder.h"
#include "mozilla/dom/TouchEvent.h"
#include "mozilla/dom/ShadowRoot.h"
#include "mozilla/dom/WorkerPrivate.h"
#include "mozilla/EventDispatcher.h"
#include "mozilla/EventListenerManager.h"
#include "mozilla/EventStateManager.h"
@ -7973,3 +7974,22 @@ nsContentUtils::SetFetchReferrerURIWithPolicy(nsIPrincipal* aPrincipal,
net::ReferrerPolicy referrerPolicy = aDoc->GetReferrerPolicy();
return aChannel->SetReferrerWithPolicy(referrerURI, referrerPolicy);
}
// static
bool
nsContentUtils::PushEnabled(JSContext* aCx, JSObject* aObj)
{
if (NS_IsMainThread()) {
return Preferences::GetBool("dom.push.enabled", false);
}
using namespace workers;
// Otherwise, check the pref via the WorkerPrivate
WorkerPrivate* workerPrivate = GetWorkerPrivateFromContext(aCx);
if (!workerPrivate) {
return false;
}
return workerPrivate->PushEnabled();
}

Просмотреть файл

@ -2439,6 +2439,8 @@ public:
nsIDocument* aDoc,
nsIHttpChannel* aChannel);
static bool PushEnabled(JSContext* aCx, JSObject* aObj);
private:
static bool InitializeEventTable();

Просмотреть файл

@ -129,23 +129,6 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(PushSubscription)
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
// PushManager
// static
bool
PushManager::Enabled(JSContext* aCx, JSObject* aObj)
{
if (NS_IsMainThread()) {
return Preferences::GetBool("dom.push.enabled", false);
}
// XXXnsm: As of this patch it seems like Push will be enabled before or with
// ServiceWorkers, so this seems OK for now.
ServiceWorkerGlobalScope* scope = nullptr;
nsresult rv = UnwrapObject<prototypes::id::ServiceWorkerGlobalScope_workers,
mozilla::dom::ServiceWorkerGlobalScopeBinding_workers::NativeType>(aObj, scope);
return NS_SUCCEEDED(rv);
}
PushManager::PushManager(nsIGlobalObject* aGlobal, const nsAString& aScope)
: mGlobal(aGlobal), mScope(aScope)
{

Просмотреть файл

@ -106,9 +106,6 @@ public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(PushManager)
static bool
Enabled(JSContext* aCx, JSObject* aObj);
explicit PushManager(nsIGlobalObject* aGlobal, const nsAString& aScope);
nsIGlobalObject*

Просмотреть файл

@ -7,7 +7,9 @@
* https://w3c.github.io/push-api/
*/
[Constructor(DOMString type, optional PushEventInit eventInitDict), Exposed=ServiceWorker]
[Constructor(DOMString type, optional PushEventInit eventInitDict),
Func="nsContentUtils::PushEnabled",
Exposed=ServiceWorker]
interface PushEvent : ExtendableEvent {
readonly attribute PushMessageData data;
};

Просмотреть файл

@ -22,7 +22,7 @@ interface PushManagerImpl {
[Func="ServiceWorkerRegistration::WebPushMethodHider"] void setScope(DOMString scope);
};
[Exposed=(Window,Worker), Func="mozilla::dom::PushManager::Enabled"]
[Exposed=(Window,Worker), Func="nsContentUtils::PushEnabled"]
interface PushManager {
[ChromeOnly, Throws, Exposed=Window]
void setPushManagerImpl(PushManagerImpl store);

Просмотреть файл

@ -7,7 +7,8 @@
* https://w3c.github.io/push-api/
*/
[Exposed=ServiceWorker]
[Func="nsContentUtils::PushEnabled",
Exposed=ServiceWorker]
interface PushMessageData
{
// FIXME(nsm): Bug 1149195.

Просмотреть файл

@ -9,7 +9,7 @@
interface Principal;
[Exposed=(Window,Worker), Func="mozilla::dom::PushManager::Enabled",
[Exposed=(Window,Worker), Func="nsContentUtils::PushEnabled",
ChromeConstructor(DOMString pushEndpoint, DOMString scope)]
interface PushSubscription
{

Просмотреть файл

@ -28,7 +28,7 @@ interface ServiceWorkerRegistration : EventTarget {
partial interface ServiceWorkerRegistration {
#ifndef MOZ_SIMPLEPUSH
[Throws, Exposed=(Window,Worker), Func="mozilla::dom::PushManager::Enabled"]
[Throws, Exposed=(Window,Worker), Func="nsContentUtils::PushEnabled"]
readonly attribute PushManager pushManager;
#endif
};

Просмотреть файл

@ -166,6 +166,7 @@ static_assert(MAX_WORKERS_PER_DOMAIN >= 1,
#define PREF_SERVICEWORKERS_TESTING_ENABLED "dom.serviceWorkers.testing.enabled"
#define PREF_INTERCEPTION_ENABLED "dom.serviceWorkers.interception.enabled"
#define PREF_INTERCEPTION_OPAQUE_ENABLED "dom.serviceWorkers.interception.opaque.enabled"
#define PREF_PUSH_ENABLED "dom.push.enabled"
namespace {
@ -1949,6 +1950,10 @@ RuntimeService::Init()
WorkerPrefChanged,
PREF_SERVICEWORKERS_TESTING_ENABLED,
reinterpret_cast<void *>(WORKERPREF_SERVICEWORKERS_TESTING))) ||
NS_FAILED(Preferences::RegisterCallbackAndCall(
WorkerPrefChanged,
PREF_PUSH_ENABLED,
reinterpret_cast<void *>(WORKERPREF_PUSH))) ||
NS_FAILED(Preferences::RegisterCallback(LoadRuntimeOptions,
PREF_JS_OPTIONS_PREFIX,
nullptr)) ||
@ -2176,6 +2181,10 @@ RuntimeService::Cleanup()
WorkerPrefChanged,
PREF_DOM_WORKERNOTIFICATION_ENABLED,
reinterpret_cast<void *>(WORKERPREF_DOM_WORKERNOTIFICATION))) ||
NS_FAILED(Preferences::UnregisterCallback(
WorkerPrefChanged,
PREF_PUSH_ENABLED,
reinterpret_cast<void *>(WORKERPREF_PUSH))) ||
#if DUMP_CONTROLLED_BY_PREF
NS_FAILED(Preferences::UnregisterCallback(
WorkerPrefChanged,
@ -2725,6 +2734,7 @@ RuntimeService::WorkerPrefChanged(const char* aPrefName, void* aClosure)
case WORKERPREF_INTERCEPTION_OPAQUE_ENABLED:
case WORKERPREF_SERVICEWORKERS:
case WORKERPREF_SERVICEWORKERS_TESTING:
case WORKERPREF_PUSH:
sDefaultPreferences[key] = Preferences::GetBool(aPrefName, false);
break;

Просмотреть файл

@ -20,6 +20,7 @@
#endif
#include "nsProxyRelease.h"
#include "nsContentUtils.h"
class nsIInterceptedChannel;

Просмотреть файл

@ -1328,6 +1328,13 @@ public:
return mPreferences[WORKERPREF_PERFORMANCE_LOGGING_ENABLED];
}
bool
PushEnabled() const
{
AssertIsOnWorkerThread();
return mPreferences[WORKERPREF_PUSH];
}
bool
OnLine() const
{

Просмотреть файл

@ -206,6 +206,7 @@ enum WorkerPreference
WORKERPREF_SERVICEWORKERS_TESTING, // dom.serviceWorkers.testing.enabled
WORKERPREF_INTERCEPTION_OPAQUE_ENABLED, // dom.serviceWorkers.interception.opaque.enabled
WORKERPREF_PERFORMANCE_LOGGING_ENABLED, // dom.performance.enable_user_timing_logging
WORKERPREF_PUSH, // dom.push.enabled
WORKERPREF_COUNT
};

Просмотреть файл

@ -48,8 +48,6 @@ var ecmaGlobals =
"Number",
"Object",
"Proxy",
"PushEvent",
"PushMessageData",
"RangeError",
"ReferenceError",
"Reflect",
@ -174,9 +172,13 @@ var interfaceNamesInGlobalScope =
// IMPORTANT: Do not change this list without review from a DOM peer!
"Promise",
// IMPORTANT: Do not change this list without review from a DOM peer!
"PushManager",
{ name: "PushEvent", b2g: false, android: false, release: false },
// IMPORTANT: Do not change this list without review from a DOM peer!
"PushSubscription",
{ name: "PushManager", b2g: false, android: false, release: false },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PushMessageData", b2g: false, android: false, release: false },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PushSubscription", b2g: false, android: false, release: false },
// IMPORTANT: Do not change this list without review from a DOM peer!
"Request",
// IMPORTANT: Do not change this list without review from a DOM peer!

Просмотреть файл

@ -163,6 +163,10 @@ var interfaceNamesInGlobalScope =
"PerformanceMeasure",
// IMPORTANT: Do not change this list without review from a DOM peer!
"Promise",
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PushManager", b2g: false, android: false, release: false },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PushSubscription", b2g: false, android: false, release: false },
// IMPORTANT: Do not change this list without review from a DOM peer!
"Request",
// IMPORTANT: Do not change this list without review from a DOM peer!

Просмотреть файл

@ -4429,7 +4429,7 @@ pref("dom.mozAlarms.enabled", false);
// Push
#if !defined(MOZ_WIDGET_GONK) && !defined(MOZ_WIDGET_ANDROID)
#if !defined(MOZ_B2G) && !defined(ANDROID)
// Desktop prefs
#ifdef RELEASE_BUILD
pref("dom.push.enabled", false);