зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
4fffaa9e34
Коммит
547404788d
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче