diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-05-20 09:47:09 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-06-07 11:15:42 +0000 |
commit | 189d4fd8fad9e3c776873be51938cd31a42b6177 (patch) | |
tree | 6497caeff5e383937996768766ab3bb2081a40b2 /chromium/third_party/blink/renderer/core/testing | |
parent | 8bc75099d364490b22f43a7ce366b366c08f4164 (diff) | |
download | qtwebengine-chromium-189d4fd8fad9e3c776873be51938cd31a42b6177.tar.gz |
BASELINE: Update Chromium to 90.0.4430.221
Change-Id: Iff4d9d18d2fcf1a576f3b1f453010f744a232920
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/third_party/blink/renderer/core/testing')
50 files changed, 1326 insertions, 283 deletions
diff --git a/chromium/third_party/blink/renderer/core/testing/DEPS b/chromium/third_party/blink/renderer/core/testing/DEPS index 9c2773daa13..7d8ad3b7bbb 100644 --- a/chromium/third_party/blink/renderer/core/testing/DEPS +++ b/chromium/third_party/blink/renderer/core/testing/DEPS @@ -1,6 +1,8 @@ include_rules = [ "+base/run_loop.h", + "+base/process/process_handle.h", "+cc", + "+components/ukm/test_ukm_recorder.h", # TODO(crbug.com/838693): Test harnesses use LayerTreeView # from content instead of a fake WebLayerTreeView implementation, so # that the Web abstraction can go away. diff --git a/chromium/third_party/blink/renderer/core/testing/core_unit_test_helper.cc b/chromium/third_party/blink/renderer/core/testing/core_unit_test_helper.cc index c2581c876a6..b7ad0351301 100644 --- a/chromium/third_party/blink/renderer/core/testing/core_unit_test_helper.cc +++ b/chromium/third_party/blink/renderer/core/testing/core_unit_test_helper.cc @@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" +#include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/core/html/html_iframe_element.h" #include "third_party/blink/renderer/core/input/event_handler.h" @@ -25,9 +26,9 @@ LocalFrame* SingleChildLocalFrameClient::CreateFrame( MakeGarbageCollected<LocalFrameClientWithParent>(parent_frame); LocalFrame* child = MakeGarbageCollected<LocalFrame>( child_client, *parent_frame->GetPage(), owner_element, parent_frame, - nullptr, FrameInsertType::kInsertInConstructor, - base::UnguessableToken::Create(), &parent_frame->window_agent_factory(), - nullptr, /* policy_container */ nullptr); + nullptr, FrameInsertType::kInsertInConstructor, LocalFrameToken(), + &parent_frame->window_agent_factory(), nullptr, + /* policy_container */ nullptr); child->CreateView(IntSize(500, 500), Color::kTransparent); child->Init(nullptr); diff --git a/chromium/third_party/blink/renderer/core/testing/core_unit_test_helper.h b/chromium/third_party/blink/renderer/core/testing/core_unit_test_helper.h index d02c3609841..e2e2316cd3b 100644 --- a/chromium/third_party/blink/renderer/core/testing/core_unit_test_helper.h +++ b/chromium/third_party/blink/renderer/core/testing/core_unit_test_helper.h @@ -19,7 +19,6 @@ #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/layout/ng/layout_ng_block_flow.h" #include "third_party/blink/renderer/core/loader/empty_clients.h" -#include "third_party/blink/renderer/core/paint/ng/ng_paint_fragment.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" #include "third_party/blink/renderer/platform/testing/layer_tree_host_embedder.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -150,9 +149,6 @@ class RenderingTest : public PageTestBase { const DisplayItemClient* GetDisplayItemClientFromLayoutObject( LayoutObject* obj) const { - auto* block_flow = DynamicTo<LayoutNGBlockFlow>(obj); - if (block_flow && block_flow->PaintFragment()) - return block_flow->PaintFragment(); return obj; } diff --git a/chromium/third_party/blink/renderer/core/testing/data/add-frame-in-unload-main.html b/chromium/third_party/blink/renderer/core/testing/data/add-frame-in-unload-main.html new file mode 100644 index 00000000000..8a174381a9b --- /dev/null +++ b/chromium/third_party/blink/renderer/core/testing/data/add-frame-in-unload-main.html @@ -0,0 +1,2 @@ +<!DOCTYPE html> +<body><iframe src="add-frame-in-unload-subframe.html"></iframe></body> diff --git a/chromium/third_party/blink/renderer/core/testing/data/add-frame-in-unload-subframe.html b/chromium/third_party/blink/renderer/core/testing/data/add-frame-in-unload-subframe.html new file mode 100644 index 00000000000..a037c299757 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/testing/data/add-frame-in-unload-subframe.html @@ -0,0 +1,6 @@ +<!DOCTYPE html> +<script> +window.addEventListener('unload', () => { + window.top.document.body.appendChild(document.createElement('iframe')); +}); +</script> diff --git a/chromium/third_party/blink/renderer/core/testing/data/composited_selection_bounds_basic_rtl.html b/chromium/third_party/blink/renderer/core/testing/data/composited_selection_bounds_basic_rtl.html new file mode 100644 index 00000000000..fa1998166d9 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/testing/data/composited_selection_bounds_basic_rtl.html @@ -0,0 +1,24 @@ +<style> + @font-face { + font-family: ahem; + src: url(Ahem.ttf); + } + * { + font-family: ahem; + } + body { + direction: rtl; + } +</style> +<span id="text"> + ‮The quick brown fox jumped over the lazy dog. +</span> +<script> + var range = document.createRange(); + var textNode = document.getElementById("text").firstChild; + range.setStart(textNode, 10); + range.setEnd(textNode, 25); + document.getSelection().addRange(range); + + window.expectedResult = [document, 584, 8, 584, 20, document, 404, 8, 404, 20]; +</script> diff --git a/chromium/third_party/blink/renderer/core/testing/data/composited_selection_bounds_vertical_lr_rtl.html b/chromium/third_party/blink/renderer/core/testing/data/composited_selection_bounds_vertical_lr_rtl.html new file mode 100644 index 00000000000..e3188ab769f --- /dev/null +++ b/chromium/third_party/blink/renderer/core/testing/data/composited_selection_bounds_vertical_lr_rtl.html @@ -0,0 +1,25 @@ +<style> + @font-face { + font-family: ahem; + src: url(Ahem.ttf); + } + * { + font-family: ahem; + } + body { + direction: rtl; + -webkit-writing-mode: vertical-lr; + } +</style> +<span id="text"> + ‮The quick brown fox jumped over the lazy dog. +</span> +<script> + var range = document.createRange(); + var textNode = document.getElementById("text").firstChild; + range.setStart(textNode, 10); + range.setEnd(textNode, 25); + document.getSelection().addRange(range); + + window.expectedResult = [document, 20, 424, 8, 424, document, 8, 244, 20, 244]; +</script> diff --git a/chromium/third_party/blink/renderer/core/testing/data/composited_selection_bounds_vertical_rl_rtl.html b/chromium/third_party/blink/renderer/core/testing/data/composited_selection_bounds_vertical_rl_rtl.html new file mode 100644 index 00000000000..0aa385479b1 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/testing/data/composited_selection_bounds_vertical_rl_rtl.html @@ -0,0 +1,25 @@ +<style> + @font-face { + font-family: ahem; + src: url(Ahem.ttf); + } + * { + font-family: ahem; + } + body { + direction: rtl; + -webkit-writing-mode: vertical-rl; + } +</style> +<span id="text"> + ‮The quick brown fox jumped over the lazy dog. +</span> +<script> + var range = document.createRange(); + var textNode = document.getElementById("text").firstChild; + range.setStart(textNode, 10); + range.setEnd(textNode, 25); + document.getSelection().addRange(range); + + window.expectedResult = [document, 620, 424, 632, 424, document, 632, 244, 620, 244]; +</script> diff --git a/chromium/third_party/blink/renderer/core/testing/data/display_none_frame.html b/chromium/third_party/blink/renderer/core/testing/data/display_none_frame.html new file mode 100644 index 00000000000..e2b58e67908 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/testing/data/display_none_frame.html @@ -0,0 +1,5 @@ +<html style="display:none;"> + <body> + <p>This text is inside an invisible document.</p> + </body> +</html> diff --git a/chromium/third_party/blink/renderer/core/testing/data/prerender/multiple_prerenders.html b/chromium/third_party/blink/renderer/core/testing/data/prerender/multiple_prerenders.html index faa70844040..de16538faa7 100644 --- a/chromium/third_party/blink/renderer/core/testing/data/prerender/multiple_prerenders.html +++ b/chromium/third_party/blink/renderer/core/testing/data/prerender/multiple_prerenders.html @@ -1,22 +1,8 @@ <html> - <head> - <script> - function log(message) - { - var item = document.createElement("li"); - item.appendChild(document.createTextNode(message)); - document.getElementById("console").appendChild(item); - } - - </script> - - </head> + <head></head> <body> - <ul id=console> - </ul> - - <link id="firstPrerender" rel=prerender href="http://first-prerender.com/"/> - <link id="secondPrerender" rel=prerender href="http://second-prerender.com/"/> + <link id="firstPrerender" rel=prerender href="/first"/> + <link id="secondPrerender" rel=prerender href="/second"/> <p id="emptyParagraph"></p> @@ -42,26 +28,11 @@ link.parentElement.removeChild(link); } - firstPrerender.addEventListener('webkitprerenderstart', function() { log("first_webkitprerenderstart"); }, false); - firstPrerender.addEventListener('webkitprerenderstop', function() { log("first_webkitprerenderstop"); }, false); - firstPrerender.addEventListener('webkitprerenderload', function() { log("first_webkitprerenderload"); }, false); - firstPrerender.addEventListener('webkitprerenderdomcontentloaded', function() { log("first_webkitprerenderdomcontentloaded"); }, false); - - secondPrerender.addEventListener('webkitprerenderstart', function() { log("second_webkitprerenderstart"); }, false); - secondPrerender.addEventListener('webkitprerenderstop', function() { log("second_webkitprerenderstop"); }, false); - secondPrerender.addEventListener('webkitprerenderload', function() { log("second_webkitprerenderload"); }, false); - secondPrerender.addEventListener('webkitprerenderdomcontentloaded', function() { log("second_webkitprerenderdomcontentloaded"); }, false); - function addThirdPrerender() { var emptyParagraph = document.getElementById("emptyParagraph"); - emptyParagraph.innerHTML = '<link id="thirdPrerender" rel=prerender href="http://third-prererender.com/"/>'; + emptyParagraph.innerHTML = '<link id="thirdPrerender" rel=prerender href="/third"/>'; var thirdPrerender = document.getElementById('thirdPrerender'); - - thirdPrerender.addEventListener('webkitprerenderstart', function() { log("third_webkitprerenderstart"); }, false); - thirdPrerender.addEventListener('webkitprerenderstop', function() { log("third_webkitprerenderstop"); }, false); - thirdPrerender.addEventListener('webkitprerenderload', function() { log("third_webkitprerenderload"); }, false); - thirdPrerender.addEventListener('webkitprerenderdomcontentloaded', function() { log("third_webkitprerenderdomcontentloaded"); }, false); } </script> </body> diff --git a/chromium/third_party/blink/renderer/core/testing/data/prerender/single_prerender.html b/chromium/third_party/blink/renderer/core/testing/data/prerender/single_prerender.html index 00d42c01269..9d89474ff6e 100644 --- a/chromium/third_party/blink/renderer/core/testing/data/prerender/single_prerender.html +++ b/chromium/third_party/blink/renderer/core/testing/data/prerender/single_prerender.html @@ -1,19 +1,7 @@ <html> - <head> - <script> - function log(message) - { - var item = document.createElement("li"); - item.appendChild(document.createTextNode(message)); - document.getElementById("console").appendChild(item); - } - </script> - </head> + <head></head> <body> - <ul id=console> - </ul> - - <link id="theprerender" rel=prerender href="http://prerender.com/"/> + <link id="theprerender" rel=prerender href="/prerender"/> <script> var prerender = document.getElementById('theprerender'); @@ -27,19 +15,14 @@ function mutateTarget() { var link = document.getElementById('theprerender'); - link.href = "http://mutated.com/"; + link.href = "/mutated"; } function mutateRel() { var link = document.getElementById('theprerender'); - link.rel = "something-else"; + link.rel = "/something-else"; } - - prerender.addEventListener('webkitprerenderstart', function() { log("webkitprerenderstart"); }, false); - prerender.addEventListener('webkitprerenderstop', function() { log("webkitprerenderstop"); }, false); - prerender.addEventListener('webkitprerenderload', function() { log("webkitprerenderload"); }, false); - prerender.addEventListener('webkitprerenderdomcontentloaded', function() { log("webkitprerenderdomcontentloaded"); }, false); </script> </body> </html> diff --git a/chromium/third_party/blink/renderer/core/testing/dictionary_test.cc b/chromium/third_party/blink/renderer/core/testing/dictionary_test.cc index 15f6ecf7d97..f8e211610d2 100644 --- a/chromium/third_party/blink/renderer/core/testing/dictionary_test.cc +++ b/chromium/third_party/blink/renderer/core/testing/dictionary_test.cc @@ -66,8 +66,10 @@ void DictionaryTest::set(const InternalDictionary* testing_dictionary) { enum_or_null_member_ = testing_dictionary->enumOrNullMember(); if (testing_dictionary->hasElementMember()) element_member_ = testing_dictionary->elementMember(); - if (testing_dictionary->hasElementOrNullMember()) + if (testing_dictionary->hasElementOrNullMember()) { element_or_null_member_ = testing_dictionary->elementOrNullMember(); + has_element_or_null_member_ = true; + } if (testing_dictionary->hasObjectMember()) object_member_ = testing_dictionary->objectMember(); object_or_null_member_with_default_ = @@ -75,7 +77,9 @@ void DictionaryTest::set(const InternalDictionary* testing_dictionary) { if (testing_dictionary->hasDoubleOrStringMember()) double_or_string_member_ = testing_dictionary->doubleOrStringMember(); if (testing_dictionary->hasDoubleOrStringSequenceMember()) { - double_or_string_sequence_member_ = + double_or_string_sequence_or_null_member_ = + MakeGarbageCollected<HeapVector<DoubleOrString>>(); + *double_or_string_sequence_or_null_member_ = testing_dictionary->doubleOrStringSequenceMember(); } // eventTargetOrNullMember has a default null value. @@ -149,10 +153,12 @@ void DictionaryTest::Reset() { enum_member_with_default_ = String(); enum_or_null_member_ = base::nullopt; element_member_ = nullptr; - element_or_null_member_.reset(); + element_or_null_member_.Clear(); + has_element_or_null_member_ = false; object_member_ = ScriptValue(); object_or_null_member_with_default_ = ScriptValue(); double_or_string_member_ = DoubleOrString(); + double_or_string_sequence_or_null_member_ = nullptr; event_target_or_null_member_ = nullptr; derived_string_member_ = base::nullopt; derived_string_member_with_default_ = String(); @@ -211,15 +217,15 @@ void DictionaryTest::GetInternals(InternalDictionary* dict) { dict->setEnumOrNullMember(enum_or_null_member_.value()); if (element_member_) dict->setElementMember(element_member_); - if (element_or_null_member_.has_value()) - dict->setElementOrNullMember(element_or_null_member_.value()); + if (has_element_or_null_member_) + dict->setElementOrNullMember(element_or_null_member_); dict->setObjectMember(object_member_); dict->setObjectOrNullMemberWithDefault(object_or_null_member_with_default_); if (!double_or_string_member_.IsNull()) dict->setDoubleOrStringMember(double_or_string_member_); - if (double_or_string_sequence_member_) { + if (double_or_string_sequence_or_null_member_) { dict->setDoubleOrStringSequenceMember( - double_or_string_sequence_member_.value()); + *double_or_string_sequence_or_null_member_); } dict->setEventTargetOrNullMember(event_target_or_null_member_); dict->setInternalEnumOrInternalEnumSequenceMember( @@ -251,7 +257,7 @@ void DictionaryTest::Trace(Visitor* visitor) const { visitor->Trace(element_or_null_member_); visitor->Trace(object_member_); visitor->Trace(object_or_null_member_with_default_); - visitor->Trace(double_or_string_sequence_member_); + visitor->Trace(double_or_string_sequence_or_null_member_); visitor->Trace(event_target_or_null_member_); visitor->Trace(any_member_); visitor->Trace(callback_function_member_); diff --git a/chromium/third_party/blink/renderer/core/testing/dictionary_test.h b/chromium/third_party/blink/renderer/core/testing/dictionary_test.h index 1840a361d37..5bbd24c53a3 100644 --- a/chromium/third_party/blink/renderer/core/testing/dictionary_test.h +++ b/chromium/third_party/blink/renderer/core/testing/dictionary_test.h @@ -56,6 +56,8 @@ class DictionaryTest : public ScriptWrappable { // Some members are not wrapped with Optional because: // - |longMemberWithDefault| has a non-null default value // - String and PtrTypes can express whether they are null + // - base::Optional does not work with GarbageCollected types when used on + // heap. base::Optional<int> long_member_; base::Optional<int> long_member_with_clamp_; base::Optional<int> long_member_with_enforce_range_; @@ -82,11 +84,12 @@ class DictionaryTest : public ScriptWrappable { base::Optional<String> enum_or_null_member_; #endif Member<Element> element_member_; - base::Optional<Member<Element>> element_or_null_member_; + Member<Element> element_or_null_member_; + bool has_element_or_null_member_ = false; ScriptValue object_member_; ScriptValue object_or_null_member_with_default_; DoubleOrString double_or_string_member_; - base::Optional<HeapVector<DoubleOrString>> double_or_string_sequence_member_; + Member<HeapVector<DoubleOrString>> double_or_string_sequence_or_null_member_; Member<EventTarget> event_target_or_null_member_; base::Optional<String> derived_string_member_; String derived_string_member_with_default_; diff --git a/chromium/third_party/blink/renderer/core/testing/dummy_modulator.cc b/chromium/third_party/blink/renderer/core/testing/dummy_modulator.cc index 876b7cb4c82..de225c91f58 100644 --- a/chromium/third_party/blink/renderer/core/testing/dummy_modulator.cc +++ b/chromium/third_party/blink/renderer/core/testing/dummy_modulator.cc @@ -6,6 +6,7 @@ #include "third_party/blink/renderer/bindings/core/v8/module_record.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" +#include "third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h" #include "third_party/blink/renderer/core/script/module_record_resolver.h" namespace blink { @@ -27,7 +28,7 @@ class EmptyModuleRecordResolver final : public ModuleRecordResolver { return nullptr; } - v8::Local<v8::Module> Resolve(const String& specifier, + v8::Local<v8::Module> Resolve(const ModuleRequest& module_request, v8::Local<v8::Module> referrer, ExceptionState&) override { NOTREACHED(); @@ -74,6 +75,7 @@ base::SingleThreadTaskRunner* DummyModulator::TaskRunner() { } void DummyModulator::FetchTree(const KURL&, + ModuleType, ResourceFetcher*, mojom::blink::RequestContextType, network::mojom::RequestDestination, @@ -100,7 +102,7 @@ void DummyModulator::FetchDescendantsForInlineScript( NOTREACHED(); } -ModuleScript* DummyModulator::GetFetchedModuleScript(const KURL&) { +ModuleScript* DummyModulator::GetFetchedModuleScript(const KURL&, ModuleType) { NOTREACHED(); return nullptr; } @@ -116,7 +118,7 @@ bool DummyModulator::HasValidContext() { return true; } -void DummyModulator::ResolveDynamically(const String&, +void DummyModulator::ResolveDynamically(const ModuleRequest& module_request, const KURL&, const ReferrerScriptInfo&, ScriptPromiseResolver*) { @@ -137,12 +139,13 @@ void DummyModulator::RegisterImportMap(const ImportMap*, NOTREACHED(); } -bool DummyModulator::IsAcquiringImportMaps() const { +Modulator::AcquiringImportMapsState +DummyModulator::GetAcquiringImportMapsState() const { NOTREACHED(); - return true; + return AcquiringImportMapsState::kAcquiring; } -void DummyModulator::ClearIsAcquiringImportMaps() { +void DummyModulator::SetAcquiringImportMapsState(AcquiringImportMapsState) { NOTREACHED(); } @@ -169,9 +172,32 @@ Vector<ModuleRequest> DummyModulator::ModuleRequestsFromModuleRecord( return Vector<ModuleRequest>(); } +ModuleType DummyModulator::ModuleTypeFromRequest( + const ModuleRequest& module_request) const { + String module_type_string = module_request.GetModuleTypeString(); + if (module_type_string.IsNull()) { + // Per https://github.com/whatwg/html/pull/5883, if no type assertion is + // provided then the import should be treated as a JavaScript module. + return ModuleType::kJavaScript; + } else if (module_type_string == "json") { + // Per https://github.com/whatwg/html/pull/5658, a "json" type assertion + // indicates that the import should be treated as a JSON module script. + return ModuleType::kJSON; + } else if (module_type_string == "css") { + // Per https://github.com/whatwg/html/pull/4898, a "css" type assertion + // indicates that the import should be treated as a CSS module script. + return ModuleType::kCSS; + } else { + // Per https://github.com/whatwg/html/pull/5883, if an unsupported type + // assertion is provided then the import should be treated as an error + // similar to an invalid module specifier. + return ModuleType::kInvalid; + } +} + ModuleScriptFetcher* DummyModulator::CreateModuleScriptFetcher( ModuleScriptCustomFetchType, - util::PassKey<ModuleScriptLoader> pass_key) { + base::PassKey<ModuleScriptLoader> pass_key) { NOTREACHED(); return nullptr; } diff --git a/chromium/third_party/blink/renderer/core/testing/dummy_modulator.h b/chromium/third_party/blink/renderer/core/testing/dummy_modulator.h index 19f1523b75c..13a7f2ae8fb 100644 --- a/chromium/third_party/blink/renderer/core/testing/dummy_modulator.h +++ b/chromium/third_party/blink/renderer/core/testing/dummy_modulator.h @@ -40,6 +40,7 @@ class DummyModulator : public Modulator { bool ImportMapsEnabled() const override; void FetchTree(const KURL&, + ModuleType, ResourceFetcher*, mojom::blink::RequestContextType context_type, network::mojom::RequestDestination destination, @@ -57,10 +58,10 @@ class DummyModulator : public Modulator { mojom::blink::RequestContextType context_type, network::mojom::RequestDestination destination, ModuleTreeClient*) override; - ModuleScript* GetFetchedModuleScript(const KURL&) override; + ModuleScript* GetFetchedModuleScript(const KURL&, ModuleType) override; KURL ResolveModuleSpecifier(const String&, const KURL&, String*) override; bool HasValidContext() override; - void ResolveDynamically(const String& specifier, + void ResolveDynamically(const ModuleRequest& module_request, const KURL&, const ReferrerScriptInfo&, ScriptPromiseResolver*) override; @@ -68,17 +69,19 @@ class DummyModulator : public Modulator { ScriptValue CreateSyntaxError(const String& message) const override; void RegisterImportMap(const ImportMap*, ScriptValue error_to_rethrow) override; - bool IsAcquiringImportMaps() const override; - void ClearIsAcquiringImportMaps() override; + AcquiringImportMapsState GetAcquiringImportMapsState() const override; + void SetAcquiringImportMapsState(AcquiringImportMapsState) override; ModuleImportMeta HostGetImportMetaProperties( v8::Local<v8::Module>) const override; const ImportMap* GetImportMapForTest() const override; ScriptValue InstantiateModule(v8::Local<v8::Module>, const KURL&) override; Vector<ModuleRequest> ModuleRequestsFromModuleRecord( v8::Local<v8::Module>) override; + ModuleType ModuleTypeFromRequest( + const ModuleRequest& module_request) const override; ModuleScriptFetcher* CreateModuleScriptFetcher( ModuleScriptCustomFetchType, - util::PassKey<ModuleScriptLoader>) override; + base::PassKey<ModuleScriptLoader>) override; void ProduceCacheModuleTreeTopLevel(ModuleScript*) override; Member<ModuleRecordResolver> resolver_; diff --git a/chromium/third_party/blink/renderer/core/testing/dummy_page_holder.cc b/chromium/third_party/blink/renderer/core/testing/dummy_page_holder.cc index 84b56a35610..07c2ea23f5a 100644 --- a/chromium/third_party/blink/renderer/core/testing/dummy_page_holder.cc +++ b/chromium/third_party/blink/renderer/core/testing/dummy_page_holder.cc @@ -33,7 +33,10 @@ #include <memory> #include "base/memory/ptr_util.h" +#include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/mojom/frame/policy_container.mojom-blink.h" +#include "third_party/blink/public/platform/scheduler/web_agent_group_scheduler.h" +#include "third_party/blink/public/platform/scheduler/web_thread_scheduler.h" #include "third_party/blink/public/platform/web_url_loader_mock_factory.h" #include "third_party/blink/renderer/core/core_initializer.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" @@ -44,6 +47,8 @@ #include "third_party/blink/renderer/core/loader/empty_clients.h" #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/loader/testing/web_url_loader_factory_with_mock.h" +#include "third_party/blink/renderer/platform/scheduler/public/thread.h" +#include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h" #include "third_party/blink/renderer/platform/wtf/assertions.h" namespace blink { @@ -69,13 +74,15 @@ DummyPageHolder::DummyPageHolder( LocalFrameClient* local_frame_client, base::OnceCallback<void(Settings&)> setting_overrider, const base::TickClock* clock) - : enable_mock_scrollbars_(true) { + : enable_mock_scrollbars_(true), + agent_group_scheduler_( + Thread::MainThread()->Scheduler()->CreateAgentGroupScheduler()) { Page::PageClients page_clients; if (!page_clients_argument) FillWithEmptyClients(page_clients); else page_clients.chrome_client = page_clients_argument->chrome_client; - page_ = Page::CreateNonOrdinary(page_clients); + page_ = Page::CreateNonOrdinary(page_clients, *agent_group_scheduler_); Settings& settings = page_->GetSettings(); if (setting_overrider) std::move(setting_overrider).Run(settings); @@ -84,23 +91,14 @@ DummyPageHolder::DummyPageHolder( if (!local_frame_client_) local_frame_client_ = MakeGarbageCollected<DummyLocalFrameClient>(); - mojo::PendingAssociatedRemote<mojom::blink::PolicyContainerHost> - stub_policy_container_remote; - ignore_result( - stub_policy_container_remote.InitWithNewEndpointAndPassReceiver()); - // Create new WindowAgentFactory as this page will be isolated from others. frame_ = MakeGarbageCollected<LocalFrame>( local_frame_client_.Get(), *page_, /* FrameOwner* */ nullptr, /* Frame* parent */ nullptr, /* Frame* previous_sibling */ nullptr, - FrameInsertType::kInsertInConstructor, base::UnguessableToken::Create(), + FrameInsertType::kInsertInConstructor, LocalFrameToken(), /* WindowAgentFactory* */ nullptr, - /* InterfaceRegistry* */ nullptr, - std::make_unique<PolicyContainer>( - std::move(stub_policy_container_remote), - mojom::blink::PolicyContainerDocumentPolicies::New()), - clock); + /* InterfaceRegistry* */ nullptr, /* policy_container */ nullptr, clock); frame_->SetView( MakeGarbageCollected<LocalFrameView>(*frame_, initial_view_size)); frame_->View()->GetPage()->GetVisualViewport().SetSize(initial_view_size); diff --git a/chromium/third_party/blink/renderer/core/testing/dummy_page_holder.h b/chromium/third_party/blink/renderer/core/testing/dummy_page_holder.h index be7505bb55a..c0994380565 100644 --- a/chromium/third_party/blink/renderer/core/testing/dummy_page_holder.h +++ b/chromium/third_party/blink/renderer/core/testing/dummy_page_holder.h @@ -99,6 +99,7 @@ class DummyPageHolder { CrossThreadPersistent<LocalFrame> frame_; Persistent<LocalFrameClient> local_frame_client_; + std::unique_ptr<scheduler::WebAgentGroupScheduler> agent_group_scheduler_; DISALLOW_COPY_AND_ASSIGN(DummyPageHolder); }; diff --git a/chromium/third_party/blink/renderer/core/testing/fake_local_frame_host.cc b/chromium/third_party/blink/renderer/core/testing/fake_local_frame_host.cc index d24d6cab43f..77c2f0d7a33 100644 --- a/chromium/third_party/blink/renderer/core/testing/fake_local_frame_host.cc +++ b/chromium/third_party/blink/renderer/core/testing/fake_local_frame_host.cc @@ -25,7 +25,9 @@ void FakeLocalFrameHost::EnterFullscreen( void FakeLocalFrameHost::ExitFullscreen() {} -void FakeLocalFrameHost::FullscreenStateChanged(bool is_fullscreen) {} +void FakeLocalFrameHost::FullscreenStateChanged( + bool is_fullscreen, + mojom::blink::FullscreenOptionsPtr options) {} void FakeLocalFrameHost::RegisterProtocolHandler(const WTF::String& scheme, const ::blink::KURL& url, @@ -175,6 +177,11 @@ void FakeLocalFrameHost::ShowPopupMenu( bool right_aligned, bool allow_multiple_selection) {} +void FakeLocalFrameHost::ShowContextMenu( + mojo::PendingAssociatedRemote<mojom::blink::ContextMenuClient> + context_menu_client, + const blink::UntrustworthyContextMenuParams& params) {} + void FakeLocalFrameHost::DidLoadResourceFromMemoryCache( const KURL& url, const WTF::String& http_method, @@ -182,30 +189,41 @@ void FakeLocalFrameHost::DidLoadResourceFromMemoryCache( network::mojom::blink::RequestDestination request_destination) {} void FakeLocalFrameHost::DidChangeFrameOwnerProperties( - const base::UnguessableToken& child_frame_token, + const blink::FrameToken& child_frame_token, mojom::blink::FrameOwnerPropertiesPtr frame_owner_properties) {} void FakeLocalFrameHost::DidChangeOpener( - const base::Optional<base::UnguessableToken>& opener_frame) {} + const base::Optional<LocalFrameToken>& opener_frame) {} void FakeLocalFrameHost::DidChangeCSPAttribute( - const base::UnguessableToken& child_frame_token, + const blink::FrameToken& child_frame_token, network::mojom::blink::ContentSecurityPolicyPtr) {} void FakeLocalFrameHost::DidChangeFramePolicy( - const base::UnguessableToken& child_frame_token, + const blink::FrameToken& child_frame_token, const FramePolicy& frame_policy) {} -void FakeLocalFrameHost::BindPolicyContainer( - mojo::PendingAssociatedReceiver<mojom::blink::PolicyContainerHost> - receiver) {} - void FakeLocalFrameHost::CapturePaintPreviewOfSubframe( const gfx::Rect& clip_rect, const base::UnguessableToken& guid) {} +void FakeLocalFrameHost::SetModalCloseListener( + mojo::PendingRemote<mojom::blink::ModalCloseListener>) {} + void FakeLocalFrameHost::Detach() {} +void FakeLocalFrameHost::GetKeepAliveHandleFactory( + mojo::PendingReceiver<mojom::blink::KeepAliveHandleFactory> receiver) {} + +void FakeLocalFrameHost::DidAddMessageToConsole( + mojom::ConsoleMessageLevel log_level, + const WTF::String& message, + int32_t line_no, + const WTF::String& source_id, + const WTF::String& untrusted_stack_trace) {} + +void FakeLocalFrameHost::FrameSizeChanged(const gfx::Size& frame_size) {} + void FakeLocalFrameHost::BindFrameHostReceiver( mojo::ScopedInterfaceEndpointHandle handle) { receiver_.Bind(mojo::PendingAssociatedReceiver<mojom::blink::LocalFrameHost>( diff --git a/chromium/third_party/blink/renderer/core/testing/fake_local_frame_host.h b/chromium/third_party/blink/renderer/core/testing/fake_local_frame_host.h index 84b55274873..4f6b1c7b33b 100644 --- a/chromium/third_party/blink/renderer/core/testing/fake_local_frame_host.h +++ b/chromium/third_party/blink/renderer/core/testing/fake_local_frame_host.h @@ -8,6 +8,8 @@ #include "mojo/public/cpp/bindings/associated_receiver_set.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" +#include "third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h" +#include "third_party/blink/public/mojom/context_menu/context_menu.mojom-blink.h" #include "third_party/blink/public/mojom/favicon/favicon_url.mojom-blink.h" #include "third_party/blink/public/mojom/frame/frame.mojom-blink.h" #include "third_party/blink/public/mojom/frame/policy_container.mojom-blink.h" @@ -27,7 +29,9 @@ class FakeLocalFrameHost : public mojom::blink::LocalFrameHost { void EnterFullscreen(mojom::blink::FullscreenOptionsPtr options, EnterFullscreenCallback callback) override; void ExitFullscreen() override; - void FullscreenStateChanged(bool is_fullscreen) override; + void FullscreenStateChanged( + bool is_fullscreen, + mojom::blink::FullscreenOptionsPtr options) override; void RegisterProtocolHandler(const WTF::String& scheme, const ::blink::KURL& url, bool user_gesture) override; @@ -111,28 +115,41 @@ class FakeLocalFrameHost : public mojom::blink::LocalFrameHost { Vector<mojom::blink::MenuItemPtr> menu_items, bool right_aligned, bool allow_multiple_selection) override; + void ShowContextMenu( + mojo::PendingAssociatedRemote<mojom::blink::ContextMenuClient> + context_menu_client, + const blink::UntrustworthyContextMenuParams& params) override; void DidLoadResourceFromMemoryCache( const KURL& url, const WTF::String& http_method, const WTF::String& mime_type, network::mojom::blink::RequestDestination request_destination) override; void DidChangeFrameOwnerProperties( - const base::UnguessableToken& child_frame_token, + const blink::FrameToken& child_frame_token, mojom::blink::FrameOwnerPropertiesPtr frame_owner_properties) override; void DidChangeOpener( - const base::Optional<base::UnguessableToken>& opener_frame) override; - void DidChangeCSPAttribute(const base::UnguessableToken& child_frame_token, + const base::Optional<LocalFrameToken>& opener_frame) override; + void DidChangeCSPAttribute(const blink::FrameToken& child_frame_token, network::mojom::blink::ContentSecurityPolicyPtr parsed_csp_attribute) override; - void DidChangeFramePolicy(const base::UnguessableToken& child_frame_token, + void DidChangeFramePolicy(const blink::FrameToken& child_frame_token, const FramePolicy& frame_policy) override; - void BindPolicyContainer( - mojo::PendingAssociatedReceiver<mojom::blink::PolicyContainerHost> - receiver) override; void CapturePaintPreviewOfSubframe( const gfx::Rect& clip_rect, const base::UnguessableToken& guid) override; + void SetModalCloseListener( + mojo::PendingRemote<mojom::blink::ModalCloseListener>) override; void Detach() override; + void GetKeepAliveHandleFactory( + mojo::PendingReceiver<mojom::blink::KeepAliveHandleFactory> receiver) + override; + void DidAddMessageToConsole( + mojom::blink::ConsoleMessageLevel log_level, + const WTF::String& message, + int32_t line_no, + const WTF::String& source_id, + const WTF::String& untrusted_stack_trace) override; + void FrameSizeChanged(const gfx::Size& frame_size) override; private: void BindFrameHostReceiver(mojo::ScopedInterfaceEndpointHandle handle); diff --git a/chromium/third_party/blink/renderer/core/testing/fake_remote_frame_host.cc b/chromium/third_party/blink/renderer/core/testing/fake_remote_frame_host.cc index 67e82050b35..a4d2140015e 100644 --- a/chromium/third_party/blink/renderer/core/testing/fake_remote_frame_host.cc +++ b/chromium/third_party/blink/renderer/core/testing/fake_remote_frame_host.cc @@ -17,8 +17,8 @@ void FakeRemoteFrameHost::SetInheritedEffectiveTouchAction( cc::TouchAction touch_action) {} void FakeRemoteFrameHost::UpdateRenderThrottlingStatus(bool is_throttled, - bool subtree_throttled) { -} + bool subtree_throttled, + bool display_locked) {} void FakeRemoteFrameHost::VisibilityChanged( mojom::blink::FrameVisibility visibility) {} @@ -34,14 +34,14 @@ void FakeRemoteFrameHost::CapturePaintPreviewOfCrossProcessSubframe( void FakeRemoteFrameHost::SetIsInert(bool inert) {} void FakeRemoteFrameHost::DidChangeOpener( - const base::Optional<base::UnguessableToken>& opener_frame_token) {} + const base::Optional<LocalFrameToken>& opener_frame_token) {} void FakeRemoteFrameHost::AdvanceFocus( blink::mojom::FocusType focus_type, - const base::UnguessableToken& source_frame_token) {} + const LocalFrameToken& source_frame_token) {} void FakeRemoteFrameHost::RouteMessageEvent( - const base::Optional<base::UnguessableToken>& source_frame_token, + const base::Optional<LocalFrameToken>& source_frame_token, const String& source_origin, const String& target_origin, BlinkTransferableMessage message) {} @@ -52,7 +52,11 @@ void FakeRemoteFrameHost::PrintCrossProcessSubframe(const gfx::Rect& rect, void FakeRemoteFrameHost::Detach() {} void FakeRemoteFrameHost::UpdateViewportIntersection( - blink::mojom::blink::ViewportIntersectionStatePtr intersection_state) {} + blink::mojom::blink::ViewportIntersectionStatePtr intersection_state, + const base::Optional<FrameVisualProperties>& visual_properties) {} + +void FakeRemoteFrameHost::SynchronizeVisualProperties( + const blink::FrameVisualProperties& properties) {} void FakeRemoteFrameHost::BindFrameHostReceiver( mojo::ScopedInterfaceEndpointHandle handle) { diff --git a/chromium/third_party/blink/renderer/core/testing/fake_remote_frame_host.h b/chromium/third_party/blink/renderer/core/testing/fake_remote_frame_host.h index 3b8c60293d1..91a1d719ee4 100644 --- a/chromium/third_party/blink/renderer/core/testing/fake_remote_frame_host.h +++ b/chromium/third_party/blink/renderer/core/testing/fake_remote_frame_host.h @@ -10,6 +10,7 @@ #include "mojo/public/cpp/bindings/associated_receiver_set.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" +#include "third_party/blink/public/common/frame/frame_visual_properties.h" #include "third_party/blink/public/mojom/frame/frame.mojom-blink.h" #include "third_party/blink/renderer/core/messaging/blink_transferable_message.h" @@ -26,7 +27,8 @@ class FakeRemoteFrameHost : public mojom::blink::RemoteFrameHost { void Init(blink::AssociatedInterfaceProvider* provider); void SetInheritedEffectiveTouchAction(cc::TouchAction touch_action) override; void UpdateRenderThrottlingStatus(bool is_throttled, - bool subtree_throttled) override; + bool subtree_throttled, + bool display_locked) override; void VisibilityChanged(mojom::blink::FrameVisibility visibility) override; void DidFocusFrame() override; void CheckCompleted() override; @@ -35,11 +37,11 @@ class FakeRemoteFrameHost : public mojom::blink::RemoteFrameHost { const base::UnguessableToken& guid) override; void SetIsInert(bool inert) override; void DidChangeOpener( - const base::Optional<base::UnguessableToken>& opener_frame) override; + const base::Optional<LocalFrameToken>& opener_frame) override; void AdvanceFocus(blink::mojom::FocusType focus_type, - const base::UnguessableToken& source_frame_token) override; + const LocalFrameToken& source_frame_token) override; void RouteMessageEvent( - const base::Optional<base::UnguessableToken>& source_frame_token, + const base::Optional<LocalFrameToken>& source_frame_token, const String& source_origin, const String& target_origin, BlinkTransferableMessage message) override; @@ -47,8 +49,11 @@ class FakeRemoteFrameHost : public mojom::blink::RemoteFrameHost { int document_cookie) override; void Detach() override; void UpdateViewportIntersection( - blink::mojom::blink::ViewportIntersectionStatePtr intersection_state) - override; + blink::mojom::blink::ViewportIntersectionStatePtr intersection_state, + const base::Optional<FrameVisualProperties>& visual_properties) override; + + void SynchronizeVisualProperties( + const blink::FrameVisualProperties& properties) override; private: void BindFrameHostReceiver(mojo::ScopedInterfaceEndpointHandle handle); diff --git a/chromium/third_party/blink/renderer/core/testing/fake_web_plugin.h b/chromium/third_party/blink/renderer/core/testing/fake_web_plugin.h index 93d00dad31f..cf5e751cfa0 100644 --- a/chromium/third_party/blink/renderer/core/testing/fake_web_plugin.h +++ b/chromium/third_party/blink/renderer/core/testing/fake_web_plugin.h @@ -55,10 +55,10 @@ class FakeWebPlugin : public WebPlugin { void Destroy() override; bool CanProcessDrag() const override { return false; } void UpdateAllLifecyclePhases(blink::DocumentUpdateReason) override {} - void Paint(cc::PaintCanvas*, const WebRect&) override {} - void UpdateGeometry(const WebRect& client_rect, - const WebRect& clip_rect, - const WebRect& window_clip_rect, + void Paint(cc::PaintCanvas*, const gfx::Rect&) override {} + void UpdateGeometry(const gfx::Rect& client_rect, + const gfx::Rect& clip_rect, + const gfx::Rect& window_clip_rect, bool is_visible) override {} void UpdateFocus(bool, mojom::blink::FocusType) override {} void UpdateVisibility(bool) override {} diff --git a/chromium/third_party/blink/renderer/core/testing/internal_settings.cc b/chromium/third_party/blink/renderer/core/testing/internal_settings.cc index 99aebc4f3a4..bb4fc83e71b 100644 --- a/chromium/third_party/blink/renderer/core/testing/internal_settings.cc +++ b/chromium/third_party/blink/renderer/core/testing/internal_settings.cc @@ -57,13 +57,16 @@ namespace blink { +using mojom::blink::HoverType; +using mojom::blink::PointerType; + InternalSettings::Backup::Backup(Settings* settings) : original_csp_(RuntimeEnabledFeatures:: ExperimentalContentSecurityPolicyFeaturesEnabled()), original_editing_behavior_(settings->GetEditingBehaviorType()), - original_text_autosizing_enabled_(settings->TextAutosizingEnabled()), + original_text_autosizing_enabled_(settings->GetTextAutosizingEnabled()), original_text_autosizing_window_size_override_( - settings->TextAutosizingWindowSizeOverride()), + settings->GetTextAutosizingWindowSizeOverride()), original_accessibility_font_scale_factor_( settings->GetAccessibilityFontScaleFactor()), original_media_type_override_(settings->GetMediaTypeOverride()), @@ -121,7 +124,7 @@ void InternalSettings::ResetToConsistentState() { backup_.RestoreTo(GetSettings()); backup_ = Backup(GetSettings()); backup_.original_text_autosizing_enabled_ = - GetSettings()->TextAutosizingEnabled(); + GetSettings()->GetTextAutosizingEnabled(); InternalSettingsGenerated::resetToConsistentState(); } @@ -373,11 +376,11 @@ void InternalSettings::setAvailablePointerTypes( String token = split_token.StripWhiteSpace(); if (token == "coarse") { - pointer_types |= ui::POINTER_TYPE_COARSE; + pointer_types |= static_cast<int>(PointerType::kPointerCoarseType); } else if (token == "fine") { - pointer_types |= ui::POINTER_TYPE_FINE; + pointer_types |= static_cast<int>(PointerType::kPointerFineType); } else if (token == "none") { - pointer_types |= ui::POINTER_TYPE_NONE; + pointer_types |= static_cast<int>(PointerType::kPointerNone); } else { exception_state.ThrowDOMException( DOMExceptionCode::kSyntaxError, @@ -418,13 +421,13 @@ void InternalSettings::setPrimaryPointerType(const String& pointer, InternalSettingsGuardForSettings(); String token = pointer.StripWhiteSpace(); - ui::PointerType type = ui::POINTER_TYPE_NONE; + PointerType type = PointerType::kPointerNone; if (token == "coarse") { - type = ui::POINTER_TYPE_COARSE; + type = PointerType::kPointerCoarseType; } else if (token == "fine") { - type = ui::POINTER_TYPE_FINE; + type = PointerType::kPointerFineType; } else if (token == "none") { - type = ui::POINTER_TYPE_NONE; + type = PointerType::kPointerNone; } else { exception_state.ThrowDOMException( DOMExceptionCode::kSyntaxError, @@ -448,9 +451,9 @@ void InternalSettings::setAvailableHoverTypes(const String& types, for (const String& split_token : tokens) { String token = split_token.StripWhiteSpace(); if (token == "none") { - hover_types |= ui::HOVER_TYPE_NONE; + hover_types |= static_cast<int>(HoverType::kHoverNone); } else if (token == "hover") { - hover_types |= ui::HOVER_TYPE_HOVER; + hover_types |= static_cast<int>(HoverType::kHoverHoverType); } else { exception_state.ThrowDOMException( DOMExceptionCode::kSyntaxError, @@ -467,11 +470,11 @@ void InternalSettings::setPrimaryHoverType(const String& type, InternalSettingsGuardForSettings(); String token = type.StripWhiteSpace(); - ui::HoverType hover_type = ui::HOVER_TYPE_NONE; + HoverType hover_type = HoverType::kHoverNone; if (token == "none") { - hover_type = ui::HOVER_TYPE_NONE; + hover_type = HoverType::kHoverNone; } else if (token == "hover") { - hover_type = ui::HOVER_TYPE_HOVER; + hover_type = HoverType::kHoverHoverType; } else { exception_state.ThrowDOMException( DOMExceptionCode::kSyntaxError, diff --git a/chromium/third_party/blink/renderer/core/testing/internals.cc b/chromium/third_party/blink/renderer/core/testing/internals.cc index eb3d6363d82..955af860a40 100644 --- a/chromium/third_party/blink/renderer/core/testing/internals.cc +++ b/chromium/third_party/blink/renderer/core/testing/internals.cc @@ -26,11 +26,15 @@ #include "third_party/blink/renderer/core/testing/internals.h" +#include <atomic> #include <memory> +#include <utility> #include "base/macros.h" #include "base/optional.h" +#include "base/process/process_handle.h" #include "cc/layers/picture_layer.h" +#include "cc/trees/layer_tree_host.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "third_party/blink/public/common/widget/device_emulation_params.h" #include "third_party/blink/public/mojom/devtools/inspector_issue.mojom-blink.h" @@ -58,7 +62,6 @@ #include "third_party/blink/renderer/core/dom/pseudo_element.h" #include "third_party/blink/renderer/core/dom/range.h" #include "third_party/blink/renderer/core/dom/shadow_root.h" -#include "third_party/blink/renderer/core/dom/shadow_root_v0.h" #include "third_party/blink/renderer/core/dom/static_node_list.h" #include "third_party/blink/renderer/core/dom/tree_scope.h" #include "third_party/blink/renderer/core/editing/drag_caret.h" @@ -102,7 +105,6 @@ #include "third_party/blink/renderer/core/html/forms/html_select_element.h" #include "third_party/blink/renderer/core/html/forms/html_text_area_element.h" #include "third_party/blink/renderer/core/html/forms/text_control_inner_elements.h" -#include "third_party/blink/renderer/core/html/html_content_element.h" #include "third_party/blink/renderer/core/html/html_iframe_element.h" #include "third_party/blink/renderer/core/html/html_image_element.h" #include "third_party/blink/renderer/core/html/media/html_media_element.h" @@ -139,6 +141,13 @@ #include "third_party/blink/renderer/core/scroll/programmatic_scroll_animator.h" #include "third_party/blink/renderer/core/scroll/scroll_animator_base.h" #include "third_party/blink/renderer/core/scroll/scrollbar_theme.h" +#include "third_party/blink/renderer/core/streams/readable_stream.h" +#include "third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.h" +#include "third_party/blink/renderer/core/streams/readable_stream_transferring_optimizer.h" +#include "third_party/blink/renderer/core/streams/underlying_sink_base.h" +#include "third_party/blink/renderer/core/streams/underlying_source_base.h" +#include "third_party/blink/renderer/core/streams/writable_stream.h" +#include "third_party/blink/renderer/core/streams/writable_stream_transferring_optimizer.h" #include "third_party/blink/renderer/core/style_property_shorthand.h" #include "third_party/blink/renderer/core/svg/svg_image_element.h" #include "third_party/blink/renderer/core/svg_names.h" @@ -223,6 +232,373 @@ class UseCounterHelperObserverImpl final : public UseCounterHelper::Observer { DISALLOW_COPY_AND_ASSIGN(UseCounterHelperObserverImpl); }; +class TestReadableStreamSource : public UnderlyingSourceBase { + public: + class Generator; + + using Reply = CrossThreadOnceFunction<void(std::unique_ptr<Generator>)>; + using OptimizerCallback = + CrossThreadOnceFunction<void(scoped_refptr<base::SingleThreadTaskRunner>, + Reply)>; + + enum class Type { + kWithNullOptimizer, + kWithPerformNullOptimizer, + kWithObservableOptimizer, + kWithPerfectOptimizer, + }; + + class Generator final { + USING_FAST_MALLOC(Generator); + + public: + explicit Generator(int max_count) : max_count_(max_count) {} + + base::Optional<int> Generate() { + if (count_ >= max_count_) { + return base::nullopt; + } + ++count_; + return current_++; + } + + void Add(int n) { current_ += n; } + + private: + friend class Optimizer; + + int current_ = 0; + int count_ = 0; + const int max_count_; + }; + + class Optimizer final : public ReadableStreamTransferringOptimizer { + USING_FAST_MALLOC(Optimizer); + + public: + Optimizer(scoped_refptr<base::SingleThreadTaskRunner> task_runner, + OptimizerCallback callback, + Type type) + : task_runner_(std::move(task_runner)), + callback_(std::move(callback)), + type_(type) {} + + UnderlyingSourceBase* PerformInProcessOptimization( + ScriptState* script_state) override; + + private: + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + OptimizerCallback callback_; + const Type type_; + }; + + TestReadableStreamSource(ScriptState* script_state, Type type) + : UnderlyingSourceBase(script_state), type_(type) {} + + ScriptPromise Start(ScriptState* script_state) override { + if (generator_) { + return ScriptPromise::CastUndefined(script_state); + } + resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); + return resolver_->Promise(); + } + + ScriptPromise pull(ScriptState* script_state) override { + if (!generator_) { + return ScriptPromise::CastUndefined(script_state); + } + + const auto result = generator_->Generate(); + if (!result) { + Controller()->Close(); + return ScriptPromise::CastUndefined(script_state); + } + Controller()->Enqueue(*result); + return ScriptPromise::CastUndefined(script_state); + } + + std::unique_ptr<ReadableStreamTransferringOptimizer> + CreateTransferringOptimizer(ScriptState* script_state) { + switch (type_) { + case Type::kWithNullOptimizer: + return nullptr; + case Type::kWithPerformNullOptimizer: + return std::make_unique<ReadableStreamTransferringOptimizer>(); + case Type::kWithObservableOptimizer: + case Type::kWithPerfectOptimizer: + ExecutionContext* context = ExecutionContext::From(script_state); + return std::make_unique<Optimizer>( + context->GetTaskRunner(TaskType::kInternalDefault), + CrossThreadBindOnce(&TestReadableStreamSource::Detach, + WrapCrossThreadWeakPersistent(this)), + type_); + } + } + + void Attach(std::unique_ptr<Generator> generator) { + if (type_ == Type::kWithObservableOptimizer) { + generator->Add(100); + } + generator_ = std::move(generator); + if (resolver_) { + resolver_->Resolve(); + } + } + + void Detach(scoped_refptr<base::SingleThreadTaskRunner> task_runner, + Reply reply) { + Controller()->Close(); + PostCrossThreadTask( + *task_runner, FROM_HERE, + CrossThreadBindOnce(std::move(reply), std::move(generator_))); + } + + void Trace(Visitor* visitor) const override { + visitor->Trace(resolver_); + UnderlyingSourceBase::Trace(visitor); + } + + private: + const Type type_; + std::unique_ptr<Generator> generator_; + Member<ScriptPromiseResolver> resolver_; +}; + +UnderlyingSourceBase* +TestReadableStreamSource::Optimizer::PerformInProcessOptimization( + ScriptState* script_state) { + TestReadableStreamSource* source = + MakeGarbageCollected<TestReadableStreamSource>(script_state, type_); + ExecutionContext* context = ExecutionContext::From(script_state); + + Reply reply = CrossThreadBindOnce(&TestReadableStreamSource::Attach, + WrapCrossThreadPersistent(source)); + + PostCrossThreadTask( + *task_runner_, FROM_HERE, + CrossThreadBindOnce(std::move(callback_), + context->GetTaskRunner(TaskType::kInternalDefault), + std::move(reply))); + return source; +} + +class TestWritableStreamSink final : public UnderlyingSinkBase { + public: + class InternalSink; + + using Reply = CrossThreadOnceFunction<void(std::unique_ptr<InternalSink>)>; + using OptimizerCallback = + CrossThreadOnceFunction<void(scoped_refptr<base::SingleThreadTaskRunner>, + Reply)>; + enum class Type { + kWithNullOptimizer, + kWithPerformNullOptimizer, + kWithObservableOptimizer, + kWithPerfectOptimizer, + }; + + class InternalSink final { + USING_FAST_MALLOC(InternalSink); + + public: + InternalSink(scoped_refptr<base::SingleThreadTaskRunner> task_runner, + CrossThreadOnceFunction<void(std::string)> success_callback, + CrossThreadOnceFunction<void()> error_callback) + : task_runner_(std::move(task_runner)), + success_callback_(std::move(success_callback)), + error_callback_(std::move(error_callback)) {} + + void Append(const std::string& s) { result_.append(s); } + void Close() { + PostCrossThreadTask( + *task_runner_, FROM_HERE, + CrossThreadBindOnce(std::move(success_callback_), result_)); + } + void Abort() { + PostCrossThreadTask(*task_runner_, FROM_HERE, std::move(error_callback_)); + } + + // We don't use WTF::String because this object can be accessed from + // multiple threads. + std::string result_; + + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + CrossThreadOnceFunction<void(std::string)> success_callback_; + CrossThreadOnceFunction<void()> error_callback_; + }; + + class Optimizer final : public WritableStreamTransferringOptimizer { + USING_FAST_MALLOC(Optimizer); + + public: + Optimizer( + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + OptimizerCallback callback, + scoped_refptr<base::RefCountedData<std::atomic_bool>> optimizer_flag, + Type type) + : task_runner_(std::move(task_runner)), + callback_(std::move(callback)), + optimizer_flag_(std::move(optimizer_flag)), + type_(type) {} + + UnderlyingSinkBase* PerformInProcessOptimization( + ScriptState* script_state) override; + + private: + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + OptimizerCallback callback_; + scoped_refptr<base::RefCountedData<std::atomic_bool>> optimizer_flag_; + const Type type_; + }; + + explicit TestWritableStreamSink(ScriptState* script_state, Type type) + : type_(type), + optimizer_flag_( + base::MakeRefCounted<base::RefCountedData<std::atomic_bool>>( + base::in_place, + false)) {} + + ScriptPromise start(ScriptState* script_state, + WritableStreamDefaultController*, + ExceptionState&) override { + if (internal_sink_) { + return ScriptPromise::CastUndefined(script_state); + } + start_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); + return start_resolver_->Promise(); + } + ScriptPromise write(ScriptState* script_state, + ScriptValue chunk, + WritableStreamDefaultController*, + ExceptionState&) override { + DCHECK(internal_sink_); + internal_sink_->Append( + ToCoreString(chunk.V8Value() + ->ToString(script_state->GetContext()) + .ToLocalChecked()) + .Utf8()); + return ScriptPromise::CastUndefined(script_state); + } + ScriptPromise close(ScriptState* script_state, ExceptionState&) override { + DCHECK(internal_sink_); + closed_ = true; + if (!optimizer_flag_->data.load()) { + // The normal closure case. + internal_sink_->Close(); + return ScriptPromise::CastUndefined(script_state); + } + + // When the optimizer is active, we need to detach `internal_sink_` and + // pass it to the optimizer (i.e., the sink in the destination realm). + if (detached_) { + PostCrossThreadTask( + *reply_task_runner_, FROM_HERE, + CrossThreadBindOnce(std::move(reply_), std::move(internal_sink_))); + } + return ScriptPromise::CastUndefined(script_state); + } + ScriptPromise abort(ScriptState* script_state, + ScriptValue reason, + ExceptionState&) override { + return ScriptPromise::CastUndefined(script_state); + } + + void Attach(std::unique_ptr<InternalSink> internal_sink) { + DCHECK(!internal_sink_); + + if (type_ == Type::kWithObservableOptimizer) { + internal_sink->Append("A"); + } + + internal_sink_ = std::move(internal_sink); + if (start_resolver_) { + start_resolver_->Resolve(); + } + } + + void Detach(scoped_refptr<base::SingleThreadTaskRunner> task_runner, + Reply reply) { + detached_ = true; + + // We need to wait for the close signal before actually detaching + // `internal_sink_`. + if (closed_) { + PostCrossThreadTask( + *task_runner, FROM_HERE, + CrossThreadBindOnce(std::move(reply), std::move(internal_sink_))); + } else { + reply_ = std::move(reply); + reply_task_runner_ = std::move(task_runner); + } + } + + std::unique_ptr<WritableStreamTransferringOptimizer> + CreateTransferringOptimizer(ScriptState* script_state) { + DCHECK(internal_sink_); + + if (type_ == Type::kWithNullOptimizer) { + return nullptr; + } + + ExecutionContext* context = ExecutionContext::From(script_state); + return std::make_unique<Optimizer>( + context->GetTaskRunner(TaskType::kInternalDefault), + CrossThreadBindOnce(&TestWritableStreamSink::Detach, + WrapCrossThreadWeakPersistent(this)), + optimizer_flag_, type_); + } + + void Trace(Visitor* visitor) const override { + visitor->Trace(start_resolver_); + UnderlyingSinkBase::Trace(visitor); + } + + static void Resolve(ScriptPromiseResolver* resolver, std::string result) { + resolver->Resolve(String::FromUTF8(result)); + } + static void Reject(ScriptPromiseResolver* resolver) { + ScriptState* script_state = resolver->GetScriptState(); + ScriptState::Scope scope(script_state); + resolver->Reject( + V8ThrowException::CreateTypeError(script_state->GetIsolate(), "error")); + } + + private: + const Type type_; + // `optimizer_flag_` is always non_null. The flag referenced is false + // initially, and set atomically when the associated optimizer is activated. + scoped_refptr<base::RefCountedData<std::atomic_bool>> optimizer_flag_; + std::unique_ptr<InternalSink> internal_sink_; + Member<ScriptPromiseResolver> start_resolver_; + bool closed_ = false; + bool detached_ = false; + Reply reply_; + scoped_refptr<base::SingleThreadTaskRunner> reply_task_runner_; +}; + +UnderlyingSinkBase* +TestWritableStreamSink::Optimizer::PerformInProcessOptimization( + ScriptState* script_state) { + if (type_ == Type::kWithPerformNullOptimizer) { + return nullptr; + } + TestWritableStreamSink* sink = + MakeGarbageCollected<TestWritableStreamSink>(script_state, type_); + + // Set the flag atomically, to notify that this optimizer is active. + optimizer_flag_->data.store(true); + + ExecutionContext* context = ExecutionContext::From(script_state); + Reply reply = CrossThreadBindOnce(&TestWritableStreamSink::Attach, + WrapCrossThreadPersistent(sink)); + PostCrossThreadTask( + *task_runner_, FROM_HERE, + CrossThreadBindOnce(std::move(callback_), + context->GetTaskRunner(TaskType::kInternalDefault), + std::move(reply))); + return sink; +} + } // namespace static base::Optional<DocumentMarker::MarkerType> MarkerTypeFrom( @@ -503,8 +879,7 @@ ScriptPromise Internals::getResourcePriority(ScriptState* script_state, DCHECK(document); auto callback = WTF::Bind(&Internals::ResolveResourcePriority, - WTF::Passed(WrapPersistent(this)), - WTF::Passed(WrapPersistent(resolver))); + WrapPersistent(this), WrapPersistent(resolver)); ResourceFetcher::AddPriorityObserverForTesting(resource_url, std::move(callback)); @@ -532,19 +907,6 @@ String Internals::getResourceHeader(const String& url, return resource->GetResourceRequest().HttpHeaderField(AtomicString(header)); } -bool Internals::isValidContentSelect(Element* insertion_point, - ExceptionState& exception_state) { - DCHECK(insertion_point); - if (!insertion_point->IsV0InsertionPoint()) { - exception_state.ThrowDOMException(DOMExceptionCode::kInvalidAccessError, - "The element is not an insertion point."); - return false; - } - - auto* html_content_element = DynamicTo<HTMLContentElement>(insertion_point); - return html_content_element && html_content_element->IsSelectValid(); -} - Node* Internals::treeScopeRootNode(Node* node) { DCHECK(node); return &node->GetTreeScope().RootNode(); @@ -598,7 +960,8 @@ void Internals::pauseAnimations(double pause_time, return; GetFrame()->View()->UpdateAllLifecyclePhasesForTest(); - GetFrame()->GetDocument()->Timeline().PauseAnimationsForTesting(pause_time); + GetFrame()->GetDocument()->Timeline().PauseAnimationsForTesting( + AnimationTimeDelta::FromSecondsD(pause_time)); } bool Internals::isCompositedAnimation(Animation* animation) { @@ -635,30 +998,6 @@ void Internals::advanceImageAnimation(Element* image, image_data->AdvanceAnimationForTesting(); } -bool Internals::hasShadowInsertionPoint(const Node* root, - ExceptionState& exception_state) const { - DCHECK(root); - if (!IsA<ShadowRoot>(root)) { - exception_state.ThrowDOMException( - DOMExceptionCode::kInvalidAccessError, - "The node argument is not a shadow root."); - return false; - } - return To<ShadowRoot>(root)->V0().ContainsShadowElements(); -} - -bool Internals::hasContentElement(const Node* root, - ExceptionState& exception_state) const { - DCHECK(root); - if (!IsA<ShadowRoot>(root)) { - exception_state.ThrowDOMException( - DOMExceptionCode::kInvalidAccessError, - "The node argument is not a shadow root."); - return false; - } - return To<ShadowRoot>(root)->V0().ContainsContentElements(); -} - uint32_t Internals::countElementShadow(const Node* root, ExceptionState& exception_state) const { DCHECK(root); @@ -798,8 +1137,6 @@ String Internals::shadowRootType(const Node* root, switch (shadow_root->GetType()) { case ShadowRootType::kUserAgent: return String("UserAgentShadowRoot"); - case ShadowRootType::V0: - return String("V0ShadowRoot"); case ShadowRootType::kOpen: return String("OpenShadowRoot"); case ShadowRootType::kClosed: @@ -2989,6 +3326,15 @@ void Internals::forceCompositingUpdate(Document* document, document->GetFrame()->View()->UpdateAllLifecyclePhasesForTest(); } +void Internals::setForcedColorsAndDarkPreferredColorScheme(Document* document) { + DCHECK(document); + ColorSchemeHelper color_scheme_helper(*document); + color_scheme_helper.SetPreferredColorScheme( + mojom::blink::PreferredColorScheme::kDark); + color_scheme_helper.SetForcedColors(*document, ForcedColors::kActive); + document->GetFrame()->View()->UpdateAllLifecyclePhasesForTest(); +} + void Internals::setShouldRevealPassword(Element* element, bool reveal, ExceptionState& exception_state) { @@ -3005,25 +3351,16 @@ void Internals::setShouldRevealPassword(Element* element, namespace { -class AddOneFunction : public ScriptFunction { +class AddOneFunction : public NewScriptFunction::Callable { public: - static v8::Local<v8::Function> CreateFunction(ScriptState* script_state) { - AddOneFunction* self = MakeGarbageCollected<AddOneFunction>(script_state); - return self->BindToV8Function(); - } - - explicit AddOneFunction(ScriptState* script_state) - : ScriptFunction(script_state) {} - - private: - ScriptValue Call(ScriptValue value) override { + ScriptValue Call(ScriptState* script_state, ScriptValue value) override { v8::Local<v8::Value> v8_value = value.V8Value(); DCHECK(v8_value->IsNumber()); int32_t int_value = static_cast<int32_t>(v8_value.As<v8::Integer>()->Value()); return ScriptValue( - GetScriptState()->GetIsolate(), - v8::Integer::New(GetScriptState()->GetIsolate(), int_value + 1)); + script_state->GetIsolate(), + v8::Integer::New(script_state->GetIsolate(), int_value + 1)); } }; @@ -3047,7 +3384,8 @@ ScriptPromise Internals::createRejectedPromise(ScriptState* script_state, ScriptPromise Internals::addOneToPromise(ScriptState* script_state, ScriptPromise promise) { - return promise.Then(AddOneFunction::CreateFunction(script_state)); + return promise.Then(MakeGarbageCollected<NewScriptFunction>( + script_state, MakeGarbageCollected<AddOneFunction>())); } ScriptPromise Internals::promiseCheck(ScriptState* script_state, @@ -3193,8 +3531,14 @@ String Internals::selectedTextForClipboard() { void Internals::setVisualViewportOffset(int x, int y) { if (!GetFrame()) return; + FloatPoint offset(x, y); - GetFrame()->GetPage()->GetVisualViewport().SetLocation(FloatPoint(x, y)); + // `setVisualViewportOffset()` inputs are in physical pixels, but + // `SetLocation()` gets positions in DIPs when --use-zoom-for-dsf disabled. + GetFrame()->GetPage()->GetVisualViewport().SetLocation( + Platform::Current()->IsUseZoomForDSFEnabled() + ? offset + : offset.ScaledBy(1 / GetFrame()->DevicePixelRatio())); } bool Internals::isUseCounted(Document* document, uint32_t feature) { @@ -3206,13 +3550,13 @@ bool Internals::isUseCounted(Document* document, uint32_t feature) { bool Internals::isCSSPropertyUseCounted(Document* document, const String& property_name) { return document->IsPropertyCounted( - unresolvedCSSPropertyID(document->GetExecutionContext(), property_name)); + UnresolvedCSSPropertyID(document->GetExecutionContext(), property_name)); } bool Internals::isAnimatedCSSPropertyUseCounted(Document* document, const String& property_name) { return document->IsAnimatedPropertyCounted( - unresolvedCSSPropertyID(document->GetExecutionContext(), property_name)); + UnresolvedCSSPropertyID(document->GetExecutionContext(), property_name)); } void Internals::clearUseCounter(Document* document, uint32_t feature) { @@ -3246,7 +3590,7 @@ Vector<String> Internals::getCSSPropertyShorthands() const { Vector<String> Internals::getCSSPropertyAliases() const { Vector<String> result; for (CSSPropertyID alias : kCSSPropertyAliasList) { - DCHECK(isPropertyAlias(alias)); + DCHECK(IsPropertyAlias(alias)); result.push_back(CSSUnresolvedProperty::GetAliasProperty(alias) ->GetPropertyNameString()); } @@ -3395,10 +3739,6 @@ bool Internals::isTrackingOcclusionForIFrame(HTMLIFrameElement* iframe) const { return remote_frame->View()->NeedsOcclusionTracking(); } -void Internals::DisableFrequencyCappingForOverlayPopupDetection() const { - OverlayInterstitialAdDetector::DisableFrequencyCappingForTesting(); -} - void Internals::addEmbedderCustomElementName(const AtomicString& name, ExceptionState& exception_state) { CustomElement::AddEmbedderCustomElementNameForTesting(name, exception_state); @@ -3475,10 +3815,8 @@ String Internals::getAgentId(DOMWindow* window) { if (!window->IsLocalDOMWindow()) return String(); - // Sounds like there's no notion of "process ID" in Blink, but the main - // thread's thread ID serves for that purpose. - PlatformThreadId process_id = Thread::MainThread()->ThreadId(); - + // Create a unique id from the process id and the address of the agent. + const base::ProcessId process_id = base::GetCurrentProcId(); uintptr_t agent_address = reinterpret_cast<uintptr_t>(To<LocalDOMWindow>(window)->GetAgent()); @@ -3522,4 +3860,81 @@ void Internals::setIsAdSubframe(HTMLIFrameElement* iframe, : blink::mojom::AdFrameType::kRootAd); } +ReadableStream* Internals::createReadableStream( + ScriptState* script_state, + int32_t queue_size, + const String& optimizer, + ExceptionState& exception_state) { + TestReadableStreamSource::Type type; + if (optimizer.IsEmpty()) { + type = TestReadableStreamSource::Type::kWithNullOptimizer; + } else if (optimizer == "perform-null") { + type = TestReadableStreamSource::Type::kWithPerformNullOptimizer; + } else if (optimizer == "observable") { + type = TestReadableStreamSource::Type::kWithObservableOptimizer; + } else if (optimizer == "perfect") { + type = TestReadableStreamSource::Type::kWithPerformNullOptimizer; + } else { + exception_state.ThrowRangeError( + "The \"optimizer\" parameter is not correctly set."); + return nullptr; + } + auto* source = + MakeGarbageCollected<TestReadableStreamSource>(script_state, type); + source->Attach(std::make_unique<TestReadableStreamSource::Generator>(10)); + return ReadableStream::CreateWithCountQueueingStrategy( + script_state, source, queue_size, + source->CreateTransferringOptimizer(script_state)); +} + +ScriptValue Internals::createWritableStreamAndSink( + ScriptState* script_state, + int32_t queue_size, + const String& optimizer, + ExceptionState& exception_state) { + TestWritableStreamSink::Type type; + if (optimizer.IsEmpty()) { + type = TestWritableStreamSink::Type::kWithNullOptimizer; + } else if (optimizer == "perform-null") { + type = TestWritableStreamSink::Type::kWithPerformNullOptimizer; + } else if (optimizer == "observable") { + type = TestWritableStreamSink::Type::kWithObservableOptimizer; + } else if (optimizer == "perfect") { + type = TestWritableStreamSink::Type::kWithPerfectOptimizer; + } else { + exception_state.ThrowRangeError( + "The \"optimizer\" parameter is not correctly set."); + return ScriptValue(); + } + + ExecutionContext* context = ExecutionContext::From(script_state); + auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); + auto internal_sink = std::make_unique<TestWritableStreamSink::InternalSink>( + context->GetTaskRunner(TaskType::kInternalDefault), + CrossThreadBindOnce(&TestWritableStreamSink::Resolve, + WrapCrossThreadPersistent(resolver)), + CrossThreadBindOnce(&TestWritableStreamSink::Reject, + WrapCrossThreadPersistent(resolver))); + auto* sink = MakeGarbageCollected<TestWritableStreamSink>(script_state, type); + + sink->Attach(std::move(internal_sink)); + auto* stream = WritableStream::CreateWithCountQueueingStrategy( + script_state, sink, queue_size, + sink->CreateTransferringOptimizer(script_state)); + + v8::Local<v8::Object> object = v8::Object::New(script_state->GetIsolate()); + object + ->Set(script_state->GetContext(), + V8String(script_state->GetIsolate(), "stream"), + ToV8(stream, script_state)) + + .Check(); + object + ->Set(script_state->GetContext(), + V8String(script_state->GetIsolate(), "sink"), + ToV8(resolver->Promise(), script_state)) + .Check(); + return ScriptValue(script_state->GetIsolate(), object); +} + } // namespace blink diff --git a/chromium/third_party/blink/renderer/core/testing/internals.h b/chromium/third_party/blink/renderer/core/testing/internals.h index 96de90eb180..c89c13ba5f3 100644 --- a/chromium/third_party/blink/renderer/core/testing/internals.h +++ b/chromium/third_party/blink/renderer/core/testing/internals.h @@ -31,6 +31,7 @@ #include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/core/css/css_computed_style_declaration.h" #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" +#include "third_party/blink/renderer/core/testing/color_scheme_helper.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" @@ -72,6 +73,7 @@ class Node; class OriginTrialsTest; class Page; class Range; +class ReadableStream; class RecordTest; class ScriptPromiseResolver; class ScrollState; @@ -122,8 +124,6 @@ class Internals final : public ScriptWrappable { ShadowRoot* shadowRoot(Element* host); String shadowRootType(const Node*, ExceptionState&) const; - bool hasShadowInsertionPoint(const Node*, ExceptionState&) const; - bool hasContentElement(const Node*, ExceptionState&) const; uint32_t countElementShadow(const Node*, ExceptionState&) const; const AtomicString& shadowPseudoId(Element*); @@ -138,7 +138,6 @@ class Internals final : public ScriptWrappable { // animation update for CSS and advance the SMIL timeline by one frame. void advanceImageAnimation(Element* image, ExceptionState&); - bool isValidContentSelect(Element* insertion_point, ExceptionState&); Node* treeScopeRootNode(Node*); Node* parentTreeScope(Node*); uint16_t compareTreeScopePosition(const Node*, @@ -472,6 +471,8 @@ class Internals final : public ScriptWrappable { void forceCompositingUpdate(Document*, ExceptionState&); + void setForcedColorsAndDarkPreferredColorScheme(Document* document); + void setShouldRevealPassword(Element*, bool, ExceptionState&); ScriptPromise createResolvedPromise(ScriptState*, ScriptValue); @@ -596,8 +597,6 @@ class Internals final : public ScriptWrappable { bool isSiteIsolated(HTMLIFrameElement* iframe) const; bool isTrackingOcclusionForIFrame(HTMLIFrameElement* iframe) const; - void DisableFrequencyCappingForOverlayPopupDetection() const; - void addEmbedderCustomElementName(const AtomicString& name, ExceptionState&); LocalFrame* GetFrame() const; @@ -614,6 +613,16 @@ class Internals final : public ScriptWrappable { void setIsAdSubframe(HTMLIFrameElement* iframe, ExceptionState& exception_state); + ReadableStream* createReadableStream(ScriptState* script_state, + int32_t queueSize, + const String& optimizer, + ExceptionState&); + + ScriptValue createWritableStreamAndSink(ScriptState* script_state, + int32_t queueSize, + const String& optimizer, + ExceptionState&); + private: Document* ContextDocument() const; Vector<String> IconURLs(Document*, int icon_types_mask) const; diff --git a/chromium/third_party/blink/renderer/core/testing/internals.idl b/chromium/third_party/blink/renderer/core/testing/internals.idl index db1171d7e2f..af4e47d1c01 100644 --- a/chromium/third_party/blink/renderer/core/testing/internals.idl +++ b/chromium/third_party/blink/renderer/core/testing/internals.idl @@ -56,11 +56,8 @@ Node effectiveRootScroller(Document document); [RaisesException] DOMString shadowRootType(Node root); - [RaisesException] boolean hasShadowInsertionPoint(Node root); - [RaisesException] boolean hasContentElement(Node root); [RaisesException] unsigned long countElementShadow(Node Root); DOMString shadowPseudoId(Element element); - [RaisesException] boolean isValidContentSelect(Element contentElement); Node treeScopeRootNode(Node node); Node parentTreeScope(Node node); [RaisesException] unsigned short compareTreeScopePosition(Node treeScope1, Node treeScope2); @@ -298,6 +295,8 @@ [RaisesException] void forceCompositingUpdate(Document document); + void setForcedColorsAndDarkPreferredColorScheme(Document document); + [RaisesException] void setShouldRevealPassword(Element element, boolean reveal); [CallWith=ScriptState] Promise<any> createResolvedPromise(any value); @@ -415,11 +414,6 @@ // instances that track visibility. boolean isTrackingOcclusionForIFrame(HTMLIFrameElement iframe); - // Disable the frequency capping for overlay popup detection. This - // eliminates the need to for waitings in web tests to trigger a detection - // event. - void DisableFrequencyCappingForOverlayPopupDetection(); - // Declare that the given |name| is in use by the embedder via the custom // element mechanism. [RaisesException] void addEmbedderCustomElementName(DOMString name); @@ -451,4 +445,9 @@ void generateTestReport(DOMString message); [RaisesException] void setIsAdSubframe(HTMLIFrameElement iframe); + + [RaisesException, CallWith=ScriptState] ReadableStream createReadableStream(long queueSize, DOMString optimizer); + // The return value consists of a WritableStream (.stream) and a promise of + // a sink object (.sink). + [RaisesException, CallWith=ScriptState] any createWritableStreamAndSink(long queueSize, DOMString optimizer); }; diff --git a/chromium/third_party/blink/renderer/core/testing/intersection_observer_test_helper.h b/chromium/third_party/blink/renderer/core/testing/intersection_observer_test_helper.h new file mode 100644 index 00000000000..785bb0fa0cf --- /dev/null +++ b/chromium/third_party/blink/renderer/core/testing/intersection_observer_test_helper.h @@ -0,0 +1,61 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_INTERSECTION_OBSERVER_TEST_HELPER_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_INTERSECTION_OBSERVER_TEST_HELPER_H_ + +#include "third_party/blink/renderer/core/intersection_observer/intersection_observer_delegate.h" +#include "third_party/blink/renderer/core/intersection_observer/intersection_observer_entry.h" + +namespace blink { + +class TestIntersectionObserverDelegate : public IntersectionObserverDelegate { + public: + explicit TestIntersectionObserverDelegate(Document& document) + : document_(document), call_count_(0) {} + // TODO(szager): Add tests for the synchronous delivery code path. There is + // already some indirect coverage by unit tests exercising features that rely + // on it, but we should have some direct coverage in here. + LocalFrameUkmAggregator::MetricId GetUkmMetricId() const override { + return LocalFrameUkmAggregator::kJavascriptIntersectionObserver; + } + IntersectionObserver::DeliveryBehavior GetDeliveryBehavior() const override { + return IntersectionObserver::kPostTaskToDeliver; + } + void Deliver(const HeapVector<Member<IntersectionObserverEntry>>& entries, + IntersectionObserver&) override { + call_count_++; + entries_.AppendVector(entries); + } + ExecutionContext* GetExecutionContext() const override { + return document_->GetExecutionContext(); + } + int CallCount() const { return call_count_; } + int EntryCount() const { return entries_.size(); } + const IntersectionObserverEntry* LastEntry() const { return entries_.back(); } + void Clear() { + entries_.clear(); + call_count_ = 0; + } + PhysicalRect LastIntersectionRect() const { + if (entries_.IsEmpty()) + return PhysicalRect(); + const IntersectionGeometry& geometry = entries_.back()->GetGeometry(); + return geometry.IntersectionRect(); + } + + void Trace(Visitor* visitor) const override { + IntersectionObserverDelegate::Trace(visitor); + visitor->Trace(document_); + visitor->Trace(entries_); + } + + private: + Member<Document> document_; + HeapVector<Member<IntersectionObserverEntry>> entries_; + int call_count_; +}; +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_INTERSECTION_OBSERVER_TEST_HELPER_H_ diff --git a/chromium/third_party/blink/renderer/core/testing/mock_clipboard_host.cc b/chromium/third_party/blink/renderer/core/testing/mock_clipboard_host.cc index 120840e69ac..4cc25246733 100644 --- a/chromium/third_party/blink/renderer/core/testing/mock_clipboard_host.cc +++ b/chromium/third_party/blink/renderer/core/testing/mock_clipboard_host.cc @@ -100,6 +100,11 @@ void MockClipboardHost::ReadImage(mojom::ClipboardBuffer clipboard_buffer, std::move(callback).Run(image_); } +void MockClipboardHost::ReadFiles(mojom::ClipboardBuffer clipboard_buffer, + ReadFilesCallback callback) { + std::move(callback).Run(mojom::blink::ClipboardFiles::New()); +} + void MockClipboardHost::ReadCustomData(mojom::ClipboardBuffer clipboard_buffer, const String& type, ReadCustomDataCallback callback) { diff --git a/chromium/third_party/blink/renderer/core/testing/mock_clipboard_host.h b/chromium/third_party/blink/renderer/core/testing/mock_clipboard_host.h index 7df1da1b2e8..b725a7ee672 100644 --- a/chromium/third_party/blink/renderer/core/testing/mock_clipboard_host.h +++ b/chromium/third_party/blink/renderer/core/testing/mock_clipboard_host.h @@ -43,6 +43,8 @@ class MockClipboardHost : public mojom::blink::ClipboardHost { ReadRtfCallback callback) override; void ReadImage(mojom::ClipboardBuffer clipboard_buffer, ReadImageCallback callback) override; + void ReadFiles(mojom::ClipboardBuffer clipboard_buffer, + ReadFilesCallback callback) override; void ReadCustomData(mojom::ClipboardBuffer clipboard_buffer, const String& type, ReadCustomDataCallback callback) override; diff --git a/chromium/third_party/blink/renderer/core/testing/mock_function_scope.cc b/chromium/third_party/blink/renderer/core/testing/mock_function_scope.cc new file mode 100644 index 00000000000..998ac45fb17 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/testing/mock_function_scope.cc @@ -0,0 +1,66 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/testing/mock_function_scope.h" +#include "third_party/blink/renderer/bindings/core/v8/script_function.h" +#include "third_party/blink/renderer/bindings/core/v8/script_value.h" +#include "third_party/blink/renderer/platform/bindings/script_state.h" +#include "third_party/blink/renderer/platform/bindings/v8_binding.h" +#include "third_party/blink/renderer/platform/heap/heap_allocator.h" + +namespace blink { + +MockFunctionScope::MockFunctionScope(ScriptState* script_state) + : script_state_(script_state) {} + +MockFunctionScope::~MockFunctionScope() { + v8::MicrotasksScope::PerformCheckpoint(script_state_->GetIsolate()); + for (MockFunction* mock_function : mock_functions_) { + testing::Mock::VerifyAndClearExpectations(mock_function); + } +} + +v8::Local<v8::Function> MockFunctionScope::ExpectCall(String* captor) { + mock_functions_.push_back( + MakeGarbageCollected<MockFunction>(script_state_, captor)); + EXPECT_CALL(*mock_functions_.back(), Call(testing::_)); + return mock_functions_.back()->Bind(); +} + +v8::Local<v8::Function> MockFunctionScope::ExpectCall() { + mock_functions_.push_back(MakeGarbageCollected<MockFunction>(script_state_)); + EXPECT_CALL(*mock_functions_.back(), Call(testing::_)); + return mock_functions_.back()->Bind(); +} + +v8::Local<v8::Function> MockFunctionScope::ExpectNoCall() { + mock_functions_.push_back(MakeGarbageCollected<MockFunction>(script_state_)); + EXPECT_CALL(*mock_functions_.back(), Call(testing::_)).Times(0); + return mock_functions_.back()->Bind(); +} + +ACTION_P2(SaveValueIn, script_state, captor) { + *captor = ToCoreString( + arg0.V8Value()->ToString(script_state->GetContext()).ToLocalChecked()); +} + +MockFunctionScope::MockFunction::MockFunction(ScriptState* script_state) + : ScriptFunction(script_state) { + ON_CALL(*this, Call(testing::_)).WillByDefault(testing::ReturnArg<0>()); +} + +MockFunctionScope::MockFunction::MockFunction(ScriptState* script_state, + String* captor) + : ScriptFunction(script_state) { + ON_CALL(*this, Call(testing::_)) + .WillByDefault( + testing::DoAll(SaveValueIn(WrapPersistent(script_state), captor), + testing::ReturnArg<0>())); +} + +v8::Local<v8::Function> MockFunctionScope::MockFunction::Bind() { + return BindToV8Function(); +} + +} // namespace blink diff --git a/chromium/third_party/blink/renderer/core/testing/mock_function_scope.h b/chromium/third_party/blink/renderer/core/testing/mock_function_scope.h new file mode 100644 index 00000000000..e575c5c8d87 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/testing/mock_function_scope.h @@ -0,0 +1,46 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_MOCK_FUNCTION_SCOPE_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_MOCK_FUNCTION_SCOPE_H_ + +#include "testing/gmock/include/gmock/gmock.h" +#include "third_party/blink/renderer/bindings/core/v8/script_function.h" +#include "third_party/blink/renderer/platform/heap/persistent.h" +#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" +#include "third_party/blink/renderer/platform/wtf/vector.h" + +namespace blink { + +class ScriptState; +class ScriptValue; + +class MockFunctionScope { + STACK_ALLOCATED(); + + public: + explicit MockFunctionScope(ScriptState*); + ~MockFunctionScope(); + + v8::Local<v8::Function> ExpectCall(); + v8::Local<v8::Function> ExpectCall(String* captor); + v8::Local<v8::Function> ExpectNoCall(); + + private: + class MockFunction : public ScriptFunction { + public: + explicit MockFunction(ScriptState*); + // TODO(http://crbug.com/1159794): add other convenience methods that allow + // the test case to capture non-String values. + MockFunction(ScriptState*, String* captor); + v8::Local<v8::Function> Bind(); + MOCK_METHOD1(Call, ScriptValue(ScriptValue)); + }; + + ScriptState* script_state_; + Vector<Persistent<MockFunction>> mock_functions_; +}; + +} // namespace blink +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_MOCK_FUNCTION_SCOPE_H_ diff --git a/chromium/third_party/blink/renderer/core/testing/mock_policy_container_host.cc b/chromium/third_party/blink/renderer/core/testing/mock_policy_container_host.cc index 5c40b997035..16fb0903df5 100644 --- a/chromium/third_party/blink/renderer/core/testing/mock_policy_container_host.cc +++ b/chromium/third_party/blink/renderer/core/testing/mock_policy_container_host.cc @@ -15,4 +15,11 @@ void MockPolicyContainerHost::FlushForTesting() { receiver_.FlushForTesting(); } +void MockPolicyContainerHost::BindWithNewEndpoint( + mojo::PendingAssociatedReceiver<mojom::blink::PolicyContainerHost> + receiver) { + receiver.EnableUnassociatedUsage(); + receiver_.Bind(std::move(receiver)); +} + } // namespace blink diff --git a/chromium/third_party/blink/renderer/core/testing/mock_policy_container_host.h b/chromium/third_party/blink/renderer/core/testing/mock_policy_container_host.h index 7f34a984e59..c2ededd4975 100644 --- a/chromium/third_party/blink/renderer/core/testing/mock_policy_container_host.h +++ b/chromium/third_party/blink/renderer/core/testing/mock_policy_container_host.h @@ -18,12 +18,26 @@ class MockPolicyContainerHost : public mojom::blink::PolicyContainerHost { SetReferrerPolicy, (network::mojom::ReferrerPolicy), (override)); + MOCK_METHOD( + void, + IssueKeepAliveHandle, + (mojo::PendingReceiver<mojom::blink::PolicyContainerHostKeepAliveHandle>), + (override)); MockPolicyContainerHost() = default; + // Wrapper around AssociatedReceiver::BindNewEndpointAndPassDedicatedRemote. mojo::PendingAssociatedRemote<mojom::blink::PolicyContainerHost> BindNewEndpointAndPassDedicatedRemote(); + + // Wrapper around AssociatedReceiver::FlushForTesting. void FlushForTesting(); + // This does the same as BindNewEndpointAndPassDedicatedRemote, but allows the + // remote to be created first and the receiver to be passed in. + void BindWithNewEndpoint( + mojo::PendingAssociatedReceiver<mojom::blink::PolicyContainerHost> + receiver); + private: mojo::AssociatedReceiver<mojom::blink::PolicyContainerHost> receiver_{this}; }; diff --git a/chromium/third_party/blink/renderer/core/testing/module_test_base.cc b/chromium/third_party/blink/renderer/core/testing/module_test_base.cc index 9ddbd8dcc19..13b07bf4f11 100644 --- a/chromium/third_party/blink/renderer/core/testing/module_test_base.cc +++ b/chromium/third_party/blink/renderer/core/testing/module_test_base.cc @@ -3,12 +3,39 @@ // found in the LICENSE file. #include "third_party/blink/renderer/core/testing/module_test_base.h" +#include "third_party/blink/renderer/bindings/core/v8/module_record.h" #include "third_party/blink/renderer/bindings/core/v8/script_function.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" +#include "third_party/blink/renderer/bindings/core/v8/script_source_location_type.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" +#include "third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" +#include "third_party/blink/renderer/platform/loader/fetch/script_fetch_options.h" namespace blink { +v8::Local<v8::Module> ModuleTestBase::CompileModule( + v8::Isolate* isolate, + const char* source, + const KURL& url, + ExceptionState& exception_state) { + return CompileModule(isolate, String(source), url, exception_state); +} + +v8::Local<v8::Module> ModuleTestBase::CompileModule( + v8::Isolate* isolate, + String source, + const KURL& url, + ExceptionState& exception_state) { + ModuleScriptCreationParams params( + /*source_url=*/url, /*base_url=*/url, + ScriptSourceLocationType::kExternalFile, ModuleType::kJavaScript, + ParkableString(source.Impl()), nullptr); + return ModuleRecord::Compile(isolate, params, ScriptFetchOptions(), + TextPosition::MinimumPosition(), + exception_state); +} + void ParametrizedModuleTestBase::SetUp(bool use_top_level_await) { if (use_top_level_await) { feature_list_.InitAndEnableFeature(features::kTopLevelAwait); @@ -78,7 +105,7 @@ v8::Local<v8::Value> ParametrizedModuleTestBase::GetResult( } ScriptPromise script_promise = result.GetPromise(script_state); - v8::Local<v8::Promise> promise = script_promise.V8Value().As<v8::Promise>(); + v8::Local<v8::Promise> promise = script_promise.V8Promise(); if (promise->State() == v8::Promise::kFulfilled) { return promise->Result(); } @@ -106,7 +133,7 @@ v8::Local<v8::Value> ParametrizedModuleTestBase::GetException( ScriptEvaluationResult::ResultType::kSuccess); ScriptPromise script_promise = result.GetPromise(script_state); - v8::Local<v8::Promise> promise = script_promise.V8Value().As<v8::Promise>(); + v8::Local<v8::Promise> promise = script_promise.V8Promise(); if (promise->State() == v8::Promise::kRejected) { return promise->Result(); } diff --git a/chromium/third_party/blink/renderer/core/testing/module_test_base.h b/chromium/third_party/blink/renderer/core/testing/module_test_base.h index a9762b90a97..91b017ea9fd 100644 --- a/chromium/third_party/blink/renderer/core/testing/module_test_base.h +++ b/chromium/third_party/blink/renderer/core/testing/module_test_base.h @@ -9,12 +9,28 @@ #include "base/test/scoped_feature_list.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/renderer/bindings/core/v8/script_evaluation_result.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" +#include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "v8/include/v8.h" namespace blink { +class ModuleTestBase { + public: + static v8::Local<v8::Module> CompileModule( + v8::Isolate*, + const char*, + const KURL&, + ExceptionState& state = DummyExceptionStateForTesting().ReturnThis()); + static v8::Local<v8::Module> CompileModule( + v8::Isolate*, + String, + const KURL&, + ExceptionState& state = DummyExceptionStateForTesting().ReturnThis()); +}; + // Helper used to enable or disable top-level await in parametrized tests. -class ParametrizedModuleTestBase { +class ParametrizedModuleTestBase : public ModuleTestBase { protected: void SetUp(bool use_top_level_await); void TearDown() {} diff --git a/chromium/third_party/blink/renderer/core/testing/null_execution_context.cc b/chromium/third_party/blink/renderer/core/testing/null_execution_context.cc index 5545bde85a4..1130e90eace 100644 --- a/chromium/third_party/blink/renderer/core/testing/null_execution_context.cc +++ b/chromium/third_party/blink/renderer/core/testing/null_execution_context.cc @@ -43,7 +43,8 @@ scoped_refptr<base::SingleThreadTaskRunner> NullExecutionContext::GetTaskRunner( return Thread::Current()->GetTaskRunner(); } -BrowserInterfaceBrokerProxy& NullExecutionContext::GetBrowserInterfaceBroker() { +const BrowserInterfaceBrokerProxy& +NullExecutionContext::GetBrowserInterfaceBroker() const { return GetEmptyBrowserInterfaceBroker(); } diff --git a/chromium/third_party/blink/renderer/core/testing/null_execution_context.h b/chromium/third_party/blink/renderer/core/testing/null_execution_context.h index 24c97bb9e47..e7bc27c16d9 100644 --- a/chromium/third_party/blink/renderer/core/testing/null_execution_context.h +++ b/chromium/third_party/blink/renderer/core/testing/null_execution_context.h @@ -52,7 +52,7 @@ class NullExecutionContext : public GarbageCollected<NullExecutionContext>, void CountUse(mojom::WebFeature) override {} - BrowserInterfaceBrokerProxy& GetBrowserInterfaceBroker() override; + const BrowserInterfaceBrokerProxy& GetBrowserInterfaceBroker() const override; ExecutionContextToken GetExecutionContextToken() const final { return token_; diff --git a/chromium/third_party/blink/renderer/core/testing/page_test_base.cc b/chromium/third_party/blink/renderer/core/testing/page_test_base.cc index cd07e256f18..2926376ada6 100644 --- a/chromium/third_party/blink/renderer/core/testing/page_test_base.cc +++ b/chromium/third_party/blink/renderer/core/testing/page_test_base.cc @@ -201,8 +201,8 @@ void PageTestBase::InsertStyleElement(const std::string& style_rules) { void PageTestBase::NavigateTo(const KURL& url, const WTF::HashMap<String, String>& headers) { - auto params = - WebNavigationParams::CreateWithHTMLBuffer(SharedBuffer::Create(), url); + auto params = WebNavigationParams::CreateWithHTMLBufferForTesting( + SharedBuffer::Create(), url); for (const auto& header : headers) params->response.SetHttpHeaderField(header.key, header.value); diff --git a/chromium/third_party/blink/renderer/core/testing/scoped_fake_ukm_recorder.cc b/chromium/third_party/blink/renderer/core/testing/scoped_fake_ukm_recorder.cc new file mode 100644 index 00000000000..ccaf85049e5 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/testing/scoped_fake_ukm_recorder.cc @@ -0,0 +1,53 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/testing/scoped_fake_ukm_recorder.h" + +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "services/metrics/public/mojom/ukm_interface.mojom-blink.h" +#include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h" +#include "third_party/blink/public/platform/platform.h" +#include "third_party/blink/renderer/platform/wtf/functional.h" +#include "third_party/blink/renderer/platform/wtf/std_lib_extras.h" + +namespace blink { + +ScopedFakeUkmRecorder::ScopedFakeUkmRecorder() + : recorder_(std::make_unique<ukm::TestUkmRecorder>()) { + Platform::Current()->GetBrowserInterfaceBroker()->SetBinderForTesting( + ukm::mojom::UkmRecorderInterface::Name_, + WTF::BindRepeating( + [](ScopedFakeUkmRecorder* interface, + mojo::ScopedMessagePipeHandle handle) { + interface->SetHandle(std::move(handle)); + }, + WTF::Unretained(this))); +} + +ScopedFakeUkmRecorder::~ScopedFakeUkmRecorder() { + Platform::Current()->GetBrowserInterfaceBroker()->SetBinderForTesting( + ukm::mojom::UkmRecorderInterface::Name_, {}); +} + +void ScopedFakeUkmRecorder::AddEntry(ukm::mojom::UkmEntryPtr entry) { + recorder_->AddEntry(std::move(entry)); +} + +void ScopedFakeUkmRecorder::UpdateSourceURL(int64_t source_id, + const std::string& url) { + recorder_->UpdateSourceURL(source_id, GURL(url)); +} + +void ScopedFakeUkmRecorder::ResetRecorder() { + recorder_ = std::make_unique<ukm::TestUkmRecorder>(); +} + +void ScopedFakeUkmRecorder::SetHandle(mojo::ScopedMessagePipeHandle handle) { + receiver_ = + std::make_unique<mojo::Receiver<ukm::mojom::UkmRecorderInterface>>( + this, mojo::PendingReceiver<ukm::mojom::UkmRecorderInterface>( + std::move(handle))); +} + +} // namespace blink diff --git a/chromium/third_party/blink/renderer/core/testing/scoped_fake_ukm_recorder.h b/chromium/third_party/blink/renderer/core/testing/scoped_fake_ukm_recorder.h new file mode 100644 index 00000000000..c7423756c41 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/testing/scoped_fake_ukm_recorder.h @@ -0,0 +1,42 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_SCOPED_FAKE_UKM_RECORDER_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_SCOPED_FAKE_UKM_RECORDER_H_ + +#include "components/ukm/test_ukm_recorder.h" +#include "mojo/public/cpp/bindings/receiver.h" + +namespace blink { + +// Class used to mock the UKM recorder living in the browser process and being +// served UKM events over Mojo. When instantiated, this class will register +// itself as the Mojo interface for the UkmRecorderInterface in the +// BrowserInterfaceBroker. It will then forward UKM logging events to a +// TestUkmRecorder instance it owns and make it available for validation. +// Consumers of this class should make sure to instantiate it before any other +// instance takes a dependency on that mojo interface. +class ScopedFakeUkmRecorder : public ukm::mojom::UkmRecorderInterface { + public: + explicit ScopedFakeUkmRecorder(); + ~ScopedFakeUkmRecorder() override; + + // ukm::mojom::UkmRecorderInterface: + void AddEntry(ukm::mojom::UkmEntryPtr entry) override; + void UpdateSourceURL(int64_t source_id, const std::string& url) override; + + void ResetRecorder(); + + ukm::TestUkmRecorder* recorder() { return recorder_.get(); } + + private: + void SetHandle(mojo::ScopedMessagePipeHandle handle); + + std::unique_ptr<mojo::Receiver<ukm::mojom::UkmRecorderInterface>> receiver_; + std::unique_ptr<ukm::TestUkmRecorder> recorder_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_SCOPED_FAKE_UKM_RECORDER_H_ diff --git a/chromium/third_party/blink/renderer/core/testing/scoped_mock_overlay_scrollbars.h b/chromium/third_party/blink/renderer/core/testing/scoped_mock_overlay_scrollbars.h index 4ae0ef4ba8e..44bbb12eea5 100644 --- a/chromium/third_party/blink/renderer/core/testing/scoped_mock_overlay_scrollbars.h +++ b/chromium/third_party/blink/renderer/core/testing/scoped_mock_overlay_scrollbars.h @@ -68,7 +68,7 @@ class ScopedMockOverlayScrollbars { // platform independent. if (use_mock_overlay_scrollbars_) return true; -#if defined(OS_ANDROID) || BUILDFLAG(IS_ASH) +#if defined(OS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) // Non-overlay scrollbar is not supported on Android and ChromeOS. return false; #else diff --git a/chromium/third_party/blink/renderer/core/testing/sim/sim_canvas.cc b/chromium/third_party/blink/renderer/core/testing/sim/sim_canvas.cc index 29217bb4175..ca14a3522f7 100644 --- a/chromium/third_party/blink/renderer/core/testing/sim/sim_canvas.cc +++ b/chromium/third_party/blink/renderer/core/testing/sim/sim_canvas.cc @@ -68,23 +68,25 @@ void SimCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { SkCanvas::onDrawPath(path, paint); } -void SimCanvas::onDrawImage(const SkImage* image, - SkScalar left, - SkScalar top, - const SkPaint* paint) { +void SimCanvas::onDrawImage2(const SkImage* image, + SkScalar left, + SkScalar top, + const SkSamplingOptions& sampling, + const SkPaint* paint) { DrawScope scope; AddCommand(CommandType::kImage); - SkCanvas::onDrawImage(image, left, top, paint); + SkCanvas::onDrawImage2(image, left, top, sampling, paint); } -void SimCanvas::onDrawImageRect(const SkImage* image, - const SkRect* src, - const SkRect& dst, - const SkPaint* paint, - SrcRectConstraint constraint) { +void SimCanvas::onDrawImageRect2(const SkImage* image, + const SkRect& src, + const SkRect& dst, + const SkSamplingOptions& sampling, + const SkPaint* paint, + SrcRectConstraint constraint) { DrawScope scope; AddCommand(CommandType::kImage); - SkCanvas::onDrawImageRect(image, src, dst, paint, constraint); + SkCanvas::onDrawImageRect2(image, src, dst, sampling, paint, constraint); } void SimCanvas::onDrawTextBlob(const SkTextBlob* blob, diff --git a/chromium/third_party/blink/renderer/core/testing/sim/sim_canvas.h b/chromium/third_party/blink/renderer/core/testing/sim/sim_canvas.h index eaf713f1552..5e58a1ac595 100644 --- a/chromium/third_party/blink/renderer/core/testing/sim/sim_canvas.h +++ b/chromium/third_party/blink/renderer/core/testing/sim/sim_canvas.h @@ -57,12 +57,17 @@ class SimCanvas : public SkCanvas { void onDrawPath(const SkPath&, const SkPaint&) override; // Image - void onDrawImage(const SkImage*, SkScalar, SkScalar, const SkPaint*) override; - void onDrawImageRect(const SkImage*, - const SkRect* src, - const SkRect& dst, - const SkPaint*, - SrcRectConstraint) override; + void onDrawImage2(const SkImage*, + SkScalar, + SkScalar, + const SkSamplingOptions&, + const SkPaint*) override; + void onDrawImageRect2(const SkImage*, + const SkRect& src, + const SkRect& dst, + const SkSamplingOptions&, + const SkPaint*, + SrcRectConstraint) override; // Text void onDrawTextBlob(const SkTextBlob*, diff --git a/chromium/third_party/blink/renderer/core/testing/sim/sim_compositor.cc b/chromium/third_party/blink/renderer/core/testing/sim/sim_compositor.cc index 92f9ed5276d..7dfb166b4f0 100644 --- a/chromium/third_party/blink/renderer/core/testing/sim/sim_compositor.cc +++ b/chromium/third_party/blink/renderer/core/testing/sim/sim_compositor.cc @@ -6,7 +6,6 @@ #include "cc/test/fake_layer_tree_frame_sink.h" #include "cc/trees/render_frame_metadata_observer.h" -#include "third_party/blink/public/platform/web_rect.h" #include "third_party/blink/renderer/core/exported/web_view_impl.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" @@ -37,20 +36,18 @@ void SimCompositor::SetWebView( SimCanvas::Commands SimCompositor::BeginFrame(double time_delta_in_seconds, bool raster) { DCHECK(web_view_); - DCHECK(!layer_tree_host()->defer_main_frame_update()); + DCHECK(!LayerTreeHost()->defer_main_frame_update()); // Verify that the need for a BeginMainFrame has been registered, and would // have caused the compositor to schedule one if we were using its scheduler. DCHECK(NeedsBeginFrame()); DCHECK_GT(time_delta_in_seconds, 0); - ClearAnimationScheduled(); - last_frame_time_ += base::TimeDelta::FromSecondsD(time_delta_in_seconds); SimCanvas::Commands commands; paint_commands_ = &commands; - layer_tree_host()->CompositeForTest(last_frame_time_, raster); + LayerTreeHost()->CompositeForTest(last_frame_time_, raster); paint_commands_ = nullptr; return commands; @@ -81,4 +78,12 @@ void SimCompositor::DidBeginMainFrame() { *paint_commands_ = PaintFrame(); } +void SimCompositor::SetLayerTreeHost(cc::LayerTreeHost* layer_tree_host) { + layer_tree_host_ = layer_tree_host; +} + +cc::LayerTreeHost* SimCompositor::LayerTreeHost() const { + return layer_tree_host_; +} + } // namespace blink diff --git a/chromium/third_party/blink/renderer/core/testing/sim/sim_compositor.h b/chromium/third_party/blink/renderer/core/testing/sim/sim_compositor.h index d0c070124c9..464d853b364 100644 --- a/chromium/third_party/blink/renderer/core/testing/sim/sim_compositor.h +++ b/chromium/third_party/blink/renderer/core/testing/sim/sim_compositor.h @@ -24,10 +24,10 @@ class WebViewImpl; // only part of the layer was invalid. // // Note: This also does not support compositor driven animations. -class SimCompositor final : public frame_test_helpers::TestWebWidgetClient { +class SimCompositor final { public: SimCompositor(); - ~SimCompositor() override; + ~SimCompositor(); // When the compositor asks for a main frame, this WebViewImpl will have its // lifecycle updated and be painted. @@ -39,6 +39,9 @@ class SimCompositor final : public frame_test_helpers::TestWebWidgetClient { // available on the WebViewImpl as well. void SetWebView(WebViewImpl&, frame_test_helpers::TestWebViewClient&); + // Set the LayerTreeHost that the compositor is associated with. + void SetLayerTreeHost(cc::LayerTreeHost*); + // Executes the BeginMainFrame processing steps, an approximation of what // cc::ThreadProxy::BeginMainFrame would do. // If time is not specified a 60Hz frame rate time progression is used. @@ -52,36 +55,38 @@ class SimCompositor final : public frame_test_helpers::TestWebWidgetClient { // Helpers to query the state of the compositor from tests. // // Returns true if a main frame has been requested from blink, until the - // BeginFrame() step occurs. The AnimationScheduled() checks if an explicit - // requet for BeginFrame() was made, vs an implicit one by making changes - // to the compositor's state. + // BeginFrame() step occurs. bool NeedsBeginFrame() const { - return AnimationScheduled() || - layer_tree_host()->RequestedMainFramePendingForTesting(); + return LayerTreeHost()->RequestedMainFramePendingForTesting(); } // Returns true if commits are deferred in the compositor. Since these tests // use synchronous compositing through BeginFrame(), the deferred state has no // real effect. bool DeferMainFrameUpdate() const { - return layer_tree_host()->defer_main_frame_update(); + return LayerTreeHost()->defer_main_frame_update(); } // Returns true if a selection is set on the compositor. bool HasSelection() const { - return layer_tree_host()->selection() != cc::LayerSelection(); + return LayerTreeHost()->selection() != cc::LayerSelection(); } // Returns the background color set on the compositor. - SkColor background_color() { return layer_tree_host()->background_color(); } + SkColor background_color() const { + return LayerTreeHost()->background_color(); + } base::TimeTicks LastFrameTime() const { return last_frame_time_; } + // Called when the begin frame occured. + void DidBeginMainFrame(); + + cc::LayerTreeHost* LayerTreeHost() const; + private: SimCanvas::Commands PaintFrame(); - // TestWebWidgetClient overrides: - void DidBeginMainFrame() override; - WebViewImpl* web_view_ = nullptr; frame_test_helpers::TestWebViewClient* test_web_view_client_ = nullptr; + cc::LayerTreeHost* layer_tree_host_ = nullptr; base::TimeTicks last_frame_time_; diff --git a/chromium/third_party/blink/renderer/core/testing/sim/sim_test.cc b/chromium/third_party/blink/renderer/core/testing/sim/sim_test.cc index df31ecd701d..8654d3ee26f 100644 --- a/chromium/third_party/blink/renderer/core/testing/sim/sim_test.cc +++ b/chromium/third_party/blink/renderer/core/testing/sim/sim_test.cc @@ -47,13 +47,18 @@ void SimTest::SetUp() { std::make_unique<frame_test_helpers::TestWebFrameClient>(); web_view_client_ = std::make_unique<frame_test_helpers::TestWebViewClient>(); page_ = std::make_unique<SimPage>(); - web_view_helper_ = std::make_unique<frame_test_helpers::WebViewHelper>(); + web_view_helper_ = + std::make_unique<frame_test_helpers::WebViewHelper>(base::BindRepeating( + &SimTest::CreateTestWebFrameWidget, base::Unretained(this))); - web_view_helper_->Initialize(web_frame_client_.get(), web_view_client_.get(), - compositor_.get()); + web_view_helper_->Initialize(web_frame_client_.get(), web_view_client_.get()); compositor_->SetWebView(WebView(), *web_view_client_); page_->SetPage(WebView().GetPage()); local_frame_root_ = WebView().MainFrameImpl(); + compositor_->SetLayerTreeHost( + local_frame_root_->FrameWidgetImpl()->LayerTreeHostForTesting()); + + WebView().MainFrameViewWidget()->Resize(gfx::Size(300, 200)); } void SimTest::TearDown() { @@ -83,10 +88,11 @@ void SimTest::InitializeRemote() { page_->SetPage(WebView().GetPage()); web_frame_client_ = std::make_unique<frame_test_helpers::TestWebFrameClient>(); - local_frame_root_ = frame_test_helpers::CreateLocalChild( + local_frame_root_ = web_view_helper_->CreateLocalChild( *WebView().MainFrame()->ToWebRemoteFrame(), "local_frame_root", - WebFrameOwnerProperties(), nullptr, web_frame_client_.get(), - compositor_.get()); + WebFrameOwnerProperties(), nullptr, web_frame_client_.get()); + compositor_->SetLayerTreeHost( + local_frame_root_->FrameWidgetImpl()->LayerTreeHostForTesting()); } void SimTest::LoadURL(const String& url_string) { @@ -128,14 +134,14 @@ frame_test_helpers::TestWebViewClient& SimTest::WebViewClient() { return *web_view_client_; } -frame_test_helpers::TestWebWidgetClient& SimTest::WebWidgetClient() { - return *compositor_; -} - frame_test_helpers::TestWebFrameClient& SimTest::WebFrameClient() { return *web_frame_client_; } +SimWebFrameWidget& SimTest::GetWebFrameWidget() { + return *static_cast<SimWebFrameWidget*>(local_frame_root_->FrameWidgetImpl()); +} + SimCompositor& SimTest::Compositor() { return *compositor_; } @@ -144,4 +150,51 @@ Vector<String>& SimTest::ConsoleMessages() { return web_frame_client_->ConsoleMessages(); } +SimWebFrameWidget* SimTest::CreateSimWebFrameWidget( + base::PassKey<WebLocalFrame> pass_key, + CrossVariantMojoAssociatedRemote<mojom::blink::FrameWidgetHostInterfaceBase> + frame_widget_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::FrameWidgetInterfaceBase> + frame_widget, + CrossVariantMojoAssociatedRemote<mojom::blink::WidgetHostInterfaceBase> + widget_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::WidgetInterfaceBase> + widget, + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const viz::FrameSinkId& frame_sink_id, + bool hidden, + bool never_composited, + bool is_for_child_local_root, + bool is_for_nested_main_frame, + SimCompositor* compositor) { + return MakeGarbageCollected<SimWebFrameWidget>( + compositor, std::move(pass_key), std::move(frame_widget_host), + std::move(frame_widget), std::move(widget_host), std::move(widget), + std::move(task_runner), frame_sink_id, hidden, never_composited, + is_for_child_local_root, is_for_nested_main_frame); +} + +frame_test_helpers::TestWebFrameWidget* SimTest::CreateTestWebFrameWidget( + base::PassKey<WebLocalFrame> pass_key, + CrossVariantMojoAssociatedRemote<mojom::blink::FrameWidgetHostInterfaceBase> + frame_widget_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::FrameWidgetInterfaceBase> + frame_widget, + CrossVariantMojoAssociatedRemote<mojom::blink::WidgetHostInterfaceBase> + widget_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::WidgetInterfaceBase> + widget, + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const viz::FrameSinkId& frame_sink_id, + bool hidden, + bool never_composited, + bool is_for_child_local_root, + bool is_for_nested_main_frame) { + return CreateSimWebFrameWidget( + std::move(pass_key), std::move(frame_widget_host), + std::move(frame_widget), std::move(widget_host), std::move(widget), + std::move(task_runner), frame_sink_id, hidden, never_composited, + is_for_child_local_root, is_for_nested_main_frame, compositor_.get()); +} + } // namespace blink diff --git a/chromium/third_party/blink/renderer/core/testing/sim/sim_test.h b/chromium/third_party/blink/renderer/core/testing/sim/sim_test.h index 1d5d8ffb211..cb301f5edbf 100644 --- a/chromium/third_party/blink/renderer/core/testing/sim/sim_test.h +++ b/chromium/third_party/blink/renderer/core/testing/sim/sim_test.h @@ -11,6 +11,7 @@ #include "third_party/blink/renderer/core/testing/sim/sim_compositor.h" #include "third_party/blink/renderer/core/testing/sim/sim_network.h" #include "third_party/blink/renderer/core/testing/sim/sim_page.h" +#include "third_party/blink/renderer/core/testing/sim/sim_web_frame_widget.h" namespace blink { @@ -43,13 +44,50 @@ class SimTest : public testing::Test { WebLocalFrameImpl& MainFrame(); WebLocalFrameImpl& LocalFrameRoot(); frame_test_helpers::TestWebViewClient& WebViewClient(); - frame_test_helpers::TestWebWidgetClient& WebWidgetClient(); frame_test_helpers::TestWebFrameClient& WebFrameClient(); + SimWebFrameWidget& GetWebFrameWidget(); SimCompositor& Compositor(); Vector<String>& ConsoleMessages(); + // Creates a SimWebFrameWidget. Subclasses can override this if the + // wish to create their own. + virtual SimWebFrameWidget* CreateSimWebFrameWidget( + base::PassKey<WebLocalFrame> pass_key, + CrossVariantMojoAssociatedRemote< + mojom::blink::FrameWidgetHostInterfaceBase> frame_widget_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::FrameWidgetInterfaceBase> + frame_widget, + CrossVariantMojoAssociatedRemote<mojom::blink::WidgetHostInterfaceBase> + widget_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::WidgetInterfaceBase> + widget, + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const viz::FrameSinkId& frame_sink_id, + bool hidden, + bool never_composited, + bool is_for_child_local_root, + bool is_for_nested_main_frame, + SimCompositor* compositor); + private: + frame_test_helpers::TestWebFrameWidget* CreateTestWebFrameWidget( + base::PassKey<WebLocalFrame> pass_key, + CrossVariantMojoAssociatedRemote< + mojom::blink::FrameWidgetHostInterfaceBase> frame_widget_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::FrameWidgetInterfaceBase> + frame_widget, + CrossVariantMojoAssociatedRemote<mojom::blink::WidgetHostInterfaceBase> + widget_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::WidgetInterfaceBase> + widget, + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const viz::FrameSinkId& frame_sink_id, + bool hidden, + bool never_composited, + bool is_for_child_local_root, + bool is_for_nested_main_frame); + // These are unique_ptrs in order to destroy them in TearDown. Subclasses // may override Platform::Current() and these must shutdown before the // subclass destructor. diff --git a/chromium/third_party/blink/renderer/core/testing/sim/sim_web_frame_widget.cc b/chromium/third_party/blink/renderer/core/testing/sim/sim_web_frame_widget.cc new file mode 100644 index 00000000000..5edf4296655 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/testing/sim/sim_web_frame_widget.cc @@ -0,0 +1,18 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/testing/sim/sim_web_frame_widget.h" + +#include "third_party/blink/renderer/core/testing/sim/sim_compositor.h" + +namespace blink { + +void SimWebFrameWidget::DidBeginMainFrame() { + // Notify the SimCompositor before calling the super, as the + // overriden method will advance the lifecycle. + sim_compositor_->DidBeginMainFrame(); + frame_test_helpers::TestWebFrameWidget::DidBeginMainFrame(); +} + +} // namespace blink diff --git a/chromium/third_party/blink/renderer/core/testing/sim/sim_web_frame_widget.h b/chromium/third_party/blink/renderer/core/testing/sim/sim_web_frame_widget.h new file mode 100644 index 00000000000..1c80a306f59 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/testing/sim/sim_web_frame_widget.h @@ -0,0 +1,30 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_SIM_SIM_WEB_FRAME_WIDGET_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_SIM_SIM_WEB_FRAME_WIDGET_H_ + +#include "third_party/blink/renderer/core/frame/frame_test_helpers.h" + +namespace blink { + +class SimCompositor; + +class SimWebFrameWidget : public frame_test_helpers::TestWebFrameWidget { + public: + template <typename... Args> + SimWebFrameWidget(SimCompositor* compositor, Args&&... args) + : frame_test_helpers::TestWebFrameWidget(std::forward<Args>(args)...), + sim_compositor_(compositor) {} + + // WidgetBaseClient overrides. + void DidBeginMainFrame() override; + + private: + SimCompositor* const sim_compositor_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_SIM_SIM_WEB_FRAME_WIDGET_H_ diff --git a/chromium/third_party/blink/renderer/core/testing/wait_for_event.cc b/chromium/third_party/blink/renderer/core/testing/wait_for_event.cc index 405cc582410..479a05f86b2 100644 --- a/chromium/third_party/blink/renderer/core/testing/wait_for_event.cc +++ b/chromium/third_party/blink/renderer/core/testing/wait_for_event.cc @@ -3,7 +3,7 @@ // found in the LICENSE file. #include "third_party/blink/renderer/core/testing/wait_for_event.h" -#include "third_party/blink/renderer/platform/heap/thread_state_scopes.h" +#include "third_party/blink/renderer/platform/heap/heap_test_utilities.h" #include "third_party/blink/renderer/core/dom/element.h" @@ -12,7 +12,7 @@ namespace blink { WaitForEvent::WaitForEvent(Element* element, const AtomicString& name) : element_(element), event_name_(name) { element_->addEventListener(event_name_, this); - ThreadState::HeapPointersOnStackScope scan_stack(ThreadState::Current()); + HeapPointersOnStackScope scan_stack(ThreadState::Current()); run_loop_.Run(); } |