0

Use new v8::Exception::CaptureStackTrace() API for DOMException stacks, attempt

Change-Id: I0bd5824f27c7915f6bf4084853d8b83fb4440bd7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5777167
Commit-Queue: Nate Chapin <japhet@chromium.org>
Reviewed-by: Demetrios Papadopoulos <dpapad@chromium.org>
Reviewed-by: Cammie Smith Barnes <cammie@chromium.org>
Reviewed-by: Andrey Kosyakov <caseq@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1352339}
This commit is contained in:
Nate Chapin
2024-09-06 22:28:38 +00:00
committed by Chromium LUCI CQ
parent fa440c1c2b
commit 18172e3453
11 changed files with 55 additions and 98 deletions
chrome/browser/storage
content/browser
headless/test/data/protocol/sanity
third_party/blink

@ -196,17 +196,17 @@ MakeFilter(std::vector<std::string> possible_last_messages) {
}
std::string GetSharedStorageDisabledErrorMessage() {
return base::StrCat({"a JavaScript error: \"Error: ",
return base::StrCat({"a JavaScript error: \"OperationError: ",
content::GetSharedStorageDisabledMessage()});
}
std::string GetSharedStorageSelectURLDisabledErrorMessage() {
return base::StrCat({"a JavaScript error: \"Error: ",
return base::StrCat({"a JavaScript error: \"OperationError: ",
content::GetSharedStorageSelectURLDisabledMessage()});
}
std::string GetSharedStorageAddModuleDisabledErrorMessage() {
return base::StrCat({"a JavaScript error: \"Error: ",
return base::StrCat({"a JavaScript error: \"OperationError: ",
content::GetSharedStorageAddModuleDisabledMessage()});
}
@ -743,7 +743,7 @@ class SharedStorageChromeBrowserTestBase : public PlatformBrowserTest {
}
std::string ExpectedSharedStorageDisabledMessage() {
return "Error: " + content::GetSharedStorageDisabledMessage();
return "OperationError: " + content::GetSharedStorageDisabledMessage();
}
protected:
@ -2241,11 +2241,11 @@ IN_PROC_BROWSER_TEST_P(SharedStorageChromeBrowserTest,
content::JsReplace("sharedStorage.worklet.addModule($1)", invalid_url));
EXPECT_EQ(
base::StrCat(
{"a JavaScript error: \"Error: The module script url is invalid.\n",
" at __const_std::string&_script__:1:24):\n",
" {sharedStorage.worklet.addModule(\"", invalid_url, "\")\n",
" ^^^^^\n"}),
base::StrCat({"a JavaScript error: \"DataError: The module script url is "
"invalid.\n",
" at __const_std::string&_script__:1:24):\n",
" {sharedStorage.worklet.addModule(\"", invalid_url,
"\")\n", " ^^^^^\n"}),
result.error);
WaitForHistograms({kErrorTypeHistogram});
@ -2265,7 +2265,7 @@ IN_PROC_BROWSER_TEST_P(SharedStorageChromeBrowserTest,
content::JsReplace("sharedStorage.worklet.addModule($1)", script_url));
EXPECT_EQ(
base::StrCat({"a JavaScript error: \"Error: Failed to load ",
base::StrCat({"a JavaScript error: \"OperationError: Failed to load ",
script_url.spec(), " HTTP status = 404 Not Found.\"\n"}),
result.error);
@ -2286,8 +2286,9 @@ IN_PROC_BROWSER_TEST_P(SharedStorageChromeBrowserTest,
content::JsReplace("sharedStorage.worklet.addModule($1)", script_url));
EXPECT_EQ(
base::StrCat({"a JavaScript error: \"Error: Unexpected redirect on ",
script_url.spec(), ".\"\n"}),
base::StrCat(
{"a JavaScript error: \"OperationError: Unexpected redirect on ",
script_url.spec(), ".\"\n"}),
result.error);
WaitForHistograms({kErrorTypeHistogram});
@ -4822,7 +4823,7 @@ IN_PROC_BROWSER_TEST_F(SharedStorageChromeCrossOriginScriptDisabledBrowserTest,
content::JsReplace("sharedStorage.worklet.addModule($1)", script_url));
EXPECT_EQ(
base::StrCat({"a JavaScript error: \"Error: Only same origin module ",
base::StrCat({"a JavaScript error: \"DataError: Only same origin module ",
"script is allowed.",
"\n at __const_std::string&_script__:1:24):\n ",
"{sharedStorage.worklet.addModule(\"",

@ -1334,7 +1334,7 @@ IN_PROC_BROWSER_TEST_P(SharedStorageBrowserTest, AddModule_ScriptNotFound) {
WebContentsConsoleObserver console_observer(shell()->web_contents());
std::string expected_error = base::StrCat(
{"a JavaScript error: \"Error: Failed to load ",
{"a JavaScript error: \"OperationError: Failed to load ",
https_server()
->GetURL("a.test", "/shared_storage/nonexistent_module.js")
.spec(),
@ -1364,7 +1364,7 @@ IN_PROC_BROWSER_TEST_P(SharedStorageBrowserTest, AddModule_RedirectNotAllowed) {
WebContentsConsoleObserver console_observer(shell()->web_contents());
std::string expected_error = base::StrCat(
{"a JavaScript error: \"Error: Unexpected redirect on ",
{"a JavaScript error: \"OperationError: Unexpected redirect on ",
https_server()
->GetURL("a.test",
"/server-redirect?shared_storage/simple_module.js")
@ -7033,7 +7033,7 @@ IN_PROC_BROWSER_TEST_F(SharedStorageFencedFrameInteractionBrowserTest,
// `selectURL()` fails when map is full.
std::string expected_error = base::StrCat(
{"a JavaScript error: \"Error: ",
{"a JavaScript error: \"OperationError: ",
"sharedStorage.selectURL() failed because number of urn::uuid to url ",
"mappings has reached the limit.\"\n"});
EXPECT_EQ(expected_error, extra_result.error);

@ -1119,7 +1119,7 @@ IN_PROC_BROWSER_TEST_F(WebUIWorkerTest,
kLoadSharedWorkerScript);
std::string expected_failure =
"a JavaScript error: \"Error: Failed to construct 'SharedWorker'";
"a JavaScript error: \"SecurityError: Failed to construct 'SharedWorker'";
EXPECT_THAT(result.error, ::testing::StartsWith(expected_failure));
}
@ -1193,7 +1193,8 @@ IN_PROC_BROWSER_TEST_F(WebUIWorkerTest,
kLoadSharedWorkerScript);
std::string expected_failure =
"a JavaScript error: \"Error: Failed to construct 'SharedWorker': "
"a JavaScript error: \"SecurityError: Failed to construct "
"'SharedWorker': "
"Script at 'chrome-untrusted://untrusted/web_ui_shared_worker.js' cannot "
"be accessed from origin 'chrome://trusted'";
EXPECT_THAT(result.error, ::testing::StartsWith(expected_failure));
@ -1211,7 +1212,8 @@ IN_PROC_BROWSER_TEST_F(WebUIWorkerTest,
kLoadSharedWorkerScript);
std::string expected_failure =
"a JavaScript error: \"Error: Failed to construct 'SharedWorker': "
"a JavaScript error: \"SecurityError: Failed to construct "
"'SharedWorker': "
"Script at 'chrome-untrusted://untrusted/web_ui_shared_worker.js' cannot "
"be accessed from origin 'http://localhost";
EXPECT_THAT(result.error, ::testing::StartsWith(expected_failure));
@ -1228,7 +1230,8 @@ IN_PROC_BROWSER_TEST_F(WebUIWorkerTest,
GetWebUIURL("trusted/web_ui_shared_worker.js"), kLoadSharedWorkerScript);
std::string expected_failure =
"a JavaScript error: \"Error: Failed to construct 'SharedWorker': Script "
"a JavaScript error: \"SecurityError: Failed to construct "
"'SharedWorker': Script "
"at 'chrome://trusted/web_ui_shared_worker.js' cannot be accessed from "
"origin 'chrome-untrusted://untrusted'.";
EXPECT_THAT(result.error, ::testing::StartsWith(expected_failure));
@ -1258,7 +1261,7 @@ IN_PROC_BROWSER_TEST_P(WebUIDedicatedWorkerTest,
kLoadDedicatedWorkerScript);
std::string expected_failure =
"a JavaScript error: \"Error: Failed to construct 'Worker'";
"a JavaScript error: \"SecurityError: Failed to construct 'Worker'";
EXPECT_THAT(result.error, ::testing::StartsWith(expected_failure));
}
@ -1330,7 +1333,7 @@ IN_PROC_BROWSER_TEST_P(
kLoadDedicatedWorkerScript);
std::string expected_failure =
"a JavaScript error: \"Error: Failed to construct 'Worker': "
"a JavaScript error: \"SecurityError: Failed to construct 'Worker': "
"Script at 'chrome-untrusted://untrusted/web_ui_dedicated_worker.js' "
"cannot be accessed from origin 'chrome://trusted'";
EXPECT_THAT(result.error, ::testing::StartsWith(expected_failure));
@ -1348,7 +1351,7 @@ IN_PROC_BROWSER_TEST_P(WebUIDedicatedWorkerTest,
kLoadDedicatedWorkerScript);
std::string expected_failure =
"a JavaScript error: \"Error: Failed to construct 'Worker': "
"a JavaScript error: \"SecurityError: Failed to construct 'Worker': "
"Script at 'chrome-untrusted://untrusted/web_ui_dedicated_worker.js' "
"cannot be accessed from origin 'http://localhost";
EXPECT_THAT(result.error, ::testing::StartsWith(expected_failure));
@ -1367,7 +1370,8 @@ IN_PROC_BROWSER_TEST_P(WebUIDedicatedWorkerTest,
kLoadDedicatedWorkerScript);
std::string expected_failure =
"a JavaScript error: \"Error: Failed to construct 'Worker': Script "
"a JavaScript error: \"SecurityError: Failed to construct 'Worker': "
"Script "
"at 'chrome://trusted/web_ui_dedicated_worker.js' cannot be accessed "
"from origin 'chrome-untrusted://untrusted'.";
EXPECT_THAT(result.error, ::testing::StartsWith(expected_failure));

@ -1,11 +1,8 @@
Tests that file picker interception works as expected
{
stack : Error: Failed to execute 'showOpenFilePicker' on 'Window': Intercepted by Page.setInterceptFileChooserDialog(). at <anonymous>:2:12
}
{
stack : Error: Failed to execute 'showSaveFilePicker' on 'Window': Intercepted by Page.setInterceptFileChooserDialog(). at <anonymous>:2:12
}
{
stack : Error: Failed to execute 'showDirectoryPicker' on 'Window': Intercepted by Page.setInterceptFileChooserDialog(). at <anonymous>:2:12
}
Intercepted file chooser mode: selectSingle

@ -266,20 +266,6 @@ static void PromiseRejectHandler(v8::PromiseRejectMessage data,
ExecutionContext* context = ExecutionContext::From(script_state);
v8::Local<v8::Value> exception = data.GetValue();
if (V8PerIsolateData::From(isolate)->HasInstance(
DOMException::GetStaticWrapperTypeInfo(), exception)) {
// Try to get the stack & location from a wrapped DOMException object.
CHECK(exception->IsObject());
auto private_error = V8PrivateProperty::GetSymbol(
isolate, kPrivatePropertyDOMExceptionError);
v8::Local<v8::Value> error;
if (private_error.GetOrUndefined(exception.As<v8::Object>())
.ToLocal(&error) &&
!error->IsUndefined()) {
exception = error;
}
}
String error_message;
SanitizeScriptErrors sanitize_script_errors = SanitizeScriptErrors::kSanitize;
std::unique_ptr<SourceLocation> location;

@ -10,42 +10,16 @@
#include "third_party/blink/renderer/platform/bindings/v8_set_return_value.h"
#include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
namespace blink {
// extern
const V8PrivateProperty::SymbolKey kPrivatePropertyDOMExceptionError;
// static
void V8ThrowDOMException::Init() {
ExceptionState::SetCreateDOMExceptionFunction(
V8ThrowDOMException::CreateOrEmpty);
}
namespace {
void DomExceptionStackGetter(v8::Local<v8::Name> name,
const v8::PropertyCallbackInfo<v8::Value>& info) {
v8::Isolate* isolate = info.GetIsolate();
v8::Local<v8::Value> value;
if (info.Data()
.As<v8::Object>()
->Get(isolate->GetCurrentContext(), V8AtomicString(isolate, "stack"))
.ToLocal(&value)) {
bindings::V8SetReturnValue(info, value);
}
}
void DomExceptionStackSetter(v8::Local<v8::Name> name,
v8::Local<v8::Value> value,
const v8::PropertyCallbackInfo<void>& info) {
[[maybe_unused]] v8::Maybe<bool> unused = info.Data().As<v8::Object>()->Set(
info.GetIsolate()->GetCurrentContext(),
V8AtomicString(info.GetIsolate(), "stack"), value);
}
} // namespace
v8::Local<v8::Value> V8ThrowDOMException::CreateOrEmpty(
v8::Isolate* isolate,
DOMExceptionCode exception_code,
@ -80,32 +54,23 @@ v8::Local<v8::Value> V8ThrowDOMException::AttachStackProperty(
if (isolate->IsExecutionTerminating())
return v8::Local<v8::Value>();
auto current_context = isolate->GetCurrentContext();
// We use the isolate's current context here because we are creating an
// exception object.
auto current_context = isolate->GetCurrentContext();
v8::Local<v8::Object> exception_obj =
ToV8Traits<DOMException>::ToV8(
ScriptState::From(isolate, current_context), dom_exception)
dom_exception->ToV8(ScriptState::From(isolate, current_context))
.As<v8::Object>();
v8::Exception::CaptureStackTrace(current_context, exception_obj);
// Attach an Error object to the DOMException. This is then lazily used to get
// the stack value.
v8::Local<v8::Value> error =
v8::Exception::Error(V8String(isolate, dom_exception->message()));
// The context passed to SetNativeDataProperty is used to create an error
// object if needed, and so should be the isolate's current context.
exception_obj
->SetNativeDataProperty(current_context, V8AtomicString(isolate, "stack"),
DomExceptionStackGetter, DomExceptionStackSetter,
error)
.ToChecked();
auto private_error =
V8PrivateProperty::GetSymbol(isolate, kPrivatePropertyDOMExceptionError);
private_error.Set(exception_obj, error);
// Temporary workaround while debugging the root cause of
// https://crbug.com/356158097. The workaround immediately materializes the
// stack trace string. The workaround is enabled by default, but can be
// disabled by experimental flag.
if (!RuntimeEnabledFeatures::
DOMExceptionV8CaptureStackTraceDisableWorkaroundEnabled()) {
std::ignore =
exception_obj->Get(current_context, V8String(isolate, "stack"));
}
return exception_obj;
}

@ -50,8 +50,6 @@ class CORE_EXPORT V8ThrowDOMException {
static v8::Local<v8::Value> AttachStackProperty(v8::Isolate*, DOMException*);
};
extern const V8PrivateProperty::SymbolKey kPrivatePropertyDOMExceptionError;
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_THROW_DOM_EXCEPTION_H_

@ -2571,7 +2571,7 @@ TEST_F(SharedStorageWorkletTest, Entries_FirstBatchError_Failure) {
RunResult run_result{run_future.Get<0>(), run_future.Get<1>()};
EXPECT_FALSE(run_result.success);
EXPECT_EQ(run_result.error_message, "Error: Internal error 12345");
EXPECT_EQ(run_result.error_message, "OperationError: Internal error 12345");
EXPECT_EQ(test_client_->observed_console_log_messages_.size(), 0u);
}
@ -2664,7 +2664,7 @@ TEST_F(SharedStorageWorkletTest, Entries_SecondBatchError_Failure) {
RunResult run_result{run_future.Get<0>(), run_future.Get<1>()};
EXPECT_FALSE(run_result.success);
EXPECT_EQ(run_result.error_message, "Error: Internal error 12345");
EXPECT_EQ(run_result.error_message, "OperationError: Internal error 12345");
EXPECT_EQ(test_client_->observed_console_log_messages_.size(), 1u);
}

@ -1567,6 +1567,12 @@
{
name: "DocumentWrite",
},
// When this flag is enabled, a workaround for https://crbug.com/356158097
// is removed.
{
name: "DOMExceptionV8CaptureStackTraceDisableWorkaround",
status: "experimental"
},
// Controls whether DOMParser.parseFromString() attempts to use the
// html fast path parser. This flag is to be used as a killswitch in case
// of any issues.

@ -1,11 +1,11 @@
This is a testharness.js-based test.
[FAIL] web API-created DOMException (structuredClone())
assert_equals: expected (string) "Error: Failed to execute 'createElement' on 'Document': The tag name provided ('') is not a valid name.\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:33:14\\n at Test.<anonymous> (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:41:19)\\n at Test.step (http://web-platform.test:8001/resources/testharness.js:2622:25)\\n at test (http://web-platform.test:8001/resources/testharness.js:633:30)\\n at stackTests (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:40:3)\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:31:1" but got (undefined) undefined
assert_equals: expected (string) "InvalidCharacterError: Failed to execute 'createElement' on 'Document': The tag name provided ('') is not a valid name.\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:33:14\\n at Test.<anonymous> (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:41:19)\\n at Test.step (http://web-platform.test:8001/resources/testharness.js:2622:25)\\n at test (http://web-platform.test:8001/resources/testharness.js:633:30)\\n at stackTests (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:40:3)\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:31:1" but got (undefined) undefined
[FAIL] web API-created DOMException (worker)
assert_equals: expected (string) "Error: Failed to execute 'createElement' on 'Document': The tag name provided ('') is not a valid name.\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:33:14\\n at Test.<anonymous> (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:53:19)\\n at Test.step (http://web-platform.test:8001/resources/testharness.js:2622:25)\\n at async_test (http://web-platform.test:8001/resources/testharness.js:681:34)\\n at stackTests (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:52:3)\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:31:1" but got (undefined) undefined
assert_equals: expected (string) "InvalidCharacterError: Failed to execute 'createElement' on 'Document': The tag name provided ('') is not a valid name.\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:33:14\\n at Test.<anonymous> (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:53:19)\\n at Test.step (http://web-platform.test:8001/resources/testharness.js:2622:25)\\n at async_test (http://web-platform.test:8001/resources/testharness.js:681:34)\\n at stackTests (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:52:3)\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:31:1" but got (undefined) undefined
[FAIL] web API-created DOMException (cross-site iframe)
assert_equals: expected (string) "Error: Failed to execute 'createElement' on 'Document': The tag name provided ('') is not a valid name.\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:33:14\\n at iframeTest (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:72:19)\\n at Test.<anonymous> (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:99:5)\\n at Test.step (http://web-platform.test:8001/resources/testharness.js:2622:25)\\n at async_test (http://web-platform.test:8001/resources/testharness.js:681:34)\\n at stackTests (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:96:3)\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:31:1" but got (undefined) undefined
assert_equals: expected (string) "InvalidCharacterError: Failed to execute 'createElement' on 'Document': The tag name provided ('') is not a valid name.\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:33:14\\n at iframeTest (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:72:19)\\n at Test.<anonymous> (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:99:5)\\n at Test.step (http://web-platform.test:8001/resources/testharness.js:2622:25)\\n at async_test (http://web-platform.test:8001/resources/testharness.js:681:34)\\n at stackTests (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:96:3)\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:31:1" but got (undefined) undefined
[FAIL] web API-created DOMException (same-origin iframe)
assert_equals: expected (string) "Error: Failed to execute 'createElement' on 'Document': The tag name provided ('') is not a valid name.\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:33:14\\n at iframeTest (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:72:19)\\n at Test.<anonymous> (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:104:5)\\n at Test.step (http://web-platform.test:8001/resources/testharness.js:2622:25)\\n at async_test (http://web-platform.test:8001/resources/testharness.js:681:34)\\n at stackTests (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:102:3)\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:31:1" but got (undefined) undefined
assert_equals: expected (string) "InvalidCharacterError: Failed to execute 'createElement' on 'Document': The tag name provided ('') is not a valid name.\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:33:14\\n at iframeTest (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:72:19)\\n at Test.<anonymous> (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:104:5)\\n at Test.step (http://web-platform.test:8001/resources/testharness.js:2622:25)\\n at async_test (http://web-platform.test:8001/resources/testharness.js:681:34)\\n at stackTests (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:102:3)\\n at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:31:1" but got (undefined) undefined
Harness: the test ran to completion.

@ -7,7 +7,7 @@ console-log-linkify-…ack-in-errors.js:17 Error: line
break
at forStack (console-log-linkify-…-in-errors.js:17:23)
at console-log-linkify-…k-in-errors.js:20:7
console-log-linkify-…ack-in-errors.js:36 Error: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
console-log-linkify-…ack-in-errors.js:36 NotFoundError: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
at domError (console-log-linkify-…-in-errors.js:34:29)
at console-log-linkify-…k-in-errors.js:40:7
console-log-linkify-…ack-in-errors.js:47 Error: some error