зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1364297 - Worker and SharedWorker constructors have an optional WorkerOptions parameter, r=smaug
This commit is contained in:
Родитель
54fe5f66e7
Коммит
7453988cd7
|
@ -15,6 +15,8 @@
|
||||||
[Global=(Worker,DedicatedWorker),
|
[Global=(Worker,DedicatedWorker),
|
||||||
Exposed=DedicatedWorker]
|
Exposed=DedicatedWorker]
|
||||||
interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
|
interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
|
||||||
|
readonly attribute DOMString name;
|
||||||
|
|
||||||
[Throws]
|
[Throws]
|
||||||
void postMessage(any message, optional sequence<object> transfer = []);
|
void postMessage(any message, optional sequence<object> transfer = []);
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
[Constructor(USVString scriptURL, optional DOMString name)]
|
[Constructor(USVString scriptURL, optional (DOMString or WorkerOptions) options)]
|
||||||
interface SharedWorker : EventTarget {
|
interface SharedWorker : EventTarget {
|
||||||
readonly attribute MessagePort port;
|
readonly attribute MessagePort port;
|
||||||
};
|
};
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
* this document.
|
* this document.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
[Constructor(USVString scriptURL),
|
[Constructor(USVString scriptURL, optional WorkerOptions options),
|
||||||
Func="mozilla::dom::workers::WorkerPrivate::WorkerAvailable",
|
Func="mozilla::dom::workers::WorkerPrivate::WorkerAvailable",
|
||||||
Exposed=(Window,DedicatedWorker,SharedWorker,System)]
|
Exposed=(Window,DedicatedWorker,SharedWorker,System)]
|
||||||
interface Worker : EventTarget {
|
interface Worker : EventTarget {
|
||||||
|
@ -26,6 +26,12 @@ interface Worker : EventTarget {
|
||||||
|
|
||||||
Worker implements AbstractWorker;
|
Worker implements AbstractWorker;
|
||||||
|
|
||||||
|
dictionary WorkerOptions {
|
||||||
|
// WorkerType type = "classic"; TODO: Bug 1247687
|
||||||
|
// RequestCredentials credentials = "omit"; // credentials is only used if type is "module" TODO: Bug 1247687
|
||||||
|
DOMString name = "";
|
||||||
|
};
|
||||||
|
|
||||||
[Constructor(USVString scriptURL),
|
[Constructor(USVString scriptURL),
|
||||||
Func="mozilla::dom::workers::ChromeWorkerPrivate::WorkerAvailable",
|
Func="mozilla::dom::workers::ChromeWorkerPrivate::WorkerAvailable",
|
||||||
Exposed=(Window,DedicatedWorker,SharedWorker,System)]
|
Exposed=(Window,DedicatedWorker,SharedWorker,System)]
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "mozilla/Preferences.h"
|
#include "mozilla/Preferences.h"
|
||||||
#include "mozilla/dom/MessagePort.h"
|
#include "mozilla/dom/MessagePort.h"
|
||||||
#include "mozilla/dom/SharedWorkerBinding.h"
|
#include "mozilla/dom/SharedWorkerBinding.h"
|
||||||
|
#include "mozilla/dom/WorkerBinding.h"
|
||||||
#include "mozilla/Telemetry.h"
|
#include "mozilla/Telemetry.h"
|
||||||
#include "nsContentUtils.h"
|
#include "nsContentUtils.h"
|
||||||
#include "nsIClassInfoImpl.h"
|
#include "nsIClassInfoImpl.h"
|
||||||
|
@ -49,7 +50,7 @@ SharedWorker::~SharedWorker()
|
||||||
already_AddRefed<SharedWorker>
|
already_AddRefed<SharedWorker>
|
||||||
SharedWorker::Constructor(const GlobalObject& aGlobal,
|
SharedWorker::Constructor(const GlobalObject& aGlobal,
|
||||||
const nsAString& aScriptURL,
|
const nsAString& aScriptURL,
|
||||||
const mozilla::dom::Optional<nsAString>& aName,
|
const StringOrWorkerOptions& aOptions,
|
||||||
ErrorResult& aRv)
|
ErrorResult& aRv)
|
||||||
{
|
{
|
||||||
AssertIsOnMainThread();
|
AssertIsOnMainThread();
|
||||||
|
@ -61,8 +62,11 @@ SharedWorker::Constructor(const GlobalObject& aGlobal,
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCString name;
|
nsCString name;
|
||||||
if (aName.WasPassed()) {
|
if (aOptions.IsString()) {
|
||||||
name = NS_ConvertUTF16toUTF8(aName.Value());
|
name = NS_ConvertUTF16toUTF8(aOptions.GetAsString());
|
||||||
|
} else {
|
||||||
|
MOZ_ASSERT(aOptions.IsWorkerOptions());
|
||||||
|
name = NS_ConvertUTF16toUTF8(aOptions.GetAsWorkerOptions().mName);
|
||||||
}
|
}
|
||||||
|
|
||||||
RefPtr<SharedWorker> sharedWorker;
|
RefPtr<SharedWorker> sharedWorker;
|
||||||
|
|
|
@ -20,6 +20,7 @@ class EventChainPreVisitor;
|
||||||
|
|
||||||
namespace dom {
|
namespace dom {
|
||||||
class MessagePort;
|
class MessagePort;
|
||||||
|
class StringOrWorkerOptions;
|
||||||
}
|
}
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|
||||||
|
@ -43,7 +44,7 @@ class SharedWorker final : public DOMEventTargetHelper
|
||||||
public:
|
public:
|
||||||
static already_AddRefed<SharedWorker>
|
static already_AddRefed<SharedWorker>
|
||||||
Constructor(const GlobalObject& aGlobal, const nsAString& aScriptURL,
|
Constructor(const GlobalObject& aGlobal, const nsAString& aScriptURL,
|
||||||
const Optional<nsAString>& aName, ErrorResult& aRv);
|
const StringOrWorkerOptions& aOptions, ErrorResult& aRv);
|
||||||
|
|
||||||
MessagePort*
|
MessagePort*
|
||||||
Port();
|
Port();
|
||||||
|
|
|
@ -2739,9 +2739,7 @@ WorkerPrivateParent<Derived>::WorkerPrivateParent(
|
||||||
mCreationTimeStamp(TimeStamp::Now()),
|
mCreationTimeStamp(TimeStamp::Now()),
|
||||||
mCreationTimeHighRes((double)PR_Now() / PR_USEC_PER_MSEC)
|
mCreationTimeHighRes((double)PR_Now() / PR_USEC_PER_MSEC)
|
||||||
{
|
{
|
||||||
MOZ_ASSERT_IF(!IsDedicatedWorker(),
|
MOZ_ASSERT_IF(!IsDedicatedWorker(), NS_IsMainThread());
|
||||||
!aWorkerName.IsVoid() && NS_IsMainThread());
|
|
||||||
MOZ_ASSERT_IF(IsDedicatedWorker(), aWorkerName.IsEmpty());
|
|
||||||
|
|
||||||
if (aLoadInfo.mWindow) {
|
if (aLoadInfo.mWindow) {
|
||||||
AssertIsOnMainThread();
|
AssertIsOnMainThread();
|
||||||
|
@ -4447,9 +4445,6 @@ WorkerPrivate::WorkerPrivate(WorkerPrivate* aParent,
|
||||||
, mFetchHandlerWasAdded(false)
|
, mFetchHandlerWasAdded(false)
|
||||||
, mOnLine(false)
|
, mOnLine(false)
|
||||||
{
|
{
|
||||||
MOZ_ASSERT_IF(!IsDedicatedWorker(), !aWorkerName.IsVoid());
|
|
||||||
MOZ_ASSERT_IF(IsDedicatedWorker(), aWorkerName.IsEmpty());
|
|
||||||
|
|
||||||
if (aParent) {
|
if (aParent) {
|
||||||
aParent->AssertIsOnWorkerThread();
|
aParent->AssertIsOnWorkerThread();
|
||||||
aParent->GetAllPreferences(mPreferences);
|
aParent->GetAllPreferences(mPreferences);
|
||||||
|
@ -4506,10 +4501,12 @@ WorkerPrivate::~WorkerPrivate()
|
||||||
already_AddRefed<WorkerPrivate>
|
already_AddRefed<WorkerPrivate>
|
||||||
WorkerPrivate::Constructor(const GlobalObject& aGlobal,
|
WorkerPrivate::Constructor(const GlobalObject& aGlobal,
|
||||||
const nsAString& aScriptURL,
|
const nsAString& aScriptURL,
|
||||||
|
const WorkerOptions& aOptions,
|
||||||
ErrorResult& aRv)
|
ErrorResult& aRv)
|
||||||
{
|
{
|
||||||
return WorkerPrivate::Constructor(aGlobal, aScriptURL, false,
|
return WorkerPrivate::Constructor(aGlobal, aScriptURL, false,
|
||||||
WorkerTypeDedicated, EmptyCString(),
|
WorkerTypeDedicated,
|
||||||
|
NS_ConvertUTF16toUTF8(aOptions.mName),
|
||||||
nullptr, aRv);
|
nullptr, aRv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4588,12 +4585,6 @@ WorkerPrivate::Constructor(JSContext* aCx,
|
||||||
AssertIsOnMainThread();
|
AssertIsOnMainThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only service and shared workers can have names.
|
|
||||||
MOZ_ASSERT_IF(aWorkerType != WorkerTypeDedicated,
|
|
||||||
!aWorkerName.IsVoid());
|
|
||||||
MOZ_ASSERT_IF(aWorkerType == WorkerTypeDedicated,
|
|
||||||
aWorkerName.IsEmpty());
|
|
||||||
|
|
||||||
Maybe<WorkerLoadInfo> stackLoadInfo;
|
Maybe<WorkerLoadInfo> stackLoadInfo;
|
||||||
if (!aLoadInfo) {
|
if (!aLoadInfo) {
|
||||||
stackLoadInfo.emplace();
|
stackLoadInfo.emplace();
|
||||||
|
@ -6921,7 +6912,7 @@ WorkerPrivate::GetOrCreateGlobalScope(JSContext* aCx)
|
||||||
} else if (IsServiceWorker()) {
|
} else if (IsServiceWorker()) {
|
||||||
globalScope = new ServiceWorkerGlobalScope(this, ServiceWorkerScope());
|
globalScope = new ServiceWorkerGlobalScope(this, ServiceWorkerScope());
|
||||||
} else {
|
} else {
|
||||||
globalScope = new DedicatedWorkerGlobalScope(this);
|
globalScope = new DedicatedWorkerGlobalScope(this, WorkerName());
|
||||||
}
|
}
|
||||||
|
|
||||||
JS::Rooted<JSObject*> global(aCx);
|
JS::Rooted<JSObject*> global(aCx);
|
||||||
|
|
|
@ -69,6 +69,7 @@ class PromiseNativeHandler;
|
||||||
class StructuredCloneHolder;
|
class StructuredCloneHolder;
|
||||||
class WorkerDebuggerGlobalScope;
|
class WorkerDebuggerGlobalScope;
|
||||||
class WorkerGlobalScope;
|
class WorkerGlobalScope;
|
||||||
|
struct WorkerOptions;
|
||||||
} // namespace dom
|
} // namespace dom
|
||||||
namespace ipc {
|
namespace ipc {
|
||||||
class PrincipalInfo;
|
class PrincipalInfo;
|
||||||
|
@ -266,7 +267,7 @@ protected:
|
||||||
WorkerPrivateParent(WorkerPrivate* aParent,
|
WorkerPrivateParent(WorkerPrivate* aParent,
|
||||||
const nsAString& aScriptURL, bool aIsChromeWorker,
|
const nsAString& aScriptURL, bool aIsChromeWorker,
|
||||||
WorkerType aWorkerType,
|
WorkerType aWorkerType,
|
||||||
const nsACString& aSharedWorkerName,
|
const nsACString& aWorkerName,
|
||||||
WorkerLoadInfo& aLoadInfo);
|
WorkerLoadInfo& aLoadInfo);
|
||||||
|
|
||||||
~WorkerPrivateParent();
|
~WorkerPrivateParent();
|
||||||
|
@ -838,7 +839,6 @@ public:
|
||||||
const nsCString&
|
const nsCString&
|
||||||
WorkerName() const
|
WorkerName() const
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(IsSharedWorker());
|
|
||||||
return mWorkerName;
|
return mWorkerName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1053,17 +1053,18 @@ protected:
|
||||||
public:
|
public:
|
||||||
static already_AddRefed<WorkerPrivate>
|
static already_AddRefed<WorkerPrivate>
|
||||||
Constructor(const GlobalObject& aGlobal, const nsAString& aScriptURL,
|
Constructor(const GlobalObject& aGlobal, const nsAString& aScriptURL,
|
||||||
|
const WorkerOptions& aOptions,
|
||||||
ErrorResult& aRv);
|
ErrorResult& aRv);
|
||||||
|
|
||||||
static already_AddRefed<WorkerPrivate>
|
static already_AddRefed<WorkerPrivate>
|
||||||
Constructor(const GlobalObject& aGlobal, const nsAString& aScriptURL,
|
Constructor(const GlobalObject& aGlobal, const nsAString& aScriptURL,
|
||||||
bool aIsChromeWorker, WorkerType aWorkerType,
|
bool aIsChromeWorker, WorkerType aWorkerType,
|
||||||
const nsACString& aSharedWorkerName,
|
const nsACString& aWorkerName,
|
||||||
WorkerLoadInfo* aLoadInfo, ErrorResult& aRv);
|
WorkerLoadInfo* aLoadInfo, ErrorResult& aRv);
|
||||||
|
|
||||||
static already_AddRefed<WorkerPrivate>
|
static already_AddRefed<WorkerPrivate>
|
||||||
Constructor(JSContext* aCx, const nsAString& aScriptURL, bool aIsChromeWorker,
|
Constructor(JSContext* aCx, const nsAString& aScriptURL, bool aIsChromeWorker,
|
||||||
WorkerType aWorkerType, const nsACString& aSharedWorkerName,
|
WorkerType aWorkerType, const nsACString& aWorkerName,
|
||||||
WorkerLoadInfo* aLoadInfo, ErrorResult& aRv);
|
WorkerLoadInfo* aLoadInfo, ErrorResult& aRv);
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
@ -1462,7 +1463,7 @@ public:
|
||||||
private:
|
private:
|
||||||
WorkerPrivate(WorkerPrivate* aParent,
|
WorkerPrivate(WorkerPrivate* aParent,
|
||||||
const nsAString& aScriptURL, bool aIsChromeWorker,
|
const nsAString& aScriptURL, bool aIsChromeWorker,
|
||||||
WorkerType aWorkerType, const nsACString& aSharedWorkerName,
|
WorkerType aWorkerType, const nsACString& aWorkerName,
|
||||||
WorkerLoadInfo& aLoadInfo);
|
WorkerLoadInfo& aLoadInfo);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -489,8 +489,10 @@ WorkerGlobalScope::CreateImageBitmap(JSContext* aCx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DedicatedWorkerGlobalScope::DedicatedWorkerGlobalScope(WorkerPrivate* aWorkerPrivate)
|
DedicatedWorkerGlobalScope::DedicatedWorkerGlobalScope(WorkerPrivate* aWorkerPrivate,
|
||||||
: WorkerGlobalScope(aWorkerPrivate)
|
const nsCString& aName)
|
||||||
|
: WorkerGlobalScope(aWorkerPrivate)
|
||||||
|
, mName(aName)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -207,15 +207,23 @@ public:
|
||||||
|
|
||||||
class DedicatedWorkerGlobalScope final : public WorkerGlobalScope
|
class DedicatedWorkerGlobalScope final : public WorkerGlobalScope
|
||||||
{
|
{
|
||||||
|
const nsCString mName;
|
||||||
|
|
||||||
~DedicatedWorkerGlobalScope() { }
|
~DedicatedWorkerGlobalScope() { }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit DedicatedWorkerGlobalScope(WorkerPrivate* aWorkerPrivate);
|
DedicatedWorkerGlobalScope(WorkerPrivate* aWorkerPrivate,
|
||||||
|
const nsCString& aName);
|
||||||
|
|
||||||
virtual bool
|
virtual bool
|
||||||
WrapGlobalObject(JSContext* aCx,
|
WrapGlobalObject(JSContext* aCx,
|
||||||
JS::MutableHandle<JSObject*> aReflector) override;
|
JS::MutableHandle<JSObject*> aReflector) override;
|
||||||
|
|
||||||
|
void GetName(DOMString& aName) const
|
||||||
|
{
|
||||||
|
aName.AsAString() = NS_ConvertUTF8toUTF16(mName);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage,
|
PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage,
|
||||||
const Sequence<JSObject*>& aTransferable,
|
const Sequence<JSObject*>& aTransferable,
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
// now start the worker
|
// now start the worker
|
||||||
var finalWorkerURL = "workerxhr-origin-referrer.js";
|
var finalWorkerURL = "workerxhr-origin-referrer.js";
|
||||||
var url = "resources/redirect.py?location=" + encodeURIComponent(finalWorkerURL);
|
var url = "resources/redirect.py?location=" + encodeURIComponent(finalWorkerURL);
|
||||||
var worker = new Worker(url, true)
|
var worker = new Worker(url)
|
||||||
worker.onmessage = function (e) {
|
worker.onmessage = function (e) {
|
||||||
var subtest = async_test(e.data.test)
|
var subtest = async_test(e.data.test)
|
||||||
subtest.step(function(){
|
subtest.step(function(){
|
||||||
|
|
|
@ -14,7 +14,7 @@ onconnect = function(e) {
|
||||||
var worker = new SharedWorker(null, null);
|
var worker = new SharedWorker(null, null);
|
||||||
worker.port.addEventListener('message', this.step_func(function(e) {
|
worker.port.addEventListener('message', this.step_func(function(e) {
|
||||||
assert_equals(e.data[0], 'null', 'first arg');
|
assert_equals(e.data[0], 'null', 'first arg');
|
||||||
assert_equals(e.data[1], 'null', 'second arg');
|
assert_equals(e.data[1], '', 'second arg');
|
||||||
this.done();
|
this.done();
|
||||||
}), false);
|
}), false);
|
||||||
worker.port.start();
|
worker.port.start();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
importScripts("/resources/testharness.js");
|
importScripts("/resources/testharness.js");
|
||||||
|
|
||||||
var unexpected = ['open', 'print', 'stop', 'getComputedStyle', 'getSelection', 'releaseEvents', 'captureEvents', 'alert', 'confirm', 'prompt', 'addEventStream', 'removeEventStream', 'back', 'forward', 'attachEvent', 'detachEvent', 'navigate', 'DOMParser', 'XMLSerializer', 'XPathEvaluator', 'XSLTProcessor', 'opera', 'Image', 'Option', 'frames', 'Audio', 'SVGUnitTypes', 'SVGZoomAndPan', 'java', 'netscape', 'sun', 'Packages', 'ByteArray', 'closed', 'defaultStatus', 'document', 'event', 'frameElement', 'history', 'innerHeight', 'innerWidth', 'name', 'opener', 'outerHeight', 'outerWidth', 'pageXOffset', 'pageYOffset', 'parent', 'screen', 'screenLeft', 'screenTop', 'screenX', 'screenY', 'status', 'top', 'window', 'length']; // iterated window in opera and removed expected ones
|
var unexpected = ['open', 'print', 'stop', 'getComputedStyle', 'getSelection', 'releaseEvents', 'captureEvents', 'alert', 'confirm', 'prompt', 'addEventStream', 'removeEventStream', 'back', 'forward', 'attachEvent', 'detachEvent', 'navigate', 'DOMParser', 'XMLSerializer', 'XPathEvaluator', 'XSLTProcessor', 'opera', 'Image', 'Option', 'frames', 'Audio', 'SVGUnitTypes', 'SVGZoomAndPan', 'java', 'netscape', 'sun', 'Packages', 'ByteArray', 'closed', 'defaultStatus', 'document', 'event', 'frameElement', 'history', 'innerHeight', 'innerWidth', 'opener', 'outerHeight', 'outerWidth', 'pageXOffset', 'pageYOffset', 'parent', 'screen', 'screenLeft', 'screenTop', 'screenX', 'screenY', 'status', 'top', 'window', 'length']; // iterated window in opera and removed expected ones
|
||||||
for (var i = 0; i < unexpected.length; ++i) {
|
for (var i = 0; i < unexpected.length; ++i) {
|
||||||
var property = unexpected[i];
|
var property = unexpected[i];
|
||||||
test(function() {
|
test(function() {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче