Use v8::MicrotasksScope internally in V8RecursionScope.
If this sticks we can just remove V8RecursionScope and WebScopedMicrotaskSuppression, along with other cleanups. Attempt #3. First one broke GinJavaBridgeValueConverterTest.TypedArrays. Second one broke FileManagerBrowserTest family on ChromeOS. BUG=585949 Review URL: https://codereview.chromium.org/1743763004 Cr-Commit-Position: refs/heads/master@{#380570}
This commit is contained in:
chrome/test/base
content
child
renderer
extensions/renderer
activity_log_converter_strategy_unittest.ccapi_test_base.ccmodule_system_test.ccsafe_builtins.ccv8_helpers.h
gin
third_party/WebKit/Source
bindings
core
core
modules
cachestorage
fetch
serviceworkers
@@ -11,6 +11,7 @@
|
|||||||
#include "base/strings/stringprintf.h"
|
#include "base/strings/stringprintf.h"
|
||||||
#include "chrome/common/chrome_paths.h"
|
#include "chrome/common/chrome_paths.h"
|
||||||
#include "third_party/WebKit/public/web/WebKit.h"
|
#include "third_party/WebKit/public/web/WebKit.h"
|
||||||
|
#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
@@ -95,6 +96,7 @@ bool V8UnitTest::RunJavascriptTestF(const std::string& test_fixture,
|
|||||||
v8::Local<v8::Context> context =
|
v8::Local<v8::Context> context =
|
||||||
v8::Local<v8::Context>::New(isolate, context_);
|
v8::Local<v8::Context>::New(isolate, context_);
|
||||||
v8::Context::Scope context_scope(context);
|
v8::Context::Scope context_scope(context);
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
|
|
||||||
v8::Local<v8::Value> function_property =
|
v8::Local<v8::Value> function_property =
|
||||||
context->Global()->Get(v8::String::NewFromUtf8(isolate, "runTest"));
|
context->Global()->Get(v8::String::NewFromUtf8(isolate, "runTest"));
|
||||||
@@ -209,6 +211,7 @@ void V8UnitTest::ExecuteScriptInContext(const base::StringPiece& script_source,
|
|||||||
v8::Local<v8::Context> context =
|
v8::Local<v8::Context> context =
|
||||||
v8::Local<v8::Context>::New(isolate, context_);
|
v8::Local<v8::Context>::New(isolate, context_);
|
||||||
v8::Context::Scope context_scope(context);
|
v8::Context::Scope context_scope(context);
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
v8::Local<v8::String> source =
|
v8::Local<v8::String> source =
|
||||||
v8::String::NewFromUtf8(isolate,
|
v8::String::NewFromUtf8(isolate,
|
||||||
script_source.data(),
|
script_source.data(),
|
||||||
@@ -257,6 +260,7 @@ void V8UnitTest::TestFunction(const std::string& function_name) {
|
|||||||
v8::Local<v8::Context> context =
|
v8::Local<v8::Context> context =
|
||||||
v8::Local<v8::Context>::New(isolate, context_);
|
v8::Local<v8::Context>::New(isolate, context_);
|
||||||
v8::Context::Scope context_scope(context);
|
v8::Context::Scope context_scope(context);
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
|
|
||||||
v8::Local<v8::Value> function_property = context->Global()->Get(
|
v8::Local<v8::Value> function_property = context->Global()->Get(
|
||||||
v8::String::NewFromUtf8(isolate, function_name.c_str()));
|
v8::String::NewFromUtf8(isolate, function_name.c_str()));
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
#include "base/values.h"
|
#include "base/values.h"
|
||||||
#include "content/child/v8_value_converter_impl.h"
|
#include "content/child/v8_value_converter_impl.h"
|
||||||
#include "testing/gtest/include/gtest/gtest.h"
|
#include "testing/gtest/include/gtest/gtest.h"
|
||||||
|
#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
|
||||||
#include "v8/include/v8.h"
|
#include "v8/include/v8.h"
|
||||||
|
|
||||||
namespace content {
|
namespace content {
|
||||||
@@ -287,6 +288,7 @@ TEST_F(V8ValueConverterImplTest, ObjectExceptions) {
|
|||||||
v8::Local<v8::Context> context =
|
v8::Local<v8::Context> context =
|
||||||
v8::Local<v8::Context>::New(isolate_, context_);
|
v8::Local<v8::Context>::New(isolate_, context_);
|
||||||
v8::Context::Scope context_scope(context);
|
v8::Context::Scope context_scope(context);
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
|
|
||||||
// Set up objects to throw when reading or writing 'foo'.
|
// Set up objects to throw when reading or writing 'foo'.
|
||||||
const char* source =
|
const char* source =
|
||||||
@@ -329,6 +331,7 @@ TEST_F(V8ValueConverterImplTest, ArrayExceptions) {
|
|||||||
v8::Local<v8::Context> context =
|
v8::Local<v8::Context> context =
|
||||||
v8::Local<v8::Context>::New(isolate_, context_);
|
v8::Local<v8::Context>::New(isolate_, context_);
|
||||||
v8::Context::Scope context_scope(context);
|
v8::Context::Scope context_scope(context);
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
|
|
||||||
const char* source = "(function() {"
|
const char* source = "(function() {"
|
||||||
"var arr = [];"
|
"var arr = [];"
|
||||||
@@ -405,6 +408,7 @@ TEST_F(V8ValueConverterImplTest, Prototype) {
|
|||||||
v8::Local<v8::Context> context =
|
v8::Local<v8::Context> context =
|
||||||
v8::Local<v8::Context>::New(isolate_, context_);
|
v8::Local<v8::Context>::New(isolate_, context_);
|
||||||
v8::Context::Scope context_scope(context);
|
v8::Context::Scope context_scope(context);
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
|
|
||||||
const char* source = "(function() {"
|
const char* source = "(function() {"
|
||||||
"Object.prototype.foo = 'foo';"
|
"Object.prototype.foo = 'foo';"
|
||||||
@@ -429,6 +433,7 @@ TEST_F(V8ValueConverterImplTest, StripNullFromObjects) {
|
|||||||
v8::Local<v8::Context> context =
|
v8::Local<v8::Context> context =
|
||||||
v8::Local<v8::Context>::New(isolate_, context_);
|
v8::Local<v8::Context>::New(isolate_, context_);
|
||||||
v8::Context::Scope context_scope(context);
|
v8::Context::Scope context_scope(context);
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
|
|
||||||
const char* source = "(function() {"
|
const char* source = "(function() {"
|
||||||
"return { foo: undefined, bar: null };"
|
"return { foo: undefined, bar: null };"
|
||||||
@@ -487,6 +492,7 @@ TEST_F(V8ValueConverterImplTest, WeirdProperties) {
|
|||||||
v8::Local<v8::Context> context =
|
v8::Local<v8::Context> context =
|
||||||
v8::Local<v8::Context>::New(isolate_, context_);
|
v8::Local<v8::Context>::New(isolate_, context_);
|
||||||
v8::Context::Scope context_scope(context);
|
v8::Context::Scope context_scope(context);
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
|
|
||||||
const char* source = "(function() {"
|
const char* source = "(function() {"
|
||||||
"return {"
|
"return {"
|
||||||
@@ -525,6 +531,7 @@ TEST_F(V8ValueConverterImplTest, ArrayGetters) {
|
|||||||
v8::Local<v8::Context> context =
|
v8::Local<v8::Context> context =
|
||||||
v8::Local<v8::Context>::New(isolate_, context_);
|
v8::Local<v8::Context>::New(isolate_, context_);
|
||||||
v8::Context::Scope context_scope(context);
|
v8::Context::Scope context_scope(context);
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
|
|
||||||
const char* source = "(function() {"
|
const char* source = "(function() {"
|
||||||
"var a = [0];"
|
"var a = [0];"
|
||||||
@@ -549,6 +556,7 @@ TEST_F(V8ValueConverterImplTest, UndefinedValueBehavior) {
|
|||||||
v8::Local<v8::Context> context =
|
v8::Local<v8::Context> context =
|
||||||
v8::Local<v8::Context>::New(isolate_, context_);
|
v8::Local<v8::Context>::New(isolate_, context_);
|
||||||
v8::Context::Scope context_scope(context);
|
v8::Context::Scope context_scope(context);
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
|
|
||||||
v8::Local<v8::Object> object;
|
v8::Local<v8::Object> object;
|
||||||
{
|
{
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
#include "content/common/android/gin_java_bridge_value.h"
|
#include "content/common/android/gin_java_bridge_value.h"
|
||||||
#include "content/renderer/java/gin_java_bridge_value_converter.h"
|
#include "content/renderer/java/gin_java_bridge_value_converter.h"
|
||||||
#include "testing/gtest/include/gtest/gtest.h"
|
#include "testing/gtest/include/gtest/gtest.h"
|
||||||
|
#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
|
||||||
#include "v8/include/v8.h"
|
#include "v8/include/v8.h"
|
||||||
|
|
||||||
namespace content {
|
namespace content {
|
||||||
@@ -99,6 +100,7 @@ TEST_F(GinJavaBridgeValueConverterTest, TypedArrays) {
|
|||||||
v8::Local<v8::Context> context =
|
v8::Local<v8::Context> context =
|
||||||
v8::Local<v8::Context>::New(isolate_, context_);
|
v8::Local<v8::Context>::New(isolate_, context_);
|
||||||
v8::Context::Scope context_scope(context);
|
v8::Context::Scope context_scope(context);
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
|
|
||||||
scoped_ptr<GinJavaBridgeValueConverter> converter(
|
scoped_ptr<GinJavaBridgeValueConverter> converter(
|
||||||
new GinJavaBridgeValueConverter());
|
new GinJavaBridgeValueConverter());
|
||||||
|
@@ -29,6 +29,7 @@
|
|||||||
#include "ppapi/shared_impl/var.h"
|
#include "ppapi/shared_impl/var.h"
|
||||||
#include "ppapi/shared_impl/var_tracker.h"
|
#include "ppapi/shared_impl/var_tracker.h"
|
||||||
#include "testing/gtest/include/gtest/gtest.h"
|
#include "testing/gtest/include/gtest/gtest.h"
|
||||||
|
#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
|
||||||
#include "v8/include/v8.h"
|
#include "v8/include/v8.h"
|
||||||
|
|
||||||
using ppapi::ArrayBufferVar;
|
using ppapi::ArrayBufferVar;
|
||||||
@@ -403,6 +404,7 @@ TEST_F(V8VarConverterTest, StrangeDictionaryKeyTest) {
|
|||||||
v8::Local<v8::Context> context =
|
v8::Local<v8::Context> context =
|
||||||
v8::Local<v8::Context>::New(isolate_, context_);
|
v8::Local<v8::Context>::New(isolate_, context_);
|
||||||
v8::Context::Scope context_scope(context);
|
v8::Context::Scope context_scope(context);
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
|
|
||||||
const char* source =
|
const char* source =
|
||||||
"(function() {"
|
"(function() {"
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
#include "base/values.h"
|
#include "base/values.h"
|
||||||
#include "extensions/renderer/activity_log_converter_strategy.h"
|
#include "extensions/renderer/activity_log_converter_strategy.h"
|
||||||
#include "testing/gtest/include/gtest/gtest.h"
|
#include "testing/gtest/include/gtest/gtest.h"
|
||||||
|
#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
|
||||||
#include "v8/include/v8.h"
|
#include "v8/include/v8.h"
|
||||||
|
|
||||||
using content::V8ValueConverter;
|
using content::V8ValueConverter;
|
||||||
@@ -122,6 +123,7 @@ TEST_F(ActivityLogConverterStrategyTest, ConversionTest) {
|
|||||||
"};"
|
"};"
|
||||||
"})();";
|
"})();";
|
||||||
|
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
v8::Local<v8::Script> script(
|
v8::Local<v8::Script> script(
|
||||||
v8::Script::Compile(v8::String::NewFromUtf8(isolate_, source)));
|
v8::Script::Compile(v8::String::NewFromUtf8(isolate_, source)));
|
||||||
v8::Local<v8::Object> v8_object = script->Run().As<v8::Object>();
|
v8::Local<v8::Object> v8_object = script->Run().As<v8::Object>();
|
||||||
|
@@ -214,7 +214,7 @@ void ApiTestEnvironment::RunTestInner(const std::string& test_name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ApiTestEnvironment::RunPromisesAgain() {
|
void ApiTestEnvironment::RunPromisesAgain() {
|
||||||
env()->isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(env()->isolate());
|
||||||
base::MessageLoop::current()->PostTask(
|
base::MessageLoop::current()->PostTask(
|
||||||
FROM_HERE, base::Bind(&ApiTestEnvironment::RunPromisesAgain,
|
FROM_HERE, base::Bind(&ApiTestEnvironment::RunPromisesAgain,
|
||||||
base::Unretained(this)));
|
base::Unretained(this)));
|
||||||
|
@@ -253,7 +253,7 @@ void ModuleSystemTest::ExpectNoAssertionsMade() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ModuleSystemTest::RunResolvedPromises() {
|
void ModuleSystemTest::RunResolvedPromises() {
|
||||||
isolate_->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate_);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace extensions
|
} // namespace extensions
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
#include "base/strings/stringprintf.h"
|
#include "base/strings/stringprintf.h"
|
||||||
#include "extensions/renderer/script_context.h"
|
#include "extensions/renderer/script_context.h"
|
||||||
#include "extensions/renderer/v8_helpers.h"
|
#include "extensions/renderer/v8_helpers.h"
|
||||||
|
#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
|
|
||||||
@@ -200,6 +201,7 @@ class ExtensionImpl : public v8::Extension {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
v8::Local<v8::Value> return_value;
|
v8::Local<v8::Value> return_value;
|
||||||
if (function->Call(context, recv, argc, argv.get()).ToLocal(&return_value))
|
if (function->Call(context, recv, argc, argv.get()).ToLocal(&return_value))
|
||||||
info.GetReturnValue().Set(return_value);
|
info.GetReturnValue().Set(return_value);
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "base/strings/string_number_conversions.h"
|
#include "base/strings/string_number_conversions.h"
|
||||||
|
#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
|
||||||
#include "v8/include/v8.h"
|
#include "v8/include/v8.h"
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
@@ -172,6 +173,7 @@ inline bool CallFunction(v8::Local<v8::Context> context,
|
|||||||
int argc,
|
int argc,
|
||||||
v8::Local<v8::Value> argv[],
|
v8::Local<v8::Value> argv[],
|
||||||
v8::Local<v8::Value>* out) {
|
v8::Local<v8::Value>* out) {
|
||||||
|
blink::WebScopedMicrotaskSuppression microtasks_scope;
|
||||||
return function->Call(context, recv, argc, argv).ToLocal(out);
|
return function->Call(context, recv, argc, argv).ToLocal(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@ void RunMicrotasksObserver::WillProcessTask(const base::PendingTask& task) {
|
|||||||
|
|
||||||
void RunMicrotasksObserver::DidProcessTask(const base::PendingTask& task) {
|
void RunMicrotasksObserver::DidProcessTask(const base::PendingTask& task) {
|
||||||
v8::Isolate::Scope scope(isolate_);
|
v8::Isolate::Scope scope(isolate_);
|
||||||
isolate_->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate_);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace gin
|
} // namespace gin
|
||||||
|
@@ -12,7 +12,7 @@ namespace gin {
|
|||||||
|
|
||||||
// Runs any pending v8 Microtasks each time a task is completed.
|
// Runs any pending v8 Microtasks each time a task is completed.
|
||||||
// TODO(hansmuller); At some point perhaps this can be replaced with
|
// TODO(hansmuller); At some point perhaps this can be replaced with
|
||||||
// the (currently experimental) Isolate::SetAutorunMicrotasks() method.
|
// the (currently experimental) v8::MicrotasksPolicy::kAuto method.
|
||||||
|
|
||||||
class RunMicrotasksObserver : public base::MessageLoop::TaskObserver {
|
class RunMicrotasksObserver : public base::MessageLoop::TaskObserver {
|
||||||
public:
|
public:
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
#include "bindings/core/v8/V8BindingForTesting.h"
|
#include "bindings/core/v8/V8BindingForTesting.h"
|
||||||
#include "bindings/core/v8/V8BindingMacros.h"
|
#include "bindings/core/v8/V8BindingMacros.h"
|
||||||
#include "bindings/core/v8/V8IteratorResultValue.h"
|
#include "bindings/core/v8/V8IteratorResultValue.h"
|
||||||
|
#include "bindings/core/v8/V8RecursionScope.h"
|
||||||
#include "bindings/core/v8/V8ThrowException.h"
|
#include "bindings/core/v8/V8ThrowException.h"
|
||||||
#include "core/dom/Document.h"
|
#include "core/dom/Document.h"
|
||||||
#include "core/streams/ReadableStreamController.h"
|
#include "core/streams/ReadableStreamController.h"
|
||||||
@@ -138,7 +139,7 @@ public:
|
|||||||
~ReadableStreamOperationsTest() override
|
~ReadableStreamOperationsTest() override
|
||||||
{
|
{
|
||||||
// Execute all pending microtasks
|
// Execute all pending microtasks
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_FALSE(m_block.HasCaught());
|
EXPECT_FALSE(m_block.HasCaught());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,6 +150,7 @@ public:
|
|||||||
{
|
{
|
||||||
v8::Local<v8::String> source;
|
v8::Local<v8::String> source;
|
||||||
v8::Local<v8::Script> script;
|
v8::Local<v8::Script> script;
|
||||||
|
V8RecursionScope::MicrotaskSuppression microtasks(isolate());
|
||||||
if (!v8Call(v8::String::NewFromUtf8(isolate(), s, v8::NewStringType::kNormal), source)) {
|
if (!v8Call(v8::String::NewFromUtf8(isolate(), s, v8::NewStringType::kNormal), source)) {
|
||||||
ADD_FAILURE();
|
ADD_FAILURE();
|
||||||
return ScriptValue();
|
return ScriptValue();
|
||||||
@@ -253,12 +255,12 @@ TEST_F(ReadableStreamOperationsTest, Read)
|
|||||||
Function::createFunction(getScriptState(), it2),
|
Function::createFunction(getScriptState(), it2),
|
||||||
NotReached::createFunction(getScriptState()));
|
NotReached::createFunction(getScriptState()));
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_FALSE(it1->isSet());
|
EXPECT_FALSE(it1->isSet());
|
||||||
EXPECT_FALSE(it2->isSet());
|
EXPECT_FALSE(it2->isSet());
|
||||||
|
|
||||||
ASSERT_FALSE(evalWithPrintingError("controller.enqueue('hello')").isEmpty());
|
ASSERT_FALSE(evalWithPrintingError("controller.enqueue('hello')").isEmpty());
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_TRUE(it1->isSet());
|
EXPECT_TRUE(it1->isSet());
|
||||||
EXPECT_TRUE(it1->isValid());
|
EXPECT_TRUE(it1->isValid());
|
||||||
EXPECT_FALSE(it1->isDone());
|
EXPECT_FALSE(it1->isDone());
|
||||||
@@ -266,7 +268,7 @@ TEST_F(ReadableStreamOperationsTest, Read)
|
|||||||
EXPECT_FALSE(it2->isSet());
|
EXPECT_FALSE(it2->isSet());
|
||||||
|
|
||||||
ASSERT_FALSE(evalWithPrintingError("controller.close()").isEmpty());
|
ASSERT_FALSE(evalWithPrintingError("controller.close()").isEmpty());
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_TRUE(it1->isSet());
|
EXPECT_TRUE(it1->isSet());
|
||||||
EXPECT_TRUE(it1->isValid());
|
EXPECT_TRUE(it1->isValid());
|
||||||
EXPECT_FALSE(it1->isDone());
|
EXPECT_FALSE(it1->isDone());
|
||||||
@@ -309,7 +311,7 @@ TEST_F(ReadableStreamOperationsTest, CreateReadableStreamWithCustomUnderlyingSou
|
|||||||
ReadableStreamOperations::read(getScriptState(), reader).then(Function::createFunction(getScriptState(), it2), NotReached::createFunction(getScriptState()));
|
ReadableStreamOperations::read(getScriptState(), reader).then(Function::createFunction(getScriptState(), it2), NotReached::createFunction(getScriptState()));
|
||||||
ReadableStreamOperations::read(getScriptState(), reader).then(Function::createFunction(getScriptState(), it3), NotReached::createFunction(getScriptState()));
|
ReadableStreamOperations::read(getScriptState(), reader).then(Function::createFunction(getScriptState(), it3), NotReached::createFunction(getScriptState()));
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ(10, underlyingSource->desiredSize());
|
EXPECT_EQ(10, underlyingSource->desiredSize());
|
||||||
|
|
||||||
@@ -326,7 +328,7 @@ TEST_F(ReadableStreamOperationsTest, CreateReadableStreamWithCustomUnderlyingSou
|
|||||||
EXPECT_FALSE(it3->isSet());
|
EXPECT_FALSE(it3->isSet());
|
||||||
|
|
||||||
underlyingSource->close();
|
underlyingSource->close();
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(it3->isSet());
|
EXPECT_TRUE(it3->isSet());
|
||||||
EXPECT_TRUE(it3->isValid());
|
EXPECT_TRUE(it3->isValid());
|
||||||
|
@@ -281,7 +281,7 @@ TEST_F(ScriptPromisePropertyGarbageCollectedTest, Resolve_ResolvesScriptPromise)
|
|||||||
getProperty()->resolve(value);
|
getProperty()->resolve(value);
|
||||||
EXPECT_EQ(Property::Resolved, getProperty()->getState());
|
EXPECT_EQ(Property::Resolved, getProperty()->getState());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_EQ(1u, nResolveCalls);
|
EXPECT_EQ(1u, nResolveCalls);
|
||||||
EXPECT_EQ(1u, nOtherResolveCalls);
|
EXPECT_EQ(1u, nOtherResolveCalls);
|
||||||
EXPECT_EQ(wrap(mainWorld(), value), actual);
|
EXPECT_EQ(wrap(mainWorld(), value), actual);
|
||||||
@@ -307,7 +307,7 @@ TEST_F(ScriptPromisePropertyGarbageCollectedTest, ResolveAndGetPromiseOnOtherWor
|
|||||||
getProperty()->resolve(value);
|
getProperty()->resolve(value);
|
||||||
EXPECT_EQ(Property::Resolved, getProperty()->getState());
|
EXPECT_EQ(Property::Resolved, getProperty()->getState());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_EQ(1u, nResolveCalls);
|
EXPECT_EQ(1u, nResolveCalls);
|
||||||
EXPECT_EQ(0u, nOtherResolveCalls);
|
EXPECT_EQ(0u, nOtherResolveCalls);
|
||||||
|
|
||||||
@@ -316,7 +316,7 @@ TEST_F(ScriptPromisePropertyGarbageCollectedTest, ResolveAndGetPromiseOnOtherWor
|
|||||||
otherPromise.then(stub(currentScriptState(), otherActual, nOtherResolveCalls), notReached(currentScriptState()));
|
otherPromise.then(stub(currentScriptState(), otherActual, nOtherResolveCalls), notReached(currentScriptState()));
|
||||||
}
|
}
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_EQ(1u, nResolveCalls);
|
EXPECT_EQ(1u, nResolveCalls);
|
||||||
EXPECT_EQ(1u, nOtherResolveCalls);
|
EXPECT_EQ(1u, nOtherResolveCalls);
|
||||||
EXPECT_EQ(wrap(mainWorld(), value), actual);
|
EXPECT_EQ(wrap(mainWorld(), value), actual);
|
||||||
@@ -343,7 +343,7 @@ TEST_F(ScriptPromisePropertyGarbageCollectedTest, Reject_RejectsScriptPromise)
|
|||||||
getProperty()->promise(otherWorld()).then(notReached(currentScriptState()), stub(currentScriptState(), otherActual, nOtherRejectCalls));
|
getProperty()->promise(otherWorld()).then(notReached(currentScriptState()), stub(currentScriptState(), otherActual, nOtherRejectCalls));
|
||||||
}
|
}
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_EQ(1u, nRejectCalls);
|
EXPECT_EQ(1u, nRejectCalls);
|
||||||
EXPECT_EQ(wrap(mainWorld(), reason), actual);
|
EXPECT_EQ(wrap(mainWorld(), reason), actual);
|
||||||
EXPECT_EQ(1u, nOtherRejectCalls);
|
EXPECT_EQ(1u, nOtherRejectCalls);
|
||||||
@@ -374,7 +374,7 @@ TEST_F(ScriptPromisePropertyGarbageCollectedTest, Resolve_DeadContext)
|
|||||||
getProperty()->resolve(new GarbageCollectedScriptWrappable("value"));
|
getProperty()->resolve(new GarbageCollectedScriptWrappable("value"));
|
||||||
EXPECT_EQ(Property::Pending, getProperty()->getState());
|
EXPECT_EQ(Property::Pending, getProperty()->getState());
|
||||||
|
|
||||||
v8::Isolate::GetCurrent()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(v8::Isolate::GetCurrent());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ScriptPromisePropertyGarbageCollectedTest, Reset)
|
TEST_F(ScriptPromisePropertyGarbageCollectedTest, Reset)
|
||||||
@@ -405,7 +405,7 @@ TEST_F(ScriptPromisePropertyGarbageCollectedTest, Reset)
|
|||||||
EXPECT_EQ(0u, nOldResolveCalls);
|
EXPECT_EQ(0u, nOldResolveCalls);
|
||||||
EXPECT_EQ(0u, nNewRejectCalls);
|
EXPECT_EQ(0u, nNewRejectCalls);
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_EQ(1u, nOldResolveCalls);
|
EXPECT_EQ(1u, nOldResolveCalls);
|
||||||
EXPECT_EQ(1u, nNewRejectCalls);
|
EXPECT_EQ(1u, nNewRejectCalls);
|
||||||
EXPECT_NE(oldPromise, newPromise);
|
EXPECT_NE(oldPromise, newPromise);
|
||||||
@@ -445,7 +445,7 @@ TEST_F(ScriptPromisePropertyRefCountedTest, Resolve)
|
|||||||
getProperty()->resolve(value.get());
|
getProperty()->resolve(value.get());
|
||||||
EXPECT_EQ(Property::Resolved, getProperty()->getState());
|
EXPECT_EQ(Property::Resolved, getProperty()->getState());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_EQ(1u, nResolveCalls);
|
EXPECT_EQ(1u, nResolveCalls);
|
||||||
EXPECT_EQ(wrap(mainWorld(), value), actual);
|
EXPECT_EQ(wrap(mainWorld(), value), actual);
|
||||||
}
|
}
|
||||||
@@ -464,7 +464,7 @@ TEST_F(ScriptPromisePropertyRefCountedTest, Reject)
|
|||||||
getProperty()->reject(reason);
|
getProperty()->reject(reason);
|
||||||
EXPECT_EQ(Property::Rejected, getProperty()->getState());
|
EXPECT_EQ(Property::Rejected, getProperty()->getState());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_EQ(1u, nRejectCalls);
|
EXPECT_EQ(1u, nRejectCalls);
|
||||||
EXPECT_EQ(wrap(mainWorld(), reason), actual);
|
EXPECT_EQ(wrap(mainWorld(), reason), actual);
|
||||||
}
|
}
|
||||||
@@ -514,7 +514,7 @@ public:
|
|||||||
property->promise(DOMWrapperWorld::mainWorld()).then(stub(currentScriptState(), actualValue, nResolveCalls), notReached(currentScriptState()));
|
property->promise(DOMWrapperWorld::mainWorld()).then(stub(currentScriptState(), actualValue, nResolveCalls), notReached(currentScriptState()));
|
||||||
}
|
}
|
||||||
property->resolve(value);
|
property->resolve(value);
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
{
|
{
|
||||||
ScriptState::Scope scope(mainScriptState());
|
ScriptState::Scope scope(mainScriptState());
|
||||||
actual = toCoreString(actualValue.v8Value()->ToString(mainScriptState()->context()).ToLocalChecked());
|
actual = toCoreString(actualValue.v8Value()->ToString(mainScriptState()->context()).ToLocalChecked());
|
||||||
|
@@ -60,7 +60,7 @@ public:
|
|||||||
createClosure(callback, v8::Undefined(isolate()), isolate());
|
createClosure(callback, v8::Undefined(isolate()), isolate());
|
||||||
|
|
||||||
// Execute all pending microtasks
|
// Execute all pending microtasks
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
}
|
}
|
||||||
|
|
||||||
OwnPtr<DummyPageHolder> m_pageHolder;
|
OwnPtr<DummyPageHolder> m_pageHolder;
|
||||||
@@ -96,7 +96,7 @@ TEST_F(ScriptPromiseResolverTest, resolve)
|
|||||||
EXPECT_EQ(String(), onFulfilled);
|
EXPECT_EQ(String(), onFulfilled);
|
||||||
EXPECT_EQ(String(), onRejected);
|
EXPECT_EQ(String(), onRejected);
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ(String(), onFulfilled);
|
EXPECT_EQ(String(), onFulfilled);
|
||||||
EXPECT_EQ(String(), onRejected);
|
EXPECT_EQ(String(), onRejected);
|
||||||
@@ -111,14 +111,14 @@ TEST_F(ScriptPromiseResolverTest, resolve)
|
|||||||
EXPECT_EQ(String(), onFulfilled);
|
EXPECT_EQ(String(), onFulfilled);
|
||||||
EXPECT_EQ(String(), onRejected);
|
EXPECT_EQ(String(), onRejected);
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ("hello", onFulfilled);
|
EXPECT_EQ("hello", onFulfilled);
|
||||||
EXPECT_EQ(String(), onRejected);
|
EXPECT_EQ(String(), onRejected);
|
||||||
|
|
||||||
resolver->resolve("bye");
|
resolver->resolve("bye");
|
||||||
resolver->reject("bye");
|
resolver->reject("bye");
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ("hello", onFulfilled);
|
EXPECT_EQ("hello", onFulfilled);
|
||||||
EXPECT_EQ(String(), onRejected);
|
EXPECT_EQ(String(), onRejected);
|
||||||
@@ -144,7 +144,7 @@ TEST_F(ScriptPromiseResolverTest, reject)
|
|||||||
EXPECT_EQ(String(), onFulfilled);
|
EXPECT_EQ(String(), onFulfilled);
|
||||||
EXPECT_EQ(String(), onRejected);
|
EXPECT_EQ(String(), onRejected);
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ(String(), onFulfilled);
|
EXPECT_EQ(String(), onFulfilled);
|
||||||
EXPECT_EQ(String(), onRejected);
|
EXPECT_EQ(String(), onRejected);
|
||||||
@@ -159,14 +159,14 @@ TEST_F(ScriptPromiseResolverTest, reject)
|
|||||||
EXPECT_EQ(String(), onFulfilled);
|
EXPECT_EQ(String(), onFulfilled);
|
||||||
EXPECT_EQ(String(), onRejected);
|
EXPECT_EQ(String(), onRejected);
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ(String(), onFulfilled);
|
EXPECT_EQ(String(), onFulfilled);
|
||||||
EXPECT_EQ("hello", onRejected);
|
EXPECT_EQ("hello", onRejected);
|
||||||
|
|
||||||
resolver->resolve("bye");
|
resolver->resolve("bye");
|
||||||
resolver->reject("bye");
|
resolver->reject("bye");
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ(String(), onFulfilled);
|
EXPECT_EQ(String(), onFulfilled);
|
||||||
EXPECT_EQ("hello", onRejected);
|
EXPECT_EQ("hello", onRejected);
|
||||||
@@ -196,7 +196,7 @@ TEST_F(ScriptPromiseResolverTest, stop)
|
|||||||
}
|
}
|
||||||
|
|
||||||
resolver->resolve("hello");
|
resolver->resolve("hello");
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ(String(), onFulfilled);
|
EXPECT_EQ(String(), onFulfilled);
|
||||||
EXPECT_EQ(String(), onRejected);
|
EXPECT_EQ(String(), onRejected);
|
||||||
@@ -321,7 +321,7 @@ TEST_F(ScriptPromiseResolverTest, resolveVoid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
resolver->resolve();
|
resolver->resolve();
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ("undefined", onFulfilled);
|
EXPECT_EQ("undefined", onFulfilled);
|
||||||
EXPECT_EQ(String(), onRejected);
|
EXPECT_EQ(String(), onRejected);
|
||||||
@@ -345,7 +345,7 @@ TEST_F(ScriptPromiseResolverTest, rejectVoid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
resolver->reject();
|
resolver->reject();
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ(String(), onFulfilled);
|
EXPECT_EQ(String(), onFulfilled);
|
||||||
EXPECT_EQ("undefined", onRejected);
|
EXPECT_EQ("undefined", onRejected);
|
||||||
|
@@ -83,7 +83,7 @@ public:
|
|||||||
createClosure(callback, v8::Undefined(m_scope.isolate()), m_scope.isolate());
|
createClosure(callback, v8::Undefined(m_scope.isolate()), m_scope.isolate());
|
||||||
|
|
||||||
// Execute all pending microtasks
|
// Execute all pending microtasks
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
}
|
}
|
||||||
|
|
||||||
String toString(const ScriptValue& value)
|
String toString(const ScriptValue& value)
|
||||||
@@ -124,13 +124,13 @@ TEST_F(ScriptPromiseTest, thenResolve)
|
|||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_TRUE(onRejected.isEmpty());
|
EXPECT_TRUE(onRejected.isEmpty());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
resolver.resolve(v8String(isolate(), "hello"));
|
resolver.resolve(v8String(isolate(), "hello"));
|
||||||
|
|
||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_TRUE(onRejected.isEmpty());
|
EXPECT_TRUE(onRejected.isEmpty());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ("hello", toString(onFulfilled));
|
EXPECT_EQ("hello", toString(onFulfilled));
|
||||||
EXPECT_TRUE(onRejected.isEmpty());
|
EXPECT_TRUE(onRejected.isEmpty());
|
||||||
@@ -148,7 +148,7 @@ TEST_F(ScriptPromiseTest, resolveThen)
|
|||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_TRUE(onRejected.isEmpty());
|
EXPECT_TRUE(onRejected.isEmpty());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ("hello", toString(onFulfilled));
|
EXPECT_EQ("hello", toString(onFulfilled));
|
||||||
EXPECT_TRUE(onRejected.isEmpty());
|
EXPECT_TRUE(onRejected.isEmpty());
|
||||||
@@ -165,13 +165,13 @@ TEST_F(ScriptPromiseTest, thenReject)
|
|||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_TRUE(onRejected.isEmpty());
|
EXPECT_TRUE(onRejected.isEmpty());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
resolver.reject(v8String(isolate(), "hello"));
|
resolver.reject(v8String(isolate(), "hello"));
|
||||||
|
|
||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_TRUE(onRejected.isEmpty());
|
EXPECT_TRUE(onRejected.isEmpty());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_EQ("hello", toString(onRejected));
|
EXPECT_EQ("hello", toString(onRejected));
|
||||||
@@ -189,7 +189,7 @@ TEST_F(ScriptPromiseTest, rejectThen)
|
|||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_TRUE(onRejected.isEmpty());
|
EXPECT_TRUE(onRejected.isEmpty());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_EQ("hello", toString(onRejected));
|
EXPECT_EQ("hello", toString(onRejected));
|
||||||
@@ -226,7 +226,7 @@ TEST_F(ScriptPromiseTest, castNonPromise)
|
|||||||
EXPECT_TRUE(onRejected1.isEmpty());
|
EXPECT_TRUE(onRejected1.isEmpty());
|
||||||
EXPECT_TRUE(onRejected2.isEmpty());
|
EXPECT_TRUE(onRejected2.isEmpty());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ("hello", toString(onFulfilled1));
|
EXPECT_EQ("hello", toString(onFulfilled1));
|
||||||
EXPECT_EQ("hello", toString(onFulfilled2));
|
EXPECT_EQ("hello", toString(onFulfilled2));
|
||||||
@@ -248,7 +248,7 @@ TEST_F(ScriptPromiseTest, reject)
|
|||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_TRUE(onRejected.isEmpty());
|
EXPECT_TRUE(onRejected.isEmpty());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_EQ("hello", toString(onRejected));
|
EXPECT_EQ("hello", toString(onRejected));
|
||||||
@@ -264,7 +264,7 @@ TEST_F(ScriptPromiseTest, rejectWithExceptionState)
|
|||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_TRUE(onRejected.isEmpty());
|
EXPECT_TRUE(onRejected.isEmpty());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_EQ("SyntaxError: some syntax error", toString(onRejected));
|
EXPECT_EQ("SyntaxError: some syntax error", toString(onRejected));
|
||||||
@@ -282,7 +282,7 @@ TEST_F(ScriptPromiseTest, allWithEmptyPromises)
|
|||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_TRUE(onRejected.isEmpty());
|
EXPECT_TRUE(onRejected.isEmpty());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_FALSE(onFulfilled.isEmpty());
|
EXPECT_FALSE(onFulfilled.isEmpty());
|
||||||
EXPECT_TRUE(toStringArray(onFulfilled).isEmpty());
|
EXPECT_TRUE(toStringArray(onFulfilled).isEmpty());
|
||||||
@@ -304,7 +304,7 @@ TEST_F(ScriptPromiseTest, allWithResolvedPromises)
|
|||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_TRUE(onRejected.isEmpty());
|
EXPECT_TRUE(onRejected.isEmpty());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_FALSE(onFulfilled.isEmpty());
|
EXPECT_FALSE(onFulfilled.isEmpty());
|
||||||
Vector<String> values = toStringArray(onFulfilled);
|
Vector<String> values = toStringArray(onFulfilled);
|
||||||
@@ -329,7 +329,7 @@ TEST_F(ScriptPromiseTest, allWithRejectedPromise)
|
|||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_TRUE(onRejected.isEmpty());
|
EXPECT_TRUE(onRejected.isEmpty());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(onFulfilled.isEmpty());
|
EXPECT_TRUE(onFulfilled.isEmpty());
|
||||||
EXPECT_FALSE(onRejected.isEmpty());
|
EXPECT_FALSE(onRejected.isEmpty());
|
||||||
|
@@ -321,7 +321,7 @@ static void initializeV8Common(v8::Isolate* isolate)
|
|||||||
|
|
||||||
v8::Debug::SetLiveEditEnabled(isolate, false);
|
v8::Debug::SetLiveEditEnabled(isolate, false);
|
||||||
|
|
||||||
isolate->SetAutorunMicrotasks(false);
|
isolate->SetMicrotasksPolicy(v8::MicrotasksPolicy::kScoped);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@@ -30,7 +30,6 @@
|
|||||||
#include "bindings/core/v8/V8Binding.h"
|
#include "bindings/core/v8/V8Binding.h"
|
||||||
#include "bindings/core/v8/V8HiddenValue.h"
|
#include "bindings/core/v8/V8HiddenValue.h"
|
||||||
#include "bindings/core/v8/V8ObjectConstructor.h"
|
#include "bindings/core/v8/V8ObjectConstructor.h"
|
||||||
#include "bindings/core/v8/V8RecursionScope.h"
|
|
||||||
#include "bindings/core/v8/V8ScriptRunner.h"
|
#include "bindings/core/v8/V8ScriptRunner.h"
|
||||||
#include "core/frame/Deprecation.h"
|
#include "core/frame/Deprecation.h"
|
||||||
#include "core/inspector/MainThreadDebugger.h"
|
#include "core/inspector/MainThreadDebugger.h"
|
||||||
@@ -53,18 +52,6 @@ static void microtasksCompletedCallback(v8::Isolate* isolate)
|
|||||||
V8PerIsolateData::from(isolate)->runEndOfScopeTasks();
|
V8PerIsolateData::from(isolate)->runEndOfScopeTasks();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLE(ASSERT)
|
|
||||||
static void assertV8RecursionScope(v8::Isolate* isolate)
|
|
||||||
{
|
|
||||||
ASSERT(V8RecursionScope::properlyUsed(isolate));
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool runningUnitTest()
|
|
||||||
{
|
|
||||||
return Platform::current()->unitTestSupport();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void useCounterCallback(v8::Isolate* isolate, v8::Isolate::UseCounterFeature feature)
|
static void useCounterCallback(v8::Isolate* isolate, v8::Isolate::UseCounterFeature feature)
|
||||||
{
|
{
|
||||||
UseCounter::Feature blinkFeature;
|
UseCounter::Feature blinkFeature;
|
||||||
@@ -143,25 +130,15 @@ static void useCounterCallback(v8::Isolate* isolate, v8::Isolate::UseCounterFeat
|
|||||||
}
|
}
|
||||||
|
|
||||||
V8PerIsolateData::V8PerIsolateData()
|
V8PerIsolateData::V8PerIsolateData()
|
||||||
: m_destructionPending(false)
|
: m_isolateHolder(adoptPtr(new gin::IsolateHolder()))
|
||||||
, m_isolateHolder(adoptPtr(new gin::IsolateHolder()))
|
|
||||||
, m_stringCache(adoptPtr(new StringCache(isolate())))
|
, m_stringCache(adoptPtr(new StringCache(isolate())))
|
||||||
, m_hiddenValue(V8HiddenValue::create())
|
, m_hiddenValue(V8HiddenValue::create())
|
||||||
, m_constructorMode(ConstructorMode::CreateNewObject)
|
, m_constructorMode(ConstructorMode::CreateNewObject)
|
||||||
, m_recursionLevel(0)
|
|
||||||
, m_isHandlingRecursionLevelError(false)
|
, m_isHandlingRecursionLevelError(false)
|
||||||
, m_isReportingException(false)
|
, m_isReportingException(false)
|
||||||
#if ENABLE(ASSERT)
|
|
||||||
, m_internalScriptRecursionLevel(0)
|
|
||||||
#endif
|
|
||||||
, m_performingMicrotaskCheckpoint(false)
|
|
||||||
{
|
{
|
||||||
// FIXME: Remove once all v8::Isolate::GetCurrent() calls are gone.
|
// FIXME: Remove once all v8::Isolate::GetCurrent() calls are gone.
|
||||||
isolate()->Enter();
|
isolate()->Enter();
|
||||||
#if ENABLE(ASSERT)
|
|
||||||
if (!runningUnitTest())
|
|
||||||
isolate()->AddCallCompletedCallback(&assertV8RecursionScope);
|
|
||||||
#endif
|
|
||||||
isolate()->AddBeforeCallEnteredCallback(&beforeCallEnteredCallback);
|
isolate()->AddBeforeCallEnteredCallback(&beforeCallEnteredCallback);
|
||||||
isolate()->AddMicrotasksCompletedCallback(µtasksCompletedCallback);
|
isolate()->AddMicrotasksCompletedCallback(µtasksCompletedCallback);
|
||||||
if (isMainThread())
|
if (isMainThread())
|
||||||
@@ -206,9 +183,6 @@ void V8PerIsolateData::willBeDestroyed(v8::Isolate* isolate)
|
|||||||
{
|
{
|
||||||
V8PerIsolateData* data = from(isolate);
|
V8PerIsolateData* data = from(isolate);
|
||||||
|
|
||||||
ASSERT(!data->m_destructionPending);
|
|
||||||
data->m_destructionPending = true;
|
|
||||||
|
|
||||||
data->m_threadDebugger.clear();
|
data->m_threadDebugger.clear();
|
||||||
// Clear any data that may have handles into the heap,
|
// Clear any data that may have handles into the heap,
|
||||||
// prior to calling ThreadState::detach().
|
// prior to calling ThreadState::detach().
|
||||||
@@ -219,10 +193,6 @@ void V8PerIsolateData::willBeDestroyed(v8::Isolate* isolate)
|
|||||||
// gets called but before the Isolate exits.
|
// gets called but before the Isolate exits.
|
||||||
void V8PerIsolateData::destroy(v8::Isolate* isolate)
|
void V8PerIsolateData::destroy(v8::Isolate* isolate)
|
||||||
{
|
{
|
||||||
#if ENABLE(ASSERT)
|
|
||||||
if (!runningUnitTest())
|
|
||||||
isolate->RemoveCallCompletedCallback(&assertV8RecursionScope);
|
|
||||||
#endif
|
|
||||||
isolate->RemoveBeforeCallEnteredCallback(&beforeCallEnteredCallback);
|
isolate->RemoveBeforeCallEnteredCallback(&beforeCallEnteredCallback);
|
||||||
isolate->RemoveMicrotasksCompletedCallback(µtasksCompletedCallback);
|
isolate->RemoveMicrotasksCompletedCallback(µtasksCompletedCallback);
|
||||||
V8PerIsolateData* data = from(isolate);
|
V8PerIsolateData* data = from(isolate);
|
||||||
|
@@ -74,31 +74,18 @@ public:
|
|||||||
|
|
||||||
static void enableIdleTasks(v8::Isolate*, PassOwnPtr<gin::V8IdleTaskRunner>);
|
static void enableIdleTasks(v8::Isolate*, PassOwnPtr<gin::V8IdleTaskRunner>);
|
||||||
|
|
||||||
bool destructionPending() const { return m_destructionPending; }
|
|
||||||
v8::Isolate* isolate() { return m_isolateHolder->isolate(); }
|
v8::Isolate* isolate() { return m_isolateHolder->isolate(); }
|
||||||
|
|
||||||
StringCache* getStringCache() { return m_stringCache.get(); }
|
StringCache* getStringCache() { return m_stringCache.get(); }
|
||||||
|
|
||||||
v8::Persistent<v8::Value>& ensureLiveRoot();
|
v8::Persistent<v8::Value>& ensureLiveRoot();
|
||||||
|
|
||||||
int recursionLevel() const { return m_recursionLevel; }
|
|
||||||
int incrementRecursionLevel() { return ++m_recursionLevel; }
|
|
||||||
int decrementRecursionLevel() { return --m_recursionLevel; }
|
|
||||||
bool isHandlingRecursionLevelError() const { return m_isHandlingRecursionLevelError; }
|
bool isHandlingRecursionLevelError() const { return m_isHandlingRecursionLevelError; }
|
||||||
void setIsHandlingRecursionLevelError(bool value) { m_isHandlingRecursionLevelError = value; }
|
void setIsHandlingRecursionLevelError(bool value) { m_isHandlingRecursionLevelError = value; }
|
||||||
|
|
||||||
bool isReportingException() const { return m_isReportingException; }
|
bool isReportingException() const { return m_isReportingException; }
|
||||||
void setReportingException(bool value) { m_isReportingException = value; }
|
void setReportingException(bool value) { m_isReportingException = value; }
|
||||||
|
|
||||||
bool performingMicrotaskCheckpoint() const { return m_performingMicrotaskCheckpoint; }
|
|
||||||
void setPerformingMicrotaskCheckpoint(bool performingMicrotaskCheckpoint) { m_performingMicrotaskCheckpoint = performingMicrotaskCheckpoint; }
|
|
||||||
|
|
||||||
#if ENABLE(ASSERT)
|
|
||||||
int internalScriptRecursionLevel() const { return m_internalScriptRecursionLevel; }
|
|
||||||
int incrementInternalScriptRecursionLevel() { return ++m_internalScriptRecursionLevel; }
|
|
||||||
int decrementInternalScriptRecursionLevel() { return --m_internalScriptRecursionLevel; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
V8HiddenValue* hiddenValue() { return m_hiddenValue.get(); }
|
V8HiddenValue* hiddenValue() { return m_hiddenValue.get(); }
|
||||||
|
|
||||||
v8::Local<v8::FunctionTemplate> domTemplate(const void* domTemplateKey, v8::FunctionCallback = 0, v8::Local<v8::Value> data = v8::Local<v8::Value>(), v8::Local<v8::Signature> = v8::Local<v8::Signature>(), int length = 0);
|
v8::Local<v8::FunctionTemplate> domTemplate(const void* domTemplateKey, v8::FunctionCallback = 0, v8::Local<v8::Value> data = v8::Local<v8::Value>(), v8::Local<v8::Signature> = v8::Local<v8::Signature>(), int length = 0);
|
||||||
@@ -131,7 +118,6 @@ private:
|
|||||||
bool hasInstance(const WrapperTypeInfo* untrusted, v8::Local<v8::Value>, DOMTemplateMap&);
|
bool hasInstance(const WrapperTypeInfo* untrusted, v8::Local<v8::Value>, DOMTemplateMap&);
|
||||||
v8::Local<v8::Object> findInstanceInPrototypeChain(const WrapperTypeInfo*, v8::Local<v8::Value>, DOMTemplateMap&);
|
v8::Local<v8::Object> findInstanceInPrototypeChain(const WrapperTypeInfo*, v8::Local<v8::Value>, DOMTemplateMap&);
|
||||||
|
|
||||||
bool m_destructionPending;
|
|
||||||
OwnPtr<gin::IsolateHolder> m_isolateHolder;
|
OwnPtr<gin::IsolateHolder> m_isolateHolder;
|
||||||
DOMTemplateMap m_domTemplateMapForMainWorld;
|
DOMTemplateMap m_domTemplateMapForMainWorld;
|
||||||
DOMTemplateMap m_domTemplateMapForNonMainWorld;
|
DOMTemplateMap m_domTemplateMapForNonMainWorld;
|
||||||
@@ -143,15 +129,9 @@ private:
|
|||||||
bool m_constructorMode;
|
bool m_constructorMode;
|
||||||
friend class ConstructorMode;
|
friend class ConstructorMode;
|
||||||
|
|
||||||
int m_recursionLevel;
|
|
||||||
bool m_isHandlingRecursionLevelError;
|
bool m_isHandlingRecursionLevelError;
|
||||||
bool m_isReportingException;
|
bool m_isReportingException;
|
||||||
|
|
||||||
#if ENABLE(ASSERT)
|
|
||||||
int m_internalScriptRecursionLevel;
|
|
||||||
#endif
|
|
||||||
bool m_performingMicrotaskCheckpoint;
|
|
||||||
|
|
||||||
Vector<OwnPtr<EndOfScopeTask>> m_endOfScopeTasks;
|
Vector<OwnPtr<EndOfScopeTask>> m_endOfScopeTasks;
|
||||||
OwnPtr<ThreadDebugger> m_threadDebugger;
|
OwnPtr<ThreadDebugger> m_threadDebugger;
|
||||||
};
|
};
|
||||||
|
@@ -30,13 +30,6 @@
|
|||||||
|
|
||||||
#include "bindings/core/v8/V8RecursionScope.h"
|
#include "bindings/core/v8/V8RecursionScope.h"
|
||||||
|
|
||||||
#include "core/dom/Microtask.h"
|
|
||||||
|
|
||||||
namespace blink {
|
namespace blink {
|
||||||
|
|
||||||
void V8RecursionScope::didLeaveScriptContext()
|
|
||||||
{
|
|
||||||
Microtask::performCheckpoint(m_isolate);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace blink
|
} // namespace blink
|
||||||
|
@@ -59,63 +59,39 @@ class CORE_EXPORT V8RecursionScope {
|
|||||||
STACK_ALLOCATED();
|
STACK_ALLOCATED();
|
||||||
public:
|
public:
|
||||||
explicit V8RecursionScope(v8::Isolate* isolate)
|
explicit V8RecursionScope(v8::Isolate* isolate)
|
||||||
: m_isolate(isolate)
|
: m_scope(isolate, v8::MicrotasksScope::kRunMicrotasks)
|
||||||
{
|
{
|
||||||
V8PerIsolateData::from(m_isolate)->incrementRecursionLevel();
|
ASSERT(isolate->GetMicrotasksPolicy() == v8::MicrotasksPolicy::kScoped);
|
||||||
// If you want V8 to autorun microtasks, this class needs to have a
|
|
||||||
// v8::Isolate::SuppressMicrotaskExecutionScope member.
|
|
||||||
ASSERT(!isolate->WillAutorunMicrotasks());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~V8RecursionScope()
|
~V8RecursionScope()
|
||||||
{
|
{
|
||||||
if (!V8PerIsolateData::from(m_isolate)->decrementRecursionLevel())
|
|
||||||
didLeaveScriptContext();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int recursionLevel(v8::Isolate* isolate)
|
static int recursionLevel(v8::Isolate* isolate)
|
||||||
{
|
{
|
||||||
return V8PerIsolateData::from(isolate)->recursionLevel();
|
return v8::MicrotasksScope::GetCurrentDepth(isolate);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLE(ASSERT)
|
|
||||||
static bool properlyUsed(v8::Isolate* isolate)
|
|
||||||
{
|
|
||||||
return recursionLevel(isolate) > 0 || V8PerIsolateData::from(isolate)->internalScriptRecursionLevel() > 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class MicrotaskSuppression {
|
class MicrotaskSuppression {
|
||||||
USING_FAST_MALLOC(MicrotaskSuppression);
|
USING_FAST_MALLOC(MicrotaskSuppression);
|
||||||
WTF_MAKE_NONCOPYABLE(MicrotaskSuppression);
|
WTF_MAKE_NONCOPYABLE(MicrotaskSuppression);
|
||||||
public:
|
public:
|
||||||
MicrotaskSuppression(v8::Isolate* isolate)
|
explicit MicrotaskSuppression(v8::Isolate* isolate)
|
||||||
#if ENABLE(ASSERT)
|
: m_scope(isolate, v8::MicrotasksScope::kDoNotRunMicrotasks)
|
||||||
: m_isolate(isolate)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
#if ENABLE(ASSERT)
|
|
||||||
V8PerIsolateData::from(m_isolate)->incrementInternalScriptRecursionLevel();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~MicrotaskSuppression()
|
~MicrotaskSuppression()
|
||||||
{
|
{
|
||||||
#if ENABLE(ASSERT)
|
|
||||||
V8PerIsolateData::from(m_isolate)->decrementInternalScriptRecursionLevel();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#if ENABLE(ASSERT)
|
v8::MicrotasksScope m_scope;
|
||||||
v8::Isolate* m_isolate;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void didLeaveScriptContext();
|
v8::MicrotasksScope m_scope;
|
||||||
|
|
||||||
v8::Isolate* m_isolate;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace blink
|
} // namespace blink
|
||||||
|
@@ -40,13 +40,9 @@ namespace blink {
|
|||||||
|
|
||||||
void Microtask::performCheckpoint(v8::Isolate* isolate)
|
void Microtask::performCheckpoint(v8::Isolate* isolate)
|
||||||
{
|
{
|
||||||
V8PerIsolateData* isolateData = V8PerIsolateData::from(isolate);
|
if (ScriptForbiddenScope::isScriptForbidden())
|
||||||
ASSERT(isolateData);
|
|
||||||
if (isolateData->recursionLevel() || isolateData->performingMicrotaskCheckpoint() || isolateData->destructionPending() || ScriptForbiddenScope::isScriptForbidden())
|
|
||||||
return;
|
return;
|
||||||
isolateData->setPerformingMicrotaskCheckpoint(true);
|
v8::MicrotasksScope::PerformCheckpoint(isolate);
|
||||||
isolate->RunMicrotasks();
|
|
||||||
isolateData->setPerformingMicrotaskCheckpoint(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void microtaskFunctionCallback(void* data)
|
static void microtaskFunctionCallback(void* data)
|
||||||
|
@@ -179,7 +179,7 @@ TEST_F(ReadableStreamReaderTest, Release)
|
|||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_EQ("AbortError: the reader is already released", onRejected);
|
EXPECT_EQ("AbortError: the reader is already released", onRejected);
|
||||||
|
|
||||||
@@ -208,7 +208,7 @@ TEST_F(ReadableStreamReaderTest, ReadAfterRelease)
|
|||||||
|
|
||||||
EXPECT_FALSE(result.isSet);
|
EXPECT_FALSE(result.isSet);
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_FALSE(result.isSet);
|
EXPECT_FALSE(result.isSet);
|
||||||
EXPECT_EQ("TypeError: the reader is already released", onRejected);
|
EXPECT_EQ("TypeError: the reader is already released", onRejected);
|
||||||
@@ -250,7 +250,7 @@ TEST_F(ReadableStreamReaderTest, EnqueueThenRead)
|
|||||||
EXPECT_FALSE(result.isSet);
|
EXPECT_FALSE(result.isSet);
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(result.isSet);
|
EXPECT_TRUE(result.isSet);
|
||||||
EXPECT_FALSE(result.isDone);
|
EXPECT_FALSE(result.isDone);
|
||||||
@@ -264,7 +264,7 @@ TEST_F(ReadableStreamReaderTest, EnqueueThenRead)
|
|||||||
EXPECT_FALSE(result2.isSet);
|
EXPECT_FALSE(result2.isSet);
|
||||||
EXPECT_TRUE(onRejected2.isNull());
|
EXPECT_TRUE(onRejected2.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(result2.isSet);
|
EXPECT_TRUE(result2.isSet);
|
||||||
EXPECT_FALSE(result2.isDone);
|
EXPECT_FALSE(result2.isDone);
|
||||||
@@ -290,7 +290,7 @@ TEST_F(ReadableStreamReaderTest, ReadThenEnqueue)
|
|||||||
EXPECT_FALSE(result2.isSet);
|
EXPECT_FALSE(result2.isSet);
|
||||||
EXPECT_TRUE(onRejected2.isNull());
|
EXPECT_TRUE(onRejected2.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_FALSE(result.isSet);
|
EXPECT_FALSE(result.isSet);
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
@@ -298,7 +298,7 @@ TEST_F(ReadableStreamReaderTest, ReadThenEnqueue)
|
|||||||
EXPECT_TRUE(onRejected2.isNull());
|
EXPECT_TRUE(onRejected2.isNull());
|
||||||
|
|
||||||
m_stream->enqueue("hello");
|
m_stream->enqueue("hello");
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(result.isSet);
|
EXPECT_TRUE(result.isSet);
|
||||||
EXPECT_FALSE(result.isDone);
|
EXPECT_FALSE(result.isDone);
|
||||||
@@ -308,7 +308,7 @@ TEST_F(ReadableStreamReaderTest, ReadThenEnqueue)
|
|||||||
EXPECT_TRUE(onRejected2.isNull());
|
EXPECT_TRUE(onRejected2.isNull());
|
||||||
|
|
||||||
m_stream->enqueue("world");
|
m_stream->enqueue("world");
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(result2.isSet);
|
EXPECT_TRUE(result2.isSet);
|
||||||
EXPECT_FALSE(result2.isDone);
|
EXPECT_FALSE(result2.isDone);
|
||||||
@@ -330,7 +330,7 @@ TEST_F(ReadableStreamReaderTest, ClosedReader)
|
|||||||
String onClosedFulfilled, onClosedRejected;
|
String onClosedFulfilled, onClosedRejected;
|
||||||
ReadResult result;
|
ReadResult result;
|
||||||
String onReadRejected;
|
String onReadRejected;
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
reader->closed(getScriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected));
|
reader->closed(getScriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected));
|
||||||
reader->read(getScriptState()).then(createResultCaptor(&result), createCaptor(&onReadRejected));
|
reader->read(getScriptState()).then(createResultCaptor(&result), createCaptor(&onReadRejected));
|
||||||
EXPECT_TRUE(onClosedFulfilled.isNull());
|
EXPECT_TRUE(onClosedFulfilled.isNull());
|
||||||
@@ -338,7 +338,7 @@ TEST_F(ReadableStreamReaderTest, ClosedReader)
|
|||||||
EXPECT_FALSE(result.isSet);
|
EXPECT_FALSE(result.isSet);
|
||||||
EXPECT_TRUE(onReadRejected.isNull());
|
EXPECT_TRUE(onReadRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_EQ("undefined", onClosedFulfilled);
|
EXPECT_EQ("undefined", onClosedFulfilled);
|
||||||
EXPECT_TRUE(onClosedRejected.isNull());
|
EXPECT_TRUE(onClosedRejected.isNull());
|
||||||
EXPECT_TRUE(result.isSet);
|
EXPECT_TRUE(result.isSet);
|
||||||
@@ -361,7 +361,7 @@ TEST_F(ReadableStreamReaderTest, ErroredReader)
|
|||||||
|
|
||||||
String onClosedFulfilled, onClosedRejected;
|
String onClosedFulfilled, onClosedRejected;
|
||||||
String onReadFulfilled, onReadRejected;
|
String onReadFulfilled, onReadRejected;
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
reader->closed(getScriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected));
|
reader->closed(getScriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected));
|
||||||
reader->read(getScriptState()).then(createCaptor(&onReadFulfilled), createCaptor(&onReadRejected));
|
reader->read(getScriptState()).then(createCaptor(&onReadFulfilled), createCaptor(&onReadRejected));
|
||||||
EXPECT_TRUE(onClosedFulfilled.isNull());
|
EXPECT_TRUE(onClosedFulfilled.isNull());
|
||||||
@@ -369,7 +369,7 @@ TEST_F(ReadableStreamReaderTest, ErroredReader)
|
|||||||
EXPECT_TRUE(onReadFulfilled.isNull());
|
EXPECT_TRUE(onReadFulfilled.isNull());
|
||||||
EXPECT_TRUE(onReadRejected.isNull());
|
EXPECT_TRUE(onReadRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_TRUE(onClosedFulfilled.isNull());
|
EXPECT_TRUE(onClosedFulfilled.isNull());
|
||||||
EXPECT_EQ("SyntaxError: some error", onClosedRejected);
|
EXPECT_EQ("SyntaxError: some error", onClosedRejected);
|
||||||
EXPECT_TRUE(onReadFulfilled.isNull());
|
EXPECT_TRUE(onReadFulfilled.isNull());
|
||||||
@@ -389,7 +389,7 @@ TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeResolvedWhenClosed)
|
|||||||
reader->read(getScriptState()).then(createResultCaptor(&result), createCaptor(&onRejected));
|
reader->read(getScriptState()).then(createResultCaptor(&result), createCaptor(&onRejected));
|
||||||
reader->read(getScriptState()).then(createResultCaptor(&result2), createCaptor(&onRejected2));
|
reader->read(getScriptState()).then(createResultCaptor(&result2), createCaptor(&onRejected2));
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_FALSE(result.isSet);
|
EXPECT_FALSE(result.isSet);
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
EXPECT_FALSE(result2.isSet);
|
EXPECT_FALSE(result2.isSet);
|
||||||
@@ -401,7 +401,7 @@ TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeResolvedWhenClosed)
|
|||||||
EXPECT_FALSE(result2.isSet);
|
EXPECT_FALSE(result2.isSet);
|
||||||
EXPECT_TRUE(onRejected2.isNull());
|
EXPECT_TRUE(onRejected2.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(result.isSet);
|
EXPECT_TRUE(result.isSet);
|
||||||
EXPECT_TRUE(result.isDone);
|
EXPECT_TRUE(result.isDone);
|
||||||
@@ -427,7 +427,7 @@ TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeRejectedWhenErrored)
|
|||||||
reader->read(getScriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected));
|
reader->read(getScriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected));
|
||||||
reader->read(getScriptState()).then(createCaptor(&onFulfilled2), createCaptor(&onRejected2));
|
reader->read(getScriptState()).then(createCaptor(&onFulfilled2), createCaptor(&onRejected2));
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
EXPECT_TRUE(onFulfilled2.isNull());
|
EXPECT_TRUE(onFulfilled2.isNull());
|
||||||
@@ -439,7 +439,7 @@ TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeRejectedWhenErrored)
|
|||||||
EXPECT_TRUE(onFulfilled2.isNull());
|
EXPECT_TRUE(onFulfilled2.isNull());
|
||||||
EXPECT_TRUE(onRejected2.isNull());
|
EXPECT_TRUE(onRejected2.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_EQ(onRejected, "SyntaxError: some error");
|
EXPECT_EQ(onRejected, "SyntaxError: some error");
|
||||||
@@ -460,7 +460,7 @@ TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeResolvedWhenCanceled)
|
|||||||
reader->read(getScriptState()).then(createResultCaptor(&result), createCaptor(&onRejected));
|
reader->read(getScriptState()).then(createResultCaptor(&result), createCaptor(&onRejected));
|
||||||
reader->read(getScriptState()).then(createResultCaptor(&result2), createCaptor(&onRejected2));
|
reader->read(getScriptState()).then(createResultCaptor(&result2), createCaptor(&onRejected2));
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_FALSE(result.isSet);
|
EXPECT_FALSE(result.isSet);
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
EXPECT_FALSE(result2.isSet);
|
EXPECT_FALSE(result2.isSet);
|
||||||
@@ -473,7 +473,7 @@ TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeResolvedWhenCanceled)
|
|||||||
EXPECT_FALSE(result2.isSet);
|
EXPECT_FALSE(result2.isSet);
|
||||||
EXPECT_TRUE(onRejected2.isNull());
|
EXPECT_TRUE(onRejected2.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(result.isSet);
|
EXPECT_TRUE(result.isSet);
|
||||||
EXPECT_TRUE(result.isDone);
|
EXPECT_TRUE(result.isDone);
|
||||||
@@ -502,7 +502,7 @@ TEST_F(ReadableStreamReaderTest, CancelShouldNotWorkWhenNotActive)
|
|||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_EQ("TypeError: the reader is already released", onRejected);
|
EXPECT_EQ("TypeError: the reader is already released", onRejected);
|
||||||
@@ -528,7 +528,7 @@ TEST_F(ReadableStreamReaderTest, Cancel)
|
|||||||
EXPECT_TRUE(onCancelFulfilled.isNull());
|
EXPECT_TRUE(onCancelFulfilled.isNull());
|
||||||
EXPECT_TRUE(onCancelRejected.isNull());
|
EXPECT_TRUE(onCancelRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_EQ("undefined", onClosedFulfilled);
|
EXPECT_EQ("undefined", onClosedFulfilled);
|
||||||
EXPECT_TRUE(onClosedRejected.isNull());
|
EXPECT_TRUE(onClosedRejected.isNull());
|
||||||
EXPECT_EQ("undefined", onCancelFulfilled);
|
EXPECT_EQ("undefined", onCancelFulfilled);
|
||||||
@@ -552,7 +552,7 @@ TEST_F(ReadableStreamReaderTest, Close)
|
|||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_EQ("undefined", onFulfilled);
|
EXPECT_EQ("undefined", onFulfilled);
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
EXPECT_FALSE(exceptionState.hadException());
|
EXPECT_FALSE(exceptionState.hadException());
|
||||||
@@ -574,7 +574,7 @@ TEST_F(ReadableStreamReaderTest, Error)
|
|||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_EQ("SyntaxError: some error", onRejected);
|
EXPECT_EQ("SyntaxError: some error", onRejected);
|
||||||
EXPECT_FALSE(exceptionState.hadException());
|
EXPECT_FALSE(exceptionState.hadException());
|
||||||
|
@@ -304,7 +304,7 @@ TEST_F(ReadableStreamTest, CloseWhenReadable)
|
|||||||
|
|
||||||
stream->read(getScriptState());
|
stream->read(getScriptState());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
|
EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
|
||||||
EXPECT_FALSE(stream->isPulling());
|
EXPECT_FALSE(stream->isPulling());
|
||||||
@@ -335,7 +335,7 @@ TEST_F(ReadableStreamTest, CancelWhenClosed)
|
|||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_EQ("undefined", onFulfilled);
|
EXPECT_EQ("undefined", onFulfilled);
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
}
|
}
|
||||||
@@ -358,7 +358,7 @@ TEST_F(ReadableStreamTest, CancelWhenErrored)
|
|||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_EQ("NotFoundError: error", onRejected);
|
EXPECT_EQ("NotFoundError: error", onRejected);
|
||||||
}
|
}
|
||||||
@@ -392,7 +392,7 @@ TEST_F(ReadableStreamTest, CancelWhenReadable)
|
|||||||
EXPECT_TRUE(onCancelFulfilled.isNull());
|
EXPECT_TRUE(onCancelFulfilled.isNull());
|
||||||
EXPECT_TRUE(onCancelRejected.isNull());
|
EXPECT_TRUE(onCancelRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_EQ("undefined", onCancelFulfilled);
|
EXPECT_EQ("undefined", onCancelFulfilled);
|
||||||
EXPECT_TRUE(onCancelRejected.isNull());
|
EXPECT_TRUE(onCancelRejected.isNull());
|
||||||
}
|
}
|
||||||
@@ -416,7 +416,7 @@ TEST_F(ReadableStreamTest, CancelWhenLocked)
|
|||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
|
|
||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_EQ("TypeError: this stream is locked to a ReadableStreamReader", onRejected);
|
EXPECT_EQ("TypeError: this stream is locked to a ReadableStreamReader", onRejected);
|
||||||
@@ -563,7 +563,7 @@ TEST_F(ReadableStreamTest, GetClosedReader)
|
|||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_EQ("undefined", onFulfilled);
|
EXPECT_EQ("undefined", onFulfilled);
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
}
|
}
|
||||||
@@ -586,7 +586,7 @@ TEST_F(ReadableStreamTest, GetErroredReader)
|
|||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_TRUE(onRejected.isNull());
|
EXPECT_TRUE(onRejected.isNull());
|
||||||
|
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
EXPECT_TRUE(onFulfilled.isNull());
|
EXPECT_TRUE(onFulfilled.isNull());
|
||||||
EXPECT_EQ("SyntaxError: some error", onRejected);
|
EXPECT_EQ("SyntaxError: some error", onRejected);
|
||||||
}
|
}
|
||||||
|
@@ -249,7 +249,7 @@ public:
|
|||||||
{
|
{
|
||||||
ScriptValue onReject;
|
ScriptValue onReject;
|
||||||
promise.then(UnreachableFunction::create(getScriptState()), TestFunction::create(getScriptState(), &onReject));
|
promise.then(UnreachableFunction::create(getScriptState()), TestFunction::create(getScriptState(), &onReject));
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
return onReject;
|
return onReject;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -263,7 +263,7 @@ public:
|
|||||||
{
|
{
|
||||||
ScriptValue onResolve;
|
ScriptValue onResolve;
|
||||||
promise.then(TestFunction::create(getScriptState(), &onResolve), UnreachableFunction::create(getScriptState()));
|
promise.then(TestFunction::create(getScriptState(), &onResolve), UnreachableFunction::create(getScriptState()));
|
||||||
isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(isolate());
|
||||||
return onResolve;
|
return onResolve;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
#include "bindings/core/v8/ScriptState.h"
|
#include "bindings/core/v8/ScriptState.h"
|
||||||
#include "bindings/core/v8/V8BindingMacros.h"
|
#include "bindings/core/v8/V8BindingMacros.h"
|
||||||
#include "bindings/core/v8/V8GCController.h"
|
#include "bindings/core/v8/V8GCController.h"
|
||||||
|
#include "bindings/core/v8/V8RecursionScope.h"
|
||||||
#include "core/dom/Document.h"
|
#include "core/dom/Document.h"
|
||||||
#include "core/testing/DummyPageHolder.h"
|
#include "core/testing/DummyPageHolder.h"
|
||||||
#include "modules/fetch/DataConsumerHandleTestUtil.h"
|
#include "modules/fetch/DataConsumerHandleTestUtil.h"
|
||||||
@@ -59,6 +60,7 @@ public:
|
|||||||
{
|
{
|
||||||
v8::Local<v8::String> source;
|
v8::Local<v8::String> source;
|
||||||
v8::Local<v8::Script> script;
|
v8::Local<v8::Script> script;
|
||||||
|
V8RecursionScope::MicrotaskSuppression microtasks(isolate());
|
||||||
if (!v8Call(v8::String::NewFromUtf8(isolate(), s, v8::NewStringType::kNormal), source)) {
|
if (!v8Call(v8::String::NewFromUtf8(isolate(), s, v8::NewStringType::kNormal), source)) {
|
||||||
ADD_FAILURE();
|
ADD_FAILURE();
|
||||||
return v8::MaybeLocal<v8::Value>();
|
return v8::MaybeLocal<v8::Value>();
|
||||||
|
@@ -92,7 +92,7 @@ void expectRejected(ScriptState* scriptState, ScriptPromise& promise, const Scri
|
|||||||
{
|
{
|
||||||
StubScriptFunction resolved, rejected;
|
StubScriptFunction resolved, rejected;
|
||||||
promise.then(resolved.function(scriptState), rejected.function(scriptState));
|
promise.then(resolved.function(scriptState), rejected.function(scriptState));
|
||||||
promise.isolate()->RunMicrotasks();
|
v8::MicrotasksScope::PerformCheckpoint(promise.isolate());
|
||||||
EXPECT_EQ(0ul, resolved.callCount());
|
EXPECT_EQ(0ul, resolved.callCount());
|
||||||
EXPECT_EQ(1ul, rejected.callCount());
|
EXPECT_EQ(1ul, rejected.callCount());
|
||||||
if (rejected.callCount())
|
if (rejected.callCount())
|
||||||
|
Reference in New Issue
Block a user