Commit a82bef38 authored by binji's avatar binji Committed by Commit bot

Disallow Atomics.wait in ServiceWorker, allow in SharedWorker

Atomics.wait is a blocking call, and is only allowed on certain workers. See
the new web platform tests here:
https://github.com/w3c/web-platform-tests/pull/5569

BUG=chromium:711809

Review-Url: https://codereview.chromium.org/2841003002
Cr-Commit-Position: refs/heads/master@{#468188}
parent e613d23a
...@@ -13,15 +13,20 @@ namespace blink { ...@@ -13,15 +13,20 @@ namespace blink {
// The V8 settings that are passed from the main isolate to the worker isolate. // The V8 settings that are passed from the main isolate to the worker isolate.
struct CORE_EXPORT WorkerV8Settings { struct CORE_EXPORT WorkerV8Settings {
enum class HeapLimitMode { kDefault, kIncreasedForDebugging }; enum class HeapLimitMode { kDefault, kIncreasedForDebugging };
enum class AtomicsWaitMode { kDisallow, kAllow };
WorkerV8Settings(HeapLimitMode heap_limit_mode, WorkerV8Settings(HeapLimitMode heap_limit_mode,
V8CacheOptions v8_cache_options) V8CacheOptions v8_cache_options,
AtomicsWaitMode atomics_wait_mode)
: heap_limit_mode_(heap_limit_mode), : heap_limit_mode_(heap_limit_mode),
v8_cache_options_(v8_cache_options) {} v8_cache_options_(v8_cache_options),
atomics_wait_mode_(atomics_wait_mode) {}
static WorkerV8Settings Default() { static WorkerV8Settings Default() {
return WorkerV8Settings(HeapLimitMode::kDefault, kV8CacheOptionsDefault); return WorkerV8Settings(HeapLimitMode::kDefault, kV8CacheOptionsDefault,
AtomicsWaitMode::kDisallow);
} }
HeapLimitMode heap_limit_mode_; HeapLimitMode heap_limit_mode_;
V8CacheOptions v8_cache_options_; V8CacheOptions v8_cache_options_;
AtomicsWaitMode atomics_wait_mode_;
}; };
} // namespace blink } // namespace blink
......
...@@ -23,4 +23,8 @@ std::unique_ptr<WorkerThread> DedicatedWorkerMessagingProxy::CreateWorkerThread( ...@@ -23,4 +23,8 @@ std::unique_ptr<WorkerThread> DedicatedWorkerMessagingProxy::CreateWorkerThread(
origin_time); origin_time);
} }
bool DedicatedWorkerMessagingProxy::IsAtomicsWaitAllowed() {
return true;
}
} // namespace blink } // namespace blink
...@@ -21,6 +21,8 @@ class CORE_EXPORT DedicatedWorkerMessagingProxy final ...@@ -21,6 +21,8 @@ class CORE_EXPORT DedicatedWorkerMessagingProxy final
~DedicatedWorkerMessagingProxy() override; ~DedicatedWorkerMessagingProxy() override;
std::unique_ptr<WorkerThread> CreateWorkerThread(double origin_time) override; std::unique_ptr<WorkerThread> CreateWorkerThread(double origin_time) override;
bool IsAtomicsWaitAllowed() override;
}; };
} // namespace blink } // namespace blink
......
...@@ -118,6 +118,9 @@ class InProcessWorkerMessagingProxyForTest ...@@ -118,6 +118,9 @@ class InProcessWorkerMessagingProxyForTest
CSPHeaderAndType header_and_type("contentSecurityPolicy", CSPHeaderAndType header_and_type("contentSecurityPolicy",
kContentSecurityPolicyHeaderTypeReport); kContentSecurityPolicyHeaderTypeReport);
headers->push_back(header_and_type); headers->push_back(header_and_type);
WorkerV8Settings worker_v8_settings = WorkerV8Settings::Default();
worker_v8_settings.atomics_wait_mode_ =
WorkerV8Settings::AtomicsWaitMode::kAllow;
GetWorkerThread()->Start( GetWorkerThread()->Start(
WorkerThreadStartupData::Create( WorkerThreadStartupData::Create(
script_url, "fake user agent", source, nullptr /* cachedMetaData */, script_url, "fake user agent", source, nullptr /* cachedMetaData */,
...@@ -125,7 +128,7 @@ class InProcessWorkerMessagingProxyForTest ...@@ -125,7 +128,7 @@ class InProcessWorkerMessagingProxyForTest
"" /* referrerPolicy */, security_origin_.Get(), "" /* referrerPolicy */, security_origin_.Get(),
nullptr /* workerClients */, kWebAddressSpaceLocal, nullptr /* workerClients */, kWebAddressSpaceLocal,
nullptr /* originTrialTokens */, nullptr /* workerSettings */, nullptr /* originTrialTokens */, nullptr /* workerSettings */,
WorkerV8Settings::Default()), worker_v8_settings),
GetParentFrameTaskRunners()); GetParentFrameTaskRunners());
GetWorkerInspectorProxy()->WorkerThreadCreated( GetWorkerInspectorProxy()->WorkerThreadCreated(
......
...@@ -107,6 +107,9 @@ void InProcessWorkerMessagingProxy::StartWorkerGlobalScope( ...@@ -107,6 +107,9 @@ void InProcessWorkerMessagingProxy::StartWorkerGlobalScope(
ToIsolate(document)->IsHeapLimitIncreasedForDebugging() ToIsolate(document)->IsHeapLimitIncreasedForDebugging()
? WorkerV8Settings::HeapLimitMode::kIncreasedForDebugging ? WorkerV8Settings::HeapLimitMode::kIncreasedForDebugging
: WorkerV8Settings::HeapLimitMode::kDefault; : WorkerV8Settings::HeapLimitMode::kDefault;
worker_v8_settings.atomics_wait_mode_ =
IsAtomicsWaitAllowed() ? WorkerV8Settings::AtomicsWaitMode::kAllow
: WorkerV8Settings::AtomicsWaitMode::kDisallow;
std::unique_ptr<WorkerThreadStartupData> startup_data = std::unique_ptr<WorkerThreadStartupData> startup_data =
WorkerThreadStartupData::Create( WorkerThreadStartupData::Create(
script_url, user_agent, source_code, nullptr, start_mode, script_url, user_agent, source_code, nullptr, start_mode,
......
...@@ -87,6 +87,9 @@ class CORE_EXPORT InProcessWorkerMessagingProxy ...@@ -87,6 +87,9 @@ class CORE_EXPORT InProcessWorkerMessagingProxy
return *worker_object_proxy_.get(); return *worker_object_proxy_.get();
} }
// Whether Atomics.wait (a blocking function call) is allowed on this thread.
virtual bool IsAtomicsWaitAllowed() { return false; }
private: private:
friend class InProcessWorkerMessagingProxyForTest; friend class InProcessWorkerMessagingProxyForTest;
InProcessWorkerMessagingProxy(ExecutionContext*, InProcessWorkerMessagingProxy(ExecutionContext*,
......
...@@ -447,6 +447,9 @@ void WorkerThread::InitializeOnWorkerThread( ...@@ -447,6 +447,9 @@ void WorkerThread::InitializeOnWorkerThread(
bool heap_limit_increased_for_debugging = bool heap_limit_increased_for_debugging =
startup_data->worker_v8_settings_.heap_limit_mode_ == startup_data->worker_v8_settings_.heap_limit_mode_ ==
WorkerV8Settings::HeapLimitMode::kIncreasedForDebugging; WorkerV8Settings::HeapLimitMode::kIncreasedForDebugging;
bool allow_atomics_wait =
startup_data->worker_v8_settings_.atomics_wait_mode_ ==
WorkerV8Settings::AtomicsWaitMode::kAllow;
{ {
MutexLocker lock(thread_state_mutex_); MutexLocker lock(thread_state_mutex_);
...@@ -462,6 +465,8 @@ void WorkerThread::InitializeOnWorkerThread( ...@@ -462,6 +465,8 @@ void WorkerThread::InitializeOnWorkerThread(
GetIsolate()->IncreaseHeapLimitForDebugging(); GetIsolate()->IncreaseHeapLimitForDebugging();
} }
GetIsolate()->SetAllowAtomicsWait(allow_atomics_wait);
console_message_storage_ = new ConsoleMessageStorage(); console_message_storage_ = new ConsoleMessageStorage();
global_scope_ = CreateWorkerGlobalScope(std::move(startup_data)); global_scope_ = CreateWorkerGlobalScope(std::move(startup_data));
worker_reporting_proxy_.DidCreateWorkerGlobalScope(GlobalScope()); worker_reporting_proxy_.DidCreateWorkerGlobalScope(GlobalScope());
......
...@@ -350,6 +350,9 @@ void WebSharedWorkerImpl::OnScriptLoaderFinished() { ...@@ -350,6 +350,9 @@ void WebSharedWorkerImpl::OnScriptLoaderFinished() {
worker_inspector_proxy_->WorkerStartMode(document); worker_inspector_proxy_->WorkerStartMode(document);
std::unique_ptr<WorkerSettings> worker_settings = std::unique_ptr<WorkerSettings> worker_settings =
WTF::WrapUnique(new WorkerSettings(document->GetSettings())); WTF::WrapUnique(new WorkerSettings(document->GetSettings()));
WorkerV8Settings worker_v8_settings = WorkerV8Settings::Default();
worker_v8_settings.atomics_wait_mode_ =
WorkerV8Settings::AtomicsWaitMode::kAllow;
std::unique_ptr<WorkerThreadStartupData> startup_data = std::unique_ptr<WorkerThreadStartupData> startup_data =
WorkerThreadStartupData::Create( WorkerThreadStartupData::Create(
url_, loading_document_->UserAgent(), url_, loading_document_->UserAgent(),
...@@ -359,7 +362,7 @@ void WebSharedWorkerImpl::OnScriptLoaderFinished() { ...@@ -359,7 +362,7 @@ void WebSharedWorkerImpl::OnScriptLoaderFinished() {
main_script_loader_->GetReferrerPolicy(), starter_origin, main_script_loader_->GetReferrerPolicy(), starter_origin,
worker_clients, main_script_loader_->ResponseAddressSpace(), worker_clients, main_script_loader_->ResponseAddressSpace(),
main_script_loader_->OriginTrialTokens(), std::move(worker_settings), main_script_loader_->OriginTrialTokens(), std::move(worker_settings),
WorkerV8Settings::Default()); worker_v8_settings);
// SharedWorker can sometimes run tasks that are initiated by/associated with // SharedWorker can sometimes run tasks that are initiated by/associated with
// a document's frame but these documents can be from a different process. So // a document's frame but these documents can be from a different process. So
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment