diff --git a/.gitattributes b/.gitattributes index 74328c4..dfb4ad1 100644 --- a/.gitattributes +++ b/.gitattributes
@@ -1,2 +1,5 @@ # Stop Windows python license check presubmit errors by forcing LF checkout. *.py text eol=lf + +# Force LF checkout of the pins files to avoid transport_security_state_generator errors. +/net/http/*.pins text eol=lf
diff --git a/DEPS b/DEPS index 60b1c085..4d43ae3 100644 --- a/DEPS +++ b/DEPS
@@ -40,7 +40,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'ec045b431211082563a4352ccf2c9d5b3765048e', + 'skia_revision': '8fe24272fa6d2fa9eb2458221ed9852d6ec16f56', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -64,7 +64,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'f6f68c75ce54a5865fb19dcb075e7734f1639663', + 'pdfium_revision': 'b46ce4172ee8282a39997c175dff2bd8f187208f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -96,7 +96,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '1e3b1949cdcde84079ef3f0fa3f31610e2d1687d', + 'catapult_revision': '00b0c16c97088f5c06df9d3b27eaeb41f06173e5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other.
diff --git a/android_webview/browser/cookie_manager.cc b/android_webview/browser/cookie_manager.cc index cc09e6e..ae33e5a 100644 --- a/android_webview/browser/cookie_manager.cc +++ b/android_webview/browser/cookie_manager.cc
@@ -4,6 +4,8 @@ #include "android_webview/browser/cookie_manager.h" +#include <stdint.h> + #include <memory> #include <utility> #include <vector> @@ -206,7 +208,7 @@ void RemoveSessionCookiesHelper(BoolCallback callback); void RemoveAllCookiesHelper(BoolCallback callback); - void RemoveCookiesCompleted(BoolCallback callback, int num_deleted); + void RemoveCookiesCompleted(BoolCallback callback, uint32_t num_deleted); void FlushCookieStoreAsyncHelper(base::Closure complete); @@ -448,8 +450,8 @@ } void CookieManager::RemoveCookiesCompleted(BoolCallback callback, - int num_deleted) { - callback.Run(num_deleted > 0); + uint32_t num_deleted) { + callback.Run(num_deleted > 0u); } void CookieManager::RemoveAllCookies(
diff --git a/android_webview/browser/net/aw_cookie_store_wrapper.cc b/android_webview/browser/net/aw_cookie_store_wrapper.cc index 88b8a60..7a671e88 100644 --- a/android_webview/browser/net/aw_cookie_store_wrapper.cc +++ b/android_webview/browser/net/aw_cookie_store_wrapper.cc
@@ -294,7 +294,7 @@ DCHECK(client_task_runner_->RunsTasksInCurrentSequence()); PostTaskToCookieStoreTaskRunner( base::BindOnce(&DeleteCanonicalCookieAsyncOnCookieThread, cookie, - CreateWrappedCallback<int>(std::move(callback)))); + CreateWrappedCallback<uint32_t>(std::move(callback)))); } void AwCookieStoreWrapper::DeleteAllCreatedBetweenAsync( @@ -304,7 +304,7 @@ DCHECK(client_task_runner_->RunsTasksInCurrentSequence()); PostTaskToCookieStoreTaskRunner(base::BindOnce( &DeleteAllCreatedBetweenAsyncOnCookieThread, delete_begin, delete_end, - CreateWrappedCallback<int>(std::move(callback)))); + CreateWrappedCallback<uint32_t>(std::move(callback)))); } void AwCookieStoreWrapper::DeleteAllCreatedBetweenWithPredicateAsync( @@ -313,16 +313,17 @@ const CookiePredicate& predicate, DeleteCallback callback) { DCHECK(client_task_runner_->RunsTasksInCurrentSequence()); - PostTaskToCookieStoreTaskRunner(base::BindOnce( - &DeleteAllCreatedBetweenWithPredicateAsyncOnCookieThread, delete_begin, - delete_end, predicate, CreateWrappedCallback<int>(std::move(callback)))); + PostTaskToCookieStoreTaskRunner( + base::BindOnce(&DeleteAllCreatedBetweenWithPredicateAsyncOnCookieThread, + delete_begin, delete_end, predicate, + CreateWrappedCallback<uint32_t>(std::move(callback)))); } void AwCookieStoreWrapper::DeleteSessionCookiesAsync(DeleteCallback callback) { DCHECK(client_task_runner_->RunsTasksInCurrentSequence()); PostTaskToCookieStoreTaskRunner( base::BindOnce(&DeleteSessionCookiesAsyncOnCookieThread, - CreateWrappedCallback<int>(std::move(callback)))); + CreateWrappedCallback<uint32_t>(std::move(callback)))); } void AwCookieStoreWrapper::FlushStore(base::OnceClosure callback) {
diff --git a/android_webview/browser/net/aw_cookie_store_wrapper_unittest.cc b/android_webview/browser/net/aw_cookie_store_wrapper_unittest.cc index d856d24..a80d03b9 100644 --- a/android_webview/browser/net/aw_cookie_store_wrapper_unittest.cc +++ b/android_webview/browser/net/aw_cookie_store_wrapper_unittest.cc
@@ -4,6 +4,8 @@ #include "android_webview/browser/net/aw_cookie_store_wrapper.h" +#include <stdint.h> + #include <memory> #include "net/cookies/cookie_store.h" @@ -20,9 +22,9 @@ // Android Webview can run multiple tests without restarting the binary, // so have to delete any cookies the global store may have from an earlier // test. - net::ResultSavingCookieCallback<int> callback; + net::ResultSavingCookieCallback<uint32_t> callback; cookie_store->DeleteAllAsync( - base::Bind(&net::ResultSavingCookieCallback<int>::Run, + base::Bind(&net::ResultSavingCookieCallback<uint32_t>::Run, base::Unretained(&callback))); callback.WaitUntilDone();
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc index b5145db4..452df17 100644 --- a/ash/accelerators/accelerator_controller.cc +++ b/ash/accelerators/accelerator_controller.cc
@@ -378,7 +378,8 @@ // Search key. if (previous_accelerator.key_state() != ui::Accelerator::KeyState::PRESSED || - previous_accelerator.key_code() != ui::VKEY_LWIN) { + previous_accelerator.key_code() != ui::VKEY_LWIN || + previous_accelerator.interrupted_by_mouse_event()) { return false; }
diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc index 6519ab0..dd96cae 100644 --- a/ash/accelerators/accelerator_controller_unittest.cc +++ b/ash/accelerators/accelerator_controller_unittest.cc
@@ -862,6 +862,15 @@ CreateReleaseAccelerator(ui::VKEY_BROWSER_SEARCH, ui::EF_NONE))); RunAllPendingInMessageLoop(); EXPECT_EQ(3u, test_app_list_presenter.toggle_count()); + + // When pressed key is interrupted by mouse, the AppList should not toggle. + EXPECT_FALSE( + ProcessInController(ui::Accelerator(ui::VKEY_LWIN, ui::EF_NONE))); + GetController()->accelerator_history()->InterruptCurrentAccelerator(); + EXPECT_FALSE(ProcessInController( + CreateReleaseAccelerator(ui::VKEY_LWIN, ui::EF_NONE))); + RunAllPendingInMessageLoop(); + EXPECT_EQ(3u, test_app_list_presenter.toggle_count()); } TEST_F(AcceleratorControllerTest, ImeGlobalAccelerators) {
diff --git a/ash/accelerators/accelerator_filter_unittest.cc b/ash/accelerators/accelerator_filter_unittest.cc index 603bbef..3b1897cb 100644 --- a/ash/accelerators/accelerator_filter_unittest.cc +++ b/ash/accelerators/accelerator_filter_unittest.cc
@@ -18,6 +18,8 @@ #include "ash/wm/window_state.h" #include "ash/wm/window_util.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/app_list/presenter/app_list.h" +#include "ui/app_list/presenter/test/test_app_list_presenter.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/test/aura_test_base.h" #include "ui/aura/test/test_windows.h" @@ -185,5 +187,27 @@ EXPECT_FALSE(session_controller->IsScreenLocked()); } +TEST_F(AcceleratorFilterTest, ToggleAppListInterruptedByMouseEvent) { + ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); + app_list::test::TestAppListPresenter test_app_list_presenter; + Shell::Get()->app_list()->SetAppListPresenter( + test_app_list_presenter.CreateInterfacePtrAndBind()); + EXPECT_EQ(0u, test_app_list_presenter.toggle_count()); + + // The AppList should toggle if no mouse event occurs between key press and + // key release. + generator.PressKey(ui::VKEY_LWIN, ui::EF_NONE); + generator.ReleaseKey(ui::VKEY_LWIN, ui::EF_NONE); + RunAllPendingInMessageLoop(); + EXPECT_EQ(1u, test_app_list_presenter.toggle_count()); + + // When pressed key is interrupted by mouse, the AppList should not toggle. + generator.PressKey(ui::VKEY_LWIN, ui::EF_NONE); + generator.ClickLeftButton(); + generator.ReleaseKey(ui::VKEY_LWIN, ui::EF_NONE); + RunAllPendingInMessageLoop(); + EXPECT_EQ(1u, test_app_list_presenter.toggle_count()); +} + } // namespace test } // namespace ash
diff --git a/ash/accelerators/accelerator_table.cc b/ash/accelerators/accelerator_table.cc index e3fc4d98..6d025f2 100644 --- a/ash/accelerators/accelerator_table.cc +++ b/ash/accelerators/accelerator_table.cc
@@ -161,6 +161,7 @@ // Voice Interaction shortcuts. {true, ui::VKEY_A, ui::EF_COMMAND_DOWN, START_VOICE_INTERACTION}, + {true, ui::VKEY_ASSISTANT, ui::EF_NONE, START_VOICE_INTERACTION}, // Temporary shortcut added for UX/PM exploration. // TODO(updowndota): Remove the temporary shortcut. {true, ui::VKEY_SPACE, ui::EF_COMMAND_DOWN, START_VOICE_INTERACTION},
diff --git a/ash/accelerators/accelerator_table_unittest.cc b/ash/accelerators/accelerator_table_unittest.cc index 2bee4f5..83c0de04 100644 --- a/ash/accelerators/accelerator_table_unittest.cc +++ b/ash/accelerators/accelerator_table_unittest.cc
@@ -15,12 +15,12 @@ namespace { -// The number of non-Search-based accelerators as of 2017-06-26. -constexpr int kNonSearchAcceleratorsNum = 92; -// The hash of non-Search-based accelerators as of 2017-06-26. +// The number of non-Search-based accelerators as of 2017-07-08. +constexpr int kNonSearchAcceleratorsNum = 93; +// The hash of non-Search-based accelerators as of 2017-07-08. // See HashAcceleratorData(). constexpr char kNonSearchAcceleratorsHash[] = - "c45246c981cba1fe2c6d0d3c494e1117"; + "b585642b182679454e0e924dffc92463"; struct Cmp { bool operator()(const AcceleratorData& lhs, const AcceleratorData& rhs) {
diff --git a/ash/laser/DEPS b/ash/laser/DEPS index 3ca145e0..89980df 100644 --- a/ash/laser/DEPS +++ b/ash/laser/DEPS
@@ -1,4 +1,5 @@ include_rules = [ "+cc", + "+components/viz/common/quads", "+gpu/command_buffer/client", ]
diff --git a/ash/laser/laser_pointer_view.cc b/ash/laser/laser_pointer_view.cc index 82ed189..73401bdd 100644 --- a/ash/laser/laser_pointer_view.cc +++ b/ash/laser/laser_pointer_view.cc
@@ -28,6 +28,7 @@ #include "cc/quads/texture_draw_quad.h" #include "cc/resources/texture_mailbox.h" #include "cc/resources/transferable_resource.h" +#include "components/viz/common/quads/resource_format.h" #include "gpu/command_buffer/client/context_support.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" @@ -685,7 +686,7 @@ cc::TransferableResource transferable_resource; transferable_resource.id = next_resource_id_++; - transferable_resource.format = cc::RGBA_8888; + transferable_resource.format = viz::RGBA_8888; transferable_resource.filter = GL_LINEAR; transferable_resource.size = buffer_size; transferable_resource.mailbox_holder =
diff --git a/base/bind_unittest.nc b/base/bind_unittest.nc index 61835be..cfdd9e7 100644 --- a/base/bind_unittest.nc +++ b/base/bind_unittest.nc
@@ -194,6 +194,24 @@ Bind(&VoidPolymorphic1<HasRef*>, for_raw_ptr); } +#elif defined(NCTEST_NO_RVALUE_CONST_RAW_PTR_FOR_REFCOUNTED_TYPES) // [r"fatal error: static_assert failed \"A parameter is a refcounted type and needs scoped_refptr.\""] + +// Refcounted types should not be bound as a raw pointer. +void WontCompile() { + const HasRef for_raw_ptr; + Callback<void()> ref_count_as_raw_ptr = + Bind(&VoidPolymorphic1<const HasRef*>, &for_raw_ptr); +} + +#elif defined(NCTEST_NO_LVALUE_CONST_RAW_PTR_FOR_REFCOUNTED_TYPES) // [r"fatal error: static_assert failed \"A parameter is a refcounted type and needs scoped_refptr.\""] + +// Refcounted types should not be bound as a raw pointer. +void WontCompile() { + const HasRef* for_raw_ptr = nullptr; + Callback<void()> ref_count_as_raw_ptr = + Bind(&VoidPolymorphic1<const HasRef*>, for_raw_ptr); +} + #elif defined(NCTEST_WEAKPTR_BIND_MUST_RETURN_VOID) // [r"fatal error: static_assert failed \"weak_ptrs can only bind to methods without return values\""] // WeakPtrs cannot be bound to methods with return types.
diff --git a/base/memory/raw_scoped_refptr_mismatch_checker.h b/base/memory/raw_scoped_refptr_mismatch_checker.h index f480e07..0e74cb0b 100644 --- a/base/memory/raw_scoped_refptr_mismatch_checker.h +++ b/base/memory/raw_scoped_refptr_mismatch_checker.h
@@ -32,9 +32,11 @@ // Human readable translation: you needed to be a scoped_refptr if you are a // raw pointer type and are convertible to a RefCounted(Base|ThreadSafeBase) // type. - value = (std::is_pointer<T>::value && - (std::is_convertible<T, subtle::RefCountedBase*>::value || - std::is_convertible<T, subtle::RefCountedThreadSafeBase*>::value)) + value = + (std::is_pointer<T>::value && + (std::is_convertible<T, const subtle::RefCountedBase*>::value || + std::is_convertible<T, + const subtle::RefCountedThreadSafeBase*>::value)) }; };
diff --git a/base/test/test_suite.cc b/base/test/test_suite.cc index c9bfe9e..38f1f34 100644 --- a/base/test/test_suite.cc +++ b/base/test/test_suite.cc
@@ -135,8 +135,7 @@ Bind(&TestSuite::Run, Unretained(&test_suite))); } -TestSuite::TestSuite(int argc, char** argv) - : initialized_command_line_(false), created_feature_list_(false) { +TestSuite::TestSuite(int argc, char** argv) : initialized_command_line_(false) { PreInitialize(); InitializeFromCommandLine(argc, argv); // Logging must be initialized before any thread has a chance to call logging @@ -146,7 +145,7 @@ #if defined(OS_WIN) TestSuite::TestSuite(int argc, wchar_t** argv) - : initialized_command_line_(false), created_feature_list_(false) { + : initialized_command_line_(false) { PreInitialize(); InitializeFromCommandLine(argc, argv); // Logging must be initialized before any thread has a chance to call logging @@ -342,13 +341,10 @@ debug::WaitForDebugger(60, true); } #endif - // Set up a FeatureList instance, so that code using that API will not hit a - // an error that it's not set. If a FeatureList was created in this way (i.e. - // one didn't exist previously), it will be cleared in Shutdown() via - // ClearInstanceForTesting(). - created_feature_list_ = - FeatureList::InitializeInstance(std::string(), std::string()); + // an error that it's not set. It will be cleared automatically. + // TODO(chaopeng) Should load the actually features in command line here. + scoped_feature_list_.InitFromCommandLine(std::string(), std::string()); #if defined(OS_IOS) InitIOSTestMessageLoop(); @@ -412,10 +408,6 @@ void TestSuite::Shutdown() { base::debug::StopProfiling(); - - // Clear the FeatureList that was created by Initialize(). - if (created_feature_list_) - FeatureList::ClearInstanceForTesting(); } } // namespace base
diff --git a/base/test/test_suite.h b/base/test/test_suite.h index 82c746e..6d852baf 100644 --- a/base/test/test_suite.h +++ b/base/test/test_suite.h
@@ -15,6 +15,7 @@ #include "base/at_exit.h" #include "base/logging.h" #include "base/macros.h" +#include "base/test/scoped_feature_list.h" #include "base/test/trace_to_file.h" #include "build/build_config.h" @@ -88,7 +89,7 @@ bool initialized_command_line_; - bool created_feature_list_; + test::ScopedFeatureList scoped_feature_list_; XmlUnitTestResultPrinter* printer_ = nullptr;
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn index b417e76a..f89dd0d 100644 --- a/build/toolchain/mac/BUILD.gn +++ b/build/toolchain/mac/BUILD.gn
@@ -431,14 +431,17 @@ if (is_ios) { _sdk_name = ios_sdk_name _min_deployment_target = ios_deployment_target + _compress_pngs = "" } else { _sdk_name = mac_sdk_name _min_deployment_target = mac_deployment_target + _compress_pngs = " -c " } command = "$env_wrapper rm -f {{output}} && " + "TOOL_VERSION=${tool_versions.compile_xcassets} " + "python $_tool -p $_sdk_name -t $_min_deployment_target " + - "-T {{bundle_product_type}} -o {{output}} {{inputs}}" + "$_compress_pngs -T {{bundle_product_type}} -o {{output}} " + + "{{inputs}}" description = "COMPILE_XCASSETS {{output}}" pool = ":bundle_pool($default_toolchain)"
diff --git a/build/toolchain/mac/compile_xcassets.py b/build/toolchain/mac/compile_xcassets.py index 2c1a472..6b0f900 100644 --- a/build/toolchain/mac/compile_xcassets.py +++ b/build/toolchain/mac/compile_xcassets.py
@@ -23,10 +23,7 @@ """ # Pattern matching a section header in the output of actool. -SECTION_HEADER = re.compile('^/\\* ([a-z.]*) \\*/$') - -# Pattern matching an interesting message in the output of actool. -MESSAGE_PATTERN = re.compile('^([^:]*\.xcassets):.* (error|warning): .*$') +SECTION_HEADER = re.compile('^/\\* ([^ ]*) \\*/$') # Name of the section containing informational messages that can be ignored. NOTICE_SECTION = 'com.apple.actool.compilation-results' @@ -41,9 +38,8 @@ section. The function filter any lines that are not in com.apple.actool.errors or - com.apple.actool.document.warnings sections. For each messages, in those - sections, they are also filtered if they do not follow MESSAGE_PATTERN - pattern. + com.apple.actool.document.warnings sections (as spurious messages comes + before any section of the output). See crbug.com/730054 and crbug.com/739163 for some example messages that pollute the output of actool and cause flaky builds. @@ -70,22 +66,18 @@ if current_section != NOTICE_SECTION: filtered_output.append(line + '\n') continue - match = MESSAGE_PATTERN.search(line) - if match is not None: - if current_section == NOTICE_SECTION: - continue - - absolute_path = match.group(1) + if current_section and current_section != NOTICE_SECTION: + absolute_path = line.split(':')[0] relative_path = relative_paths.get(absolute_path, absolute_path) if absolute_path != relative_path: - line = line[:match.span(1)[0]] + relative_path + line[match.span(1)[1]:] + line = relative_path + line[len(absolute_path):] filtered_output.append(line + '\n') return ''.join(filtered_output) -def CompileAssetCatalog( - output, platform, product_type, min_deployment_target, inputs): +def CompileAssetCatalog(output, platform, product_type, min_deployment_target, + inputs, compress_pngs): """Compile the .xcassets bundles to an asset catalog using actool. Args: @@ -94,14 +86,17 @@ product_type: the bundle type min_deployment_target: minimum deployment target inputs: list of absolute paths to .xcassets bundles + compress_pngs: whether to enable compression of pngs """ command = [ 'xcrun', 'actool', '--output-format=human-readable-text', - '--compress-pngs', '--notices', '--warnings', '--errors', - '--platform', platform, '--minimum-deployment-target', - min_deployment_target, + '--notices', '--warnings', '--errors', '--platform', platform, + '--minimum-deployment-target', min_deployment_target, ] + if compress_pngs: + command.extend(['--compress-pngs']) + if product_type != '': command.extend(['--product-type', product_type]) @@ -153,6 +148,9 @@ '--output', '-o', required=True, help='path to the compiled assets catalog') parser.add_argument( + '--compress-pngs', '-c', action='store_true', default=False, + help='recompress PNGs while compiling assets catalog') + parser.add_argument( '--product-type', '-T', help='type of the containing bundle') parser.add_argument( @@ -171,7 +169,8 @@ args.platform, args.product_type, args.minimum_deployment_target, - args.inputs) + args.inputs, + args.compress_pngs) if __name__ == '__main__':
diff --git a/build/toolchain/mac/compile_xcassets_unittests.py b/build/toolchain/mac/compile_xcassets_unittests.py index 530d0c9..6fa41ab 100644 --- a/build/toolchain/mac/compile_xcassets_unittests.py +++ b/build/toolchain/mac/compile_xcassets_unittests.py
@@ -64,6 +64,63 @@ '/* com.apple.actool.compilation-results */\n', self.relative_paths)) + def testComplexError(self): + self.assertEquals( + '/* com.apple.actool.errors */\n' + ': error: Failed to find a suitable device for the type SimDeviceType ' + ': com.apple.dt.Xcode.IBSimDeviceType.iPad-2x with runtime SimRunt' + 'ime : 10.3.1 (14E8301) - com.apple.CoreSimulator.SimRuntime.iOS-1' + '0-3\n' + ' Failure Reason: Failed to create SimDeviceSet at path /Users/jane' + 'doe/Library/Developer/Xcode/UserData/IB Support/Simulator Devices' + '. You\'ll want to check the logs in ~/Library/Logs/CoreSimulator ' + 'to see why creating the SimDeviceSet failed.\n' + ' Underlying Errors:\n' + ' Description: Failed to initialize simulator device set.\n' + ' Failure Reason: Failed to subscribe to notifications from Cor' + 'eSimulatorService.\n' + ' Underlying Errors:\n' + ' Description: Error returned in reply to notification requ' + 'est: Connection invalid\n' + ' Failure Reason: Software caused connection abort\n', + compile_xcassets.FilterCompilerOutput( + '2017-07-07 10:37:27.367 ibtoold[88538:12553239] CoreSimulator det' + 'ected Xcode.app relocation or CoreSimulatorService version ch' + 'ange. Framework path (/Applications/Xcode.app/Contents/Devel' + 'oper/Library/PrivateFrameworks/CoreSimulator.framework) and v' + 'ersion (375.21) does not match existing job path (/Library/De' + 'veloper/PrivateFrameworks/CoreSimulator.framework/Versions/A/' + 'XPCServices/com.apple.CoreSimulator.CoreSimulatorService.xpc)' + ' and version (459.13). Attempting to remove the stale servic' + 'e in order to add the expected version.\n' + '2017-07-07 10:37:27.625 ibtoold[88538:12553256] CoreSimulatorServ' + 'ice connection interrupted. Resubscribing to notifications.\n' + '2017-07-07 10:37:27.632 ibtoold[88538:12553264] CoreSimulatorServ' + 'ice connection became invalid. Simulator services will no lo' + 'nger be available.\n' + '2017-07-07 10:37:27.642 ibtoold[88538:12553274] CoreSimulatorServ' + 'ice connection became invalid. Simulator services will no lo' + 'nger be available.\n' + '/* com.apple.actool.errors */\n' + ': error: Failed to find a suitable device for the type SimDeviceT' + 'ype : com.apple.dt.Xcode.IBSimDeviceType.iPad-2x with runtime' + ' SimRuntime : 10.3.1 (14E8301) - com.apple.CoreSimulator.SimR' + 'untime.iOS-10-3\n' + ' Failure Reason: Failed to create SimDeviceSet at path /Users/' + 'janedoe/Library/Developer/Xcode/UserData/IB Support/Simulator' + ' Devices. You\'ll want to check the logs in ~/Library/Logs/Co' + 'reSimulator to see why creating the SimDeviceSet failed.\n' + ' Underlying Errors:\n' + ' Description: Failed to initialize simulator device set.\n' + ' Failure Reason: Failed to subscribe to notifications from' + ' CoreSimulatorService.\n' + ' Underlying Errors:\n' + ' Description: Error returned in reply to notification ' + 'request: Connection invalid\n' + ' Failure Reason: Software caused connection abort\n' + '/* com.apple.actool.compilation-results */\n', + self.relative_paths)) + if __name__ == '__main__': unittest.main()
diff --git a/build/toolchain/toolchain.gni b/build/toolchain/toolchain.gni index 9a31c361..9ce2ad9 100644 --- a/build/toolchain/toolchain.gni +++ b/build/toolchain/toolchain.gni
@@ -42,6 +42,10 @@ # Currently disabled on LLD because of a bug (fixed upstream). # See https://crbug.com/716209. generate_linker_map = is_android && is_official_build + + # Use absolute file paths in the compiler diagnostics and __FILE__ macro + # if needed. + msvc_use_absolute_paths = false } if (generate_linker_map) {
diff --git a/build/toolchain/win/BUILD.gn b/build/toolchain/win/BUILD.gn index 296f829..90777eb 100644 --- a/build/toolchain/win/BUILD.gn +++ b/build/toolchain/win/BUILD.gn
@@ -135,6 +135,13 @@ sys_include_flags = "" } + clflags = "" + + # Pass /FC flag to the compiler if needed. + if (msvc_use_absolute_paths) { + clflags += "/FC " + } + tool("cc") { rspfile = "{{output}}.rsp" precompiled_header_type = "msvc" @@ -143,7 +150,7 @@ # Label names may have spaces in them so the pdbname must be quoted. The # source and output don't need to be quoted because GN knows they're a # full file name and will quote automatically when necessary. - command = "$env_wrapper$cl /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\"" + command = "$env_wrapper$cl /nologo /showIncludes ${clflags} @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\"" depsformat = "msvc" description = "CC {{output}}" outputs = [ @@ -160,7 +167,7 @@ pdbname = "{{target_out_dir}}/{{label_name}}_cc.pdb" # See comment in CC tool about quoting. - command = "$env_wrapper$cl /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\"" + command = "$env_wrapper$cl /nologo /showIncludes ${clflags} @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\"" depsformat = "msvc" description = "CXX {{output}}" outputs = [
diff --git a/cc/BUILD.gn b/cc/BUILD.gn index 8b0d79f..2fe2405 100644 --- a/cc/BUILD.gn +++ b/cc/BUILD.gn
@@ -289,13 +289,8 @@ "raster/zero_copy_raster_buffer_provider.h", "resources/memory_history.cc", "resources/memory_history.h", - "resources/platform_color.h", "resources/release_callback.h", "resources/resource.h", - "resources/resource_format.cc", - "resources/resource_format.h", - "resources/resource_format_utils.cc", - "resources/resource_format_utils.h", "resources/resource_pool.cc", "resources/resource_pool.h", "resources/resource_provider.cc", @@ -478,6 +473,7 @@ public_deps = [ "//cc/base", + "//components/viz/common", "//skia", ] deps = [ @@ -792,7 +788,6 @@ "raster/synchronous_task_graph_runner_unittest.cc", "raster/task_graph_work_queue_unittest.cc", "raster/texture_compressor_etc1_unittest.cc", - "resources/platform_color_unittest.cc", "resources/resource_pool_unittest.cc", "resources/resource_provider_unittest.cc", "resources/resource_util_unittest.cc", @@ -898,6 +893,7 @@ "//cc/surfaces", "//cc/surfaces:surface_id", "//cc/surfaces:surfaces", + "//components/viz/common", "//gpu", "//gpu:test_support", "//gpu/command_buffer/client:gles2_interface",
diff --git a/cc/DEPS b/cc/DEPS index 0701904..bf4ab29b 100644 --- a/cc/DEPS +++ b/cc/DEPS
@@ -1,4 +1,6 @@ include_rules = [ + "+components/viz/common/quads", + "+components/viz/common/resources", "+gpu/GLES2", "+gpu/command_buffer/client/context_support.h", "+gpu/command_buffer/client/gles2_interface.h",
diff --git a/cc/ipc/cc_param_traits_macros.h b/cc/ipc/cc_param_traits_macros.h index 019a16e1..7bb91782 100644 --- a/cc/ipc/cc_param_traits_macros.h +++ b/cc/ipc/cc_param_traits_macros.h
@@ -18,12 +18,12 @@ #include "cc/quads/texture_draw_quad.h" #include "cc/quads/tile_draw_quad.h" #include "cc/quads/yuv_video_draw_quad.h" -#include "cc/resources/resource_format.h" #include "cc/resources/returned_resource.h" #include "cc/resources/transferable_resource.h" #include "cc/surfaces/surface_id.h" #include "cc/surfaces/surface_info.h" #include "cc/surfaces/surface_sequence.h" +#include "components/viz/common/quads/resource_format.h" #include "ui/gfx/ipc/color/gfx_param_traits.h" #include "ui/gfx/ipc/gfx_param_traits.h" #include "ui/gfx/ipc/skia/gfx_skia_param_traits.h" @@ -35,7 +35,7 @@ IPC_ENUM_TRAITS_MAX_VALUE(cc::DrawQuad::Material, cc::DrawQuad::MATERIAL_LAST) IPC_ENUM_TRAITS_MAX_VALUE(cc::FilterOperation::FilterType, cc::FilterOperation::FILTER_TYPE_LAST) -IPC_ENUM_TRAITS_MAX_VALUE(cc::ResourceFormat, cc::RESOURCE_FORMAT_MAX) +IPC_ENUM_TRAITS_MAX_VALUE(viz::ResourceFormat, viz::RESOURCE_FORMAT_MAX) // TODO(fsamuel): This trait belongs with skia code. IPC_ENUM_TRAITS_MAX_VALUE(SkBlendMode, SkBlendMode::kLastMode)
diff --git a/cc/ipc/cc_param_traits_unittest.cc b/cc/ipc/cc_param_traits_unittest.cc index 41d6da45b..5da53a13 100644 --- a/cc/ipc/cc_param_traits_unittest.cc +++ b/cc/ipc/cc_param_traits_unittest.cc
@@ -592,7 +592,7 @@ TransferableResource arbitrary_resource1; arbitrary_resource1.id = 2178312; - arbitrary_resource1.format = cc::RGBA_8888; + arbitrary_resource1.format = viz::RGBA_8888; arbitrary_resource1.filter = 53; arbitrary_resource1.size = gfx::Size(37189, 123123); arbitrary_resource1.mailbox_holder.mailbox.SetName(arbitrary_mailbox1); @@ -606,7 +606,7 @@ TransferableResource arbitrary_resource2; arbitrary_resource2.id = 789132; - arbitrary_resource2.format = cc::RGBA_4444; + arbitrary_resource2.format = viz::RGBA_4444; arbitrary_resource2.filter = 47; arbitrary_resource2.size = gfx::Size(89123, 23789); arbitrary_resource2.mailbox_holder.mailbox.SetName(arbitrary_mailbox2);
diff --git a/cc/ipc/struct_traits_unittest.cc b/cc/ipc/struct_traits_unittest.cc index dc5d9cb..48f7269 100644 --- a/cc/ipc/struct_traits_unittest.cc +++ b/cc/ipc/struct_traits_unittest.cc
@@ -254,7 +254,7 @@ // TransferableResource constants. const uint32_t tr_id = 1337; - const ResourceFormat tr_format = ALPHA_8; + const viz::ResourceFormat tr_format = viz::ALPHA_8; const gfx::BufferFormat tr_buffer_format = gfx::BufferFormat::R_8; const uint32_t tr_filter = 1234; const gfx::Size tr_size(1234, 5678); @@ -1146,7 +1146,7 @@ TEST_F(StructTraitsTest, TransferableResource) { const uint32_t id = 1337; - const ResourceFormat format = ALPHA_8; + const viz::ResourceFormat format = viz::ALPHA_8; const uint32_t filter = 1234; const gfx::Size size(1234, 5678); const int8_t mailbox_name[GL_MAILBOX_SIZE_CHROMIUM] = {
diff --git a/cc/ipc/transferable_resource_struct_traits.cc b/cc/ipc/transferable_resource_struct_traits.cc index ea6c56d..60aedc8 100644 --- a/cc/ipc/transferable_resource_struct_traits.cc +++ b/cc/ipc/transferable_resource_struct_traits.cc
@@ -20,7 +20,7 @@ !data.ReadColorSpace(&out->color_space)) return false; out->id = data.id(); - out->format = static_cast<cc::ResourceFormat>(data.format()); + out->format = static_cast<viz::ResourceFormat>(data.format()); out->buffer_format = static_cast<gfx::BufferFormat>(data.buffer_format()); out->filter = data.filter(); out->read_lock_fences_enabled = data.read_lock_fences_enabled();
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc index 856f47c9..29c27a93 100644 --- a/cc/layers/picture_layer_impl.cc +++ b/cc/layers/picture_layer_impl.cc
@@ -256,7 +256,7 @@ render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>(); quad->SetNew(shared_quad_state, geometry_rect, opaque_rect, visible_geometry_rect, texture_rect, texture_size, - nearest_neighbor_, RGBA_8888, quad_content_rect, + nearest_neighbor_, viz::RGBA_8888, quad_content_rect, max_contents_scale, raster_source_); ValidateQuadResources(quad); return;
diff --git a/cc/layers/texture_layer_impl.cc b/cc/layers/texture_layer_impl.cc index 4835c97d..a64b5e9 100644 --- a/cc/layers/texture_layer_impl.cc +++ b/cc/layers/texture_layer_impl.cc
@@ -13,11 +13,11 @@ #include "cc/output/output_surface.h" #include "cc/quads/solid_color_draw_quad.h" #include "cc/quads/texture_draw_quad.h" -#include "cc/resources/platform_color.h" #include "cc/resources/scoped_resource.h" #include "cc/resources/single_release_callback_impl.h" #include "cc/trees/layer_tree_impl.h" #include "cc/trees/occlusion.h" +#include "components/viz/common/resources/platform_color.h" namespace cc { @@ -122,7 +122,7 @@ std::vector<uint8_t> swizzled; uint8_t* pixels = texture_mailbox_.shared_bitmap()->pixels(); - if (!PlatformColor::SameComponentOrder(texture_copy_->format())) { + if (!viz::PlatformColor::SameComponentOrder(texture_copy_->format())) { // Swizzle colors. This is slow, but should be really uncommon. size_t bytes = texture_mailbox_.SharedMemorySizeInBytes(); swizzled.resize(bytes);
diff --git a/cc/output/direct_renderer.h b/cc/output/direct_renderer.h index 0c46c05e..d265657 100644 --- a/cc/output/direct_renderer.h +++ b/cc/output/direct_renderer.h
@@ -146,7 +146,7 @@ // Private interface implemented by subclasses for use by DirectRenderer. virtual bool CanPartialSwap() = 0; - virtual ResourceFormat BackbufferFormat() const = 0; + virtual viz::ResourceFormat BackbufferFormat() const = 0; virtual void BindFramebufferToOutputSurface() = 0; virtual bool BindFramebufferToTexture(const ScopedResource* resource) = 0; virtual void SetScissorTestRect(const gfx::Rect& scissor_rect) = 0;
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc index f42dfdb..29b67dc 100644 --- a/cc/output/gl_renderer.cc +++ b/cc/output/gl_renderer.cc
@@ -428,10 +428,10 @@ return context_provider->ContextCapabilities().post_sub_buffer; } -ResourceFormat GLRenderer::BackbufferFormat() const { +viz::ResourceFormat GLRenderer::BackbufferFormat() const { if (current_frame()->current_render_pass->color_space.IsHDR() && - resource_provider_->IsRenderBufferFormatSupported(RGBA_F16)) { - return RGBA_F16; + resource_provider_->IsRenderBufferFormatSupported(viz::RGBA_F16)) { + return viz::RGBA_F16; } return resource_provider_->best_texture_format(); } @@ -1057,7 +1057,7 @@ TileDrawQuad* tile_quad = &bypass->second; // RGBA_8888 and the gfx::ColorSpace() here are arbitrary and unused. Resource tile_resource(tile_quad->resource_id(), tile_quad->texture_size, - ResourceFormat::RGBA_8888, gfx::ColorSpace()); + viz::ResourceFormat::RGBA_8888, gfx::ColorSpace()); // The projection matrix used by GLRenderer has a flip. As tile texture // inputs are oriented opposite to framebuffer outputs, don't flip via // texture coords and let the projection matrix naturallyd o it. @@ -3406,7 +3406,8 @@ static_cast<uint32_t>(updated_dst_rect.height()), iosurface_multiple); *resource = overlay_resource_pool_->AcquireResource( - gfx::Size(iosurface_width, iosurface_height), ResourceFormat::RGBA_8888, + gfx::Size(iosurface_width, iosurface_height), + viz::ResourceFormat::RGBA_8888, current_frame()->current_render_pass->color_space); *new_bounds = gfx::RectF(updated_dst_rect.x(), updated_dst_rect.y(),
diff --git a/cc/output/gl_renderer.h b/cc/output/gl_renderer.h index ca853e3..05cd04b 100644 --- a/cc/output/gl_renderer.h +++ b/cc/output/gl_renderer.h
@@ -86,7 +86,7 @@ bool blend_enabled() const { return blend_shadow_; } bool CanPartialSwap() override; - ResourceFormat BackbufferFormat() const override; + viz::ResourceFormat BackbufferFormat() const override; void BindFramebufferToOutputSurface() override; bool BindFramebufferToTexture(const ScopedResource* resource) override; void SetScissorTestRect(const gfx::Rect& scissor_rect) override; @@ -187,8 +187,6 @@ const gfx::QuadF* clip_region); void DrawStreamVideoQuad(const StreamVideoDrawQuad* quad, const gfx::QuadF* clip_region); - void DrawTextureQuad(const TextureDrawQuad* quad, - const gfx::QuadF* clip_region); void EnqueueTextureQuad(const TextureDrawQuad* quad, const gfx::QuadF* clip_region); void FlushTextureQuadCache(BoundGeometry flush_binding); @@ -331,7 +329,7 @@ std::unique_ptr<ResourceProvider::ScopedWriteLockGL> current_framebuffer_lock_; // This is valid when current_framebuffer_lock_ is not null. - ResourceFormat current_framebuffer_format_; + viz::ResourceFormat current_framebuffer_format_; class SyncQuery; std::deque<std::unique_ptr<SyncQuery>> pending_sync_queries_;
diff --git a/cc/output/in_process_context_provider.cc b/cc/output/in_process_context_provider.cc index acadc43..cd53faa 100644 --- a/cc/output/in_process_context_provider.cc +++ b/cc/output/in_process_context_provider.cc
@@ -11,7 +11,7 @@ #include "base/memory/ptr_util.h" #include "base/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" -#include "cc/resources/platform_color.h" +#include "components/viz/common/resources/platform_color.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/gles2_implementation.h" #include "gpu/command_buffer/common/gles2_cmd_utils.h"
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc index 583e138..e2ebf56 100644 --- a/cc/output/renderer_pixeltest.cc +++ b/cc/output/renderer_pixeltest.cc
@@ -138,7 +138,7 @@ } } ResourceId resource = resource_provider->CreateResource( - rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, + rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888, gfx::ColorSpace()); resource_provider->CopyToResource( resource, reinterpret_cast<uint8_t*>(&pixels.front()), rect.size()); @@ -174,7 +174,7 @@ std::vector<uint32_t> pixels(num_pixels, pixel_color); ResourceId resource = resource_provider->CreateResource( - rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, + rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888, gfx::ColorSpace()); resource_provider->CopyToResource( resource, reinterpret_cast<uint8_t*>(&pixels.front()), rect.size()); @@ -553,7 +553,7 @@ rect.size(), ResourceProvider::TEXTURE_HINT_DEFAULT, resource_provider->YuvResourceFormat(8), gfx::ColorSpace()); ResourceId u_resource = resource_provider->CreateResource( - uv_tex_size, ResourceProvider::TEXTURE_HINT_DEFAULT, RGBA_8888, + uv_tex_size, ResourceProvider::TEXTURE_HINT_DEFAULT, viz::RGBA_8888, gfx::ColorSpace()); ResourceId v_resource = u_resource; ResourceId a_resource = 0; @@ -1056,8 +1056,8 @@ blue_quad->SetNew(this->front_quad_state_, this->quad_rect_, gfx::Rect(), this->quad_rect_, gfx::RectF(this->quad_rect_), - this->quad_rect_.size(), false, RGBA_8888, this->quad_rect_, - 1.f, blue_raster_source); + this->quad_rect_.size(), false, viz::RGBA_8888, + this->quad_rect_, 1.f, blue_raster_source); std::unique_ptr<FakeRecordingSource> green_recording = FakeRecordingSource::CreateFilledRecordingSource(this->quad_rect_.size()); @@ -1071,7 +1071,7 @@ this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>(); green_quad->SetNew(this->back_quad_state_, this->quad_rect_, gfx::Rect(), this->quad_rect_, gfx::RectF(this->quad_rect_), - this->quad_rect_.size(), false, RGBA_8888, + this->quad_rect_.size(), false, viz::RGBA_8888, this->quad_rect_, 1.f, green_raster_source); SCOPED_TRACE("IntersectingPictureQuadsPass"); this->AppendBackgroundAndRunTest( @@ -2018,8 +2018,8 @@ } ResourceId mask_resource_id = this->resource_provider_->CreateResource( - mask_rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, - gfx::ColorSpace()); + mask_rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, + viz::RGBA_8888, gfx::ColorSpace()); this->resource_provider_->CopyToResource( mask_resource_id, reinterpret_cast<uint8_t*>(bitmap.getPixels()), @@ -2111,8 +2111,8 @@ } ResourceId mask_resource_id = this->resource_provider_->CreateResource( - mask_rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, - gfx::ColorSpace()); + mask_rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, + viz::RGBA_8888, gfx::ColorSpace()); this->resource_provider_->CopyToResource( mask_resource_id, reinterpret_cast<uint8_t*>(bitmap.getPixels()), @@ -2574,7 +2574,7 @@ TYPED_TEST(SoftwareRendererPixelTest, PictureDrawQuadIdentityScale) { gfx::Rect viewport(this->device_viewport_size_); // TODO(enne): the renderer should figure this out on its own. - ResourceFormat texture_format = RGBA_8888; + viz::ResourceFormat texture_format = viz::RGBA_8888; bool nearest_neighbor = false; int id = 1; @@ -2650,7 +2650,7 @@ // Not WithSkiaGPUBackend since that path currently requires tiles for opacity. TYPED_TEST(SoftwareRendererPixelTest, PictureDrawQuadOpacity) { gfx::Rect viewport(this->device_viewport_size_); - ResourceFormat texture_format = RGBA_8888; + viz::ResourceFormat texture_format = viz::RGBA_8888; bool nearest_neighbor = false; int id = 1; @@ -2738,7 +2738,7 @@ return; gfx::Rect viewport(this->device_viewport_size_); - ResourceFormat texture_format = RGBA_8888; + viz::ResourceFormat texture_format = viz::RGBA_8888; bool nearest_neighbor = false; int id = 1; @@ -2787,7 +2787,7 @@ // This disables filtering by setting |nearest_neighbor| on the PictureDrawQuad. TYPED_TEST(SoftwareRendererPixelTest, PictureDrawQuadNearestNeighbor) { gfx::Rect viewport(this->device_viewport_size_); - ResourceFormat texture_format = RGBA_8888; + viz::ResourceFormat texture_format = viz::RGBA_8888; bool nearest_neighbor = true; int id = 1; @@ -2847,7 +2847,7 @@ gfx::Size tile_size(2, 2); ResourceId resource = this->resource_provider_->CreateResource( - tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, + tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888, gfx::ColorSpace()); this->resource_provider_->CopyToResource( @@ -2892,7 +2892,7 @@ gfx::Size tile_size(2, 2); ResourceId resource = this->resource_provider_->CreateResource( - tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, + tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888, gfx::ColorSpace()); this->resource_provider_->CopyToResource( @@ -2940,7 +2940,7 @@ gfx::Size tile_size(2, 2); ResourceId resource = this->resource_provider_->CreateResource( - tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, + tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888, gfx::ColorSpace()); this->resource_provider_->CopyToResource( @@ -2975,7 +2975,7 @@ TYPED_TEST(SoftwareRendererPixelTest, PictureDrawQuadNonIdentityScale) { gfx::Rect viewport(this->device_viewport_size_); // TODO(enne): the renderer should figure this out on its own. - ResourceFormat texture_format = RGBA_8888; + viz::ResourceFormat texture_format = viz::RGBA_8888; bool nearest_neighbor = false; int id = 1; @@ -3301,8 +3301,8 @@ } ResourceId resource = this->resource_provider_->CreateResource( - mask_rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, - gfx::ColorSpace()); + mask_rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, + viz::RGBA_8888, gfx::ColorSpace()); this->resource_provider_->CopyToResource( resource, reinterpret_cast<uint8_t*>(bitmap.getPixels()), @@ -3480,7 +3480,7 @@ CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); ResourceId resource = resource_provider_->CreateResource( - rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, + rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888, src_color_space_); resource_provider_->CopyToResource(resource, input_colors.data(), rect.size());
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc index 6fc30a0..d6187b2 100644 --- a/cc/output/software_renderer.cc +++ b/cc/output/software_renderer.cc
@@ -66,7 +66,7 @@ return true; } -ResourceFormat SoftwareRenderer::BackbufferFormat() const { +viz::ResourceFormat SoftwareRenderer::BackbufferFormat() const { return resource_provider_->best_texture_format(); }
diff --git a/cc/output/software_renderer.h b/cc/output/software_renderer.h index 07e91027..3a077802 100644 --- a/cc/output/software_renderer.h +++ b/cc/output/software_renderer.h
@@ -37,7 +37,7 @@ protected: bool CanPartialSwap() override; - ResourceFormat BackbufferFormat() const override; + viz::ResourceFormat BackbufferFormat() const override; void BindFramebufferToOutputSurface() override; bool BindFramebufferToTexture(const ScopedResource* texture) override; void SetScissorTestRect(const gfx::Rect& scissor_rect) override;
diff --git a/cc/output/software_renderer_unittest.cc b/cc/output/software_renderer_unittest.cc index 19a68ca6..ec53b2d 100644 --- a/cc/output/software_renderer_unittest.cc +++ b/cc/output/software_renderer_unittest.cc
@@ -143,10 +143,10 @@ InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); ResourceId resource_yellow = resource_provider()->CreateResource( - outer_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, + outer_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888, gfx::ColorSpace()); ResourceId resource_cyan = resource_provider()->CreateResource( - inner_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, + inner_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888, gfx::ColorSpace()); SkBitmap yellow_tile; @@ -209,7 +209,7 @@ InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); ResourceId resource_cyan = resource_provider()->CreateResource( - tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, + tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888, gfx::ColorSpace()); SkBitmap cyan_tile; // The lowest five rows are yellow.
diff --git a/cc/paint/display_item_list.cc b/cc/paint/display_item_list.cc index 8945e5a..3fb69bb 100644 --- a/cc/paint/display_item_list.cc +++ b/cc/paint/display_item_list.cc
@@ -157,12 +157,7 @@ gfx::Rect bounds = rtree_.GetBounds(); DiscardableImageMap::ScopedMetadataGenerator generator( &image_map_, gfx::Size(bounds.right(), bounds.bottom())); - GatherDiscardableImages(generator.image_store()); -} - -void DisplayItemList::GatherDiscardableImages( - DiscardableImageStore* image_store) const { - image_store->GatherDiscardableImages(&paint_op_buffer_); + generator.image_store()->GatherDiscardableImages(&paint_op_buffer_); } void DisplayItemList::GetDiscardableImagesInRect( @@ -190,7 +185,6 @@ current_range_start_ = 0; in_paired_begin_count_ = 0; in_painting_ = false; - op_count_ = 0u; } sk_sp<PaintRecord> DisplayItemList::ReleaseAsRecord() {
diff --git a/cc/paint/display_item_list.h b/cc/paint/display_item_list.h index 1381336..46cc329 100644 --- a/cc/paint/display_item_list.h +++ b/cc/paint/display_item_list.h
@@ -126,7 +126,6 @@ gfx::Rect VisualRectForTesting(int index) { return visual_rects_[index]; } - void GatherDiscardableImages(DiscardableImageStore* image_store) const; const DiscardableImageMap& discardable_image_map_for_testing() const { return image_map_; } @@ -181,8 +180,6 @@ // nesting. bool in_painting_ = false; - size_t op_count_ = 0u; - friend class base::RefCountedThreadSafe<DisplayItemList>; FRIEND_TEST_ALL_PREFIXES(DisplayItemListTest, BytesUsed); DISALLOW_COPY_AND_ASSIGN(DisplayItemList);
diff --git a/cc/paint/paint_flags.h b/cc/paint/paint_flags.h index 940751c..2101c1aa 100644 --- a/cc/paint/paint_flags.h +++ b/cc/paint/paint_flags.h
@@ -176,7 +176,7 @@ return paint_.getShader()->isOpaque(); } - ALWAYS_INLINE void setShader(std::unique_ptr<PaintShader> shader) { + ALWAYS_INLINE void setShader(sk_sp<PaintShader> shader) { paint_.setShader(shader ? shader->sk_shader() : nullptr); } ALWAYS_INLINE SkPathEffect* getPathEffect() const {
diff --git a/cc/paint/paint_shader.cc b/cc/paint/paint_shader.cc index fb8bb25..19cf600 100644 --- a/cc/paint/paint_shader.cc +++ b/cc/paint/paint_shader.cc
@@ -10,42 +10,40 @@ namespace cc { -std::unique_ptr<PaintShader> PaintShader::MakeColor(SkColor color) { - return base::WrapUnique(new PaintShader(nullptr, color)); +sk_sp<PaintShader> PaintShader::MakeColor(SkColor color) { + return sk_sp<PaintShader>(new PaintShader(nullptr, color)); } -std::unique_ptr<PaintShader> PaintShader::MakeLinearGradient( - const SkPoint points[], - const SkColor colors[], - const SkScalar pos[], - int count, - SkShader::TileMode mode, - uint32_t flags, - const SkMatrix* local_matrix, - SkColor fallback_color) { - return base::WrapUnique( +sk_sp<PaintShader> PaintShader::MakeLinearGradient(const SkPoint points[], + const SkColor colors[], + const SkScalar pos[], + int count, + SkShader::TileMode mode, + uint32_t flags, + const SkMatrix* local_matrix, + SkColor fallback_color) { + return sk_sp<PaintShader>( new PaintShader(SkGradientShader::MakeLinear(points, colors, pos, count, mode, flags, local_matrix), fallback_color)); } -std::unique_ptr<PaintShader> PaintShader::MakeRadialGradient( - const SkPoint& center, - SkScalar radius, - const SkColor colors[], - const SkScalar pos[], - int color_count, - SkShader::TileMode mode, - uint32_t flags, - const SkMatrix* local_matrix, - SkColor fallback_color) { - return base::WrapUnique(new PaintShader( +sk_sp<PaintShader> PaintShader::MakeRadialGradient(const SkPoint& center, + SkScalar radius, + const SkColor colors[], + const SkScalar pos[], + int color_count, + SkShader::TileMode mode, + uint32_t flags, + const SkMatrix* local_matrix, + SkColor fallback_color) { + return sk_sp<PaintShader>(new PaintShader( SkGradientShader::MakeRadial(center, radius, colors, pos, color_count, mode, flags, local_matrix), fallback_color)); } -std::unique_ptr<PaintShader> PaintShader::MakeTwoPointConicalGradient( +sk_sp<PaintShader> PaintShader::MakeTwoPointConicalGradient( const SkPoint& start, SkScalar start_radius, const SkPoint& end, @@ -57,44 +55,41 @@ uint32_t flags, const SkMatrix* local_matrix, SkColor fallback_color) { - return base::WrapUnique( + return sk_sp<PaintShader>( new PaintShader(SkGradientShader::MakeTwoPointConical( start, start_radius, end, end_radius, colors, pos, color_count, mode, flags, local_matrix), fallback_color)); } -std::unique_ptr<PaintShader> PaintShader::MakeSweepGradient( - SkScalar cx, - SkScalar cy, - const SkColor colors[], - const SkScalar pos[], - int color_count, - uint32_t flags, - const SkMatrix* local_matrix, - SkColor fallback_color) { - return base::WrapUnique(new PaintShader( +sk_sp<PaintShader> PaintShader::MakeSweepGradient(SkScalar cx, + SkScalar cy, + const SkColor colors[], + const SkScalar pos[], + int color_count, + uint32_t flags, + const SkMatrix* local_matrix, + SkColor fallback_color) { + return sk_sp<PaintShader>(new PaintShader( SkGradientShader::MakeSweep(cx, cy, colors, pos, color_count, flags, local_matrix), fallback_color)); } -std::unique_ptr<PaintShader> PaintShader::MakeImage( - sk_sp<const SkImage> image, - SkShader::TileMode tx, - SkShader::TileMode ty, - const SkMatrix* local_matrix) { - return base::WrapUnique(new PaintShader( +sk_sp<PaintShader> PaintShader::MakeImage(sk_sp<const SkImage> image, + SkShader::TileMode tx, + SkShader::TileMode ty, + const SkMatrix* local_matrix) { + return sk_sp<PaintShader>(new PaintShader( image->makeShader(tx, ty, local_matrix), SK_ColorTRANSPARENT)); } -std::unique_ptr<PaintShader> PaintShader::MakePaintRecord( - sk_sp<PaintRecord> record, - const SkRect& tile, - SkShader::TileMode tx, - SkShader::TileMode ty, - const SkMatrix* local_matrix) { - return base::WrapUnique(new PaintShader( +sk_sp<PaintShader> PaintShader::MakePaintRecord(sk_sp<PaintRecord> record, + const SkRect& tile, + SkShader::TileMode tx, + SkShader::TileMode ty, + const SkMatrix* local_matrix) { + return sk_sp<PaintShader>(new PaintShader( SkShader::MakePictureShader(ToSkPicture(std::move(record), tile), tx, ty, local_matrix, nullptr), SK_ColorTRANSPARENT)); @@ -105,11 +100,7 @@ : SkShader::MakeColorShader(fallback_color)) { DCHECK(sk_shader_); } -PaintShader::PaintShader(const PaintShader& other) = default; -PaintShader::PaintShader(PaintShader&& other) = default; -PaintShader::~PaintShader() = default; -PaintShader& PaintShader::operator=(const PaintShader& other) = default; -PaintShader& PaintShader::operator=(PaintShader&& other) = default; +PaintShader::~PaintShader() = default; } // namespace cc
diff --git a/cc/paint/paint_shader.h b/cc/paint/paint_shader.h index 6fc1a46..6dd468c 100644 --- a/cc/paint/paint_shader.h +++ b/cc/paint/paint_shader.h
@@ -17,11 +17,11 @@ class PaintOpBuffer; using PaintRecord = PaintOpBuffer; -class CC_PAINT_EXPORT PaintShader { +class CC_PAINT_EXPORT PaintShader : public SkRefCnt { public: - static std::unique_ptr<PaintShader> MakeColor(SkColor color); + static sk_sp<PaintShader> MakeColor(SkColor color); - static std::unique_ptr<PaintShader> MakeLinearGradient( + static sk_sp<PaintShader> MakeLinearGradient( const SkPoint points[], const SkColor colors[], const SkScalar pos[], @@ -31,7 +31,7 @@ const SkMatrix* local_matrix = nullptr, SkColor fallback_color = SK_ColorTRANSPARENT); - static std::unique_ptr<PaintShader> MakeRadialGradient( + static sk_sp<PaintShader> MakeRadialGradient( const SkPoint& center, SkScalar radius, const SkColor colors[], @@ -42,7 +42,7 @@ const SkMatrix* local_matrix = nullptr, SkColor fallback_color = SK_ColorTRANSPARENT); - static std::unique_ptr<PaintShader> MakeTwoPointConicalGradient( + static sk_sp<PaintShader> MakeTwoPointConicalGradient( const SkPoint& start, SkScalar start_radius, const SkPoint& end, @@ -55,7 +55,7 @@ const SkMatrix* local_matrix = nullptr, SkColor fallback_color = SK_ColorTRANSPARENT); - static std::unique_ptr<PaintShader> MakeSweepGradient( + static sk_sp<PaintShader> MakeSweepGradient( SkScalar cx, SkScalar cy, const SkColor colors[], @@ -65,24 +65,18 @@ const SkMatrix* local_matrix = nullptr, SkColor fallback_color = SK_ColorTRANSPARENT); - static std::unique_ptr<PaintShader> MakeImage(sk_sp<const SkImage> image, - SkShader::TileMode tx, - SkShader::TileMode ty, - const SkMatrix* local_matrix); + static sk_sp<PaintShader> MakeImage(sk_sp<const SkImage> image, + SkShader::TileMode tx, + SkShader::TileMode ty, + const SkMatrix* local_matrix); - static std::unique_ptr<PaintShader> MakePaintRecord( - sk_sp<PaintRecord> record, - const SkRect& tile, - SkShader::TileMode tx, - SkShader::TileMode ty, - const SkMatrix* local_matrix); + static sk_sp<PaintShader> MakePaintRecord(sk_sp<PaintRecord> record, + const SkRect& tile, + SkShader::TileMode tx, + SkShader::TileMode ty, + const SkMatrix* local_matrix); - PaintShader(const PaintShader& other); - PaintShader(PaintShader&& other); - ~PaintShader(); - - PaintShader& operator=(const PaintShader& other); - PaintShader& operator=(PaintShader&& other); + ~PaintShader() override; const sk_sp<SkShader>& sk_shader() const { return sk_shader_; }
diff --git a/cc/quads/draw_quad_unittest.cc b/cc/quads/draw_quad_unittest.cc index b8f150b9..fafc1b2 100644 --- a/cc/quads/draw_quad_unittest.cc +++ b/cc/quads/draw_quad_unittest.cc
@@ -426,7 +426,7 @@ gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f); gfx::Size texture_size(85, 32); bool nearest_neighbor = true; - ResourceFormat texture_format = RGBA_8888; + viz::ResourceFormat texture_format = viz::RGBA_8888; gfx::Rect content_rect(30, 40, 20, 30); float contents_scale = 3.141592f; scoped_refptr<RasterSource> raster_source = @@ -633,7 +633,7 @@ gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f); gfx::Size texture_size(85, 32); bool nearest_neighbor = true; - ResourceFormat texture_format = RGBA_8888; + viz::ResourceFormat texture_format = viz::RGBA_8888; gfx::Rect content_rect(30, 40, 20, 30); float contents_scale = 3.141592f; scoped_refptr<RasterSource> raster_source =
diff --git a/cc/quads/picture_draw_quad.cc b/cc/quads/picture_draw_quad.cc index 14c0123..b0f1af27 100644 --- a/cc/quads/picture_draw_quad.cc +++ b/cc/quads/picture_draw_quad.cc
@@ -7,7 +7,7 @@ #include "base/trace_event/trace_event_argument.h" #include "base/values.h" #include "cc/base/math_util.h" -#include "cc/resources/platform_color.h" +#include "components/viz/common/resources/platform_color.h" namespace cc { @@ -26,19 +26,14 @@ const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, bool nearest_neighbor, - ResourceFormat texture_format, + viz::ResourceFormat texture_format, const gfx::Rect& content_rect, float contents_scale, scoped_refptr<RasterSource> raster_source) { ContentDrawQuadBase::SetNew( - shared_quad_state, - DrawQuad::PICTURE_CONTENT, - rect, - opaque_rect, - visible_rect, - tex_coord_rect, - texture_size, - !PlatformColor::SameComponentOrder(texture_format), + shared_quad_state, DrawQuad::PICTURE_CONTENT, rect, opaque_rect, + visible_rect, tex_coord_rect, texture_size, + !viz::PlatformColor::SameComponentOrder(texture_format), nearest_neighbor); this->content_rect = content_rect; this->contents_scale = contents_scale; @@ -54,21 +49,15 @@ const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, bool nearest_neighbor, - ResourceFormat texture_format, + viz::ResourceFormat texture_format, const gfx::Rect& content_rect, float contents_scale, scoped_refptr<RasterSource> raster_source) { - ContentDrawQuadBase::SetAll(shared_quad_state, - DrawQuad::PICTURE_CONTENT, - rect, - opaque_rect, - visible_rect, - needs_blending, - tex_coord_rect, - texture_size, - !PlatformColor::SameComponentOrder( - texture_format), - nearest_neighbor); + ContentDrawQuadBase::SetAll( + shared_quad_state, DrawQuad::PICTURE_CONTENT, rect, opaque_rect, + visible_rect, needs_blending, tex_coord_rect, texture_size, + !viz::PlatformColor::SameComponentOrder(texture_format), + nearest_neighbor); this->content_rect = content_rect; this->contents_scale = contents_scale; this->raster_source = raster_source;
diff --git a/cc/quads/picture_draw_quad.h b/cc/quads/picture_draw_quad.h index cb9f5a79..eefc9fba 100644 --- a/cc/quads/picture_draw_quad.h +++ b/cc/quads/picture_draw_quad.h
@@ -32,7 +32,7 @@ const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, bool nearest_neighbor, - ResourceFormat texture_format, + viz::ResourceFormat texture_format, const gfx::Rect& content_rect, float contents_scale, scoped_refptr<RasterSource> raster_source); @@ -45,7 +45,7 @@ const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, bool nearest_neighbor, - ResourceFormat texture_format, + viz::ResourceFormat texture_format, const gfx::Rect& content_rect, float contents_scale, scoped_refptr<RasterSource> raster_source); @@ -53,7 +53,7 @@ gfx::Rect content_rect; float contents_scale; scoped_refptr<RasterSource> raster_source; - ResourceFormat texture_format; + viz::ResourceFormat texture_format; static const PictureDrawQuad* MaterialCast(const DrawQuad* quad);
diff --git a/cc/raster/bitmap_raster_buffer_provider.cc b/cc/raster/bitmap_raster_buffer_provider.cc index b69531a..4abc5a7 100644 --- a/cc/raster/bitmap_raster_buffer_provider.cc +++ b/cc/raster/bitmap_raster_buffer_provider.cc
@@ -16,8 +16,8 @@ #include "base/trace_event/trace_event_argument.h" #include "cc/debug/traced_value.h" #include "cc/raster/raster_source.h" -#include "cc/resources/platform_color.h" #include "cc/resources/resource.h" +#include "components/viz/common/resources/platform_color.h" namespace cc { namespace { @@ -100,7 +100,7 @@ void BitmapRasterBufferProvider::Flush() {} -ResourceFormat BitmapRasterBufferProvider::GetResourceFormat( +viz::ResourceFormat BitmapRasterBufferProvider::GetResourceFormat( bool must_support_alpha) const { return resource_provider_->best_texture_format(); }
diff --git a/cc/raster/bitmap_raster_buffer_provider.h b/cc/raster/bitmap_raster_buffer_provider.h index 4f130136..267a079 100644 --- a/cc/raster/bitmap_raster_buffer_provider.h +++ b/cc/raster/bitmap_raster_buffer_provider.h
@@ -35,7 +35,7 @@ void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) override; void OrderingBarrier() override; void Flush() override; - ResourceFormat GetResourceFormat(bool must_support_alpha) const override; + viz::ResourceFormat GetResourceFormat(bool must_support_alpha) const override; bool IsResourceSwizzleRequired(bool must_support_alpha) const override; bool CanPartialRasterIntoProvidedResource() const override; bool IsResourceReadyToDraw(ResourceId id) const override;
diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc index 1f2e8802..24947cf 100644 --- a/cc/raster/gpu_raster_buffer_provider.cc +++ b/cc/raster/gpu_raster_buffer_provider.cc
@@ -120,7 +120,7 @@ ResourceProvider* resource_provider, bool use_distance_field_text, int gpu_rasterization_msaa_sample_count, - ResourceFormat preferred_tile_format, + viz::ResourceFormat preferred_tile_format, bool async_worker_context_enabled) : compositor_context_provider_(compositor_context_provider), worker_context_provider_(worker_context_provider), @@ -185,7 +185,7 @@ } } -ResourceFormat GpuRasterBufferProvider::GetResourceFormat( +viz::ResourceFormat GpuRasterBufferProvider::GetResourceFormat( bool must_support_alpha) const { if (resource_provider_->IsRenderBufferFormatSupported( preferred_tile_format_) &&
diff --git a/cc/raster/gpu_raster_buffer_provider.h b/cc/raster/gpu_raster_buffer_provider.h index d699795..7c194d2 100644 --- a/cc/raster/gpu_raster_buffer_provider.h +++ b/cc/raster/gpu_raster_buffer_provider.h
@@ -22,7 +22,7 @@ ResourceProvider* resource_provider, bool use_distance_field_text, int gpu_rasterization_msaa_sample_count, - ResourceFormat preferred_tile_format, + viz::ResourceFormat preferred_tile_format, bool async_worker_context_enabled); ~GpuRasterBufferProvider() override; @@ -34,7 +34,7 @@ void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) override; void OrderingBarrier() override; void Flush() override; - ResourceFormat GetResourceFormat(bool must_support_alpha) const override; + viz::ResourceFormat GetResourceFormat(bool must_support_alpha) const override; bool IsResourceSwizzleRequired(bool must_support_alpha) const override; bool CanPartialRasterIntoProvidedResource() const override; bool IsResourceReadyToDraw(ResourceId id) const override; @@ -93,7 +93,7 @@ ResourceProvider* const resource_provider_; const bool use_distance_field_text_; const int msaa_sample_count_; - const ResourceFormat preferred_tile_format_; + const viz::ResourceFormat preferred_tile_format_; const bool async_worker_context_enabled_; std::set<RasterBufferImpl*> pending_raster_buffers_;
diff --git a/cc/raster/one_copy_raster_buffer_provider.cc b/cc/raster/one_copy_raster_buffer_provider.cc index f662e6c..2ff956c 100644 --- a/cc/raster/one_copy_raster_buffer_provider.cc +++ b/cc/raster/one_copy_raster_buffer_provider.cc
@@ -16,10 +16,10 @@ #include "base/trace_event/trace_event.h" #include "cc/base/histograms.h" #include "cc/base/math_util.h" -#include "cc/resources/platform_color.h" -#include "cc/resources/resource_format.h" #include "cc/resources/resource_util.h" #include "cc/resources/scoped_resource.h" +#include "components/viz/common/quads/resource_format.h" +#include "components/viz/common/resources/platform_color.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/context_support.h" #include "gpu/command_buffer/client/gles2_interface.h" @@ -74,7 +74,7 @@ int max_copy_texture_chromium_size, bool use_partial_raster, int max_staging_buffer_usage_in_bytes, - ResourceFormat preferred_tile_format, + viz::ResourceFormat preferred_tile_format, bool async_worker_context_enabled) : compositor_context_provider_(compositor_context_provider), worker_context_provider_(worker_context_provider), @@ -150,7 +150,7 @@ } } -ResourceFormat OneCopyRasterBufferProvider::GetResourceFormat( +viz::ResourceFormat OneCopyRasterBufferProvider::GetResourceFormat( bool must_support_alpha) const { if (resource_provider_->IsTextureFormatSupported(preferred_tile_format_) && (DoesResourceFormatSupportAlpha(preferred_tile_format_) ||
diff --git a/cc/raster/one_copy_raster_buffer_provider.h b/cc/raster/one_copy_raster_buffer_provider.h index 581bc49..0ed3bf2 100644 --- a/cc/raster/one_copy_raster_buffer_provider.h +++ b/cc/raster/one_copy_raster_buffer_provider.h
@@ -27,7 +27,7 @@ int max_copy_texture_chromium_size, bool use_partial_raster, int max_staging_buffer_usage_in_bytes, - ResourceFormat preferred_tile_format, + viz::ResourceFormat preferred_tile_format, bool async_worker_context_enabled); ~OneCopyRasterBufferProvider() override; @@ -39,7 +39,7 @@ void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) override; void OrderingBarrier() override; void Flush() override; - ResourceFormat GetResourceFormat(bool must_support_alpha) const override; + viz::ResourceFormat GetResourceFormat(bool must_support_alpha) const override; bool IsResourceSwizzleRequired(bool must_support_alpha) const override; bool CanPartialRasterIntoProvidedResource() const override; bool IsResourceReadyToDraw(ResourceId id) const override; @@ -123,7 +123,7 @@ // Context lock must be acquired when accessing this member. int bytes_scheduled_since_last_flush_; - const ResourceFormat preferred_tile_format_; + const viz::ResourceFormat preferred_tile_format_; StagingBufferPool staging_pool_; const bool async_worker_context_enabled_;
diff --git a/cc/raster/raster_buffer_provider.cc b/cc/raster/raster_buffer_provider.cc index f3e2810..fc3ce57e 100644 --- a/cc/raster/raster_buffer_provider.cc +++ b/cc/raster/raster_buffer_provider.cc
@@ -9,8 +9,8 @@ #include "base/trace_event/trace_event.h" #include "cc/raster/raster_source.h" #include "cc/raster/texture_compressor.h" -#include "cc/resources/platform_color.h" -#include "cc/resources/resource_format_utils.h" +#include "components/viz/common/resources/platform_color.h" +#include "components/viz/common/resources/resource_format_utils.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkMath.h" #include "third_party/skia/include/core/SkSurface.h" @@ -76,19 +76,19 @@ CHECK_LE(size, kMaxTotalSize); } -bool IsSupportedPlaybackToMemoryFormat(ResourceFormat format) { +bool IsSupportedPlaybackToMemoryFormat(viz::ResourceFormat format) { switch (format) { - case RGBA_4444: - case RGBA_8888: - case BGRA_8888: - case ETC1: + case viz::RGBA_4444: + case viz::RGBA_8888: + case viz::BGRA_8888: + case viz::ETC1: return true; - case ALPHA_8: - case LUMINANCE_8: - case RGB_565: - case RED_8: - case LUMINANCE_F16: - case RGBA_F16: + case viz::ALPHA_8: + case viz::LUMINANCE_8: + case viz::RGB_565: + case viz::RED_8: + case viz::LUMINANCE_F16: + case viz::RGBA_F16: return false; } NOTREACHED(); @@ -100,7 +100,7 @@ // static void RasterBufferProvider::PlaybackToMemory( void* memory, - ResourceFormat format, + viz::ResourceFormat format, const gfx::Size& size, size_t stride, const RasterSource* raster_source, @@ -130,9 +130,9 @@ DCHECK_GT(stride, 0u); switch (format) { - case RGBA_8888: - case BGRA_8888: - case RGBA_F16: { + case viz::RGBA_8888: + case viz::BGRA_8888: + case viz::RGBA_F16: { CheckValidRasterInfo(info, memory, stride); sk_sp<SkSurface> surface = SkSurface::MakeRasterDirect(info, memory, stride, &surface_props); @@ -142,8 +142,8 @@ transform, playback_settings); return; } - case RGBA_4444: - case ETC1: { + case viz::RGBA_4444: + case viz::ETC1: { sk_sp<SkSurface> surface = SkSurface::MakeRaster(info, &surface_props); // TODO(reveman): Improve partial raster support by reducing the size of // playback rect passed to PlaybackToCanvas. crbug.com/519070 @@ -151,7 +151,7 @@ canvas_bitmap_rect, canvas_bitmap_rect, transform, playback_settings); - if (format == ETC1) { + if (format == viz::ETC1) { TRACE_EVENT0("cc", "RasterBufferProvider::PlaybackToMemory::CompressETC1"); DCHECK_EQ(size.width() % 4, 0); @@ -174,11 +174,11 @@ } return; } - case ALPHA_8: - case LUMINANCE_8: - case RGB_565: - case RED_8: - case LUMINANCE_F16: + case viz::ALPHA_8: + case viz::LUMINANCE_8: + case viz::RGB_565: + case viz::RED_8: + case viz::LUMINANCE_F16: NOTREACHED(); return; } @@ -187,21 +187,21 @@ } bool RasterBufferProvider::ResourceFormatRequiresSwizzle( - ResourceFormat format) { + viz::ResourceFormat format) { switch (format) { - case RGBA_8888: - case BGRA_8888: - // Initialize resource using the preferred PlatformColor component + case viz::RGBA_8888: + case viz::BGRA_8888: + // Initialize resource using the preferred viz::PlatformColor component // order and swizzle in the shader instead of in software. - return !PlatformColor::SameComponentOrder(format); - case RGBA_4444: - case ETC1: - case ALPHA_8: - case LUMINANCE_8: - case RGB_565: - case RED_8: - case LUMINANCE_F16: - case RGBA_F16: + return !viz::PlatformColor::SameComponentOrder(format); + case viz::RGBA_4444: + case viz::ETC1: + case viz::ALPHA_8: + case viz::LUMINANCE_8: + case viz::RGB_565: + case viz::RED_8: + case viz::LUMINANCE_F16: + case viz::RGBA_F16: return false; } NOTREACHED();
diff --git a/cc/raster/raster_buffer_provider.h b/cc/raster/raster_buffer_provider.h index 6055ccd..31117c9 100644 --- a/cc/raster/raster_buffer_provider.h +++ b/cc/raster/raster_buffer_provider.h
@@ -11,8 +11,8 @@ #include "cc/raster/raster_source.h" #include "cc/raster/task_graph_runner.h" #include "cc/raster/tile_task.h" -#include "cc/resources/resource_format.h" #include "cc/resources/resource_provider.h" +#include "components/viz/common/quads/resource_format.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" @@ -32,7 +32,7 @@ // already partially complete, and only the subrect needs to be played back. static void PlaybackToMemory( void* memory, - ResourceFormat format, + viz::ResourceFormat format, const gfx::Size& size, size_t stride, const RasterSource* raster_source, @@ -59,7 +59,8 @@ virtual void Flush() = 0; // Returns the format to use for the tiles. - virtual ResourceFormat GetResourceFormat(bool must_support_alpha) const = 0; + virtual viz::ResourceFormat GetResourceFormat( + bool must_support_alpha) const = 0; // Determine if the resource requires swizzling. virtual bool IsResourceSwizzleRequired(bool must_support_alpha) const = 0; @@ -87,7 +88,7 @@ protected: // Check if resource format matches output format. - static bool ResourceFormatRequiresSwizzle(ResourceFormat format); + static bool ResourceFormatRequiresSwizzle(viz::ResourceFormat format); }; } // namespace cc
diff --git a/cc/raster/raster_buffer_provider_perftest.cc b/cc/raster/raster_buffer_provider_perftest.cc index 4fdb265..7a6fc82 100644 --- a/cc/raster/raster_buffer_provider_perftest.cc +++ b/cc/raster/raster_buffer_provider_perftest.cc
@@ -18,7 +18,6 @@ #include "cc/raster/raster_buffer_provider.h" #include "cc/raster/synchronous_task_graph_runner.h" #include "cc/raster/zero_copy_raster_buffer_provider.h" -#include "cc/resources/platform_color.h" #include "cc/resources/resource_pool.h" #include "cc/resources/resource_provider.h" #include "cc/resources/scoped_resource.h" @@ -29,6 +28,7 @@ #include "cc/test/test_shared_bitmap_manager.h" #include "cc/test/test_web_graphics_context_3d.h" #include "cc/tiles/tile_task_manager.h" +#include "components/viz/common/resources/platform_color.h" #include "gpu/command_buffer/common/sync_token.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/perf/perf_test.h" @@ -245,7 +245,7 @@ auto resource = base::MakeUnique<ScopedResource>(resource_provider_.get()); resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, - RGBA_8888, gfx::ColorSpace()); + viz::RGBA_8888, gfx::ColorSpace()); // No tile ids are given to support partial updates. std::unique_ptr<RasterBuffer> raster_buffer; @@ -326,7 +326,7 @@ case RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY: Create3dResourceProvider(); raster_buffer_provider_ = ZeroCopyRasterBufferProvider::Create( - resource_provider_.get(), PlatformColor::BestTextureFormat()); + resource_provider_.get(), viz::PlatformColor::BestTextureFormat()); break; case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY: Create3dResourceProvider(); @@ -334,15 +334,15 @@ task_runner_.get(), compositor_context_provider_.get(), worker_context_provider_.get(), resource_provider_.get(), std::numeric_limits<int>::max(), false, - std::numeric_limits<int>::max(), PlatformColor::BestTextureFormat(), - false); + std::numeric_limits<int>::max(), + viz::PlatformColor::BestTextureFormat(), false); break; case RASTER_BUFFER_PROVIDER_TYPE_GPU: Create3dResourceProvider(); raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>( compositor_context_provider_.get(), worker_context_provider_.get(), resource_provider_.get(), false, 0, - PlatformColor::BestTextureFormat(), false); + viz::PlatformColor::BestTextureFormat(), false); break; case RASTER_BUFFER_PROVIDER_TYPE_BITMAP: CreateSoftwareResourceProvider();
diff --git a/cc/raster/raster_buffer_provider_unittest.cc b/cc/raster/raster_buffer_provider_unittest.cc index ea4cdff..737016dd 100644 --- a/cc/raster/raster_buffer_provider_unittest.cc +++ b/cc/raster/raster_buffer_provider_unittest.cc
@@ -25,7 +25,6 @@ #include "cc/raster/one_copy_raster_buffer_provider.h" #include "cc/raster/synchronous_task_graph_runner.h" #include "cc/raster/zero_copy_raster_buffer_provider.h" -#include "cc/resources/platform_color.h" #include "cc/resources/resource_pool.h" #include "cc/resources/resource_provider.h" #include "cc/resources/scoped_resource.h" @@ -36,6 +35,7 @@ #include "cc/test/test_shared_bitmap_manager.h" #include "cc/test/test_web_graphics_context_3d.h" #include "cc/tiles/tile_task_manager.h" +#include "components/viz/common/resources/platform_color.h" #include "gpu/GLES2/gl2extchromium.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/geometry/axis_transform2d.h" @@ -162,7 +162,7 @@ case RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY: Create3dResourceProvider(); raster_buffer_provider_ = ZeroCopyRasterBufferProvider::Create( - resource_provider_.get(), PlatformColor::BestTextureFormat()); + resource_provider_.get(), viz::PlatformColor::BestTextureFormat()); break; case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY: Create3dResourceProvider(); @@ -170,7 +170,7 @@ base::ThreadTaskRunnerHandle::Get().get(), context_provider_.get(), worker_context_provider_.get(), resource_provider_.get(), kMaxBytesPerCopyOperation, false, kMaxStagingBuffers, - PlatformColor::BestTextureFormat(), false); + viz::PlatformColor::BestTextureFormat(), false); break; case RASTER_BUFFER_PROVIDER_TYPE_ASYNC_ONE_COPY: Create3dResourceProvider(); @@ -178,21 +178,21 @@ base::ThreadTaskRunnerHandle::Get().get(), context_provider_.get(), worker_context_provider_.get(), resource_provider_.get(), kMaxBytesPerCopyOperation, false, kMaxStagingBuffers, - PlatformColor::BestTextureFormat(), true); + viz::PlatformColor::BestTextureFormat(), true); break; case RASTER_BUFFER_PROVIDER_TYPE_GPU: Create3dResourceProvider(); raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>( context_provider_.get(), worker_context_provider_.get(), resource_provider_.get(), false, 0, - PlatformColor::BestTextureFormat(), false); + viz::PlatformColor::BestTextureFormat(), false); break; case RASTER_BUFFER_PROVIDER_TYPE_ASYNC_GPU: Create3dResourceProvider(); raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>( context_provider_.get(), worker_context_provider_.get(), resource_provider_.get(), false, 0, - PlatformColor::BestTextureFormat(), true); + viz::PlatformColor::BestTextureFormat(), true); break; case RASTER_BUFFER_PROVIDER_TYPE_BITMAP: CreateSoftwareResourceProvider(); @@ -242,7 +242,7 @@ void AppendTask(unsigned id, const gfx::Size& size) { auto resource = base::MakeUnique<ScopedResource>(resource_provider_.get()); resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, - RGBA_8888, gfx::ColorSpace()); + viz::RGBA_8888, gfx::ColorSpace()); // The raster buffer has no tile ids associated with it for partial update, // so doesn't need to provide a valid dirty rect. @@ -261,7 +261,7 @@ auto resource = base::MakeUnique<ScopedResource>(resource_provider_.get()); resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, - RGBA_8888, gfx::ColorSpace()); + viz::RGBA_8888, gfx::ColorSpace()); std::unique_ptr<RasterBuffer> raster_buffer = raster_buffer_provider_->AcquireBufferForRaster(resource.get(), 0, 0);
diff --git a/cc/raster/raster_source_unittest.cc b/cc/raster/raster_source_unittest.cc index c75fcb8..d4c87821 100644 --- a/cc/raster/raster_source_unittest.cc +++ b/cc/raster/raster_source_unittest.cc
@@ -509,7 +509,7 @@ scoped_refptr<RasterSource> raster_source = recording_source->CreateRasterSource(can_use_lcd); SoftwareImageDecodeCache controller( - ResourceFormat::RGBA_8888, + viz::ResourceFormat::RGBA_8888, LayerTreeSettings().decoded_image_working_set_budget_bytes); raster_source->set_image_decode_cache(&controller);
diff --git a/cc/raster/staging_buffer_pool.cc b/cc/raster/staging_buffer_pool.cc index 450c740..69cd406 100644 --- a/cc/raster/staging_buffer_pool.cc +++ b/cc/raster/staging_buffer_pool.cc
@@ -61,7 +61,7 @@ } // namespace -StagingBuffer::StagingBuffer(const gfx::Size& size, ResourceFormat format) +StagingBuffer::StagingBuffer(const gfx::Size& size, viz::ResourceFormat format) : size(size), format(format), texture_id(0), @@ -91,7 +91,7 @@ } void StagingBuffer::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd, - ResourceFormat format, + viz::ResourceFormat format, bool in_free_list) const { if (!gpu_memory_buffer) return; @@ -215,7 +215,7 @@ } void StagingBufferPool::AddStagingBuffer(const StagingBuffer* staging_buffer, - ResourceFormat format) { + viz::ResourceFormat format) { lock_.AssertAcquired(); DCHECK(buffers_.find(staging_buffer) == buffers_.end());
diff --git a/cc/raster/staging_buffer_pool.h b/cc/raster/staging_buffer_pool.h index 32edc4f..0591cca 100644 --- a/cc/raster/staging_buffer_pool.h +++ b/cc/raster/staging_buffer_pool.h
@@ -31,16 +31,16 @@ class Resource; struct StagingBuffer { - StagingBuffer(const gfx::Size& size, ResourceFormat format); + StagingBuffer(const gfx::Size& size, viz::ResourceFormat format); ~StagingBuffer(); void DestroyGLResources(gpu::gles2::GLES2Interface* gl); void OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd, - ResourceFormat format, + viz::ResourceFormat format, bool is_free) const; const gfx::Size size; - const ResourceFormat format; + const viz::ResourceFormat format; std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer; base::TimeTicks last_usage; unsigned texture_id; @@ -74,7 +74,7 @@ private: void AddStagingBuffer(const StagingBuffer* staging_buffer, - ResourceFormat format); + viz::ResourceFormat format); void RemoveStagingBuffer(const StagingBuffer* staging_buffer); void MarkStagingBufferAsFree(const StagingBuffer* staging_buffer); void MarkStagingBufferAsBusy(const StagingBuffer* staging_buffer);
diff --git a/cc/raster/zero_copy_raster_buffer_provider.cc b/cc/raster/zero_copy_raster_buffer_provider.cc index 9542fe4a..acb6b52 100644 --- a/cc/raster/zero_copy_raster_buffer_provider.cc +++ b/cc/raster/zero_copy_raster_buffer_provider.cc
@@ -14,8 +14,8 @@ #include "base/trace_event/trace_event.h" #include "base/trace_event/trace_event_argument.h" #include "cc/debug/traced_value.h" -#include "cc/resources/platform_color.h" #include "cc/resources/resource.h" +#include "components/viz/common/resources/platform_color.h" #include "ui/gfx/buffer_format_util.h" #include "ui/gfx/gpu_memory_buffer.h" @@ -68,7 +68,7 @@ // static std::unique_ptr<RasterBufferProvider> ZeroCopyRasterBufferProvider::Create( ResourceProvider* resource_provider, - ResourceFormat preferred_tile_format) { + viz::ResourceFormat preferred_tile_format) { return base::WrapUnique<RasterBufferProvider>( new ZeroCopyRasterBufferProvider(resource_provider, preferred_tile_format)); @@ -76,7 +76,7 @@ ZeroCopyRasterBufferProvider::ZeroCopyRasterBufferProvider( ResourceProvider* resource_provider, - ResourceFormat preferred_tile_format) + viz::ResourceFormat preferred_tile_format) : resource_provider_(resource_provider), preferred_tile_format_(preferred_tile_format) {} @@ -102,7 +102,7 @@ void ZeroCopyRasterBufferProvider::Flush() {} -ResourceFormat ZeroCopyRasterBufferProvider::GetResourceFormat( +viz::ResourceFormat ZeroCopyRasterBufferProvider::GetResourceFormat( bool must_support_alpha) const { if (resource_provider_->IsTextureFormatSupported(preferred_tile_format_) && (DoesResourceFormatSupportAlpha(preferred_tile_format_) ||
diff --git a/cc/raster/zero_copy_raster_buffer_provider.h b/cc/raster/zero_copy_raster_buffer_provider.h index 16f2c6bd..db6985d 100644 --- a/cc/raster/zero_copy_raster_buffer_provider.h +++ b/cc/raster/zero_copy_raster_buffer_provider.h
@@ -27,7 +27,7 @@ static std::unique_ptr<RasterBufferProvider> Create( ResourceProvider* resource_provider, - ResourceFormat preferred_tile_format); + viz::ResourceFormat preferred_tile_format); // Overridden from RasterBufferProvider: std::unique_ptr<RasterBuffer> AcquireBufferForRaster( @@ -37,7 +37,7 @@ void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) override; void OrderingBarrier() override; void Flush() override; - ResourceFormat GetResourceFormat(bool must_support_alpha) const override; + viz::ResourceFormat GetResourceFormat(bool must_support_alpha) const override; bool IsResourceSwizzleRequired(bool must_support_alpha) const override; bool CanPartialRasterIntoProvidedResource() const override; bool IsResourceReadyToDraw(ResourceId id) const override; @@ -49,14 +49,14 @@ protected: ZeroCopyRasterBufferProvider(ResourceProvider* resource_provider, - ResourceFormat preferred_tile_format); + viz::ResourceFormat preferred_tile_format); private: std::unique_ptr<base::trace_event::ConvertableToTraceFormat> StateAsValue() const; ResourceProvider* resource_provider_; - ResourceFormat preferred_tile_format_; + viz::ResourceFormat preferred_tile_format_; DISALLOW_COPY_AND_ASSIGN(ZeroCopyRasterBufferProvider); };
diff --git a/cc/resources/resource.h b/cc/resources/resource.h index 4dd483e..edae0cc 100644 --- a/cc/resources/resource.h +++ b/cc/resources/resource.h
@@ -16,21 +16,21 @@ class CC_EXPORT Resource { public: - Resource() : id_(0), format_(RGBA_8888) {} + Resource() : id_(0), format_(viz::RGBA_8888) {} Resource(unsigned id, const gfx::Size& size, - ResourceFormat format, + viz::ResourceFormat format, const gfx::ColorSpace& color_space) : id_(id), size_(size), format_(format), color_space_(color_space) {} ResourceId id() const { return id_; } const gfx::Size& size() const { return size_; } - ResourceFormat format() const { return format_; } + viz::ResourceFormat format() const { return format_; } const gfx::ColorSpace& color_space() const { return color_space_; } protected: void set_id(ResourceId id) { id_ = id; } - void set_dimensions(const gfx::Size& size, ResourceFormat format) { + void set_dimensions(const gfx::Size& size, viz::ResourceFormat format) { size_ = size; format_ = format; } @@ -41,7 +41,7 @@ private: ResourceId id_; gfx::Size size_; - ResourceFormat format_; + viz::ResourceFormat format_; gfx::ColorSpace color_space_; DISALLOW_COPY_AND_ASSIGN(Resource);
diff --git a/cc/resources/resource_format.h b/cc/resources/resource_format.h deleted file mode 100644 index 125a4ebf..0000000 --- a/cc/resources/resource_format.h +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright 2013 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 CC_RESOURCES_RESOURCE_FORMAT_H_ -#define CC_RESOURCES_RESOURCE_FORMAT_H_ - -#include "base/logging.h" -#include "cc/cc_export.h" -#include "ui/gfx/buffer_types.h" - -// TODO(prashant.n): Including third_party/khronos/GLES2/gl2.h causes -// redefinition errors as macros/functions defined in it conflict with -// macros/functions defined in ui/gl/gl_bindings.h. (http://crbug.com/512833). -typedef unsigned int GLenum; - -namespace cc { - -// Keep in sync with arrays below. -enum ResourceFormat { - RGBA_8888, - RGBA_4444, - BGRA_8888, - ALPHA_8, - LUMINANCE_8, - RGB_565, - ETC1, - RED_8, - LUMINANCE_F16, - RGBA_F16, - RESOURCE_FORMAT_MAX = RGBA_F16, -}; - -CC_EXPORT int BitsPerPixel(ResourceFormat format); -CC_EXPORT GLenum GLDataType(ResourceFormat format); -CC_EXPORT GLenum GLDataFormat(ResourceFormat format); -CC_EXPORT GLenum GLInternalFormat(ResourceFormat format); -CC_EXPORT GLenum GLCopyTextureInternalFormat(ResourceFormat format); -CC_EXPORT gfx::BufferFormat BufferFormat(ResourceFormat format); - -bool IsResourceFormatCompressed(ResourceFormat format); -bool DoesResourceFormatSupportAlpha(ResourceFormat format); - -} // namespace cc - -#endif // CC_RESOURCES_RESOURCE_FORMAT_H_
diff --git a/cc/resources/resource_format_utils.cc b/cc/resources/resource_format_utils.cc deleted file mode 100644 index 8118160..0000000 --- a/cc/resources/resource_format_utils.cc +++ /dev/null
@@ -1,34 +0,0 @@ -// Copyright 2016 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 "cc/resources/resource_format_utils.h" - -namespace cc { - -SkColorType ResourceFormatToClosestSkColorType(ResourceFormat format) { - // Use kN32_SkColorType if there is no corresponding SkColorType. - switch (format) { - case RGBA_4444: - return kARGB_4444_SkColorType; - case RGBA_8888: - case BGRA_8888: - return kN32_SkColorType; - case ALPHA_8: - return kAlpha_8_SkColorType; - case RGB_565: - return kRGB_565_SkColorType; - case LUMINANCE_8: - return kGray_8_SkColorType; - case ETC1: - case RED_8: - case LUMINANCE_F16: - return kN32_SkColorType; - case RGBA_F16: - return kRGBA_F16_SkColorType; - } - NOTREACHED(); - return kN32_SkColorType; -} - -} // namespace cc
diff --git a/cc/resources/resource_format_utils.h b/cc/resources/resource_format_utils.h deleted file mode 100644 index 200c33c9b..0000000 --- a/cc/resources/resource_format_utils.h +++ /dev/null
@@ -1,17 +0,0 @@ -// Copyright 2016 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 CC_RESOURCES_RESOURCE_FORMAT_UTILS_H_ -#define CC_RESOURCES_RESOURCE_FORMAT_UTILS_H_ - -#include "cc/resources/resource_format.h" -#include "third_party/skia/include/core/SkImageInfo.h" - -namespace cc { - -SkColorType ResourceFormatToClosestSkColorType(ResourceFormat format); - -} // namespace cc - -#endif // CC_RESOURCES_RESOURCE_FORMAT_UTILS_H_
diff --git a/cc/resources/resource_pool.cc b/cc/resources/resource_pool.cc index 5ad2f6a5..440af64 100644 --- a/cc/resources/resource_pool.cc +++ b/cc/resources/resource_pool.cc
@@ -142,7 +142,7 @@ } Resource* ResourcePool::ReuseResource(const gfx::Size& size, - ResourceFormat format, + viz::ResourceFormat format, const gfx::ColorSpace& color_space) { // Finding resources in |unused_resources_| from MRU to LRU direction, touches // LRU resources only if needed, which increases possibility of expiring more @@ -171,7 +171,7 @@ } Resource* ResourcePool::CreateResource(const gfx::Size& size, - ResourceFormat format, + viz::ResourceFormat format, const gfx::ColorSpace& color_space) { std::unique_ptr<PoolResource> pool_resource = PoolResource::Create(resource_provider_); @@ -203,7 +203,7 @@ } Resource* ResourcePool::AcquireResource(const gfx::Size& size, - ResourceFormat format, + viz::ResourceFormat format, const gfx::ColorSpace& color_space) { Resource* reused_resource = ReuseResource(size, format, color_space); if (reused_resource)
diff --git a/cc/resources/resource_pool.h b/cc/resources/resource_pool.h index 33291874..f1de3eb 100644 --- a/cc/resources/resource_pool.h +++ b/cc/resources/resource_pool.h
@@ -18,8 +18,8 @@ #include "base/trace_event/memory_dump_provider.h" #include "cc/cc_export.h" #include "cc/resources/resource.h" -#include "cc/resources/resource_format.h" #include "cc/resources/scoped_resource.h" +#include "components/viz/common/quads/resource_format.h" namespace cc { @@ -55,7 +55,7 @@ // Tries to reuse a resource. If none are available, makes a new one. Resource* AcquireResource(const gfx::Size& size, - ResourceFormat format, + viz::ResourceFormat format, const gfx::ColorSpace& color_space); // Tries to acquire the resource with |previous_content_id| for us in partial @@ -150,12 +150,12 @@ // Tries to reuse a resource. Returns |nullptr| if none are available. Resource* ReuseResource(const gfx::Size& size, - ResourceFormat format, + viz::ResourceFormat format, const gfx::ColorSpace& color_space); // Creates a new resource without trying to reuse an old one. Resource* CreateResource(const gfx::Size& size, - ResourceFormat format, + viz::ResourceFormat format, const gfx::ColorSpace& color_space); void DidFinishUsingResource(std::unique_ptr<PoolResource> resource);
diff --git a/cc/resources/resource_pool_unittest.cc b/cc/resources/resource_pool_unittest.cc index 34f7aca..a25ab1f 100644 --- a/cc/resources/resource_pool_unittest.cc +++ b/cc/resources/resource_pool_unittest.cc
@@ -49,7 +49,7 @@ TEST_F(ResourcePoolTest, AcquireRelease) { gfx::Size size(100, 100); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); Resource* resource = resource_pool_->AcquireResource(size, format, color_space); @@ -67,7 +67,7 @@ resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); gfx::Size size(100, 100); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); size_t resource_bytes = ResourceUtil::UncheckedSizeInBytes<size_t>(size, format); @@ -108,7 +108,7 @@ resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); gfx::Size size(100, 100); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; gfx::ColorSpace color_space1; gfx::ColorSpace color_space2 = gfx::ColorSpace::CreateSRGB(); @@ -124,8 +124,8 @@ EXPECT_EQ(1u, resource_provider_->num_resources()); // Different size/format should allocate new resource. - resource = resource_pool_->AcquireResource(gfx::Size(50, 50), LUMINANCE_8, - color_space1); + resource = resource_pool_->AcquireResource(gfx::Size(50, 50), + viz::LUMINANCE_8, color_space1); EXPECT_EQ(2u, resource_provider_->num_resources()); CheckAndReturnResource(resource); EXPECT_EQ(2u, resource_provider_->num_resources()); @@ -144,7 +144,7 @@ resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); gfx::Size size(100, 100); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); Resource* resource = @@ -171,7 +171,7 @@ resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); gfx::Size size(100, 100); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; gfx::ColorSpace color_space; Resource* resource = @@ -212,7 +212,7 @@ resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); gfx::Size size(100, 100); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; gfx::ColorSpace color_space; Resource* resource = @@ -249,7 +249,7 @@ TEST_F(ResourcePoolTest, UpdateContentId) { gfx::Size size(100, 100); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; gfx::ColorSpace color_space; uint64_t content_id = 42; uint64_t new_content_id = 43; @@ -273,7 +273,7 @@ TEST_F(ResourcePoolTest, UpdateContentIdAndInvalidatedRect) { gfx::Size size(100, 100); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; gfx::ColorSpace color_space; uint64_t content_ids[] = {42, 43, 44}; gfx::Rect invalidated_rect(20, 20, 10, 10); @@ -317,7 +317,7 @@ } TEST_F(ResourcePoolTest, ReuseResource) { - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); // Create unused resource with size 100x100. @@ -370,7 +370,7 @@ resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); gfx::Size size(100, 100); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); Resource* resource = resource_pool_->AcquireResource(size, format, color_space); @@ -399,7 +399,7 @@ TEST_F(ResourcePoolTest, TextureHintRespected) { gfx::Size size(100, 100); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; gfx::ColorSpace color_space; resource_pool_ = @@ -421,7 +421,7 @@ } TEST_F(ResourcePoolTest, ExactRequestsRespected) { - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); resource_pool_ =
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc index 26975dab..d4feafe 100644 --- a/cc/resources/resource_provider.cc +++ b/cc/resources/resource_provider.cc
@@ -22,11 +22,11 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/memory_dump_manager.h" #include "base/trace_event/trace_event.h" -#include "cc/resources/platform_color.h" #include "cc/resources/resource_util.h" #include "cc/resources/returned_resource.h" #include "cc/resources/shared_bitmap_manager.h" #include "cc/resources/transferable_resource.h" +#include "components/viz/common/resources/platform_color.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/context_support.h" #include "gpu/command_buffer/client/gles2_interface.h" @@ -90,24 +90,24 @@ return type != ResourceProvider::RESOURCE_TYPE_BITMAP; } -GLenum TextureToStorageFormat(ResourceFormat format) { +GLenum TextureToStorageFormat(viz::ResourceFormat format) { GLenum storage_format = GL_RGBA8_OES; switch (format) { - case RGBA_8888: + case viz::RGBA_8888: break; - case BGRA_8888: + case viz::BGRA_8888: storage_format = GL_BGRA8_EXT; break; - case RGBA_F16: + case viz::RGBA_F16: storage_format = GL_RGBA16F_EXT; break; - case RGBA_4444: - case ALPHA_8: - case LUMINANCE_8: - case RGB_565: - case ETC1: - case RED_8: - case LUMINANCE_F16: + case viz::RGBA_4444: + case viz::ALPHA_8: + case viz::LUMINANCE_8: + case viz::RGB_565: + case viz::ETC1: + case viz::RED_8: + case viz::LUMINANCE_F16: NOTREACHED(); break; } @@ -115,34 +115,34 @@ return storage_format; } -bool IsFormatSupportedForStorage(ResourceFormat format, bool use_bgra) { +bool IsFormatSupportedForStorage(viz::ResourceFormat format, bool use_bgra) { switch (format) { - case RGBA_8888: - case RGBA_F16: + case viz::RGBA_8888: + case viz::RGBA_F16: return true; - case BGRA_8888: + case viz::BGRA_8888: return use_bgra; - case RGBA_4444: - case ALPHA_8: - case LUMINANCE_8: - case RGB_565: - case ETC1: - case RED_8: - case LUMINANCE_F16: + case viz::RGBA_4444: + case viz::ALPHA_8: + case viz::LUMINANCE_8: + case viz::RGB_565: + case viz::ETC1: + case viz::RED_8: + case viz::LUMINANCE_F16: return false; } return false; } -GrPixelConfig ToGrPixelConfig(ResourceFormat format) { +GrPixelConfig ToGrPixelConfig(viz::ResourceFormat format) { switch (format) { - case RGBA_8888: + case viz::RGBA_8888: return kRGBA_8888_GrPixelConfig; - case BGRA_8888: + case viz::BGRA_8888: return kBGRA_8888_GrPixelConfig; - case RGBA_4444: + case viz::RGBA_4444: return kRGBA_4444_GrPixelConfig; - case RGBA_F16: + case viz::RGBA_F16: return kRGBA_half_GrPixelConfig; default: break; @@ -187,7 +187,7 @@ GLenum filter, TextureHint hint, ResourceType type, - ResourceFormat format) + viz::ResourceFormat format) : child_id(0), gl_id(texture_id), gl_pixel_buffer_id(0), @@ -262,7 +262,7 @@ hint(TEXTURE_HINT_IMMUTABLE), type(RESOURCE_TYPE_BITMAP), buffer_format(gfx::BufferFormat::RGBA_8888), - format(RGBA_8888), + format(viz::RGBA_8888), shared_bitmap(bitmap) { DCHECK(origin == DELEGATED || pixels); if (bitmap) @@ -305,7 +305,7 @@ hint(TEXTURE_HINT_IMMUTABLE), type(RESOURCE_TYPE_BITMAP), buffer_format(gfx::BufferFormat::RGBA_8888), - format(RGBA_8888), + format(viz::RGBA_8888), shared_bitmap_id(bitmap_id), shared_bitmap(nullptr) { } @@ -379,7 +379,7 @@ default_resource_type = RESOURCE_TYPE_BITMAP; // Pick an arbitrary limit here similar to what hardware might. max_texture_size = 16 * 1024; - best_texture_format = RGBA_8888; + best_texture_format = viz::RGBA_8888; return; } @@ -392,19 +392,20 @@ use_sync_query = caps.sync_query; if (caps.disable_one_component_textures) { - yuv_resource_format = yuv_highbit_resource_format = RGBA_8888; + yuv_resource_format = yuv_highbit_resource_format = viz::RGBA_8888; } else { - yuv_resource_format = caps.texture_rg ? RED_8 : LUMINANCE_8; - yuv_highbit_resource_format = - caps.texture_half_float_linear ? LUMINANCE_F16 : yuv_resource_format; + yuv_resource_format = caps.texture_rg ? viz::RED_8 : viz::LUMINANCE_8; + yuv_highbit_resource_format = caps.texture_half_float_linear + ? viz::LUMINANCE_F16 + : yuv_resource_format; } GLES2Interface* gl = compositor_context_provider->ContextGL(); gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size); best_texture_format = - PlatformColor::BestSupportedTextureFormat(use_texture_format_bgra); - best_render_buffer_format = PlatformColor::BestSupportedTextureFormat( + viz::PlatformColor::BestSupportedTextureFormat(use_texture_format_bgra); + best_render_buffer_format = viz::PlatformColor::BestSupportedTextureFormat( caps.render_buffer_format_bgra8888); } @@ -479,26 +480,27 @@ gl->Finish(); } -bool ResourceProvider::IsTextureFormatSupported(ResourceFormat format) const { +bool ResourceProvider::IsTextureFormatSupported( + viz::ResourceFormat format) const { gpu::Capabilities caps; if (compositor_context_provider_) caps = compositor_context_provider_->ContextCapabilities(); switch (format) { - case ALPHA_8: - case RGBA_4444: - case RGBA_8888: - case RGB_565: - case LUMINANCE_8: + case viz::ALPHA_8: + case viz::RGBA_4444: + case viz::RGBA_8888: + case viz::RGB_565: + case viz::LUMINANCE_8: return true; - case BGRA_8888: + case viz::BGRA_8888: return caps.texture_format_bgra8888; - case ETC1: + case viz::ETC1: return caps.texture_format_etc1; - case RED_8: + case viz::RED_8: return caps.texture_rg; - case LUMINANCE_F16: - case RGBA_F16: + case viz::LUMINANCE_F16: + case viz::RGBA_F16: return caps.texture_half_float_linear; } @@ -507,29 +509,29 @@ } bool ResourceProvider::IsRenderBufferFormatSupported( - ResourceFormat format) const { + viz::ResourceFormat format) const { gpu::Capabilities caps; if (compositor_context_provider_) caps = compositor_context_provider_->ContextCapabilities(); switch (format) { - case RGBA_4444: - case RGBA_8888: - case RGB_565: + case viz::RGBA_4444: + case viz::RGBA_8888: + case viz::RGB_565: return true; - case BGRA_8888: + case viz::BGRA_8888: return caps.render_buffer_format_bgra8888; - case RGBA_F16: + case viz::RGBA_F16: // TODO(ccameron): This will always return false on pixel tests, which // makes it un-test-able until we upgrade Mesa. // https://crbug.com/687720 return caps.texture_half_float_linear && caps.color_buffer_half_float_rgba; - case LUMINANCE_8: - case ALPHA_8: - case RED_8: - case ETC1: - case LUMINANCE_F16: + case viz::LUMINANCE_8: + case viz::ALPHA_8: + case viz::RED_8: + case viz::ETC1: + case viz::LUMINANCE_F16: // We don't currently render into these formats. If we need to render into // these eventually, we should expand this logic. return false; @@ -556,7 +558,7 @@ resource->lost = true; } -ResourceFormat ResourceProvider::YuvResourceFormat(int bits) const { +viz::ResourceFormat ResourceProvider::YuvResourceFormat(int bits) const { if (bits > 8) { return settings_.yuv_highbit_resource_format; } else { @@ -567,13 +569,13 @@ ResourceId ResourceProvider::CreateResource( const gfx::Size& size, TextureHint hint, - ResourceFormat format, + viz::ResourceFormat format, const gfx::ColorSpace& color_space) { DCHECK(!size.IsEmpty()); switch (settings_.default_resource_type) { case RESOURCE_TYPE_GPU_MEMORY_BUFFER: - // GPU memory buffers don't support LUMINANCE_F16 yet. - if (format != LUMINANCE_F16) { + // GPU memory buffers don't support viz::LUMINANCE_F16 yet. + if (format != viz::LUMINANCE_F16) { return CreateGLTexture( size, hint, RESOURCE_TYPE_GPU_MEMORY_BUFFER, format, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, color_space); @@ -585,7 +587,7 @@ color_space); case RESOURCE_TYPE_BITMAP: - DCHECK_EQ(RGBA_8888, format); + DCHECK_EQ(viz::RGBA_8888, format); return CreateBitmap(size, color_space); } @@ -596,7 +598,7 @@ ResourceId ResourceProvider::CreateGpuMemoryBufferResource( const gfx::Size& size, TextureHint hint, - ResourceFormat format, + viz::ResourceFormat format, gfx::BufferUsage usage, const gfx::ColorSpace& color_space) { DCHECK(!size.IsEmpty()); @@ -607,7 +609,7 @@ format, usage, color_space); } case RESOURCE_TYPE_BITMAP: - DCHECK_EQ(RGBA_8888, format); + DCHECK_EQ(viz::RGBA_8888, format); return CreateBitmap(size, color_space); } @@ -619,7 +621,7 @@ const gfx::Size& size, TextureHint hint, ResourceType type, - ResourceFormat format, + viz::ResourceFormat format, gfx::BufferUsage usage, const gfx::ColorSpace& color_space) { DCHECK_LE(size.width(), settings_.max_texture_size); @@ -672,11 +674,11 @@ Resource* resource = nullptr; if (mailbox.IsTexture()) { resource = InsertResource( - id, - Resource(0, mailbox.size_in_pixels(), Resource::EXTERNAL, - mailbox.target(), - mailbox.nearest_neighbor() ? GL_NEAREST : GL_LINEAR, - TEXTURE_HINT_IMMUTABLE, RESOURCE_TYPE_GL_TEXTURE, RGBA_8888)); + id, Resource(0, mailbox.size_in_pixels(), Resource::EXTERNAL, + mailbox.target(), + mailbox.nearest_neighbor() ? GL_NEAREST : GL_LINEAR, + TEXTURE_HINT_IMMUTABLE, RESOURCE_TYPE_GL_TEXTURE, + viz::RGBA_8888)); } else { DCHECK(mailbox.IsSharedMemory()); SharedBitmap* shared_bitmap = mailbox.shared_bitmap(); @@ -889,7 +891,7 @@ if (resource->type == RESOURCE_TYPE_BITMAP) { DCHECK_EQ(RESOURCE_TYPE_BITMAP, resource->type); DCHECK(resource->allocated); - DCHECK_EQ(RGBA_8888, resource->format); + DCHECK_EQ(viz::RGBA_8888, resource->format); SkImageInfo source_info = SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()); size_t image_stride = image_size.width() * 4; @@ -906,10 +908,11 @@ GLES2Interface* gl = ContextGL(); DCHECK(gl); gl->BindTexture(resource->target, resource_texture_id); - if (resource->format == ETC1) { + if (resource->format == viz::ETC1) { DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); - int image_bytes = ResourceUtil::CheckedSizeInBytes<int>(image_size, ETC1); - gl->CompressedTexImage2D(resource->target, 0, GLInternalFormat(ETC1), + int image_bytes = + ResourceUtil::CheckedSizeInBytes<int>(image_size, viz::ETC1); + gl->CompressedTexImage2D(resource->target, 0, GLInternalFormat(viz::ETC1), image_size.width(), image_size.height(), 0, image_bytes, image); } else { @@ -1208,7 +1211,7 @@ void ResourceProvider::PopulateSkBitmapWithResource(SkBitmap* sk_bitmap, const Resource* resource) { - DCHECK_EQ(RGBA_8888, resource->format); + DCHECK_EQ(viz::RGBA_8888, resource->format); SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(), resource->size.height()); sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); @@ -1932,7 +1935,7 @@ resource->allocated = true; GLES2Interface* gl = ContextGL(); gfx::Size& size = resource->size; - ResourceFormat format = resource->format; + viz::ResourceFormat format = resource->format; gl->BindTexture(resource->target, resource->gl_id); if (resource->type == RESOURCE_TYPE_GPU_MEMORY_BUFFER) { resource->gpu_memory_buffer = @@ -1961,8 +1964,8 @@ gl->TexStorage2DEXT(resource->target, 1, storage_format, size.width(), size.height()); } else { - // ETC1 does not support preallocation. - if (format != ETC1) { + // viz::ETC1 does not support preallocation. + if (format != viz::ETC1) { gl->TexImage2D(resource->target, 0, GLInternalFormat(format), size.width(), size.height(), 0, GLDataFormat(format), GLDataType(format), nullptr); @@ -2033,7 +2036,7 @@ } GLenum ResourceProvider::GetImageTextureTarget(gfx::BufferUsage usage, - ResourceFormat format) { + viz::ResourceFormat format) { gfx::BufferFormat buffer_format = BufferFormat(format); auto found = buffer_to_texture_target_map_.find( BufferToTextureTargetKey(usage, buffer_format));
diff --git a/cc/resources/resource_provider.h b/cc/resources/resource_provider.h index 6f9a5038..49b27250 100644 --- a/cc/resources/resource_provider.h +++ b/cc/resources/resource_provider.h
@@ -30,13 +30,13 @@ #include "cc/output/output_surface.h" #include "cc/output/renderer_settings.h" #include "cc/resources/release_callback_impl.h" -#include "cc/resources/resource_format.h" #include "cc/resources/resource_settings.h" #include "cc/resources/return_callback.h" #include "cc/resources/shared_bitmap.h" #include "cc/resources/single_release_callback_impl.h" #include "cc/resources/texture_mailbox.h" #include "cc/resources/transferable_resource.h" +#include "components/viz/common/quads/resource_format.h" #include "third_party/khronos/GLES2/gl2.h" #include "third_party/khronos/GLES2/gl2ext.h" #include "third_party/skia/include/core/SkBitmap.h" @@ -95,24 +95,24 @@ void DidLoseContextProvider() { lost_context_provider_ = true; } int max_texture_size() const { return settings_.max_texture_size; } - ResourceFormat best_texture_format() const { + viz::ResourceFormat best_texture_format() const { return settings_.best_texture_format; } - ResourceFormat best_render_buffer_format() const { + viz::ResourceFormat best_render_buffer_format() const { return settings_.best_render_buffer_format; } - ResourceFormat YuvResourceFormat(int bits) const; + viz::ResourceFormat YuvResourceFormat(int bits) const; bool use_sync_query() const { return settings_.use_sync_query; } gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager() { return gpu_memory_buffer_manager_; } size_t num_resources() const { return resources_.size(); } - bool IsTextureFormatSupported(ResourceFormat format) const; + bool IsTextureFormatSupported(viz::ResourceFormat format) const; // Returns true if the provided |format| can be used as a render buffer. // Note that render buffer support implies texture support. - bool IsRenderBufferFormatSupported(ResourceFormat format) const; + bool IsRenderBufferFormatSupported(viz::ResourceFormat format) const; // Checks whether a resource is in use by a consumer. bool InUseByConsumer(ResourceId id); @@ -135,14 +135,14 @@ // Creates a resource of the default resource type. ResourceId CreateResource(const gfx::Size& size, TextureHint hint, - ResourceFormat format, + viz::ResourceFormat format, const gfx::ColorSpace& color_space); // Creates a resource for a particular texture target (the distinction between // texture targets has no effect in software mode). ResourceId CreateGpuMemoryBufferResource(const gfx::Size& size, TextureHint hint, - ResourceFormat format, + viz::ResourceFormat format, gfx::BufferUsage usage, const gfx::ColorSpace& color_space); @@ -287,7 +287,7 @@ unsigned texture_id() const { return texture_id_; } GLenum target() const { return target_; } - ResourceFormat format() const { return format_; } + viz::ResourceFormat format() const { return format_; } const gfx::Size& size() const { return size_; } // Will return the invalid color space unless // |enable_color_correct_rasterization| is true. @@ -309,7 +309,7 @@ ResourceId resource_id_; unsigned texture_id_; GLenum target_; - ResourceFormat format_; + viz::ResourceFormat format_; gfx::Size size_; TextureMailbox mailbox_; gpu::SyncToken sync_token_; @@ -435,7 +435,7 @@ private: ResourceProvider* resource_provider_; ResourceId resource_id_; - ResourceFormat format_; + viz::ResourceFormat format_; gfx::BufferUsage usage_; gfx::Size size_; std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer_; @@ -536,7 +536,8 @@ void ValidateResource(ResourceId id) const; - GLenum GetImageTextureTarget(gfx::BufferUsage usage, ResourceFormat format); + GLenum GetImageTextureTarget(gfx::BufferUsage usage, + viz::ResourceFormat format); // base::trace_event::MemoryDumpProvider implementation. bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args, @@ -587,7 +588,7 @@ GLenum filter, TextureHint hint, ResourceType type, - ResourceFormat format); + viz::ResourceFormat format); Resource(uint8_t* pixels, SharedBitmap* bitmap, const gfx::Size& size, @@ -669,13 +670,13 @@ // be used. gfx::BufferUsage usage; // This is the the actual format of the underlaying GpuMemoryBuffer, if any, - // and might not correspond to ResourceFormat. This format is needed to + // and might not correspond to viz::ResourceFormat. This format is needed to // scanout the buffer as HW overlay. gfx::BufferFormat buffer_format; // Resource format is the format as seen from the compositor and might not // correspond to buffer_format (e.g: A resouce that was created from a YUV // buffer could be seen as RGB from the compositor/GL.) - ResourceFormat format; + viz::ResourceFormat format; SharedBitmapId shared_bitmap_id; SharedBitmap* shared_bitmap; std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer; @@ -709,7 +710,7 @@ ResourceId CreateGLTexture(const gfx::Size& size, TextureHint hint, ResourceType type, - ResourceFormat format, + viz::ResourceFormat format, gfx::BufferUsage usage, const gfx::ColorSpace& color_space); ResourceId CreateBitmap(const gfx::Size& size, @@ -773,10 +774,10 @@ bool use_texture_usage_hint = false; bool use_sync_query = false; ResourceType default_resource_type = RESOURCE_TYPE_GL_TEXTURE; - ResourceFormat yuv_resource_format = LUMINANCE_8; - ResourceFormat yuv_highbit_resource_format = LUMINANCE_8; - ResourceFormat best_texture_format = RGBA_8888; - ResourceFormat best_render_buffer_format = RGBA_8888; + viz::ResourceFormat yuv_resource_format = viz::LUMINANCE_8; + viz::ResourceFormat yuv_highbit_resource_format = viz::LUMINANCE_8; + viz::ResourceFormat best_texture_format = viz::RGBA_8888; + viz::ResourceFormat best_render_buffer_format = viz::RGBA_8888; bool enable_color_correct_rasterization = false; bool delegated_sync_points_required = false; } const settings_;
diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc index 3ba950a..b8b9df6 100644 --- a/cc/resources/resource_provider_unittest.cc +++ b/cc/resources/resource_provider_unittest.cc
@@ -28,6 +28,7 @@ #include "cc/test/test_texture.h" #include "cc/test/test_web_graphics_context_3d.h" #include "cc/trees/blocking_task_runner.h" +#include "components/viz/common/resources/resource_format_utils.h" #include "gpu/GLES2/gl2extchromium.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -336,7 +337,7 @@ } void GetPixels(const gfx::Size& size, - ResourceFormat format, + viz::ResourceFormat format, uint8_t* pixels) { CheckTextureIsBound(GL_TEXTURE_2D); base::AutoLock lock_for_texture_access(namespace_->lock); @@ -353,13 +354,13 @@ private: void AllocateTexture(const gfx::Size& size, GLenum format) { CheckTextureIsBound(GL_TEXTURE_2D); - ResourceFormat texture_format = RGBA_8888; + viz::ResourceFormat texture_format = viz::RGBA_8888; switch (format) { case GL_RGBA: - texture_format = RGBA_8888; + texture_format = viz::RGBA_8888; break; case GL_BGRA_EXT: - texture_format = BGRA_8888; + texture_format = viz::BGRA_8888; break; } base::AutoLock lock_for_texture_access(namespace_->lock); @@ -404,7 +405,7 @@ ResourceProviderContext* context, ResourceId id, const gfx::Size& size, - ResourceFormat format, + viz::ResourceFormat format, uint8_t* pixels) { resource_provider->WaitSyncTokenIfNeeded(id); switch (resource_provider->default_resource_type()) { @@ -553,7 +554,7 @@ DCHECK_EQ(expected_default_type, resource_provider->default_resource_type()); gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; size_t pixel_size = TextureSizeBytes(size, format); ASSERT_EQ(4U, pixel_size); @@ -585,7 +586,7 @@ TEST_P(ResourceProviderTest, SimpleUpload) { gfx::Size size(2, 2); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; size_t pixel_size = TextureSizeBytes(size, format); ASSERT_EQ(16U, pixel_size); @@ -620,7 +621,7 @@ if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) return; gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; size_t pixel_size = TextureSizeBytes(size, format); ASSERT_EQ(4U, pixel_size); @@ -995,7 +996,7 @@ TEST_P(ResourceProviderTestNoSyncToken, TransferGLResources) { gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; size_t pixel_size = TextureSizeBytes(size, format); ASSERT_EQ(4U, pixel_size); @@ -1103,7 +1104,7 @@ if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) return; gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; uint8_t data1[4] = {1, 2, 3, 4}; std::vector<ReturnedResource> returned_to_child; @@ -1161,7 +1162,7 @@ if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) return; gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; ResourceId id1 = child_resource_provider_->CreateResource( size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format, @@ -1228,7 +1229,7 @@ if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) return; gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; ResourceId id1 = child_resource_provider_->CreateResource( size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format, @@ -1280,7 +1281,7 @@ if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) return; gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; ResourceId id1 = child_resource_provider_->CreateResource( size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format, @@ -1345,7 +1346,7 @@ if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) return; gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; ResourceId id1 = child_resource_provider_->CreateResource( size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format, @@ -1404,7 +1405,7 @@ return; gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; size_t pixel_size = TextureSizeBytes(size, format); ASSERT_EQ(4U, pixel_size); @@ -1612,7 +1613,7 @@ CreateResourceSettings())); gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; size_t pixel_size = TextureSizeBytes(size, format); ASSERT_EQ(4U, pixel_size); @@ -1660,7 +1661,7 @@ return; gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; size_t pixel_size = TextureSizeBytes(size, format); ASSERT_EQ(4U, pixel_size); @@ -1709,7 +1710,7 @@ TEST_P(ResourceProviderTest, DeleteExportedResources) { gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; size_t pixel_size = TextureSizeBytes(size, format); ASSERT_EQ(4U, pixel_size); @@ -1809,7 +1810,7 @@ TEST_P(ResourceProviderTest, DestroyChildWithExportedResources) { gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; size_t pixel_size = TextureSizeBytes(size, format); ASSERT_EQ(4U, pixel_size); @@ -1926,7 +1927,7 @@ TEST_P(ResourceProviderTest, DeleteTransferredResources) { gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; size_t pixel_size = TextureSizeBytes(size, format); ASSERT_EQ(4U, pixel_size); @@ -1979,7 +1980,7 @@ TEST_P(ResourceProviderTest, UnuseTransferredResources) { gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; size_t pixel_size = TextureSizeBytes(size, format); ASSERT_EQ(4U, pixel_size); @@ -2126,7 +2127,7 @@ resource_settings)); gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; int child_texture_id = 1; int parent_texture_id = 2; @@ -2317,8 +2318,7 @@ unsigned other_texture = context()->createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); uint8_t test_data[4] = { 0 }; - context()->GetPixels( - gfx::Size(1, 1), RGBA_8888, test_data); + context()->GetPixels(gfx::Size(1, 1), viz::RGBA_8888, test_data); EXPECT_EQ(0, memcmp(data, test_data, sizeof(data))); context()->produceTextureDirectCHROMIUM(other_texture, GL_TEXTURE_2D, @@ -2372,8 +2372,7 @@ unsigned other_texture = context()->createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); uint8_t test_data[4] = { 0 }; - context()->GetPixels( - gfx::Size(1, 1), RGBA_8888, test_data); + context()->GetPixels(gfx::Size(1, 1), viz::RGBA_8888, test_data); EXPECT_EQ(0, memcmp(data, test_data, sizeof(data))); context()->produceTextureDirectCHROMIUM(other_texture, GL_TEXTURE_2D, @@ -2407,7 +2406,7 @@ TEST_P(ResourceProviderTest, LostResourceInParent) { gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; ResourceId resource = child_resource_provider_->CreateResource( size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format, gfx::ColorSpace()); @@ -2463,7 +2462,7 @@ TEST_P(ResourceProviderTest, LostResourceInGrandParent) { gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; ResourceId resource = child_resource_provider_->CreateResource( size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format, gfx::ColorSpace()); @@ -2761,7 +2760,7 @@ CreateResourceSettings())); gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; int texture_id = 1; ResourceId id = resource_provider->CreateResource( @@ -2840,7 +2839,7 @@ CreateResourceSettings())); gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; int texture_id = 1; // Check that the texture gets created with the right sampler settings. @@ -2883,7 +2882,7 @@ CreateResourceSettings())); gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; for (int texture_id = 1; texture_id <= 2; ++texture_id) { // Check that the texture gets created with the right sampler settings. @@ -2927,7 +2926,7 @@ CreateResourceSettings())); gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; const ResourceProvider::TextureHint hints[4] = { ResourceProvider::TEXTURE_HINT_DEFAULT, @@ -3464,7 +3463,7 @@ gfx::Size size(2, 2); gfx::Vector2d offset(0, 0); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; ResourceId id = 0; uint8_t pixels[16] = { 0 }; int texture_id = 123; @@ -3521,7 +3520,8 @@ gfx::Size size(2, 2); - const ResourceFormat formats[3] = {RGBA_8888, BGRA_8888, RGBA_F16}; + const viz::ResourceFormat formats[3] = {viz::RGBA_8888, viz::BGRA_8888, + viz::RGBA_F16}; const ResourceProvider::TextureHint hints[4] = { ResourceProvider::TEXTURE_HINT_DEFAULT, ResourceProvider::TEXTURE_HINT_IMMUTABLE, @@ -3539,7 +3539,7 @@ bool is_immutable_hint = hints[texture_id - 1] & ResourceProvider::TEXTURE_HINT_IMMUTABLE; bool support_immutable_texture = - is_immutable_hint && formats[i] != BGRA_8888; + is_immutable_hint && formats[i] != viz::BGRA_8888; EXPECT_CALL(*context, texStorage2DEXT(_, _, _, 2, 2)) .Times(support_immutable_texture ? 1 : 0); EXPECT_CALL(*context, texImage2D(_, _, _, 2, 2, _, _, _, _)) @@ -3575,7 +3575,7 @@ CreateResourceSettings())); gfx::Size size(2, 2); - const ResourceFormat formats[2] = {RGBA_8888, BGRA_8888}; + const viz::ResourceFormat formats[2] = {viz::RGBA_8888, viz::BGRA_8888}; const ResourceProvider::TextureHint hints[4] = { ResourceProvider::TEXTURE_HINT_DEFAULT, @@ -3620,7 +3620,7 @@ const int kWidth = 2; const int kHeight = 2; gfx::Size size(kWidth, kHeight); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; ResourceId id = 0; const unsigned kTextureId = 123u; const unsigned kImageId = 234u; @@ -3712,7 +3712,8 @@ int texture_id = 123; ResourceId id = resource_provider->CreateResource( - size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, ETC1, gfx::ColorSpace()); + size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::ETC1, + gfx::ColorSpace()); EXPECT_NE(0u, id); EXPECT_CALL(*context, NextTextureId()).WillOnce(Return(texture_id)); EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(2); @@ -3744,7 +3745,8 @@ uint8_t pixels[8]; ResourceId id = resource_provider->CreateResource( - size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, ETC1, gfx::ColorSpace()); + size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::ETC1, + gfx::ColorSpace()); EXPECT_NE(0u, id); EXPECT_CALL(*context, NextTextureId()).WillOnce(Return(texture_id)); EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(3); @@ -3785,7 +3787,7 @@ auto shared_bitmap_manager = base::MakeUnique<TestSharedBitmapManager>(); gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; { size_t kTextureAllocationChunkSize = 1; @@ -3829,7 +3831,7 @@ return; gfx::Size size(1, 1); - ResourceFormat format = RGBA_8888; + viz::ResourceFormat format = viz::RGBA_8888; // ~Random set of |release_count|s to set on sync tokens. uint64_t release_counts[5] = {7, 3, 10, 2, 5};
diff --git a/cc/resources/resource_util.h b/cc/resources/resource_util.h index 99fd2dc0..161b1aa 100644 --- a/cc/resources/resource_util.h +++ b/cc/resources/resource_util.h
@@ -13,7 +13,8 @@ #include "base/numerics/safe_math.h" #include "cc/base/math_util.h" #include "cc/cc_export.h" -#include "cc/resources/resource_format.h" +#include "components/viz/common/quads/resource_format.h" +#include "components/viz/common/resources/resource_format_utils.h" #include "ui/gfx/geometry/size.h" namespace cc { @@ -22,37 +23,40 @@ public: // Returns true if the width is valid and fits in bytes, false otherwise. template <typename T> - static bool VerifyWidthInBytes(int width, ResourceFormat format); + static bool VerifyWidthInBytes(int width, viz::ResourceFormat format); // Returns true if the size is valid and fits in bytes, false otherwise. template <typename T> - static bool VerifySizeInBytes(const gfx::Size& size, ResourceFormat format); + static bool VerifySizeInBytes(const gfx::Size& size, + viz::ResourceFormat format); // Dies with a CRASH() if the width can not be represented as a positive // number of bytes. template <typename T> - static T CheckedWidthInBytes(int width, ResourceFormat format); + static T CheckedWidthInBytes(int width, viz::ResourceFormat format); // Dies with a CRASH() if the size can not be represented as a positive // number of bytes. template <typename T> - static T CheckedSizeInBytes(const gfx::Size& size, ResourceFormat format); + static T CheckedSizeInBytes(const gfx::Size& size, + viz::ResourceFormat format); // Returns the width in bytes but may overflow or return 0. Only do this for // computing widths for sizes that have already been checked. template <typename T> - static T UncheckedWidthInBytes(int width, ResourceFormat format); + static T UncheckedWidthInBytes(int width, viz::ResourceFormat format); // Returns the size in bytes but may overflow or return 0. Only do this for // sizes that have already been checked. template <typename T> - static T UncheckedSizeInBytes(const gfx::Size& size, ResourceFormat format); + static T UncheckedSizeInBytes(const gfx::Size& size, + viz::ResourceFormat format); // Returns the width in bytes aligned but may overflow or return 0. Only do // this for computing widths for sizes that have already been checked. template <typename T> - static T UncheckedWidthInBytesAligned(int width, ResourceFormat format); + static T UncheckedWidthInBytesAligned(int width, viz::ResourceFormat format); // Returns the size in bytes aligned but may overflow or return 0. Only do // this for sizes that have already been checked. template <typename T> static T UncheckedSizeInBytesAligned(const gfx::Size& size, - ResourceFormat format); + viz::ResourceFormat format); private: template <typename T> @@ -61,14 +65,14 @@ template <typename T> static bool VerifyFitsInBytesInternal(int width, int height, - ResourceFormat format, + viz::ResourceFormat format, bool verify_size, bool aligned); template <typename T> static T BytesInternal(int width, int height, - ResourceFormat format, + viz::ResourceFormat format, bool verify_size, bool aligned); @@ -76,21 +80,21 @@ }; template <typename T> -bool ResourceUtil::VerifyWidthInBytes(int width, ResourceFormat format) { +bool ResourceUtil::VerifyWidthInBytes(int width, viz::ResourceFormat format) { VerifyType<T>(); return VerifyFitsInBytesInternal<T>(width, 0, format, false, false); } template <typename T> bool ResourceUtil::VerifySizeInBytes(const gfx::Size& size, - ResourceFormat format) { + viz::ResourceFormat format) { VerifyType<T>(); return VerifyFitsInBytesInternal<T>(size.width(), size.height(), format, true, false); } template <typename T> -T ResourceUtil::CheckedWidthInBytes(int width, ResourceFormat format) { +T ResourceUtil::CheckedWidthInBytes(int width, viz::ResourceFormat format) { VerifyType<T>(); DCHECK(VerifyFitsInBytesInternal<T>(width, 0, format, false, false)); base::CheckedNumeric<T> checked_value = BitsPerPixel(format); @@ -102,7 +106,7 @@ template <typename T> T ResourceUtil::CheckedSizeInBytes(const gfx::Size& size, - ResourceFormat format) { + viz::ResourceFormat format) { VerifyType<T>(); DCHECK(VerifyFitsInBytesInternal<T>(size.width(), size.height(), format, true, false)); @@ -115,7 +119,7 @@ } template <typename T> -T ResourceUtil::UncheckedWidthInBytes(int width, ResourceFormat format) { +T ResourceUtil::UncheckedWidthInBytes(int width, viz::ResourceFormat format) { VerifyType<T>(); DCHECK(VerifyFitsInBytesInternal<T>(width, 0, format, false, false)); return BytesInternal<T>(width, 0, format, false, false); @@ -123,7 +127,7 @@ template <typename T> T ResourceUtil::UncheckedSizeInBytes(const gfx::Size& size, - ResourceFormat format) { + viz::ResourceFormat format) { VerifyType<T>(); DCHECK(VerifyFitsInBytesInternal<T>(size.width(), size.height(), format, true, false)); @@ -131,7 +135,8 @@ } template <typename T> -T ResourceUtil::UncheckedWidthInBytesAligned(int width, ResourceFormat format) { +T ResourceUtil::UncheckedWidthInBytesAligned(int width, + viz::ResourceFormat format) { VerifyType<T>(); DCHECK(VerifyFitsInBytesInternal<T>(width, 0, format, false, true)); return BytesInternal<T>(width, 0, format, false, true); @@ -139,7 +144,7 @@ template <typename T> T ResourceUtil::UncheckedSizeInBytesAligned(const gfx::Size& size, - ResourceFormat format) { + viz::ResourceFormat format) { VerifyType<T>(); DCHECK(VerifyFitsInBytesInternal<T>(size.width(), size.height(), format, true, true)); @@ -156,7 +161,7 @@ template <typename T> bool ResourceUtil::VerifyFitsInBytesInternal(int width, int height, - ResourceFormat format, + viz::ResourceFormat format, bool verify_size, bool aligned) { base::CheckedNumeric<T> checked_value = BitsPerPixel(format); @@ -193,7 +198,7 @@ template <typename T> T ResourceUtil::BytesInternal(int width, int height, - ResourceFormat format, + viz::ResourceFormat format, bool verify_size, bool aligned) { T bytes = BitsPerPixel(format);
diff --git a/cc/resources/resource_util_unittest.cc b/cc/resources/resource_util_unittest.cc index b159d1d..8bffa6b 100644 --- a/cc/resources/resource_util_unittest.cc +++ b/cc/resources/resource_util_unittest.cc
@@ -12,7 +12,7 @@ namespace { struct TestFormat { - ResourceFormat format; + viz::ResourceFormat format; size_t expected_bytes; size_t expected_bytes_aligned; }; @@ -94,10 +94,10 @@ // Check bytes for even width. int width = 10; TestFormat test_formats[] = { - {RGBA_8888, 40, 40}, // for 32 bits - {RGBA_4444, 20, 20}, // for 16 bits - {ALPHA_8, 10, 12}, // for 8 bits - {ETC1, 5, 8} // for 4 bits + {viz::RGBA_8888, 40, 40}, // for 32 bits + {viz::RGBA_4444, 20, 20}, // for 16 bits + {viz::ALPHA_8, 10, 12}, // for 8 bits + {viz::ETC1, 5, 8} // for 4 bits }; TestVerifyWidthInBytes(width, test_formats); @@ -108,10 +108,10 @@ // Check bytes for odd width. int width_odd = 11; TestFormat test_formats_odd[] = { - {RGBA_8888, 44, 44}, // for 32 bits - {RGBA_4444, 22, 24}, // for 16 bits - {ALPHA_8, 11, 12}, // for 8 bits - {ETC1, 6, 8} // for 4 bits + {viz::RGBA_8888, 44, 44}, // for 32 bits + {viz::RGBA_4444, 22, 24}, // for 16 bits + {viz::ALPHA_8, 11, 12}, // for 8 bits + {viz::ETC1, 6, 8} // for 4 bits }; TestVerifyWidthInBytes(width_odd, test_formats_odd); @@ -124,10 +124,10 @@ // Check bytes for even size. gfx::Size size(10, 10); TestFormat test_formats[] = { - {RGBA_8888, 400, 400}, // for 32 bits - {RGBA_4444, 200, 200}, // for 16 bits - {ALPHA_8, 100, 120}, // for 8 bits - {ETC1, 50, 80} // for 4 bits + {viz::RGBA_8888, 400, 400}, // for 32 bits + {viz::RGBA_4444, 200, 200}, // for 16 bits + {viz::ALPHA_8, 100, 120}, // for 8 bits + {viz::ETC1, 50, 80} // for 4 bits }; TestVerifySizeInBytes(size, test_formats); @@ -138,10 +138,10 @@ // Check bytes for odd size. gfx::Size size_odd(11, 11); TestFormat test_formats_odd[] = { - {RGBA_8888, 484, 484}, // for 32 bits - {RGBA_4444, 242, 264}, // for 16 bits - {ALPHA_8, 121, 132}, // for 8 bits - {ETC1, 66, 88} // for 4 bits + {viz::RGBA_8888, 484, 484}, // for 32 bits + {viz::RGBA_4444, 242, 264}, // for 16 bits + {viz::ALPHA_8, 121, 132}, // for 8 bits + {viz::ETC1, 66, 88} // for 4 bits }; TestVerifySizeInBytes(size_odd, test_formats_odd); @@ -153,16 +153,18 @@ TEST_F(ResourceUtilTest, WidthInBytesOverflow) { int width = 10; // 10 * 16 = 160 bits, overflows in char, but fits in unsigned char. - EXPECT_FALSE(ResourceUtil::VerifyWidthInBytes<signed char>(width, RGBA_4444)); + EXPECT_FALSE( + ResourceUtil::VerifyWidthInBytes<signed char>(width, viz::RGBA_4444)); EXPECT_TRUE( - ResourceUtil::VerifyWidthInBytes<unsigned char>(width, RGBA_4444)); + ResourceUtil::VerifyWidthInBytes<unsigned char>(width, viz::RGBA_4444)); } TEST_F(ResourceUtilTest, SizeInBytesOverflow) { gfx::Size size(10, 10); // 10 * 16 * 10 = 1600 bits, overflows in char, but fits in int. - EXPECT_FALSE(ResourceUtil::VerifySizeInBytes<signed char>(size, RGBA_4444)); - EXPECT_TRUE(ResourceUtil::VerifySizeInBytes<int>(size, RGBA_4444)); + EXPECT_FALSE( + ResourceUtil::VerifySizeInBytes<signed char>(size, viz::RGBA_4444)); + EXPECT_TRUE(ResourceUtil::VerifySizeInBytes<int>(size, viz::RGBA_4444)); } } // namespace
diff --git a/cc/resources/scoped_resource.cc b/cc/resources/scoped_resource.cc index d65150d..75fa38f7 100644 --- a/cc/resources/scoped_resource.cc +++ b/cc/resources/scoped_resource.cc
@@ -17,7 +17,7 @@ void ScopedResource::Allocate(const gfx::Size& size, ResourceProvider::TextureHint hint, - ResourceFormat format, + viz::ResourceFormat format, const gfx::ColorSpace& color_space) { DCHECK(!id()); DCHECK(!size.IsEmpty()); @@ -33,7 +33,7 @@ void ScopedResource::AllocateWithGpuMemoryBuffer( const gfx::Size& size, - ResourceFormat format, + viz::ResourceFormat format, gfx::BufferUsage usage, const gfx::ColorSpace& color_space) { DCHECK(!id());
diff --git a/cc/resources/scoped_resource.h b/cc/resources/scoped_resource.h index 5fda730a..1e0b0eb 100644 --- a/cc/resources/scoped_resource.h +++ b/cc/resources/scoped_resource.h
@@ -26,10 +26,10 @@ void Allocate(const gfx::Size& size, ResourceProvider::TextureHint hint, - ResourceFormat format, + viz::ResourceFormat format, const gfx::ColorSpace& color_space); void AllocateWithGpuMemoryBuffer(const gfx::Size& size, - ResourceFormat format, + viz::ResourceFormat format, gfx::BufferUsage usage, const gfx::ColorSpace& color_space); void Free();
diff --git a/cc/resources/scoped_resource_unittest.cc b/cc/resources/scoped_resource_unittest.cc index b3f71341..cbfbe68 100644 --- a/cc/resources/scoped_resource_unittest.cc +++ b/cc/resources/scoped_resource_unittest.cc
@@ -47,7 +47,7 @@ shared_bitmap_manager.get()); auto texture = base::MakeUnique<ScopedResource>(resource_provider.get()); texture->Allocate(gfx::Size(30, 30), ResourceProvider::TEXTURE_HINT_IMMUTABLE, - RGBA_8888, gfx::ColorSpace()); + viz::RGBA_8888, gfx::ColorSpace()); // The texture has an allocated byte-size now. size_t expected_bytes = 30 * 30 * 4; @@ -55,7 +55,7 @@ texture->size(), texture->format())); EXPECT_LT(0u, texture->id()); - EXPECT_EQ(static_cast<unsigned>(RGBA_8888), texture->format()); + EXPECT_EQ(static_cast<unsigned>(viz::RGBA_8888), texture->format()); EXPECT_EQ(gfx::Size(30, 30), texture->size()); } @@ -74,7 +74,7 @@ EXPECT_EQ(0u, resource_provider->num_resources()); texture->Allocate(gfx::Size(30, 30), - ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, + ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888, gfx::ColorSpace()); EXPECT_LT(0u, texture->id()); EXPECT_EQ(1u, resource_provider->num_resources()); @@ -85,7 +85,7 @@ auto texture = base::MakeUnique<ScopedResource>(resource_provider.get()); EXPECT_EQ(0u, resource_provider->num_resources()); texture->Allocate(gfx::Size(30, 30), - ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, + ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888, gfx::ColorSpace()); EXPECT_LT(0u, texture->id()); EXPECT_EQ(1u, resource_provider->num_resources());
diff --git a/cc/resources/transferable_resource.cc b/cc/resources/transferable_resource.cc index bfe5652b..d64a0670 100644 --- a/cc/resources/transferable_resource.cc +++ b/cc/resources/transferable_resource.cc
@@ -9,7 +9,7 @@ TransferableResource::TransferableResource() : id(0), - format(RGBA_8888), + format(viz::RGBA_8888), buffer_format(gfx::BufferFormat::RGBA_8888), filter(0), read_lock_fences_enabled(false),
diff --git a/cc/resources/transferable_resource.h b/cc/resources/transferable_resource.h index 9be21514..a4e497c 100644 --- a/cc/resources/transferable_resource.h +++ b/cc/resources/transferable_resource.h
@@ -11,7 +11,7 @@ #include "cc/base/resource_id.h" #include "cc/cc_export.h" -#include "cc/resources/resource_format.h" +#include "components/viz/common/quads/resource_format.h" #include "gpu/command_buffer/common/mailbox_holder.h" #include "ui/gfx/buffer_types.h" #include "ui/gfx/color_space.h" @@ -31,7 +31,7 @@ ResourceId id; // Refer to ResourceProvider::Resource for the meaning of the following data. - ResourceFormat format; + viz::ResourceFormat format; gfx::BufferFormat buffer_format; uint32_t filter; gfx::Size size;
diff --git a/cc/resources/video_resource_updater.cc b/cc/resources/video_resource_updater.cc index 32ac2c6..d167201 100644 --- a/cc/resources/video_resource_updater.cc +++ b/cc/resources/video_resource_updater.cc
@@ -32,7 +32,7 @@ namespace { -const ResourceFormat kRGBResourceFormat = RGBA_8888; +const viz::ResourceFormat kRGBResourceFormat = viz::RGBA_8888; VideoFrameExternalResources::ResourceType ResourceTypeForVideoFrame( media::VideoFrame* video_frame, @@ -144,7 +144,7 @@ VideoResourceUpdater::PlaneResource::PlaneResource( unsigned int resource_id, const gfx::Size& resource_size, - ResourceFormat resource_format, + viz::ResourceFormat resource_format, gpu::Mailbox mailbox) : resource_id_(resource_id), resource_size_(resource_size), @@ -196,7 +196,7 @@ VideoResourceUpdater::ResourceList::iterator VideoResourceUpdater::RecycleOrAllocateResource( const gfx::Size& resource_size, - ResourceFormat resource_format, + viz::ResourceFormat resource_format, const gfx::ColorSpace& color_space, bool software_resource, bool immutable_hint, @@ -245,7 +245,7 @@ VideoResourceUpdater::ResourceList::iterator VideoResourceUpdater::AllocateResource(const gfx::Size& plane_size, - ResourceFormat format, + viz::ResourceFormat format, const gfx::ColorSpace& color_space, bool has_mailbox, bool immutable_hint) { @@ -323,12 +323,12 @@ const bool software_compositor = context_provider_ == NULL; - ResourceFormat output_resource_format; + viz::ResourceFormat output_resource_format; gfx::ColorSpace output_color_space = video_frame->ColorSpace(); if (input_frame_format == media::PIXEL_FORMAT_Y16) { // Unable to display directly as yuv planes so convert it to RGBA for // compositing. - output_resource_format = RGBA_8888; + output_resource_format = viz::RGBA_8888; output_color_space = output_color_space.GetAsFullRangeRGB(); } else { // Can be composited directly from yuv planes. @@ -337,12 +337,12 @@ } // If GPU compositing is enabled, but the output resource format - // returned by the resource provider is RGBA_8888, then a GPU driver + // returned by the resource provider is viz::RGBA_8888, then a GPU driver // bug workaround requires that YUV frames must be converted to RGB // before texture upload. bool texture_needs_rgb_conversion = !software_compositor && - output_resource_format == ResourceFormat::RGBA_8888; + output_resource_format == viz::ResourceFormat::RGBA_8888; size_t output_plane_count = media::VideoFrame::NumPlanes(input_frame_format); // TODO(skaslev): If we're in software compositing mode, we do the YUV -> RGB @@ -411,7 +411,7 @@ video_renderer_->Copy(video_frame, &canvas, media::Context3D()); } else { size_t bytes_per_row = ResourceUtil::CheckedWidthInBytes<size_t>( - video_frame->coded_size().width(), ResourceFormat::RGBA_8888); + video_frame->coded_size().width(), viz::ResourceFormat::RGBA_8888); size_t needed_size = bytes_per_row * video_frame->coded_size().height(); if (upload_pixels_.size() < needed_size) upload_pixels_.resize(needed_size); @@ -454,7 +454,7 @@ std::unique_ptr<media::HalfFloatMaker> half_float_maker; if (resource_provider_->YuvResourceFormat(bits_per_channel) == - LUMINANCE_F16) { + viz::LUMINANCE_F16) { half_float_maker = media::HalfFloatMaker::NewHalfFloatMaker(bits_per_channel); external_resources.offset = half_float_maker->Offset(); @@ -489,12 +489,13 @@ bool needs_conversion = false; int shift = 0; - // LUMINANCE_F16 uses half-floats, so we always need a conversion step. - if (plane_resource.resource_format() == LUMINANCE_F16) { + // viz::LUMINANCE_F16 uses half-floats, so we always need a conversion + // step. + if (plane_resource.resource_format() == viz::LUMINANCE_F16) { needs_conversion = true; } else if (bits_per_channel > 8) { - // If bits_per_channel > 8 and we can't use LUMINANCE_F16, we need to - // shift the data down and create an 8-bit texture. + // If bits_per_channel > 8 and we can't use viz::LUMINANCE_F16, we need + // to shift the data down and create an 8-bit texture. needs_conversion = true; shift = bits_per_channel - 8; } @@ -510,7 +511,7 @@ upload_pixels_.resize(needed_size); for (int row = 0; row < resource_size_pixels.height(); ++row) { - if (plane_resource.resource_format() == LUMINANCE_F16) { + if (plane_resource.resource_format() == viz::LUMINANCE_F16) { uint16_t* dst = reinterpret_cast<uint16_t*>( &upload_pixels_[upload_image_stride * row]); const uint16_t* src = reinterpret_cast<uint16_t*>( @@ -596,7 +597,7 @@ const gfx::Size output_plane_resource_size = video_frame->coded_size(); // The copy needs to be a direct transfer of pixel data, so we use an RGBA8 // target to avoid loss of precision or dropping any alpha component. - const ResourceFormat copy_target_format = ResourceFormat::RGBA_8888; + const viz::ResourceFormat copy_target_format = viz::ResourceFormat::RGBA_8888; const bool is_immutable = false; const int no_unique_id = 0;
diff --git a/cc/resources/video_resource_updater.h b/cc/resources/video_resource_updater.h index 576e300..eab4122 100644 --- a/cc/resources/video_resource_updater.h +++ b/cc/resources/video_resource_updater.h
@@ -18,8 +18,8 @@ #include "base/time/time.h" #include "cc/cc_export.h" #include "cc/resources/release_callback_impl.h" -#include "cc/resources/resource_format.h" #include "cc/resources/texture_mailbox.h" +#include "components/viz/common/quads/resource_format.h" #include "ui/gfx/geometry/size.h" namespace media { @@ -85,7 +85,7 @@ public: PlaneResource(unsigned resource_id, const gfx::Size& resource_size, - ResourceFormat resource_format, + viz::ResourceFormat resource_format, gpu::Mailbox mailbox); PlaneResource(const PlaneResource& other); @@ -100,7 +100,7 @@ // Accessors for resource identifiers provided at construction time. unsigned resource_id() const { return resource_id_; } const gfx::Size& resource_size() const { return resource_size_; } - ResourceFormat resource_format() const { return resource_format_; } + viz::ResourceFormat resource_format() const { return resource_format_; } const gpu::Mailbox& mailbox() const { return mailbox_; } // Various methods for managing references. See |ref_count_| for details. @@ -123,7 +123,7 @@ const unsigned resource_id_; const gfx::Size resource_size_; - const ResourceFormat resource_format_; + const viz::ResourceFormat resource_format_; const gpu::Mailbox mailbox_; }; @@ -141,14 +141,14 @@ // resources. ResourceList::iterator RecycleOrAllocateResource( const gfx::Size& resource_size, - ResourceFormat resource_format, + viz::ResourceFormat resource_format, const gfx::ColorSpace& color_space, bool software_resource, bool immutable_hint, int unique_id, int plane_index); ResourceList::iterator AllocateResource(const gfx::Size& plane_size, - ResourceFormat format, + viz::ResourceFormat format, const gfx::ColorSpace& color_space, bool has_mailbox, bool immutable_hint);
diff --git a/cc/surfaces/frame_sink_manager.cc b/cc/surfaces/frame_sink_manager.cc index 5265448..079135c 100644 --- a/cc/surfaces/frame_sink_manager.cc +++ b/cc/surfaces/frame_sink_manager.cc
@@ -67,8 +67,6 @@ if (source_iter != frame_sink_source_map_.end()) { if (source_iter->second.source) client_iter->second->SetBeginFrameSource(nullptr); - if (!source_iter->second.has_children()) - frame_sink_source_map_.erase(source_iter); } clients_.erase(client_iter); }
diff --git a/cc/surfaces/frame_sink_manager_unittest.cc b/cc/surfaces/frame_sink_manager_unittest.cc index 8cd721f4..ea5c852 100644 --- a/cc/surfaces/frame_sink_manager_unittest.cc +++ b/cc/surfaces/frame_sink_manager_unittest.cc
@@ -13,6 +13,11 @@ namespace cc { +namespace { + +constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); +} + class FakeFrameSinkManagerClient : public FrameSinkManagerClient { public: explicit FakeFrameSinkManagerClient(const FrameSinkId& frame_sink_id) @@ -115,6 +120,28 @@ EXPECT_EQ(nullptr, client.source()); } +// This test verifies that a client is still connected to the BeginFrameSource +// after restart. +TEST_F(FrameSinkManagerTest, ClientRestart) { + FakeFrameSinkManagerClient client(kArbitraryFrameSinkId); + StubBeginFrameSource source; + client.Register(&manager_); + + manager_.RegisterBeginFrameSource(&source, kArbitraryFrameSinkId); + EXPECT_EQ(&source, client.source()); + + // |client| is disconnect from |source| after Unregister. + client.Unregister(); + EXPECT_EQ(nullptr, client.source()); + + // |client| is reconnected with |source| after re-Register. + client.Register(&manager_); + EXPECT_EQ(&source, client.source()); + + manager_.UnregisterBeginFrameSource(&source); + EXPECT_EQ(nullptr, client.source()); +} + // This test verifies that a PrimaryBeginFrameSource will receive BeginFrames // from the first BeginFrameSource registered. If that BeginFrameSource goes // away then it will receive BeginFrames from the second BeginFrameSource.
diff --git a/cc/surfaces/surface_synchronization_unittest.cc b/cc/surfaces/surface_synchronization_unittest.cc index dd7ee7d..12414a1 100644 --- a/cc/surfaces/surface_synchronization_unittest.cc +++ b/cc/surfaces/surface_synchronization_unittest.cc
@@ -559,7 +559,7 @@ // its resource list. TransferableResource resource; resource.id = 1337; - resource.format = ALPHA_8; + resource.format = viz::ALPHA_8; resource.filter = 1234; resource.size = gfx::Size(1234, 5678); std::vector<TransferableResource> resource_list = {resource}; @@ -1337,7 +1337,7 @@ // for display. TransferableResource resource; resource.id = 1337; - resource.format = ALPHA_8; + resource.format = viz::ALPHA_8; resource.filter = 1234; resource.size = gfx::Size(1234, 5678); std::vector<ReturnedResource> returned_resources = @@ -1367,7 +1367,7 @@ // closed. TransferableResource resource2; resource2.id = 1246; - resource2.format = ALPHA_8; + resource2.format = viz::ALPHA_8; resource2.filter = 1357; resource2.size = gfx::Size(8765, 4321); std::vector<ReturnedResource> returned_resources2 =
diff --git a/cc/test/fake_raster_buffer_provider.cc b/cc/test/fake_raster_buffer_provider.cc index 9f766913..ccc4142f 100644 --- a/cc/test/fake_raster_buffer_provider.cc +++ b/cc/test/fake_raster_buffer_provider.cc
@@ -25,9 +25,9 @@ void FakeRasterBufferProviderImpl::Flush() {} -ResourceFormat FakeRasterBufferProviderImpl::GetResourceFormat( +viz::ResourceFormat FakeRasterBufferProviderImpl::GetResourceFormat( bool must_support_alpha) const { - return ResourceFormat::RGBA_8888; + return viz::ResourceFormat::RGBA_8888; } bool FakeRasterBufferProviderImpl::IsResourceSwizzleRequired(
diff --git a/cc/test/fake_raster_buffer_provider.h b/cc/test/fake_raster_buffer_provider.h index 29f8653b..7bf988f 100644 --- a/cc/test/fake_raster_buffer_provider.h +++ b/cc/test/fake_raster_buffer_provider.h
@@ -23,7 +23,7 @@ void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) override; void OrderingBarrier() override; void Flush() override; - ResourceFormat GetResourceFormat(bool must_support_alpha) const override; + viz::ResourceFormat GetResourceFormat(bool must_support_alpha) const override; bool IsResourceSwizzleRequired(bool must_support_alpha) const override; bool CanPartialRasterIntoProvidedResource() const override; bool IsResourceReadyToDraw(ResourceId id) const override;
diff --git a/cc/test/fake_tile_manager.cc b/cc/test/fake_tile_manager.cc index e7b1bea..48623ae6 100644 --- a/cc/test/fake_tile_manager.cc +++ b/cc/test/fake_tile_manager.cc
@@ -42,7 +42,7 @@ std::numeric_limits<size_t>::max(), TileManagerSettings()), image_decode_cache_( - ResourceFormat::RGBA_8888, + viz::ResourceFormat::RGBA_8888, LayerTreeSettings().decoded_image_working_set_budget_bytes) { SetDecodedImageTracker(&decoded_image_tracker_); SetResources(resource_pool, &image_decode_cache_, GetGlobalTaskGraphRunner(),
diff --git a/cc/test/fake_ui_resource_layer_tree_host_impl.cc b/cc/test/fake_ui_resource_layer_tree_host_impl.cc index 6530706a..6e0a29d9 100644 --- a/cc/test/fake_ui_resource_layer_tree_host_impl.cc +++ b/cc/test/fake_ui_resource_layer_tree_host_impl.cc
@@ -24,8 +24,8 @@ UIResourceData data; data.resource_id = resource_provider()->CreateResource( - bitmap.GetSize(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, - gfx::ColorSpace()); + bitmap.GetSize(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, + viz::RGBA_8888, gfx::ColorSpace()); data.opaque = bitmap.GetOpaque(); fake_ui_resource_map_[uid] = data;
diff --git a/cc/test/layer_tree_pixel_resource_test.cc b/cc/test/layer_tree_pixel_resource_test.cc index 1dd5db0e..0088515 100644 --- a/cc/test/layer_tree_pixel_resource_test.cc +++ b/cc/test/layer_tree_pixel_resource_test.cc
@@ -156,7 +156,7 @@ *raster_buffer_provider = base::MakeUnique<GpuRasterBufferProvider>( compositor_context_provider, worker_context_provider, - resource_provider, false, 0, PlatformColor::BestTextureFormat(), + resource_provider, false, 0, viz::PlatformColor::BestTextureFormat(), false); break; case RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY: @@ -164,7 +164,7 @@ EXPECT_EQ(PIXEL_TEST_GL, test_type_); *raster_buffer_provider = ZeroCopyRasterBufferProvider::Create( - resource_provider, PlatformColor::BestTextureFormat()); + resource_provider, viz::PlatformColor::BestTextureFormat()); break; case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY: EXPECT_TRUE(compositor_context_provider); @@ -174,8 +174,8 @@ *raster_buffer_provider = base::MakeUnique<OneCopyRasterBufferProvider>( task_runner, compositor_context_provider, worker_context_provider, resource_provider, max_bytes_per_copy_operation, false, - max_staging_buffer_usage_in_bytes, PlatformColor::BestTextureFormat(), - false); + max_staging_buffer_usage_in_bytes, + viz::PlatformColor::BestTextureFormat(), false); break; } }
diff --git a/cc/test/test_in_process_context_provider.cc b/cc/test/test_in_process_context_provider.cc index 5047dc4..f70d68c 100644 --- a/cc/test/test_in_process_context_provider.cc +++ b/cc/test/test_in_process_context_provider.cc
@@ -11,7 +11,7 @@ #include "base/memory/ptr_util.h" #include "base/threading/thread_task_runner_handle.h" #include "cc/output/context_cache_controller.h" -#include "cc/resources/platform_color.h" +#include "components/viz/common/resources/platform_color.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/gles2_implementation.h" #include "gpu/command_buffer/client/gles2_lib.h" @@ -110,11 +110,11 @@ gpu::Capabilities capabilities; capabilities.texture_rectangle = true; capabilities.sync_query = true; - switch (PlatformColor::Format()) { - case PlatformColor::SOURCE_FORMAT_RGBA8: + switch (viz::PlatformColor::Format()) { + case viz::PlatformColor::SOURCE_FORMAT_RGBA8: capabilities.texture_format_bgra8888 = false; break; - case PlatformColor::SOURCE_FORMAT_BGRA8: + case viz::PlatformColor::SOURCE_FORMAT_BGRA8: capabilities.texture_format_bgra8888 = true; break; }
diff --git a/cc/test/test_texture.cc b/cc/test/test_texture.cc index fea16fbd..662692a 100644 --- a/cc/test/test_texture.cc +++ b/cc/test/test_texture.cc
@@ -12,14 +12,14 @@ namespace cc { -size_t TextureSizeBytes(const gfx::Size& size, ResourceFormat format) { +size_t TextureSizeBytes(const gfx::Size& size, viz::ResourceFormat format) { unsigned int components_per_pixel = 4; unsigned int bytes_per_component = 1; return size.width() * size.height() * components_per_pixel * bytes_per_component; } -TestTexture::TestTexture() : format(RGBA_8888) { +TestTexture::TestTexture() : format(viz::RGBA_8888) { // Initialize default parameter values. params[GL_TEXTURE_MAG_FILTER] = GL_LINEAR; params[GL_TEXTURE_MIN_FILTER] = GL_NEAREST_MIPMAP_LINEAR; @@ -30,7 +30,8 @@ TestTexture::~TestTexture() {} -void TestTexture::Reallocate(const gfx::Size& size, ResourceFormat format) { +void TestTexture::Reallocate(const gfx::Size& size, + viz::ResourceFormat format) { this->size = size; this->format = format; this->data.reset(new uint8_t[TextureSizeBytes(size, format)]);
diff --git a/cc/test/test_texture.h b/cc/test/test_texture.h index ae819ec..2389a9d 100644 --- a/cc/test/test_texture.h +++ b/cc/test/test_texture.h
@@ -12,22 +12,22 @@ #include <unordered_map> #include "base/memory/ref_counted.h" -#include "cc/resources/resource_format.h" +#include "components/viz/common/quads/resource_format.h" #include "third_party/khronos/GLES2/gl2.h" #include "ui/gfx/geometry/size.h" namespace cc { -size_t TextureSizeBytes(const gfx::Size& size, ResourceFormat format); +size_t TextureSizeBytes(const gfx::Size& size, viz::ResourceFormat format); struct TestTexture : public base::RefCounted<TestTexture> { TestTexture(); - void Reallocate(const gfx::Size& size, ResourceFormat format); + void Reallocate(const gfx::Size& size, viz::ResourceFormat format); bool IsValidParameter(GLenum pname); gfx::Size size; - ResourceFormat format; + viz::ResourceFormat format; std::unique_ptr<uint8_t[]> data; using TextureParametersMap = std::unordered_map<GLenum, GLint>;
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc index a6b9228a..b1e7400 100644 --- a/cc/tiles/gpu_image_decode_cache.cc +++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -20,8 +20,8 @@ #include "cc/base/devtools_instrumentation.h" #include "cc/output/context_provider.h" #include "cc/raster/tile_task.h" -#include "cc/resources/resource_format_utils.h" #include "cc/tiles/mipmap_util.h" +#include "components/viz/common/resources/resource_format_utils.h" #include "gpu/command_buffer/client/context_support.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "gpu_image_decode_cache.h" @@ -393,7 +393,7 @@ } GpuImageDecodeCache::GpuImageDecodeCache(ContextProvider* context, - ResourceFormat decode_format, + viz::ResourceFormat decode_format, size_t max_working_set_bytes, size_t max_cache_bytes) : format_(decode_format), @@ -1180,7 +1180,7 @@ if (!draw_image.image()->getDeferredTextureImageData( *context_threadsafe_proxy_.get(), &image_data->upload_params, 1, backing_memory->data(), nullptr, - ResourceFormatToClosestSkColorType(format_))) { + viz::ResourceFormatToClosestSkColorType(format_))) { DLOG(ERROR) << "getDeferredTextureImageData failed despite params " << "having validated."; backing_memory->Unlock(); @@ -1282,7 +1282,7 @@ upload_scale_mip_level); size_t data_size = draw_image.image()->getDeferredTextureImageData( *context_threadsafe_proxy_.get(), ¶ms, 1, nullptr, nullptr, - ResourceFormatToClosestSkColorType(format_)); + viz::ResourceFormatToClosestSkColorType(format_)); if (data_size == 0) { // Can't upload image, too large or other failure. Try to use SW fallback. @@ -1310,7 +1310,7 @@ gfx::Size mip_size = CalculateSizeForMipLevel(draw_image, upload_scale_mip_level); return SkImageInfo::Make(mip_size.width(), mip_size.height(), - ResourceFormatToClosestSkColorType(format_), + viz::ResourceFormatToClosestSkColorType(format_), kPremul_SkAlphaType, draw_image.target_color_space().ToSkColorSpace()); }
diff --git a/cc/tiles/gpu_image_decode_cache.h b/cc/tiles/gpu_image_decode_cache.h index c2fc02e2..b290faf 100644 --- a/cc/tiles/gpu_image_decode_cache.h +++ b/cc/tiles/gpu_image_decode_cache.h
@@ -15,8 +15,8 @@ #include "base/synchronization/lock.h" #include "base/trace_event/memory_dump_provider.h" #include "cc/cc_export.h" -#include "cc/resources/resource_format.h" #include "cc/tiles/image_decode_cache.h" +#include "components/viz/common/quads/resource_format.h" #include "third_party/skia/include/core/SkRefCnt.h" namespace cc { @@ -102,7 +102,7 @@ enum class DecodeTaskType { PART_OF_UPLOAD_TASK, STAND_ALONE_DECODE_TASK }; explicit GpuImageDecodeCache(ContextProvider* context, - ResourceFormat decode_format, + viz::ResourceFormat decode_format, size_t max_working_set_bytes, size_t max_cache_bytes); ~GpuImageDecodeCache() override; @@ -347,7 +347,7 @@ ImageData* image_data); void DeletePendingImages(); - const ResourceFormat format_; + const viz::ResourceFormat format_; ContextProvider* context_; sk_sp<GrContextThreadSafeProxy> context_threadsafe_proxy_;
diff --git a/cc/tiles/gpu_image_decode_cache_unittest.cc b/cc/tiles/gpu_image_decode_cache_unittest.cc index 0257717..721f5b1 100644 --- a/cc/tiles/gpu_image_decode_cache_unittest.cc +++ b/cc/tiles/gpu_image_decode_cache_unittest.cc
@@ -28,7 +28,7 @@ class TestGpuImageDecodeCache : public GpuImageDecodeCache { public: explicit TestGpuImageDecodeCache(ContextProvider* context, - ResourceFormat format) + viz::ResourceFormat format) : GpuImageDecodeCache(context, format, kGpuMemoryLimitBytes, @@ -74,7 +74,7 @@ return matrix; } -using GpuImageDecodeCacheTest = ::testing::TestWithParam<ResourceFormat>; +using GpuImageDecodeCacheTest = ::testing::TestWithParam<viz::ResourceFormat>; TEST_P(GpuImageDecodeCacheTest, GetTaskForImageSameImage) { auto context_provider = TestContextProvider::Create(); @@ -1503,7 +1503,8 @@ // Setup - Image cache has a normal working set, but zero cache size. auto context_provider = TestContextProvider::Create(); context_provider->BindToCurrentThread(); - GpuImageDecodeCache cache(context_provider.get(), ResourceFormat::RGBA_8888, + GpuImageDecodeCache cache(context_provider.get(), + viz::ResourceFormat::RGBA_8888, kGpuMemoryLimitBytes, 0); bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; @@ -1560,7 +1561,8 @@ auto context_provider = TestContextProvider::Create(); context_provider->BindToCurrentThread(); - GpuImageDecodeCache cache(context_provider.get(), ResourceFormat::RGBA_8888, + GpuImageDecodeCache cache(context_provider.get(), + viz::ResourceFormat::RGBA_8888, kGpuMemoryLimitBytes, cache_size); bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; @@ -1813,8 +1815,8 @@ INSTANTIATE_TEST_CASE_P(GpuImageDecodeCacheTests, GpuImageDecodeCacheTest, - ::testing::Values(ResourceFormat::RGBA_8888, - ResourceFormat::RGBA_4444)); + ::testing::Values(viz::ResourceFormat::RGBA_8888, + viz::ResourceFormat::RGBA_4444)); } // namespace } // namespace cc
diff --git a/cc/tiles/software_image_decode_cache.cc b/cc/tiles/software_image_decode_cache.cc index 83b7026..2cbb8cc 100644 --- a/cc/tiles/software_image_decode_cache.cc +++ b/cc/tiles/software_image_decode_cache.cc
@@ -21,8 +21,8 @@ #include "base/trace_event/memory_dump_manager.h" #include "cc/base/devtools_instrumentation.h" #include "cc/raster/tile_task.h" -#include "cc/resources/resource_format_utils.h" #include "cc/tiles/mipmap_util.h" +#include "components/viz/common/resources/resource_format_utils.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkImage.h" #include "third_party/skia/include/core/SkPixmap.h" @@ -159,9 +159,9 @@ SkImageInfo CreateImageInfo(size_t width, size_t height, - ResourceFormat format) { + viz::ResourceFormat format) { return SkImageInfo::Make(width, height, - ResourceFormatToClosestSkColorType(format), + viz::ResourceFormatToClosestSkColorType(format), kPremul_SkAlphaType); } @@ -194,7 +194,7 @@ } // namespace SoftwareImageDecodeCache::SoftwareImageDecodeCache( - ResourceFormat format, + viz::ResourceFormat format, size_t locked_memory_limit_bytes) : decoded_images_(ImageMRUCache::NO_AUTO_EVICT), at_raster_decoded_images_(ImageMRUCache::NO_AUTO_EVICT), @@ -919,8 +919,9 @@ } // SoftwareImageDecodeCacheKey -ImageDecodeCacheKey ImageDecodeCacheKey::FromDrawImage(const DrawImage& image, - ResourceFormat format) { +ImageDecodeCacheKey ImageDecodeCacheKey::FromDrawImage( + const DrawImage& image, + viz::ResourceFormat format) { const SkSize& scale = image.scale(); // If the src_rect falls outside of the image, we need to clip it since // otherwise we might end up with uninitialized memory in the decode process. @@ -949,8 +950,9 @@ quality = kMedium_SkFilterQuality; } - // Skia doesn't scale an RGBA_4444 format, so always use the original decode. - if (format == RGBA_4444) + // Skia doesn't scale an viz::RGBA_4444 format, so always use the original + // decode. + if (format == viz::RGBA_4444) quality = std::min(quality, kLow_SkFilterQuality); // Drop from high to medium if the the matrix we applied wasn't decomposable,
diff --git a/cc/tiles/software_image_decode_cache.h b/cc/tiles/software_image_decode_cache.h index a81c5f6..78777894 100644 --- a/cc/tiles/software_image_decode_cache.h +++ b/cc/tiles/software_image_decode_cache.h
@@ -22,9 +22,9 @@ #include "base/trace_event/memory_dump_provider.h" #include "cc/cc_export.h" #include "cc/paint/draw_image.h" -#include "cc/resources/resource_format.h" #include "cc/tiles/decoded_draw_image.h" #include "cc/tiles/image_decode_cache.h" +#include "components/viz/common/quads/resource_format.h" #include "third_party/skia/include/core/SkRefCnt.h" #include "ui/gfx/geometry/rect.h" @@ -37,7 +37,7 @@ class CC_EXPORT ImageDecodeCacheKey { public: static ImageDecodeCacheKey FromDrawImage(const DrawImage& image, - ResourceFormat format); + viz::ResourceFormat format); ImageDecodeCacheKey(const ImageDecodeCacheKey& other); @@ -121,7 +121,7 @@ enum class DecodeTaskType { USE_IN_RASTER_TASKS, USE_OUT_OF_RASTER_TASKS }; - SoftwareImageDecodeCache(ResourceFormat format, + SoftwareImageDecodeCache(viz::ResourceFormat format, size_t locked_memory_limit_bytes); ~SoftwareImageDecodeCache() override; @@ -324,7 +324,7 @@ MemoryBudget locked_images_budget_; - ResourceFormat format_; + viz::ResourceFormat format_; size_t max_items_in_cache_; // Used to uniquely identify DecodedImages for memory traces.
diff --git a/cc/tiles/software_image_decode_cache_perftest.cc b/cc/tiles/software_image_decode_cache_perftest.cc index 3a4b93ff..fb9ed0df 100644 --- a/cc/tiles/software_image_decode_cache_perftest.cc +++ b/cc/tiles/software_image_decode_cache_perftest.cc
@@ -68,7 +68,7 @@ timer_.Reset(); do { for (auto& image : images) - ImageDecodeCacheKey::FromDrawImage(image, RGBA_8888); + ImageDecodeCacheKey::FromDrawImage(image, viz::RGBA_8888); timer_.NextLap(); } while (!timer_.HasTimeLimitExpired());
diff --git a/cc/tiles/software_image_decode_cache_unittest.cc b/cc/tiles/software_image_decode_cache_unittest.cc index 90aa66e4..9d3560e 100644 --- a/cc/tiles/software_image_decode_cache_unittest.cc +++ b/cc/tiles/software_image_decode_cache_unittest.cc
@@ -5,8 +5,8 @@ #include "cc/tiles/software_image_decode_cache.h" #include "cc/paint/draw_image.h" -#include "cc/resources/resource_format.h" #include "cc/test/test_tile_task_runner.h" +#include "components/viz/common/quads/resource_format.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkRefCnt.h" @@ -21,7 +21,7 @@ class TestSoftwareImageDecodeCache : public SoftwareImageDecodeCache { public: TestSoftwareImageDecodeCache() - : SoftwareImageDecodeCache(ResourceFormat::RGBA_8888, + : SoftwareImageDecodeCache(viz::ResourceFormat::RGBA_8888, kLockedMemoryLimitBytes) {} }; @@ -65,7 +65,7 @@ CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kNone_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -86,7 +86,7 @@ CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -104,7 +104,7 @@ CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_4444); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_4444); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -122,7 +122,7 @@ CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_4444); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_4444); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -140,7 +140,7 @@ CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -159,7 +159,7 @@ quality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(quality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -178,7 +178,7 @@ quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -197,7 +197,7 @@ quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -217,7 +217,7 @@ quality, CreateMatrix(SkSize::Make(1.001f, 1.001f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -237,7 +237,7 @@ quality, CreateMatrix(SkSize::Make(0.999f, 0.999f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -257,7 +257,7 @@ quality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -276,7 +276,7 @@ quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(500, key.target_size().width()); @@ -295,7 +295,7 @@ quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(500, key.target_size().width()); @@ -314,7 +314,7 @@ quality, CreateMatrix(SkSize::Make(0.75f, 0.75f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(quality, key.filter_quality()); EXPECT_EQ(500, key.target_size().width()); @@ -333,7 +333,7 @@ quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(quality, key.filter_quality()); EXPECT_EQ(250, key.target_size().width()); @@ -352,7 +352,7 @@ quality, CreateMatrix(SkSize::Make(0.49f, 0.49f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(quality, key.filter_quality()); EXPECT_EQ(250, key.target_size().width()); @@ -371,7 +371,7 @@ quality, CreateMatrix(SkSize::Make(0.1f, 0.1f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(quality, key.filter_quality()); EXPECT_EQ(62, key.target_size().width()); @@ -390,7 +390,7 @@ quality, CreateMatrix(SkSize::Make(0.01f, 0.01f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(quality, key.filter_quality()); EXPECT_EQ(7, key.target_size().width()); @@ -410,7 +410,7 @@ quality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -430,7 +430,7 @@ quality, CreateMatrix(SkSize::Make(0.5f, 0.2f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality()); EXPECT_EQ(50, key.target_size().width()); @@ -449,7 +449,7 @@ quality, CreateMatrix(SkSize::Make(2.5f, 1.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(quality, key.filter_quality()); EXPECT_EQ(250, key.target_size().width()); @@ -471,7 +471,7 @@ quality, CreateMatrix(SkSize::Make(0.9f, 2.f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality()); EXPECT_EQ(4555, key.target_size().width()); @@ -491,7 +491,7 @@ quality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -510,7 +510,7 @@ quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -530,7 +530,7 @@ quality, CreateMatrix(SkSize::Make(1.001f, 1.001f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -550,7 +550,7 @@ quality, CreateMatrix(SkSize::Make(0.999f, 0.999f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -569,7 +569,7 @@ quality, CreateMatrix(SkSize::Make(0.5f, 0.5), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kNone_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -583,7 +583,7 @@ DefaultColorSpace()); auto another_key = - ImageDecodeCacheKey::FromDrawImage(another_draw_image, RGBA_8888); + ImageDecodeCacheKey::FromDrawImage(another_draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), another_key.image_id()); EXPECT_EQ(kNone_SkFilterQuality, another_key.filter_quality()); EXPECT_EQ(100, another_key.target_size().width()); @@ -605,7 +605,7 @@ CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); EXPECT_EQ(100, key.target_size().width()); @@ -625,7 +625,7 @@ CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), DefaultColorSpace()); - auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888); + auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888); EXPECT_EQ(image->uniqueID(), key.image_id()); EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality()); EXPECT_EQ(40, key.target_size().width());
diff --git a/cc/tiles/tile_draw_info.h b/cc/tiles/tile_draw_info.h index dc1a8855..390b4346 100644 --- a/cc/tiles/tile_draw_info.h +++ b/cc/tiles/tile_draw_info.h
@@ -8,9 +8,9 @@ #include <memory> #include "base/trace_event/trace_event_argument.h" -#include "cc/resources/platform_color.h" #include "cc/resources/resource_provider.h" #include "cc/resources/scoped_resource.h" +#include "components/viz/common/resources/platform_color.h" namespace cc {
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc index d9a680d6..94addce 100644 --- a/cc/tiles/tile_manager.cc +++ b/cc/tiles/tile_manager.cc
@@ -1445,7 +1445,8 @@ client_->RequestImplSideInvalidation(); } -ResourceFormat TileManager::DetermineResourceFormat(const Tile* tile) const { +viz::ResourceFormat TileManager::DetermineResourceFormat( + const Tile* tile) const { return raster_buffer_provider_->GetResourceFormat(!tile->is_opaque()); } @@ -1636,7 +1637,7 @@ // static TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( const gfx::Size& size, - ResourceFormat format) { + viz::ResourceFormat format) { // We can use UncheckedSizeInBytes here since this is used with a tile // size which is determined by the compositor (it's at most max texture // size).
diff --git a/cc/tiles/tile_manager.h b/cc/tiles/tile_manager.h index 1b08ae0e..91388826 100644 --- a/cc/tiles/tile_manager.h +++ b/cc/tiles/tile_manager.h
@@ -279,7 +279,8 @@ MemoryUsage(); MemoryUsage(size_t memory_bytes, size_t resource_count); - static MemoryUsage FromConfig(const gfx::Size& size, ResourceFormat format); + static MemoryUsage FromConfig(const gfx::Size& size, + viz::ResourceFormat format); static MemoryUsage FromTile(const Tile* tile); MemoryUsage& operator+=(const MemoryUsage& other); @@ -342,7 +343,7 @@ void MarkTilesOutOfMemory( std::unique_ptr<RasterTilePriorityQueue> queue) const; - ResourceFormat DetermineResourceFormat(const Tile* tile) const; + viz::ResourceFormat DetermineResourceFormat(const Tile* tile) const; bool DetermineResourceRequiresSwizzle(const Tile* tile) const; void DidFinishRunningTileTasksRequiredForActivation();
diff --git a/cc/tiles/tile_manager_unittest.cc b/cc/tiles/tile_manager_unittest.cc index d497d963f..6497489 100644 --- a/cc/tiles/tile_manager_unittest.cc +++ b/cc/tiles/tile_manager_unittest.cc
@@ -1369,11 +1369,12 @@ EXPECT_FALSE(queue->IsEmpty()); EXPECT_TRUE(queue->Top().tile()->required_for_draw()); EXPECT_EQ(gfx::Size(256, 256), queue->Top().tile()->desired_texture_size()); - EXPECT_EQ(RGBA_8888, host_impl()->resource_provider()->best_texture_format()); + EXPECT_EQ(viz::RGBA_8888, + host_impl()->resource_provider()->best_texture_format()); ManagedMemoryPolicy policy = host_impl()->ActualManagedMemoryPolicy(); policy.bytes_limit_when_visible = ResourceUtil::UncheckedSizeInBytes<size_t>( - gfx::Size(256, 256), RGBA_8888); + gfx::Size(256, 256), viz::RGBA_8888); host_impl()->SetMemoryPolicy(policy); EXPECT_FALSE(host_impl()->is_likely_to_require_a_draw()); @@ -1381,7 +1382,7 @@ EXPECT_TRUE(host_impl()->is_likely_to_require_a_draw()); Resource* resource = host_impl()->resource_pool()->AcquireResource( - gfx::Size(256, 256), RGBA_8888, gfx::ColorSpace()); + gfx::Size(256, 256), viz::RGBA_8888, gfx::ColorSpace()); host_impl()->tile_manager()->CheckIfMoreTilesNeedToBePreparedForTesting(); EXPECT_FALSE(host_impl()->is_likely_to_require_a_draw()); @@ -1929,7 +1930,7 @@ // Ensure there's a resource with our |kInvalidatedId| in the resource pool. auto* resource = host_impl->resource_pool()->AcquireResource( - kTileSize, RGBA_8888, gfx::ColorSpace()); + kTileSize, viz::RGBA_8888, gfx::ColorSpace()); host_impl->resource_pool()->OnContentReplaced(resource->id(), kInvalidatedId); host_impl->resource_pool()->ReleaseResource(resource); host_impl->resource_pool()->CheckBusyResources();
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h index 6b742a01..1ef7a20 100644 --- a/cc/trees/layer_tree_host.h +++ b/cc/trees/layer_tree_host.h
@@ -35,7 +35,6 @@ #include "cc/layers/layer_list_iterator.h" #include "cc/output/layer_tree_frame_sink.h" #include "cc/output/swap_promise.h" -#include "cc/resources/resource_format.h" #include "cc/surfaces/surface_reference_owner.h" #include "cc/surfaces/surface_sequence_generator.h" #include "cc/trees/compositor_mode.h" @@ -45,6 +44,7 @@ #include "cc/trees/proxy.h" #include "cc/trees/swap_promise_manager.h" #include "cc/trees/target_property.h" +#include "components/viz/common/quads/resource_format.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/gfx/geometry/rect.h"
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 99f22caa..63d133c 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -4050,15 +4050,15 @@ return; } - ResourceFormat format = resource_provider_->best_texture_format(); + viz::ResourceFormat format = resource_provider_->best_texture_format(); switch (bitmap.GetFormat()) { case UIResourceBitmap::RGBA8: break; case UIResourceBitmap::ALPHA_8: - format = ALPHA_8; + format = viz::ALPHA_8; break; case UIResourceBitmap::ETC1: - format = ETC1; + format = viz::ETC1; break; }
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index ea14f33..850284f 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -7423,7 +7423,7 @@ resource_id_(resource_provider->CreateResource( gfx::Size(1, 1), ResourceProvider::TEXTURE_HINT_IMMUTABLE, - RGBA_8888, + viz::RGBA_8888, gfx::ColorSpace())) { resource_provider->AllocateForTesting(resource_id_); SetBounds(gfx::Size(10, 10));
diff --git a/cc/trees/layer_tree_host_unittest_context.cc b/cc/trees/layer_tree_host_unittest_context.cc index e7429b2..55b84af 100644 --- a/cc/trees/layer_tree_host_unittest_context.cc +++ b/cc/trees/layer_tree_host_unittest_context.cc
@@ -888,8 +888,8 @@ gpu::gles2::GLES2Interface* gl = child_context_provider_->ContextGL(); ResourceId resource = child_resource_provider_->CreateResource( - gfx::Size(4, 4), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888, - gfx::ColorSpace()); + gfx::Size(4, 4), ResourceProvider::TEXTURE_HINT_IMMUTABLE, + viz::RGBA_8888, gfx::ColorSpace()); ResourceProvider::ScopedWriteLockGL lock(child_resource_provider_.get(), resource, false);
diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc index b11b107..5586f35 100644 --- a/cc/trees/layer_tree_settings.cc +++ b/cc/trees/layer_tree_settings.cc
@@ -4,7 +4,7 @@ #include "cc/trees/layer_tree_settings.h" -#include "cc/resources/platform_color.h" +#include "components/viz/common/resources/platform_color.h" #include "third_party/khronos/GLES2/gl2.h" namespace cc { @@ -19,7 +19,7 @@ software_memory_policy(128 * 1024 * 1024, gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE, ManagedMemoryPolicy::kDefaultNumResourcesLimit), - preferred_tile_format(PlatformColor::BestTextureFormat()) {} + preferred_tile_format(viz::PlatformColor::BestTextureFormat()) {} LayerTreeSettings::LayerTreeSettings(const LayerTreeSettings& other) = default; LayerTreeSettings::~LayerTreeSettings() = default;
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h index 7010581..a154d9b 100644 --- a/cc/trees/layer_tree_settings.h +++ b/cc/trees/layer_tree_settings.h
@@ -14,10 +14,10 @@ #include "cc/debug/layer_tree_debug_state.h" #include "cc/output/managed_memory_policy.h" #include "cc/output/renderer_settings.h" -#include "cc/resources/resource_format.h" #include "cc/resources/resource_settings.h" #include "cc/scheduler/scheduler_settings.h" #include "cc/tiles/tile_manager_settings.h" +#include "components/viz/common/quads/resource_format.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/gfx/geometry/size.h" @@ -88,7 +88,7 @@ size_t decoded_image_cache_budget_bytes = 128 * 1024 * 1024; size_t decoded_image_working_set_budget_bytes = 128 * 1024 * 1024; int max_preraster_distance_in_screen_pixels = 1000; - ResourceFormat preferred_tile_format; + viz::ResourceFormat preferred_tile_format; bool enable_color_correct_rasterization = false;
diff --git a/chrome/VERSION b/chrome/VERSION index c1e4964..1bb73ad 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=61 MINOR=0 -BUILD=3152 +BUILD=3154 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainerLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainerLayout.java index fd259f0..82c333b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainerLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainerLayout.java
@@ -15,8 +15,6 @@ import android.view.Gravity; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; -import android.view.ViewGroup.LayoutParams; import android.widget.FrameLayout; import org.chromium.base.ObserverList; @@ -24,7 +22,6 @@ import org.chromium.chrome.browser.infobar.InfoBarContainer.InfoBarAnimationListener; import java.util.ArrayList; -import java.util.List; /** * Layout that displays infobars in a stack. Handles all the animations when adding or removing @@ -115,15 +112,6 @@ Resources res = context.getResources(); mBackInfobarHeight = res.getDimensionPixelSize(R.dimen.infobar_peeking_height); mFloatingBehavior = new FloatingBehavior(this); - mBackgroundPeekSize = getResources().getDimensionPixelSize(R.dimen.infobar_compact_size); - mInfoBarShadowHeight = getResources().getDimensionPixelSize(R.dimen.infobar_shadow_height); - } - - @Override - public void onAttachedToWindow() { - super.onAttachedToWindow(); - - mBottomContainer = (ViewGroup) getRootView().findViewById(R.id.bottom_container); } /** @@ -187,20 +175,10 @@ // Animation durations. private static final int DURATION_SLIDE_UP_MS = 250; - private static final int DURATION_PEEK_MS = 500; private static final int DURATION_SLIDE_DOWN_MS = 250; private static final int DURATION_FADE_MS = 100; private static final int DURATION_FADE_OUT_MS = 200; - /** The height that an infobar will peek when being added behind another one. */ - private final int mBackgroundPeekSize; - - /** The height of the shadow that sits above the infobar. */ - private final int mInfoBarShadowHeight; - - /** The bottom container that the infobar container sits inside of. */ - private ViewGroup mBottomContainer; - /** * Base class for animations inside the InfoBarContainerLayout. * @@ -237,10 +215,11 @@ * value to endValue and updates the side shadow positions on each frame. */ ValueAnimator createTranslationYAnimator(final InfoBarWrapper wrapper, float endValue) { - ValueAnimator animator = ObjectAnimator.ofFloat(wrapper, View.TRANSLATION_Y, endValue); + ValueAnimator animator = ValueAnimator.ofFloat(wrapper.getTranslationY(), endValue); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { + wrapper.setTranslationY((float) animation.getAnimatedValue()); mFloatingBehavior.updateShadowPosition(); } }); @@ -428,39 +407,14 @@ @Override Animator createAnimator() { - AnimatorSet set = new AnimatorSet(); - List<Animator> animators = new ArrayList<>(); - mAppearingWrapper.setTranslationY(mAppearingWrapper.getHeight()); - mAppearingWrapper.setRestrictHeightForAnimation(true); - mAppearingWrapper.setHeightForAnimation(mInfoBarShadowHeight + mBackgroundPeekSize); - mAppearingWrapper.addView(mAppearingWrapper.getItem().getView()); - ValueAnimator animator = createTranslationYAnimator( - mAppearingWrapper, mBackInfobarHeight - mBackgroundPeekSize); - animators.add(animator); - - animators.add(createTranslationYAnimator(mAppearingWrapper, 0)); - - // When the infobar container is running this specific animation, do not clip the - // children so the infobars can animate outside their container. - set.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - setHierarchyClipsChildren(false); - } - }); - - set.playSequentially(animators); - set.setDuration(DURATION_PEEK_MS); - - return set; + return createTranslationYAnimator(mAppearingWrapper, 0f) + .setDuration(DURATION_SLIDE_UP_MS); } @Override public void onAnimationEnd() { - mAppearingWrapper.setRestrictHeightForAnimation(false); mAppearingWrapper.removeView(mAppearingWrapper.getItem().getView()); - setHierarchyClipsChildren(true); } @Override @@ -470,17 +424,6 @@ } /** - * Used to set the relevant view hierarchy to not clip its children. This is used during - * animation so views can draw outside the normal bounds. - * @param clip Whether or not to clip child views. - */ - private void setHierarchyClipsChildren(boolean clip) { - setClipChildren(clip); - ((ViewGroup) getParent()).setClipChildren(clip); - mBottomContainer.setClipChildren(clip); - } - - /** * The animation to hide the front infobar and reveal the second-to-front infobar. The front * infobar slides down and off the screen. The back infobar(s) will adjust to the size of the * new front infobar, and then the new front infobar's contents will fade in. @@ -899,10 +842,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { widthMeasureSpec = mFloatingBehavior.beforeOnMeasure(widthMeasureSpec); super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - // Make sure the shadow is tall enough to compensate for the peek animation of other - // infboars. - mFloatingBehavior.afterOnMeasure(getMeasuredHeight() + mBackgroundPeekSize); + mFloatingBehavior.afterOnMeasure(getMeasuredHeight()); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarWrapper.java index c64ded9e..f0c5e8c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarWrapper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarWrapper.java
@@ -19,15 +19,6 @@ private final InfoBarContainerLayout.Item mItem; - /** Whether or not the height of the layout should be restricted for animations. */ - private boolean mRestrictHeightForAnimation; - - /** - * The height in px that this view will be restricted to if - * {@link #mRestrictHeightForAnimation} is set. - */ - private int mHeightForAnimationPx; - /** * Constructor for inflating from Java. */ @@ -42,22 +33,6 @@ // setBackgroundResource() changes the padding, so call setPadding() second. setBackgroundResource(R.drawable.infobar_wrapper_bg); setPadding(0, shadowHeight, 0, 0); - setClipChildren(true); - } - - /** - * @param restrict Whether or not the height of this view should be restricted for animations. - */ - public void setRestrictHeightForAnimation(boolean restrict) { - mRestrictHeightForAnimation = restrict; - } - - /** - * @param heightPx The restricted height in px that will be used if - * {@link #mRestrictHeightForAnimation} is set. - */ - public void setHeightForAnimation(int heightPx) { - mHeightForAnimationPx = heightPx; } InfoBarContainerLayout.Item getItem() { @@ -65,16 +40,6 @@ } @Override - public void onMeasure(int widthSpec, int heightSpec) { - if (mRestrictHeightForAnimation) { - int heightPx = Math.min(mHeightForAnimationPx, MeasureSpec.getSize(heightSpec)); - heightSpec = MeasureSpec.makeMeasureSpec(heightPx, MeasureSpec.getMode(heightSpec)); - } - - super.onMeasure(widthSpec, heightSpec); - } - - @Override public void onViewAdded(View child) { child.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, Gravity.TOP));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java index 5786caf..fdc2049 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
@@ -980,6 +980,8 @@ unregisterDaydreamIntent(mVrDaydreamApi); if (mVrSupportLevel == VR_NOT_AVAILABLE) return; + if (mInVr) mVSyncEstimator.pause(); + cancelPendingVrEntry(); // When the active web page has a vrdisplayactivate event handler, @@ -1000,10 +1002,7 @@ cancelPendingVrEntry(); // We defer pausing of VrShell until the app is stopped to keep head tracking working for // as long as possible while going to daydream home. - if (mInVr) { - mVrShell.pause(); - mVSyncEstimator.pause(); - } + if (mInVr) mVrShell.pause(); if (mShowingDaydreamDoff || mProbablyInDon) return; // TODO(mthiesse): When the user resumes Chrome in a 2D context, we don't want to tear down
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java index a811afa..5d7631d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java
@@ -111,28 +111,24 @@ } } - if (webappBaseDirectory != null) { - // Delete all web app directories in the main directory, which were for pre-L web apps. - File appDirectory = new File(context.getApplicationInfo().dataDir); - String webappDirectoryAppBaseName = webappBaseDirectory.getName(); - File[] files = appDirectory.listFiles(); - if (files != null) { - for (File file : files) { - String filename = file.getName(); - if (!filename.startsWith(webappDirectoryAppBaseName)) continue; - if (filename.length() == webappDirectoryAppBaseName.length()) continue; - directoriesToDelete.add(file); - } + // Delete all web app directories in the main directory, which were for pre-L web apps. + File appDirectory = new File(context.getApplicationInfo().dataDir); + String webappDirectoryAppBaseName = webappBaseDirectory.getName(); + File[] files = appDirectory.listFiles(); + if (files != null) { + for (File file : files) { + String filename = file.getName(); + if (!filename.startsWith(webappDirectoryAppBaseName)) continue; + if (filename.length() == webappDirectoryAppBaseName.length()) continue; + directoriesToDelete.add(file); } + } - // Clean out web app directories no longer corresponding to tasks in Recents. - if (webappBaseDirectory.exists()) { - files = webappBaseDirectory.listFiles(); - if (files != null) { - for (File file : files) { - if (!liveWebapps.contains(file.getName())) directoriesToDelete.add(file); - } - } + // Clean out web app directories no longer corresponding to tasks in Recents. + files = webappBaseDirectory.listFiles(); + if (files != null) { + for (File file : files) { + if (!liveWebapps.contains(file.getName())) directoriesToDelete.add(file); } } }
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 54baa96..1991bbc3 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -1636,6 +1636,15 @@ <message name="IDS_SETTINGS_ON_STARTUP" desc="Name of the on startup page."> On startup </message> + <message name="IDS_SETTINGS_ON_STARTUP_DESCRIPTION" desc="Secondary line for IDS_SETTINGS_ON_STARTUP_MANAGE describing the OnStartup features."> + Restore tabs or open specific pages + </message> + <message name="IDS_SETTINGS_ON_STARTUP_MANAGE" desc="Button label to open subpage for OnStartup URLs and heading for that subpage."> + Manage on startup pages + </message> + <message name="IDS_SETTINGS_ON_STARTUP_PAGES" desc="Label for list of OnStartup URLs."> + Pages to open on startup + </message> <message name="IDS_SETTINGS_ON_STARTUP_OPEN_NEW_TAB" desc="Radio button option to open the new tab page."> Open the New Tab page </message>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 0e45042..d2ad4bf2 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -64,6 +64,7 @@ #include "components/password_manager/core/common/password_manager_features.h" #include "components/previews/core/previews_features.h" #include "components/proximity_auth/switches.h" +#include "components/search_provider_logos/features.h" #include "components/security_state/core/security_state.h" #include "components/security_state/core/switches.h" #include "components/signin/core/common/signin_features.h" @@ -1081,6 +1082,15 @@ {"14px vertical margin", kOmniboxUIVerticalMargin14px, arraysize(kOmniboxUIVerticalMargin14px), nullptr}}; +const FeatureEntry::FeatureParam kClientPlaceholdersForServerLoFiEnabled[] = { + {"replace_server_placeholders", "true"}}; + +const FeatureEntry::FeatureVariation + kClientPlaceholdersForServerLoFiFeatureVariations[] = { + {"(replace Server Lo-Fi placeholders)", + kClientPlaceholdersForServerLoFiEnabled, + arraysize(kClientPlaceholdersForServerLoFiEnabled), nullptr}}; + // RECORDING USER METRICS FOR FLAGS: // ----------------------------------------------------------------------------- // The first line of the entry is the internal name. @@ -1994,10 +2004,13 @@ {"enable-offline-previews", flag_descriptions::kEnableOfflinePreviewsName, flag_descriptions::kEnableOfflinePreviewsDescription, kOsAndroid, FEATURE_VALUE_TYPE(previews::features::kOfflinePreviews)}, - {"enable-client-lo-fi", flag_descriptions::kEnableClientLoFiName, - flag_descriptions::kEnableClientLoFiDescription, kOsAndroid, - FEATURE_VALUE_TYPE(previews::features::kClientLoFi)}, #endif // OS_ANDROID + {"enable-client-lo-fi", flag_descriptions::kEnableClientLoFiName, + flag_descriptions::kEnableClientLoFiDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + previews::features::kClientLoFi, + kClientPlaceholdersForServerLoFiFeatureVariations, + "PreviewsClientLoFi")}, {"allow-insecure-localhost", flag_descriptions::kAllowInsecureLocalhostName, flag_descriptions::kAllowInsecureLocalhostDescription, kOsAll, SINGLE_VALUE_TYPE(switches::kAllowInsecureLocalhost)}, @@ -3131,6 +3144,12 @@ flag_descriptions::kEnableNetworkServiceDescription, kOsAll, FEATURE_VALUE_TYPE(features::kNetworkService)}, +#if defined(OS_ANDROID) + {"use-ddljson-api", flag_descriptions::kUseDdljsonApiName, + flag_descriptions::kUseDdljsonApiDescription, kOsAndroid, + FEATURE_VALUE_TYPE(search_provider_logos::features::kUseDdljsonApi)}, +#endif // defined(OS_ANDROID) + // NOTE: Adding new command-line switches requires adding corresponding // entries to enum "LoginCustomFlags" in histograms/enums.xml. See note in // enums.xml and don't forget to run AboutFlagsHistogramTest unit test.
diff --git a/chrome/browser/android/logo_service.cc b/chrome/browser/android/logo_service.cc index c2fd971e..feb9ddc 100644 --- a/chrome/browser/android/logo_service.cc +++ b/chrome/browser/android/logo_service.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/android/logo_service.h" #include "base/command_line.h" +#include "base/feature_list.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/android/chrome_feature_list.h" @@ -30,17 +31,6 @@ const char kCachedLogoDirectory[] = "Search Logo"; const int kDecodeLogoTimeoutSeconds = 30; -// Returns the URL where the doodle can be downloaded, e.g. -// https://www.google.com/async/newtab_mobile. This depends on the user's -// Google domain. -GURL GetGoogleDoodleURL(Profile* profile) { - GURL google_base_url(UIThreadSearchTermsData(profile).GoogleBaseURLValue()); - const char kGoogleDoodleURLPath[] = "async/newtab_mobile"; - GURL::Replacements replacements; - replacements.SetPathStr(kGoogleDoodleURLPath); - return google_base_url.ReplaceComponents(replacements); -} - class LogoDecoderDelegate : public ImageDecoder::ImageRequest { public: LogoDecoderDelegate( @@ -139,22 +129,25 @@ profile_->GetRequestContext(), base::MakeUnique<ChromeLogoDelegate>()); } - GURL url = use_fixed_logo ? logo_url : GetGoogleDoodleURL(profile_); - auto parse_logo_response_callback = - use_fixed_logo - ? base::Bind(&search_provider_logos::ParseFixedLogoResponse) - : base::Bind(&search_provider_logos::GoogleParseLogoResponse); + if (use_fixed_logo) { + logo_tracker_->SetServerAPI( + logo_url, base::Bind(&search_provider_logos::ParseFixedLogoResponse), + base::Bind(&search_provider_logos::UseFixedLogoUrl)); + } else { + GURL google_base_url = + GURL(UIThreadSearchTermsData(profile_).GoogleBaseURLValue()); - bool use_gray_background = - !base::FeatureList::IsEnabled(chrome::android::kChromeHomeFeature); - auto append_query_params_callback = - use_fixed_logo - ? base::Bind(&search_provider_logos::UseFixedLogoUrl) - : base::Bind(&search_provider_logos::GoogleAppendQueryparamsToLogoURL, - use_gray_background); + bool use_gray_background = + !base::FeatureList::IsEnabled(chrome::android::kChromeHomeFeature); - logo_tracker_->SetServerAPI(url, parse_logo_response_callback, - append_query_params_callback); + logo_tracker_->SetServerAPI( + search_provider_logos::GetGoogleDoodleURL(google_base_url), + search_provider_logos::GetGoogleParseLogoResponseCallback( + google_base_url), + search_provider_logos::GetGoogleAppendQueryparamsCallback( + use_gray_background)); + } + logo_tracker_->GetLogo(observer); }
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc index c1ffa1c3b..0cdfbea 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h" +#include <stdint.h> + #include <set> #include <string> #include <utility> @@ -193,8 +195,8 @@ DCHECK_CURRENTLY_ON(BrowserThread::IO); net::CookieStore* cookie_store = rq_context->GetURLRequestContext()->cookie_store(); - cookie_store->DeleteAllCreatedBetweenAsync(delete_begin, delete_end, - IgnoreArgument<int>(callback)); + cookie_store->DeleteAllCreatedBetweenAsync( + delete_begin, delete_end, IgnoreArgument<uint32_t>(callback)); } void ClearCookiesWithPredicateOnIOThread( @@ -207,7 +209,7 @@ net::CookieStore* cookie_store = rq_context->GetURLRequestContext()->cookie_store(); cookie_store->DeleteAllCreatedBetweenWithPredicateAsync( - delete_begin, delete_end, predicate, IgnoreArgument<int>(callback)); + delete_begin, delete_end, predicate, IgnoreArgument<uint32_t>(callback)); } void ClearNetworkPredictorOnIOThread(chrome_browser_net::Predictor* predictor) {
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc index 05c1b04e..3fe46b93 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h" +#include <stdint.h> + #include "base/guid.h" #include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" @@ -233,7 +235,7 @@ }; void RunClosureAfterCookiesCleared(const base::Closure& task, - int cookies_deleted) { + uint32_t cookies_deleted) { task.Run(); }
diff --git a/chrome/browser/chrome_content_gpu_manifest_overlay.json b/chrome/browser/chrome_content_gpu_manifest_overlay.json index 7e275bf..6f9513d 100644 --- a/chrome/browser/chrome_content_gpu_manifest_overlay.json +++ b/chrome/browser/chrome_content_gpu_manifest_overlay.json
@@ -6,6 +6,8 @@ "browser": [ "arc::mojom::VideoDecodeAccelerator", "arc::mojom::VideoDecodeClient", + "arc::mojom::VideoEncodeAccelerator", + "arc::mojom::VideoEncodeClient", "chrome::mojom::ResourceUsageReporter" ] }
diff --git a/chrome/browser/chromeos/arc/video/gpu_arc_video_service_host.cc b/chrome/browser/chromeos/arc/video/gpu_arc_video_service_host.cc index 75b859203..70b43767 100644 --- a/chrome/browser/chromeos/arc/video/gpu_arc_video_service_host.cc +++ b/chrome/browser/chromeos/arc/video/gpu_arc_video_service_host.cc
@@ -31,6 +31,11 @@ content::BindInterfaceInGpuProcess(std::move(request)); } +void ConnectToVideoEncodeAcceleratorOnIOThread( + mojom::VideoEncodeAcceleratorRequest request) { + content::BindInterfaceInGpuProcess(std::move(request)); +} + } // namespace class VideoAcceleratorFactoryService : public mojom::VideoAcceleratorFactory { @@ -47,7 +52,10 @@ void CreateEncodeAccelerator( mojom::VideoEncodeAcceleratorRequest request) override { - // TODO(owenlin): Implement this function. + content::BrowserThread::PostTask( + content::BrowserThread::IO, FROM_HERE, + base::BindOnce(&ConnectToVideoEncodeAcceleratorOnIOThread, + base::Passed(&request))); } private:
diff --git a/chrome/browser/chromeos/attestation/platform_verification_impl.cc b/chrome/browser/chromeos/attestation/platform_verification_impl.cc index 13640901..f6aee0b4 100644 --- a/chrome/browser/chromeos/attestation/platform_verification_impl.cc +++ b/chrome/browser/chromeos/attestation/platform_verification_impl.cc
@@ -41,7 +41,7 @@ void PlatformVerificationImpl::ChallengePlatform( const std::string& service_id, const std::string& challenge, - const ChallengePlatformCallback& callback) { + ChallengePlatformCallback callback) { DVLOG(2) << __FUNCTION__; DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -50,12 +50,13 @@ platform_verification_flow_->ChallengePlatformKey( content::WebContents::FromRenderFrameHost(render_frame_host_), service_id, - challenge, base::Bind(&PlatformVerificationImpl::OnPlatformChallenged, - weak_factory_.GetWeakPtr(), callback)); + challenge, + base::Bind(&PlatformVerificationImpl::OnPlatformChallenged, + weak_factory_.GetWeakPtr(), base::Passed(&callback))); } void PlatformVerificationImpl::OnPlatformChallenged( - const ChallengePlatformCallback& callback, + ChallengePlatformCallback callback, Result result, const std::string& signed_data, const std::string& signature, @@ -68,14 +69,15 @@ DCHECK(signature.empty()); DCHECK(platform_key_certificate.empty()); LOG(ERROR) << "Platform verification failed."; - callback.Run(false, "", "", ""); + std::move(callback).Run(false, "", "", ""); return; } DCHECK(!signed_data.empty()); DCHECK(!signature.empty()); DCHECK(!platform_key_certificate.empty()); - callback.Run(true, signed_data, signature, platform_key_certificate); + std::move(callback).Run(true, signed_data, signature, + platform_key_certificate); } } // namespace attestation
diff --git a/chrome/browser/chromeos/attestation/platform_verification_impl.h b/chrome/browser/chromeos/attestation/platform_verification_impl.h index fe9032b..f0bb6c9 100644 --- a/chrome/browser/chromeos/attestation/platform_verification_impl.h +++ b/chrome/browser/chromeos/attestation/platform_verification_impl.h
@@ -33,12 +33,12 @@ // mojo::InterfaceImpl<PlatformVerification> implementation. void ChallengePlatform(const std::string& service_id, const std::string& challenge, - const ChallengePlatformCallback& callback) override; + ChallengePlatformCallback callback) override; private: using Result = PlatformVerificationFlow::Result; - void OnPlatformChallenged(const ChallengePlatformCallback& callback, + void OnPlatformChallenged(ChallengePlatformCallback callback, Result result, const std::string& signed_data, const std::string& signature,
diff --git a/chrome/browser/chromeos/login/lock/webui_screen_locker.cc b/chrome/browser/chromeos/login/lock/webui_screen_locker.cc index 6e109bc..532b557e 100644 --- a/chrome/browser/chromeos/login/lock/webui_screen_locker.cc +++ b/chrome/browser/chromeos/login/lock/webui_screen_locker.cc
@@ -40,6 +40,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "ui/aura/client/capture_client.h" +#include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/x/x11_util.h"
diff --git a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc index 05ca164..93df4fd4 100644 --- a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc +++ b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/grit/chromium_strings.h" +#include "content/public/browser/desktop_capture.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" @@ -119,12 +120,10 @@ screen_list = base::MakeUnique<DesktopMediaListAsh>( DesktopMediaID::TYPE_SCREEN); #else // !defined(USE_ASH) - webrtc::DesktopCaptureOptions capture_options = - webrtc::DesktopCaptureOptions::CreateDefault(); - capture_options.set_disable_effects(false); screen_list = base::MakeUnique<NativeDesktopMediaList>( - DesktopMediaID::TYPE_SCREEN, - webrtc::DesktopCapturer::CreateScreenCapturer(capture_options)); + content::DesktopMediaID::TYPE_SCREEN, + webrtc::DesktopCapturer::CreateScreenCapturer( + content::CreateDesktopCaptureOptions())); #endif // !defined(USE_ASH) } have_screen_list = true; @@ -149,12 +148,10 @@ // windows) created here cannot share the same DesktopCaptureOptions // instance. DesktopCaptureOptions owns X connection, which cannot be // used on multiple threads concurrently. - webrtc::DesktopCaptureOptions capture_options = - webrtc::DesktopCaptureOptions::CreateDefault(); - capture_options.set_disable_effects(false); window_list = base::MakeUnique<NativeDesktopMediaList>( - DesktopMediaID::TYPE_WINDOW, - webrtc::DesktopCapturer::CreateWindowCapturer(capture_options)); + content::DesktopMediaID::TYPE_WINDOW, + webrtc::DesktopCapturer::CreateWindowCapturer( + content::CreateDesktopCaptureOptions())); #endif // !defined(USE_ASH) } have_window_list = true;
diff --git a/chrome/browser/favicon/content_favicon_driver_browsertest.cc b/chrome/browser/favicon/content_favicon_driver_browsertest.cc index b0182bf..957545e6 100644 --- a/chrome/browser/favicon/content_favicon_driver_browsertest.cc +++ b/chrome/browser/favicon/content_favicon_driver_browsertest.cc
@@ -54,13 +54,6 @@ private: // content::ResourceDispatcherHostDelegate: - bool ShouldBeginRequest(const std::string& method, - const GURL& url, - content::ResourceType resource_type, - content::ResourceContext* resource_context) override { - return true; - } - void RequestBeginning(net::URLRequest* request, content::ResourceContext* resource_context, content::AppCacheService* appcache_service,
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 912f646ce..672ffc3 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -6,52 +6,511 @@ namespace flag_descriptions { -const char kBrowserSideNavigationName[] = "Enable browser side navigation"; +const char kAccelerated2dCanvasName[] = "Accelerated 2D canvas"; +const char kAccelerated2dCanvasDescription[] = + "Enables the use of the GPU to perform 2d canvas rendering instead of " + "using software rendering."; +const char kAcceleratedVideoDecodeName[] = "Hardware-accelerated video decode"; +const char kAcceleratedVideoDecodeDescription[] = + "Hardware-accelerated video decode where available."; + +const char kAffiliationBasedMatchingName[] = + "Affiliation based matching in password manager"; +const char kAffiliationBasedMatchingDescription[] = + "Allow credentials stored for Android applications to be filled into " + "corresponding websites."; + +const char kAllowInsecureLocalhostName[] = + "Allow invalid certificates for resources loaded from localhost."; +const char kAllowInsecureLocalhostDescription[] = + "Allows requests to localhost over HTTPS even when an invalid certificate " + "is presented."; + +const char kAllowNaclSocketApiName[] = "NaCl Socket API."; +const char kAllowNaclSocketApiDescription[] = + "Allows applications to use NaCl Socket API. Use only to test NaCl " + "plugins."; + +const char kAppBannersName[] = "App Banners"; +const char kAppBannersDescription[] = + "Enable the display of Progressive Web App banners, which prompt a user to " + "add a web app to their shelf, or other platform-specific equivalent."; + +const char kAutoplayPolicyName[] = "Autoplay policy"; +const char kAutoplayPolicyDescription[] = + "Policy used when deciding if audio or video is allowed to autoplay."; + +const char kAutoplayPolicyUserGestureRequiredForCrossOrigin[] = + "User gesture is required for cross-origin iframes."; +const char kAutoplayPolicyNoUserGestureRequired[] = + "No user gesture is required."; +const char kAutoplayPolicyUserGestureRequired[] = "User gesture is required."; +const char kAutoplayPolicyDocumentUserActivation[] = + "Document user activation is required."; + +const char kBackgroundVideoTrackOptimizationName[] = + "Optimize background video playback."; +const char kBackgroundVideoTrackOptimizationDescription[] = + "Disable video tracks when the video is played in the background to " + "optimize performance."; + +const char kBleAdvertisingInExtensionsName[] = "BLE Advertising in Chrome Apps"; +const char kBleAdvertisingInExtensionsDescription[] = + "Enables BLE Advertising in Chrome Apps. BLE Advertising might interfere " + "with regular use of Bluetooth Low Energy features."; + +const char kBrowserSideNavigationName[] = "Enable browser side navigation"; const char kBrowserSideNavigationDescription[] = "Enable browser side navigation (aka PlzNavigate)."; -// Material Design version of chrome://bookmarks +const char kBrowserTaskSchedulerName[] = "Task Scheduler"; +const char kBrowserTaskSchedulerDescription[] = + "Enables redirection of some task posting APIs to the task scheduler."; + +const char kBypassAppBannerEngagementChecksName[] = + "Bypass user engagement checks"; +const char kBypassAppBannerEngagementChecksDescription[] = + "Bypasses user engagement checks for displaying app banners, such as " + "requiring that users have visited the site before and that the banner " + "hasn't been shown recently. This allows developers to test that other " + "eligibility requirements for showing app banners, such as having a " + "manifest, are met."; + +const char kCaptureThumbnailOnLoadFinishedName[] = + "Capture page thumbnail on load finished"; +const char kCaptureThumbnailOnLoadFinishedDescription[] = + "Capture a page thumbnail (for use on the New Tab page) when the page load " + "finishes, in addition to other times a thumbnail may be captured."; + +const char kCastStreamingHwEncodingName[] = + "Cast Streaming hardware video encoding"; +const char kCastStreamingHwEncodingDescription[] = + "This option enables support in Cast Streaming for encoding video streams " + "using platform hardware."; + +const char kCloudImportName[] = "Cloud Import"; +const char kCloudImportDescription[] = "Allows the cloud-import feature."; + +const char kColorCorrectRenderingName[] = "Color correct rendering"; +const char kColorCorrectRenderingDescription[] = + "Enables color correct rendering of web content."; + +const char kCompositedLayerBordersName[] = "Composited render layer borders"; +const char kCompositedLayerBordersDescription[] = + "Renders a border around composited Render Layers to help debug and study " + "layer compositing."; + +const char kContextualSuggestionsCarouselName[] = + "Enable Contextual Suggestions"; +const char kContextualSuggestionsCarouselDescription[] = + "If enabled, shows contextual suggestions in a horizontal carousel in " + "bottom sheet content."; + +const char kCreditCardAssistName[] = "Credit Card Assisted Filling"; +const char kCreditCardAssistDescription[] = + "Enable assisted credit card filling on certain sites."; + +const char kCrossProcessGuestViewIsolationName[] = + "Cross process frames for guests"; +const char kCrossProcessGuestViewIsolationDescription[] = + "Highly experimental where guests such as <webview> are implemented on " + "the out-of-process iframe infrastructure."; + +const char kDataReductionProxyCarrierTestName[] = + "Enable a carrier-specific Data Reduction Proxy for testing."; +const char kDataReductionProxyCarrierTestDescription[] = + "Use a carrier-specific Data Reduction Proxy for testing."; + +const char kDataReductionProxyLoFiName[] = "Data Saver Lo-Fi mode"; +const char kDataReductionProxyLoFiDescription[] = + "Forces Data Saver Lo-Fi mode to be always enabled, enabled only on " + "cellular connections, or disabled. Data Saver must be enabled for Lo-Fi " + "mode to be used."; +const char kDataReductionProxyLoFiAlwaysOn[] = "Always on"; +const char kDataReductionProxyLoFiCellularOnly[] = "Cellular only"; +const char kDataReductionProxyLoFiDisabled[] = "Disable"; +const char kDataReductionProxyLoFiSlowConnectionsOnly[] = + "Slow connections only"; + +const char kDatasaverPromptName[] = "Cellular Data Saver Prompt"; +const char kDatasaverPromptDescription[] = + "Enables a prompt, which appears when a cellular network connection is " + "detected, to take the user to the Data Saver extension page on Chrome Web " + "Store."; +const char kDatasaverPromptDemoMode[] = "Demo mode"; + +const char kDebugPackedAppName[] = "Debugging for packed apps"; +const char kDebugPackedAppDescription[] = + "Enables debugging context menu options such as Inspect Element for packed " + "applications."; + +const char kDefaultTileHeightName[] = "Default tile height"; +const char kDefaultTileHeightDescription[] = "Specify the default tile height."; +const char kDefaultTileHeightShort[] = "128"; +const char kDefaultTileHeightTall[] = "256"; +const char kDefaultTileHeightGrande[] = "512"; +const char kDefaultTileHeightVenti[] = "1024"; + +const char kDefaultTileWidthName[] = "Default tile width"; +const char kDefaultTileWidthDescription[] = "Specify the default tile width."; +const char kDefaultTileWidthShort[] = "128"; +const char kDefaultTileWidthTall[] = "256"; +const char kDefaultTileWidthGrande[] = "512"; +const char kDefaultTileWidthVenti[] = "1024"; + +const char kDebugShortcutsName[] = "Debugging keyboard shortcuts"; +const char kDebugShortcutsDescription[] = + "Enables additional keyboard shortcuts that are useful for debugging Ash."; + +const char kDeviceDiscoveryNotificationsName[] = + "Device Discovery Notifications"; +const char kDeviceDiscoveryNotificationsDescription[] = + "Device discovery notifications on local network."; + +const char kDevtoolsExperimentsName[] = "Developer Tools experiments"; +const char kDevtoolsExperimentsDescription[] = + "Enables Developer Tools experiments. Use Settings panel in Developer " + "Tools to toggle individual experiments."; + +const char kDisableAudioForDesktopShareName[] = + "Disable Audio For Desktop Share"; +const char kDisableAudioForDesktopShareDescription[] = + "With this flag on, desktop share picker window will not let the user " + "choose whether to share audio."; + +const char kDisableNightLightName[] = "Disable Night Light"; +const char kDisableNightLightDescription[] = + "Disable the Night Light feature which controls the color temperature of " + "the screen."; + +const char kDisableTabForDesktopShareName[] = + "Disable Desktop Share with tab source"; +const char kDisableTabForDesktopShareDescription[] = + "This flag controls whether users can choose a tab for desktop share."; + +const char kDisallowDocWrittenScriptsUiName[] = + "Block scripts loaded via document.write"; +const char kDisallowDocWrittenScriptsUiDescription[] = + "Disallows fetches for third-party parser-blocking scripts inserted into " + "the main frame via document.write."; + +const char kDisplayList2dCanvasName[] = "Display list 2D canvas"; +const char kDisplayList2dCanvasDescription[] = + "Enables the use of display lists to record 2D canvas commands. This " + "allows 2D canvas rasterization to be performed on separate thread."; + +const char kDistanceFieldTextName[] = "Distance field text"; +const char kDistanceFieldTextDescription[] = + "Text is rendered with signed distance fields rather than bitmap alpha " + "masks."; + +const char kDriveSearchInChromeLauncherName[] = + "Drive Search in Chrome App Launcher"; +const char kDriveSearchInChromeLauncherDescription[] = + "Files from Drive will show up when searching the Chrome App Launcher."; + +const char kDropSyncCredentialName[] = + "Drop sync credentials from password manager"; +const char kDropSyncCredentialDescription[] = + "The password manager will not offer to save the credential used to sync."; + +const char kEasyUnlockBluetoothLowEnergyDiscoveryName[] = + "Smart Lock Bluetooth Low Energy Discovery"; +const char kEasyUnlockBluetoothLowEnergyDiscoveryDescription[] = + "Enables a Smart Lock setting that allows Chromebook to discover phones " + "over Bluetooth Low Energy in order to unlock the Chromebook when the " + "phone is in its proximity."; + +const char kEasyUnlockProximityDetectionName[] = + "Smart Lock proximity detection"; +const char kEasyUnlockProximityDetectionDescription[] = + "Enables a Smart Lock setting that restricts unlocking to only work when " + "your phone is very close to (roughly, within an arm's length of) the " + "Chrome device."; + +const char kEmbeddedExtensionOptionsName[] = "Embedded extension options"; +const char kEmbeddedExtensionOptionsDescription[] = + "Display extension options as an embedded element in chrome://extensions " + "rather than opening a new tab."; + +const char kEnableAsmWasmName[] = + "Experimental Validate Asm.js and convert to WebAssembly when valid."; +const char kEnableAsmWasmDescription[] = + R"*(Validate Asm.js when "use asm" is present and then convert to )*" + R"*(WebAssembly.)*"; + +const char kEnableAutofillCreditCardBankNameDisplayName[] = + "Display the issuer bank name of a credit card in autofill."; +const char kEnableAutofillCreditCardBankNameDisplayDescription[] = + "If enabled, displays the issuer bank name of a credit card in autofill."; + +const char kEnableAutofillCreditCardLastUsedDateDisplayName[] = + "Display the last used date of a credit card in autofill."; +const char kEnableAutofillCreditCardLastUsedDateDisplayDescription[] = + "If enabled, display the last used date of a credit card in autofill."; + +const char kEnableAutofillCreditCardUploadCvcPromptName[] = + "Enable requesting missing CVC during Autofill credit card upload"; +const char kEnableAutofillCreditCardUploadCvcPromptDescription[] = + "If enabled, requests missing CVC when offering to upload credit cards to " + "Google Payments."; + +const char kEnableBrotliName[] = "Brotli Content-Encoding."; +const char kEnableBrotliDescription[] = + "Enable Brotli Content-Encoding support."; + +const char kEnableClearBrowsingDataCountersName[] = + "Enable Clear browsing data counters."; +const char kEnableClearBrowsingDataCountersDescription[] = + "Shows data volume counters in the Clear browsing data dialog."; + +const char kEnableClientLoFiName[] = "Client-side Lo-Fi previews"; + +const char kEnableClientLoFiDescription[] = + "Enable showing low fidelity images on some pages on slow networks."; + +const char kEnableDataReductionProxyLitePageName[] = + "Lite pages for Data Saver Lo-Fi mode"; +const char kEnableDataReductionProxyLitePageDescription[] = + "Enable lite pages in Data Saver Lo-Fi mode. Previews of pages will be " + "shown instead of image placeholders when Lo-Fi is on. Data Saver and " + "Lo-Fi must be enabled for lite pages to be shown."; + +const char kDataReductionProxyServerAlternative[] = + "Use alternative server configuration"; +const char kEnableDataReductionProxyServerExperimentName[] = + "Use an alternative Data Saver back end configuration."; +const char kEnableDataReductionProxyServerExperimentDescription[] = + "Enable a different approach to saving data by configuring the back end " + "server"; + +const char kEnableDataReductionProxySavingsPromoName[] = + "Data Saver 1 MB Savings Promo"; +const char kEnableDataReductionProxySavingsPromoDescription[] = + "Enable a Data Saver promo for 1 MB of savings. If Data Saver has already " + "saved 1 MB of data, then the promo will not be shown. Data Saver must be " + "enabled for the promo to be shown."; + +const char kEnableEnumeratingAudioDevicesName[] = + "Experimentally enable enumerating audio devices."; +const char kEnableEnumeratingAudioDevicesDescription[] = + "Experimentally enable the use of enumerating audio devices."; + +const char kEnableGenericSensorName[] = "Generic Sensor"; +const char kEnableGenericSensorDescription[] = + "Enable sensor APIs based on Generic Sensor API."; + +const char kEnableGroupedHistoryName[] = "Group history by domain"; +const char kEnableGroupedHistoryDescription[] = + "Group history by website domain (i.e. google.com) on chrome://history."; + +const char kEnableHDRName[] = "HDR mode"; +const char kEnableHDRDescription[] = + "Enables HDR support on compatible displays."; + +const char kEnableHeapProfilingName[] = "Heap profiling"; +const char kEnableHeapProfilingDescription[] = "Enables heap profiling."; +const char kEnableHeapProfilingModePseudo[] = "Enabled (pseudo mode)"; +const char kEnableHeapProfilingModeNative[] = "Enabled (native mode)"; +const char kEnableHeapProfilingTaskProfiler[] = "Enabled (task mode)"; + +const char kEnableHttpFormWarningName[] = + "Show in-form warnings for sensitive fields when the top-level page is not " + "not HTTPS"; +const char kEnableHttpFormWarningDescription[] = + "Attaches a warning UI to any password or credit card fields detected when " + "the top-level page is not HTTPS"; + +const char kEnableIdleTimeSpellCheckingName[] = + "Enable idle time spell checker"; +const char kEnableIdleTimeSpellCheckingDescription[] = + "Make spell-checking code run only when the browser is idle, so that input " + "latency is reduced, especially when editing long articles, emails, etc."; const char kEnableMaterialDesignBookmarksName[] = "Enable Material Design bookmarks"; - const char kEnableMaterialDesignBookmarksDescription[] = "If enabled, the chrome://bookmarks/ URL loads the Material Design " "bookmarks page."; -// Material Design version of chrome://policy - -const char kEnableMaterialDesignPolicyPageName[] = - "Enable Material Design policy page"; - -const char kEnableMaterialDesignPolicyPageDescription[] = - "If enabled, the chrome://md-policy URL loads the Material Design policy " - "page."; - -// Material Design version of chrome://extensions - const char kEnableMaterialDesignExtensionsName[] = "Enable Material Design extensions"; - const char kEnableMaterialDesignExtensionsDescription[] = "If enabled, the chrome://extensions/ URL loads the Material Design " "extensions page."; -// Material Design version of feedback form - const char kEnableMaterialDesignFeedbackName[] = "Enable Material Design feedback"; - const char kEnableMaterialDesignFeedbackDescription[] = "If enabled, reporting an issue will load the Material Design feedback UI."; -const char kContextualSuggestionsCarouselName[] = - "Enable Contextual Suggestions"; +const char kEnableMaterialDesignPolicyPageName[] = + "Enable Material Design policy page"; +const char kEnableMaterialDesignPolicyPageDescription[] = + "If enabled, the chrome://md-policy URL loads the Material Design policy " + "page."; -const char kContextualSuggestionsCarouselDescription[] = - "If enabled, shows contextual suggestions in a horizontal carousel in " - "bottom sheet content."; +const char kEnableMidiManagerDynamicInstantiationName[] = + "MIDIManager dynamic instantiation for Web MIDI."; +const char kEnableMidiManagerDynamicInstantiationDescription[] = + "Enable MIDIManager dynamic instantiation for Web MIDI."; + +const char kEnableNavigationTracingName[] = "Enable navigation tracing"; +const char kEnableNavigationTracingDescription[] = + "This is to be used in conjunction with the trace-upload-url flag. " + "WARNING: When enabled, Chrome will record performance data for every " + "navigation and upload it to the URL specified by the trace-upload-url " + "flag. The trace may include personally identifiable information (PII) " + "such as the titles and URLs of websites you visit."; + +const char kEnableNetworkServiceName[] = "Enable network service"; +const char kEnableNetworkServiceDescription[] = + "Enables the network service, which makes network requests through a " + "separate service. Note: most features don't work with this yet."; + +const char kEnablePictureInPictureName[] = "Enable picture in picture."; +const char kEnablePictureInPictureDescription[] = + "Enable the picture in picture feature for videos."; + +const char kEnableTokenBindingName[] = "Token Binding."; +const char kEnableTokenBindingDescription[] = "Enable Token Binding support."; + +const char kEnableUseZoomForDsfName[] = + "Use Blink's zoom for device scale factor."; +const char kEnableUseZoomForDsfDescription[] = + "If enabled, Blink uses its zooming mechanism to scale content for device " + "scale factor."; +const char kEnableUseZoomForDsfChoiceDefault[] = "Default"; +const char kEnableUseZoomForDsfChoiceEnabled[] = "Enabled"; +const char kEnableUseZoomForDsfChoiceDisabled[] = "Disabled"; + +const char kEnableScrollAnchoringName[] = "Scroll Anchoring"; +const char kEnableScrollAnchoringDescription[] = + "Adjusts scroll position to prevent visible jumps when offscreen content " + "changes."; + +const char kEnableSharedArrayBufferName[] = + "Experimental enabled SharedArrayBuffer support in JavaScript."; +const char kEnableSharedArrayBufferDescription[] = + "Enable SharedArrayBuffer support in JavaScript."; + +const char kEnableWasmName[] = "WebAssembly structured cloning support."; +const char kEnableWasmDescription[] = + "Enable web pages to use WebAssembly structured cloning."; + +const char kEnableWebUsbName[] = "WebUSB"; +const char kEnableWebUsbDescription[] = "Enable WebUSB support."; + +const char kEnableImageCaptureAPIName[] = "Image Capture API"; +const char kEnableImageCaptureAPIDescription[] = + "Enables the Web Platform Image Capture API: takePhoto(), " + "getPhotoCapabilities(), etc."; + +const char kEnableZeroSuggestRedirectToChromeName[] = + "Experimental contextual omnibox suggestion"; +const char kEnableZeroSuggestRedirectToChromeDescription[] = + "Change omnibox contextual suggestions to an experimental source. Note " + "that this is not an on/off switch for contextual omnibox and it only " + "applies to suggestions provided before the user starts typing a URL or a " + "search query (i.e. zero suggest)."; + +const char kEnableWasmStreamingName[] = + "WebAssembly streaming compile/instantiate support."; +const char kEnableWasmStreamingDescription[] = + "WebAssembly.{compile|instantiate} taking a Response as parameter."; + +const char kEnableWebfontsInterventionName[] = + "New version of User Agent Intervention for WebFonts loading."; +const char kEnableWebfontsInterventionDescription[] = + "Enable New version of User Agent Intervention for WebFonts loading."; +const char kEnableWebfontsInterventionV2ChoiceDefault[] = "Default"; +const char kEnableWebfontsInterventionV2ChoiceEnabledWith2g[] = "Enabled: 2G"; +const char kEnableWebfontsInterventionV2ChoiceEnabledWith3g[] = "Enabled: 3G"; +const char kEnableWebfontsInterventionV2ChoiceEnabledWithSlow2g[] = + "Enabled: Slow 2G"; +const char kEnableWebfontsInterventionV2ChoiceDisabled[] = "Disabled"; + +const char kEnableWebfontsInterventionTriggerName[] = + "Trigger User Agent Intervention for WebFonts loading always."; +const char kEnableWebfontsInterventionTriggerDescription[] = + "Enable to trigger User Agent Intervention for WebFonts loading always. " + "This flag affects only when the intervention is enabled."; + +const char kEnableWebNotificationCustomLayoutsName[] = + "Enable custom layouts for Web Notifications."; +const char kEnableWebNotificationCustomLayoutsDescription[] = + "Enable custom layouts for Web Notifications. They will have subtle layout " + "improvements that are otherwise not possible."; + +const char kExpensiveBackgroundTimerThrottlingName[] = + "Throttle expensive background timers"; +const char kExpensiveBackgroundTimerThrottlingDescription[] = + "Enables intervention to limit CPU usage of background timers to 1%."; + +const char kExperimentalAppBannersName[] = "Experimental app banners"; +const char kExperimentalAppBannersDescription[] = + "Enables a new experimental app banner flow and UI"; + +const char kExperimentalCanvasFeaturesName[] = "Experimental canvas features"; +const char kExperimentalCanvasFeaturesDescription[] = + "Enables the use of experimental canvas features which are still in " + "development."; + +const char kExperimentalExtensionApisName[] = "Experimental Extension APIs"; +const char kExperimentalExtensionApisDescription[] = + "Enables experimental extension APIs. Note that the extension gallery " + "doesn't allow you to upload extensions that use experimental APIs."; + +const char kExperimentalFullscreenExitUIName[] = + "Experimental fullscreen exit UI"; +const char kExperimentalFullscreenExitUIDescription[] = + "Displays experimental UI to allow mouse and touch input methods to exit " + "fullscreen mode."; + +const char kExperimentalHotwordHardwareName[] = + "Simulated hardware 'Ok Google' features"; +const char kExperimentalHotwordHardwareDescription[] = + "Enables an experimental version of 'Ok Google' hotword detection features " + "that have a hardware dependency."; + +const char kExperimentalKeyboardLockUiName[] = "Experimental keyboard lock UI."; +const char kExperimentalKeyboardLockUiDescription[] = + "An experimental full screen with keyboard lock mode requiring users to " + "hold Esc to exit."; + +const char kExperimentalSecurityFeaturesName[] = + "Potentially annoying security features"; +const char kExperimentalSecurityFeaturesDescription[] = + "Enables several security features that will likely break one or more " + "pages that you visit on a daily basis. Strict mixed content checking, for " + "example. And locking powerful features to secure contexts. This flag will " + "probably annoy you."; + +const char kExperimentalWebPlatformFeaturesName[] = + "Experimental Web Platform features"; +const char kExperimentalWebPlatformFeaturesDescription[] = + "Enables experimental Web Platform features that are in development."; + +const char kExtensionContentVerificationName[] = + "Extension Content Verification"; +const char kExtensionContentVerificationDescription[] = + "This flag can be used to turn on verification that the contents of the " + "files on disk for extensions from the webstore match what they're " + "expected to be. This can be used to turn on this feature if it would not " + "otherwise have been turned on, but cannot be used to turn it off (because " + "this setting can be tampered with by malware)."; +const char kExtensionContentVerificationBootstrap[] = + "Bootstrap (get expected hashes, but do not enforce them)"; +const char kExtensionContentVerificationEnforce[] = + "Enforce (try to get hashes, and enforce them if successful)"; +const char kExtensionContentVerificationEnforceStrict[] = + "Enforce strict (hard fail if we can't get hashes)"; + +const char kExtensionsOnChromeUrlsName[] = "Extensions on chrome:// URLs"; +const char kExtensionsOnChromeUrlsDescription[] = + "Enables running extensions on chrome:// URLs, where extensions explicitly " + "request this permission."; // Report URL to SafeSearch @@ -60,21 +519,6 @@ const char kSafeSearchUrlReportingDescription[] = "If enabled, inappropriate URLs can be reported back to SafeSearch."; -// Device scale factor change in content crbug.com/485650. - -const char kEnableUseZoomForDsfName[] = - "Use Blink's zoom for device scale factor."; - -const char kEnableUseZoomForDsfDescription[] = - "If enabled, Blink uses its zooming mechanism to scale content for device " - "scale factor."; - -const char kEnableUseZoomForDsfChoiceDefault[] = "Default"; - -const char kEnableUseZoomForDsfChoiceEnabled[] = "Enabled"; - -const char kEnableUseZoomForDsfChoiceDisabled[] = "Disabled"; - const char kNostatePrefetchName[] = "No-State Prefetch"; const char kNostatePrefetchDescription[] = @@ -163,14 +607,6 @@ #endif -const char kEnableHttpFormWarningName[] = - "Show in-form warnings for sensitive fields when the top-level page is not " - "HTTPS"; - -const char kEnableHttpFormWarningDescription[] = - "Attaches a warning UI to any password or credit card fields detected when " - "the top-level page is not HTTPS"; - const char kMarkHttpAsName[] = "Mark non-secure origins as non-secure"; const char kMarkHttpAsDescription[] = "Change the UI treatment for HTTP pages"; @@ -208,12 +644,6 @@ const char kMhtmlSkipNostoreAll[] = "Skips all no-store resources."; -const char kDeviceDiscoveryNotificationsName[] = - "Device Discovery Notifications"; - -const char kDeviceDiscoveryNotificationsDescription[] = - "Device discovery notifications on local network."; - #if defined(OS_WIN) const char kCloudPrintXpsName[] = "XPS in Google Cloud Print"; @@ -271,22 +701,6 @@ "Predicts the finger's future position during scrolls allowing time to " "render the frame before the finger is there."; -const char kAppBannersName[] = "App Banners"; - -const char kAppBannersDescription[] = - "Enable the display of Progressive Web App banners, which prompt a user to " - "add a web app to their shelf, or other platform-specific equivalent."; - -const char kBypassAppBannerEngagementChecksName[] = - "Bypass user engagement checks"; - -const char kBypassAppBannerEngagementChecksDescription[] = - "Bypasses user engagement checks for displaying app banners, such as " - "requiring that users have visited the site before and that the banner " - "hasn't been shown recently. This allows developers to test that other " - "eligibility requirements for showing app banners, such as having a " - "manifest, are met."; - #if defined(OS_ANDROID) const char kAccessibilityTabSwitcherName[] = "Accessibility Tab Switcher"; @@ -319,12 +733,6 @@ "Refine the position of a touch gesture in order to compensate for touches " "having poor resolution compared to a mouse."; -const char kCompositedLayerBordersName[] = "Composited render layer borders"; - -const char kCompositedLayerBordersDescription[] = - "Renders a border around composited Render Layers to help debug and study " - "layer compositing."; - const char kGlCompositedTextureQuadBordersName[] = "GL composited texture quad borders"; @@ -342,8 +750,6 @@ const char kUiPartialSwapDescription[] = "Sets partial swap behavior."; -const char kDebugShortcutsName[] = "Debugging keyboard shortcuts"; - const char kIgnoreGpuBlacklistName[] = "Override software rendering list"; const char kIgnoreGpuBlacklistDescription[] = @@ -361,53 +767,6 @@ const char kInProductHelpDemoModeChoiceDescription[] = "Selects the In-Product Help demo mode."; -const char kColorCorrectRenderingName[] = "Color correct rendering"; - -const char kColorCorrectRenderingDescription[] = - "Enables color correct rendering of web content."; - -const char kExperimentalAppBannersName[] = "Experimental app banners"; - -const char kExperimentalAppBannersDescription[] = - "Enables a new experimental app banner flow and UI"; - -const char kExperimentalCanvasFeaturesName[] = "Experimental canvas features"; - -const char kExperimentalCanvasFeaturesDescription[] = - "Enables the use of experimental canvas features which are still in " - "development."; - -const char kAccelerated2dCanvasName[] = "Accelerated 2D canvas"; - -const char kAccelerated2dCanvasDescription[] = - "Enables the use of the GPU to perform 2d canvas rendering instead of " - "using software rendering."; - -const char kDisplayList2dCanvasName[] = "Display list 2D canvas"; - -const char kDisplayList2dCanvasDescription[] = - "Enables the use of display lists to record 2D canvas commands. This " - "allows 2D canvas rasterization to be performed on separate thread."; - -const char kExperimentalExtensionApisName[] = "Experimental Extension APIs"; - -const char kExperimentalExtensionApisDescription[] = - "Enables experimental extension APIs. Note that the extension gallery " - "doesn't allow you to upload extensions that use experimental APIs."; - -const char kExtensionsOnChromeUrlsName[] = "Extensions on chrome:// URLs"; - -const char kExtensionsOnChromeUrlsDescription[] = - "Enables running extensions on chrome:// URLs, where extensions explicitly " - "request this permission."; - -const char kExperimentalFullscreenExitUIName[] = - "Experimental fullscreen exit UI"; - -const char kExperimentalFullscreenExitUIDescription[] = - "Displays experimental UI to allow mouse and touch input methods to exit " - "fullscreen mode."; - const char kFastUnloadName[] = "Fast tab/window close"; const char kFastUnloadDescription[] = @@ -659,10 +1018,6 @@ const char kSslVersionMaxTls13[] = "TLS 1.3"; -const char kEnableTokenBindingName[] = "Token Binding."; - -const char kEnableTokenBindingDescription[] = "Enable Token Binding support."; - const char kPassiveDocumentEventListenersDescription[] = "Forces touchstart, and touchmove event listeners on document level " "targets (which haven't requested otherwise) to be treated as passive."; @@ -779,28 +1134,6 @@ const char kJavascriptHarmonyDescription[] = "Enable web pages to use experimental JavaScript features."; -const char kEnableAsmWasmName[] = - "Experimental Validate Asm.js and convert to WebAssembly when valid."; - -const char kEnableAsmWasmDescription[] = - R"*(Validate Asm.js when "use asm" is present and then convert to )*" - R"*(WebAssembly.)*"; - -const char kEnableSharedArrayBufferName[] = - "Experimental enabled SharedArrayBuffer support in JavaScript."; - -const char kEnableSharedArrayBufferDescription[] = - "Enable SharedArrayBuffer support in JavaScript."; - -const char kEnableWasmName[] = "WebAssembly structured cloning support."; -const char kEnableWasmDescription[] = - "Enable web pages to use WebAssembly structured cloning."; - -const char kEnableWasmStreamingName[] = - "WebAssembly streaming compile/instantiate support."; -const char kEnableWasmStreamingDescription[] = - "WebAssembly.{compile|instantiate} taking a Response as parameter."; - #if defined(OS_ANDROID) const char kMediaDocumentDownloadButtonName[] = @@ -844,38 +1177,11 @@ const char kSlimmingPaintInvalidationDescription[] = "Whether to enable a new paint invalidation system."; -const char kExperimentalSecurityFeaturesName[] = - "Potentially annoying security features"; - -const char kExperimentalSecurityFeaturesDescription[] = - "Enables several security features that will likely break one or more " - "pages that you visit on a daily basis. Strict mixed content checking, for " - "example. And locking powerful features to secure contexts. This flag will " - "probably annoy you."; - -const char kExperimentalWebPlatformFeaturesName[] = - "Experimental Web Platform features"; - -const char kExperimentalWebPlatformFeaturesDescription[] = - "Enables experimental Web Platform features that are in development."; - const char kOriginTrialsName[] = "Origin Trials"; const char kOriginTrialsDescription[] = "Enables origin trials for controlling access to feature/API experiments."; -const char kBleAdvertisingInExtensionsName[] = "BLE Advertising in Chrome Apps"; - -const char kBleAdvertisingInExtensionsDescription[] = - "Enables BLE Advertising in Chrome Apps. BLE Advertising might interfere " - "with regular use of Bluetooth Low Energy features."; - -const char kDevtoolsExperimentsName[] = "Developer Tools experiments"; - -const char kDevtoolsExperimentsDescription[] = - "Enables Developer Tools experiments. Use Settings panel in Developer " - "Tools to toggle individual experiments."; - const char kSilentDebuggerExtensionApiName[] = "Silent Debugging"; const char kSilentDebuggerExtensionApiDescription[] = @@ -894,12 +1200,6 @@ const char kPreferHtmlOverPluginsDescription[] = "Prefer HTML content by hiding Flash from the list of plugins."; -const char kAllowNaclSocketApiName[] = "NaCl Socket API."; - -const char kAllowNaclSocketApiDescription[] = - "Allows applications to use NaCl Socket API. Use only to test NaCl " - "plugins."; - const char kRunAllFlashInAllowModeName[] = R"*(Run all Flash content when Flash setting is set to "allow")*"; @@ -956,20 +1256,6 @@ #endif // defined(OS_CHROMEOS) -const char kAcceleratedVideoDecodeName[] = "Hardware-accelerated video decode"; - -const char kAcceleratedVideoDecodeDescription[] = - "Hardware-accelerated video decode where available."; - -const char kEnableHDRName[] = "HDR mode"; - -const char kEnableHDRDescription[] = - "Enables HDR support on compatible displays."; - -const char kCloudImportName[] = "Cloud Import"; - -const char kCloudImportDescription[] = "Allows the cloud-import feature."; - const char kRequestTabletSiteName[] = "Request tablet site option in the settings menu"; @@ -979,18 +1265,6 @@ "changed to indicate a tablet device. Web content optimized for tablets is " "received there after for the current tab."; -const char kDebugPackedAppName[] = "Debugging for packed apps"; - -const char kDebugPackedAppDescription[] = - "Enables debugging context menu options such as Inspect Element for packed " - "applications."; - -const char kDropSyncCredentialName[] = - "Drop sync credentials from password manager"; - -const char kDropSyncCredentialDescription[] = - "The password manager will not offer to save the credential used to sync."; - const char kPasswordGenerationName[] = "Password generation"; const char kPasswordGenerationDescription[] = @@ -1021,13 +1295,6 @@ "Match Autofill suggestions based on substrings (token prefixes) rather " "than just prefixes."; -const char kAffiliationBasedMatchingName[] = - "Affiliation based matching in password manager"; - -const char kAffiliationBasedMatchingDescription[] = - "Allow credentials stored for Android applications to be filled into " - "corresponding websites."; - const char kProtectSyncCredentialName[] = "Autofill sync credential"; const char kProtectSyncCredentialDescription[] = @@ -1057,26 +1324,6 @@ "running after the last window is closed, and to launch at OS startup, if " "the Push API needs it."; -const char kEnableNavigationTracingName[] = "Enable navigation tracing"; - -const char kEnableNavigationTracingDescription[] = - "This is to be used in conjunction with the trace-upload-url flag. " - "WARNING: When enabled, Chrome will record performance data for every " - "navigation and upload it to the URL specified by the trace-upload-url " - "flag. The trace may include personally identifiable information (PII) " - "such as the titles and URLs of websites you visit."; - -const char kEnableNetworkServiceName[] = "Enable network service"; - -const char kEnableNetworkServiceDescription[] = - "Enables the network service, which makes network requests through a " - "separate service. Note: most features don't work with this yet."; - -const char kEnablePictureInPictureName[] = "Enable picture in picture."; - -const char kEnablePictureInPictureDescription[] = - "Enable the picture in picture feature for videos."; - const char kTraceUploadUrlName[] = "Trace label for navigation tracing"; const char kTraceUploadUrlDescription[] = @@ -1085,24 +1332,6 @@ "This will choose the destination the traces are uploaded to. If you are " "not sure, select other. If left empty, no traces will be uploaded."; -const char kDisableAudioForDesktopShareName[] = - "Disable Audio For Desktop Share"; - -const char kDisableAudioForDesktopShareDescription[] = - "With this flag on, desktop share picker window will not let the user " - "choose whether to share audio."; - -const char kDisableNightLightName[] = "Disable Night Light"; -const char kDisableNightLightDescription[] = - "Disable the Night Light feature which controls the color temperature of " - "the screen."; - -const char kDisableTabForDesktopShareName[] = - "Disable Desktop Share with tab source"; - -const char kDisableTabForDesktopShareDescription[] = - "This flag controls whether users can choose a tab for desktop share."; - const char kTraceUploadUrlChoiceOther[] = "Other"; const char kTraceUploadUrlChoiceEmloading[] = "emloading"; @@ -1123,12 +1352,6 @@ "Enable App Launcher sync. This also enables Folders where available (non " "OSX)."; -const char kDriveSearchInChromeLauncherName[] = - "Drive Search in Chrome App Launcher"; - -const char kDriveSearchInChromeLauncherDescription[] = - "Files from Drive will show up when searching the Chrome App Launcher."; - const char kV8CacheOptionsName[] = "V8 caching mode."; const char kV8CacheOptionsDescription[] = @@ -1160,56 +1383,6 @@ "Enable web pages to use the experimental service worker navigation " "preload API."; -// Data Reduction Proxy - -const char kDataReductionProxyLoFiName[] = "Data Saver Lo-Fi mode"; - -const char kDataReductionProxyLoFiDescription[] = - "Forces Data Saver Lo-Fi mode to be always enabled, enabled only on " - "cellular connections, or disabled. Data Saver must be enabled for Lo-Fi " - "mode to be used."; - -const char kDataReductionProxyLoFiAlwaysOn[] = "Always on"; - -const char kDataReductionProxyLoFiCellularOnly[] = "Cellular only"; - -const char kDataReductionProxyLoFiDisabled[] = "Disable"; - -const char kDataReductionProxyLoFiSlowConnectionsOnly[] = - "Slow connections only"; - -const char kEnableDataReductionProxyLitePageName[] = - "Lite pages for Data Saver Lo-Fi mode"; - -const char kEnableDataReductionProxyLitePageDescription[] = - "Enable lite pages in Data Saver Lo-Fi mode. Previews of pages will be " - "shown instead of image placeholders when Lo-Fi is on. Data Saver and " - "Lo-Fi must be enabled for lite pages to be shown."; - -const char kDataReductionProxyServerAlternative[] = - "Use alternative server configuration"; - -const char kEnableDataReductionProxyServerExperimentName[] = - "Use an alternative Data Saver back end configuration."; - -const char kEnableDataReductionProxyServerExperimentDescription[] = - "Enable a different approach to saving data by configuring the back end " - "server"; - -const char kDataReductionProxyCarrierTestName[] = - "Enable a carrier-specific Data Reduction Proxy for testing."; - -const char kDataReductionProxyCarrierTestDescription[] = - "Use a carrier-specific Data Reduction Proxy for testing."; - -const char kEnableDataReductionProxySavingsPromoName[] = - "Data Saver 1 MB Savings Promo"; - -const char kEnableDataReductionProxySavingsPromoDescription[] = - "Enable a Data Saver promo for 1 MB of savings. If Data Saver has already " - "saved 1 MB of data, then the promo will not be shown. Data Saver must be " - "enabled for the promo to be shown."; - #if defined(OS_ANDROID) const char kEnableDataReductionProxyMainMenuName[] = @@ -1229,11 +1402,6 @@ const char kEnableOfflinePreviewsDescription[] = "Enable showing offline page previews on slow networks."; -const char kEnableClientLoFiName[] = "Client-side Lo-Fi previews"; - -const char kEnableClientLoFiDescription[] = - "Enable showing low fidelity images on some pages on slow networks."; - #endif // defined(OS_ANDROID) const char kLcdTextName[] = "LCD text antialiasing"; @@ -1242,41 +1410,11 @@ "If disabled, text is rendered with grayscale antialiasing instead of LCD " "(subpixel) when doing accelerated compositing."; -const char kDistanceFieldTextName[] = "Distance field text"; - -const char kDistanceFieldTextDescription[] = - "Text is rendered with signed distance fields rather than bitmap alpha " - "masks."; - const char kZeroCopyName[] = "Zero-copy rasterizer"; const char kZeroCopyDescription[] = "Raster threads write directly to GPU memory associated with tiles."; -const char kDefaultTileWidthName[] = "Default tile width"; - -const char kDefaultTileWidthDescription[] = "Specify the default tile width."; - -const char kDefaultTileWidthShort[] = "128"; - -const char kDefaultTileWidthTall[] = "256"; - -const char kDefaultTileWidthGrande[] = "512"; - -const char kDefaultTileWidthVenti[] = "1024"; - -const char kDefaultTileHeightName[] = "Default tile height"; - -const char kDefaultTileHeightDescription[] = "Specify the default tile height."; - -const char kDefaultTileHeightShort[] = "128"; - -const char kDefaultTileHeightTall[] = "256"; - -const char kDefaultTileHeightGrande[] = "512"; - -const char kDefaultTileHeightVenti[] = "1024"; - const char kNumRasterThreadsName[] = "Number of raster threads"; const char kNumRasterThreadsDescription[] = @@ -1415,12 +1553,6 @@ "Enable cross-platform HarfBuzz layout engine for UI text. Doesn't affect " "web content."; -const char kEmbeddedExtensionOptionsName[] = "Embedded extension options"; - -const char kEmbeddedExtensionOptionsDescription[] = - "Display extension options as an embedded element in chrome://extensions " - "rather than opening a new tab."; - const char kTabAudioMutingName[] = "Tab audio muting UI control"; const char kTabAudioMutingDescription[] = @@ -1428,22 +1560,6 @@ "mute controls. This also adds commands in the tab context menu for " "quickly muting multiple selected tabs."; -const char kEasyUnlockBluetoothLowEnergyDiscoveryName[] = - "Smart Lock Bluetooth Low Energy Discovery"; - -const char kEasyUnlockBluetoothLowEnergyDiscoveryDescription[] = - "Enables a Smart Lock setting that allows Chromebook to discover phones " - "over Bluetooth Low Energy in order to unlock the Chromebook when the " - "phone is in its proximity."; - -const char kEasyUnlockProximityDetectionName[] = - "Smart Lock proximity detection"; - -const char kEasyUnlockProximityDetectionDescription[] = - "Enables a Smart Lock setting that restricts unlocking to only work when " - "your phone is very close to (roughly, within an arm's length of) the " - "Chrome device."; - const char kWifiCredentialSyncName[] = "WiFi credential sync"; const char kWifiCredentialSyncDescription[] = @@ -1457,15 +1573,6 @@ const char kSyncSandboxDescription[] = "Connects to the testing server for Chrome Sync."; -const char kDatasaverPromptName[] = "Cellular Data Saver Prompt"; - -const char kDatasaverPromptDescription[] = - "Enables a prompt, which appears when a cellular network connection is " - "detected, to take the user to the Data Saver extension page on Chrome Web " - "Store."; - -const char kDatasaverPromptDemoMode[] = "Demo mode"; - const char kTrySupportedChannelLayoutsName[] = "Causes audio output streams to check if channel layouts other than the " "default hardware layout are available."; @@ -1530,12 +1637,6 @@ "A simplified new user experience when entering page-triggered full screen " "or mouse pointer lock states."; -const char kExperimentalKeyboardLockUiName[] = "Experimental keyboard lock UI."; - -const char kExperimentalKeyboardLockUiDescription[] = - "An experimental full screen with keyboard lock mode requiring users to " - "hold Esc to exit."; - #if defined(OS_ANDROID) extern const char kPayWithGoogleV1Name[] = "Pay with Google v1"; @@ -1581,13 +1682,6 @@ #endif // defined(OS_ANDROID) -const char kDisallowDocWrittenScriptsUiName[] = - "Block scripts loaded via document.write"; - -const char kDisallowDocWrittenScriptsUiDescription[] = - "Disallows fetches for third-party parser-blocking scripts inserted into " - "the main frame via document.write."; - #if defined(OS_WIN) const char kEnableAppcontainerName[] = "Enable AppContainer Lockdown."; @@ -1645,11 +1739,6 @@ #endif // defined(OS_WIN) || defined(OS_LINUX) -const char kEnableGroupedHistoryName[] = "Group history by domain"; - -const char kEnableGroupedHistoryDescription[] = - "Group history by website domain (i.e. google.com) on chrome://history."; - const char kSaveasMenuLabelExperimentName[] = "Switch 'Save as' menu labels to 'Download'"; @@ -1657,12 +1746,6 @@ "Enables an experiment to switch menu labels that use 'Save as...' to " "'Download'."; -const char kEnableEnumeratingAudioDevicesName[] = - "Experimentally enable enumerating audio devices."; - -const char kEnableEnumeratingAudioDevicesDescription[] = - "Experimentally enable the use of enumerating audio devices."; - const char kNewUsbBackendName[] = "Enable new USB backend"; const char kNewUsbBackendDescription[] = @@ -1676,27 +1759,12 @@ "conversions, dictionary definitions, sports scores, translations, and " "when is."; -const char kEnableZeroSuggestRedirectToChromeName[] = - "Experimental contextual omnibox suggestion"; - -const char kEnableZeroSuggestRedirectToChromeDescription[] = - "Change omnibox contextual suggestions to an experimental source. Note " - "that this is not an on/off switch for contextual omnibox and it only " - "applies to suggestions provided before the user starts typing a URL or a " - "search query (i.e. zero suggest)."; - const char kFillOnAccountSelectName[] = "Fill passwords on account selection"; const char kFillOnAccountSelectDescription[] = "Filling of passwords when an account is explicitly selected by the user " "rather than autofilling credentials on page load."; -const char kEnableClearBrowsingDataCountersName[] = - "Enable Clear browsing data counters."; - -const char kEnableClearBrowsingDataCountersDescription[] = - "Shows data volume counters in the Clear browsing data dialog."; - #if defined(OS_ANDROID) const char kTabsInCbdName[] = "Enable tabs for the Clear Browsing Data dialog."; @@ -1721,13 +1789,6 @@ #endif // defined(OS_ANDROID) -const char kEnableWebNotificationCustomLayoutsName[] = - "Enable custom layouts for Web Notifications."; - -const char kEnableWebNotificationCustomLayoutsDescription[] = - "Enable custom layouts for Web Notifications. They will have subtle layout " - "improvements that are otherwise not possible."; - const char kGoogleProfileInfoName[] = "Google profile name and icon"; const char kGoogleProfileInfoDescription[] = @@ -1846,13 +1907,6 @@ #endif // defined(OS_CHROMEOS) -// Strings for controlling credit card assist feature in about:flags. - -const char kCreditCardAssistName[] = "Credit Card Assisted Filling"; - -const char kCreditCardAssistDescription[] = - "Enable assisted credit card filling on certain sites."; - // Strings for controlling credit card scanning feature in about:flags. // Simple Cache Backend experiment. @@ -1894,22 +1948,6 @@ "a separate process from the top document. In this mode, iframes from " "different third-party sites will be allowed to share a process."; -// Cross process guest frames isolation mode - -const char kCrossProcessGuestViewIsolationName[] = - "Cross process frames for guests"; - -const char kCrossProcessGuestViewIsolationDescription[] = - "Highly experimental where guests such as <webview> are implemented on " - "the out-of-process iframe infrastructure."; - -// Task Scheduler - -const char kBrowserTaskSchedulerName[] = "Task Scheduler"; - -const char kBrowserTaskSchedulerDescription[] = - "Enables redirection of some task posting APIs to the task scheduler."; - // Arc authorization #if defined(OS_CHROMEOS) @@ -1992,36 +2030,6 @@ const char kSettingsWindowDescription[] = "Settings will be shown in a dedicated window instead of as a browser tab."; -// Extension Content Verification - -const char kExtensionContentVerificationName[] = - "Extension Content Verification"; - -const char kExtensionContentVerificationDescription[] = - "This flag can be used to turn on verification that the contents of the " - "files on disk for extensions from the webstore match what they're " - "expected to be. This can be used to turn on this feature if it would not " - "otherwise have been turned on, but cannot be used to turn it off (because " - "this setting can be tampered with by malware)."; - -const char kExtensionContentVerificationBootstrap[] = - "Bootstrap (get expected hashes, but do not enforce them)"; - -const char kExtensionContentVerificationEnforce[] = - "Enforce (try to get hashes, and enforce them if successful)"; - -const char kExtensionContentVerificationEnforceStrict[] = - "Enforce strict (hard fail if we can't get hashes)"; - -// Built-in hotword detection display strings - -const char kExperimentalHotwordHardwareName[] = - "Simulated hardware 'Ok Google' features"; - -const char kExperimentalHotwordHardwareDescription[] = - "Enables an experimental version of 'Ok Google' hotword detection features " - "that have a hardware dependency."; - // Message center strings const char kMessageCenterAlwaysScrollUpUponRemovalName[] = @@ -2037,20 +2045,6 @@ const char kMessageCenterNewStyleNotificationDescription[] = "Enables the experiment style of material-design notification"; -const char kCastStreamingHwEncodingName[] = - "Cast Streaming hardware video encoding"; - -const char kCastStreamingHwEncodingDescription[] = - "This option enables support in Cast Streaming for encoding video streams " - "using platform hardware."; - -const char kAllowInsecureLocalhostName[] = - "Allow invalid certificates for resources loaded from localhost."; - -const char kAllowInsecureLocalhostDescription[] = - "Allows requests to localhost over HTTPS even when an invalid certificate " - "is presented."; - #if defined(OS_WIN) || defined(OS_MACOSX) // Tab discarding @@ -2256,41 +2250,6 @@ #endif // defined(OS_ANDROID) -const char kEnableBrotliName[] = "Brotli Content-Encoding."; - -const char kEnableBrotliDescription[] = - "Enable Brotli Content-Encoding support."; - -const char kEnableWebfontsInterventionName[] = - "New version of User Agent Intervention for WebFonts loading."; - -const char kEnableWebfontsInterventionDescription[] = - "Enable New version of User Agent Intervention for WebFonts loading."; - -const char kEnableWebfontsInterventionV2ChoiceDefault[] = "Default"; - -const char kEnableWebfontsInterventionV2ChoiceEnabledWith2g[] = "Enabled: 2G"; - -const char kEnableWebfontsInterventionV2ChoiceEnabledWith3g[] = "Enabled: 3G"; - -const char kEnableWebfontsInterventionV2ChoiceEnabledWithSlow2g[] = - "Enabled: Slow 2G"; - -const char kEnableWebfontsInterventionV2ChoiceDisabled[] = "Disabled"; - -const char kEnableWebfontsInterventionTriggerName[] = - "Trigger User Agent Intervention for WebFonts loading always."; - -const char kEnableWebfontsInterventionTriggerDescription[] = - "Enable to trigger User Agent Intervention for WebFonts loading always. " - "This flag affects only when the intervention is enabled."; - -const char kEnableScrollAnchoringName[] = "Scroll Anchoring"; - -const char kEnableScrollAnchoringDescription[] = - "Adjusts scroll position to prevent visible jumps when offscreen content " - "changes."; - #if defined(OS_CHROMEOS) const char kDisableNativeCupsName[] = "Native CUPS"; @@ -2491,25 +2450,6 @@ #endif // defined(OS_ANDROID) -const char kEnableAutofillCreditCardBankNameDisplayName[] = - "Display the issuer bank name of a credit card in autofill."; - -const char kEnableAutofillCreditCardBankNameDisplayDescription[] = - "If enabled, displays the issuer bank name of a credit card in autofill."; - -const char kEnableAutofillCreditCardLastUsedDateDisplayName[] = - "Display the last used date of a credit card in autofill."; - -const char kEnableAutofillCreditCardLastUsedDateDisplayDescription[] = - "If enabled, display the last used date of a credit card in autofill."; - -const char kEnableAutofillCreditCardUploadCvcPromptName[] = - "Enable requesting missing CVC during Autofill credit card upload"; - -const char kEnableAutofillCreditCardUploadCvcPromptDescription[] = - "If enabled, requests missing CVC when offering to upload credit cards to " - "Google Payments."; - #if !defined(OS_ANDROID) && defined(GOOGLE_CHROME_BUILD) const char kGoogleBrandedContextMenuName[] = @@ -2521,21 +2461,6 @@ #endif // !defined(OS_ANDROID) && defined(GOOGLE_CHROME_BUILD) -const char kEnableWebUsbName[] = "WebUSB"; - -const char kEnableWebUsbDescription[] = "Enable WebUSB support."; - -const char kEnableImageCaptureAPIName[] = "Image Capture API"; - -const char kEnableImageCaptureAPIDescription[] = - "Enables the Web Platform Image Capture API: takePhoto(), " - "getPhotoCapabilities(), etc."; - -const char kEnableGenericSensorName[] = "Generic Sensor"; - -const char kEnableGenericSensorDescription[] = - "Enable sensor APIs based on Generic Sensor API."; - const char kFontCacheScalingName[] = "FontCache scaling"; const char kFontCacheScalingDescription[] = @@ -2628,15 +2553,6 @@ const char kNewAudioRenderingMixingStrategyDescription[] = "Use the new audio rendering mixing strategy."; -// Background video track disabling experiment strings. - -const char kBackgroundVideoTrackOptimizationName[] = - "Optimize background video playback."; - -const char kBackgroundVideoTrackOptimizationDescription[] = - "Disable video tracks when the video is played in the background to " - "optimize performance."; - // New remote playback pipeline experiment strings. const char kNewRemotePlaybackPipelineName[] = @@ -2664,14 +2580,6 @@ "Enter/exit fullscreen when device is rotated to/from the orientation of " "the video. Only on phones."; -// Expensive background timer throttling flag - -const char kExpensiveBackgroundTimerThrottlingName[] = - "Throttle expensive background timers"; - -const char kExpensiveBackgroundTimerThrottlingDescription[] = - "Enables intervention to limit CPU usage of background timers to 1%."; - // Enable default MediaSession flag #if !defined(OS_ANDROID) @@ -2795,14 +2703,6 @@ #endif // defined(OS_ANDROID) -// Web MIDI supports MIDIManager dynamic instantiation chrome://flags strings - -const char kEnableMidiManagerDynamicInstantiationName[] = - "MIDIManager dynamic instantiation for Web MIDI."; - -const char kEnableMidiManagerDynamicInstantiationDescription[] = - "Enable MIDIManager dynamic instantiation for Web MIDI."; - // Desktop iOS promotion chrome://flags strings #if defined(OS_WIN) @@ -2870,16 +2770,13 @@ #if defined(OS_ANDROID) -const char kUseNewDoodleApiName[] = "Use new Doodle API"; +const char kUseDdljsonApiName[] = "Use new ddljson API for Doodles"; -const char kUseNewDoodleApiDescription[] = - "Enables the new API to fetch Doodles for the NTP."; +const char kUseDdljsonApiDescription[] = + "Enables the new ddljson API to fetch Doodles for the NTP."; #endif // defined(OS_ANDROID) -const char kDebugShortcutsDescription[] = - "Enables additional keyboard shortcuts that are useful for debugging Ash."; - const char kMemoryAblationName[] = "Memory ablation experiment"; const char kMemoryAblationDescription[] = "Allocates extra memory in the browser process."; @@ -3109,13 +3006,6 @@ #endif // defined(OS_ANDROID) -const char kEnableIdleTimeSpellCheckingName[] = - "Enable idle time spell checker"; - -const char kEnableIdleTimeSpellCheckingDescription[] = - "Make spell-checking code run only when the browser is idle, so that input " - "latency is reduced, especially when editing long articles, emails, etc."; - #if defined(OS_ANDROID) const char kEnableOmniboxClipboardProviderName[] = @@ -3127,22 +3017,6 @@ #endif // defined(OS_ANDROID) -const char kAutoplayPolicyName[] = "Autoplay policy"; - -const char kAutoplayPolicyDescription[] = - "Policy used when deciding if audio or video is allowed to autoplay."; - -const char kAutoplayPolicyNoUserGestureRequired[] = - "No user gesture is required."; - -const char kAutoplayPolicyUserGestureRequired[] = "User gesture is required."; - -const char kAutoplayPolicyUserGestureRequiredForCrossOrigin[] = - "User gesture is required for cross-origin iframes."; - -const char kAutoplayPolicyDocumentUserActivation[] = - "Document user activation is required."; - const char kOmniboxDisplayTitleForCurrentUrlName[] = "Include title for the current URL in the omnibox"; @@ -3204,16 +3078,6 @@ const char kEffectiveConnectionType3GDescription[] = "3G"; const char kEffectiveConnectionType4GDescription[] = "4G"; -const char kEnableHeapProfilingName[] = "Heap profiling"; - -const char kEnableHeapProfilingDescription[] = "Enables heap profiling."; - -const char kEnableHeapProfilingModePseudo[] = "Enabled (pseudo mode)"; - -const char kEnableHeapProfilingModeNative[] = "Enabled (native mode)"; - -const char kEnableHeapProfilingTaskProfiler[] = "Enabled (task mode)"; - const char kUseSuggestionsEvenIfFewFeatureName[] = "Disable minimum for server-side tile suggestions on NTP."; @@ -3221,13 +3085,6 @@ "Request server-side suggestions even if there are only very few of them " "and use them for tiles on the New Tab Page."; -const char kCaptureThumbnailOnLoadFinishedName[] = - "Capture page thumbnail on load finished"; - -const char kCaptureThumbnailOnLoadFinishedDescription[] = - "Capture a page thumbnail (for use on the New Tab page) when the page load " - "finishes, in addition to other times a thumbnail may be captured."; - #if defined(OS_WIN) // Name and description of the flag that enables D3D v-sync.
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index b449e74..5b3fd7b 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -127,9 +127,6 @@ extern const char kDebugShortcutsName[]; extern const char kDebugShortcutsDescription[]; -extern const char kDelayNavigationName[]; -extern const char kDelayNavigationDescription[]; - extern const char kDeviceDiscoveryNotificationsName[]; extern const char kDeviceDiscoveryNotificationsDescription[]; @@ -169,9 +166,6 @@ extern const char kEmbeddedExtensionOptionsName[]; extern const char kEmbeddedExtensionOptionsDescription[]; -extern const char kEnableAdjustableLargeCursorName[]; -extern const char kEnableAdjustableLargeCursorDescription[]; - extern const char kEnableAsmWasmName[]; extern const char kEnableAsmWasmDescription[]; @@ -190,6 +184,9 @@ extern const char kEnableClearBrowsingDataCountersName[]; extern const char kEnableClearBrowsingDataCountersDescription[]; +extern const char kEnableClientLoFiName[]; +extern const char kEnableClientLoFiDescription[]; + extern const char kEnableDataReductionProxyLitePageName[]; extern const char kEnableDataReductionProxyLitePageDescription[]; @@ -304,6 +301,9 @@ extern const char kExperimentalExtensionApisName[]; extern const char kExperimentalExtensionApisDescription[]; +extern const char kExperimentalFullscreenExitUIName[]; +extern const char kExperimentalFullscreenExitUIDescription[]; + extern const char kExperimentalHotwordHardwareName[]; extern const char kExperimentalHotwordHardwareDescription[]; @@ -346,9 +346,6 @@ extern const char kEffectiveConnectionType3GDescription[]; extern const char kEffectiveConnectionType4GDescription[]; -extern const char kExperimentalFullscreenExitUIName[]; -extern const char kExperimentalFullscreenExitUIDescription[]; - extern const char kFillOnAccountSelectName[]; extern const char kFillOnAccountSelectDescription[]; @@ -901,9 +898,6 @@ extern const char kEnableAndroidSpellcheckerDescription[]; extern const char kEnableAndroidSpellcheckerName[]; -extern const char kEnableClientLoFiName[]; -extern const char kEnableClientLoFiDescription[]; - extern const char kEnableConsistentOmniboxGeolocationName[]; extern const char kEnableConsistentOmniboxGeolocationDescription[]; @@ -1138,8 +1132,8 @@ extern const char kUseAndroidMidiApiName[]; extern const char kUseAndroidMidiApiDescription[]; -extern const char kUseNewDoodleApiName[]; -extern const char kUseNewDoodleApiDescription[]; +extern const char kUseDdljsonApiName[]; +extern const char kUseDdljsonApiDescription[]; extern const char kWebPaymentsModifiersName[]; extern const char kWebPaymentsModifiersDescription[];
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc index 4d9f63b..e5eeba76 100644 --- a/chrome/browser/io_thread.cc +++ b/chrome/browser/io_thread.cc
@@ -642,6 +642,9 @@ globals_ = NULL; base::debug::LeakTracker<SystemURLRequestContextGetter>::CheckForLeaks(); + + if (net_log_) + net_log_->ShutDownBeforeTaskScheduler(); } // static
diff --git a/chrome/browser/media/output_protection_impl.cc b/chrome/browser/media/output_protection_impl.cc index 80808f28dd..a4b33b7b 100644 --- a/chrome/browser/media/output_protection_impl.cc +++ b/chrome/browser/media/output_protection_impl.cc
@@ -37,43 +37,42 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); } -void OutputProtectionImpl::QueryStatus(const QueryStatusCallback& callback) { +void OutputProtectionImpl::QueryStatus(QueryStatusCallback callback) { DVLOG(2) << __func__; DCHECK_CURRENTLY_ON(content::BrowserThread::UI); GetProxy()->QueryStatus(base::Bind(&OutputProtectionImpl::OnQueryStatusResult, - weak_factory_.GetWeakPtr(), callback)); + weak_factory_.GetWeakPtr(), + base::Passed(&callback))); } -void OutputProtectionImpl::EnableProtection( - uint32_t desired_protection_mask, - const EnableProtectionCallback& callback) { +void OutputProtectionImpl::EnableProtection(uint32_t desired_protection_mask, + EnableProtectionCallback callback) { DVLOG(2) << __func__; DCHECK_CURRENTLY_ON(content::BrowserThread::UI); GetProxy()->EnableProtection( desired_protection_mask, base::Bind(&OutputProtectionImpl::OnEnableProtectionResult, - weak_factory_.GetWeakPtr(), callback)); + weak_factory_.GetWeakPtr(), base::Passed(&callback))); } -void OutputProtectionImpl::OnQueryStatusResult( - const QueryStatusCallback& callback, - bool success, - uint32_t link_mask, - uint32_t protection_mask) { +void OutputProtectionImpl::OnQueryStatusResult(QueryStatusCallback callback, + bool success, + uint32_t link_mask, + uint32_t protection_mask) { DVLOG(2) << __func__ << ": success=" << success << ", link_mask=" << link_mask << ", protection_mask=" << protection_mask; DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - callback.Run(success, link_mask, protection_mask); + std::move(callback).Run(success, link_mask, protection_mask); } void OutputProtectionImpl::OnEnableProtectionResult( - const EnableProtectionCallback& callback, + EnableProtectionCallback callback, bool success) { DVLOG(2) << __func__ << ": success=" << success; DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - callback.Run(success); + std::move(callback).Run(success); } // Helper function to lazily create the |proxy_| and return it.
diff --git a/chrome/browser/media/output_protection_impl.h b/chrome/browser/media/output_protection_impl.h index dde26d9..b04ff25 100644 --- a/chrome/browser/media/output_protection_impl.h +++ b/chrome/browser/media/output_protection_impl.h
@@ -26,19 +26,19 @@ ~OutputProtectionImpl() final; // media::mojom::OutputProtection implementation. - void QueryStatus(const QueryStatusCallback& callback) final; + void QueryStatus(QueryStatusCallback callback) final; void EnableProtection(uint32_t desired_protection_mask, - const EnableProtectionCallback& callback) final; + EnableProtectionCallback callback) final; private: // Callbacks for QueryStatus and EnableProtection results. // Note: These are bound using weak pointers so that we won't fire |callback| // after the binding is destroyed. - void OnQueryStatusResult(const QueryStatusCallback& callback, + void OnQueryStatusResult(QueryStatusCallback callback, bool success, uint32_t link_mask, uint32_t protection_mask); - void OnEnableProtectionResult(const EnableProtectionCallback& callback, + void OnEnableProtectionResult(EnableProtectionCallback callback, bool success); // Helper function to lazily create the |proxy_| and return it.
diff --git a/chrome/browser/media/router/discovery/BUILD.gn b/chrome/browser/media/router/discovery/BUILD.gn index 34f1b5d8..79ad9c1 100644 --- a/chrome/browser/media/router/discovery/BUILD.gn +++ b/chrome/browser/media/router/discovery/BUILD.gn
@@ -12,6 +12,7 @@ "//base:i18n", "//chrome/app:generated_resources", "//chrome/common:constants", + "//components/cast_channel", "//content/public/browser", "//content/public/common", ] @@ -34,6 +35,8 @@ "dial/parsed_dial_device_description.h", "dial/safe_dial_device_description_parser.cc", "dial/safe_dial_device_description_parser.h", + "mdns/cast_media_sink_service.cc", + "mdns/cast_media_sink_service.h", "mdns/dns_sd_delegate.cc", "mdns/dns_sd_delegate.h", "mdns/dns_sd_device_lister.cc",
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc new file mode 100644 index 0000000..1ad648b --- /dev/null +++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc
@@ -0,0 +1,245 @@ +// Copyright 2017 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 "chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h" + +#include "base/memory/ptr_util.h" +#include "chrome/browser/browser_process.h" +#include "chrome/common/media_router/discovery/media_sink_internal.h" +#include "components/cast_channel/cast_socket_service.h" +#include "components/cast_channel/cast_socket_service_factory.h" +#include "components/net_log/chrome_net_log.h" +#include "content/public/common/content_client.h" +#include "net/base/host_port_pair.h" +#include "net/base/ip_address.h" + +namespace { + +constexpr char kObserverId[] = "browser_observer_id"; + +enum ErrorType { + NONE, + NOT_CAST_DEVICE, + MISSING_ID, + MISSING_FRIENDLY_NAME, + MISSING_OR_INVALID_IP_ADDRESS, + MISSING_OR_INVALID_PORT, +}; + +ErrorType CreateCastMediaSink(const media_router::DnsSdService& service, + int channel_id, + bool audio_only, + media_router::MediaSinkInternal* cast_sink) { + DCHECK(cast_sink); + if (service.service_name.find( + media_router::CastMediaSinkService::kCastServiceType) == + std::string::npos) + return ErrorType::NOT_CAST_DEVICE; + + net::IPAddress ip_address; + if (!ip_address.AssignFromIPLiteral(service.ip_address)) + return ErrorType::MISSING_OR_INVALID_IP_ADDRESS; + + std::map<std::string, std::string> service_data; + for (const auto& item : service.service_data) { + // |item| format should be "id=xxxxxx", etc. + size_t split_idx = item.find('='); + if (split_idx == std::string::npos) + continue; + + std::string key = item.substr(0, split_idx); + std::string val = + split_idx < item.length() ? item.substr(split_idx + 1) : ""; + service_data[key] = val; + } + + // When use this "sink" within browser, please note it will have a different + // ID when it is sent to the extension, because it derives a different sink ID + // using the given sink ID. + std::string unique_id = service_data["id"]; + if (unique_id.empty()) + return ErrorType::MISSING_ID; + std::string friendly_name = service_data["fn"]; + if (friendly_name.empty()) + return ErrorType::MISSING_FRIENDLY_NAME; + media_router::MediaSink sink(unique_id, friendly_name, + media_router::MediaSink::IconType::CAST); + + media_router::CastSinkExtraData extra_data; + extra_data.ip_address = ip_address; + extra_data.model_name = service_data["md"]; + extra_data.capabilities = cast_channel::CastDeviceCapability::AUDIO_OUT; + if (!audio_only) + extra_data.capabilities |= cast_channel::CastDeviceCapability::VIDEO_OUT; + extra_data.cast_channel_id = channel_id; + + cast_sink->set_sink(sink); + cast_sink->set_cast_data(extra_data); + + return ErrorType::NONE; +} + +} // namespace + +namespace media_router { + +// static +const char CastMediaSinkService::kCastServiceType[] = "_googlecast._tcp.local"; + +CastMediaSinkService::CastMediaSinkService( + const OnSinksDiscoveredCallback& callback, + content::BrowserContext* browser_context) + : MediaSinkServiceBase(callback) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + cast_socket_service_ = cast_channel::CastSocketServiceFactory::GetInstance() + ->GetForBrowserContext(browser_context); + DCHECK(cast_socket_service_); +} + +CastMediaSinkService::CastMediaSinkService( + const OnSinksDiscoveredCallback& callback, + cast_channel::CastSocketService* cast_socket_service) + : MediaSinkServiceBase(callback), + cast_socket_service_(cast_socket_service) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + DCHECK(cast_socket_service_); +} + +CastMediaSinkService::~CastMediaSinkService() {} + +void CastMediaSinkService::Start() { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + if (dns_sd_registry_) + return; + + dns_sd_registry_ = DnsSdRegistry::GetInstance(); + dns_sd_registry_->AddObserver(this); + dns_sd_registry_->RegisterDnsSdListener(kCastServiceType); + MediaSinkServiceBase::StartTimer(); +} + +void CastMediaSinkService::Stop() { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + if (!dns_sd_registry_) + return; + + dns_sd_registry_->UnregisterDnsSdListener(kCastServiceType); + dns_sd_registry_->RemoveObserver(this); + dns_sd_registry_ = nullptr; + MediaSinkServiceBase::StopTimer(); +} + +void CastMediaSinkService::SetDnsSdRegistryForTest(DnsSdRegistry* registry) { + DCHECK(!dns_sd_registry_); + dns_sd_registry_ = registry; + dns_sd_registry_->AddObserver(this); + dns_sd_registry_->RegisterDnsSdListener(kCastServiceType); + MediaSinkServiceBase::StartTimer(); +} + +void CastMediaSinkService::OnDnsSdEvent( + const std::string& service_type, + const DnsSdRegistry::DnsSdServiceList& services) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + DVLOG(2) << "CastMediaSinkService::OnDnsSdEvent found " << services.size() + << " services"; + + current_sinks_.clear(); + current_services_ = services; + + for (const auto& service : services) { + net::IPAddress ip_address; + if (!ip_address.AssignFromIPLiteral(service.ip_address)) { + DVLOG(2) << "Invalid ip_addresss: " << service.ip_address; + continue; + } + net::HostPortPair host_port_pair = + net::HostPortPair::FromString(service.service_host_port); + + content::BrowserThread::PostTask( + content::BrowserThread::IO, FROM_HERE, + base::Bind(&CastMediaSinkService::OpenChannelOnIOThread, this, service, + net::IPEndPoint(ip_address, host_port_pair.port()))); + } + + MediaSinkServiceBase::RestartTimer(); +} + +void CastMediaSinkService::OpenChannelOnIOThread( + const DnsSdService& service, + const net::IPEndPoint& ip_endpoint) { + auto* observer = cast_socket_service_->GetObserver(kObserverId); + if (!observer) { + observer = new CastSocketObserver(); + cast_socket_service_->AddObserver(kObserverId, base::WrapUnique(observer)); + } + + cast_socket_service_->OpenSocket( + ip_endpoint, g_browser_process->net_log(), + base::Bind(&CastMediaSinkService::OnChannelOpenedOnIOThread, this, + service), + observer); +} + +void CastMediaSinkService::OnChannelOpenedOnIOThread( + const DnsSdService& service, + int channel_id, + cast_channel::ChannelError channel_error) { + if (channel_error != cast_channel::ChannelError::NONE) { + DVLOG(2) << "Fail to open channel " << service.ip_address << ": " + << service.service_host_port + << " [ChannelError]: " << (int)channel_error; + return; + } + + auto* socket = cast_socket_service_->GetSocket(channel_id); + if (!socket) { + DVLOG(2) << "Fail to find socket with [channel_id]: " << channel_id; + return; + } + + content::BrowserThread::PostTask( + content::BrowserThread::UI, FROM_HERE, + base::Bind(&CastMediaSinkService::OnChannelOpenedOnUIThread, this, + service, channel_id, socket->audio_only())); +} + +void CastMediaSinkService::OnChannelOpenedOnUIThread( + const DnsSdService& service, + int channel_id, + bool audio_only) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + MediaSinkInternal sink; + ErrorType error = CreateCastMediaSink(service, channel_id, audio_only, &sink); + if (error != ErrorType::NONE) { + DVLOG(2) << "Fail to create Cast device [error]: " << error; + return; + } + + if (!base::ContainsValue(current_services_, service)) { + DVLOG(2) << "Service data not found in current service data list..."; + return; + } + + DVLOG(2) << "Ading sink to current_sinks_ [id]: " << sink.sink().id(); + current_sinks_.insert(sink); + MediaSinkServiceBase::RestartTimer(); +} + +CastMediaSinkService::CastSocketObserver::CastSocketObserver() {} +CastMediaSinkService::CastSocketObserver::~CastSocketObserver() {} + +void CastMediaSinkService::CastSocketObserver::OnError( + const cast_channel::CastSocket& socket, + cast_channel::ChannelError error_state) { + DVLOG(1) << "OnError [ip_endpoint]: " << socket.ip_endpoint().ToString() + << " [error_state]: " + << cast_channel::ChannelErrorToString(error_state); +} + +void CastMediaSinkService::CastSocketObserver::OnMessage( + const cast_channel::CastSocket& socket, + const cast_channel::CastMessage& message) {} + +} // namespace media_router
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h new file mode 100644 index 0000000..2030c05 --- /dev/null +++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h
@@ -0,0 +1,132 @@ +// Copyright 2017 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 CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_MDNS_CAST_MEDIA_SINK_SERVICE_H_ +#define CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_MDNS_CAST_MEDIA_SINK_SERVICE_H_ + +#include <memory> +#include <set> + +#include "base/gtest_prod_util.h" +#include "base/memory/ref_counted.h" +#include "base/threading/thread_checker.h" +#include "chrome/browser/media/router/discovery/mdns/dns_sd_delegate.h" +#include "chrome/browser/media/router/discovery/mdns/dns_sd_registry.h" +#include "chrome/browser/media/router/discovery/media_sink_service_base.h" +#include "components/cast_channel/cast_channel_enum.h" +#include "components/cast_channel/cast_socket.h" +#include "net/base/ip_endpoint.h" + +namespace cast_channel { +class CastSocketService; +} // namespace cast_channel + +namespace content { +class BrowserContext; +} // namespace content + +namespace media_router { + +// A service which can be used to start background discovery and resolution of +// Cast devices. +// Public APIs should be invoked on the UI thread. +class CastMediaSinkService + : public MediaSinkServiceBase, + public DnsSdRegistry::DnsSdObserver, + public base::RefCountedThreadSafe<CastMediaSinkService> { + public: + CastMediaSinkService(const OnSinksDiscoveredCallback& callback, + content::BrowserContext* browser_context); + + // Used by unit tests. + CastMediaSinkService(const OnSinksDiscoveredCallback& callback, + cast_channel::CastSocketService* cast_socket_service); + + // mDNS service types. + static const char kCastServiceType[]; + + // MediaSinkService implementation + void Start() override; + void Stop() override; + + protected: + // Used to mock out the DnsSdRegistry for testing. + void SetDnsSdRegistryForTest(DnsSdRegistry* registry); + + ~CastMediaSinkService() override; + + private: + // Receives incoming messages and errors and provides additional API context. + class CastSocketObserver : public cast_channel::CastSocket::Observer { + public: + CastSocketObserver(); + ~CastSocketObserver() override; + + // CastSocket::Observer implementation. + void OnError(const cast_channel::CastSocket& socket, + cast_channel::ChannelError error_state) override; + void OnMessage(const cast_channel::CastSocket& socket, + const cast_channel::CastMessage& message) override; + + private: + DISALLOW_COPY_AND_ASSIGN(CastSocketObserver); + }; + + friend class base::RefCountedThreadSafe<CastMediaSinkService>; + friend class CastMediaSinkServiceTest; + + FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestReStartAfterStop); + FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestMultipleStartAndStop); + FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, + TestOnChannelOpenedOnIOThread); + FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, + TestMultipleOnChannelOpenedOnIOThread); + FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestOnDnsSdEvent); + FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestMultipleOnDnsSdEvent); + FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestTimer); + + // DnsSdRegistry::DnsSdObserver implementation + void OnDnsSdEvent(const std::string& service_type, + const DnsSdRegistry::DnsSdServiceList& services) override; + + // Opens cast channel on IO thread. + // |service|: mDNS service description. + // |ip_endpoint|: cast channel's target IP endpoint. + void OpenChannelOnIOThread(const DnsSdService& service, + const net::IPEndPoint& ip_endpoint); + + // Invoked when opening cast channel on IO thread completes. + // |service|: mDNS service description. + // |channel_id|: channel id of newly created cast channel. + // |channel_error|: error encounted when opending cast channel. + void OnChannelOpenedOnIOThread(const DnsSdService& service, + int channel_id, + cast_channel::ChannelError channel_error); + + // Invoked by |OnChannelOpenedOnIOThread| to post task on UI thread. + // |service|: mDNS service description. + // |channel_id|: channel id of newly created cast channel. + // |audio_only|: if cast channel is audio only or not. + void OnChannelOpenedOnUIThread(const DnsSdService& service, + int channel_id, + bool audio_only); + + // Raw pointer to DnsSdRegistry instance, which is a global leaky singleton + // and lives as long as the browser process. + DnsSdRegistry* dns_sd_registry_ = nullptr; + + // Service list from current round of discovery. + DnsSdRegistry::DnsSdServiceList current_services_; + + // Service managing creating and removing cast channels. + scoped_refptr<cast_channel::CastSocketService> cast_socket_service_; + + THREAD_CHECKER(thread_checker_); + + DISALLOW_COPY_AND_ASSIGN(CastMediaSinkService); +}; + +} // namespace media_router + +#endif // CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_MDNS_CAST_MEDIA_SINK_SERVICE_H_
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc new file mode 100644 index 0000000..7e12a975 --- /dev/null +++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
@@ -0,0 +1,309 @@ +// Copyright 2017 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 "chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h" +#include "base/strings/stringprintf.h" +#include "base/test/mock_callback.h" +#include "base/timer/mock_timer.h" +#include "chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.h" +#include "chrome/browser/media/router/test_helper.h" +#include "chrome/test/base/testing_profile.h" +#include "components/cast_channel/cast_socket.h" +#include "components/cast_channel/cast_socket_service.h" +#include "components/cast_channel/cast_test_util.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using ::testing::_; +using ::testing::Return; +using ::testing::SaveArg; + +namespace { + +net::IPEndPoint CreateIPEndPoint(int num) { + net::IPAddress ip_address; + CHECK(ip_address.AssignFromIPLiteral( + base::StringPrintf("192.168.0.10%d", num))); + return net::IPEndPoint(ip_address, 8009 + num); +} + +media_router::DnsSdService CreateDnsService(int num) { + net::IPEndPoint ip_endpoint = CreateIPEndPoint(num); + media_router::DnsSdService service; + service.service_name = + "_myDevice." + + std::string(media_router::CastMediaSinkService::kCastServiceType); + service.ip_address = ip_endpoint.address().ToString(); + service.service_host_port = ip_endpoint.ToString(); + service.service_data.push_back(base::StringPrintf("id=service %d", num)); + service.service_data.push_back( + base::StringPrintf("fn=friendly name %d", num)); + service.service_data.push_back(base::StringPrintf("md=model name %d", num)); + + return service; +} + +void VerifyMediaSinkInternal(const media_router::MediaSinkInternal& cast_sink, + const media_router::DnsSdService& service, + int channel_id, + bool audio_only) { + std::string id = base::StringPrintf("service %d", channel_id); + std::string name = base::StringPrintf("friendly name %d", channel_id); + std::string model_name = base::StringPrintf("model name %d", channel_id); + EXPECT_EQ(id, cast_sink.sink().id()); + EXPECT_EQ(name, cast_sink.sink().name()); + EXPECT_EQ(model_name, cast_sink.cast_data().model_name); + EXPECT_EQ(service.ip_address, cast_sink.cast_data().ip_address.ToString()); + + int capabilities = cast_channel::CastDeviceCapability::AUDIO_OUT; + if (!audio_only) + capabilities |= cast_channel::CastDeviceCapability::VIDEO_OUT; + EXPECT_EQ(capabilities, cast_sink.cast_data().capabilities); + EXPECT_EQ(channel_id, cast_sink.cast_data().cast_channel_id); +} + +} // namespace + +namespace media_router { + +class MockCastSocketService : public cast_channel::CastSocketService { + public: + MOCK_METHOD4(OpenSocket, + int(const net::IPEndPoint& ip_endpoint, + net::NetLog* net_log, + const cast_channel::CastSocket::OnOpenCallback& open_cb, + cast_channel::CastSocket::Observer* observer)); + MOCK_CONST_METHOD1(GetSocket, cast_channel::CastSocket*(int channel_id)); + + private: + ~MockCastSocketService() {} +}; + +class CastMediaSinkServiceTest : public ::testing::Test { + public: + CastMediaSinkServiceTest() + : mock_cast_socket_service_(new MockCastSocketService()), + media_sink_service_( + new CastMediaSinkService(mock_sink_discovered_cb_.Get(), + mock_cast_socket_service_.get())), + test_dns_sd_registry_(media_sink_service_.get()) {} + + void SetUp() override { + auto mock_timer = base::MakeUnique<base::MockTimer>( + true /*retain_user_task*/, false /*is_repeating*/); + mock_timer_ = mock_timer.get(); + media_sink_service_->SetTimerForTest(std::move(mock_timer)); + } + + protected: + const content::TestBrowserThreadBundle thread_bundle_; + TestingProfile profile_; + + base::MockCallback<MediaSinkService::OnSinksDiscoveredCallback> + mock_sink_discovered_cb_; + scoped_refptr<MockCastSocketService> mock_cast_socket_service_; + scoped_refptr<CastMediaSinkService> media_sink_service_; + MockDnsSdRegistry test_dns_sd_registry_; + base::MockTimer* mock_timer_; + + DISALLOW_COPY_AND_ASSIGN(CastMediaSinkServiceTest); +}; + +TEST_F(CastMediaSinkServiceTest, TestReStartAfterStop) { + EXPECT_CALL(test_dns_sd_registry_, AddObserver(media_sink_service_.get())) + .Times(2); + EXPECT_CALL(test_dns_sd_registry_, RegisterDnsSdListener(_)).Times(2); + EXPECT_FALSE(mock_timer_->IsRunning()); + media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_); + media_sink_service_->Start(); + EXPECT_TRUE(mock_timer_->IsRunning()); + + EXPECT_CALL(test_dns_sd_registry_, RemoveObserver(media_sink_service_.get())); + EXPECT_CALL(test_dns_sd_registry_, UnregisterDnsSdListener(_)); + media_sink_service_->Stop(); + + mock_timer_ = + new base::MockTimer(true /*retain_user_task*/, false /*is_repeating*/); + media_sink_service_->SetTimerForTest(base::WrapUnique(mock_timer_)); + media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_); + media_sink_service_->Start(); + EXPECT_TRUE(mock_timer_->IsRunning()); +} + +TEST_F(CastMediaSinkServiceTest, TestMultipleStartAndStop) { + EXPECT_CALL(test_dns_sd_registry_, AddObserver(media_sink_service_.get())); + EXPECT_CALL(test_dns_sd_registry_, RegisterDnsSdListener(_)); + media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_); + media_sink_service_->Start(); + media_sink_service_->Start(); + EXPECT_TRUE(mock_timer_->IsRunning()); + + EXPECT_CALL(test_dns_sd_registry_, RemoveObserver(media_sink_service_.get())); + EXPECT_CALL(test_dns_sd_registry_, UnregisterDnsSdListener(_)); + media_sink_service_->Stop(); + media_sink_service_->Stop(); +} + +TEST_F(CastMediaSinkServiceTest, TestOnChannelOpenedOnIOThread) { + DnsSdService service = CreateDnsService(1); + cast_channel::MockCastSocket socket; + EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) + .WillOnce(Return(&socket)); + + media_sink_service_->current_services_.push_back(service); + media_sink_service_->OnChannelOpenedOnIOThread( + service, 1, cast_channel::ChannelError::NONE); + // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread. + base::RunLoop().RunUntilIdle(); + + // Verify sink content + EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size()); + for (const auto& sink_it : media_sink_service_->current_sinks_) + VerifyMediaSinkInternal(sink_it, service, 1, false); +} + +TEST_F(CastMediaSinkServiceTest, TestMultipleOnChannelOpenedOnIOThread) { + DnsSdService service1 = CreateDnsService(1); + DnsSdService service2 = CreateDnsService(2); + DnsSdService service3 = CreateDnsService(3); + + cast_channel::MockCastSocket socket2; + cast_channel::MockCastSocket socket3; + // Fail to open channel 1. + EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) + .WillOnce(Return(nullptr)); + EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2)) + .WillOnce(Return(&socket2)); + EXPECT_CALL(*mock_cast_socket_service_, GetSocket(3)) + .WillOnce(Return(&socket2)); + + // Current round of Dns discovery finds service1 and service 2. + media_sink_service_->current_services_.push_back(service1); + media_sink_service_->current_services_.push_back(service2); + media_sink_service_->OnChannelOpenedOnIOThread( + service1, 1, cast_channel::ChannelError::NONE); + media_sink_service_->OnChannelOpenedOnIOThread( + service2, 2, cast_channel::ChannelError::NONE); + media_sink_service_->OnChannelOpenedOnIOThread( + service3, 3, cast_channel::ChannelError::NONE); + // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread. + base::RunLoop().RunUntilIdle(); + + // Verify sink content + EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size()); + for (const auto& sink_it : media_sink_service_->current_sinks_) + VerifyMediaSinkInternal(sink_it, service2, 2, false); +} + +TEST_F(CastMediaSinkServiceTest, TestOnDnsSdEvent) { + DnsSdService service1 = CreateDnsService(1); + DnsSdService service2 = CreateDnsService(2); + net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); + net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2); + + // Add dns services. + DnsSdRegistry::DnsSdServiceList service_list{service1, service2}; + + cast_channel::CastSocket::OnOpenCallback callback1; + cast_channel::CastSocket::OnOpenCallback callback2; + EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _)) + .WillOnce(DoAll(SaveArg<2>(&callback1), Return(1))); + EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _)) + .WillOnce(DoAll(SaveArg<2>(&callback2), Return(2))); + + // Invoke CastSocketService::OpenSocket on the IO thread. + media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType, + service_list); + base::RunLoop().RunUntilIdle(); + + cast_channel::MockCastSocket socket1; + cast_channel::MockCastSocket socket2; + + EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) + .WillOnce(Return(&socket1)); + EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2)) + .WillOnce(Return(&socket2)); + + callback1.Run(1, cast_channel::ChannelError::NONE); + callback2.Run(2, cast_channel::ChannelError::NONE); + + // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread. + base::RunLoop().RunUntilIdle(); + // Verify sink content + EXPECT_EQ(size_t(2), media_sink_service_->current_sinks_.size()); +} + +TEST_F(CastMediaSinkServiceTest, TestMultipleOnDnsSdEvent) { + DnsSdService service1 = CreateDnsService(1); + DnsSdService service2 = CreateDnsService(2); + DnsSdService service3 = CreateDnsService(3); + net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); + net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2); + net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3); + + // 1st round finds service 1 & 2. + DnsSdRegistry::DnsSdServiceList service_list1{service1, service2}; + media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType, + service_list1); + + EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _)); + EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _)); + base::RunLoop().RunUntilIdle(); + + // Channel 2 opened. + media_sink_service_->OnChannelOpenedOnUIThread(service2, 2, false); + + // 2nd round finds service 2 & 3. + DnsSdRegistry::DnsSdServiceList service_list2{service2, service3}; + media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType, + service_list2); + + EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _)); + EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint3, _, _, _)); + base::RunLoop().RunUntilIdle(); + + // Channel 1 and 3 opened. + media_sink_service_->OnChannelOpenedOnUIThread(service1, 1, false); + media_sink_service_->OnChannelOpenedOnUIThread(service3, 3, false); + + EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size()); + for (const auto& sink_it : media_sink_service_->current_sinks_) + VerifyMediaSinkInternal(sink_it, service3, 3, false); +} + +TEST_F(CastMediaSinkServiceTest, TestTimer) { + DnsSdService service1 = CreateDnsService(1); + DnsSdService service2 = CreateDnsService(2); + net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); + net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2); + + EXPECT_FALSE(mock_timer_->IsRunning()); + // finds service 1 & 2. + DnsSdRegistry::DnsSdServiceList service_list1{service1, service2}; + media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType, + service_list1); + + EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _)); + EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _)); + base::RunLoop().RunUntilIdle(); + + // Channel 2 is opened. + media_sink_service_->OnChannelOpenedOnUIThread(service2, 2, false); + + std::vector<MediaSinkInternal> sinks; + EXPECT_CALL(mock_sink_discovered_cb_, Run(_)).WillOnce(SaveArg<0>(&sinks)); + + // Fire timer. + mock_timer_->Fire(); + EXPECT_EQ(size_t(1), sinks.size()); + VerifyMediaSinkInternal(sinks[0], service2, 2, false); + + EXPECT_FALSE(mock_timer_->IsRunning()); + // Channel 1 is opened and timer is restarted. + media_sink_service_->OnChannelOpenedOnUIThread(service1, 1, false); + EXPECT_TRUE(mock_timer_->IsRunning()); +} + +} // namespace media_router
diff --git a/chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.cc b/chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.cc index 2e8f055a..dd32a7f 100644 --- a/chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.cc +++ b/chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.cc
@@ -7,7 +7,7 @@ namespace media_router { MockDnsSdRegistry::MockDnsSdRegistry(DnsSdRegistry::DnsSdObserver* observer) - : observer_(observer) {} + : DnsSdRegistry(nullptr), observer_(observer) {} MockDnsSdRegistry::~MockDnsSdRegistry() {}
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc index ee3c4c6..3c7d8bf 100644 --- a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc +++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
@@ -16,6 +16,7 @@ #include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "chrome/browser/media/router/discovery/dial/dial_media_sink_service_proxy.h" +#include "chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h" #include "chrome/browser/media/router/event_page_request_manager.h" #include "chrome/browser/media/router/event_page_request_manager_factory.h" #include "chrome/browser/media/router/issues_observer.h" @@ -429,8 +430,8 @@ void MediaRouterMojoImpl::ProvideSinks(const std::string& provider_name, std::vector<MediaSinkInternal> sinks) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - DVLOG_WITH_INSTANCE(1) << "OnDialMediaSinkDiscovered found " << sinks.size() - << " devices..."; + DVLOG_WITH_INSTANCE(1) << "Provider [" << provider_name << "] found " + << sinks.size() << " devices..."; event_page_request_manager_->RunOrDefer( base::Bind(&MediaRouterMojoImpl::DoProvideSinks, @@ -941,8 +942,7 @@ } #endif - if (media_router::DialLocalDiscoveryEnabled()) - StartDiscovery(); + StartDiscovery(); } #if defined(OS_WIN) @@ -976,14 +976,25 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DVLOG_WITH_INSTANCE(1) << "StartDiscovery"; - if (!dial_media_sink_service_proxy_) { - dial_media_sink_service_proxy_ = new DialMediaSinkServiceProxy( - base::Bind(&MediaRouterMojoImpl::ProvideSinks, - weak_factory_.GetWeakPtr(), "dial"), - context_); + if (media_router::DialLocalDiscoveryEnabled()) { + if (!dial_media_sink_service_proxy_) { + dial_media_sink_service_proxy_ = new DialMediaSinkServiceProxy( + base::Bind(&MediaRouterMojoImpl::ProvideSinks, + weak_factory_.GetWeakPtr(), "dial"), + context_); + } + dial_media_sink_service_proxy_->Start(); } - dial_media_sink_service_proxy_->Start(); + if (media_router::CastDiscoveryEnabled()) { + if (!cast_media_sink_service_) { + cast_media_sink_service_ = new CastMediaSinkService( + base::Bind(&MediaRouterMojoImpl::ProvideSinks, + weak_factory_.GetWeakPtr(), "cast"), + context_); + } + cast_media_sink_service_->Start(); + } } void MediaRouterMojoImpl::UpdateMediaSinks(
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.h b/chrome/browser/media/router/mojo/media_router_mojo_impl.h index 01cb711..3e9627c 100644 --- a/chrome/browser/media/router/mojo/media_router_mojo_impl.h +++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.h
@@ -44,6 +44,7 @@ namespace media_router { enum class MediaRouteProviderWakeReason; +class CastMediaSinkService; class DialMediaSinkServiceProxy; class EventPageRequestManager; @@ -415,6 +416,9 @@ // Media sink service for DIAL devices. scoped_refptr<DialMediaSinkServiceProxy> dial_media_sink_service_proxy_; + // Media sink service for CAST devices. + scoped_refptr<CastMediaSinkService> cast_media_sink_service_; + content::BrowserContext* const context_; // Request manager responsible for waking the component extension and calling
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_handler.cc b/chrome/browser/media/webrtc/webrtc_event_log_handler.cc index 7ed5871..d8a3a6f 100644 --- a/chrome/browser/media/webrtc/webrtc_event_log_handler.cc +++ b/chrome/browser/media/webrtc/webrtc_event_log_handler.cc
@@ -11,6 +11,7 @@ #include "base/command_line.h" #include "base/files/file_util.h" #include "base/strings/string_number_conversions.h" +#include "base/task_scheduler/post_task.h" #include "base/time/time.h" #include "chrome/browser/media/webrtc/webrtc_log_list.h" #include "chrome/browser/profiles/profile.h" @@ -34,7 +35,10 @@ WebRtcEventLogHandler::WebRtcEventLogHandler(int render_process_id, Profile* profile) - : render_process_id_(render_process_id), + : background_task_runner_(base::CreateSequencedTaskRunnerWithTraits( + {base::MayBlock(), base::WithBaseSyncPrimitives(), + base::TaskPriority::BACKGROUND})), + render_process_id_(render_process_id), profile_(profile), current_rtc_event_log_id_(0) { DCHECK(profile_); @@ -48,8 +52,8 @@ const RecordingErrorCallback& error_callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - BrowserThread::PostTaskAndReplyWithResult( - BrowserThread::FILE, FROM_HERE, + base::PostTaskAndReplyWithResult( + background_task_runner_.get(), FROM_HERE, base::Bind(&WebRtcEventLogHandler::GetLogDirectoryAndEnsureExists, this), base::Bind(&WebRtcEventLogHandler::DoStartWebRtcEventLogging, this, duration, callback, error_callback)); @@ -61,8 +65,8 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); const bool is_manual_stop = true; - BrowserThread::PostTaskAndReplyWithResult( - BrowserThread::FILE, FROM_HERE, + base::PostTaskAndReplyWithResult( + background_task_runner_.get(), FROM_HERE, base::Bind(&WebRtcEventLogHandler::GetLogDirectoryAndEnsureExists, this), base::Bind(&WebRtcEventLogHandler::DoStopWebRtcEventLogging, this, is_manual_stop, current_rtc_event_log_id_, callback, @@ -70,7 +74,7 @@ } base::FilePath WebRtcEventLogHandler::GetLogDirectoryAndEnsureExists() { - DCHECK_CURRENTLY_ON(BrowserThread::FILE); + DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); base::FilePath log_dir_path = WebRtcLogList::GetWebRtcLogDirectoryForProfile(profile_->GetPath()); base::File::Error error;
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_handler.h b/chrome/browser/media/webrtc/webrtc_event_log_handler.h index b02b5e5..9f5c5cf6 100644 --- a/chrome/browser/media/webrtc/webrtc_event_log_handler.h +++ b/chrome/browser/media/webrtc/webrtc_event_log_handler.h
@@ -13,6 +13,7 @@ #include "base/callback.h" #include "base/files/file_path.h" #include "base/memory/ref_counted.h" +#include "base/sequenced_task_runner.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" @@ -65,6 +66,8 @@ const RecordingErrorCallback& error_callback, const base::FilePath& log_directory); + scoped_refptr<base::SequencedTaskRunner> background_task_runner_; + // The ID of our render process. int render_process_id_;
diff --git a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc index 83594d47..d451a34 100644 --- a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc +++ b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
@@ -10,11 +10,13 @@ #include "base/memory/ptr_util.h" #include "base/strings/string_number_conversions.h" #include "base/task_scheduler/post_task.h" +#include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/metrics/chrome_metrics_service_accessor.h" #include "chrome/browser/metrics/chrome_metrics_service_client.h" #include "chrome/browser/metrics/variations/chrome_variations_service_client.h" #include "chrome/browser/metrics/variations/ui_string_overrider_factory.h" +#include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_otr_state.h" #include "chrome/common/chrome_switches.h" #include "chrome/installer/util/google_update_settings.h" @@ -288,5 +290,15 @@ } bool ChromeMetricsServicesManagerClient::IsIncognitoSessionActive() { - return chrome::IsIncognitoSessionActive(); +#if defined(OS_ANDROID) + // TODO(crbug/739971) On Android, we don't get notifications from TabModel + // when incognito tabs are opened, so this won't get re-evaluated reliably + // yet. Assume there always an incognito tab open, which will keep UKM + // disabled. + return true; +#else + // Depending directly on BrowserList, since that is the implementation + // that we get correct notifications for. + return BrowserList::IsIncognitoSessionActive(); +#endif }
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter.cc b/chrome/browser/metrics/process_memory_metrics_emitter.cc index e9098cca..b82634e2 100644 --- a/chrome/browser/metrics/process_memory_metrics_emitter.cc +++ b/chrome/browser/metrics/process_memory_metrics_emitter.cc
@@ -8,6 +8,8 @@ #include "base/trace_event/memory_dump_request_args.h" #include "content/public/common/service_manager_connection.h" #include "content/public/common/service_names.mojom.h" +#include "services/metrics/public/cpp/ukm_entry_builder.h" +#include "services/metrics/public/cpp/ukm_recorder.h" #include "services/service_manager/public/cpp/connector.h" using ProcessMemoryDumpPtr = @@ -15,44 +17,87 @@ namespace { -void EmitBrowserMemoryMetrics(const ProcessMemoryDumpPtr& pmd) { +void EmitBrowserMemoryMetrics(const ProcessMemoryDumpPtr& pmd, + ukm::UkmEntryBuilder* builder) { + builder->AddMetric("ProcessType", + static_cast<int64_t>( + memory_instrumentation::mojom::ProcessType::BROWSER)); + UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Browser2.Resident", pmd->os_dump->resident_set_kb / 1024); + builder->AddMetric("Resident", pmd->os_dump->resident_set_kb / 1024); + UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Browser2.Malloc", pmd->chrome_dump.malloc_total_kb / 1024); + builder->AddMetric("Malloc", pmd->chrome_dump.malloc_total_kb / 1024); + UMA_HISTOGRAM_MEMORY_LARGE_MB( "Memory.Experimental.Browser2.PrivateMemoryFootprint", pmd->os_dump->private_footprint_kb / 1024); + builder->AddMetric("PrivateMemoryFootprint", + pmd->os_dump->private_footprint_kb / 1024); } -void EmitRendererMemoryMetrics(const ProcessMemoryDumpPtr& pmd) { +void EmitRendererMemoryMetrics(const ProcessMemoryDumpPtr& pmd, + ukm::UkmEntryBuilder* builder) { + builder->AddMetric("ProcessType", + static_cast<int64_t>( + memory_instrumentation::mojom::ProcessType::RENDERER)); + UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Renderer2.Resident", pmd->os_dump->resident_set_kb / 1024); + builder->AddMetric("Resident", pmd->os_dump->resident_set_kb / 1024); + + UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Renderer2.Malloc", + pmd->chrome_dump.malloc_total_kb / 1024); + builder->AddMetric("Malloc", pmd->chrome_dump.malloc_total_kb / 1024); + UMA_HISTOGRAM_MEMORY_LARGE_MB( "Memory.Experimental.Renderer2.PrivateMemoryFootprint", pmd->os_dump->private_footprint_kb / 1024); - UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Renderer2.Malloc", - pmd->chrome_dump.malloc_total_kb / 1024); + builder->AddMetric("PrivateMemoryFootprint", + pmd->os_dump->private_footprint_kb / 1024); + UMA_HISTOGRAM_MEMORY_LARGE_MB( "Memory.Experimental.Renderer2.PartitionAlloc", pmd->chrome_dump.partition_alloc_total_kb / 1024); + builder->AddMetric("PartitionAlloc", + pmd->chrome_dump.partition_alloc_total_kb / 1024); + UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Renderer2.BlinkGC", pmd->chrome_dump.blink_gc_total_kb / 1024); + builder->AddMetric("BlinkGC", pmd->chrome_dump.blink_gc_total_kb / 1024); + UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Renderer2.V8", pmd->chrome_dump.v8_total_kb / 1024); + builder->AddMetric("V8", pmd->chrome_dump.v8_total_kb / 1024); } -void EmitGpuMemoryMetrics(const ProcessMemoryDumpPtr& pmd) { +void EmitGpuMemoryMetrics(const ProcessMemoryDumpPtr& pmd, + ukm::UkmEntryBuilder* builder) { + builder->AddMetric( + "ProcessType", + static_cast<int64_t>(memory_instrumentation::mojom::ProcessType::GPU)); + UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Gpu2.Resident", pmd->os_dump->resident_set_kb / 1024); + builder->AddMetric("Resident", pmd->os_dump->resident_set_kb / 1024); + UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Gpu2.Malloc", pmd->chrome_dump.malloc_total_kb / 1024); + builder->AddMetric("Malloc", pmd->chrome_dump.malloc_total_kb / 1024); + UMA_HISTOGRAM_MEMORY_LARGE_MB( "Memory.Experimental.Gpu2.CommandBuffer", pmd->chrome_dump.command_buffer_total_kb / 1024); + builder->AddMetric("CommandBuffer", + pmd->chrome_dump.command_buffer_total_kb / 1024); + UMA_HISTOGRAM_MEMORY_LARGE_MB( "Memory.Experimental.Gpu2.PrivateMemoryFootprint", pmd->os_dump->private_footprint_kb / 1024); + builder->AddMetric("PrivateMemoryFootprint", + pmd->os_dump->private_footprint_kb / 1024); } } // namespace @@ -77,6 +122,16 @@ ProcessMemoryMetricsEmitter::~ProcessMemoryMetricsEmitter() {} +std::unique_ptr<ukm::UkmEntryBuilder> +ProcessMemoryMetricsEmitter::CreateUkmBuilder(const char* event_name) { + ukm::UkmRecorder* ukm_recorder = ukm::UkmRecorder::Get(); + if (!ukm_recorder) + return nullptr; + + const int32_t source_id = ukm_recorder->GetNewSourceID(); + return ukm_recorder->GetEntryBuilder(source_id, event_name); +} + void ProcessMemoryMetricsEmitter::ReceivedMemoryDump( bool success, uint64_t dump_guid, @@ -89,15 +144,23 @@ uint32_t private_footprint_total_kb = 0; for (const ProcessMemoryDumpPtr& pmd : ptr->process_dumps) { private_footprint_total_kb += pmd->os_dump->private_footprint_kb; + + // Populate a new entry for each ProcessMemoryDumpPtr in the global dump, + // annotating each entry with the dump GUID so that entries in the same + // global dump can be correlated with each other. + // TODO(jchinlee): Add URLs. + std::unique_ptr<ukm::UkmEntryBuilder> builder = + CreateUkmBuilder("Memory.Experimental"); + switch (pmd->process_type) { case memory_instrumentation::mojom::ProcessType::BROWSER: - EmitBrowserMemoryMetrics(pmd); + EmitBrowserMemoryMetrics(pmd, builder.get()); break; case memory_instrumentation::mojom::ProcessType::RENDERER: - EmitRendererMemoryMetrics(pmd); + EmitRendererMemoryMetrics(pmd, builder.get()); break; case memory_instrumentation::mojom::ProcessType::GPU: - EmitGpuMemoryMetrics(pmd); + EmitGpuMemoryMetrics(pmd, builder.get()); break; case memory_instrumentation::mojom::ProcessType::UTILITY: case memory_instrumentation::mojom::ProcessType::PLUGIN: @@ -108,4 +171,9 @@ UMA_HISTOGRAM_MEMORY_LARGE_MB( "Memory.Experimental.Total2.PrivateMemoryFootprint", private_footprint_total_kb / 1024); + + std::unique_ptr<ukm::UkmEntryBuilder> builder = + CreateUkmBuilder("Memory.Experimental"); + builder->AddMetric("Total2.PrivateMemoryFootprint", + private_footprint_total_kb / 1024); }
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter.h b/chrome/browser/metrics/process_memory_metrics_emitter.h index 0358a8f..fa91d276 100644 --- a/chrome/browser/metrics/process_memory_metrics_emitter.h +++ b/chrome/browser/metrics/process_memory_metrics_emitter.h
@@ -8,6 +8,10 @@ #include "base/memory/ref_counted.h" #include "services/resource_coordinator/public/interfaces/memory_instrumentation/memory_instrumentation.mojom.h" +namespace ukm { +class UkmEntryBuilder; +} + // This class asynchronously fetches memory metrics for each process, and then // emits UMA metrics from those metrics. // Each instance is self-owned, and will delete itself once it has finished @@ -35,6 +39,9 @@ private: friend class base::RefCountedThreadSafe<ProcessMemoryMetricsEmitter>; + std::unique_ptr<ukm::UkmEntryBuilder> CreateUkmBuilder( + const char* event_name); + memory_instrumentation::mojom::CoordinatorPtr coordinator_; DISALLOW_COPY_AND_ASSIGN(ProcessMemoryMetricsEmitter);
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter_unittest.cc b/chrome/browser/metrics/process_memory_metrics_emitter_unittest.cc new file mode 100644 index 0000000..1b27d2c8 --- /dev/null +++ b/chrome/browser/metrics/process_memory_metrics_emitter_unittest.cc
@@ -0,0 +1,265 @@ +// Copyright 2017 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 "chrome/browser/metrics/process_memory_metrics_emitter.h" + +#include "base/containers/flat_map.h" +#include "base/memory/ref_counted.h" +#include "components/ukm/test_ukm_recorder.h" +#include "testing/gtest/include/gtest/gtest.h" + +using GlobalMemoryDumpPtr = memory_instrumentation::mojom::GlobalMemoryDumpPtr; +using ProcessMemoryDumpPtr = + memory_instrumentation::mojom::ProcessMemoryDumpPtr; +using OSMemDumpPtr = memory_instrumentation::mojom::OSMemDumpPtr; +using ProcessType = memory_instrumentation::mojom::ProcessType; + +namespace { + +// Provide fake to surface ReceivedMemoryDump to public visibility. +class ProcessMemoryMetricsEmitterFake : public ProcessMemoryMetricsEmitter { + public: + ProcessMemoryMetricsEmitterFake() {} + + void ReceivedMemoryDump( + bool success, + uint64_t dump_guid, + memory_instrumentation::mojom::GlobalMemoryDumpPtr ptr) override { + ProcessMemoryMetricsEmitter::ReceivedMemoryDump(success, dump_guid, + std::move(ptr)); + } + + private: + ~ProcessMemoryMetricsEmitterFake() override {} + + DISALLOW_COPY_AND_ASSIGN(ProcessMemoryMetricsEmitterFake); +}; + +void PopulateBrowserMetrics(GlobalMemoryDumpPtr& global_dump, + base::flat_map<const char*, int64_t>& metrics_mb) { + ProcessMemoryDumpPtr pmd( + memory_instrumentation::mojom::ProcessMemoryDump::New()); + pmd->process_type = ProcessType::BROWSER; + pmd->chrome_dump.malloc_total_kb = metrics_mb["Malloc"] * 1024; + OSMemDumpPtr os_dump(memory_instrumentation::mojom::OSMemDump::New( + metrics_mb["Resident"] * 1024, + metrics_mb["PrivateMemoryFootprint"] * 1024)); + pmd->os_dump = std::move(os_dump); + global_dump->process_dumps.push_back(std::move(pmd)); +} + +base::flat_map<const char*, int64_t> GetExpectedBrowserMetrics() { + return base::flat_map<const char*, int64_t>( + { + {"ProcessType", static_cast<int64_t>(ProcessType::BROWSER)}, + {"Resident", 10}, + {"Malloc", 20}, + {"PrivateMemoryFootprint", 30}, + }, + base::KEEP_FIRST_OF_DUPES); +} + +void PopulateRendererMetrics(GlobalMemoryDumpPtr& global_dump, + base::flat_map<const char*, int64_t>& metrics_mb) { + ProcessMemoryDumpPtr pmd( + memory_instrumentation::mojom::ProcessMemoryDump::New()); + pmd->process_type = ProcessType::RENDERER; + pmd->chrome_dump.malloc_total_kb = metrics_mb["Malloc"] * 1024; + pmd->chrome_dump.partition_alloc_total_kb = + metrics_mb["PartitionAlloc"] * 1024; + pmd->chrome_dump.blink_gc_total_kb = metrics_mb["BlinkGC"] * 1024; + pmd->chrome_dump.v8_total_kb = metrics_mb["V8"] * 1024; + OSMemDumpPtr os_dump(memory_instrumentation::mojom::OSMemDump::New( + metrics_mb["Resident"] * 1024, + metrics_mb["PrivateMemoryFootprint"] * 1024)); + pmd->os_dump = std::move(os_dump); + global_dump->process_dumps.push_back(std::move(pmd)); +} + +base::flat_map<const char*, int64_t> GetExpectedRendererMetrics() { + return base::flat_map<const char*, int64_t>( + { + {"ProcessType", static_cast<int64_t>(ProcessType::RENDERER)}, + {"Resident", 110}, + {"Malloc", 120}, + {"PrivateMemoryFootprint", 130}, + {"PartitionAlloc", 140}, + {"BlinkGC", 150}, + {"V8", 160}, + }, + base::KEEP_FIRST_OF_DUPES); +} + +void PopulateGpuMetrics(GlobalMemoryDumpPtr& global_dump, + base::flat_map<const char*, int64_t>& metrics_mb) { + ProcessMemoryDumpPtr pmd( + memory_instrumentation::mojom::ProcessMemoryDump::New()); + pmd->process_type = ProcessType::GPU; + pmd->chrome_dump.malloc_total_kb = metrics_mb["Malloc"] * 1024; + pmd->chrome_dump.command_buffer_total_kb = metrics_mb["CommandBuffer"] * 1024; + OSMemDumpPtr os_dump(memory_instrumentation::mojom::OSMemDump::New( + metrics_mb["Resident"] * 1024, + metrics_mb["PrivateMemoryFootprint"] * 1024)); + pmd->os_dump = std::move(os_dump); + global_dump->process_dumps.push_back(std::move(pmd)); +} + +base::flat_map<const char*, int64_t> GetExpectedGpuMetrics() { + return base::flat_map<const char*, int64_t>( + { + {"ProcessType", static_cast<int64_t>(ProcessType::GPU)}, + {"Resident", 210}, + {"Malloc", 220}, + {"PrivateMemoryFootprint", 230}, + {"CommandBuffer", 240}, + }, + base::KEEP_FIRST_OF_DUPES); +} + +void PopulateMetrics(GlobalMemoryDumpPtr& global_dump, + ProcessType ptype, + base::flat_map<const char*, int64_t>& metrics_mb) { + switch (ptype) { + case ProcessType::BROWSER: + PopulateBrowserMetrics(global_dump, metrics_mb); + return; + case ProcessType::RENDERER: + PopulateRendererMetrics(global_dump, metrics_mb); + return; + case ProcessType::GPU: + PopulateGpuMetrics(global_dump, metrics_mb); + return; + case ProcessType::UTILITY: + case ProcessType::PLUGIN: + case ProcessType::OTHER: + break; + } + + // We shouldn't reach here. + FAIL() << "Unknown process type case " << ptype << "."; +} + +base::flat_map<const char*, int64_t> GetExpectedProcessMetrics( + ProcessType ptype) { + switch (ptype) { + case ProcessType::BROWSER: + return GetExpectedBrowserMetrics(); + case ProcessType::RENDERER: + return GetExpectedRendererMetrics(); + case ProcessType::GPU: + return GetExpectedGpuMetrics(); + case ProcessType::UTILITY: + case ProcessType::PLUGIN: + case ProcessType::OTHER: + break; + } + + // We shouldn't reach here. + CHECK(false); + return base::flat_map<const char*, int64_t>(); +} + +} // namespace + +class ProcessMemoryMetricsEmitterTest + : public testing::TestWithParam<ProcessType> { + public: + ProcessMemoryMetricsEmitterTest() {} + ~ProcessMemoryMetricsEmitterTest() override {} + + protected: + void CheckMemoryUkmEntryMetrics( + size_t entry_num, + base::flat_map<const char*, int64_t> expected) { + const ukm::mojom::UkmEntry* entry = test_ukm_recorder_.GetEntry(entry_num); + CHECK(entry != nullptr); + EXPECT_EQ(expected.size(), entry->metrics.size()); + for (auto it = expected.begin(); it != expected.end(); ++it) { + const ukm::mojom::UkmMetric* actual = + test_ukm_recorder_.FindMetric(entry, it->first); + CHECK(actual != nullptr); + EXPECT_EQ(it->second, actual->value); + } + } + + ukm::TestUkmRecorder test_ukm_recorder_; + + private: + DISALLOW_COPY_AND_ASSIGN(ProcessMemoryMetricsEmitterTest); +}; + +TEST_P(ProcessMemoryMetricsEmitterTest, CollectsSingleProcessUKMs) { + base::flat_map<const char*, int64_t> expected_metrics = + GetExpectedProcessMetrics(GetParam()); + uint64_t dump_guid = 333; + + GlobalMemoryDumpPtr global_dump( + memory_instrumentation::mojom::GlobalMemoryDump::New()); + PopulateMetrics(global_dump, GetParam(), expected_metrics); + + scoped_refptr<ProcessMemoryMetricsEmitterFake> emitter( + new ProcessMemoryMetricsEmitterFake()); + emitter->ReceivedMemoryDump(true, dump_guid, std::move(global_dump)); + + EXPECT_EQ(2u, test_ukm_recorder_.entries_count()); + CheckMemoryUkmEntryMetrics(0, expected_metrics); +} + +INSTANTIATE_TEST_CASE_P(SinglePtype, + ProcessMemoryMetricsEmitterTest, + testing::Values(ProcessType::BROWSER, + ProcessType::RENDERER, + ProcessType::GPU)); + +TEST_F(ProcessMemoryMetricsEmitterTest, CollectsManyProcessUKMsSingleDump) { + std::vector<ProcessType> entries_ptypes = { + ProcessType::BROWSER, ProcessType::RENDERER, ProcessType::GPU, + ProcessType::GPU, ProcessType::RENDERER, ProcessType::BROWSER, + }; + uint64_t dump_guid = 333; + + GlobalMemoryDumpPtr global_dump( + memory_instrumentation::mojom::GlobalMemoryDump::New()); + std::vector<base::flat_map<const char*, int64_t>> entries_metrics; + for (const auto& ptype : entries_ptypes) { + auto expected_metrics = GetExpectedProcessMetrics(ptype); + PopulateMetrics(global_dump, ptype, expected_metrics); + entries_metrics.push_back(expected_metrics); + } + + scoped_refptr<ProcessMemoryMetricsEmitterFake> emitter( + new ProcessMemoryMetricsEmitterFake()); + emitter->ReceivedMemoryDump(true, dump_guid, std::move(global_dump)); + + EXPECT_EQ(7u, test_ukm_recorder_.entries_count()); + for (size_t i = 0; i < entries_ptypes.size(); ++i) { + CheckMemoryUkmEntryMetrics(i, entries_metrics[i]); + } +} + +TEST_F(ProcessMemoryMetricsEmitterTest, CollectsManyProcessUKMsManyDumps) { + std::vector<std::vector<ProcessType>> entries_ptypes = { + {ProcessType::BROWSER, ProcessType::RENDERER, ProcessType::GPU}, + {ProcessType::GPU, ProcessType::RENDERER, ProcessType::BROWSER}, + }; + + std::vector<base::flat_map<const char*, int64_t>> entries_metrics; + scoped_refptr<ProcessMemoryMetricsEmitterFake> emitter( + new ProcessMemoryMetricsEmitterFake()); + for (int i = 0; i < 2; ++i) { + GlobalMemoryDumpPtr global_dump( + memory_instrumentation::mojom::GlobalMemoryDump::New()); + for (const auto& ptype : entries_ptypes[i]) { + auto expected_metrics = GetExpectedProcessMetrics(ptype); + PopulateMetrics(global_dump, ptype, expected_metrics); + entries_metrics.push_back(expected_metrics); + } + emitter->ReceivedMemoryDump(true, i, std::move(global_dump)); + } + + EXPECT_EQ(8u, test_ukm_recorder_.entries_count()); + for (size_t i = 0; i < entries_ptypes.size(); ++i) { + CheckMemoryUkmEntryMetrics(i, entries_metrics[i]); + } +}
diff --git a/chrome/browser/net/predictor.cc b/chrome/browser/net/predictor.cc index c1dc2d12..f99580da 100644 --- a/chrome/browser/net/predictor.cc +++ b/chrome/browser/net/predictor.cc
@@ -33,6 +33,7 @@ #include "chrome/browser/io_thread.h" #include "chrome/browser/prefs/session_startup_pref.h" #include "chrome/browser/profiles/profile_io_data.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -59,9 +60,6 @@ namespace { -const base::Feature kNetworkPrediction{"NetworkPrediction", - base::FEATURE_ENABLED_BY_DEFAULT}; - #if defined(OS_ANDROID) // Disabled on Android, as there are no "pinned tabs", meaning that a startup // is unlikely to request the same URL, and hence to resolve the same domains @@ -171,7 +169,8 @@ // static Predictor* Predictor::CreatePredictor(bool simple_shutdown) { - bool predictor_enabled = base::FeatureList::IsEnabled(kNetworkPrediction); + bool predictor_enabled = + base::FeatureList::IsEnabled(features::kNetworkPrediction); if (simple_shutdown) return new SimplePredictor(predictor_enabled); return new Predictor(predictor_enabled);
diff --git a/chrome/browser/permissions/permission_request_manager.cc b/chrome/browser/permissions/permission_request_manager.cc index 494b880..b5e45fb 100644 --- a/chrome/browser/permissions/permission_request_manager.cc +++ b/chrome/browser/permissions/permission_request_manager.cc
@@ -121,15 +121,9 @@ } PermissionRequestManager::~PermissionRequestManager() { - if (view_ != NULL) - view_->SetDelegate(NULL); - - for (PermissionRequest* request : requests_) - request->RequestFinished(); - for (PermissionRequest* request : queued_requests_) - request->RequestFinished(); - for (const auto& entry : duplicate_requests_) - entry.second->RequestFinished(); + DCHECK(requests_.empty()); + DCHECK(duplicate_requests_.empty()); + DCHECK(queued_requests_.empty()); } void PermissionRequestManager::AddRequest(PermissionRequest* request) {
diff --git a/chrome/browser/permissions/permission_request_manager_unittest.cc b/chrome/browser/permissions/permission_request_manager_unittest.cc index 559ea5e..0a3ba3f 100644 --- a/chrome/browser/permissions/permission_request_manager_unittest.cc +++ b/chrome/browser/permissions/permission_request_manager_unittest.cc
@@ -51,13 +51,13 @@ SetContents(CreateTestWebContents()); NavigateAndCommit(GURL("http://www.google.com")); - manager_.reset(new PermissionRequestManager(web_contents())); - prompt_factory_.reset(new MockPermissionPromptFactory(manager_.get())); + PermissionRequestManager::CreateForWebContents(web_contents()); + manager_ = PermissionRequestManager::FromWebContents(web_contents()); + prompt_factory_.reset(new MockPermissionPromptFactory(manager_)); } void TearDown() override { prompt_factory_.reset(); - manager_.reset(); ChromeRenderViewHostTestHarness::TearDown(); } @@ -101,7 +101,7 @@ MockPermissionRequest iframe_request_same_domain_; MockPermissionRequest iframe_request_other_domain_; MockPermissionRequest iframe_request_mic_other_domain_; - std::unique_ptr<PermissionRequestManager> manager_; + PermissionRequestManager* manager_; std::unique_ptr<MockPermissionPromptFactory> prompt_factory_; };
diff --git a/chrome/browser/resources/extensions/extensions.css b/chrome/browser/resources/extensions/extensions.css index 57468d4..a18931e 100644 --- a/chrome/browser/resources/extensions/extensions.css +++ b/chrome/browser/resources/extensions/extensions.css
@@ -104,7 +104,6 @@ } [dir='rtl'] #page-header { - left: auto; right: 0; }
diff --git a/chrome/browser/resources/options/autofill_edit_address_overlay.html b/chrome/browser/resources/options/autofill_edit_address_overlay.html index 0deecad..980d9ba 100644 --- a/chrome/browser/resources/options/autofill_edit_address_overlay.html +++ b/chrome/browser/resources/options/autofill_edit_address_overlay.html
@@ -7,7 +7,7 @@ <div class="settings-row"> <label> - <div i18n-content="autofillCountryLabel"></div> + <div>$i18n{autofillCountryLabel}</div> <select class="country" field="country"></select> </label> </div> @@ -15,14 +15,14 @@ <div class="input-group settings-row"> <div> <label> - <div i18n-content="autofillPhoneLabel"></div> + <div>$i18n{autofillPhoneLabel}</div> <input class="short" field="phone"></input> </label> </div> <div> <label> - <div i18n-content="autofillEmailLabel"></div> + <div>$i18n{autofillEmailLabel}</div> <input class="short" field="email"></input> </label> </div> @@ -31,9 +31,12 @@ </div> <div class="action-area button-strip"> - <button id="autofill-edit-address-cancel-button" type="reset" - i18n-content="cancel"></button> + <button id="autofill-edit-address-cancel-button" type="reset"> + $i18n{cancel} + </button> <button id="autofill-edit-address-apply-button" type="submit" - class="default-button" i18n-content="ok" disabled></button> + class="default-button" disabled> + $i18n{ok} + </button> </div> </div>
diff --git a/chrome/browser/resources/options/autofill_edit_creditcard_overlay.html b/chrome/browser/resources/options/autofill_edit_creditcard_overlay.html index 3c5b07f..9b2c5f8 100644 --- a/chrome/browser/resources/options/autofill_edit_creditcard_overlay.html +++ b/chrome/browser/resources/options/autofill_edit_creditcard_overlay.html
@@ -3,18 +3,19 @@ <h1 id="autofill-credit-card-title"></h1> <div class="content-area"> <label class="settings-row"> - <div i18n-content="nameOnCardLabel"></div> + <div>$i18n{nameOnCardLabel}</div> <input id="name-on-card" type="text"> </label> <label class="settings-row"> - <div i18n-content="creditCardNumberLabel"></div> + <div>$i18n{creditCardNumberLabel}</div> <input id="credit-card-number" type="text"> </label> <div class="settings-row"> - <div id="creditCardExpirationLabel" - i18n-content="creditCardExpirationDateLabel"></div> + <div id="creditCardExpirationLabel"> + $i18n{creditCardExpirationDateLabel} + </div> <select id="expiration-month" aria-labelledby="creditCardExpirationLabel"> </select> <select id="expiration-year" aria-labelledby="creditCardExpirationLabel"> @@ -23,9 +24,12 @@ </div> <div class="action-area button-strip"> - <button id="autofill-edit-credit-card-cancel-button" type="reset" - i18n-content="cancel"></button> + <button id="autofill-edit-credit-card-cancel-button" type="reset"> + $i18n{cancel} + </button> <button id="autofill-edit-credit-card-apply-button" type="submit" - class="default-button" i18n-content="ok" disabled></button> + class="default-button" disabled> + $i18n{ok} + </button> </div> </div>
diff --git a/chrome/browser/resources/options/autofill_options.html b/chrome/browser/resources/options/autofill_options.html index ab3931b..d820ebee 100644 --- a/chrome/browser/resources/options/autofill_options.html +++ b/chrome/browser/resources/options/autofill_options.html
@@ -1,18 +1,18 @@ <div id="autofill-options" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="autofillOptionsPage"></h1> + <h1>$i18n{autofillOptionsPage}</h1> <div class="content-area"> <div class="autofill-section-header"> - <h3 i18n-content="autofillAddresses"></h3> - <button id="autofill-add-address" i18n-content="autofillAddAddress"> - </button> + <h3>$i18n{autofillAddresses}</h3> + <button id="autofill-add-address">$i18n{autofillAddAddress}</button> </div> <div class="settings-list"> <list id="address-list"></list> </div> <div class="autofill-section-header"> - <h3 i18n-content="autofillCreditCards"></h3> - <button id="autofill-add-creditcard" i18n-content="autofillAddCreditCard"> + <h3>$i18n{autofillCreditCards}</h3> + <button id="autofill-add-creditcard"> + $i18n{autofillAddCreditCard} </button> </div> <div class="settings-list"> @@ -21,13 +21,13 @@ </div> <div class="action-area"> - <a id="autofill-help" target="_blank" i18n-values="href:helpUrl" - i18n-content="helpButton"> - </a> + <a id="autofill-help" target="_blank" + href="$i18nRaw{helpUrl}">$i18n{helpButton}</a> <div class="spacer-div"></div> <div class="button-strip"> - <button id="autofill-options-confirm" class="default-button" - i18n-content="done"></button> + <button id="autofill-options-confirm" class="default-button"> + $i18n{done} + </button> </div> </div> </div>
diff --git a/chrome/browser/resources/options/automatic_settings_reset_banner.html b/chrome/browser/resources/options/automatic_settings_reset_banner.html index 4af723b..fcb16c40 100644 --- a/chrome/browser/resources/options/automatic_settings_reset_banner.html +++ b/chrome/browser/resources/options/automatic_settings_reset_banner.html
@@ -4,16 +4,16 @@ <div class="badge"></div> <div class="text"> <p> - <span i18n-values=".innerHTML:automaticSettingsResetBannerText"> - </span> + <span>$i18nRaw{automaticSettingsResetBannerText}</span> <a id="automatic-settings-reset-learn-more" class="nowrap" - i18n-values="href:automaticSettingsResetLearnMoreUrl" - i18n-content="learnMore" target="_blank"></a> + href="$i18nRaw{automaticSettingsResetLearnMoreUrl}" + target="_blank">$i18n{learnMore}</a> </p> </div> <div class="button-area"> - <button id="automatic-settings-reset-banner-activate-reset" - i18n-content="automaticSettingsResetBannerResetButtonText"></button> + <button id="automatic-settings-reset-banner-activate-reset"> + $i18n{automaticSettingsResetBannerResetButtonText} + </button> </div> </div> </div>
diff --git a/chrome/browser/resources/options/browser_options.html b/chrome/browser/resources/options/browser_options.html index 3c1661d..94147eac 100644 --- a/chrome/browser/resources/options/browser_options.html +++ b/chrome/browser/resources/options/browser_options.html
@@ -3,7 +3,7 @@ </if> <div id="settings" class="page" hidden> <header> - <h1 i18n-content="settingsTitle"></h1> + <h1>$i18n{settingsTitle}</h1> </header> <include src="automatic_settings_reset_banner.html"> <if expr="chromeos"> @@ -12,7 +12,7 @@ <include src="secondary_user_banner.html"> <section id="network-section-cros"> <div id="network-section-header" class="section-header"> - <h3 i18n-content="sectionTitleInternet"></h3> + <h3>$i18n{sectionTitleInternet}</h3> <span class="controlled-setting-indicator" plural></span> </div> <div id="network-settings"> @@ -22,7 +22,7 @@ <input id="use-shared-proxies" type="checkbox" metric="Options_NetworkUseSharedProxies" pref="settings.use_shared_proxies"> - <span i18n-content="useSharedProxies"></span> + <span>$i18n{useSharedProxies}</span> </label> </div> <div id="network-menus"></div> @@ -34,29 +34,28 @@ <include src="startup_section.html"> </if> <section id="proxy-section" hidden> - <h3 i18n-content="sectionTitleProxy"></h3> + <h3>$i18n{sectionTitleProxy}</h3> <div id="proxy-section-content"></div> </section> <section id="appearance-section"> - <h3 i18n-content="sectionTitleAppearance"></h3> + <h3>$i18n{sectionTitleAppearance}</h3> <div class="settings-row"> <if expr="chromeos"> - <button id="set-wallpaper" i18n-content="setWallpaper" - guest-visibility="disabled"></button> + <button id="set-wallpaper" guest-visibility="disabled"> + $i18n{setWallpaper} + </button> <span id="wallpaper-indicator" class="controlled-setting-indicator"> </span> </if> <if expr="not chromeos and is_posix and not is_macosx"> - <button id="themes-gallery" i18n-content="themesGallery"></button> - <button id="themes-native-button" - i18n-content="themesNativeButton"></button> - <button id="themes-reset" - i18n-content="themesSetClassic"></button> + <button id="themes-gallery">$i18n{themesGallery}</button> + <button id="themes-native-button">$i18n{themesNativeButton}</button> + <button id="themes-reset">$i18n{themesSetClassic}</button> </if> <if expr="chromeos or is_win or is_macosx"> - <button id="themes-gallery" i18n-content="themesGallery"></button> - <button id="themes-reset" i18n-content="themesReset"></button> + <button id="themes-gallery">$i18n{themesGallery}</button> + <button id="themes-reset">$i18n{themesReset}</button> </if> </div> <div class="checkbox controlled-setting-with-label" @@ -66,7 +65,7 @@ pref="browser.show_home_button" metric="Options_Homepage_HomeButton"> <span> - <span i18n-content="homePageShowHomeButton"></span> + <span>$i18n{homePageShowHomeButton}</span> <span class="controlled-setting-indicator" pref="browser.show_home_button"></span> </span> @@ -74,11 +73,11 @@ </div> <div id="change-home-page-section" hidden> <div id="change-home-page-section-container" guest-visibility="disabled"> - <span id="home-page-ntp" class="home-page-label" - i18n-content="homePageNtp"></span> + <span id="home-page-ntp" class="home-page-label"> + $i18n{homePageNtp} + </span> <span id="home-page-url" class="home-page-label"></span> - <a is="action-link" id="change-home-page" i18n-content="changeHomePage"> - </a> + <a is="action-link" id="change-home-page">$i18n{changeHomePage}</a> <div id="extension-controlled-container"></div> </div> </div> @@ -89,7 +88,7 @@ pref="bookmark_bar.show_on_all_tabs" metric="Options_ShowBookmarksBar"> <span> - <span i18n-content="toolbarShowBookmarksBar"></span> + <span>$i18n{toolbarShowBookmarksBar}</span> <span class="controlled-setting-indicator" pref="bookmark_bar.show_on_all_tabs"></span> </span> @@ -100,77 +99,81 @@ <input id="show-window-decorations" type="checkbox" pref="browser.custom_chrome_frame" metric="Options_CustomFrame" inverted_pref> - <span i18n-content="showWindowDecorations"></span> + <span>$i18n{showWindowDecorations}</span> </label></div> </if> </section> <if expr="chromeos"> <section id="device-section"> - <h3 i18n-content="sectionTitleDevice"></h3> + <h3>$i18n{sectionTitleDevice}</h3> <div> - <span i18n-content="deviceGroupDescription"></span> + <span>$i18n{deviceGroupDescription}</span> <div id="touchpad-settings" class="settings-row" hidden> - <span id="touchpad-speed-label" class="option-name" - i18n-content="touchpadSpeed"></span> + <span id="touchpad-speed-label" class="option-name"> + $i18n{touchpadSpeed} + </span> <input id="touchpad-sensitivity-range" type="range" min="1" max="5" pref="settings.touchpad.sensitivity2" class="touch-slider" aria-labelledby="touchpad-speed-label"> </div> <div id="mouse-settings" class="settings-row" hidden> - <span id="mouse-speed-label" class="option-name" - i18n-content="mouseSpeed"></span> + <span id="mouse-speed-label" class="option-name"> + $i18n{mouseSpeed} + </span> <input id="mouse-sensitivity-range" type="range" min="1" max="5" pref="settings.mouse.sensitivity2" class="touch-slider" aria-labelledby="mouse-speed-label"> </div> - <div id="no-pointing-devices" i18n-content="noPointingDevices" - class="settings-row" hidden> + <div id="no-pointing-devices" class="settings-row" hidden> + $i18n{noPointingDevices} </div> <div class="settings-row"> <button id="pointer-settings-button" hidden> </button> - <button id="keyboard-settings-button" - i18n-content="keyboardSettingsButtonTitle"> + <button id="keyboard-settings-button"> + $i18n{keyboardSettingsButtonTitle} </button> <span id="display-options-section"> - <button id="display-options" i18n-content="displayOptions" disabled> - </button> + <button id="display-options" disabled>$i18n{displayOptions}</button> </span> - <button id="storage-manager-button" - i18n-content="storageManagerButtonTitle"> + <button id="storage-manager-button"> + $i18n{storageManagerButtonTitle} </button> </div> <div id="stylus-row" hidden> - <a is="action-link" id="stylus-settings-link" - i18n-content="stylusSettingsButtonTitle"></a> + <a is="action-link" id="stylus-settings-link"> + $i18n{stylusSettingsButtonTitle} + </a> </div> <div id="power-row" hidden> - <a is="action-link" id="power-settings-link" - i18n-content="powerSettingsButton"></a> + <a is="action-link" id="power-settings-link"> + $i18n{powerSettingsButton} + </a> </div> </div> </section> </if> <section id="search-section"> - <h3 i18n-content="sectionTitleSearch"></h3> + <h3>$i18n{sectionTitleSearch}</h3> <div id="search-section-content"> - <span id="default-search-engine-label" - i18n-values=".innerHTML:defaultSearchGroupLabel"></span> + <span id="default-search-engine-label"> + $i18nRaw{defaultSearchGroupLabel} + </span> <div class="settings-row"> <select id="default-search-engine" class="weakrtl" aria-labelledby="default-search-engine-label"></select> <span class="controlled-setting-indicator" pref="default_search_provider_data.template_url_data"> </span> - <button id="manage-default-search-engines" - i18n-content="defaultSearchManageEngines"> + <button id="manage-default-search-engines"> + $i18n{defaultSearchManageEngines} </button> </div> <div id="google-now-launcher" hidden> <div class="checkbox"> <label> <input pref="google_now_launcher.enabled" type="checkbox"> - <span i18n-content="googleNowLauncherEnable"></span> + <span>$i18n{googleNowLauncherEnable}</span> </label> </div> </div> @@ -179,20 +182,20 @@ <label> <input id="hotword-always-on-search-checkbox" pref="hotword.always_on_search_enabled" type="checkbox"> - <span i18n-content="hotwordSearchEnable"></span> + <span>$i18n{hotwordSearchEnable}</span> </label> <a target="_blank" class="hotword-link" - i18n-content="learnMore" - i18n-values="href:hotwordLearnMoreURL"> + href="$i18nRaw{hotwordLearnMoreURL}"> + $i18n{learnMore} </a> <span id="hotword-always-on-search-setting-indicator" pref="hotword.always_on_search_enabled" dialog-pref></span> <div> - <span class="setting-extra-description" - i18n-content="hotwordAlwaysOnDesc"> + <span class="setting-extra-description"> + $i18n{hotwordAlwaysOnDesc} </span> - <a id="hotword-retrain-link" is="action-link" - i18n-content="hotwordRetrainLink" hidden> + <a id="hotword-retrain-link" is="action-link" hidden> + $i18n{hotwordRetrainLink} </a> </div> </div> @@ -202,17 +205,17 @@ <label> <input id="hotword-no-dsp-search-checkbox" pref="hotword.search_enabled_2" type="checkbox"> - <span i18n-content="hotwordSearchEnable"></span> + <span>$i18n{hotwordSearchEnable}</span> </label> <a target="_blank" class="hotword-link" - i18n-content="learnMore" - i18n-values="href:hotwordLearnMoreURL"> + href="$i18nRaw{hotwordLearnMoreURL}"> + $i18n{learnMore} </a> <span id="hotword-no-dsp-search-setting-indicator" pref="hotword.search_enabled_2" dialog-pref></span> <div> - <span class="setting-extra-description" - i18n-content="hotwordNoDSPDesc"> + <span class="setting-extra-description"> + $i18n{hotwordNoDSPDesc} </span> </div> </div> @@ -223,13 +226,13 @@ <span id="audio-history-label"></span> </label> <a target="_blank" class="hotword-link" - i18n-content="hotwordAudioHistoryManage" - i18n-values="href:hotwordManageAudioHistoryURL"> + href="$i18nRaw{hotwordManageAudioHistoryURL}"> + $i18n{hotwordAudioHistoryManage} </a> </div> <div class="settings-row" id="audio-history-always-on-description"> - <span class="setting-extra-description" - i18n-content="hotwordAlwaysOnAudioHistoryDescription"> + <span class="setting-extra-description"> + $i18n{hotwordAlwaysOnAudioHistoryDescription} </span> </div> </div> @@ -237,21 +240,23 @@ </section> <if expr="chromeos"> <section id="android-apps-section" hidden> - <h3 i18n-content="androidAppsTitle"></h3> + <h3>$i18n{androidAppsTitle}</h3> <div class="checkbox controlled-setting-with-label"> <label> <input id="android-apps-enabled" pref="arc.enabled" metric="Options_AndroidApps" type="checkbox" dialog-pref> <span> - <span i18n-content="androidAppsEnabled"></span> + <span>$i18n{androidAppsEnabled}</span> <span class="controlled-setting-indicator" pref="arc.enabled"></span> </span> </label> - <a target="_blank" i18n-content="learnMore" - href="http://support.google.com/chromebook?p=playapps"></a> + <a target="_blank" href="http://support.google.com/chromebook?p=playapps"> + $i18n{learnMore} + </a> </div> - <div id="android-apps-settings" class="controlled-setting-with-label" hidden> + <div id="android-apps-settings" class="controlled-setting-with-label" + hidden> <label> <span id="android-apps-settings-label"></span> </label> @@ -259,14 +264,14 @@ </section> </if> <section id="sync-users-section" guest-visibility="hidden"> - <h3 i18n-content="sectionTitleUsers"></h3> + <h3>$i18n{sectionTitleUsers}</h3> <if expr="chromeos"> <include src="sync_section.html"> </if> <div id="profiles-section" hidden> <list id="profiles-list" class="settings-list" hidden></list> - <div id="profiles-single-message" class="settings-row" - i18n-content="profilesSingleUser"> + <div id="profiles-single-message" class="settings-row"> + $i18n{profilesSingleUser} </div> <if expr="not chromeos"> <div id="profiles-enable-guest" class="checkbox"> @@ -274,7 +279,7 @@ <input pref="profile.browser_guest_enabled" type="checkbox" metric="Options_BrowserGuestEnabled"> - <span i18n-content="profileBrowserGuestEnable"></span> + <span>$i18n{profileBrowserGuestEnable}</span> </label> </div> <div id="profiles-enable-add-person" class="checkbox"> @@ -282,33 +287,31 @@ <input pref="profile.add_person_enabled" type="checkbox" metric="Options_AddPersonEnabled"> - <span i18n-content="profileAddPersonEnable"></span> + <span>$i18n{profileAddPersonEnable}</span> </label> </div> </if> <div id="profiles-buttons"> - <button id="profiles-create" i18n-content="profilesCreate"></button> - <button id="profiles-manage" i18n-content="profilesManage" disabled> - </button> - <button id="profiles-delete" i18n-content="profilesDelete"></button> + <button id="profiles-create">$i18n{profilesCreate}</button> + <button id="profiles-manage" disabled>$i18n{profilesManage}</button> + <button id="profiles-delete">$i18n{profilesDelete}</button> <if expr="not chromeos"> - <button id="import-data" i18n-content="importData"></button> + <button id="import-data">$i18n{importData}</button> </if> </div> </div> - <div id="profiles-supervised-dashboard-tip" - i18n-values=".innerHTML:profilesSupervisedDashboardTip" hidden> + <div id="profiles-supervised-dashboard-tip" hidden> + $i18nRaw{profilesSupervisedDashboardTip} </div> </section> <if expr="not chromeos"> <section id="set-default-browser-section"> - <h3 i18n-content="sectionTitleDefaultBrowser"></h3> + <h3>$i18n{sectionTitleDefaultBrowser}</h3> <div> - <button id="set-as-default-browser" - i18n-content="defaultBrowserUseAsDefault" hidden> + <button id="set-as-default-browser" hidden> + $i18n{defaultBrowserUseAsDefault} </button> - <div id="default-browser-state" i18n-content="defaultBrowserUnknown"> - </div> + <div id="default-browser-state">$i18n{defaultBrowserUnknown}</div> </div> </section> </if> <!-- not chromeos --> @@ -316,11 +319,12 @@ <div id="advanced-settings-container"> <if expr="chromeos"> <section id="date-time-section"> - <h3 i18n-content="datetimeTitle"></h3> + <h3>$i18n{datetimeTitle}</h3> <div class="option-control-table"> <div guest-visibility="disabled"> - <span id="timezone-value-label" class="option-name" - i18n-content="timezone"></span> + <span id="timezone-value-label" class="option-name"> + $i18n{timezone} + </span> <div id="timezone-value"> <select class="control" id="timezone-value-select" @@ -336,36 +340,38 @@ <input id="resolve-timezone-by-geolocation" pref="settings.resolve_timezone_by_geolocation" metric="Options_ResolveTimezoneByGeoLocation" type="checkbox"> - <span i18n-content="resolveTimezoneByGeoLocation"></span> + <span>$i18n{resolveTimezoneByGeoLocation}</span> </label> </div> <label> <input id="use-24hour-clock" pref="settings.clock.use_24hour_clock" metric="Options_Use24HourClockCheckbox" type="checkbox"> - <span i18n-content="use24HourClock"></span> + <span>$i18n{use24HourClock}</span> </label> </div> <div id="set-time" class="settings-row" hidden> - <button id="set-time-button" - i18n-content="setTimeButton"></button> + <button id="set-time-button">$i18n{setTimeButton}</button> </div> </div> </section> </if> <section id="privacy-section"> - <h3 i18n-content="advancedSectionTitlePrivacy"></h3> + <h3>$i18n{advancedSectionTitlePrivacy}</h3> <div> <div class="settings-row"> - <button id="privacyContentSettingsButton" - i18n-content="privacyContentSettingsButton"></button> - <button id="privacyClearDataButton" - i18n-content="privacyClearDataButton"></button> + <button id="privacyContentSettingsButton"> + $i18n{privacyContentSettingsButton} + </button> + <button id="privacyClearDataButton"> + $i18n{privacyClearDataButton} + </button> </div> <p id="privacy-explanation" class="settings-row"> - <span i18n-content="improveBrowsingExperience"></span> - <span i18n-content="disableWebServices"></span> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:privacyLearnMoreURL"></a> + <span>$i18n{improveBrowsingExperience}</span> + <span>$i18n{disableWebServices}</span> + <a target="_blank" href="$i18nRaw{privacyLearnMoreURL}"> + $i18n{learnMore} + </a> </p> <div class="checkbox controlled-setting-with-label"> <label> @@ -373,7 +379,7 @@ pref="alternate_error_pages.enabled" metric="Options_LinkDoctorCheckbox" type="checkbox"> <span> - <span i18n-content="linkDoctorPref"></span> + <span>$i18n{linkDoctorPref}</span> <span class="controlled-setting-indicator" pref="alternate_error_pages.enabled"></span> </span> @@ -385,7 +391,7 @@ <input pref="search.suggest_enabled" metric="Options_UseSuggestCheckbox" type="checkbox"> <span> - <span i18n-content="suggestPref"></span> + <span>$i18n{suggestPref}</span> <span class="controlled-setting-indicator" pref="search.suggest_enabled"></span> </span> @@ -397,7 +403,7 @@ <input id="networkPredictionOptions" metric="Options_DnsPrefetchCheckbox" type="checkbox"> <span> - <span i18n-content="networkPredictionEnabledDescription"></span> + <span>$i18n{networkPredictionEnabledDescription}</span> <span class="controlled-setting-indicator" pref="net.network_prediction_options"></span> </span> @@ -411,7 +417,7 @@ metric="Options_SafeBrowsingExtendedReportingCheckbox" type="checkbox"> <span> - <span i18n-content="safeBrowsingEnableExtendedReporting"></span> + <span>$i18n{safeBrowsingEnableExtendedReporting}</span> <span class="controlled-setting-indicator"></span> </span> </label> @@ -421,7 +427,7 @@ <input pref="safebrowsing.enabled" metric="Options_SafeBrowsingCheckbox" type="checkbox"> <span> - <span i18n-content="safeBrowsingEnableProtection"></span> + <span>$i18n{safeBrowsingEnableProtection}</span> <span class="controlled-setting-indicator" pref="safebrowsing.enabled"></span> </span> @@ -434,7 +440,7 @@ metric="Options_SpellingServiceCheckbox" pref="spellcheck.use_spelling_service" dialog-pref> <span> - <span i18n-content="spellingPref"></span> + <span>$i18n{spellingPref}</span> <span id="spelling-enabled-indicator" class="controlled-setting-indicator" pref="spellcheck.use_spelling_service" dialog-pref> @@ -447,7 +453,7 @@ <label> <input id="metrics-reporting-enabled" type="checkbox"> <span> - <span i18n-content="enableLogging"></span> + <span>$i18n{enableLogging}</span> <span id="metrics-reporting-disabled-icon" class="controlled-setting-indicator"></span> </span> @@ -465,7 +471,7 @@ <label> <input id="do-not-track-enabled" pref="enable_do_not_track" metric="Options_DoNotTrackCheckbox" type="checkbox" dialog-pref> - <span i18n-content="doNotTrack"></span> + <span>$i18n{doNotTrack}</span> </label> </div> <if expr="chromeos"> @@ -474,14 +480,15 @@ <input id="content-protection-attestation-enabled" type="checkbox" pref="cros.device.attestation_for_content_protection_enabled"> <span> - <span i18n-content="enableContentProtectionAttestation"></span> + <span>$i18n{enableContentProtectionAttestation}</span> <span class="controlled-setting-indicator" pref="cros.device.attestation_for_content_protection_enabled"> </span> </span> </label> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:contentProtectionAttestationLearnMoreURL"> + <a target="_blank" + href="$i18nRaw{contentProtectionAttestationLearnMoreURL}"> + $i18n{learnMore} </a> </div> </if> @@ -491,7 +498,7 @@ <input id="hotword-search-enable" pref="hotword.search_enabled_2" metric="Options_HotwordCheckbox" type="checkbox" dialog-pref> <span> - <span i18n-values=".innerHTML:hotwordSearchEnable"></span> + <span>$i18nRaw{hotwordSearchEnable}</span> <span id="hotword-search-setting-indicator" pref="hotword.search_enabled_2" dialog-pref></span> </span> @@ -506,7 +513,7 @@ metric="Options_WakeOnWifiSsid" pref="settings.internet.wake_on_wifi_darkconnect"> <span> - <span i18n-content="wakeOnWifiLabel"></span> + <span>$i18n{wakeOnWifiLabel}</span> <span id="wake-on-wifi-indicator" class="controlled-setting-indicator" pref="settings.internet.wake_on_wifi_darkconnect"></span> @@ -520,14 +527,14 @@ <!-- By default, the bluetooth section is hidden. It is only visible if a bluetooth adapter is discovered --> <section id="bluetooth-devices" hidden> - <h3 i18n-content="bluetooth"></h3> + <h3>$i18n{bluetooth}</h3> <div id="bluetooth-options-div"> <div class="checkbox controlled-setting-with-label"> <label> <input type="checkbox" id="enable-bluetooth" metric="Options_BluetoothEnabled"> <span> - <span i18n-content="enableBluetooth"></span> + <span>$i18n{enableBluetooth}</span> <span id="bluetooth-controlled-setting-indicator" class="controlled-setting-indicator" pref="cros.device.allow_bluetooth" @@ -540,32 +547,35 @@ <list id="bluetooth-paired-devices-list"></list> <div id="bluetooth-paired-devices-list-empty-placeholder" class="bluetooth-empty-list-label" hidden> - <span i18n-content="bluetoothNoDevices"></span> + <span>$i18n{bluetoothNoDevices}</span> </div> </div> <div id="bluetooth-button-group"> - <button id="bluetooth-add-device" - i18n-content="addBluetoothDevice" hidden></button> - <button id="bluetooth-reconnect-device" - i18n-content="bluetoothConnectDevice" disabled hidden></button> + <button id="bluetooth-add-device" hidden> + $i18n{addBluetoothDevice} + </button> + <button id="bluetooth-reconnect-device" disabled hidden> + $i18n{bluetoothConnectDevice} + </button> </div> </div> </section> </if> <section id="passwords-and-autofill-section"> - <h3 i18n-content="passwordsAndAutofillGroupName"></h3> + <h3>$i18n{passwordsAndAutofillGroupName}</h3> <div class="checkbox controlled-setting-with-label"> <label> <input id="autofill-enabled" pref="autofill.enabled" metric="Options_FormAutofill" type="checkbox"> <span> - <span i18n-content="autofillEnabled"></span> + <span>$i18n{autofillEnabled}</span> <span class="controlled-setting-indicator" pref="autofill.enabled"> </span> </span> </label> - <a is="action-link" id="autofill-settings" - i18n-content="manageAutofillSettings"></a> + <a is="action-link" id="autofill-settings"> + $i18n{manageAutofillSettings} + </a> </div> <div class="checkbox controlled-setting-with-label"> <label> @@ -573,75 +583,76 @@ pref="credentials_enable_service" metric="Options_PasswordManager" type="checkbox"> <span> - <span i18n-content="passwordManagerEnabled"></span> + <span>$i18n{passwordManagerEnabled}</span> <span class="controlled-setting-indicator" pref="credentials_enable_service"></span> </span> </label> - <a is="action-link" id="manage-passwords" i18n-content="managePasswords"> - </a> + <a is="action-link" id="manage-passwords">$i18n{managePasswords}</a> </div> <if expr="is_macosx"> - <div id="mac-passwords-warning" i18n-content="macPasswordsWarning" hidden> - </div> + <div id="mac-passwords-warning" hidden>$i18n{macPasswordsWarning}</div> </if> </section> <section id="easy-unlock-section" guest-visibility="hidden" hidden> - <h3 i18n-content="easyUnlockSectionTitle"></h3> + <h3>$i18n{easyUnlockSectionTitle}</h3> <!-- Options shown when the user has not set up Easy Unlock --> <div id="easy-unlock-disabled" hidden> <div class="settings-row"> - <span i18n-content="easyUnlockSetupIntro"></span> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:easyUnlockLearnMoreURL"></a> + <span>$i18n{easyUnlockSetupIntro}</span> + <a target="_blank" href="$i18nRaw{easyUnlockLearnMoreURL}"> + $i18n{learnMore} + </a> </div> - <button id="easy-unlock-setup-button" - i18n-content="easyUnlockSetupButton"></button> + <button id="easy-unlock-setup-button"> + $i18n{easyUnlockSetupButton} + </button> </div> <!-- Options shown when the user has set up Easy Unlock --> <div id="easy-unlock-enabled" hidden> <div class="settings-row"> - <span i18n-content="easyUnlockDescription"></span> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:easyUnlockLearnMoreURL"></a> + <span>$i18n{easyUnlockDescription}</span> + <a target="_blank" href="$i18nRaw{easyUnlockLearnMoreURL}"> + $i18n{learnMore} + </a> <div id="easy-unlock-enable-proximity-detection" class="checkbox" hidden> <label> <input type="checkbox" metric="Options_EasyUnlockRequireProximity" pref="easy_unlock.proximity_required"> - <span i18n-content="easyUnlockRequireProximityLabel"></span> + <span>$i18n{easyUnlockRequireProximityLabel}</span> </label> </div> </div> - <button id="easy-unlock-turn-off-button" - i18n-content="easyUnlockTurnOffButton"></button> + <button id="easy-unlock-turn-off-button"> + $i18n{easyUnlockTurnOffButton} + </button> </div> </section> <section id="web-content-section"> - <h3 i18n-content="advancedSectionTitleContent"></h3> + <h3>$i18n{advancedSectionTitleContent}</h3> <div> <div class="settings-row"> <label class="web-content-select-label"> - <span i18n-content="defaultFontSizeLabel"></span> + <span>$i18n{defaultFontSizeLabel}</span> <select id="defaultFontSize"> - <option value="9" i18n-content="fontSizeLabelVerySmall"> - </option> - <option value="12" i18n-content="fontSizeLabelSmall"></option> - <option value="16" i18n-content="fontSizeLabelMedium"></option> - <option value="20" i18n-content="fontSizeLabelLarge"></option> - <option value="24" i18n-content="fontSizeLabelVeryLarge"> - </option> + <option value="9">$i18n{fontSizeLabelVerySmall}</option> + <option value="12">$i18n{fontSizeLabelSmall}</option> + <option value="16">$i18n{fontSizeLabelMedium}</option> + <option value="20">$i18n{fontSizeLabelLarge}</option> + <option value="24">$i18n{fontSizeLabelVeryLarge}</option> </select> </label> <span id="font-size-indicator" class="controlled-setting-indicator"></span> - <button id="fontSettingsCustomizeFontsButton" - i18n-content="fontSettingsCustomizeFontsButton"></button> + <button id="fontSettingsCustomizeFontsButton"> + $i18n{fontSettingsCustomizeFontsButton} + </button> </div> <div class="settings-row" guest-visibility="disabled"> <label class="web-content-select-label"> - <span i18n-content="defaultZoomFactorLabel"></span> + <span>$i18n{defaultZoomFactorLabel}</span> <select id="defaultZoomFactor" dataType="double"></select> </label> </div> @@ -650,7 +661,7 @@ <label> <input id="tabsToLinksPref" pref="webkit.webprefs.tabs_to_links" metric="Options_TabsToLinks" type="checkbox"> - <span i18n-content="tabsToLinksPref"></span> + <span>$i18n{tabsToLinksPref}</span> </label> </div> </if> @@ -658,57 +669,59 @@ </section> <if expr="not chromeos"> <section id="network-section"> - <h3 i18n-content="advancedSectionTitleNetwork"></h3> + <h3>$i18n{advancedSectionTitleNetwork}</h3> <div> - <span id="proxiesLabel" - class="settings-row" - i18n-content="proxiesLabelSystem"></span> + <span id="proxiesLabel" class="settings-row"> + $i18n{proxiesLabelSystem} + </span> <div class="settings-row"> - <button id="proxiesConfigureButton" - i18n-content="proxiesConfigureButton"></button> + <button id="proxiesConfigureButton"> + $i18n{proxiesConfigureButton} + </button> <span class="controlled-setting-indicator" pref="proxy" plural></span> </div> </div> </section> </if> <section id="languages-section"> - <h3 i18n-content="advancedSectionTitleLanguages"></h3> + <h3>$i18n{advancedSectionTitleLanguages}</h3> <div class="settings-row"> - <span i18n-content="languageSectionLabel"></span> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:languagesLearnMoreURL"></a> + <span>$i18n{languageSectionLabel}</span> + <a target="_blank" href="$i18nRaw{languagesLearnMoreURL}"> + $i18n{learnMore} + </a> </div> <div class="settings-row"> - <button id="language-button" - i18n-content="languageAndSpellCheckSettingsButton"></button> + <button id="language-button"> + $i18n{languageAndSpellCheckSettingsButton} + </button> </div> <div class="checkbox controlled-setting-with-label"> <label> <input pref="translate.enabled" metric="Options_Translate" type="checkbox"> <span> - <span i18n-content="translateEnableTranslate"></span> + <span>$i18n{translateEnableTranslate}</span> <span class="controlled-setting-indicator" pref="translate.enabled"> </span> </span> </label> - <a is="action-link" id="manage-languages" i18n-content="manageLanguages"> - </a> + <a is="action-link" id="manage-languages">$i18n{manageLanguages}</a> </div> </section> <section id="downloads-section"> - <h3 i18n-content="downloadLocationGroupName"></h3> + <h3>$i18n{downloadLocationGroupName}</h3> <div> <div class="settings-row"> <label> - <span id="download-location-label" - i18n-content="downloadLocationBrowseTitle"> + <span id="download-location-label"> + $i18n{downloadLocationBrowseTitle} </span> <input id="downloadLocationPath" class="weakrtl" type="text" size="36" readonly> </label> - <button id="downloadLocationChangeButton" - i18n-content="downloadLocationChangeButton"> + <button id="downloadLocationChangeButton"> + $i18n{downloadLocationChangeButton} </button> <span class="controlled-setting-indicator" pref="download.default_directory"> @@ -720,7 +733,7 @@ pref="download.prompt_for_download" metric="Options_AskForSaveLocation"> <span> - <span i18n-content="downloadLocationAskForSaveLocation"></span> + <span>$i18n{downloadLocationAskForSaveLocation}</span> <span class="controlled-setting-indicator" pref="download.prompt_for_download"></span> </span> @@ -734,7 +747,7 @@ pref="gdata.disabled" metric="Options_DisableGData"> <span> - <span i18n-content="disableGData"></span> + <span>$i18n{disableGData}</span> <span class="controlled-setting-indicator" pref="gdata.disabled"> </span> </span> @@ -743,53 +756,59 @@ </if> <div id="auto-open-file-types-section" hidden> <div id="auto-open-file-types-container"> - <div id="auto-open-file-types-label" class="settings-row" - i18n-content="autoOpenFileTypesInfo"></div> + <div id="auto-open-file-types-label" class="settings-row"> + $i18n{autoOpenFileTypesInfo} + </div> <div class="settings-row"> - <button id="autoOpenFileTypesResetToDefault" - i18n-content="autoOpenFileTypesResetToDefault"></button> + <button id="autoOpenFileTypesResetToDefault"> + $i18n{autoOpenFileTypesResetToDefault} + </button> </div> </div> </div> </div> </section> <section id="certificates-section"> - <h3 i18n-content="advancedSectionTitleCertificates"></h3> + <h3>$i18n{advancedSectionTitleCertificates}</h3> <div> <if expr="use_nss_certs or is_win or is_macosx"> <div class="settings-row"> - <button id="certificatesManageButton" - i18n-content="certificatesManageButton"></button> + <button id="certificatesManageButton"> + $i18n{certificatesManageButton} + </button> </div> </if> </div> </section> <if expr="chromeos"> <section id="cups-printers-section" hidden> - <h3 i18n-content="advancedSectionTitleCupsPrint"></h3> + <h3>$i18n{advancedSectionTitleCupsPrint}</h3> <div class="settings-row"> - <span i18n-content="cupsPrintOptionLabel"></span> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:cupsPrintLearnMoreURL"> + <span>$i18n{cupsPrintOptionLabel}</span> + <a target="_blank" href="$i18nRaw{cupsPrintLearnMoreURL}"> + $i18n{learnMore} </a> </div> <div class="settings-row"> - <button id="cupsPrintersManageButton" - i18n-content="cupsPrintersManageButton"></button> + <button id="cupsPrintersManageButton"> + $i18n{cupsPrintersManageButton} + </button> </div> </section> </if> <if expr="enable_service_discovery"> <section id="cloudprint-options-mdns"> - <h3 i18n-content="advancedSectionTitleCloudPrint"></h3> + <h3>$i18n{advancedSectionTitleCloudPrint}</h3> <div class="settings-row"> - <span i18n-content="cloudPrintOptionLabel"></span> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:cloudPrintLearnMoreURL"></a> + <span>$i18n{cloudPrintOptionLabel}</span> + <a target="_blank" href="$i18nRaw{cloudPrintLearnMoreURL}"> + $i18n{learnMore} + </a> </div> <div class="settings-row"> - <button id="cloudPrintDevicesPageButton" - i18n-content="cloudPrintDevicesPageButton"></button> + <button id="cloudPrintDevicesPageButton"> + $i18n{cloudPrintDevicesPageButton} + </button> </div> <div class="settings-row checkbox controlled-setting-with-label" @@ -800,7 +819,7 @@ type="checkbox" metric="LocalDiscoveryNotificationsDisabled_Settings"> <span> - <span i18n-content="cloudPrintEnableNotificationsLabel"></span> + <span>$i18n{cloudPrintEnableNotificationsLabel}</span> <span class="controlled-setting-indicator" pref="local_discovery.notifications_enabled"></span> </span> @@ -814,21 +833,23 @@ </if> <section id="a11y-section"> - <h3 i18n-content="accessibilityTitle"></h3> + <h3>$i18n{accessibilityTitle}</h3> <div> <a href="https://chrome.google.com/webstore/category/collection/accessibility" - id="accessibility-features" target="_blank" - i18n-content="accessibilityFeaturesLink"></a> + id="accessibility-features" target="_blank"> + $i18n{accessibilityFeaturesLink} + </a> </div> <if expr="chromeos"> <div class="option-control-table"> <p id="accessibility-explanation" class="settings-row"> - <span i18n-content="accessibilityExplanation"></span> + <span>$i18n{accessibilityExplanation}</span> <a id="accessibility-learn-more" target="_blank" - i18n-values="href:accessibilityLearnMoreURL" - i18n-content="learnMore"></a> + href="$i18nRaw{accessibilityLearnMoreURL}"> + $i18n{learnMore} + </a> </p> <div class="option-name"> <div class="checkbox controlled-setting-with-label"> @@ -837,7 +858,7 @@ pref="settings.a11y.enable_menu" type="checkbox" metric="Options_AccessibilitySystemMenu"> <span> - <span i18n-content="accessibilityAlwaysShowMenu"></span> + <span>$i18n{accessibilityAlwaysShowMenu}</span> <span class="controlled-setting-indicator" pref="settings.a11y.enable_menu"></span> </span> @@ -851,7 +872,7 @@ pref="settings.a11y.large_cursor_enabled" type="checkbox" metric="Options_AccessibilityLargeMouseCursor"> <span> - <span i18n-content="accessibilityLargeCursor"></span> + <span>$i18n{accessibilityLargeCursor}</span> <span class="controlled-setting-indicator" pref="settings.a11y.large_cursor_enabled"></span> </span> @@ -865,7 +886,7 @@ pref="settings.a11y.high_contrast_enabled" type="checkbox" metric="Options_AccessibilityHighContrastMode"> <span> - <span i18n-content="accessibilityHighContrast"></span> + <span>$i18n{accessibilityHighContrast}</span> <span class="controlled-setting-indicator" pref="settings.a11y.high_contrast_enabled"></span> </span> @@ -879,7 +900,7 @@ pref="settings.a11y.sticky_keys_enabled" type="checkbox" metric="Options_AccessibilityStickyKeys"> <span> - <span i18n-content="accessibilityStickyKeys"></span> + <span>$i18n{accessibilityStickyKeys}</span> <span class="controlled-setting-indicator" pref="settings.a11y.sticky_keys_enabled"></span> </span> @@ -893,16 +914,18 @@ pref="settings.accessibility" type="checkbox" metric="Options_AccessibilitySpokenFeedback"> <span> - <span i18n-content="accessibilitySpokenFeedback"></span> + <span>$i18n{accessibilitySpokenFeedback}</span> <span class="controlled-setting-indicator" pref="settings.accessibility"></span> </span> </label> <div id="accessibility-settings" hidden> - <button id="accessibility-settings-button" - i18n-content="accessibilitySettings"></button> - <button id="talkback-settings-button" - i18n-content="accessibilityTalkBackSettings"></button> + <button id="accessibility-settings-button"> + $i18n{accessibilitySettings} + </button> + <button id="talkback-settings-button"> + $i18n{accessibilityTalkBackSettings} + </button> </div> </div> </div> @@ -914,7 +937,7 @@ pref="settings.a11y.screen_magnifier" type="checkbox" metric="Options_AccessibilityScreenMagnifier"> <span> - <span i18n-content="accessibilityScreenMagnifier"></span> + <span>$i18n{accessibilityScreenMagnifier}</span> <span class="controlled-setting-indicator" pref="settings.a11y.screen_magnifier"></span> </span> @@ -929,7 +952,7 @@ pref="settings.a11y.screen_magnifier_center_focus" type="checkbox" metric="Options_AccessibilityScreenMagnifierCenterFocus"> <span> - <span i18n-content="accessibilityScreenMagnifierCenterFocus"></span> + <span>$i18n{accessibilityScreenMagnifierCenterFocus}</span> <span class="controlled-setting-indicator" pref="settings.a11y.screen_magnifier_center_focus"></span> </span> @@ -942,7 +965,7 @@ <input id="accessibility-tap-dragging-check" pref="settings.touchpad.enable_tap_dragging" type="checkbox" metric="Options_AccessibilityTapDragging"> - <span i18n-content="accessibilityTapDragging"></span> + <span>$i18n{accessibilityTapDragging}</span> </label> </div> </div> @@ -952,7 +975,7 @@ <input id="accessibility-autoclick-check" pref="settings.a11y.autoclick" type="checkbox"> <span> - <span i18n-content="accessibilityAutoclick"></span> + <span>$i18n{accessibilityAutoclick}</span> <span class="controlled-setting-indicator" pref="settings.a11y.autoclick"></span> </span> @@ -960,26 +983,22 @@ </div> <div class="checkbox"> <!-- No whitespace between elements. --> - <input type="checkbox" class="spacer-checkbox"><span - id="accessibility-autoclick-label" - i18n-content="accessibilityAutoclickDropdown"> - </span><select id="accessibility-autoclick-dropdown" class="control" + <input type="checkbox" class="spacer-checkbox"> + <span id="accessibility-autoclick-label"> + $i18n{accessibilityAutoclickDropdown} + </span> + <select id="accessibility-autoclick-dropdown" class="control" data-type="number" aria-labelledby="accessibility-autoclick-label" pref="settings.a11y.autoclick_delay_ms"> <!-- i18n strings contain the autoclick duration; if the autoclick timing gets changed, then the i18n strings also needs to be updated. --> - <option value="600" - i18n-content="autoclickDelayExtremelyShort"></option> - <option value="800" - i18n-content="autoclickDelayVeryShort"></option> - <option value="1000" i18n-content="autoclickDelayShort"> - </option> - <option value="2000" i18n-content="autoclickDelayLong"> - </option> - <option value="4000" - i18n-content="autoclickDelayVeryLong"></option> + <option value="600">$i18n{autoclickDelayExtremelyShort}</option> + <option value="800">$i18n{autoclickDelayVeryShort}</option> + <option value="1000">$i18n{autoclickDelayShort}</option> + <option value="2000">$i18n{autoclickDelayLong}</option> + <option value="4000">$i18n{autoclickDelayVeryLong}</option> </select> <span class="controlled-setting-indicator" pref="settings.a11y.autoclick_delay_ms"></span> @@ -991,7 +1010,7 @@ <input pref="settings.a11y.virtual_keyboard" type="checkbox" metric="Options_AccessibilityOnScreenKeyboard"> <span> - <span i18n-content="accessibilityVirtualKeyboard"></span> + <span>$i18n{accessibilityVirtualKeyboard}</span> <span class="controlled-setting-indicator" pref="settings.a11y.virtual_keyboard"></span> </span> @@ -1004,7 +1023,7 @@ <input pref="settings.a11y.mono_audio" type="checkbox" metric="Options_AccessibilityMonoAudio"> <span> - <span i18n-content="accessibilityMonoAudio"></span> + <span>$i18n{accessibilityMonoAudio}</span> <span class="controlled-setting-indicator" pref="settings.a11y.mono_audio"></span> </span> @@ -1017,7 +1036,7 @@ <input pref="settings.a11y.caret_highlight" type="checkbox" metric="Options_AccessibilityCaretHighlight"> <span> - <span i18n-content="accessibilityCaretHighlight"></span> + <span>$i18n{accessibilityCaretHighlight}</span> <span class="controlled-setting-indicator" pref="settings.a11y.caret_highlight"></span> </span> @@ -1030,7 +1049,7 @@ <input pref="settings.a11y.cursor_highlight" type="checkbox" metric="Options_AccessibilityCursorHighlight"> <span> - <span i18n-content="accessibilityCursorHighlight"></span> + <span>$i18n{accessibilityCursorHighlight}</span> <span class="controlled-setting-indicator" pref="settings.a11y.cursor_highlight"></span> </span> @@ -1043,7 +1062,7 @@ <input pref="settings.a11y.focus_highlight" type="checkbox" metric="Options_AccessibilityFocusHighlight"> <span> - <span i18n-content="accessibilityFocusHighlight"></span> + <span>$i18n{accessibilityFocusHighlight}</span> <span class="controlled-setting-indicator" pref="settings.a11y.focus_highlight"></span> </span> @@ -1057,7 +1076,7 @@ <input pref="settings.a11y.select_to_speak" type="checkbox" metric="Options_AccessibilitySelectToSpeak"> <span> - <span i18n-content="accessibilitySelectToSpeak"></span> + <span>$i18n{accessibilitySelectToSpeak}</span> <span class="controlled-setting-indicator" pref="settings.a11y.select_to_speak"></span> </span> @@ -1070,7 +1089,7 @@ <input pref="settings.a11y.switch_access" type="checkbox" metric="Options_AccessibilitySwitchAccess"> <span> - <span i18n-content="accessibilitySwitchAccess"></span> + <span>$i18n{accessibilitySwitchAccess}</span> <span class="controlled-setting-indicator" pref="settings.a11y.switch_access"></span> </span> @@ -1085,26 +1104,23 @@ <if expr="chromeos"> <section id="factory-reset-section" hidden> - <h3 i18n-content="factoryResetTitle"></h3> + <h3>$i18n{factoryResetTitle}</h3> <div> - <span class="settings-row" i18n-content="factoryResetDescription"> - </span> - <button id="factory-reset-restart" - i18n-content="factoryResetRestart"> - </button> + <span class="settings-row">$i18n{factoryResetDescription}</span> + <button id="factory-reset-restart">$i18n{factoryResetRestart}</button> </div> </section> </if> <if expr="not chromeos"> <section id="system-section"> - <h3 i18n-content="advancedSectionTitleSystem"></h3> + <h3>$i18n{advancedSectionTitleSystem}</h3> <if expr="not is_macosx"> <div class="checkbox controlled-setting-with-label"> <label> <input pref="background_mode.enabled" type="checkbox"> <span> - <span i18n-content="backgroundModeCheckbox"></span> + <span>$i18n{backgroundModeCheckbox}</span> <span class="controlled-setting-indicator" pref="background_mode.enabled"></span> </span> @@ -1116,29 +1132,27 @@ <input id="gpu-mode-checkbox" pref="hardware_acceleration_mode.enabled" type="checkbox"> <span> - <span i18n-content="gpuModeCheckbox"></span> + <span>$i18n{gpuModeCheckbox}</span> <span class="controlled-setting-indicator" pref="hardware_acceleration_mode.enabled"></span> </span> </label> - <span id="gpu-mode-reset-restart" - i18n-values=".innerHTML:gpuModeResetRestart"></span> + <span id="gpu-mode-reset-restart">$i18nRaw{gpuModeResetRestart}</span> </div> </section> </if> <section id="reset-profile-settings-section"> - <h3 i18n-content="resetProfileSettingsSectionTitle"></h3> + <h3>$i18n{resetProfileSettingsSectionTitle}</h3> <div> - <span class="settings-row" i18n-content="resetProfileSettingsDescription"> - </span> - <button id="reset-profile-settings" i18n-content="resetProfileSettings"> - </button> + <span class="settings-row">$i18n{resetProfileSettingsDescription}</span> + <button id="reset-profile-settings">$i18n{resetProfileSettings}</button> </div> </section> </div> <!-- advanced-settings-container --> </div> <!-- advanced-settings --> <footer id="advanced-settings-footer"> - <a is="action-link" id="advanced-settings-expander" - i18n-content="showAdvancedSettings"></a> + <a is="action-link" id="advanced-settings-expander"> + $i18n{showAdvancedSettings} + </a> </footer> </div>
diff --git a/chrome/browser/resources/options/certificate_backup_overlay.html b/chrome/browser/resources/options/certificate_backup_overlay.html index ded4f5e..92601ef 100644 --- a/chrome/browser/resources/options/certificate_backup_overlay.html +++ b/chrome/browser/resources/options/certificate_backup_overlay.html
@@ -1,19 +1,21 @@ <div id="certificateBackupOverlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="certificateExportPasswordDescription"></h1> + <h1>$i18n{certificateExportPasswordDescription}</h1> <div class="content-area"> <table> <tr> - <td id="certificate-backup-password-label" - i18n-content="certificatePasswordLabel"></td> + <td id="certificate-backup-password-label"> + $i18n{certificatePasswordLabel} + </td> <td> <input id="certificateBackupPassword" type="password" aria-labelledby="certificate-backup-password-label"> </td> </tr> <tr> - <td id="certificate-backup-password-2-label" - i18n-content="certificateConfirmPasswordLabel"></td> + <td id="certificate-backup-password-2-label"> + $i18n{certificateConfirmPasswordLabel} + </td> <td> <input id="certificateBackupPassword2" type="password" aria-labelledby="certificate-backup-password-2-label"> @@ -21,15 +23,17 @@ </tr> </table> <p> - <span i18n-content="certificateExportPasswordHelp"></span> + <span>$i18n{certificateExportPasswordHelp}</span> </p> </div> <div class="action-area"> <div class="button-strip"> - <button id="certificateBackupCancelButton" type="reset" - i18n-content="cancel"></button> + <button id="certificateBackupCancelButton" type="reset"> + $i18n{cancel} + </button> <button id="certificateBackupOkButton" class="default-button" - type="submit" i18n-content="ok" disabled> + type="submit" disabled> + $i18n{ok} </button> </div> </div>
diff --git a/chrome/browser/resources/options/certificate_edit_ca_trust_overlay.html b/chrome/browser/resources/options/certificate_edit_ca_trust_overlay.html index 4dabea2..198002d 100644 --- a/chrome/browser/resources/options/certificate_edit_ca_trust_overlay.html +++ b/chrome/browser/resources/options/certificate_edit_ca_trust_overlay.html
@@ -1,38 +1,40 @@ <div id="certificateEditCaTrustOverlay" class="page" hidden> - <h1><span i18n-content="certificateEditCaTitle"></span></h1> + <h1><span>$i18n{certificateEditCaTitle}</span></h1> <div class="close-button"></div> <div class="content-area"> <div> <span id="certificateEditCaTrustDescription"></span> </div> <section> - <h3><span i18n-content="certificateEditTrustLabel"></span></h3> + <h3><span>$i18n{certificateEditTrustLabel}</span></h3> <div class="checkbox"> <label id="certificateCaTrustSSLLabel"> <input id="certificateCaTrustSSLCheckbox" type="checkbox"> - <span i18n-content="certificateCaTrustSSLLabel"></span> + <span>$i18n{certificateCaTrustSSLLabel}</span> </label> </div> <div class="checkbox"> <label id="certificateCaTrustEmailLabel"> <input id="certificateCaTrustEmailCheckbox" type="checkbox"> - <span i18n-content="certificateCaTrustEmailLabel"></span> + <span>$i18n{certificateCaTrustEmailLabel}</span> </label> </div> <div class="checkbox"> <label id="certificateCaTrustObjSignLabel"> <input id="certificateCaTrustObjSignCheckbox" type="checkbox"> - <span i18n-content="certificateCaTrustObjSignLabel"></span> + <span>$i18n{certificateCaTrustObjSignLabel}</span> </label> </div> </section> </div> <div class="action-area"> <div class="button-strip"> - <button id="certificateEditCaTrustCancelButton" type="reset" - i18n-content="cancel"></button> + <button id="certificateEditCaTrustCancelButton" type="reset"> + $i18n{cancel} + </button> <button id="certificateEditCaTrustOkButton" class="default-button" - type="submit" i18n-content="ok"> + type="submit"> + $i18n{ok} </button> </div> </div>
diff --git a/chrome/browser/resources/options/certificate_import_error_overlay.html b/chrome/browser/resources/options/certificate_import_error_overlay.html index b36d4db..c468b01 100644 --- a/chrome/browser/resources/options/certificate_import_error_overlay.html +++ b/chrome/browser/resources/options/certificate_import_error_overlay.html
@@ -8,7 +8,8 @@ <div class="action-area"> <div class="button-strip"> <button id="certificateImportErrorOverlayOk" class="default-button" - type="submit" i18n-content="done"> + type="submit"> + $i18n{done} </button> </div> </div>
diff --git a/chrome/browser/resources/options/certificate_manager.html b/chrome/browser/resources/options/certificate_manager.html index 30fe9dc6..b619dd81 100644 --- a/chrome/browser/resources/options/certificate_manager.html +++ b/chrome/browser/resources/options/certificate_manager.html
@@ -1,28 +1,25 @@ <div id="certificateManagerPage" class="page" hidden> <div class="close-button"></div> - <h1 id='cert-manager-header' i18n-content="certificateManagerPage"></h1> + <h1 id='cert-manager-header'>$i18n{certificateManagerPage}</h1> <div id="certificate-manager-content-area" class="content-area"> <!-- Navigation tabs --> <div class="subpages-nav-tabs"> <span id="personal-certs-nav-tab" class="tab" tab-contents="personalCertsTab"> - <span class="tab-label" i18n-content="personalCertsTabTitle"></span> - <span class="active-tab-label" i18n-content="personalCertsTabTitle"> - </span> + <span class="tab-label">$i18n{personalCertsTabTitle}</span> + <span class="active-tab-label">$i18n{personalCertsTabTitle}</span> </span> <span id="server-certs-nav-tab" class="tab" tab-contents="serverCertsTab"> - <span class="tab-label" i18n-content="serverCertsTabTitle"></span> - <span class="active-tab-label" i18n-content="serverCertsTabTitle"> - </span> + <span class="tab-label">$i18n{serverCertsTabTitle}</span> + <span class="active-tab-label">$i18n{serverCertsTabTitle}</span> </span> <span id="ca-certs-nav-tab" class="tab" tab-contents="caCertsTab"> - <span class="tab-label" i18n-content="caCertsTabTitle"></span> - <span class="active-tab-label" i18n-content="caCertsTabTitle"></span> + <span class="tab-label">$i18n{caCertsTabTitle}</span> + <span class="active-tab-label">$i18n{caCertsTabTitle}</span> </span> <span id="other-certs-nav-tab" class="tab" tab-contents="otherCertsTab"> - <span class="tab-label" i18n-content="otherCertsTabTitle"></span> - <span class="active-tab-label" i18n-content="otherCertsTabTitle"> - </span> + <span class="tab-label">$i18n{otherCertsTabTitle}</span> + <span class="active-tab-label">$i18n{otherCertsTabTitle}</span> </span> </div> <!-- TODO(mattm): get rid of use of tables --> @@ -30,7 +27,7 @@ <div id="personalCertsTab" class="subpages-tab-contents"> <table class="certificate-tree-table"> <tr><td> - <span i18n-content="personalCertsTabDescription"></span> + <span>$i18n{personalCertsTabDescription}</span> </td></tr> <tr><td> <tree id="personalCertsTab-tree" class="certificate-tree" @@ -38,22 +35,22 @@ </tree> </td></tr> <tr><td> - <button id="personalCertsTab-view" i18n-content="view_certificate" - disabled> + <button id="personalCertsTab-view" disabled> + $i18n{view_certificate} </button> - <button id="personalCertsTab-import" - i18n-content="import_certificate" disabled> + <button id="personalCertsTab-import" disabled> + $i18n{import_certificate} </button> <if expr="chromeos"> - <button id="personalCertsTab-import-and-bind" - i18n-content="importAndBindCertificate" disabled> + <button id="personalCertsTab-import-and-bind" disabled> + $i18n{importAndBindCertificate} </button> </if> - <button id="personalCertsTab-backup" i18n-content="export_certificate" - disabled> + <button id="personalCertsTab-backup" disabled> + $i18n{export_certificate} </button> - <button id="personalCertsTab-delete" i18n-content="delete_certificate" - disabled> + <button id="personalCertsTab-delete" disabled> + $i18n{delete_certificate} </button> </td></tr> </table> @@ -61,7 +58,7 @@ <div id="serverCertsTab" class="subpages-tab-contents"> <table class="certificate-tree-table"> <tr><td> - <span i18n-content="serverCertsTabDescription"></span> + <span>$i18n{serverCertsTabDescription}</span> </td></tr> <tr><td> <tree id="serverCertsTab-tree" class="certificate-tree" @@ -69,17 +66,17 @@ </tree> </td></tr> <tr><td> - <button id="serverCertsTab-view" i18n-content="view_certificate" - disabled> + <button id="serverCertsTab-view" disabled> + $i18n{view_certificate} </button> - <button id="serverCertsTab-import" i18n-content="import_certificate" - disabled> + <button id="serverCertsTab-import" disabled> + $i18n{import_certificate} </button> - <button id="serverCertsTab-export" i18n-content="export_certificate" - disabled> + <button id="serverCertsTab-export" disabled> + $i18n{export_certificate} </button> - <button id="serverCertsTab-delete" i18n-content="delete_certificate" - disabled> + <button id="serverCertsTab-delete" disabled> + $i18n{delete_certificate} </button> </td></tr> </table> @@ -87,7 +84,7 @@ <div id="caCertsTab" class="subpages-tab-contents"> <table class="certificate-tree-table"> <tr><td> - <span i18n-content="caCertsTabDescription"></span> + <span>$i18n{caCertsTabDescription}</span> </td></tr> <tr><td> <tree id="caCertsTab-tree" class="certificate-tree" @@ -95,19 +92,20 @@ </tree> </td></tr> <tr><td> - <button id="caCertsTab-view" i18n-content="view_certificate" - disabled> + <button id="caCertsTab-view" disabled> + $i18n{view_certificate} </button> - <button id="caCertsTab-edit" i18n-content="edit_certificate" - disabled> + <button id="caCertsTab-edit" disabled> + $i18n{edit_certificate} </button> - <button id="caCertsTab-import" i18n-content="import_certificate" - disabled></button> - <button id="caCertsTab-export" i18n-content="export_certificate" - disabled> + <button id="caCertsTab-import" disabled> + $i18n{import_certificate} </button> - <button id="caCertsTab-delete" i18n-content="delete_certificate" - disabled> + <button id="caCertsTab-export" disabled> + $i18n{export_certificate} + </button> + <button id="caCertsTab-delete" disabled> + $i18n{delete_certificate} </button> </td></tr> </table> @@ -115,21 +113,21 @@ <div id="otherCertsTab" class="subpages-tab-contents"> <table class="certificate-tree-table"> <tr><td> - <span i18n-content="otherCertsTabDescription"></span> + <span>$i18n{otherCertsTabDescription}</span> </td></tr> <tr><td> <tree id="otherCertsTab-tree" class="certificate-tree" icon-visibility="parent"></tree> </td></tr> <tr><td> - <button id="otherCertsTab-view" i18n-content="view_certificate" - disabled> + <button id="otherCertsTab-view" disabled> + $i18n{view_certificate} </button> - <button id="otherCertsTab-export" i18n-content="export_certificate" - disabled> + <button id="otherCertsTab-export" disabled> + $i18n{export_certificate} </button> - <button id="otherCertsTab-delete" i18n-content="delete_certificate" - disabled> + <button id="otherCertsTab-delete" disabled> + $i18n{delete_certificate} </button> </td></tr> </table> @@ -137,8 +135,8 @@ </div> <div class="action-area"> <div class="button-strip"> - <button id="certificate-confirm" class="default-button" - i18n-content="done"> + <button id="certificate-confirm" class="default-button"> + $i18n{done} </button> </div> </div>
diff --git a/chrome/browser/resources/options/certificate_restore_overlay.html b/chrome/browser/resources/options/certificate_restore_overlay.html index d68fafb..f238cbc 100644 --- a/chrome/browser/resources/options/certificate_restore_overlay.html +++ b/chrome/browser/resources/options/certificate_restore_overlay.html
@@ -1,18 +1,20 @@ <div id="certificateRestoreOverlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="certificateRestorePasswordDescription"></h1> + <h1>$i18n{certificateRestorePasswordDescription}</h1> <div class="content-area"> <label id="certificateRestorePasswordLabel"> - <span i18n-content="certificatePasswordLabel"></span> + <span>$i18n{certificatePasswordLabel}</span> <input id="certificateRestorePassword" type="password"> </label> </div> <div class="action-area"> <div class="button-strip"> - <button id="certificateRestoreCancelButton" type="reset" - i18n-content="cancel"></button> + <button id="certificateRestoreCancelButton" type="reset"> + $i18n{cancel} + </button> <button id="certificateRestoreOkButton" class="default-button" - type="submit" i18n-content="ok"> + type="submit"> + $i18n{ok} </button> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/accounts_options.html b/chrome/browser/resources/options/chromeos/accounts_options.html index 2ddc846d..1cbfe32 100644 --- a/chrome/browser/resources/options/chromeos/accounts_options.html +++ b/chrome/browser/resources/options/chromeos/accounts_options.html
@@ -1,11 +1,11 @@ <div id="accountsPage" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="accountsPage"></h1> + <h1>$i18n{accountsPage}</h1> <div class="content-area"> <div class="option"> <div id="ownerOnlyWarning" hidden> - <span i18n-content="owner_only"></span> - <span i18n-content="ownerUserId"></span> + <span>$i18n{owner_only}</span> + <span>$i18n{ownerUserId}</span> </div> <table class="option-control-table"> <tr> @@ -15,7 +15,7 @@ <input id="allowBwsiCheck" type="checkbox" metric="Options_GuestBrowsing" pref="cros.accounts.allowBWSI"> - <span i18n-content="allow_BWSI"></span> + <span>$i18n{allow_BWSI}</span> </label> </div> </td> @@ -27,7 +27,7 @@ <input id="allowSupervisedCheck" type="checkbox" metric="Options_SupervisedUsers" pref="cros.accounts.supervisedUsersEnabled"> - <span i18n-content="allow_supervised_users"></span> + <span>$i18n{allow_supervised_users}</span> </label> </div> </td> @@ -39,7 +39,7 @@ <input id="showUserNamesCheck" type="checkbox" metric="Options_ShowUserNamesOnSignin" pref="cros.accounts.showUserNamesOnSignIn"> - <span i18n-content="show_user_on_signin"></span> + <span>$i18n{show_user_on_signin}</span> </label> </div> </td> @@ -52,7 +52,7 @@ metric="Options_AllowAllUsers" pref="cros.accounts.allowGuest" inverted_pref> - <span i18n-content="use_whitelist"></span> + <span>$i18n{use_whitelist}</span> </label> </div> </td> @@ -64,9 +64,9 @@ <list id="userList"></list> </td></tr> <tr><td class="user-name-edit-row"> - <label><span i18n-content="add_users"></span><br> + <label><span>$i18n{add_users}</span><br> <input id="userNameEdit" type="text" - i18n-values="placeholder:username_edit_hint"> + placeholder="$i18n{username_edit_hint}"> </span> </label> </td></tr> @@ -77,8 +77,8 @@ </div> <div class="action-area"> <div class="button-strip"> - <button id="accounts-options-overlay-confirm" class="default-button" - i18n-content="done"> + <button id="accounts-options-overlay-confirm" class="default-button"> + $i18n{done} </button> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/arc_opt_out_confirm_overlay.html b/chrome/browser/resources/options/chromeos/arc_opt_out_confirm_overlay.html index 3105453..6e6575d 100644 --- a/chrome/browser/resources/options/chromeos/arc_opt_out_confirm_overlay.html +++ b/chrome/browser/resources/options/chromeos/arc_opt_out_confirm_overlay.html
@@ -1,19 +1,19 @@ <div id="arc-opt-out-confirm-overlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="arcOptOutDialogHeader"></h1> + <h1>$i18n{arcOptOutDialogHeader}</h1> <div class="content-area"> - <span id="arc-opt-out-confirm-text" - i18n-values=".innerHTML:arcOptOutDialogDescription"> + <span id="arc-opt-out-confirm-text"> + $i18nRaw{arcOptOutDialogDescription} </span> </div> <div class="action-area"> <div class="action-area-right"> <div class="button-strip"> - <button id="arc-opt-out-confirm-cancel" - i18n-content="arcOptOutDialogButtonCancel"> + <button id="arc-opt-out-confirm-cancel"> + $i18n{arcOptOutDialogButtonCancel} </button> - <button id="arc-opt-out-confirm-ok" - i18n-content="arcOptOutDialogButtonConfirmDisable"> + <button id="arc-opt-out-confirm-ok"> + $i18n{arcOptOutDialogButtonConfirmDisable} </button> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/bluetooth_add_device_overlay.html b/chrome/browser/resources/options/chromeos/bluetooth_add_device_overlay.html index dcb87ab..99cafad2 100644 --- a/chrome/browser/resources/options/chromeos/bluetooth_add_device_overlay.html +++ b/chrome/browser/resources/options/chromeos/bluetooth_add_device_overlay.html
@@ -1,26 +1,23 @@ <div id="bluetooth-options" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="bluetoothAddDeviceTitle"></h1> + <h1>$i18n{bluetoothAddDeviceTitle}</h1> <div class="settings-list bluetooth-device-list content-area"> <list id="bluetooth-unpaired-devices-list"></list> <div id="bluetooth-unpaired-devices-list-empty-placeholder" class="bluetooth-empty-list-label" hidden> - <span i18n-content="bluetoothNoDevicesFound"></span> + <span>$i18n{bluetoothNoDevicesFound}</span> </div> </div> <div class="action-area button-strip"> - <button id="bluetooth-add-device-cancel-button" type="reset" - i18n-content="cancel"> + <button id="bluetooth-add-device-cancel-button" type="reset"> + $i18n{cancel} </button> <button id="bluetooth-add-device-apply-button" type="submit" - class="default-button" i18n-content="bluetoothConnectDevice" disabled> + class="default-button" disabled> + $i18n{bluetoothConnectDevice} </button> - <span id="bluetooth-scanning-label" - i18n-content="bluetoothScanning"> - </span> - <span id="bluetooth-scan-stopped-label" - i18n-content="bluetoothScanStopped"> - </span> + <span id="bluetooth-scanning-label">$i18n{bluetoothScanning}</span> + <span id="bluetooth-scan-stopped-label">$i18n{bluetoothScanStopped}</span> <div id="bluetooth-scanning-icon" class="inline-spinner"></div> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/bluetooth_pair_device_overlay.html b/chrome/browser/resources/options/chromeos/bluetooth_pair_device_overlay.html index 255dec0..cc37aa1 100644 --- a/chrome/browser/resources/options/chromeos/bluetooth_pair_device_overlay.html +++ b/chrome/browser/resources/options/chromeos/bluetooth_pair_device_overlay.html
@@ -1,6 +1,6 @@ <div id="bluetooth-pairing" class="page" hidden> <div id="bluetooth-pairing-close-button" class="close-button"></div> - <h1 i18n-content="bluetoothAddDeviceTitle"></h1> + <h1>$i18n{bluetoothAddDeviceTitle}</h1> <div id="bluetooth-pairing-message-area" class="content-area"> <div id="bluetooth-pairing-message-contents"> <div id="bluetooth-pairing-instructions"></div> @@ -14,15 +14,20 @@ </div> </div> <div class="action-area button-strip"> - <button id="bluetooth-pair-device-cancel-button" type="reset" - i18n-content="cancel" hidden></button> - <button id="bluetooth-pair-device-connect-button" type="reset" - i18n-content="bluetoothConnectDevice" hidden></button> - <button id="bluetooth-pair-device-reject-button" type="reset" - i18n-content="bluetoothRejectPasskey" hidden></button> - <button id="bluetooth-pair-device-accept-button" type="reset" - i18n-content="bluetoothAcceptPasskey" hidden></button> - <button id="bluetooth-pair-device-dismiss-button" type="reset" - i18n-content="bluetoothDismissError" hidden></button> + <button id="bluetooth-pair-device-cancel-button" type="reset" hidden> + $i18n{cancel} + </button> + <button id="bluetooth-pair-device-connect-button" type="reset" hidden> + $i18n{bluetoothConnectDevice} + </button> + <button id="bluetooth-pair-device-reject-button" type="reset" hidden> + $i18n{bluetoothRejectPasskey} + </button> + <button id="bluetooth-pair-device-accept-button" type="reset" hidden> + $i18n{bluetoothAcceptPasskey} + </button> + <button id="bluetooth-pair-device-dismiss-button" type="reset" hidden> + $i18n{bluetoothDismissError} + </button> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/change_picture_options.html b/chrome/browser/resources/options/chromeos/change_picture_options.html index 146585d..55f4bcb 100644 --- a/chrome/browser/resources/options/chromeos/change_picture_options.html +++ b/chrome/browser/resources/options/chromeos/change_picture_options.html
@@ -1,12 +1,12 @@ <div id="change-picture-page" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="changePicturePage"></h1> + <h1>$i18n{changePicturePage}</h1> <div class="content-area"> - <div i18n-content="changePicturePageDescription"></div> + <div>$i18n{changePicturePageDescription}</div> <div id="user-images-area"> <grid id="user-image-grid" class="user-image-picker" tabindex="1"></grid> <div id="user-image-preview"> - <img id="user-image-preview-img" i18n-values="alt:previewAltText"> + <img id="user-image-preview-img" alt="$i18n{previewAltText}"> <div class="user-image-stream-area"> <div class="perspective-box"> <div id="user-image-stream-crop"> @@ -15,24 +15,25 @@ </div> <div class="spinner"></div> </div> - <button id="discard-photo" i18n-values="title:discardPhoto" - tabindex="2"></button> - <button id="take-photo" i18n-values="title:takePhoto" tabindex="2"> + <button id="discard-photo" title="$i18n{discardPhoto}" tabindex="2"> + </button> + <button id="take-photo" title="$i18n{takePhoto}" tabindex="2"> </button> <button id="flip-photo" class="custom-appearance" - i18n-values="title:flipPhoto" tabindex="1"></button> + title="$i18n{flipPhoto}" tabindex="1"></button> </div> </div> <div id="user-image-attribution"> - <span i18n-content="authorCredit"></span> + <span>$i18n{authorCredit}</span> <strong id="user-image-author-name"></strong> <a id="user-image-author-website" target="_blank"></a> </div> </div> <div class="action-area"> <div class="button-strip"> - <button id="change-picture-overlay-confirm" i18n-content="done" - tabindex="2"></button> + <button id="change-picture-overlay-confirm" tabindex="2"> + $i18n{done} + </button> </div> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/display_options.html b/chrome/browser/resources/options/chromeos/display_options.html index d915ec7b..13be28d 100644 --- a/chrome/browser/resources/options/chromeos/display_options.html +++ b/chrome/browser/resources/options/chromeos/display_options.html
@@ -1,6 +1,6 @@ <div id="display-options-page" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="displayOptionsPage"></h1> + <h1>$i18n{displayOptionsPage}</h1> <div class="content-area" id="display-options-content-area"> <div id="display-options-displays-view-host"> </div> @@ -8,16 +8,17 @@ <div id="selected-display-data-container"> <div id="selected-display-name"></div> <div class="selected-display-option-row"> - <div class="selected-display-option-title" - i18n-content="selectedDisplayTitleOptions"> + <div class="selected-display-option-title"> + $i18n{selectedDisplayTitleOptions} </div> <select id="display-options-select-mirroring" class="display-options-button"> - <option value="extended" i18n-content="extendedMode"></option> - <option value="mirroring" i18n-content="mirroringMode"></option> + <option value="extended">$i18n{extendedMode}</option> + <option value="mirroring">$i18n{mirroringMode}</option> </select> <button id="display-options-set-primary" - class="display-options-button2" i18n-content="setPrimary"> + class="display-options-button2"> + $i18n{setPrimary} </button> </div> <div id="display-options-unified-desktop" @@ -27,43 +28,44 @@ </div> <label> <input id="display-options-toggle-unified-desktop" type="checkbox"> - <span class="controlled-setting-with-label" - i18n-content="enableUnifiedDesktop"></span> + <span class="controlled-setting-with-label"> + $i18n{enableUnifiedDesktop} + </span> </label> </div> <div class="selected-display-option-row"> - <div class="selected-display-option-title" - i18n-content="selectedDisplayTitleResolution"> + <div class="selected-display-option-title"> + $i18n{selectedDisplayTitleResolution} </div> <select id="display-options-resolution-selection" class="display-options-button"> </select> </div> <div class="selected-display-option-row"> - <div class="selected-display-option-title" - i18n-content="selectedDisplayTitleOrientation"> + <div class="selected-display-option-title"> + $i18n{selectedDisplayTitleOrientation} </div> <select id="display-options-orientation-selection" class="display-options-button"> - <option value="0" i18n-content="orientation0"></option> - <option value="90" i18n-content="orientation90"></option> - <option value="180" i18n-content="orientation180"></option> - <option value="270" i18n-content="orientation270"></option> + <option value="0">$i18n{orientation0}</option> + <option value="90">$i18n{orientation90}</option> + <option value="180">$i18n{orientation180}</option> + <option value="270">$i18n{orientation270}</option> </select> </div> <div class="selected-display-option-row"> - <div class="selected-display-option-title" - i18n-content="selectedDisplayTitleOverscan"> + <div class="selected-display-option-title"> + $i18n{selectedDisplayTitleOverscan} </div> <button id="selected-display-start-calibrating-overscan" - class="display-options-button" - i18n-content="startCalibratingOverscan"> + class="display-options-button"> + $i18n{startCalibratingOverscan} </button> </div> <div class="selected-display-option-row" id="selected-display-color-profile-row" hidden> - <div class="selected-display-option-title" - i18n-content="selectedDisplayColorProfile"> + <div class="selected-display-option-title"> + $i18n{selectedDisplayColorProfile} </div> <select id="display-options-color-profile-selection" class="display-options-button"> @@ -78,8 +80,9 @@ </div> <div class="action-area"> <div class="button-strip"> - <button id="display-options-done" i18n-content="done" - class="default-button"></button> + <button id="display-options-done" class="default-button"> + $i18n{done} + </button> </div> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/display_overscan.html b/chrome/browser/resources/options/chromeos/display_overscan.html index 53c280a..ce5b97f 100644 --- a/chrome/browser/resources/options/chromeos/display_overscan.html +++ b/chrome/browser/resources/options/chromeos/display_overscan.html
@@ -9,22 +9,20 @@ <div id="display-overscan-operation-shift"></div></td> </tr> <tr> - <td><span i18n-content="shrinkAndExpand"></span></td> - <td><span i18n-content="move"></span></td> + <td><span>$i18n{shrinkAndExpand}</span></td> + <td><span>$i18n{move}</span></td> </tr> </table> <!-- Specify 'reversed' to prevernt re-reversing the button order by options_page. --> <div class="button-strip" id="display-overscan-button-strip" reversed> - <button id="display-overscan-operation-reset" - i18n-content="overscanReset"> + <button id="display-overscan-operation-reset"> + $i18n{overscanReset} </button> <div id="display-overscan-buttons-spacer"></div> - <button id="display-overscan-operation-ok" - i18n-content="overscanOK"> - </button> - <button id="display-overscan-operation-cancel" - i18n-content="overscanCancel"> + <button id="display-overscan-operation-ok">$i18n{overscanOK}</button> + <button id="display-overscan-operation-cancel"> + $i18n{overscanCancel} </button> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/internet_detail.html b/chrome/browser/resources/options/chromeos/internet_detail.html index 847a27fe..b3b07bb 100644 --- a/chrome/browser/resources/options/chromeos/internet_detail.html +++ b/chrome/browser/resources/options/chromeos/internet_detail.html
@@ -14,52 +14,43 @@ <div id="details-tab-strip" class="subpages-nav-tabs"> <span id="wifi-network-nav-tab" class="tab wifi-details" tab-contents="wifi-network-tab"> - <span class="tab-label" - i18n-content="wifiNetworkTabLabel"></span> - <span class="active-tab-label" - i18n-content="wifiNetworkTabLabel"></span> + <span class="tab-label">$i18n{wifiNetworkTabLabel}</span> + <span class="active-tab-label">$i18n{wifiNetworkTabLabel}</span> </span> <span id="vpn-nav-tab" class="tab vpn-details" tab-contents="vpn-tab"> - <span class="tab-label" - i18n-content="vpnTabLabel"></span> - <span class="active-tab-label" i18n-content="vpnTabLabel"></span> + <span class="tab-label">$i18n{vpnTabLabel}</span> + <span class="active-tab-label">$i18n{vpnTabLabel}</span> </span> <span id="wimax-network-nav-tab" class="tab wimax-details" tab-contents="wimax-network-tab"> - <span class="tab-label" - i18n-content="wimaxConnTabLabel"></span> - <span class="active-tab-label" - i18n-content="wimaxConnTabLabel"></span> + <span class="tab-label">$i18n{wimaxConnTabLabel}</span> + <span class="active-tab-label">$i18n{wimaxConnTabLabel}</span> </span> <span id="cellular-conn-nav-tab" class="tab cellular-details" tab-contents="cellular-conn-tab"> - <span class="tab-label" - i18n-content="cellularConnTabLabel"></span> - <span class="active-tab-label" - i18n-content="cellularConnTabLabel"></span> + <span class="tab-label">$i18n{cellularConnTabLabel}</span> + <span class="active-tab-label">$i18n{cellularConnTabLabel}</span> </span> <span id="cellular-device-nav-tab" class="tab cellular-details" tab-contents="cellular-device-tab"> - <span class="tab-label" - i18n-content="cellularDeviceTabLabel"></span> - <span class="active-tab-label" - i18n-content="cellularDeviceTabLabel"></span> + <span class="tab-label">$i18n{cellularDeviceTabLabel}</span> + <span class="active-tab-label">$i18n{cellularDeviceTabLabel}</span> </span> <span id="internet-nav-tab" class="tab network-details" tab-contents="internet-tab"> - <span class="tab-label" i18n-content="networkTabLabel"></span> - <span class="active-tab-label" i18n-content="networkTabLabel"></span> + <span class="tab-label">$i18n{networkTabLabel}</span> + <span class="active-tab-label">$i18n{networkTabLabel}</span> </span> <span id="security-nav-tab" class="tab cellular-details gsm-only" tab-contents="security-tab"> - <span class="tab-label" i18n-content="securityTabLabel"></span> - <span class="active-tab-label" i18n-content="securityTabLabel"></span> + <span class="tab-label">$i18n{securityTabLabel}</span> + <span class="active-tab-label">$i18n{securityTabLabel}</span> </span> <span id="internet-proxy-nav-tab" class="tab proxy-details" tab-contents="network-proxy-tab"> - <span class="tab-label" i18n-content="proxyTabLabel"></span> - <span class="active-tab-label" i18n-content="proxyTabLabel"></span> + <span class="tab-label">$i18n{proxyTabLabel}</span> + <span class="active-tab-label">$i18n{proxyTabLabel}</span> </span> </div> <div id="wifi-network-tab" class="subpages-tab-contents wifi-details"> @@ -71,7 +62,7 @@ <label> <input id="prefer-network-wifi" type="checkbox"> <span> - <span i18n-content="inetPreferredNetwork"></span> + <span>$i18n{inetPreferredNetwork}</span> <span class="controlled-setting-indicator" managed="Priority" internet-detail-for="prefer-network-wifi"></span> @@ -86,7 +77,7 @@ <label> <input id="auto-connect-network-wifi" type="checkbox"> <span> - <span i18n-content="inetAutoConnectNetwork"></span> + <span>$i18n{inetAutoConnectNetwork}</span> <span class="controlled-setting-indicator" managed="WiFi.AutoConnect" internet-detail-for="auto-connect-network-wifi"> @@ -101,35 +92,35 @@ <section> <table id="wifi-settings-table"> <tr> - <td class="option-name" i18n-content="connectionState"></td> + <td class="option-name">$i18n{connectionState}</td> <td id="wifi-connection-state" class="option-value"></td> </tr> <tr> - <td class="option-name" i18n-content="restrictedConnectivity"></td> + <td class="option-name">$i18n{restrictedConnectivity}</td> <td id="wifi-restricted-connectivity" class="option-value"></td> </tr> <tr> - <td class="option-name" i18n-content="inetSsid"></td> + <td class="option-name">$i18n{inetSsid}</td> <td id="wifi-ssid" class="option-value"></td> </tr> <tr id="wifi-bssid-entry"> - <td class="option-name" i18n-content="inetBssid"></td> + <td class="option-name">$i18n{inetBssid}</td> <td id="wifi-bssid" class="option-value"></td> </tr> <tr id="wifi-security-entry"> - <td class="options-name" i18n-content="inetEncryption"></td> + <td class="options-name">$i18n{inetEncryption}</td> <td id="wifi-security" class="option-value"></td> </tr> <tr> - <td class="options-name" i18n-content="inetFrequency"></td> + <td class="options-name">$i18n{inetFrequency}</td> <td id="wifi-frequency" class="option-value"></td> </tr> <tr> - <td class="options-name" i18n-content="inetSignalStrength"></td> + <td class="options-name">$i18n{inetSignalStrength}</td> <td id="wifi-signal-strength" class="option-value"></td> </tr> <tr id="wifi-hardware-address-entry"> - <td class="option-name" i18n-content="hardwareAddress"></td> + <td class="option-name">$i18n{hardwareAddress}</td> <td id="wifi-hardware-address" class="option-value"></td> </tr> </table> @@ -137,13 +128,13 @@ <section> <table class="option-control-table"> <tr> - <td id="password-details" class="option-name" - i18n-content="inetPassProtected"> + <td id="password-details" class="option-name"> + $i18n{inetPassProtected} </td> </tr> <tr> - <td id="wifi-shared-network" class="option-name" - i18n-content="inetNetworkShared"> + <td id="wifi-shared-network" class="option-name"> + $i18n{inetNetworkShared} </td> </tr> </table> @@ -158,7 +149,7 @@ <label> <input id="auto-connect-network-wimax" type="checkbox"> <span> - <span i18n-content="inetAutoConnectNetwork"></span> + <span>$i18n{inetAutoConnectNetwork}</span> <span class="controlled-setting-indicator" managed="WiMAX.AutoConnect" internet-detail-for="auto-connect-network-wimax"> @@ -173,19 +164,19 @@ <section> <table id="wimax-settings-table"> <tr> - <td class="option-name" i18n-content="connectionState"></td> + <td class="option-name">$i18n{connectionState}</td> <td id="wimax-connection-state" class="option-value"></td> </tr> <tr> - <td class="option-name" i18n-content="restrictedConnectivity"></td> + <td class="option-name">$i18n{restrictedConnectivity}</td> <td id="wimax-restricted-connectivity" class="option-value"></td> </tr> <tr id="wimax-eap-identity-entry"> - <td class="option-name" i18n-content="inetUsername"></td> + <td class="option-name">$i18n{inetUsername}</td> <td id="wimax-eap-identity" class="option-value"></td> </tr> <tr> - <td class="options-name" i18n-content="inetSignalStrength"></td> + <td class="options-name">$i18n{inetSignalStrength}</td> <td id="wimax-signal-strength" class="option-value"></td> </tr> </table> @@ -193,8 +184,8 @@ <section> <table class="option-control-table"> <tr> - <td id="wimax-shared-network" class="option-name" - i18n-content="inetNetworkShared"> + <td id="wimax-shared-network" class="option-name"> + $i18n{inetNetworkShared} </td> </tr> </table> @@ -209,7 +200,7 @@ <label> <input id="auto-connect-network-vpn" type="checkbox"> <span> - <span i18n-content="inetAutoConnectNetwork"></span> + <span>$i18n{inetAutoConnectNetwork}</span> <span class="controlled-setting-indicator" managed="VPN.AutoConnect" internet-detail-for="auto-connect-network-vpn"></span> @@ -219,11 +210,11 @@ </td> </tr> <tr> - <td class="option-name" i18n-content="inetServiceName"></td> + <td class="option-name">$i18n{inetServiceName}</td> <td id="inet-service-name" class="option-value"></td> </tr> <tr class="built-in-vpn-provider-only"> - <td class="option-name" i18n-content="inetServerHostname"></td> + <td class="option-name">$i18n{inetServerHostname}</td> <td> <input class="option-value" id="inet-server-hostname"></input> <span class="controlled-setting-indicator" @@ -232,15 +223,15 @@ </td> </tr> <tr> - <td class="option-name" i18n-content="inetProviderType"></td> + <td class="option-name">$i18n{inetProviderType}</td> <td id="inet-provider-type" class="option-value"></td> </tr> <tr class="third-party-vpn-provider-only"> - <td class="option-name" i18n-content="inetProviderName"></td> + <td class="option-name">$i18n{inetProviderName}</td> <td id="inet-provider-name" class="option-value"></td> </tr> <tr class="built-in-vpn-provider-only"> - <td class="option-name" i18n-content="inetUsername"></td> + <td class="option-name">$i18n{inetUsername}</td> <td id="inet-username" class="option-value"></td> </tr> </table> @@ -250,43 +241,42 @@ <section id="cellular-network-options"> <table class="option-control-table"> <tr> - <td class="option-name" i18n-content="serviceName"></td> + <td class="option-name">$i18n{serviceName}</td> <td id="service-name" class="option-value"></td> </tr> <tr> - <td class="option-name" i18n-content="networkTechnology"></td> + <td class="option-name">$i18n{networkTechnology}</td> <td id="network-technology" class="option-value"></td> </tr> <tr> - <td class="option-name" i18n-content="activationState"></td> + <td class="option-name">$i18n{activationState}</td> <td id="activation-state" class="option-value"></td> </tr> <tr> - <td class="option-name" i18n-content="roamingState"></td> + <td class="option-name">$i18n{roamingState}</td> <td id="roaming-state" class="option-value"></td> </tr> <tr> - <td class="option-name" i18n-content="restrictedConnectivity"></td> + <td class="option-name">$i18n{restrictedConnectivity}</td> <td id="cellular-restricted-connectivity" class="option-value"></td> </tr> <tr> - <td class="option-name" i18n-content="operatorName"></td> + <td class="option-name">$i18n{operatorName}</td> <td id="operator-name" class="option-value"></td> </tr> <tr> - <td class="option-name" i18n-content="operatorCode"></td> + <td class="option-name">$i18n{operatorCode}</td> <td id="operator-code" class="option-value"></td> </tr> <tr> - <td class="option-name" i18n-content="errorState"></td> + <td class="option-name">$i18n{errorState}</td> <td id="error-state" class="option-value"></td> </tr> <tr class="gsm-only apn-list-view"> - <td class="option-name" i18n-content="cellularApnLabel"></td> + <td class="option-name">$i18n{cellularApnLabel}</td> <td id="cellular-apn-label" class="option-value"> <select id="select-apn"> - <option value="-1" i18n-content="cellularApnOther"> - </option> + <option value="-1">$i18n{cellularApnOther}</option> </select> <span class="controlled-setting-indicator" managed="Cellular.APN" @@ -294,19 +284,19 @@ </td> </tr> <tr class="gsm-only apn-details-view"> - <td class="option-name" i18n-content="cellularApnLabel"></td> + <td class="option-name">$i18n{cellularApnLabel}</td> <td id="cellular-apn-label" class="option-value"> <input id="cellular-apn" type="text"> </td> </tr> <tr class="gsm-only apn-details-view"> - <td class="option-name" i18n-content="cellularApnUsername"></td> + <td class="option-name">$i18n{cellularApnUsername}</td> <td id="cellular-apn-username-label" class="option-value"> <input id="cellular-apn-username" type="text"> </td> </tr> <tr class="gsm-only apn-details-view"> - <td class="option-name" i18n-content="cellularApnPassword"></td> + <td class="option-name">$i18n{cellularApnPassword}</td> <td id="cellular-apn-password-label" class="option-value"> <input id="cellular-apn-password" type="password"> </td> @@ -314,12 +304,13 @@ <tr class="gsm-only apn-details-view"> <td class="option-name"></td> <td class="option-value"> - <button id="cellular-apn-use-default" - i18n-content="cellularApnUseDefault"></button> - <button id="cellular-apn-set" - i18n-content="cellularApnSet"></button> - <button id="cellular-apn-cancel" - i18n-content="cellularApnCancel"></button> + <button id="cellular-apn-use-default"> + $i18n{cellularApnUseDefault} + </button> + <button id="cellular-apn-set">$i18n{cellularApnSet}</button> + <button id="cellular-apn-cancel"> + $i18n{cellularApnCancel} + </button> </td> </tr> <tr> @@ -328,7 +319,7 @@ <label> <input id="auto-connect-network-cellular" type="checkbox"> <span> - <span i18n-content="inetAutoConnectNetwork"></span> + <span>$i18n{inetAutoConnectNetwork}</span> <span class="controlled-setting-indicator" managed="Cellular.AutoConnect" internet-detail-for="auto-connect-network-cellular"> @@ -346,23 +337,23 @@ <section id="cellular-device-options"> <table class="option-control-table"> <tr> - <td class="option-name" i18n-content="cellularManufacturer"></td> + <td class="option-name">$i18n{cellularManufacturer}</td> <td id="manufacturer" class="option-value"></td> </tr> <tr> - <td class="option-name" i18n-content="modelId"></td> + <td class="option-name">$i18n{modelId}</td> <td id="model-id" class="option-value"></td> </tr> <tr> - <td class="option-name" i18n-content="firmwareRevision"></td> + <td class="option-name">$i18n{firmwareRevision}</td> <td id="firmware-revision" class="option-value"></td> </tr> <tr> - <td class="option-name" i18n-content="hardwareRevision"></td> + <td class="option-name">$i18n{hardwareRevision}</td> <td id="hardware-revision" class="option-value"></td> </tr> <tr class="cdma-only"> - <td class="option-name" i18n-content="prlVersion"></td> + <td class="option-name">$i18n{prlVersion}</td> <td id="prl-version" class="option-value"></td> </tr> <tr> @@ -400,11 +391,11 @@ <section id="advanced-section"> <table class="option-control-table"> <tr> - <td class="option-name" i18n-content="connectionState"></td> + <td class="option-name">$i18n{connectionState}</td> <td id="connection-state" class="option-value"></td> </tr> <tr id="hardware-address-row"> - <td class="option-name" i18n-content="hardwareAddress"></td> + <td class="option-name">$i18n{hardwareAddress}</td> <td id="hardware-address" class="option-value"></td> </tr> </table> @@ -416,7 +407,7 @@ <input id="ip-automatic-configuration-checkbox" type="checkbox"> <span> - <span i18n-content="ipAutomaticConfiguration"></span> + <span>$i18n{ipAutomaticConfiguration}</span> <span class="controlled-setting-indicator" managed="IPAddressConfigType"></span> </span> @@ -426,23 +417,24 @@ <table id="ip-address-settings"> <tr> <td class="spacer" width="14px"></td> - <td class="option-name" i18n-content="inetAddress"></td> + <td class="option-name">$i18n{inetAddress}</td> <td><div id="ip-address"></div></td> </tr> <tr> <td class="spacer" width="14px"></td> - <td class="option-name" id="ip-netmask-label" - i18n-content="inetNetmask"></td> + <td class="option-name" id="ip-netmask-label"> + $i18n{inetNetmask} + </td> <td><div id="ip-netmask"></div></td> </tr> <tr> <td class="spacer" width="14px"></td> - <td class="option-name" i18n-content="inetGateway"></td> + <td class="option-name">$i18n{inetGateway}</td> <td><div id="ip-gateway"></div></td> </tr> <tr> <td class="spacer" width="14px"></td> - <td class="option-name" i18n-content="ipv6Address"></td> + <td class="option-name">$i18n{ipv6Address}</td> <td><div id="ipv6-address"></div></td> </tr> </table> @@ -453,7 +445,7 @@ <input id="automatic-dns-radio" type="radio" name="dnstype" value="automatic"> <span> - <span i18n-content="automaticNameServers"></span> + <span>$i18n{automaticNameServers}</span> <span class="controlled-setting-indicator" managed="NameServersConfigType"></span> </span> @@ -472,7 +464,7 @@ <label> <input id="user-dns-radio" type="radio" name="dnstype" value="user"> - <span i18n-content="userNameServers"></span> + <span>$i18n{userNameServers}</span> </label> </div> <table id="user-dns-settings"> @@ -513,7 +505,7 @@ <label> <input id="sim-card-lock-enabled" type="checkbox"> <span> - <span i18n-content="lockSimCard"></span> + <span>$i18n{lockSimCard}</span> <span class="controlled-setting-indicator" managed="Cellular.SIMLockStatus.LockEnabled" internet-detail-for="sim-card-lock-enabled"></span> @@ -523,7 +515,7 @@ </section> <section> <div id="change-pin-area"> - <button id="change-pin" i18n-content="changePinButton"></button> + <button id="change-pin">$i18n{changePinButton}</button> <span class="controlled-setting-indicator" managed="Cellular.SIMLockStatus.LockType" internet-detail-for="change-pin"></span> @@ -540,14 +532,14 @@ <label> <input id="direct-proxy" type="radio" name="proxytype" value="1" pref="cros.session.proxy.type"> - <span i18n-content="proxyDirectInternetConnection"></span> + <span>$i18n{proxyDirectInternetConnection}</span> </label> </div> <div class="radio"> <label> <input id="auto-proxy" type="radio" name="proxytype" value="3" pref="cros.session.proxy.type"> - <span i18n-content="proxyAutomatic"></span> + <span>$i18n{proxyAutomatic}</span> </label> </div> <div class="proxy-subsection" id="auto-proxy-parms"> @@ -555,7 +547,7 @@ <label> <input id="proxy-use-pac-url" type="checkbox" pref="cros.session.proxy.usepacurl"> - <span i18n-content="proxyUseConfigUrl"></span> + <span>$i18n{proxyUseConfigUrl}</span> </label> </div> <div> @@ -569,7 +561,7 @@ <label> <input id="manual-proxy" type="radio" name="proxytype" value="2" pref="cros.session.proxy.type"> - <span i18n-content="proxyManual"></span> + <span>$i18n{proxyManual}</span> </label> </div> <div class="proxy-subsection" id="manual-proxy-parms"> @@ -577,19 +569,19 @@ <label> <input id="proxy-all-protocols" type="checkbox" pref="cros.session.proxy.single"> - <span i18n-content="sameProxyProtocols"></span> + <span>$i18n{sameProxyProtocols}</span> </label> </div> <div id="single-proxy"> <table> <tr> <td> - <span i18n-content="httpProxy"></span> + <span>$i18n{httpProxy}</span> <input id="proxy-host-single-name" type="text" size="25" pref="cros.session.proxy.singlehttp" disabled> </td> <td> - <span i18n-content="proxyPort"></span> + <span>$i18n{proxyPort}</span> <input id="proxy-host-single-port" size="4" pref="cros.session.proxy.singlehttpport" disabled> </td> @@ -600,14 +592,14 @@ <table> <tr> <td> - <span i18n-content="httpProxy"></span> + <span>$i18n{httpProxy}</span> </td> <td> <input id="proxy-host-name" type="text" size="25" pref="cros.session.proxy.httpurl" disabled> </td> <td> - <span i18n-content="proxyPort"></span> + <span>$i18n{proxyPort}</span> </td> <td> <input id="proxy-host-port" size="4" @@ -616,14 +608,14 @@ </tr> <tr> <td> - <span i18n-content="secureHttpProxy"></span> + <span>$i18n{secureHttpProxy}</span> </td> <td> <input id="secure-proxy-host-name" type="text" size="25" pref="cros.session.proxy.httpsurl" disabled> </td> <td> - <span i18n-content="proxyPort"></span> + <span>$i18n{proxyPort}</span> </td> <td> <input id="secure-proxy-port" size="4" @@ -632,14 +624,14 @@ </tr> <tr> <td> - <span i18n-content="ftpProxy"></span> + <span>$i18n{ftpProxy}</span> </td> <td> <input id="ftp-proxy" type="text" size="25" pref="cros.session.proxy.ftpurl" disabled> </td> <td> - <span i18n-content="proxyPort"></span> + <span>$i18n{proxyPort}</span> </td> <td> <input id="ftp-proxy-port" size="4" @@ -648,14 +640,14 @@ </tr> <tr> <td> - <span i18n-content="socksHost"></span> + <span>$i18n{socksHost}</span> </td> <td> <input id="socks-host" type="text" size="25" pref="cros.session.proxy.socks" disabled> </td> <td> - <span i18n-content="proxyPort"></span> + <span>$i18n{proxyPort}</span> </td> <td> <input id="socks-port" size="4" @@ -666,16 +658,16 @@ </div> <div id="advanced-config"> <div class="option vbox flex"> - <div i18n-content="proxyBypass"></div> + <div>$i18n{proxyBypass}</div> <list id="ignored-host-list"></list> <input id="new-host" type="url" size="30"> - <button id="add-host" i18n-content="addHost"></button> - <button id="remove-host" i18n-content="removeHost"></button> + <button id="add-host">$i18n{addHost}</button> + <button id="remove-host">$i18n{removeHost}</button> </div> </div> </div> <div class="proxy-subsection" id="web-proxy-auto-discovery"> - <span i18n-content="webProxyAutoDiscoveryUrl"></span> + <span>$i18n{webProxyAutoDiscoveryUrl}</span> <input id="web-proxy-auto-discovery-url" type="url" disabled> </div> </section> @@ -684,18 +676,14 @@ <div class="action-area"> <div class="button-strip"> <!-- TODO(dbeam): Clarify style guide regarding tag wrap. --> - <button id="details-internet-dismiss" class="default-button" - i18n-content="detailsInternetDismiss"> + <button id="details-internet-dismiss" class="default-button"> + $i18n{detailsInternetDismiss} </button> - <button id="details-internet-login" i18n-content="connectButton"> - </button> - <button id="details-internet-disconnect" i18n-content="disconnectButton"> - </button> - <button id="details-internet-configure" i18n-content="configureButton"> - </button> - <button id="activate-details" i18n-content="activateButton"></button> - <button id="view-account-details" i18n-content="viewAccountButton"> - </button> + <button id="details-internet-login">$i18n{connectButton}</button> + <button id="details-internet-disconnect">$i18n{disconnectButton}</button> + <button id="details-internet-configure">$i18n{configureButton}</button> + <button id="activate-details">$i18n{activateButton}</button> + <button id="view-account-details">$i18n{viewAccountButton}</button> </div> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/keyboard_overlay.html b/chrome/browser/resources/options/chromeos/keyboard_overlay.html index 9e316ebc..b5a33c1 100644 --- a/chrome/browser/resources/options/chromeos/keyboard_overlay.html +++ b/chrome/browser/resources/options/chromeos/keyboard_overlay.html
@@ -1,11 +1,11 @@ <div id="keyboard-overlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="keyboardOverlay"></h1> + <h1>$i18n{keyboardOverlay}</h1> <div class="content-area"> <table class="option-control-table"> <tr> - <td class="option-name" id="remap-search-key-to-label" - i18n-content="remapSearchKeyToContent"> + <td class="option-name" id="remap-search-key-to-label"> + $i18n{remapSearchKeyToContent} </td> <td class="option-value"> <select class="control" @@ -17,8 +17,8 @@ </td> </tr> <tr> - <td class="option-name" id="remap-control-key-to-label" - i18n-content="remapControlKeyToContent"> + <td class="option-name" id="remap-control-key-to-label"> + $i18n{remapControlKeyToContent} </td> <td class="option-value"> <select class="control" @@ -30,8 +30,8 @@ </td> </tr> <tr> - <td class="option-name" id="remap-alt-key-to-label" - i18n-content="remapAltKeyToContent"> + <td class="option-name" id="remap-alt-key-to-label"> + $i18n{remapAltKeyToContent} </td> <td class="option-value"> <select class="control" data-type="number" @@ -44,8 +44,8 @@ <!-- The caps lock section is hidden by default. This is only visible when --has-chromeos-keyboard flag is not passed. --> <tr id="caps-lock-remapping-section" hidden> - <td class="option-name" id="remap-caps-lock-key-to-label" - i18n-content="remapCapsLockKeyToContent"> + <td class="option-name" id="remap-caps-lock-key-to-label"> + $i18n{remapCapsLockKeyToContent} </td> <td class="option-value"> <select class="control" @@ -60,8 +60,8 @@ <!-- The diamond key section is hidden by default. This is only visible when --has-chromeos-diamond-key flag is passed. --> <tr id="diamond-key-remapping-section" hidden> - <td class="option-name" id="remap-diamond-key-to-label" - i18n-content="remapDiamondKeyToContent"> + <td class="option-name" id="remap-diamond-key-to-label"> + $i18n{remapDiamondKeyToContent} </td> <td class="option-value"> <select class="control" @@ -74,8 +74,8 @@ </td> </tr> <tr> - <td class="option-name" id="remap-backspace-key-to-label" - i18n-content="remapBackspaceKeyToContent"> + <td class="option-name" id="remap-backspace-key-to-label"> + $i18n{remapBackspaceKeyToContent} </td> <td class="option-value"> <select class="control" data-type="number" @@ -87,8 +87,8 @@ </td> </tr> <tr> - <td class="option-name" id="remap-escape-key-to-label" - i18n-content="remapEscapeKeyToContent"> + <td class="option-name" id="remap-escape-key-to-label"> + $i18n{remapEscapeKeyToContent} </td> <td class="option-value"> <select class="control" data-type="number" @@ -106,14 +106,15 @@ pref="settings.language.send_function_keys" aria-describedby="send-function-keys-description" dialog-pref> <span> - <span i18n-content="sendFunctionKeys"></span> + <span>$i18n{sendFunctionKeys}</span> <span class="bubble-button controlled-setting-indicator" pref="settings.language.send_function_keys"></span> </span> </label> </div> - <span id="send-function-keys-description" - i18n-content="sendFunctionKeysDescription"></span> + <span id="send-function-keys-description"> + $i18n{sendFunctionKeysDescription} + </span> </div> <div class="settings-row"> <div class="checkbox"> @@ -121,39 +122,41 @@ <input id="enable-auto-repeat" type="checkbox" pref="settings.language.xkb_auto_repeat_enabled_r2" metric="Options_KeyboardAutoRepeat" dialog-pref> - <span i18n-content="enableAutoRepeat"></span> + <span>$i18n{enableAutoRepeat}</span> </label> </div> <div id="auto-repeat-settings-section"> <div class="row"> - <span class="option-name" i18n-content="autoRepeatDelay"></span> - <span i18n-content="autoRepeatDelayLong"></span> + <span class="option-name">$i18n{autoRepeatDelay}</span> + <span>$i18n{autoRepeatDelayLong}</span> <input id="auto-repeat-delay-range" type="range" class="touch-slider" metric="Options_KeyboardAutoRepeat_Delay" pref="settings.language.xkb_auto_repeat_delay_r2" dialog-pref> - <span i18n-content="autoRepeatDelayShort"></span> + <span>$i18n{autoRepeatDelayShort}</span> </div> <div class="row"> - <span class="option-name" i18n-content="autoRepeatRate"></span> - <span i18n-content="autoRepeatRateSlow"></span> + <span class="option-name">$i18n{autoRepeatRate}</span> + <span>$i18n{autoRepeatRateSlow}</span> <input id="auto-repeat-interval-range" type="range" class="touch-slider" pref="settings.language.xkb_auto_repeat_interval_r2" metric="Options_KeyboardAutoRepeat_Interval" dialog-pref> - <span i18n-content="autoRepeatRateFast"></span> + <span>$i18n{autoRepeatRateFast}</span> </div> </div> </div> - <a is="action-link" id="keyboard-shortcuts" class="settings-row" - i18n-content="showKeyboardShortcuts"></a> - <a is="action-link" id="languages-and-input-settings" class="settings-row" - i18n-content="changeLanguageAndInputSettings"></a> + <a is="action-link" id="keyboard-shortcuts" class="settings-row"> + $i18n{showKeyboardShortcuts} + </a> + <a is="action-link" id="languages-and-input-settings" class="settings-row"> + $i18n{changeLanguageAndInputSettings} + </a> </div> <div class="action-area"> <div class="button-strip"> - <button id="keyboard-cancel" type="reset" i18n-content="cancel"></button> - <button id="keyboard-confirm" class="default-button" type="submit" - i18n-content="ok"> + <button id="keyboard-cancel" type="reset">$i18n{cancel}</button> + <button id="keyboard-confirm" class="default-button" type="submit"> + $i18n{ok} </button> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/pointer_overlay.html b/chrome/browser/resources/options/chromeos/pointer_overlay.html index 562522e..1462249 100644 --- a/chrome/browser/resources/options/chromeos/pointer_overlay.html +++ b/chrome/browser/resources/options/chromeos/pointer_overlay.html
@@ -2,12 +2,12 @@ <div class="close-button"></div> <div class="content-area"> <section id="pointer-section-touchpad" hidden> - <h3 i18n-content="pointerOverlaySectionTitleTouchpad"></h3> + <h3>$i18n{pointerOverlaySectionTitleTouchpad}</h3> <div class="checkbox"> <label> <input type="checkbox" metric="Options_TouchpadTapToClick" pref="settings.touchpad.enable_tap_to_click" dialog-pref> - <span i18n-content="enableTapToClick"></span> + <span>$i18n{enableTapToClick}</span> </label> </div> <div class="radio" id="touchpad-scroll-direction"> @@ -15,7 +15,7 @@ <input type="radio" name="touchpad-scroll-direction" value="false" metric="Options_TouchpadNaturalScroll" pref="settings.touchpad.natural_scroll" dialog-pref> - <span i18n-content="traditionalScroll"></span> + <span>$i18n{traditionalScroll}</span> </label> </div> <div class="radio"> @@ -23,27 +23,26 @@ <input type="radio" name="touchpad-scroll-direction" value="true" metric="Options_TouchpadNaturalScroll" pref="settings.touchpad.natural_scroll" dialog-pref> - <span i18n-values=".innerHTML:naturalScroll"></span> + <span>$i18nRaw{naturalScroll}</span> </label> </div> </section> <section id="pointer-section-mouse" hidden> - <h3 i18n-content="pointerOverlaySectionTitleMouse"></h3> + <h3>$i18n{pointerOverlaySectionTitleMouse}</h3> <div class="checkbox"> <label> <input type="checkbox" metric="Options_MousePrimaryRight" pref="settings.mouse.primary_right" dialog-pref> - <span i18n-content="primaryMouseRight"></span> + <span>$i18n{primaryMouseRight}</span> </label> </div> </section> </div> <div class="action-area"> <div class="button-strip"> - <button id="pointer-overlay-cancel" type="reset" i18n-content="cancel"> - </button> - <button id="pointer-overlay-confirm" class="default-button" type="submit" - i18n-content="ok"> + <button id="pointer-overlay-cancel" type="reset">$i18n{cancel}</button> + <button id="pointer-overlay-confirm" class="default-button" type="submit"> + $i18n{ok} </button> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/power_overlay.html b/chrome/browser/resources/options/chromeos/power_overlay.html index d6c628a..f4b637c 100644 --- a/chrome/browser/resources/options/chromeos/power_overlay.html +++ b/chrome/browser/resources/options/chromeos/power_overlay.html
@@ -1,18 +1,16 @@ <div id="power-overlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="powerOverlay"></h1> + <h1>$i18n{powerOverlay}</h1> <div class="content-area"> <table> <tr> - <td class="option-name" i18n-content="batteryStatusLabel"> - </td> + <td class="option-name">$i18n{batteryStatusLabel}</td> <td id="battery-status-value" class="option-value"> </td> </tr> <tr id="power-sources" hidden> <td class="option-name"> - <label id="power-source-label" i18n-content="powerSourceLabel"> - </label> + <label id="power-source-label">$i18n{powerSourceLabel}</label> </td> <td class="option-value"> <select id="power-source-dropdown" @@ -20,8 +18,7 @@ </td> </tr> <tr id="power-source-charger" hidden> - <td class="option-name" i18n-content="powerSourceLabel"> - </td> + <td class="option-name">$i18n{powerSourceLabel}</td> <td id="power-source-charger-type" class="option-value"> </td> </tr> @@ -29,8 +26,8 @@ </div> <div class="action-area"> <div class="button-strip"> - <button id="power-confirm" class="default-button" type="submit" - i18n-content="done"> + <button id="power-confirm" class="default-button" type="submit"> + $i18n{done} </button> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/preferred_networks.html b/chrome/browser/resources/options/chromeos/preferred_networks.html index 47b0d120..75b373e 100644 --- a/chrome/browser/resources/options/chromeos/preferred_networks.html +++ b/chrome/browser/resources/options/chromeos/preferred_networks.html
@@ -1,7 +1,6 @@ <div id="preferredNetworksPage" class="page" hidden> <div class="close-button"></div> - <h1 id="preferred-networks-page-title" - i18n-content="preferredNetworksPage"></h1> + <h1 id="preferred-networks-page-title" >$i18n{preferredNetworksPage}</h1> <div class="content-area"> <div class="settings-list"> <list id="remembered-network-list"></list> @@ -9,8 +8,8 @@ </div> <div class="action-area"> <div class="button-strip"> - <button id="preferred-networks-confirm" class="default-button" - i18n-content="done"> + <button id="preferred-networks-confirm" class="default-button"> + $i18n{done} </button> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/quick_unlock_configure_overlay.html b/chrome/browser/resources/options/chromeos/quick_unlock_configure_overlay.html index 07904cc..f0c54b1 100644 --- a/chrome/browser/resources/options/chromeos/quick_unlock_configure_overlay.html +++ b/chrome/browser/resources/options/chromeos/quick_unlock_configure_overlay.html
@@ -1,6 +1,6 @@ <div id="quick-unlock-configure-overlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="lockScreenTitle"></h1> + <h1>$i18n{lockScreenTitle}</h1> <settings-lock-screen prefs="{{prefs}}" tabindex=0> </settings-lock-screen>
diff --git a/chrome/browser/resources/options/chromeos/storage_clear_drive_cache_overlay.html b/chrome/browser/resources/options/chromeos/storage_clear_drive_cache_overlay.html index adc2fa5..3ef1c80 100644 --- a/chrome/browser/resources/options/chromeos/storage_clear_drive_cache_overlay.html +++ b/chrome/browser/resources/options/chromeos/storage_clear_drive_cache_overlay.html
@@ -1,14 +1,13 @@ <div id="clear-drive-cache-overlay-page" class="page" role="dialog" hidden> <div class="close-button"></div> - <h1 i18n-content="storageClearDriveCacheDialogTitle"></h1> + <h1>$i18n{storageClearDriveCacheDialogTitle}</h1> <div class="content-area"> - <div i18n-content="storageClearDriveCacheDescription"></div> + <div>$i18n{storageClearDriveCacheDescription}</div> </div> <div class="action-area button-strip"> - <button id="clear-drive-cache-overlay-cancel-button" i18n-content="cancel"> - </button> - <button id="clear-drive-cache-overlay-delete-button" class="default-button" - i18n-content="storageDeleteAllButtonTitle"> + <button id="clear-drive-cache-overlay-cancel-button">$i18n{cancel}</button> + <button id="clear-drive-cache-overlay-delete-button" class="default-button"> + $i18n{storageDeleteAllButtonTitle} </button> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/storage_manager.html b/chrome/browser/resources/options/chromeos/storage_manager.html index 8ca8fa5..faca73db 100644 --- a/chrome/browser/resources/options/chromeos/storage_manager.html +++ b/chrome/browser/resources/options/chromeos/storage_manager.html
@@ -1,31 +1,32 @@ <div id="storageManagerPage" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="storageManagerPage"></h1> + <h1>$i18n{storageManagerPage}</h1> <div id="storage-manager-message-low-space" class="storage-manager-message-area"> <div class="storage-manager-message-title"> <img src="space_low.svg"></img> - <span i18n-content="storageLowMessageTitle"></span> + <span>$i18n{storageLowMessageTitle}</span> </div> - <p i18n-content="storageLowMessageLine1"></p> - <p i18n-content="storageLowMessageLine2"></p> + <p>$i18n{storageLowMessageLine1}</p> + <p>$i18n{storageLowMessageLine2}</p> </div> <div id="storage-manager-message-critically-low-space" class="storage-manager-message-area"> <div class="storage-manager-message-title"> <img src="space_critically_low.svg"></img> - <span i18n-content="storageCriticallyLowMessageTitle"></span> + <span>$i18n{storageCriticallyLowMessageTitle}</span> </div> - <p i18n-content="storageCriticallyLowMessageLine1"></p> - <p i18n-content="storageCriticallyLowMessageLine2"></p> + <p>$i18n{storageCriticallyLowMessageLine1}</p> + <p>$i18n{storageCriticallyLowMessageLine2}</p> </div> <div class="content-area"> <div id="storage-manager-section-capacity" class="storage-manager-section"> <div class="storage-manager-item"> - <span i18n-content="storageItemLabelCapacity" - class="storage-manager-item-label"></span> + <span class="storage-manager-item-label"> + $i18n{storageItemLabelCapacity} + </span> <span id="storage-manager-size-capacity" class="storage-manager-item-size"></span> </div> @@ -33,58 +34,64 @@ </div> <div id="storage-manager-section-in-use" class="storage-manager-section"> <div class="storage-manager-item"> - <span i18n-content="storageItemLabelInUse" - class="storage-manager-item-label"></span> + <span class="storage-manager-item-label"> + $i18n{storageItemLabelInUse} + </span> <span id="storage-manager-size-in-use" class="storage-manager-item-size"></span> </div> <div class="storage-manager-subitem"> - <a is="action-link" - id="storage-manager-label-downloads" - i18n-content="storageSubitemLabelDownloads"></a> + <a is="action-link" id="storage-manager-label-downloads"> + $i18n{storageSubitemLabelDownloads} + </a> <span id="storage-manager-size-downloads" - class="storage-manager-item-size" - i18n-content="storageSizeCalculating"></span> + class="storage-manager-item-size"> + $i18n{storageSizeCalculating} + </span> </div> <div id="storage-manager-item-drive-cache" class="storage-manager-subitem" hidden> - <a is="action-link" - id="storage-manager-label-drive-cache" - i18n-content="storageSubitemLabelDriveCache"></a> + <a is="action-link" id="storage-manager-label-drive-cache"> + $i18n{storageSubitemLabelDriveCache} + </a> <span id="storage-manager-size-drive-cache" - class="storage-manager-item-size" - i18n-content="storageSizeCalculating"></span> + class="storage-manager-item-size"> + $i18n{storageSizeCalculating} + </span> </div> <div class="storage-manager-subitem"> - <a is="action-link" - id="storage-manager-label-browsing-data" - i18n-content="storageSubitemLabelBrowsingData"></a> + <a is="action-link" id="storage-manager-label-browsing-data"> + $i18n{storageSubitemLabelBrowsingData} + </a> <span id="storage-manager-size-browsing-data" - class="storage-manager-item-size" - i18n-content="storageSizeCalculating"></span> + class="storage-manager-item-size"> + $i18n{storageSizeCalculating} + </span> </div> <div id="storage-manager-item-arc" class="storage-manager-subitem" hidden> - <a is="action-link" - id="storage-manager-label-arc" - i18n-content="storageSubitemLabelArc"></a> - <span id="storage-manager-size-arc" - class="storage-manager-item-size" - i18n-content="storageSizeCalculating"></span> + <a is="action-link" id="storage-manager-label-arc"> + $i18n{storageSubitemLabelArc} + </a> + <span id="storage-manager-size-arc" class="storage-manager-item-size"> + $i18n{storageSizeCalculating} + </span> </div> <div class="storage-manager-subitem"> - <a is="action-link" - id="storage-manager-label-other-users" - i18n-content="storageSubitemLabelOtherUsers"></a> + <a is="action-link" id="storage-manager-label-other-users"> + $i18n{storageSubitemLabelOtherUsers} + </a> <span id="storage-manager-size-other-users" - class="storage-manager-item-size" - i18n-content="storageSizeCalculating"></span> + class="storage-manager-item-size"> + $i18n{storageSizeCalculating} + </span> </div> </div> <div id="storage-manager-section-available" class="storage-manager-section"> <div class="storage-manager-item"> - <span i18n-content="storageItemLabelAvailable" - class="storage-manager-item-label"></span> + <span class="storage-manager-item-label"> + $i18n{storageItemLabelAvailable} + </span> <span id="storage-manager-size-available" class="storage-manager-item-size"></span> </div> @@ -93,9 +100,7 @@ <div class="action-area"> <div class="button-strip"> - <button id="storage-confirm" class="default-button" - i18n-content="done"> - </button> + <button id="storage-confirm" class="default-button">$i18n{done}</button> </div> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/stylus_overlay.html b/chrome/browser/resources/options/chromeos/stylus_overlay.html index bc955bbe..af93cc6 100644 --- a/chrome/browser/resources/options/chromeos/stylus_overlay.html +++ b/chrome/browser/resources/options/chromeos/stylus_overlay.html
@@ -1,6 +1,6 @@ <div id="stylus-overlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="stylusOverlay"></h1> + <h1>$i18n{stylusOverlay}</h1> <div class="content-area"> <div class="option-control-table"> <div class="option-name"> @@ -8,7 +8,7 @@ <label> <input pref="settings.enable_stylus_tools" type="checkbox" dialog-pref> - <span i18n-content="stylusEnableStylusTools"></span> + <span>$i18n{stylusEnableStylusTools}</span> </label> </div> <div class="checkbox controlled-setting-with-label"> @@ -16,15 +16,14 @@ <input id="launch-palette-on-eject-input" pref="settings.launch_palette_on_eject_event" type="checkbox" dialog-pref> - <span i18n-content="stylusAutoOpenStylusTools"></span> + <span>$i18n{stylusAutoOpenStylusTools}</span> </label> </div> </div> <div class="settings-row"> <div class="controlled-setting-with-label"> <label> - <span class="option-name" - i18n-content="stylusNoteTakingApp"></span> + <span class="option-name">$i18n{stylusNoteTakingApp}</span> <select id="stylus-note-taking-app-select" class="option-value"> </select> </label> @@ -32,16 +31,17 @@ </div> </div> <div class="settings-row"> - <a is="action-link" i18n-content="stylusFindMoreApps" - id='stylus-find-more-link'></a> + <a is="action-link" id='stylus-find-more-link'> + $i18n{stylusFindMoreApps} + </a> </div> </div> <div class="action-area"> <div class="button-strip"> - <button id="stylus-cancel" type="reset" i18n-content="cancel"></button> - <button id="stylus-confirm" class="default-button" type="submit" - i18n-content="ok"> + <button id="stylus-cancel" type="reset">$i18n{cancel}</button> + <button id="stylus-confirm" class="default-button" type="submit"> + $i18n{ok} </button> </div> </div>
diff --git a/chrome/browser/resources/options/chromeos/third_party_ime_confirm_overlay.html b/chrome/browser/resources/options/chromeos/third_party_ime_confirm_overlay.html index 6308443..4664e52 100644 --- a/chrome/browser/resources/options/chromeos/third_party_ime_confirm_overlay.html +++ b/chrome/browser/resources/options/chromeos/third_party_ime_confirm_overlay.html
@@ -1,19 +1,19 @@ <div id="third-party-ime-confirm-overlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="thirdPartyImeConfirmOverlay"></h1> + <h1>$i18n{thirdPartyImeConfirmOverlay}</h1> <div class="content-area"> - <span id="third-party-ime-confirm-text" - i18n-content="thirdPartyImeConfirmMessage"> + <span id="third-party-ime-confirm-text"> + $i18n{thirdPartyImeConfirmMessage} </span> </div> <div class="action-area"> <div class="action-area-right"> <div class="button-strip"> - <button id="third-party-ime-confirm-cancel" - i18n-content="thirdPartyImeConfirmDisable"> + <button id="third-party-ime-confirm-cancel"> + $i18n{thirdPartyImeConfirmDisable} </button> - <button id="third-party-ime-confirm-ok" class="default-button" - i18n-content="thirdPartyImeConfirmEnable"> + <button id="third-party-ime-confirm-ok" class="default-button"> + $i18n{thirdPartyImeConfirmEnable} </button> </div> </div>
diff --git a/chrome/browser/resources/options/clear_browser_data_history_notice_overlay.html b/chrome/browser/resources/options/clear_browser_data_history_notice_overlay.html index 5de4a32..f77e4b5 100644 --- a/chrome/browser/resources/options/clear_browser_data_history_notice_overlay.html +++ b/chrome/browser/resources/options/clear_browser_data_history_notice_overlay.html
@@ -1,12 +1,12 @@ <div id="clear-browser-data-history-notice" class="page" hidden> - <h1 i18n-content="clearBrowserDataHistoryNoticeTitle"></h1> + <h1>$i18n{clearBrowserDataHistoryNoticeTitle}</h1> <div class="content-area"> - <p i18n-values=".innerHTML:clearBrowserDataHistoryNotice"></p> + <p>$i18nRaw{clearBrowserDataHistoryNotice}</p> </div> <div class="action-area"> <div class="button-strip"> - <button id="clear-browser-data-history-notice-ok" class="default-button" - i18n-content="clearBrowserDataHistoryNoticeOk"> + <button id="clear-browser-data-history-notice-ok" class="default-button"> + $i18n{clearBrowserDataHistoryNoticeOk} </button> </div> </div>
diff --git a/chrome/browser/resources/options/clear_browser_data_overlay.html b/chrome/browser/resources/options/clear_browser_data_overlay.html index a36ef906..ec5faef 100644 --- a/chrome/browser/resources/options/clear_browser_data_overlay.html +++ b/chrome/browser/resources/options/clear_browser_data_overlay.html
@@ -1,11 +1,11 @@ <div id="clear-browser-data-overlay" class="page not-resizable" hidden> <div class="close-button"></div> - <h1 i18n-content="clearBrowserDataOverlay"></h1> + <h1>$i18n{clearBrowserDataOverlay}</h1> <!-- NOTE: Make sure there's not whitespace between <div></div> for #clear-browser-data-info-banner as it's styled with :empty. --> <div id="clear-browser-data-info-banner"></div> <div id="cbd-content-area" class="content-area"> - <span i18n-content="clearBrowserDataLabel"></span> + <span>$i18n{clearBrowserDataLabel}</span> <select id="clear-browser-data-time-period" i18n-options="clearBrowserDataTimeList" pref="browser.clear_data.time_period" @@ -18,7 +18,7 @@ pref="browser.clear_data.browsing_history" type="checkbox" aria-controls="delete-browsing-history-counter"> <span> - <span i18n-content="deleteBrowsingHistoryCheckbox"></span> + <span>$i18n{deleteBrowsingHistoryCheckbox}</span> <span class="controlled-setting-indicator" pref="history.deleting_enabled"> </span> @@ -31,7 +31,7 @@ <label> <input id="delete-download-history-checkbox" pref="browser.clear_data.download_history" type="checkbox"> - <span i18n-content="deleteDownloadHistoryCheckbox"></span> + <span>$i18n{deleteDownloadHistoryCheckbox}</span> <span class="controlled-setting-indicator" pref="history.deleting_enabled"> </span> @@ -41,10 +41,12 @@ <label> <input id="delete-cookies-checkbox" pref="browser.clear_data.cookies" type="checkbox"> - <span i18n-content="deleteCookiesFlashCheckbox" - class="clear-plugin-lso-data-enabled"></span> - <span i18n-content="deleteCookiesCheckbox" - class="clear-plugin-lso-data-disabled"></span> + <span class="clear-plugin-lso-data-enabled"> + $i18n{deleteCookiesFlashCheckbox} + </span> + <span class="clear-plugin-lso-data-disabled"> + $i18n{deleteCookiesCheckbox} + </span> </label> </div> <div id="delete-cache-container" class="checkbox"> @@ -53,7 +55,7 @@ pref="browser.clear_data.cache" type="checkbox" aria-controls="delete-cache-counter"> <span> - <span i18n-content="deleteCacheCheckbox"></span> + <span>$i18n{deleteCacheCheckbox}</span> <span class="clear-browser-data-counter" role="note" aria-live="polite" id="delete-cache-counter"></span> </span> @@ -65,7 +67,7 @@ pref="browser.clear_data.passwords" type="checkbox" aria-controls="delete-passwords-counter"> <span> - <span i18n-content="deletePasswordsCheckbox"></span> + <span>$i18n{deletePasswordsCheckbox}</span> <span class="clear-browser-data-counter" role="note" aria-live="polite" id="delete-passwords-counter"></span> </span> @@ -77,7 +79,7 @@ pref="browser.clear_data.form_data" type="checkbox" aria-controls="delete-form-data-counter"> <span> - <span i18n-content="deleteFormDataCheckbox"></span> + <span>$i18n{deleteFormDataCheckbox}</span> <span class="clear-browser-data-counter" role="note" aria-live="polite" id="delete-form-data-counter"></span> </span> @@ -87,7 +89,7 @@ <label> <input id="delete-hosted-apps-data-checkbox" pref="browser.clear_data.hosted_apps_data" type="checkbox"> - <span i18n-content="deleteHostedAppsDataCheckbox"></span> + <span>$i18n{deleteHostedAppsDataCheckbox}</span> </label> </div> <div id="delete-media-licenses-container" class="checkbox"> @@ -96,7 +98,7 @@ pref="browser.clear_data.media_licenses" type="checkbox" aria-controls="delete-media-licenses-counter"> <span> - <span i18n-content="deleteMediaLicensesCheckbox"></span> + <span>$i18n{deleteMediaLicensesCheckbox}</span> <span class="clear-browser-data-counter" role="note" aria-live="polite" id="delete-media-licenses-counter"></span> </span> @@ -104,34 +106,33 @@ </div> </div> <div id="flash-storage-settings" class="flash-plugin-area"> - <a target="_blank" i18n-content="flashStorageSettings" - i18n-values="href:flashStorageUrl"></a> + <a target="_blank" + href="$i18nRaw{flashStorageUrl}">$i18n{flashStorageSettings}</a> </div> </div> <div class="action-area"> <div class="hbox stretch"> - <a id="clear-browser-data-old-learn-more-link" hidden - target="_blank" i18n-content="learnMore" - i18n-values="href:clearBrowsingDataLearnMoreUrl"></a> + <a id="clear-browser-data-old-learn-more-link" hidden target="_blank" + href="$i18nRaw{clearBrowsingDataLearnMoreUrl}">$i18n{learnMore}</a> </div> <div class="action-area-right"> <div id="cbd-throbber" class="throbber"></div> <div class="button-strip"> - <button id="clear-browser-data-dismiss" i18n-content="cancel"></button> - <button id="clear-browser-data-commit" class="default-button" - i18n-content="clearBrowserDataCommit"> + <button id="clear-browser-data-dismiss">$i18n{cancel}</button> + <button id="clear-browser-data-commit" class="default-button"> + $i18n{clearBrowserDataCommit} </button> </div> </div> </div> <div id="some-stuff-remains-footer" class="gray-bottom-bar"> - <p id="clear-browser-data-history-footer" - i18n-values=".innerHTML:clearBrowserDataHistoryFooter" hidden></p> + <p id="clear-browser-data-history-footer" hidden> + $i18nRaw{clearBrowserDataHistoryFooter} + </p> <p id="clear-browser-data-general-footer"> <span><!--This is filled by JavaScript--></span> - <a id="clear-browser-data-footer-learn-more-link" hidden - target="_blank" i18n-content="learnMore" - i18n-values="href:clearBrowsingDataLearnMoreUrl"></a> + <a id="clear-browser-data-footer-learn-more-link" hidden target="_blank" + href="$i18nRaw{clearBrowsingDataLearnMoreUrl}">$i18n{learnMore}</a> </p> </div> </div>
diff --git a/chrome/browser/resources/options/content_settings.html b/chrome/browser/resources/options/content_settings.html index c66fc23e..db50994 100644 --- a/chrome/browser/resources/options/content_settings.html +++ b/chrome/browser/resources/options/content_settings.html
@@ -1,16 +1,16 @@ <div id="content-settings-page" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="contentSettingsPage"></h1> + <h1>$i18n{contentSettingsPage}</h1> <div class="content-area"> <!-- Cookie filter tab contents --> <section> - <h3 i18n-content="cookiesTabLabel"></h3> + <h3>$i18n{cookiesTabLabel}</h3> <div> <div class="radio controlled-setting-with-label"> <label> <input type="radio" name="cookies" value="allow"> <span> - <span i18n-content="cookiesAllow"></span> + <span>$i18n{cookiesAllow}</span> <span class="controlled-setting-indicator" content-setting="cookies" value="allow"></span> </span> @@ -20,7 +20,7 @@ <label> <input type="radio" name="cookies" value="session_only"> <span> - <span i18n-content="cookiesSessionOnly"></span> + <span>$i18n{cookiesSessionOnly}</span> <span class="controlled-setting-indicator" content-setting="cookies" value="session_only"></span> </span> @@ -30,7 +30,7 @@ <label> <input type="radio" name="cookies" value="block"> <span> - <span i18n-content="cookiesBlock"></span> + <span>$i18n{cookiesBlock}</span> <span class="controlled-setting-indicator" content-setting="cookies" value="block"></span> </span> @@ -40,28 +40,28 @@ <label> <input pref="profile.block_third_party_cookies" type="checkbox"> <span> - <span i18n-content="cookiesBlock3rdParty"></span> + <span>$i18n{cookiesBlock3rdParty}</span> <span class="controlled-setting-indicator" pref="profile.block_third_party_cookies"></span> </label> </div> <div class="settings-row"> - <button class="exceptions-list-button" contentType="cookies" - i18n-content="manageExceptions"></button> - <button id="show-cookies-button" - i18n-content="cookiesShowCookies"></button> + <button class="exceptions-list-button" contentType="cookies"> + $i18n{manageExceptions} + </button> + <button id="show-cookies-button">$i18n{cookiesShowCookies}</button> </div> </div> </section> <!-- Image filter --> <section> - <h3 i18n-content="imagesTabLabel"></h3> + <h3>$i18n{imagesTabLabel}</h3> <div> <div class="radio controlled-setting-with-label"> <label> <input type="radio" name="images" value="allow"> <span> - <span i18n-content="imagesAllow"></span> + <span>$i18n{imagesAllow}</span> <span class="controlled-setting-indicator" content-setting="images" value="allow"></span> </span> @@ -71,27 +71,28 @@ <label> <input type="radio" name="images" value="block"> <span> - <span i18n-content="imagesBlock"></span> + <span>$i18n{imagesBlock}</span> <span class="controlled-setting-indicator" content-setting="images" value="block"></span> </span> </label> </div> <div class="settings-row"> - <button class="exceptions-list-button" contentType="images" - i18n-content="manageExceptions"></button> + <button class="exceptions-list-button" contentType="images"> + $i18n{manageExceptions} + </button> </div> </div> </section> <!-- JavaScript filter --> <section> - <h3 i18n-content="javascriptTabLabel"></h3> + <h3>$i18n{javascriptTabLabel}</h3> <div> <div class="radio controlled-setting-with-label"> <label> <input type="radio" name="javascript" value="allow"> <span> - <span i18n-content="javascriptAllow"></span> + <span>$i18n{javascriptAllow}</span> <span class="controlled-setting-indicator" content-setting="javascript" value="allow"></span> </span> @@ -101,52 +102,54 @@ <label> <input type="radio" name="javascript" value="block"> <span> - <span i18n-content="javascriptBlock"></span> + <span>$i18n{javascriptBlock}</span> <span class="controlled-setting-indicator" content-setting="javascript" value="block"></span> </span> </label> </div> <div class="settings-row"> - <button class="exceptions-list-button" contentType="javascript" - i18n-content="manageExceptions"></button> + <button class="exceptions-list-button" contentType="javascript"> + $i18n{manageExceptions} + </button> </div> </div> </section> <!-- Handlers settings --> <section id="handlers-section"> - <h3 i18n-content="handlersTabLabel"></h3> + <h3>$i18n{handlersTabLabel}</h3> <div> <div class="radio"> <label> <input type="radio" name="handlers" value="allow" class="handler-radio"> - <span i18n-content="handlersAllow"></span> + <span>$i18n{handlersAllow}</span> </label> </div> <div class="radio"> <label> <input type="radio" name="handlers" value="block" class="handler-radio"> - <span i18n-content="handlersBlock"></span> + <span>$i18n{handlersBlock}</span> </label> </div> <div class="settings-row"> - <button id="manage-handlers-button" contentType="handlers" - i18n-content="manageHandlers"></button> + <button id="manage-handlers-button" contentType="handlers"> + $i18n{manageHandlers} + </button> </div> </div> </section> <!-- Plugins filter --> <section> - <h3 i18n-content="pluginsTabLabel"></h3> + <h3>$i18n{pluginsTabLabel}</h3> <div> <div class="radio controlled-setting-with-label"> <label> <input id="plugins-allow-radio" type="radio" name="plugins" value="allow"> <span> - <span i18n-content="pluginsAllow"></span> + <span>$i18n{pluginsAllow}</span> <span class="controlled-setting-indicator" content-setting="plugins" value="allow"></span> </span> @@ -156,9 +159,10 @@ <label> <input type="radio" name="plugins" value="detect_important_content"> <span> - <span i18n-content="pluginsDetectImportantContent"></span> + <span>$i18n{pluginsDetectImportantContent}</span> <span class="controlled-setting-indicator" - content-setting="plugins" value="detect_important_content"></span> + content-setting="plugins" value="detect_important_content"> + </span> </span> </label> </div> @@ -166,27 +170,28 @@ <label> <input type="radio" name="plugins" value="block"> <span> - <span i18n-content="pluginsBlock"></span> + <span>$i18n{pluginsBlock}</span> <span class="controlled-setting-indicator" content-setting="plugins" value="block"></span> </span> </label> </div> <div class="settings-row"> - <button class="exceptions-list-button" contentType="plugins" - i18n-content="manageExceptions"></button> + <button class="exceptions-list-button" contentType="plugins"> + $i18n{manageExceptions} + </button> </div> </div> </section> <!-- Pop-ups filter --> <section> - <h3 i18n-content="popupsTabLabel" class="content-settings-header"></h3> + <h3 class="content-settings-header">$i18n{popupsTabLabel}</h3> <div> <div class="radio controlled-setting-with-label"> <label> <input type="radio" name="popups" value="allow"> <span> - <span i18n-content="popupsAllow"></span> + <span>$i18n{popupsAllow}</span> <span class="controlled-setting-indicator" content-setting="popups" value="allow"></span> </span> @@ -196,27 +201,28 @@ <label> <input type="radio" name="popups" value="block"> <span> - <span i18n-content="popupsBlock"></span> + <span>$i18n{popupsBlock}</span> <span class="controlled-setting-indicator" content-setting="popups" value="block"></span> </span> </label> </div> <div class="settings-row"> - <button class="exceptions-list-button" contentType="popups" - i18n-content="manageExceptions"></button> + <button class="exceptions-list-button" contentType="popups"> + $i18n{manageExceptions} + </button> </div> </div> </section> <!-- Location filter --> <section> - <h3 i18n-content="locationTabLabel"></h3> + <h3>$i18n{locationTabLabel}</h3> <div> <div class="radio controlled-setting-with-label"> <label> <input type="radio" name="location" value="allow"> <span> - <span i18n-content="locationAllow"></span> + <span>$i18n{locationAllow}</span> <span class="controlled-setting-indicator" content-setting="location" value="allow"></span> </span> @@ -226,7 +232,7 @@ <label> <input type="radio" name="location" value="ask"> <span> - <span i18n-content="locationAsk"></span> + <span>$i18n{locationAsk}</span> <span class="controlled-setting-indicator" content-setting="location" value="ask"></span> </span> @@ -237,7 +243,7 @@ <input type="radio" name="location" value="block"> <span> - <span i18n-content="locationBlock"></span> + <span>$i18n{locationBlock}</span> <span class="controlled-setting-indicator" content-setting="location" value="block"></span> </span> @@ -251,7 +257,7 @@ metric="Options_GoogleGeolocationAccessCheckbox" type="checkbox"> <span> - <span i18n-content="googleGeolocationAccessEnable"></span> + <span>$i18n{googleGeolocationAccessEnable}</span> <span class="controlled-setting-indicator" pref="googlegeolocationaccess.enabled"></span> </span> @@ -259,20 +265,21 @@ </div> </if> <div class="settings-row"> - <button class="exceptions-list-button" contentType="location" - i18n-content="manageExceptions"></button> + <button class="exceptions-list-button" contentType="location"> + $i18n{manageExceptions} + </button> </div> </div> </section> <!-- Notifications filter tab contents --> <section id="notifications-section"> - <h3 i18n-content="notificationsTabLabel"></h3> + <h3>$i18n{notificationsTabLabel}</h3> <div> <div class="radio controlled-setting-with-label"> <label> <input type="radio" name="notifications" value="allow"> <span> - <span i18n-content="notificationsAllow"></span> + <span>$i18n{notificationsAllow}</span> <span class="controlled-setting-indicator" content-setting="notifications" value="allow"></span> </span> @@ -282,7 +289,7 @@ <label> <input type="radio" name="notifications" value="ask"> <span> - <span i18n-content="notificationsAsk"></span> + <span>$i18n{notificationsAsk}</span> <span class="controlled-setting-indicator" content-setting="notifications" value="ask"></span> </span> @@ -292,64 +299,65 @@ <label> <input type="radio" name="notifications" value="block"> <span> - <span i18n-content="notificationsBlock"></span> + <span>$i18n{notificationsBlock}</span> <span class="controlled-setting-indicator" content-setting="notifications" value="block"></span> </span> </label> </div> <div class="settings-row"> - <button class="exceptions-list-button" contentType="notifications" - i18n-content="manageExceptions"></button> + <button class="exceptions-list-button" contentType="notifications"> + $i18n{manageExceptions} + </button> </div> </div> </section> <!-- Protected Content filter --> <section guest-visibility="disabled"> - <h3 i18n-content="protectedContentTabLabel" - class="content-settings-header"></h3> + <h3 class="content-settings-header">$i18n{protectedContentTabLabel}</h3> <div> <div class="checkbox"> <label> <input pref="webkit.webprefs.encrypted_media_enabled" type="checkbox"> - <span i18n-content="protectedContentEnableCheckbox"></span> + <span>$i18n{protectedContentEnableCheckbox}</span> </label> </div> <if expr="chromeos or is_win"> <div class="settings-row"> - <p i18n-content="protectedContentInfo"></p> + <p>$i18n{protectedContentInfo}</p> </div> <div class="checkbox"> <label> <input pref="settings.privacy.drm_enabled" type="checkbox"> - <span i18n-content="protectedContentEnableIdentifiersCheckbox"> - </span> + <span>$i18n{protectedContentEnableIdentifiersCheckbox}</span> </label> </div> </if> <if expr="chromeos"> <div class="settings-row"> <button id="protected-content-exceptions" - class="exceptions-list-button" contentType="protectedContent" - i18n-content="manageExceptions"></button> + class="exceptions-list-button" contentType="protectedContent"> + $i18n{manageExceptions} + </button> </div> </if> </div> </section> <!-- Microphone filter --> <section id="media-stream-mic"> - <h3 i18n-content="mediaStreamMicTabLabel"></h3> + <h3>$i18n{mediaStreamMicTabLabel}</h3> <div> - <span id="media-select-mic-label" - i18n-content="mediaSelectMicLabel" hidden></span> + <span id="media-select-mic-label" hidden> + $i18n{mediaSelectMicLabel} + </span> <select id="media-select-mic" class="weakrtl media-device-control" aria-labelledby="media-select-mic-label"></select> <div class="radio controlled-setting-with-label"> <label> <input type="radio" name="media-stream-mic" value="ask"> <span> - <span i18n-content="mediaStreamMicAsk"></span> + <span>$i18n{mediaStreamMicAsk}</span> <span class="controlled-setting-indicator" content-setting="media-stream-mic" value="ask"></span> </span> @@ -359,36 +367,39 @@ <label> <input type="radio" name="media-stream-mic" value="block"> <span> - <span i18n-content="mediaStreamMicBlock"></span> + <span>$i18n{mediaStreamMicBlock}</span> <span class="controlled-setting-indicator" content-setting="media-stream-mic" value="block"></span> </span> </label> </div> <div class="settings-row"> - <button class="exceptions-list-button" contentType="media-stream-mic" - i18n-content="manageExceptions"></button> + <button class="exceptions-list-button" contentType="media-stream-mic"> + $i18n{manageExceptions} + </button> </div> <div id="media-pepper-flash-default-mic" class="pepper-flash-settings"> - <span i18n-content="mediaPepperFlashMicDefaultDivergedLabel"></span> - <a target="_blank" i18n-content="mediaPepperFlashChangeLink" - i18n-values="href:mediaPepperFlashGlobalPrivacyURL"></a> + <span>$i18n{mediaPepperFlashMicDefaultDivergedLabel}</span> + <a target="_blank" href="$i18nRaw{mediaPepperFlashGlobalPrivacyURL}"> + $i18n{mediaPepperFlashChangeLink} + </a> </div> </div> </section> <!-- Camera filter --> <section id="media-stream-camera"> - <h3 i18n-content="mediaStreamCameraTabLabel"></h3> + <h3>$i18n{mediaStreamCameraTabLabel}</h3> <div> - <span id="media-select-camera-label" - i18n-content="mediaSelectCameraLabel" hidden></span> + <span id="media-select-camera-label" hidden> + $i18n{mediaSelectCameraLabel} + </span> <select id="media-select-camera" class="weakrtl media-device-control" aria-labelledby="media-select-camera-label"></select> <div class="radio controlled-setting-with-label"> <label> <input type="radio" name="media-stream-camera" value="ask"> <span> - <span i18n-content="mediaStreamCameraAsk"></span> + <span>$i18n{mediaStreamCameraAsk}</span> <span class="controlled-setting-indicator" content-setting="media-stream-camera" value="ask"></span> </span> @@ -398,7 +409,7 @@ <label> <input type="radio" name="media-stream-camera" value="block"> <span> - <span i18n-content="mediaStreamCameraBlock"></span> + <span>$i18n{mediaStreamCameraBlock}</span> <span class="controlled-setting-indicator" content-setting="media-stream-camera" value="block"></span> </span> @@ -406,27 +417,28 @@ </div> <div class="settings-row"> <button class="exceptions-list-button" - contentType="media-stream-camera" i18n-content="manageExceptions"> + contentType="media-stream-camera"> + $i18n{manageExceptions} </button> </div> <div id="media-pepper-flash-default-camera" class="pepper-flash-settings"> - <span i18n-content="mediaPepperFlashCameraDefaultDivergedLabel"> - </span> - <a target="_blank" i18n-content="mediaPepperFlashChangeLink" - i18n-values="href:mediaPepperFlashGlobalPrivacyURL"></a> + <span>$i18n{mediaPepperFlashCameraDefaultDivergedLabel}</span> + <a target="_blank" href="$i18nRaw{mediaPepperFlashGlobalPrivacyURL}"> + $i18n{mediaPepperFlashChangeLink} + </a> </div> </div> </section> <!-- PPAPI broker --> <section> - <h3 i18n-content="ppapiBrokerTabLabel"></h3> + <h3>$i18n{ppapiBrokerTabLabel}</h3> <div> <div class="radio"> <label> <input type="radio" name="ppapi-broker" value="allow"> <span> - <span i18n-content="ppapiBrokerAllow"></span> + <span>$i18n{ppapiBrokerAllow}</span> <span class="controlled-setting-indicator" content-setting="ppapi-broker" value="allow"></span> </span> @@ -436,7 +448,7 @@ <label> <input type="radio" name="ppapi-broker" value="ask"> <span> - <span i18n-content="ppapiBrokerAsk"></span> + <span>$i18n{ppapiBrokerAsk}</span> <span class="controlled-setting-indicator" content-setting="ppapi-broker" value="ask"></span> </span> @@ -446,28 +458,29 @@ <label> <input type="radio" name="ppapi-broker" value="block"> <span> - <span i18n-content="ppapiBrokerBlock"></span> + <span>$i18n{ppapiBrokerBlock}</span> <span class="controlled-setting-indicator" content-setting="ppapi-broker" value="block"></span> </span> </label> </div> <div class="settings-row"> - <button class="exceptions-list-button" contentType="ppapi-broker" - i18n-content="manageExceptions"></button> + <button class="exceptions-list-button" contentType="ppapi-broker"> + $i18n{manageExceptions} + </button> </div> </div> </section> <!-- Automatic Downloads filter --> <section> - <h3 i18n-content="multipleAutomaticDownloadsTabLabel"></h3> + <h3>$i18n{multipleAutomaticDownloadsTabLabel}</h3> <div> <div class="radio controlled-setting-with-label"> <label> <input type="radio" name="multiple-automatic-downloads" value="allow"> <span> - <span i18n-content="multipleAutomaticDownloadsAllow"></span> + <span>$i18n{multipleAutomaticDownloadsAllow}</span> <span class="controlled-setting-indicator" content-setting="multiple-automatic-downloads" value="allow"> </span> @@ -478,7 +491,7 @@ <label> <input type="radio" name="multiple-automatic-downloads" value="ask"> <span> - <span i18n-content="multipleAutomaticDownloadsAsk"></span> + <span>$i18n{multipleAutomaticDownloadsAsk}</span> <span class="controlled-setting-indicator" content-setting="multiple-automatic-downloads" value="ask"> </span> @@ -490,7 +503,7 @@ <input type="radio" name="multiple-automatic-downloads" value="block"> <span> - <span i18n-content="multipleAutomaticDownloadsBlock"></span> + <span>$i18n{multipleAutomaticDownloadsBlock}</span> <span class="controlled-setting-indicator" content-setting="multiple-automatic-downloads" value="block"> </span> @@ -499,118 +512,124 @@ </div> <div class="settings-row"> <button class="exceptions-list-button" - contentType="multiple-automatic-downloads" - i18n-content="manageExceptions"></button> + contentType="multiple-automatic-downloads"> + $i18n{manageExceptions} + </button> </div> </div> </section> <!-- MIDI system exclusive messages filter --> <section> - <h3 i18n-content="midiSysexHeader"></h3> + <h3>$i18n{midiSysexHeader}</h3> <div> <div class="radio"> <label> <input type="radio" name="midi-sysex" value="allow"> - <span i18n-content="midiSysExAllow"></span> + <span>$i18n{midiSysExAllow}</span> </label> </div> <div class="radio"> <label> <input type="radio" name="midi-sysex" value="ask"> - <span i18n-content="midiSysExAsk"></span> + <span>$i18n{midiSysExAsk}</span> </label> </div> <div class="radio"> <label> <input type="radio" name="midi-sysex" value="block"> - <span i18n-content="midiSysExBlock"></span> + <span>$i18n{midiSysExBlock}</span> </label> </div> <div class="settings-row"> - <button class="exceptions-list-button" contentType="midi-sysex" - i18n-content="manageExceptions"></button> + <button class="exceptions-list-button" contentType="midi-sysex"> + $i18n{manageExceptions} + </button> </div> </div> </section> <!-- Push messaging filter --> <section id="experimental-push-messaging-settings" hidden="true"> - <h3 i18n-content="pushMessagingHeader"></h3> + <h3>$i18n{pushMessagingHeader}</h3> <div> <div class="radio"> <label> <input type="radio" name="push-messaging" value="allow"> - <span i18n-content="pushMessagingAllow"></span> + <span>$i18n{pushMessagingAllow}</span> </label> </div> <div class="radio"> <label> <input type="radio" name="push-messaging" value="ask"> - <span i18n-content="pushMessagingAsk"></span> + <span>$i18n{pushMessagingAsk}</span> </label> </div> <div class="radio"> <label> <input type="radio" name="push-messaging" value="block"> - <span i18n-content="pushMessagingBlock"></span> + <span>$i18n{pushMessagingBlock}</span> </label> </div> <div class="settings-row"> - <button class="exceptions-list-button" contentType="push-messaging" - i18n-content="manageExceptions"></button> + <button class="exceptions-list-button" contentType="push-messaging"> + $i18n{manageExceptions} + </button> </div> </div> </section> <!-- USB devices --> <section> - <h3 i18n-content="usbDevicesHeader"></h3> + <h3>$i18n{usbDevicesHeader}</h3> <div> <div class="settings-row"> - <button class="exceptions-list-button" contentType="usb-devices" - i18n-content="usbDevicesManage"></button> + <button class="exceptions-list-button" contentType="usb-devices"> + $i18n{usbDevicesManage} + </button> </div> </div> </section> <!-- Background sync --> <section> - <h3 i18n-content="backgroundSyncHeader"></h3> + <h3>$i18n{backgroundSyncHeader}</h3> <div> <div class="radio"> <label> <input type="radio" name="background-sync" value="allow"> - <span i18n-content="backgroundSyncAllow"></span> + <span>$i18n{backgroundSyncAllow}</span> </label> </div> <div class="radio"> <label> <input type="radio" name="background-sync" value="block"> - <span i18n-content="backgroundSyncBlock"></span> + <span>$i18n{backgroundSyncBlock}</span> </label> </div> <div class="settings-row"> - <button class="exceptions-list-button" contentType="background-sync" - i18n-content="manageExceptions"></button> + <button class="exceptions-list-button" contentType="background-sync"> + $i18n{manageExceptions} + </button> </div> </div> </section> <!-- Page zoom levels --> <section id="page-zoom-levels"> - <h3 i18n-content="zoomlevelsHeader"></h3> + <h3>$i18n{zoomlevelsHeader}</h3> <div> <div class="settings-row"> - <button class="exceptions-list-button" contentType="zoomlevels" - i18n-content="zoomLevelsManage"></button> + <button class="exceptions-list-button" contentType="zoomlevels"> + $i18n{zoomLevelsManage} + </button> </div> </div> </section> <!-- PDF Plugin filter --> <section id="pdf-section"> - <h3 i18n-content="pdfTabLabel" class="content-settings-header"></h3> + <h3 class="content-settings-header">$i18n{pdfTabLabel}</h3> <div> <div class="checkbox"> <label> <input pref="plugins.always_open_pdf_externally" type="checkbox"> <span> - <span i18n-content="pdfEnable"></span> + <span>$i18n{pdfEnable}</span> <span class="controlled-setting-indicator" pref="plugins.always_open_pdf_externally"> </span> @@ -622,8 +641,8 @@ </div> <div class="action-area"> <div class="button-strip"> - <button id="content-settings-overlay-confirm" class="default-button" - i18n-content="done"> + <button id="content-settings-overlay-confirm" class="default-button"> + $i18n{done} </button> </div> </div>
diff --git a/chrome/browser/resources/options/content_settings_exceptions_area.html b/chrome/browser/resources/options/content_settings_exceptions_area.html index 079080f..c6b5efd 100644 --- a/chrome/browser/resources/options/content_settings_exceptions_area.html +++ b/chrome/browser/resources/options/content_settings_exceptions_area.html
@@ -3,63 +3,56 @@ <h1></h1> <div class="content-area"> <div id="exception-column-headers"> - <div id="exception-pattern-column" i18n-content="exceptionPatternHeader"> + <div id="exception-pattern-column">$i18n{exceptionPatternHeader}</div> + <div id="exception-behavior-column" class="exception-value-column-header"> + $i18n{exceptionBehaviorHeader} </div> - <div id="exception-behavior-column" - i18n-content="exceptionBehaviorHeader" - class="exception-value-column-header"> - </div> - <div id="exception-zoom-column" - i18n-content="exceptionZoomHeader" - class="exception-value-column-header" hidden> + <div id="exception-zoom-column" class="exception-value-column-header" + hidden> + $i18n{exceptionZoomHeader} </div> <div id="exception-usb-device-column" - i18n-content="exceptionUsbDeviceHeader" class="exception-value-column-header" hidden> + $i18n{exceptionUsbDeviceHeader} </div> </div> <div contentType="cookies"> <list mode="normal"></list> <div> - <span class="otr-explanation" i18n-content="otrExceptionsExplanation"> - </span> + <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span> <list mode="otr"></list> </div> <div class="flash-plugin-area"> - <a i18n-values="href:flashStorageUrl" target="_blank" - i18n-content="flashStorageSettings"> + <a href="$i18nRaw{flashStorageUrl}" target="_blank"> + $i18n{flashStorageSettings} </a> </div> </div> <div contentType="images"> <list mode="normal"></list> <div> - <span class="otr-explanation" i18n-content="otrExceptionsExplanation"> - </span> + <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span> <list mode="otr"></list> </div> </div> <div contentType="javascript"> <list mode="normal"></list> <div> - <span class="otr-explanation" i18n-content="otrExceptionsExplanation"> - </span> + <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span> <list mode="otr"></list> </div> </div> <div contentType="plugins"> <list mode="normal"></list> <div> - <span class="otr-explanation" i18n-content="otrExceptionsExplanation"> - </span> + <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span> <list mode="otr"></list> </div> </div> <div contentType="popups"> <list mode="normal"></list> <div> - <span class="otr-explanation" i18n-content="otrExceptionsExplanation"> - </span> + <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span> <list mode="otr"></list> </div> </div> @@ -72,44 +65,41 @@ <div contentType="protectedContent"> <list mode="normal"></list> <div> - <span class="otr-explanation" i18n-content="otrExceptionsExplanation"> - </span> + <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span> <list mode="otr"></list> </div> </div> <div contentType="media-stream-mic"> <list mode="normal"></list> <div> - <span class="otr-explanation" i18n-content="otrExceptionsExplanation"> - </span> + <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span> <list mode="otr"></list> </div> <div id="media-pepper-flash-exceptions-mic" class="pepper-flash-settings"> - <span i18n-content="mediaPepperFlashMicExceptionsDivergedLabel"></span> - <a target="_blank" i18n-content="mediaPepperFlashChangeLink" - i18n-values="href:mediaPepperFlashWebsitePrivacyURL"></a> + <span>$i18n{mediaPepperFlashMicExceptionsDivergedLabel}</span> + <a target="_blank" href="$i18nRaw{mediaPepperFlashWebsitePrivacyURL}"> + $i18n{mediaPepperFlashChangeLink} + </a> </div> </div> <div contentType="media-stream-camera"> <list mode="normal"></list> <div> - <span class="otr-explanation" i18n-content="otrExceptionsExplanation"> - </span> + <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span> <list mode="otr"></list> </div> <div id="media-pepper-flash-exceptions-camera" class="pepper-flash-settings"> - <span i18n-content="mediaPepperFlashCameraExceptionsDivergedLabel"> - </span> - <a target="_blank" i18n-content="mediaPepperFlashChangeLink" - i18n-values="href:mediaPepperFlashWebsitePrivacyURL"></a> + <span>$i18n{mediaPepperFlashCameraExceptionsDivergedLabel}</span> + <a target="_blank" href="$i18nRaw{mediaPepperFlashWebsitePrivacyURL}"> + $i18n{mediaPepperFlashChangeLink} + </a> </div> </div> <div contentType="ppapi-broker"> <list mode="normal"></list> <div> - <span class="otr-explanation" i18n-content="otrExceptionsExplanation"> - </span> + <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span> <list mode="otr"></list> </div> </div> @@ -119,24 +109,21 @@ <div contentType="midi-sysex"> <list mode="normal"></list> <div> - <span class="otr-explanation" i18n-content="otrExceptionsExplanation"> - </span> + <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span> <list mode="otr"></list> </div> </div> <div contentType="push-messaging"> <list mode="normal"></list> <div> - <span class="otr-explanation" i18n-content="otrExceptionsExplanation"> - </span> + <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span> <list mode="otr"></list> </div> </div> <div contentType="usb-devices"> <list mode="normal"></list> <div> - <span class="otr-explanation" i18n-content="otrExceptionsExplanation"> - </span> + <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span> <list mode="otr"></list> </div> </div> @@ -146,21 +133,21 @@ <div contentType="zoomlevels"> <list mode="normal"></list> <div> - <span class="otr-explanation" i18n-content="otrExceptionsExplanation"> - </span> + <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span> <list mode="otr"></list> </div> </div> </div> <div class="action-area"> <div class="hbox stretch"> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:exceptionsLearnMoreUrl"></a> + <a target="_blank" + href="$i18nRaw{exceptionsLearnMoreUrl}">$i18n{learnMore}</a> </div> <div class="action-area-right"> <div class="button-strip"> <button id="content-settings-exceptions-overlay-confirm" - class="default-button" i18n-content="done"> + class="default-button"> + $i18n{done} </button> </div> </div>
diff --git a/chrome/browser/resources/options/cookies_view.html b/chrome/browser/resources/options/cookies_view.html index 0cc136b..8176c3b 100644 --- a/chrome/browser/resources/options/cookies_view.html +++ b/chrome/browser/resources/options/cookies_view.html
@@ -1,27 +1,28 @@ <div id="cookies-view-page" class="page cookies-view-page" hidden> <div class="close-button"></div> - <h1 i18n-content="cookiesViewPage"></h1> + <h1>$i18n{cookiesViewPage}</h1> <div class="content-area cookies-list-content-area"> <div class="cookies-column-headers"> <div class="cookies-site-column"> - <h3 i18n-content="cookie_domain"></h3> + <h3>$i18n{cookie_domain}</h3> </div> <div class="cookies-data-column"> - <h3 i18n-content="cookie_local_data"></h3> + <h3>$i18n{cookie_local_data}</h3> </div> <div class="cookies-header-controls"> - <button class="remove-all-cookies-button" - i18n-content="remove_all_cookie"></button> + <button class="remove-all-cookies-button"> + $i18n{remove_all_cookie} + </button> <input type="search" class="cookies-search-box" - i18n-values="placeholder:search_cookies" incremental> + placeholder="$i18n{search_cookies}" incremental> </div> </div> <list id="cookies-list" class="cookies-list"></list> </div> <div class="action-area"> <div class="button-strip"> - <button class="cookies-view-overlay-confirm default-button" - i18n-content="done"> + <button class="cookies-view-overlay-confirm default-button"> + $i18n{done} </button> </div> </div>
diff --git a/chrome/browser/resources/options/do_not_track_confirm_overlay.html b/chrome/browser/resources/options/do_not_track_confirm_overlay.html index 666865f..3116968 100644 --- a/chrome/browser/resources/options/do_not_track_confirm_overlay.html +++ b/chrome/browser/resources/options/do_not_track_confirm_overlay.html
@@ -1,24 +1,21 @@ <div id="do-not-track-confirm-overlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="doNotTrackConfirmOverlay"></h1> + <h1>$i18n{doNotTrackConfirmOverlay}</h1> <div class="content-area"> - <span id="do-not-track-confirm-text" - i18n-content="doNotTrackConfirmMessage"> - </span> + <span id="do-not-track-confirm-text">$i18n{doNotTrackConfirmMessage}</span> </div> <div class="action-area"> <div class="hbox stretch"> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:doNotTrackLearnMoreURL"> - </a> + <a target="_blank" + href="$i18nRaw{doNotTrackLearnMoreURL}">$i18n{learnMore}</a> </div> <div class="action-area-right"> <div class="button-strip"> - <button id="do-not-track-confirm-cancel" - i18n-content="doNotTrackConfirmDisable"> + <button id="do-not-track-confirm-cancel"> + $i18n{doNotTrackConfirmDisable} </button> - <button id="do-not-track-confirm-ok" class="default-button" - i18n-content="doNotTrackConfirmEnable"> + <button id="do-not-track-confirm-ok" class="default-button"> + $i18n{doNotTrackConfirmEnable} </button> </div> </div>
diff --git a/chrome/browser/resources/options/easy_unlock_turn_off_overlay.html b/chrome/browser/resources/options/easy_unlock_turn_off_overlay.html index 84d9218..8a2db2e 100644 --- a/chrome/browser/resources/options/easy_unlock_turn_off_overlay.html +++ b/chrome/browser/resources/options/easy_unlock_turn_off_overlay.html
@@ -1,16 +1,15 @@ <div id="easy-unlock-turn-off-overlay" class="page" hidden> <div class="close-button"></div> - <h1 id="easy-unlock-turn-off-title" - i18n-content="easyUnlockTurnOffTitle"></h1> + <h1 id="easy-unlock-turn-off-title">$i18n{easyUnlockTurnOffTitle}</h1> <div class="content-area"> - <p id="easy-unlock-turn-off-messagee" class="settings-row" - i18n-content="easyUnlockTurnOffDescription"></p> + <p id="easy-unlock-turn-off-messagee" class="settings-row"> + $i18n{easyUnlockTurnOffDescription} + </p> </div> <div class="action-area button-strip"> - <button id="easy-unlock-turn-off-dismiss" i18n-content="cancel"> - </button> - <button id="easy-unlock-turn-off-confirm" class="default-button" - i18n-content="easyUnlockTurnOffButton"> + <button id="easy-unlock-turn-off-dismiss">$i18n{cancel}</button> + <button id="easy-unlock-turn-off-confirm" class="default-button"> + $i18n{easyUnlockTurnOffButton} </button> <div class="stretch"></div> <div id="easy-unlock-turn-off-spinner" class="spinner" hidden></div>
diff --git a/chrome/browser/resources/options/factory_reset_overlay.html b/chrome/browser/resources/options/factory_reset_overlay.html index 21df28f9..3c0a0f0 100644 --- a/chrome/browser/resources/options/factory_reset_overlay.html +++ b/chrome/browser/resources/options/factory_reset_overlay.html
@@ -1,16 +1,15 @@ <div id="factory-reset-overlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="factoryResetHeading"></h1> + <h1>$i18n{factoryResetHeading}</h1> <div class="content-area"> - <span i18n-content="factoryResetWarning"></span> - <a i18n-values="href:factoryResetHelpUrl" - i18n-content="errorLearnMore" target="_blank"></a> + <span>$i18n{factoryResetWarning}</span> + <a href="$i18nRaw{factoryResetHelpUrl}" + target="_blank">$i18n{errorLearnMore}</a> </div> <div class="action-area button-strip"> - <button id="factory-reset-data-dismiss" i18n-content="cancel"> - </button> - <button id="factory-reset-data-restart" class="default-button" - i18n-content="factoryResetDataRestart"> + <button id="factory-reset-data-dismiss">$i18n{cancel}</button> + <button id="factory-reset-data-restart" class="default-button"> + $i18n{factoryResetDataRestart} </button> </div> </div>
diff --git a/chrome/browser/resources/options/font_settings.html b/chrome/browser/resources/options/font_settings.html index 6da0cef..f22c3dc 100644 --- a/chrome/browser/resources/options/font_settings.html +++ b/chrome/browser/resources/options/font_settings.html
@@ -1,9 +1,9 @@ <div id="font-settings" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="fontSettingsPage"></h1> + <h1>$i18n{fontSettingsPage}</h1> <div class="content-area"> <section> - <h3 i18n-content="fontSettingsStandard"></h3> + <h3>$i18n{fontSettingsStandard}</h3> <div class="font-setting-container"> <div class="font-input-div"> <div> @@ -16,9 +16,9 @@ <input id="standard-font-size" type="range" min="0" max="24" pref="webkit.webprefs.default_font_size"> <div> - <span i18n-content="fontSettingsSizeTiny"></span> - <span i18n-content="fontSettingsSizeHuge" - class="font-settings-huge"> + <span>$i18n{fontSettingsSizeTiny}</span> + <span class="font-settings-huge"> + $i18n{fontSettingsSizeHuge} </span> </div> </div> @@ -27,7 +27,7 @@ </div> </section> <section> - <h3 i18n-content="fontSettingsSerif"></h3> + <h3>$i18n{fontSettingsSerif}</h3> <div class="font-setting-container"> <div class="font-input-div"> <div> @@ -41,7 +41,7 @@ </div> </section> <section> - <h3 i18n-content="fontSettingsSansSerif"></h3> + <h3>$i18n{fontSettingsSansSerif}</h3> <div class="font-setting-container"> <div class="font-input-div"> <div> @@ -55,7 +55,7 @@ </div> </section> <section> - <h3 i18n-content="fontSettingsFixedWidth"></h3> + <h3>$i18n{fontSettingsFixedWidth}</h3> <div class="font-setting-container"> <div class="font-input-div"> <div> @@ -69,16 +69,16 @@ </div> </section> <section> - <h3 i18n-content="fontSettingsMinimumSize"></h3> + <h3>$i18n{fontSettingsMinimumSize}</h3> <div class="font-setting-container"> <div class="font-input-div"> <div> <input id="minimum-font-size" type="range" min="0" max="15" pref="webkit.webprefs.minimum_font_size"> <div> - <span i18n-content="fontSettingsSizeTiny"></span> - <span i18n-content="fontSettingsSizeHuge" - class="font-settings-huge"> + <span>$i18n{fontSettingsSizeTiny}</span> + <span class="font-settings-huge"> + $i18n{fontSettingsSizeHuge} </span> </div> </div> @@ -89,13 +89,15 @@ </div> <div class="action-area"> <div class="button-strip"> - <span id="advanced-font-settings-install" hidden - i18n-values=".innerHTML:advancedFontSettingsInstall"></span> - <a is="action-link" id="advanced-font-settings-options" - i18n-content="advancedFontSettingsOptions" hidden></a> + <span id="advanced-font-settings-install" hidden> + $i18nRaw{advancedFontSettingsInstall} + </span> + <a is="action-link" id="advanced-font-settings-options" hidden> + $i18n{advancedFontSettingsOptions} + </a> <span class="spacer"></span> - <button id="font-settings-confirm" class="default-button" - i18n-content="done"> + <button id="font-settings-confirm" class="default-button"> + $i18n{done} </button> </div> </div>
diff --git a/chrome/browser/resources/options/handler_options.html b/chrome/browser/resources/options/handler_options.html index bfe856b..fb4f576 100644 --- a/chrome/browser/resources/options/handler_options.html +++ b/chrome/browser/resources/options/handler_options.html
@@ -1,27 +1,27 @@ <div id="handler-options" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="handlersPage"></h1> + <h1>$i18n{handlersPage}</h1> <div class="content-area"> - <h3 i18n-content="handlersActiveHeading"></h3> + <h3>$i18n{handlersActiveHeading}</h3> <div class="handlers-column-headers"> <div class="handlers-type-column"> - <div i18n-content="handlersTypeColumnHeader"></div> + <div>$i18n{handlersTypeColumnHeader}</div> </div> <div class="handlers-site-column"> - <div i18n-content="handlersSiteColumnHeader"></div> + <div>$i18n{handlersSiteColumnHeader}</div> </div> <div class="handlers-remove-column"></div> </div> <list id="handlers-list"></list> <div id="ignored-handlers-section"> - <h3 i18n-content="handlersIgnoredHeading"></h3> + <h3>$i18n{handlersIgnoredHeading}</h3> <div class="handlers-column-headers"> <div class="handlers-type-column"> - <h3 i18n-content="handlersTypeColumnHeader"></h3> + <h3>$i18n{handlersTypeColumnHeader}</h3> </div> <div class="handlers-site-column"> - <h3 i18n-content="handlersSiteColumnHeader"></h3> + <h3>$i18n{handlersSiteColumnHeader}</h3> </div> <div class="handlers-remove-column"></div> </div> @@ -30,13 +30,13 @@ </div> <div class="action-area"> <div class="hbox stretch"> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:handlersLearnMoreUrl"></a> + <a target="_blank" + href="$i18nRaw{handlersLearnMoreUrl}">$i18n{learnMore}</a> </div> <div class="action-area-right"> <div class="button-strip"> - <button id="handler-options-overlay-confirm" class="default-button" - i18n-content="done"> + <button id="handler-options-overlay-confirm" class="default-button"> + $i18n{done} </button> </div> </div>
diff --git a/chrome/browser/resources/options/home_page_overlay.html b/chrome/browser/resources/options/home_page_overlay.html index b1b6edd..d73b0f5 100644 --- a/chrome/browser/resources/options/home_page_overlay.html +++ b/chrome/browser/resources/options/home_page_overlay.html
@@ -1,6 +1,6 @@ <div id="home-page-overlay" class="page" role="dialog" hidden> <div class="close-button"></div> - <h1 i18n-content="homePageOverlay"></h1> + <h1>$i18n{homePageOverlay}</h1> <div class="content-area"> <div class="radio controlled-setting-with-label"> <label> @@ -8,7 +8,7 @@ pref="homepage_is_newtabpage" value="true" metric="Options_Homepage_IsNewTabPage" dialog-pref> <span> - <span i18n-content="homePageUseNewTab"></span> + <span>$i18n{homePageUseNewTab}</span> <span class="controlled-setting-indicator" pref="homepage_is_newtabpage" value="true" dialog-pref></span> </span> @@ -20,8 +20,7 @@ pref="homepage_is_newtabpage" value="false" metric="Options_Homepage_IsNewTabPage" dialog-pref> <span> - <span id="homepage-use-url-label" i18n-content="homePageUseURL"> - </span> + <span id="homepage-use-url-label">$i18n{homePageUseURL}</span> <span class="controlled-setting-indicator" pref="homepage_is_newtabpage" value="false" dialog-pref></span> </span> @@ -39,11 +38,8 @@ </div> <div class="action-area"> <div class="button-strip"> - <button id="home-page-cancel" type="reset" i18n-content="cancel"> - </button> - <button id="home-page-confirm" class="default-button" - i18n-content="ok"> - </button> + <button id="home-page-cancel" type="reset">$i18n{cancel}</button> + <button id="home-page-confirm" class="default-button">$i18n{ok}</button> </div> </div> </div>
diff --git a/chrome/browser/resources/options/hotword_confirm_overlay.html b/chrome/browser/resources/options/hotword_confirm_overlay.html index 11103ef..5733921 100644 --- a/chrome/browser/resources/options/hotword_confirm_overlay.html +++ b/chrome/browser/resources/options/hotword_confirm_overlay.html
@@ -1,23 +1,21 @@ <div id="hotword-confirm-overlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="hotwordConfirmOverlay"></h1> + <h1>$i18n{hotwordConfirmOverlay}</h1> <div class="content-area"> - <span id="hotword-confirm-text" i18n-content="hotwordConfirmMessage"> - </span> + <span id="hotword-confirm-text">$i18n{hotwordConfirmMessage}</span> </div> <div class="action-area"> <div class="hbox stretch"> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:hotwordLearnMoreURL"> - </a> + <a target="_blank" + href="$i18nRaw{hotwordLearnMoreURL}">$i18n{learnMore}</a> </div> <div class="action-area-right"> <div class="button-strip"> - <button id="hotword-confirm-cancel" - i18n-content="hotwordConfirmDisable"> + <button id="hotword-confirm-cancel"> + $i18n{hotwordConfirmDisable} </button> - <button id="hotword-confirm-ok" class="default-button" - i18n-content="hotwordConfirmEnable"> + <button id="hotword-confirm-ok" class="default-button"> + $i18n{hotwordConfirmEnable} </button> </div> </div> @@ -28,7 +26,7 @@ pref="hotword.audio_logging_enabled" metric="Options_Hotword_AudioLogging_Checkbox" type="checkbox" dialog-pref checked> - <span i18n-content="hotwordAudioLoggingEnable"></span> + <span>$i18n{hotwordAudioLoggingEnable}</span> </label> </div> </div>
diff --git a/chrome/browser/resources/options/import_data_overlay.html b/chrome/browser/resources/options/import_data_overlay.html index 7524577..7d604146 100644 --- a/chrome/browser/resources/options/import_data_overlay.html +++ b/chrome/browser/resources/options/import_data_overlay.html
@@ -1,23 +1,23 @@ <div id="import-data-overlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="importDataOverlay"></h1> + <h1>$i18n{importDataOverlay}</h1> <div class="content-area"> <div class="import-data-configure"> <div id="import-from-div"> - <span i18n-content="importFromLabel"></span> + <span>$i18n{importFromLabel}</span> <select id="import-browsers"> - <option i18n-content="importLoading"></option> + <option>$i18n{importLoading}</option> </select> </div> <div id="import-checkboxes"> - <div i18n-content="importDescription"></div> + <div>$i18n{importDescription}</div> <div class="checkbox controlled-setting-with-label" id="import-history-with-label"> <label> <input id="import-history" type="checkbox" pref="import_dialog_history"> <span> - <span i18n-content="importHistory"></span> + <span>$i18n{importHistory}</span> <span class="controlled-setting-indicator" pref="import_dialog_history"> </span> @@ -30,7 +30,7 @@ <input id="import-favorites" type="checkbox" pref="import_dialog_bookmarks"> <span> - <span i18n-content="importFavorites"></span> + <span>$i18n{importFavorites}</span> <span class="controlled-setting-indicator" pref="import_dialog_bookmarks"></span> </span> @@ -42,7 +42,7 @@ <input id="import-passwords" type="checkbox" pref="import_dialog_saved_passwords"> <span> - <span i18n-content="importPasswords"></span> + <span>$i18n{importPasswords}</span> <span class="controlled-setting-indicator" pref="import_dialog_saved_passwords"></span> </span> @@ -54,7 +54,7 @@ <input id="import-search" type="checkbox" pref="import_dialog_search_engine"> <span> - <span i18n-content="importSearch"></span> + <span>$i18n{importSearch}</span> <span class="controlled-setting-indicator" pref="import_dialog_search_engine"></span> </span> @@ -65,7 +65,7 @@ <label> <input id="import-autofill-form-data" type="checkbox" pref="import_dialog_autofill_form_data"> - <span i18n-content="importAutofillFormData"></span> + <span>$i18n{importAutofillFormData}</span> </label> <span class="controlled-setting-indicator" pref="import_dialog_autofill_form_data"></span> @@ -74,18 +74,18 @@ </div> <div class="import-data-success" hidden> <div id="import-success-header"> - <strong i18n-content="importSucceeded"></strong> + <strong>$i18n{importSucceeded}</strong> </div> <div id="import-success-image"></div> <div id="import-find-your-bookmarks"> - <span i18n-content="findYourImportedBookmarks"></span> + <span>$i18n{findYourImportedBookmarks}</span> <div class="checkbox controlled-setting-with-label"> <label> <input id="import-data-show-bookmarks-bar" pref="bookmark_bar.show_on_all_tabs" metric="Options_ShowBookmarksBar" type="checkbox"> <span> - <span i18n-content="toolbarShowBookmarksBar"></span> + <span>$i18n{toolbarShowBookmarksBar}</span> <span class="controlled-setting-indicator" pref="bookmark_bar.show_on_all_tabs"></span> </span> @@ -99,11 +99,10 @@ <div class="action-area-right"> <div id="import-throbber" class="throbber"></div> <div class="button-strip"> - <button id="import-data-cancel" i18n-content="cancel"></button> - <button id="import-choose-file" i18n-content="importChooseFile"> - </button> - <button id="import-data-commit" class="default-button" - i18n-content="importCommit"> + <button id="import-data-cancel">$i18n{cancel}</button> + <button id="import-choose-file">$i18n{importChooseFile}</button> + <button id="import-data-commit" class="default-button"> + $i18n{importCommit} </button> </div> </div> @@ -111,8 +110,8 @@ <div class="import-data-success" hidden> <div class="action-area-right"> <div class="button-strip"> - <button id="import-data-confirm" class="default-button" - i18n-content="done"> + <button id="import-data-confirm" class="default-button"> + $i18n{done} </button> </div> </div>
diff --git a/chrome/browser/resources/options/language_add_language_overlay.html b/chrome/browser/resources/options/language_add_language_overlay.html index 0cbf1b60..c95a56a 100644 --- a/chrome/browser/resources/options/language_add_language_overlay.html +++ b/chrome/browser/resources/options/language_add_language_overlay.html
@@ -1,17 +1,17 @@ <div id="add-language-overlay-page" class="page" role="dialog" hidden> <div class="close-button"></div> - <h1 i18n-content="addLanguageTitle"></h1> + <h1>$i18n{addLanguageTitle}</h1> <div class="content-area"> - <label id="add-language-overlay-language-list-label" - i18n-content="addLanguageSelectLabel"></label> + <label id="add-language-overlay-language-list-label"> + $i18n{addLanguageSelectLabel} + </label> <select id="add-language-overlay-language-list" aria-labelledby="add-language-overlay-language-list-label"></select> </div> <div class="action-area button-strip"> - <button id="add-language-overlay-cancel-button" i18n-content="cancel"> - </button> - <button id="add-language-overlay-ok-button" class="default-button" - i18n-content="ok"> + <button id="add-language-overlay-cancel-button">$i18n{cancel}</button> + <button id="add-language-overlay-ok-button" class="default-button"> + $i18n{ok} </button> </div> </div>
diff --git a/chrome/browser/resources/options/language_dictionary_overlay.html b/chrome/browser/resources/options/language_dictionary_overlay.html index 34b6405..9e1a67f 100644 --- a/chrome/browser/resources/options/language_dictionary_overlay.html +++ b/chrome/browser/resources/options/language_dictionary_overlay.html
@@ -1,20 +1,21 @@ <div id="language-dictionary-overlay-page" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="languageDictionaryOverlayTitle"></h1> + <h1>$i18n{languageDictionaryOverlayTitle}</h1> <input id="language-dictionary-overlay-search-field" type="search" - i18n-values="placeholder:languageDictionaryOverlaySearchPlaceholder; - aria-label:languageDictionaryOverlaySearchPlaceholder" + placeholder="$i18n{languageDictionaryOverlaySearchPlaceholder}" + aria-label="$i18n{languageDictionaryOverlaySearchPlaceholder}" incremental> <div class="content-area"> <div class="settings-list"> - <p id="language-dictionary-overlay-no-matches" - i18n-content="languageDictionaryOverlayNoMatches" hidden></p> + <p id="language-dictionary-overlay-no-matches" hidden> + $i18n{languageDictionaryOverlayNoMatches} + </p> <list id="language-dictionary-overlay-word-list"></list> </div> </div> <div class="action-area button-strip"> - <button id="language-dictionary-overlay-done-button" class="default-button" - i18n-content="done"> + <button id="language-dictionary-overlay-done-button" class="default-button"> + $i18n{done} </button> </div> </div>
diff --git a/chrome/browser/resources/options/language_options.html b/chrome/browser/resources/options/language_options.html index 83ede8f..7f9f33a 100644 --- a/chrome/browser/resources/options/language_options.html +++ b/chrome/browser/resources/options/language_options.html
@@ -1,27 +1,25 @@ <div id="languagePage" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="languagePage"></h1> + <h1>$i18n{languagePage}</h1> <div class="content-area"> <div id="notification"> <span> </span> <span class="link"><span class="link-color"></span></span> </div> <div class="language-options-header"> - <span i18n-content="addLanguageInstructions"></span> + <span>$i18n{addLanguageInstructions}</span> <if expr="chromeos"> - <span i18n-content="inputMethodInstructions"></span> + <span>$i18n{inputMethodInstructions}</span> </if> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:languagesLearnMoreURL"></a> + <a target="_blank" + href="$i18nRaw{languagesLearnMoreURL}">$i18n{learnMore}</a> </div> <div class="language-options"> <div id="language-options-languages"> - <h3 i18n-content="languages"></h3> + <h3>$i18n{languages}</h3> <list id="language-options-list"></list> <div class="language-options-lower-left"> - <button id="language-options-add-button" - i18n-content="addButton"> - </button> + <button id="language-options-add-button">$i18n{addButton}</button> </div> <div id="language-options-list-dropmarker"></div> </div> @@ -30,8 +28,8 @@ <if expr="os == 'win32' or chromeos"> <div id="language-options-ui-language-section" class="language-options-contents"> - <button id="language-options-ui-language-button" - i18n-content="displayInThisLanguage"> + <button id="language-options-ui-language-button"> + $i18n{displayInThisLanguage} </button> <span class="controlled-setting-indicator"></span> <span id="language-options-ui-language-message" hidden></span> @@ -44,30 +42,31 @@ <div class="checkbox" id="spellcheck-language-checkbox-container"> <label> <input type="checkbox" id="spellcheck-language-checkbox"> - <span i18n-content="useThisForSpellChecking"></span> + <span>$i18n{useThisForSpellChecking}</span> </label> </div> <span id="spellcheck-language-message" hidden></span> - <span id="language-options-dictionary-downloading-message" - i18n-content="downloadingDictionary" hidden> + <span id="language-options-dictionary-downloading-message" hidden> + $i18n{downloadingDictionary} </span> </div> <div id="language-options-dictionary-download-failed-message" class="language-options-notification" hidden> - <div i18n-content="downloadFailed"></div> + <div>$i18n{downloadFailed}</div> <div id="language-options-dictionary-download-fail-help-message" - i18n-content="downloadFailHelp" hidden> + hidden> + $i18n{downloadFailHelp} </div> - <button id="dictionary-download-retry-button" - i18n-content="retryButton"> + <button id="dictionary-download-retry-button"> + $i18n{retryButton} </button> </div> <div id="language-options-ui-notification-bar" class="language-options-notification" hidden> - <div i18n-content="restartRequired"></div> + <div>$i18n{restartRequired}</div> <if expr="chromeos"> - <button id="language-options-ui-restart-button" - i18n-content="restartButton"> + <button id="language-options-ui-restart-button"> + $i18n{restartButton} </button> </if> </div> @@ -77,15 +76,17 @@ <div class="checkbox"> <label> <input type="checkbox" id="offer-to-translate-in-this-language"> - <span class="offer-to-translate-label" - i18n-content="offerToTranslateInThisLanguage"></span> + <span class="offer-to-translate-label"> + $i18n{offerToTranslateInThisLanguage} + </span> </label> </div> - <span id="cannot-translate-in-this-language" - i18n-content="cannotTranslateInThisLanguage" hidden></span> + <span id="cannot-translate-in-this-language" hidden> + $i18n{cannotTranslateInThisLanguage} + </span> </div> <if expr="chromeos"> - <h3 i18n-content="inputMethod"></h3> + <h3>$i18n{inputMethod}</h3> <div id="language-options-input-method-template" class="input-method" hidden> <div class="checkbox"> @@ -97,8 +98,8 @@ </div> <div id="language-options-input-method-list" class="language-options-contents"> - <span id="language-options-input-method-none" - i18n-content="noInputMethods" hidden> + <span id="language-options-input-method-none" hidden> + $i18n{noInputMethods} </span> </div> </if> @@ -106,15 +107,16 @@ </div> <div class="language-options-footer"> <if expr="chromeos"> - <div i18n-content="switchInputMethodsHint"></div> - <div i18n-content="selectPreviousInputMethodHint"></div> + <div>$i18n{switchInputMethodsHint}</div> + <div>$i18n{selectPreviousInputMethodHint}</div> <a is="action-link" id="edit-custom-dictionary-button" - class="standalone-action-link" - i18n-content="languageDictionaryOverlayTitle"></a> + class="standalone-action-link"> + $i18n{languageDictionaryOverlayTitle} + </a> <div id="language-options-ime-menu-template" class="checkbox" hidden> <label> <input type="checkbox" id="activate-ime-menu"> - <span i18n-content="activateImeMenu"></span> + <span>$i18n{activateImeMenu}</span> </label> </div> </if> @@ -123,18 +125,18 @@ <label id="enable-spellcheck-container"> <input id="enable-spellcheck" pref="browser.enable_spellchecking" metric="Options_SpellCheck" type="checkbox"> - <span i18n-content="enableSpellCheck"></span> + <span>$i18n{enableSpellCheck}</span> </label> - <a is="action-link" id="edit-custom-dictionary-button" - i18n-content="languageDictionaryOverlayTitle" hidden></a> + <a is="action-link" id="edit-custom-dictionary-button" hidden> + $i18n{languageDictionaryOverlayTitle} + </a> </div> </if> </div> </div> <div class="action-area"> <div class="button-strip"> - <button id="language-confirm" class="default-button" i18n-content="done"> - </button> + <button id="language-confirm" class="default-button">$i18n{done}</button> </div> </div> </div>
diff --git a/chrome/browser/resources/options/manage_profile_overlay.html b/chrome/browser/resources/options/manage_profile_overlay.html index 688d2496..f72093c0 100644 --- a/chrome/browser/resources/options/manage_profile_overlay.html +++ b/chrome/browser/resources/options/manage_profile_overlay.html
@@ -2,15 +2,13 @@ <div class="close-button"></div> <!-- Dialog for managing profiles. --> <div id="manage-profile-overlay-manage" hidden> - <h1 i18n-content="manageProfile"></h1> + <h1>$i18n{manageProfile}</h1> <div id="manage-profile-content" class="content-area"> - <div id="manage-profile-icon-label" - i18n-content="manageProfilesIconLabel"> - </div> + <div id="manage-profile-icon-label">$i18n{manageProfilesIconLabel}</div> <grid id="manage-profile-icon-grid"></grid> <div id="manage-profile-name-input-container"> <label> - <span i18n-content="manageProfilesNameLabel"></span> + <span>$i18n{manageProfilesNameLabel}</span> <input id="manage-profile-name" type="text" pattern=".*\S.*" required> </label> </div> @@ -18,71 +16,75 @@ </div> <div class="action-area"> <div class="action-area-shortcut-container"> - <button id="remove-shortcut-button" - i18n-content="removeProfileShortcutButton" hidden> + <button id="remove-shortcut-button" hidden> + $i18n{removeProfileShortcutButton} </button> - <button id="add-shortcut-button" - i18n-content="createProfileShortcutButton" hidden> + <button id="add-shortcut-button" hidden> + $i18n{createProfileShortcutButton} </button> </div> <div class="button-strip"> - <button id="manage-profile-cancel" i18n-content="cancel"></button> - <button id="manage-profile-ok" i18n-content="manageProfilesConfirm" - class="default-button"></button> + <button id="manage-profile-cancel">$i18n{cancel}</button> + <button id="manage-profile-ok" class="default-button"> + $i18n{manageProfilesConfirm} + </button> </div> </div> </div> <!-- Dialog for deleting profiles. --> <div id="manage-profile-overlay-delete" hidden> - <h1 i18n-content="deleteProfileTitle"></h1> + <h1>$i18n{deleteProfileTitle}</h1> <div class="content-area"> <div id="delete-profile-message"> <img id="delete-profile-icon" class="profile-icon"> <div id="delete-profile-text"></div> </div> - <div id="delete-supervised-profile-addendum" - i18n-values=".innerHTML:deleteSupervisedProfileAddendum" hidden> + <div id="delete-supervised-profile-addendum" hidden> + $i18nRaw{deleteSupervisedProfileAddendum} </div> </div> <div class="action-area button-strip"> - <button id="delete-profile-ok" i18n-content="deleteProfileOK"></button> - <button id="delete-profile-cancel" i18n-content="cancel" - class="default-button"></button> + <button id="delete-profile-ok">$i18n{deleteProfileOK}</button> + <button id="delete-profile-cancel" class="default-button"> + $i18n{cancel} + </button> </div> </div> <!-- Dialog for disconnecting enterprise managed profiles. --> <div id="manage-profile-overlay-disconnect-managed" hidden> - <h1 i18n-content="disconnectManagedProfileTitle"></h1> + <h1>$i18n{disconnectManagedProfileTitle}</h1> <div class="content-area" - id="disconnect-managed-profile-domain-information" - i18n-values=".innerHTML:disconnectManagedProfileDomainInformation"> + id="disconnect-managed-profile-domain-information"> + $i18nRaw{disconnectManagedProfileDomainInformation} </div> <div class="content-area"> <div id="disconnect-managed-profile-message"> - <div id="disconnect-managed-profile-text" - i18n-values=".innerHTML:disconnectManagedProfileText"> + <div id="disconnect-managed-profile-text"> + $i18nRaw{disconnectManagedProfileText} </div> </div> </div> <div class="action-area"> <div class="button-strip"> - <button id="disconnect-managed-profile-ok" - i18n-content="disconnectManagedProfileOK"></button> - <button id="disconnect-managed-profile-cancel" class="default-button" - i18n-content="cancel"></button> + <button id="disconnect-managed-profile-ok"> + $i18n{disconnectManagedProfileOK} + </button> + <button id="disconnect-managed-profile-cancel" class="default-button"> + $i18n{cancel} + </button> </div> </div> </div> <!-- Dialog for creating profiles. --> <div id="manage-profile-overlay-create" hidden> - <h1 i18n-content="createProfileTitle"></h1> + <h1>$i18n{createProfileTitle}</h1> <div id="create-profile-content" class="content-area"> <div id="create-profile-instructions"></div> <grid id="create-profile-icon-grid"></grid> <div id="create-profile-name-input-container"> <label> - <span id="create-profile-name-label" - i18n-content="manageProfilesNameLabel"> + <span id="create-profile-name-label"> + $i18n{manageProfilesNameLabel} </span> <input id="create-profile-name" type="text" pattern=".*\S.*" required> </label> @@ -92,7 +94,7 @@ <div id="create-shortcut-container" class="checkbox" hidden> <label> <input id="create-shortcut" type="checkbox"> - <span i18n-content="createProfileShortcutCheckbox"></span> + <span>$i18n{createProfileShortcutCheckbox}</span> </label> </div> <div id="create-profile-supervised-container" class="checkbox"> @@ -100,19 +102,21 @@ <input id="create-profile-supervised" type="checkbox"> <span id="create-profile-supervised-signed-in"> <span id="create-profile-supervised-signed-in-label"></span> - <span id="create-profile-supervised-account-details-out-of-date-label" + <span + id="create-profile-supervised-account-details-out-of-date-label" hidden> </span> <a id="create-profile-supervised-signed-in-learn-more-link" - is="action-link" i18n-content="learnMore"></a> + is="action-link"> + $i18n{learnMore} + </a> <a id="create-profile-supervised-sign-in-again-link" - is="action-link" - i18n-content="manageProfilesSupervisedSignInAgainLink" - hidden></a> + is="action-link" hidden> + $i18n{manageProfilesSupervisedSignInAgainLink} + </a> </span> - <span id="create-profile-supervised-not-signed-in" - i18n-values=".innerHTML:manageProfilesSupervisedNotSignedIn" - hidden> + <span id="create-profile-supervised-not-signed-in" hidden> + $i18nRaw{manageProfilesSupervisedNotSignedIn} </span> </label> <span id="create-profile-supervised-indicator" @@ -123,12 +127,13 @@ </div> <div class="action-area"> <div id="create-profile-throbber" class="throbber"></div> - <a is="action-link" id="import-existing-supervised-user-link" - i18n-content="importExistingSupervisedUserLink" hidden></a> + <a is="action-link" id="import-existing-supervised-user-link" hidden> + $i18n{importExistingSupervisedUserLink} + </a> <div class="button-strip"> - <button id="create-profile-cancel" i18n-content="cancel"></button> - <button id="create-profile-ok" i18n-content="createProfileConfirm" - class="default-button"> + <button id="create-profile-cancel">$i18n{cancel}</button> + <button id="create-profile-ok" class="default-button"> + $i18n{createProfileConfirm} </button> </div> </div>
diff --git a/chrome/browser/resources/options/options.html b/chrome/browser/resources/options/options.html index 948096d..95936d5 100644 --- a/chrome/browser/resources/options/options.html +++ b/chrome/browser/resources/options/options.html
@@ -1,8 +1,8 @@ <!doctype html> -<html id="t" i18n-values="dir:textdirection;lang:language"> +<html id="t" dir="$i18n{textdirection}" lang="$i18n{language}"> <head> <meta charset="utf-8"> -<title i18n-content="optionsPageTitle"></title> +<title>$i18n{optionsPageTitle}</title> <link rel="stylesheet" href="chrome://resources/css/bubble.css"> <link rel="stylesheet" href="chrome://resources/css/bubble_button.css"> <link rel="stylesheet" href="chrome://resources/css/chrome_shared.css"> @@ -183,17 +183,19 @@ <div class="controlled-setting-bubble-extension-name"></div> </div> <div class="controlled-setting-bubble-content-row"> - <a is="action-link" class="controlled-setting-bubble-extension-manage-link" - i18n-content="controlledSettingManageExtension"></a> - <button class='controlled-setting-bubble-extension-disable-button' - i18n-content="controlledSettingDisableExtension"></button> + <a is="action-link" class="controlled-setting-bubble-extension-manage-link"> + $i18n{controlledSettingManageExtension} + </a> + <button class='controlled-setting-bubble-extension-disable-button'> + $i18n{controlledSettingDisableExtension} + </button> </div> </div> <div id="extension-controlled-warning-template" class="extension-controlled-warning-box settings-row" hidden> <div class="extension-controlled-warning"></div> - <button i18n-content="extensionDisable"></button> + <button>$i18n{extensionDisable}</button> </div> <div id="main-content"
diff --git a/chrome/browser/resources/options/password_manager.html b/chrome/browser/resources/options/password_manager.html index 6bc11a6..c128a3b 100644 --- a/chrome/browser/resources/options/password_manager.html +++ b/chrome/browser/resources/options/password_manager.html
@@ -1,65 +1,67 @@ <div id="password-manager" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="passwordsPage"></h1> + <h1>$i18n{passwordsPage}</h1> <div class="content-area"> <div class="password-manager-home"> <div id="auto-signin-block" class="checkbox"> <label> <input pref="credentials_enable_autosignin" type="checkbox"> - <span i18n-content="autoSigninTitle"></span> + <span>$i18n{autoSigninTitle}</span> </label> <div class="setting-extra-description"> - <span i18n-content="autoSigninDescription"></span> + <span>$i18n{autoSigninDescription}</span> </div> </div> <div id="password-list-headers"> <div id="passwords-title"> - <h3 i18n-content="savedPasswordsTitle"></h3> + <h3>$i18n{savedPasswordsTitle}</h3> </div> <div id="password-search-column"> <input id="password-search-box" type="search" - i18n-values="placeholder:passwordSearchPlaceholder" incremental> + placeholder="$i18n{passwordSearchPlaceholder}" incremental> </div> </div> <list id="saved-passwords-list" class="settings-list"></list> <div id="saved-passwords-list-empty-placeholder" class="settings-list-empty" hidden> - <span i18n-content="passwordsNoPasswordsDescription"></span> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:passwordManagerLearnMoreURL"></a> + <span>$i18n{passwordsNoPasswordsDescription}</span> + <a target="_blank" + href="$i18nRaw{passwordManagerLearnMoreURL}">$i18n{learnMore}</a> </div> <div id="password-manager-import-export" class="action-area" hidden> <div class="button-strip"> - <button id="password-manager-import" class="password-manager-home" - i18n-content="passwordManagerImportPasswordButtonText"> + <button id="password-manager-import" class="password-manager-home"> + $i18n{passwordManagerImportPasswordButtonText} </button> - <button id="password-manager-export" class="password-manager-home" - i18n-content="passwordManagerExportPasswordButtonText"> + <button id="password-manager-export" class="password-manager-home"> + $i18n{passwordManagerExportPasswordButtonText} </button> </div> </div> - <h3 i18n-content="passwordExceptionsTitle"></h3> + <h3>$i18n{passwordExceptionsTitle}</h3> <list id="password-exceptions-list" class="settings-list"></list> <div id="password-exceptions-list-empty-placeholder" hidden class="settings-list-empty"> - <span i18n-content="passwordsNoExceptionsDescription"></span> - <a id="exceptions-learn-more" target="_blank" i18n-content="learnMore" - i18n-values="href:passwordManagerLearnMoreURL"></a> + <span>$i18n{passwordsNoExceptionsDescription}</span> + <a id="exceptions-learn-more" target="_blank" + href="$i18nRaw{passwordManagerLearnMoreURL}">$i18n{learnMore}</a> </div> </div> </div> <div class="action-area"> <span id="manage-passwords-span"> - <span i18n-content="passwordsManagePasswordsBeforeLinkText"></span> + <span>$i18n{passwordsManagePasswordsBeforeLinkText}</span> <a id="manage-passwords-link" target="_blank" - i18n-content="passwordsManagePasswordsLinkText" - i18n-values="href:passwordsManagePasswordsLink"></a> - <span i18n-content="passwordsManagePasswordsAfterLinkText"></span> + href="$i18nRaw{passwordsManagePasswordsLink}"> + $i18n{passwordsManagePasswordsLinkText} + </a> + <span>$i18n{passwordsManagePasswordsAfterLinkText}</span> </span> <div class="spacer-div"></div> <div class="button-strip"> - <button id="password-manager-confirm" class="password-manager-home" - i18n-content="done"></button> + <button id="password-manager-confirm" class="password-manager-home"> + $i18n{done} + </button> </div> </div> </div>
diff --git a/chrome/browser/resources/options/reset_profile_settings_overlay.html b/chrome/browser/resources/options/reset_profile_settings_overlay.html index 504661f..07ba372 100644 --- a/chrome/browser/resources/options/reset_profile_settings_overlay.html +++ b/chrome/browser/resources/options/reset_profile_settings_overlay.html
@@ -8,17 +8,15 @@ </div> <div class="action-area"> <div class="hbox stretch"> - <a target="_blank" i18n-content="learnMore" - i18n-values="href:resetProfileSettingsLearnMoreUrl"> - </a> + <a target="_blank" + href="$i18nRaw{resetProfileSettingsLearnMoreUrl}">$i18n{learnMore}</a> </div> <div class="action-area-right"> <div id="reset-profile-settings-throbber" class="throbber"></div> <div class="button-strip"> - <button id="reset-profile-settings-dismiss" i18n-content="cancel"> - </button> - <button id="reset-profile-settings-commit" - i18n-content="resetProfileSettingsCommit"> + <button id="reset-profile-settings-dismiss">$i18n{cancel}</button> + <button id="reset-profile-settings-commit"> + $i18n{resetProfileSettingsCommit} </button> </div> </div> @@ -28,7 +26,7 @@ <label> <input id="send-settings" type="checkbox" checked> <span> - <span i18n-content="resetProfileSettingsFeedback"></span> + <span>$i18n{resetProfileSettingsFeedback}</span> <span id="expand-feedback"></span> </span> </label>
diff --git a/chrome/browser/resources/options/search_box.html b/chrome/browser/resources/options/search_box.html index d723885..854538e5 100644 --- a/chrome/browser/resources/options/search_box.html +++ b/chrome/browser/resources/options/search_box.html
@@ -2,11 +2,10 @@ <header > <span id="browser-options-search-field-container" class="search-field-container"> - <a is="action-link" id="about-button" i18n-content="aboutButton" - hidden></a> + <a is="action-link" id="about-button" hidden>$i18n{aboutButton}</a> <input id="search-field" type="search" - i18n-values="placeholder:searchPlaceholder; - aria-label:searchPlaceholder" incremental> + placeholder="$i18n{searchPlaceholder}" + aria-label="$i18n{searchPlaceholder}" incremental> </span> </header> </div>
diff --git a/chrome/browser/resources/options/search_engine_manager.html b/chrome/browser/resources/options/search_engine_manager.html index 0f9d8566..9d76000 100644 --- a/chrome/browser/resources/options/search_engine_manager.html +++ b/chrome/browser/resources/options/search_engine_manager.html
@@ -1,16 +1,17 @@ <div id="search-engine-manager-page" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="searchEngineManagerPage"></h1> + <h1>$i18n{searchEngineManagerPage}</h1> <div class="content-area"> - <h3 i18n-content="defaultSearchEngineListTitle"></h3> + <h3>$i18n{defaultSearchEngineListTitle}</h3> <list id="default-search-engine-list" class="search-engine-list settings-list"></list> - <h3 i18n-content="otherSearchEngineListTitle"></h3> + <h3>$i18n{otherSearchEngineListTitle}</h3> <list id="other-search-engine-list" class="search-engine-list settings-list"></list> <div id="extension-keyword-div" hidden> - <h3 id="extension-keyword-list-title" - i18n-content="extensionKeywordsListTitle"></h3> + <h3 id="extension-keyword-list-title"> + $i18n{extensionKeywordsListTitle} + </h3> <list id="extension-keyword-list" class="search-engine-list settings-list"></list> </div> @@ -18,7 +19,8 @@ <div class="action-area"> <div class="button-strip"> <button id="search-engine-manager-confirm" type="submit" - class="default-button" i18n-content="done"> + class="default-button"> + $i18n{done} </button> </div> </div>
diff --git a/chrome/browser/resources/options/search_page.html b/chrome/browser/resources/options/search_page.html index 073c505..dcc9ed70 100644 --- a/chrome/browser/resources/options/search_page.html +++ b/chrome/browser/resources/options/search_page.html
@@ -1,12 +1,12 @@ <div id="searchPage" class="page" hidden> <header> - <h1 i18n-content="searchPage"></h1> + <h1>$i18n{searchPage}</h1> </header> <div id="searchPageNoMatches" hidden> - <p i18n-content="searchPageNoMatches"></p> - <p><span i18n-content="searchPageHelpLabel"></span> - <a target="_blank" i18n-content="searchPageHelpTitle" - i18n-values="href:searchPageHelpURL"></a> + <p>$i18n{searchPageNoMatches}</p> + <p><span>$i18n{searchPageHelpLabel}</span> + <a target="_blank" + href="$i18nRaw{searchPageHelpURL}">$i18n{searchPageHelpTitle}</a> </p> </div> </div>
diff --git a/chrome/browser/resources/options/secondary_user_banner.html b/chrome/browser/resources/options/secondary_user_banner.html index 84da427..f609d07 100644 --- a/chrome/browser/resources/options/secondary_user_banner.html +++ b/chrome/browser/resources/options/secondary_user_banner.html
@@ -3,8 +3,7 @@ <div class="badge"></div> <div class="text"> <p> - <span i18n-values=".innerHTML:secondaryUserBannerText"> - </span> + <span>$i18nRaw{secondaryUserBannerText}</span> </p> </div> </div>
diff --git a/chrome/browser/resources/options/spelling_confirm_overlay.html b/chrome/browser/resources/options/spelling_confirm_overlay.html index b4070df..a8c977a 100644 --- a/chrome/browser/resources/options/spelling_confirm_overlay.html +++ b/chrome/browser/resources/options/spelling_confirm_overlay.html
@@ -1,18 +1,18 @@ <div id="spelling-confirm-overlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="spellingConfirmOverlay"></h1> + <h1>$i18n{spellingConfirmOverlay}</h1> <div class="content-area"> - <span id="spelling-confirm-text" i18n-content="spellingConfirmMessage"> - </span> - <a id="spelling-confirm-learn-more" target="_blank" i18n-content="learnMore" - i18n-values="href:privacyLearnMoreURL"></a> + <span id="spelling-confirm-text">$i18n{spellingConfirmMessage}</span> + <a id="spelling-confirm-learn-more" target="_blank" + href="$i18nRaw{privacyLearnMoreURL}">$i18n{learnMore}</a> </div> <div class="action-area"> <div class="button-strip"> - <button id="spelling-confirm-cancel" - i18n-content="spellingConfirmDisable"></button> - <button id="spelling-confirm-ok" class="default-button" - i18n-content="spellingConfirmEnable"> + <button id="spelling-confirm-cancel"> + $i18n{spellingConfirmDisable} + </button> + <button id="spelling-confirm-ok" class="default-button"> + $i18n{spellingConfirmEnable} </button> </div> </div>
diff --git a/chrome/browser/resources/options/startup_overlay.html b/chrome/browser/resources/options/startup_overlay.html index 645bb7c..7864b70 100644 --- a/chrome/browser/resources/options/startup_overlay.html +++ b/chrome/browser/resources/options/startup_overlay.html
@@ -1,6 +1,6 @@ <div id="startup-overlay" class="page" hidden> <div class="close-button"></div> - <h1 i18n-content="startupPagesOverlay"></h1> + <h1>$i18n{startupPagesOverlay}</h1> <!-- This <input> element is always hidden. It needs to be here so that its 'controlled-by' attribute will get set when the urls preference is managed by a policy, so that the managed prefs bar will show up. @@ -11,13 +11,12 @@ </div> <div class="action-area"> <span class="hbox stretch"> - <button id="startupUseCurrentButton" - i18n-content="startupUseCurrent"></button> + <button id="startupUseCurrentButton">$i18n{startupUseCurrent}</button> </span> <div class="button-strip"> - <button id="startup-overlay-cancel" i18n-content="cancel"></button> - <button id="startup-overlay-confirm" class="default-button" - i18n-content="ok"> + <button id="startup-overlay-cancel">$i18n{cancel}</button> + <button id="startup-overlay-confirm" class="default-button"> + $i18n{ok} </button> </div> </div>
diff --git a/chrome/browser/resources/options/startup_section.html b/chrome/browser/resources/options/startup_section.html index 0d429a8..764f63a 100644 --- a/chrome/browser/resources/options/startup_section.html +++ b/chrome/browser/resources/options/startup_section.html
@@ -1,5 +1,5 @@ <section id="startup-section" guest-visibility="hidden"> - <h3 i18n-content="sectionTitleStartup"></h3> + <h3>$i18n{sectionTitleStartup}</h3> <div id="startup-section-content"> <div class="radio controlled-setting-with-label" id="newtab-section-content"> @@ -8,7 +8,7 @@ pref="session.restore_on_startup" metric="Options_Startup_NewTab"> <span> - <span i18n-content="startupShowNewTab"></span> + <span>$i18n{startupShowNewTab}</span> <span class="controlled-setting-indicator" pref="session.restore_on_startup" value="5"></span> </span> @@ -20,7 +20,7 @@ value="1" pref="session.restore_on_startup" metric="Options_Startup_LastSession"> <span> - <span i18n-content="startupRestoreLastSession"></span> + <span>$i18n{startupRestoreLastSession}</span> <span class="controlled-setting-indicator" pref="session.restore_on_startup" value="1"></span> </span> @@ -32,13 +32,12 @@ pref="session.restore_on_startup" value="4" metric="Options_Startup_Custom"> <span> - <span i18n-content="startupShowPages"></span> + <span>$i18n{startupShowPages}</span> <span class="controlled-setting-indicator" pref="session.restore_on_startup" value="4"></span> </span> </label> - <a is="action-link" id="startup-set-pages" - i18n-content="startupSetPages"></a> + <a is="action-link" id="startup-set-pages">$i18n{startupSetPages}</a> <span class="controlled-setting-indicator" pref="session.startup_urls"></span> </div>
diff --git a/chrome/browser/resources/options/supervised_user_create_confirm.html b/chrome/browser/resources/options/supervised_user_create_confirm.html index 3ccd8c7..ae4076a 100644 --- a/chrome/browser/resources/options/supervised_user_create_confirm.html +++ b/chrome/browser/resources/options/supervised_user_create_confirm.html
@@ -4,9 +4,10 @@ <div id="supervised-user-created-image"></div> <h1 id="supervised-user-created-title"></h1> <div id="supervised-user-created-text" class="content-area"></div> - <div id="supervised-user-created-action-area" class="action-area button-strip"> - <button id="supervised-user-created-done" - i18n-content="supervisedUserCreatedDone"> + <div id="supervised-user-created-action-area" + class="action-area button-strip"> + <button id="supervised-user-created-done"> + $i18n{supervisedUserCreatedDone} </button> <button id="supervised-user-created-switch"></button> </div>
diff --git a/chrome/browser/resources/options/supervised_user_import.html b/chrome/browser/resources/options/supervised_user_import.html index 72cd4c3a..9fd806d 100644 --- a/chrome/browser/resources/options/supervised_user_import.html +++ b/chrome/browser/resources/options/supervised_user_import.html
@@ -1,19 +1,19 @@ <div id="supervised-user-import" class="page" hidden> <div class="close-button"></div> <!-- Overlay to import an existing supervised user during user creation --> - <h1 id="supervised-user-import-title" i18n-content="supervisedUserImportTitle" - class="supervised-user-import"> + <h1 id="supervised-user-import-title" class="supervised-user-import"> + $i18n{supervisedUserImportTitle} </h1> <h1 id="supervised-user-select-avatar-title" - i18n-content="supervisedUserSelectAvatarTitle" class="supervised-user-select-avatar" hidden> + $i18n{supervisedUserSelectAvatarTitle} </h1> - <div id="supervised-user-import-text" i18n-content="supervisedUserImportText" - class="supervised-user-import"> + <div id="supervised-user-import-text" class="supervised-user-import"> + $i18n{supervisedUserImportText} </div> <div id="supervised-user-select-avatar-text" - i18n-content="supervisedUserSelectAvatarText" class="supervised-user-select-avatar" hidden> + $i18n{supervisedUserSelectAvatarText} </div> <div id="supervised-user-import-content-area" class="content-area"> <list id="supervised-user-list" @@ -26,15 +26,14 @@ <div id="supervised-user-import-action-area" class="action-area"> <div class="button-strip"> <div id="supervised-user-import-throbber" class="throbber"></div> - <button id="supervised-user-import-cancel" i18n-content="cancel"> - </button> + <button id="supervised-user-import-cancel">$i18n{cancel}</button> <button id="supervised-user-import-ok" - i18n-content="supervisedUserImportOk" class="default-button supervised-user-import"> + $i18n{supervisedUserImportOk} </button> <button id="supervised-user-select-avatar-ok" - i18n-content="supervisedUserSelectAvatarOk" class="default-button supervised-user-select-avatar" hidden> + $i18n{supervisedUserSelectAvatarOk} </button> </div> </div>
diff --git a/chrome/browser/resources/options/sync_section.html b/chrome/browser/resources/options/sync_section.html index f43b440a5..375601e2 100644 --- a/chrome/browser/resources/options/sync_section.html +++ b/chrome/browser/resources/options/sync_section.html
@@ -1,23 +1,22 @@ <if expr="not chromeos"> <section id="sync-section"> - <h3 i18n-content="sectionTitleSync"></h3> + <h3>$i18n{sectionTitleSync}</h3> </if> <if expr="chromeos"> <div id="sync-section"> </if> <div id="sync-overview" class="settings-row" hidden> - <p i18n-content="syncOverview"></p> - <a i18n-values="href:syncLearnMoreURL" i18n-content="learnMore" - target="_blank"></a> + <p>$i18n{syncOverview}</p> + <a href="$i18nRaw{syncLearnMoreURL}" target="_blank">$i18n{learnMore}</a> </div> <if expr="chromeos"> <div id="account-picture-wrapper"> <div id="account-picture-control"> - <input type="image" id="account-picture" tabindex="0" - alt="" i18n-values="aria-label:changePicture"> - <div id="change-picture-caption" i18n-content="changePicture"></div> + <input type="image" id="account-picture" tabindex="0" alt="" + aria-label="$i18n{changePicture}"> + <div id="change-picture-caption">$i18n{changePicture}</div> </div> <span id="account-picture-indicator" class="controlled-setting-indicator"> </span> @@ -39,14 +38,14 @@ metric="Options_ScreenLock" pref="settings.enable_screen_lock"> <span> - <span i18n-content="enableScreenlock"></span> + <span>$i18n{enableScreenlock}</span> <span class="controlled-setting-indicator" - i18n-values="textshared:screenLockShared" - pref="settings.enable_screen_lock"></span> + textshared="$i18n{screenLockShared}" + pref="settings.enable_screen_lock"></span> </span> </label> - <a is="action-link" id="manage-screenlock" - i18n-content="manageScreenlock" hidden> + <a is="action-link" id="manage-screenlock" hidden> + $i18n{manageScreenlock} </a> </div> </div> @@ -57,13 +56,12 @@ <span id="start-stop-sync-indicator" class="controlled-setting-indicator" hidden> </span> - <button id="customize-sync" i18n-content="customizeSync" - pref="sync.managed" hidden> + <button id="customize-sync" pref="sync.managed" hidden> + $i18n{customizeSync} </button> <if expr="chromeos"> - <button id="manage-accounts-button" - public-account-visibility="hidden" - i18n-content="manageAccountsButtonTitle"> + <button id="manage-accounts-button" public-account-visibility="hidden"> + $i18n{manageAccountsButtonTitle} </button> </if> <!-- chromeos --> </div>
diff --git a/chrome/browser/resources/settings/internet_page/internet_detail_page.js b/chrome/browser/resources/settings/internet_page/internet_detail_page.js index 6acf65d..81b3add 100644 --- a/chrome/browser/resources/settings/internet_page/internet_detail_page.js +++ b/chrome/browser/resources/settings/internet_page/internet_detail_page.js
@@ -143,7 +143,7 @@ * network properties have been fetched in networkPropertiesChanged_(). * @private {boolean} */ - shoudlShowConfigureWhenNetworkLoaded_: false, + shouldShowConfigureWhenNetworkLoaded_: false, /** * Whether the previous route was also the network detail page. @@ -182,7 +182,7 @@ var type = /** @type {!chrome.networkingPrivate.NetworkType} */ ( queryParams.get('type')) || CrOnc.Type.WI_FI; - this.shoudlShowConfigureWhenNetworkLoaded_ = + this.shouldShowConfigureWhenNetworkLoaded_ = queryParams.get('showConfigure') == 'true'; this.wasPreviousRouteNetworkDetailPage_ = oldRoute == settings.Route.NETWORK_DETAIL; @@ -242,7 +242,7 @@ button.focus(); } - if (this.shoudlShowConfigureWhenNetworkLoaded_ && + if (this.shouldShowConfigureWhenNetworkLoaded_ && this.networkProperties.Tether) { this.showTetherDialog_(); }
diff --git a/chrome/browser/resources/settings/internet_page/internet_page.html b/chrome/browser/resources/settings/internet_page/internet_page.html index 839f12b..a213bc6 100644 --- a/chrome/browser/resources/settings/internet_page/internet_page.html +++ b/chrome/browser/resources/settings/internet_page/internet_page.html
@@ -65,9 +65,9 @@ <template is="dom-repeat" items="[[thirdPartyVpnProviders_]]"> <div actionable class="list-item" on-tap="onAddThirdPartyVpnTap_" provider="[[item]]"> - <div class="start">[[getAddThirdParrtyVpnLabel_(item)]]</div> + <div class="start">[[getAddThirdPartyVpnLabel_(item)]]</div> <button class="icon-external" is="paper-icon-button-light" - aria-label$="[[getAddThirdParrtyVpnLabel_(item)]]"> + aria-label$="[[getAddThirdPartyVpnLabel_(item)]]"> </button> </div> </template> @@ -88,7 +88,7 @@ </settings-internet-config> </settings-subpage> </template> - + <template is="dom-if" route-path="/networkDetail" no-search> <settings-subpage page-title="$i18n{internetDetailPageTitle}"> <settings-internet-detail-page prefs="{{prefs}}" @@ -98,7 +98,7 @@ </settings-internet-detail-page> </settings-subpage> </template> - + <template is="dom-if" route-path="/knownNetworks" no-search> <settings-subpage page-title="$i18n{internetKnownNetworksPageTitle}"> <settings-internet-known-networks-page @@ -111,7 +111,7 @@ <template is="dom-if" route-path="/networks" no-search> <settings-subpage page-title="[[getNetworksPageTitle_(subpageType_)]]" show-spinner="[[showSpinner_]]"> - <settings-internet-subpage + <settings-internet-subpage default-network="[[defaultNetwork]]" device-state="[[getDeviceState_(subpageType_, deviceStates)]]" tether-device-state="[[get('Tether', deviceStates)]]"
diff --git a/chrome/browser/resources/settings/internet_page/internet_page.js b/chrome/browser/resources/settings/internet_page/internet_page.js index c4a809e..a4d148e3 100644 --- a/chrome/browser/resources/settings/internet_page/internet_page.js +++ b/chrome/browser/resources/settings/internet_page/internet_page.js
@@ -428,7 +428,7 @@ * @param {!chrome.networkingPrivate.ThirdPartyVPNProperties} provider * @return {string} */ - getAddThirdParrtyVpnLabel_: function(provider) { + getAddThirdPartyVpnLabel_: function(provider) { return this.i18n('internetAddThirdPartyVPN', provider.ProviderName); },
diff --git a/chrome/browser/resources/settings/internet_page/network_property_list.html b/chrome/browser/resources/settings/internet_page/network_property_list.html index 01a09c9..b3778cf 100644 --- a/chrome/browser/resources/settings/internet_page/network_property_list.html +++ b/chrome/browser/resources/settings/internet_page/network_property_list.html
@@ -33,7 +33,7 @@ <template is="dom-repeat" items="[[fields]]" filter="[[computeFilter_(prefix, propertyDict, editFieldTypes)]]"> <div class="settings-box single-column two-line"> - <!-- Propety label --> + <!-- Property label --> <div>[[getPropertyLabel_(item, prefix)]]</div> <!-- Uneditable property value --> <div class="layout horizontal"
diff --git a/chrome/browser/resources/settings/internet_page/network_proxy.js b/chrome/browser/resources/settings/internet_page/network_proxy.js index 0812388..1579b0b 100644 --- a/chrome/browser/resources/settings/internet_page/network_proxy.js +++ b/chrome/browser/resources/settings/internet_page/network_proxy.js
@@ -199,7 +199,7 @@ proxy.PAC = /** @type {string|undefined} */ ( CrOnc.getActiveValue(proxySettings.PAC)); } - // Use saved ExcludeDomanains and Manual if not defined. + // Use saved ExcludeDomains and Manual if not defined. proxy.ExcludeDomains = proxy.ExcludeDomains || this.savedExcludeDomains_; proxy.Manual = proxy.Manual || this.savedManual_;
diff --git a/chrome/browser/resources/settings/internet_page/network_summary.js b/chrome/browser/resources/settings/internet_page/network_summary.js index b1e607f..3f83c7af 100644 --- a/chrome/browser/resources/settings/internet_page/network_summary.js +++ b/chrome/browser/resources/settings/internet_page/network_summary.js
@@ -312,7 +312,7 @@ if (!device) continue; // The technology for this device type is unavailable. - // If both 'Tether' and 'Cellular' technoligies exist, merge the network + // If both 'Tether' and 'Cellular' technologies exist, merge the network // lists and do not add an active network for 'Tether' so that there is // only one 'Mobile data' section / subpage. if (type == CrOnc.Type.TETHER && newDeviceStates[CrOnc.Type.CELLULAR]) {
diff --git a/chrome/browser/resources/settings/on_startup_page/compiled_resources2.gyp b/chrome/browser/resources/settings/on_startup_page/compiled_resources2.gyp index d29ed565..725d084 100644 --- a/chrome/browser/resources/settings/on_startup_page/compiled_resources2.gyp +++ b/chrome/browser/resources/settings/on_startup_page/compiled_resources2.gyp
@@ -14,7 +14,7 @@ { 'target_name': 'on_startup_page', 'dependencies': [ - 'on_startup_browser_proxy', + '../compiled_resources2.gyp:route', ], 'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'], }, @@ -27,6 +27,7 @@ '<(DEPTH)/ui/webui/resources/js/cr/ui/compiled_resources2.gyp:focus_without_ink', '<(DEPTH)/ui/webui/resources/cr_elements/compiled_resources2.gyp:cr_scrollable_behavior', '<(EXTERNS_GYP):settings_private', + 'on_startup_browser_proxy', 'startup_urls_page_browser_proxy', 'startup_url_entry', ],
diff --git a/chrome/browser/resources/settings/on_startup_page/on_startup_page.html b/chrome/browser/resources/settings/on_startup_page/on_startup_page.html index e0ce1da9..e5cac20 100644 --- a/chrome/browser/resources/settings/on_startup_page/on_startup_page.html +++ b/chrome/browser/resources/settings/on_startup_page/on_startup_page.html
@@ -1,51 +1,34 @@ <link rel="import" href="chrome://resources/html/polymer.html"> -<link rel="import" href="../controls/controlled_radio_button.html"> -<link rel="import" href="../controls/extension_controlled_indicator.html"> -<link rel="import" href="../controls/settings_radio_group.html"> -<link rel="import" href="on_startup_browser_proxy.html"> -<link rel="import" href="startup_urls_page.html"> <link rel="import" href="../settings_shared_css.html"> +<link rel="import" href="startup_urls_page.html"> <dom-module id="settings-on-startup-page"> <template> - <style include="settings-shared"> - .block { - display: block; - } - </style> - <div class="settings-box block first"> - <settings-radio-group id="onStartupRadioGroup" - pref="{{prefs.session.restore_on_startup}}"> - <controlled-radio-button name="[[prefValues_.OPEN_NEW_TAB]]" - pref="[[prefs.session.restore_on_startup]]" - label="$i18n{onStartupOpenNewTab}" - no-extension-indicator> - </controlled-radio-button> - <template is="dom-if" if="[[showIndicator_( - ntpExtension_, prefs.session.restore_on_startup.value)]]"> - <extension-controlled-indicator - extension-id="[[ntpExtension_.id]]" - extension-name="[[ntpExtension_.name]]" - extension-can-be-disabled="[[ntpExtension_.canBeDisabled]]" - on-extension-disable="getNtpExtension_"> - </extension-controlled-indicator> - </template> - <controlled-radio-button name="[[prefValues_.CONTINUE]]" - pref="[[prefs.session.restore_on_startup]]" - label="$i18n{onStartupContinue}"> - </controlled-radio-button> - <controlled-radio-button name="[[prefValues_.OPEN_SPECIFIC]]" - pref="[[prefs.session.restore_on_startup]]" - label="$i18n{onStartupOpenSpecific}"> - </controlled-radio-button> - </settings-radio-group> - </div> - <template is="dom-if" - if="[[showStartupUrls_(prefs.session.restore_on_startup.value)]]"> - <settings-startup-urls-page prefs="[[prefs]]"> - </settings-startup-urls-page> - </template> + <style include="settings-shared"></style> + <settings-animated-pages id="pages" section="onStartup" + focus-config="[[focusConfig_]]"> + <neon-animatable route-path="default"> + <div class="settings-box first two-line" + id="manage-startup-urls-subpage-trigger" + on-tap="onManageStartupUrls_" actionable> + <div class="start"> + $i18n{onStartupManage} + <div class="secondary">$i18n{onStartupDescription}</div> + </div> + <button class="subpage-arrow" is="paper-icon-button-light" + aria-label="$i18n{onStartupManage}"></button> + </div> + </neon-animatable> + <template is="dom-if" route-path="/startupUrls"> + <settings-subpage + associated-control="[[$$('#manage-startup-urls-subpage-trigger')]]" + page-title="$i18n{onStartupManage}"> + <settings-startup-urls-page prefs="{{prefs}}"> + </settings-startup-urls-page> + </settings-subpage> + </template> + </settings-animated-pages> </template> <script src="on_startup_page.js"></script> </dom-module>
diff --git a/chrome/browser/resources/settings/on_startup_page/on_startup_page.js b/chrome/browser/resources/settings/on_startup_page/on_startup_page.js index c02d05c..70445ed2 100644 --- a/chrome/browser/resources/settings/on_startup_page/on_startup_page.js +++ b/chrome/browser/resources/settings/on_startup_page/on_startup_page.js
@@ -5,72 +5,16 @@ /** * @fileoverview * 'settings-on-startup-page' is a settings page. - * - * Example: - * - * <neon-animated-pages> - * <settings-on-startup-page prefs="{{prefs}}"> - * </settings-on-startup-page> - * ... other pages ... - * </neon-animated-pages> */ Polymer({ is: 'settings-on-startup-page', properties: { - prefs: { - type: Object, - notify: true, - }, - - /** @private {?NtpExtension} */ - ntpExtension_: Object, - - /** - * Enum values for the 'session.restore_on_startup' preference. - * @private {!Object<string, number>} - */ - prefValues_: { - readOnly: true, - type: Object, - value: { - CONTINUE: 1, - OPEN_NEW_TAB: 5, - OPEN_SPECIFIC: 4, - }, - }, - }, - - /** @override */ - attached: function() { - this.getNtpExtension_(); + prefs: Object, }, /** @private */ - getNtpExtension_: function() { - settings.OnStartupBrowserProxyImpl.getInstance().getNtpExtension().then( - function(ntpExtension) { - this.ntpExtension_ = ntpExtension; - }.bind(this)); - }, - - /** - * @param {?NtpExtension} ntpExtension - * @param {number} restoreOnStartup Value of prefs.session.restore_on_startup. - * @return {boolean} - * @private - */ - showIndicator_: function(ntpExtension, restoreOnStartup) { - return !!ntpExtension && restoreOnStartup == this.prefValues_.OPEN_NEW_TAB; - }, - - /** - * Determine whether to show the user defined startup pages. - * @param {number} restoreOnStartup Enum value from prefValues_. - * @return {boolean} Whether the open specific pages is selected. - * @private - */ - showStartupUrls_: function(restoreOnStartup) { - return restoreOnStartup == this.prefValues_.OPEN_SPECIFIC; + onManageStartupUrls_: function() { + settings.navigateTo(settings.Route.STARTUP_URLS); }, });
diff --git a/chrome/browser/resources/settings/on_startup_page/startup_urls_page.html b/chrome/browser/resources/settings/on_startup_page/startup_urls_page.html index e66cbb3d..d1f8e9a3 100644 --- a/chrome/browser/resources/settings/on_startup_page/startup_urls_page.html +++ b/chrome/browser/resources/settings/on_startup_page/startup_urls_page.html
@@ -8,8 +8,11 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html"> <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html"> <link rel="import" href="chrome://resources/cr_elements/cr_scrollable_behavior.html"> +<link rel="import" href="../controls/controlled_radio_button.html"> <link rel="import" href="../controls/extension_controlled_indicator.html"> +<link rel="import" href="../controls/settings_radio_group.html"> <link rel="import" href="../settings_shared_css.html"> +<link rel="import" href="on_startup_browser_proxy.html"> <link rel="import" href="startup_url_dialog.html"> <link rel="import" href="startup_url_entry.html"> <link rel="import" href="startup_urls_page_browser_proxy.html"> @@ -30,44 +33,79 @@ cursor: default; } </style> - <div id="outer" class="layout vertical flex vertical-list"> - <div id="container" class="scroll-container" scrollable> - <iron-list items="[[startupPages_]]" scroll-target="container" - preserve-focus> - <template> - <settings-startup-url-entry model="[[item]]" - tabindex$="[[tabIndex]]" iron-list-tab-index="[[tabIndex]]" - last-focused="{{lastFocused_}}" - editable="[[shouldAllowUrlsEdit_( - prefs.session.startup_urls.enforcement)]]"> - </settings-startup-url-entry> - </template> - </iron-list> - </div> - <template is="dom-if" if="[[shouldAllowUrlsEdit_( - prefs.session.startup_urls.enforcement)]]" restamp> - <div class="list-item" id="addPage"> - <a is="action-link" class="list-button" on-tap="onAddPageTap_"> - $i18n{onStartupAddNewPage} - </a> - </div> - <div class="list-item" id="useCurrentPages"> - <a is="action-link" class="list-button" - on-tap="onUseCurrentPagesTap_"> - $i18n{onStartupUseCurrent} - </a> - </div> - </template> - <template is="dom-if" if="[[prefs.session.startup_urls.extensionId]]" - restamp> - <extension-controlled-indicator - extension-id="[[prefs.session.startup_urls.extensionId]]" - extension-name="[[prefs.session.startup_urls.controlledByName]]" - extension-can-be-disabled="[[ - prefs.session.startup_urls.extensionCanBeDisabled]]"> - </extension-controlled-indicator> - </template> + <div class="settings-box first"> + <h2>$i18n{onStartupPages}</h2> </div> + <div class="settings-box first"> + <div class="start"> + <settings-radio-group id="onStartupRadioGroup" + pref="{{prefs.session.restore_on_startup}}"> + <controlled-radio-button name="[[prefValues_.OPEN_NEW_TAB]]" + pref="[[prefs.session.restore_on_startup]]" + label="$i18n{onStartupOpenNewTab}" + no-extension-indicator> + </controlled-radio-button> + <template is="dom-if" if="[[showIndicator_( + ntpExtension_, prefs.session.restore_on_startup.value)]]"> + <extension-controlled-indicator + extension-id="[[ntpExtension_.id]]" + extension-name="[[ntpExtension_.name]]" + extension-can-be-disabled="[[ntpExtension_.canBeDisabled]]" + on-extension-disable="getNtpExtension_"> + </extension-controlled-indicator> + </template> + <controlled-radio-button name="[[prefValues_.CONTINUE]]" + pref="[[prefs.session.restore_on_startup]]" + label="$i18n{onStartupContinue}"> + </controlled-radio-button> + <controlled-radio-button name="[[prefValues_.OPEN_SPECIFIC]]" + pref="[[prefs.session.restore_on_startup]]" + label="$i18n{onStartupOpenSpecific}"> + </controlled-radio-button> + </settings-radio-group> + </div> + </div> + <template is="dom-if" + if="[[showStartupUrls_(prefs.session.restore_on_startup.value)]]"> + <div id="outer" class="layout vertical flex vertical-list"> + <div id="container" class="scroll-container" scrollable> + <iron-list items="[[startupPages_]]" scroll-target="container" + preserve-focus> + <template> + <settings-startup-url-entry model="[[item]]" + tabindex$="[[tabIndex]]" iron-list-tab-index="[[tabIndex]]" + last-focused="{{lastFocused_}}" + editable="[[shouldAllowUrlsEdit_( + prefs.session.startup_urls.enforcement)]]"> + </settings-startup-url-entry> + </template> + </iron-list> + </div> + <template is="dom-if" if="[[shouldAllowUrlsEdit_( + prefs.session.startup_urls.enforcement)]]" restamp> + <div class="list-item" id="addPage"> + <a is="action-link" class="list-button" on-tap="onAddPageTap_"> + $i18n{onStartupAddNewPage} + </a> + </div> + <div class="list-item" id="useCurrentPages"> + <a is="action-link" class="list-button" + on-tap="onUseCurrentPagesTap_"> + $i18n{onStartupUseCurrent} + </a> + </div> + </template> + <template is="dom-if" if="[[prefs.session.startup_urls.extensionId]]" + restamp> + <extension-controlled-indicator + extension-id="[[prefs.session.startup_urls.extensionId]]" + extension-name="[[prefs.session.startup_urls.controlledByName]]" + extension-can-be-disabled="[[ + prefs.session.startup_urls.extensionCanBeDisabled]]"> + </extension-controlled-indicator> + </template> + </div> + </template> <template is="dom-if" if="[[showStartupUrlDialog_]]" restamp> <settings-startup-url-dialog model="[[startupUrlDialogModel_]]" on-close="destroyUrlDialog_">
diff --git a/chrome/browser/resources/settings/on_startup_page/startup_urls_page.js b/chrome/browser/resources/settings/on_startup_page/startup_urls_page.js index 38451be..02ab24e 100644 --- a/chrome/browser/resources/settings/on_startup_page/startup_urls_page.js +++ b/chrome/browser/resources/settings/on_startup_page/startup_urls_page.js
@@ -13,7 +13,10 @@ behaviors: [CrScrollableBehavior, WebUIListenerBehavior], properties: { - prefs: Object, + prefs: { + type: Object, + notify: true, + }, /** * Pages to load upon browser startup. @@ -29,6 +32,23 @@ /** @private {Object}*/ lastFocused_: Object, + + /** @private {?NtpExtension} */ + ntpExtension_: Object, + + /** + * Enum values for the 'session.restore_on_startup' preference. + * @private {!Object<string, number>} + */ + prefValues_: { + readOnly: true, + type: Object, + value: { + CONTINUE: 1, + OPEN_NEW_TAB: 5, + OPEN_SPECIFIC: 4, + }, + }, }, /** @private {?settings.StartupUrlsPageBrowserProxy} */ @@ -42,6 +62,11 @@ /** @override */ attached: function() { + settings.OnStartupBrowserProxyImpl.getInstance().getNtpExtension().then( + function(ntpExtension) { + this.ntpExtension_ = ntpExtension; + }.bind(this)); + this.browserProxy_ = settings.StartupUrlsPageBrowserProxyImpl.getInstance(); this.addWebUIListener('update-startup-pages', function(startupPages) { // If an "edit" URL dialog was open, close it, because the underlying page @@ -96,4 +121,24 @@ return this.get('prefs.session.startup_urls.enforcement') != chrome.settingsPrivate.Enforcement.ENFORCED; }, + + /** + * @param {?NtpExtension} ntpExtension + * @param {number} restoreOnStartup Value of prefs.session.restore_on_startup. + * @return {boolean} + * @private + */ + showIndicator_: function(ntpExtension, restoreOnStartup) { + return !!ntpExtension && restoreOnStartup == this.prefValues_.OPEN_NEW_TAB; + }, + + /** + * Determine whether to show the user defined startup pages. + * @param {number} restoreOnStartup Enum value from prefValues_. + * @return {boolean} Whether the open specific pages is selected. + * @private + */ + showStartupUrls_: function(restoreOnStartup) { + return restoreOnStartup == this.prefValues_.OPEN_SPECIFIC; + }, });
diff --git a/chrome/browser/resources/settings/route.js b/chrome/browser/resources/settings/route.js index 1d3496b..ed960c6 100644 --- a/chrome/browser/resources/settings/route.js +++ b/chrome/browser/resources/settings/route.js
@@ -138,6 +138,7 @@ // </if> r.ON_STARTUP = r.BASIC.createSection('/onStartup', 'onStartup'); + r.STARTUP_URLS = r.ON_STARTUP.createChild('/startupUrls'); r.PEOPLE = r.BASIC.createSection('/people', 'people'); r.SYNC = r.PEOPLE.createChild('/syncSetup');
diff --git a/chrome/browser/safe_browsing/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection_service.cc index d2764d21..822e3353 100644 --- a/chrome/browser/safe_browsing/download_protection_service.cc +++ b/chrome/browser/safe_browsing/download_protection_service.cc
@@ -157,6 +157,19 @@ DOWNLOAD_CHECKS_MAX }; +void AddEventUrlToReferrerChain(const content::DownloadItem& item, + ReferrerChain* out_referrer_chain) { + ReferrerChainEntry* event_url_entry = out_referrer_chain->Add(); + event_url_entry->set_url(item.GetURL().spec()); + event_url_entry->set_type(ReferrerChainEntry::EVENT_URL); + event_url_entry->set_referrer_url( + item.GetWebContents()->GetLastCommittedURL().spec()); + event_url_entry->set_is_retargeting(false); + event_url_entry->set_navigation_time_msec(base::Time::Now().ToJavaTime()); + for (const GURL& url : item.GetUrlChain()) + event_url_entry->add_server_redirect_chain()->set_url(url.spec()); +} + } // namespace const char DownloadProtectionService::kDownloadRequestUrl[] = @@ -298,10 +311,9 @@ if (!item_) return; - item_->SetUserData( - kDownloadReferrerChainDataKey, - base::MakeUnique<ReferrerChainData>(service_->IdentifyReferrerChain( - item_->GetURL(), item_->GetWebContents()))); + item_->SetUserData(kDownloadReferrerChainDataKey, + base::MakeUnique<ReferrerChainData>( + service_->IdentifyReferrerChain(*item_))); } void UpdateDownloadCheckStats(SBStatsType stat_type) { @@ -1958,8 +1970,7 @@ } std::unique_ptr<ReferrerChain> DownloadProtectionService::IdentifyReferrerChain( - const GURL& download_url, - content::WebContents* web_contents) { + const content::DownloadItem& item) { // If navigation_observer_manager_ is null, return immediately. This could // happen in tests. if (!navigation_observer_manager_) @@ -1967,6 +1978,7 @@ std::unique_ptr<ReferrerChain> referrer_chain = base::MakeUnique<ReferrerChain>(); + content::WebContents* web_contents = item.GetWebContents(); int download_tab_id = SessionTabHelper::IdForTab(web_contents); UMA_HISTOGRAM_BOOLEAN( "SafeBrowsing.ReferrerHasInvalidTabID.DownloadAttribution", @@ -1974,7 +1986,7 @@ // We look for the referrer chain that leads to the download url first. SafeBrowsingNavigationObserverManager::AttributionResult result = navigation_observer_manager_->IdentifyReferrerChainByEventURL( - download_url, download_tab_id, kDownloadAttributionUserGestureLimit, + item.GetURL(), download_tab_id, kDownloadAttributionUserGestureLimit, referrer_chain.get()); // If no navigation event is found, this download is not triggered by regular @@ -1983,6 +1995,7 @@ if (result == SafeBrowsingNavigationObserverManager::NAVIGATION_EVENT_NOT_FOUND && web_contents && web_contents->GetLastCommittedURL().is_valid()) { + AddEventUrlToReferrerChain(item, referrer_chain.get()); result = navigation_observer_manager_->IdentifyReferrerChainByWebContents( web_contents, kDownloadAttributionUserGestureLimit, referrer_chain.get());
diff --git a/chrome/browser/safe_browsing/download_protection_service.h b/chrome/browser/safe_browsing/download_protection_service.h index a0c6e51..7acc56ef 100644 --- a/chrome/browser/safe_browsing/download_protection_service.h +++ b/chrome/browser/safe_browsing/download_protection_service.h
@@ -253,6 +253,8 @@ PPAPIDownloadRequest_InvalidResponse); FRIEND_TEST_ALL_PREFIXES(DownloadProtectionServiceTest, PPAPIDownloadRequest_Timeout); + FRIEND_TEST_ALL_PREFIXES(DownloadProtectionServiceTest, + VerifyReferrerChainWithEmptyNavigationHistory); FRIEND_TEST_ALL_PREFIXES(DownloadProtectionServiceFlagTest, CheckClientDownloadOverridenByFlag); @@ -300,8 +302,7 @@ // a download. This function also records UMA stats of download attribution // result. std::unique_ptr<ReferrerChain> IdentifyReferrerChain( - const GURL& download_url, - content::WebContents* web_contents); + const content::DownloadItem& item); // If kDownloadAttribution feature is enabled, identify referrer chain of the // PPAPI download based on the frame URL where the download is initiated.
diff --git a/chrome/browser/safe_browsing/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection_service_unittest.cc index d42213e..0976d6e 100644 --- a/chrome/browser/safe_browsing/download_protection_service_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection_service_unittest.cc
@@ -50,6 +50,7 @@ #include "content/public/test/mock_download_item.h" #include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_utils.h" +#include "content/public/test/web_contents_tester.h" #include "net/base/url_util.h" #include "net/cert/x509_certificate.h" #include "net/http/http_status_code.h" @@ -2386,6 +2387,37 @@ EXPECT_EQ(".sdF", request.alternate_extensions(2)); } +TEST_F(DownloadProtectionServiceTest, + VerifyReferrerChainWithEmptyNavigationHistory) { + // Setup a web_contents with "http://example.com" as its last committed url. + content::WebContents* web_contents = + content::WebContentsTester::CreateTestWebContents(profile_.get(), + nullptr); + content::WebContentsTester* web_contents_tester = + content::WebContentsTester::For(web_contents); + web_contents_tester->SetLastCommittedURL(GURL("http://example.com")); + + NiceMockDownloadItem item; + PrepareBasicDownloadItem( + &item, {"http://referrer.com", "http://www.evil.com/a.exe"}, // url_chain + "http://example.com/", // referrer + FILE_PATH_LITERAL("a.tmp"), // tmp_path + FILE_PATH_LITERAL("a.exe")); // final_path + ON_CALL(item, GetWebContents()).WillByDefault(Return(web_contents)); + + std::unique_ptr<ReferrerChain> referrer_chain = + download_service_->IdentifyReferrerChain(item); + + ASSERT_EQ(1, referrer_chain->size()); + EXPECT_EQ(item.GetUrlChain().back(), referrer_chain->Get(0).url()); + EXPECT_EQ(web_contents->GetLastCommittedURL().spec(), + referrer_chain->Get(0).referrer_url()); + EXPECT_EQ(ReferrerChainEntry::EVENT_URL, referrer_chain->Get(0).type()); + EXPECT_EQ(static_cast<int>(item.GetUrlChain().size()), + referrer_chain->Get(0).server_redirect_chain_size()); + EXPECT_FALSE(referrer_chain->Get(0).is_retargeting()); +} + // ------------ class DownloadProtectionServiceFlagTest ---------------- class DownloadProtectionServiceFlagTest : public DownloadProtectionServiceTest { protected:
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_observer.cc index 1be3c994..d2c47cb 100644 --- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer.cc +++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer.cc
@@ -7,10 +7,13 @@ #include "base/memory/ptr_util.h" #include "base/time/time.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/sessions/session_tab_helper.h" +#include "chrome/browser/ui/page_info/page_info_ui.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" @@ -98,7 +101,11 @@ : content::WebContentsObserver(contents), manager_(manager), has_user_gesture_(false), - last_user_gesture_timestamp_(base::Time()) {} + last_user_gesture_timestamp_(base::Time()), + content_settings_observer_(this) { + content_settings_observer_.Add(HostContentSettingsMapFactory::GetForProfile( + Profile::FromBrowserContext(web_contents()->GetBrowserContext()))); +} SafeBrowsingNavigationObserver::~SafeBrowsingNavigationObserver() {} @@ -256,4 +263,17 @@ renderer_initiated); } +void SafeBrowsingNavigationObserver::OnContentSettingChanged( + const ContentSettingsPattern& primary_pattern, + const ContentSettingsPattern& secondary_pattern, + ContentSettingsType content_type, + std::string resource_identifier) { + // For all the content settings that can be changed via page info UI, we + // assume there is a user gesture associated with the content setting change. + if (primary_pattern.Matches(web_contents()->GetLastCommittedURL()) && + PageInfoUI::ContentSettingsTypeInPageInfo(content_type)) { + DidGetUserInteraction(blink::WebInputEvent::kMouseDown); + } +} + } // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer.h b/chrome/browser/safe_browsing/safe_browsing_navigation_observer.h index 15030a6..0f80f5e 100644 --- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer.h +++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer.h
@@ -5,7 +5,10 @@ #ifndef CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_NAVIGATION_OBSERVER_H_ #define CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_NAVIGATION_OBSERVER_H_ +#include "base/scoped_observer.h" #include "base/supports_user_data.h" +#include "components/content_settings/core/browser/content_settings_observer.h" +#include "components/content_settings/core/common/content_settings.h" #include "content/public/browser/web_contents_observer.h" #include "url/gurl.h" @@ -13,6 +16,8 @@ class NavigationHandle; } +class HostContentSettingsMap; + namespace safe_browsing { class SafeBrowsingNavigationObserverManager; @@ -68,7 +73,8 @@ // Observes the navigation events for a single WebContents (both main-frame // and sub-frame navigations). class SafeBrowsingNavigationObserver : public base::SupportsUserData::Data, - public content::WebContentsObserver { + public content::WebContentsObserver, + public content_settings::Observer { public: static void MaybeCreateForWebContents( content::WebContents* web_contents); @@ -83,6 +89,7 @@ ~SafeBrowsingNavigationObserver() override; private: + FRIEND_TEST_ALL_PREFIXES(SBNavigationObserverTest, TestContentSettingChange); typedef std::unordered_map<content::NavigationHandle*, std::unique_ptr<NavigationEvent>> NavigationHandleMap; @@ -107,6 +114,12 @@ bool started_from_context_menu, bool renderer_initiated) override; + // content_settings::Observer overrides. + void OnContentSettingChanged(const ContentSettingsPattern& primary_pattern, + const ContentSettingsPattern& secondary_pattern, + ContentSettingsType content_type, + std::string resource_identifier) override; + // Map keyed on NavigationHandle* to keep track of all the ongoing navigation // events. NavigationHandle pointers are owned by RenderFrameHost. Since a // NavigationHandle object will be destructed after navigation is done, @@ -121,6 +134,8 @@ bool has_user_gesture_; base::Time last_user_gesture_timestamp_; + ScopedObserver<HostContentSettingsMap, content_settings::Observer> + content_settings_observer_; DISALLOW_COPY_AND_ASSIGN(SafeBrowsingNavigationObserver); };
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc index 1a51004c..ef5f3ab 100644 --- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc +++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc
@@ -347,4 +347,33 @@ EXPECT_EQ("9.9.9.9", host_to_ip_map()->at(host_1).at(0).ip); } +TEST_F(SBNavigationObserverTest, TestContentSettingChange) { + user_gesture_map()->clear(); + ASSERT_EQ(0U, user_gesture_map()->size()); + + content::WebContents* web_content = + browser()->tab_strip_model()->GetWebContentsAt(0); + + // Simulate content setting change via page info UI. + navigation_observer_->OnContentSettingChanged( + ContentSettingsPattern::FromURL(web_content->GetLastCommittedURL()), + ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_NOTIFICATIONS, + std::string()); + + // A user gesture should be recorded. + ASSERT_EQ(1U, user_gesture_map()->size()); + EXPECT_NE(user_gesture_map()->end(), user_gesture_map()->find(web_content)); + + user_gesture_map()->clear(); + ASSERT_EQ(0U, user_gesture_map()->size()); + + // Simulate content setting change that cannot be changed via page info UI. + navigation_observer_->OnContentSettingChanged( + ContentSettingsPattern::FromURL(web_content->GetLastCommittedURL()), + ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, + std::string()); + // No user gesture should be recorded. + EXPECT_EQ(0U, user_gesture_map()->size()); +} + } // namespace safe_browsing
diff --git a/chrome/browser/sessions/session_data_deleter.cc b/chrome/browser/sessions/session_data_deleter.cc index 72af6aa..e4b2d263 100644 --- a/chrome/browser/sessions/session_data_deleter.cc +++ b/chrome/browser/sessions/session_data_deleter.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include <stddef.h> +#include <stdint.h> #include "base/bind.h" #include "base/command_line.h" @@ -26,8 +27,8 @@ namespace { -void CookieDeleted(int num_cookies_deleted) { - DCHECK_EQ(1, num_cookies_deleted); +void CookieDeleted(uint32_t num_cookies_deleted) { + DCHECK_EQ(1u, num_cookies_deleted); } class SessionDataDeleter @@ -59,7 +60,7 @@ // Called when all session-only cookies have been deleted. void DeleteSessionCookiesDone(net::CookieStore* cookie_store, - int num_deleted); + uint32_t num_deleted); // Deletes the cookies in |cookies| that are for origins which are // session-only. @@ -134,7 +135,7 @@ void SessionDataDeleter::DeleteSessionCookiesDone( net::CookieStore* cookie_store, - int num_deleted) { + uint32_t num_deleted) { // If these callbacks are invoked, |cookie_store| is gauranteed to still // exist, since deleting the CookieStore will cancel pending callbacks. cookie_store->GetAllCookiesAsync(
diff --git a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc index bbd058e..0e3c700 100644 --- a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc +++ b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
@@ -16,9 +16,11 @@ #include "base/memory/ptr_util.h" #include "base/path_service.h" #include "base/strings/pattern.h" +#include "base/strings/string16.h" #include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" #include "base/test/histogram_tester.h" #include "base/test/simple_test_clock.h" #include "chrome/browser/browser_process.h" @@ -69,6 +71,7 @@ #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" #include "content/public/common/browser_side_navigation_policy.h" +#include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "content/public/common/referrer.h" #include "content/public/test/browser_test_utils.h" @@ -212,12 +215,13 @@ protected: void SetUpCommandLine(base::CommandLine* command_line) override { - command_line->AppendSwitchASCII( - switches::kEnableFeatures, - base::JoinString( - {kSafeBrowsingSubresourceFilter.name, "SafeBrowsingV4OnlyEnabled", - kSafeBrowsingSubresourceFilterExperimentalUI.name}, - ",")); + command_line->AppendSwitchASCII(switches::kEnableFeatures, + base::JoinString(RequiredFeatures(), ",")); + } + + std::vector<base::StringPiece> RequiredFeatures() const { + return {kSafeBrowsingSubresourceFilter.name, "SafeBrowsingV4OnlyEnabled", + kSafeBrowsingSubresourceFilterExperimentalUI.name}; } void SetUp() override { @@ -469,6 +473,41 @@ std::unique_ptr<net::SpawnedTestServer> websocket_test_server_; }; +enum class OffMainThreadFetchPolicy { + kEnabled, + kDisabled, +}; + +class SubresourceFilterWorkerFetchBrowserTest + : public SubresourceFilterBrowserTest, + public ::testing::WithParamInterface<OffMainThreadFetchPolicy> { + public: + SubresourceFilterWorkerFetchBrowserTest() {} + ~SubresourceFilterWorkerFetchBrowserTest() override {} + + protected: + void SetUpCommandLine(base::CommandLine* command_line) override { + std::vector<base::StringPiece> features = + SubresourceFilterBrowserTest::RequiredFeatures(); + if (GetParam() == OffMainThreadFetchPolicy::kEnabled) { + features.push_back(features::kOffMainThreadFetch.name); + } else { + command_line->AppendSwitchASCII(switches::kDisableFeatures, + features::kOffMainThreadFetch.name); + } + command_line->AppendSwitchASCII(switches::kEnableFeatures, + base::JoinString(features, ",")); + } + + void ClearTitle() { + ASSERT_TRUE(content::ExecuteScript(web_contents()->GetMainFrame(), + "document.title = \"\";")); + } + + private: + DISALLOW_COPY_AND_ASSIGN(SubresourceFilterWorkerFetchBrowserTest); +}; + // Tests ----------------------------------------------------------------------- IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, MainFrameActivation) { @@ -1401,6 +1440,52 @@ ::testing::Values(WebSocketCreationPolicy::IN_WORKER, WebSocketCreationPolicy::IN_MAIN_FRAME)); +IN_PROC_BROWSER_TEST_P(SubresourceFilterWorkerFetchBrowserTest, WorkerFetch) { + const base::string16 fetch_succeeded_title = + base::ASCIIToUTF16("FetchSucceeded"); + const base::string16 fetch_failed_title = base::ASCIIToUTF16("FetchFailed"); + GURL url(GetTestUrl("subresource_filter/worker_fetch.html")); + ConfigureAsPhishingURL(url); + + ASSERT_NO_FATAL_FAILURE(SetRulesetToDisallowURLsWithPathSuffix( + "suffix-that-does-not-match-anything")); + { + content::TitleWatcher title_watcher( + browser()->tab_strip_model()->GetActiveWebContents(), + fetch_succeeded_title); + title_watcher.AlsoWaitForTitle(fetch_failed_title); + ui_test_utils::NavigateToURL(browser(), url); + EXPECT_EQ(fetch_succeeded_title, title_watcher.WaitAndGetTitle()); + } + ClearTitle(); + ASSERT_NO_FATAL_FAILURE( + SetRulesetToDisallowURLsWithPathSuffix("worker_fetch_data.txt")); + { + content::TitleWatcher title_watcher( + browser()->tab_strip_model()->GetActiveWebContents(), + fetch_succeeded_title); + title_watcher.AlsoWaitForTitle(fetch_failed_title); + ui_test_utils::NavigateToURL(browser(), url); + EXPECT_EQ(fetch_failed_title, title_watcher.WaitAndGetTitle()); + } + ClearTitle(); + // The main frame document should never be filtered. + SetRulesetToDisallowURLsWithPathSuffix("worker_fetch.html"); + { + content::TitleWatcher title_watcher( + browser()->tab_strip_model()->GetActiveWebContents(), + fetch_succeeded_title); + title_watcher.AlsoWaitForTitle(fetch_failed_title); + ui_test_utils::NavigateToURL(browser(), url); + EXPECT_EQ(fetch_succeeded_title, title_watcher.WaitAndGetTitle()); + } +} + +INSTANTIATE_TEST_CASE_P(/* no prefix */, + SubresourceFilterWorkerFetchBrowserTest, + ::testing::Values(OffMainThreadFetchPolicy::kEnabled, + OffMainThreadFetchPolicy::kDisabled)); + // Tests checking how histograms are recorded. --------------------------------- namespace {
diff --git a/chrome/browser/task_manager/providers/arc/arc_process_filter.cc b/chrome/browser/task_manager/providers/arc/arc_process_filter.cc index c7e3bc72..0d0202ba 100644 --- a/chrome/browser/task_manager/providers/arc/arc_process_filter.cc +++ b/chrome/browser/task_manager/providers/arc/arc_process_filter.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/logging.h" #include "components/arc/common/process.mojom.h" namespace task_manager { @@ -35,14 +36,32 @@ // ProcessState::TOP: Process is hosting the current top activities // ProcessState::IMPORTANT_FOREGROUND: Process is important to the user // ProcessState::TOP_SLEEPING: Same as TOP, but while the device is sleeping + // ProcessState::LAST_ACTIVITY: The last activity - see crbug.com/738651. + // ProcessState::FOREGROUND_SERVICE: Foreground service - in Android, the user + // is made aware of these via a notification. switch (process.process_state()) { case arc::mojom::ProcessState::TOP: // Fallthrough. case arc::mojom::ProcessState::IMPORTANT_FOREGROUND: case arc::mojom::ProcessState::TOP_SLEEPING: + case arc::mojom::ProcessState::LAST_ACTIVITY: + case arc::mojom::ProcessState::FOREGROUND_SERVICE: return true; - default: - break; + case arc::mojom::ProcessState::NONEXISTENT: // Fallthrough. + case arc::mojom::ProcessState::PERSISTENT: + case arc::mojom::ProcessState::PERSISTENT_UI: + case arc::mojom::ProcessState::BOUND_FOREGROUND_SERVICE: + case arc::mojom::ProcessState::IMPORTANT_BACKGROUND: + case arc::mojom::ProcessState::BACKUP: + case arc::mojom::ProcessState::HEAVY_WEIGHT: + case arc::mojom::ProcessState::SERVICE: + case arc::mojom::ProcessState::RECEIVER: + case arc::mojom::ProcessState::HOME: + case arc::mojom::ProcessState::CACHED_ACTIVITY: + case arc::mojom::ProcessState::CACHED_ACTIVITY_CLIENT: + case arc::mojom::ProcessState::CACHED_EMPTY: + return false; } + NOTREACHED(); return false; }
diff --git a/chrome/browser/task_manager/providers/arc/arc_process_filter.h b/chrome/browser/task_manager/providers/arc/arc_process_filter.h index d1f1d89..8b0b9932 100644 --- a/chrome/browser/task_manager/providers/arc/arc_process_filter.h +++ b/chrome/browser/task_manager/providers/arc/arc_process_filter.h
@@ -8,6 +8,7 @@ #include <set> #include <string> +#include "base/macros.h" #include "chrome/browser/chromeos/arc/process/arc_process.h" namespace task_manager {
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index f535d5c9e..c137a8fd 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -2374,8 +2374,6 @@ "webui/offline/offline_internals_ui.h", "webui/offline/offline_internals_ui_message_handler.cc", "webui/offline/offline_internals_ui_message_handler.h", - "webui/popular_sites_internals_ui.cc", - "webui/popular_sites_internals_ui.h", "webui/snippets_internals_message_handler.cc", "webui/snippets_internals_message_handler.h", "webui/snippets_internals_ui.cc",
diff --git a/chrome/browser/ui/page_info/page_info_ui.cc b/chrome/browser/ui/page_info/page_info_ui.cc index 524be75..ac53c088 100644 --- a/chrome/browser/ui/page_info/page_info_ui.cc +++ b/chrome/browser/ui/page_info/page_info_ui.cc
@@ -451,3 +451,12 @@ return base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kShowCertLink); } + +// static +bool PageInfoUI::ContentSettingsTypeInPageInfo(ContentSettingsType type) { + for (const PermissionsUIInfo& info : kPermissionsUIInfo) { + if (info.type == type) + return true; + } + return false; +}
diff --git a/chrome/browser/ui/page_info/page_info_ui.h b/chrome/browser/ui/page_info/page_info_ui.h index 8e69da1e..4c85e88 100644 --- a/chrome/browser/ui/page_info/page_info_ui.h +++ b/chrome/browser/ui/page_info/page_info_ui.h
@@ -195,6 +195,9 @@ // Returns true if the Certificate Viewer link should be shown. static bool ShouldShowCertificateLink(); + // Return true if the given ContentSettingsType is in PageInfoUI. + static bool ContentSettingsTypeInPageInfo(ContentSettingsType type); + // Sets cookie information. virtual void SetCookieInfo(const CookieInfoList& cookie_info_list) = 0;
diff --git a/chrome/browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc b/chrome/browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc index 79aa8d6..8a6bfcfb 100644 --- a/chrome/browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc +++ b/chrome/browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc
@@ -248,5 +248,6 @@ ASSERT_TRUE(app_browser != browser()); WaitAndValidateBrowserWindowProperties( - base::Bind(&ValidateHostedAppWindowProperties, app_browser, extension)); + base::Bind(&ValidateHostedAppWindowProperties, app_browser, + base::RetainedRef(extension))); }
diff --git a/chrome/browser/ui/webui/OWNERS b/chrome/browser/ui/webui/OWNERS index 731bdc43..909e06d 100644 --- a/chrome/browser/ui/webui/OWNERS +++ b/chrome/browser/ui/webui/OWNERS
@@ -12,7 +12,6 @@ per-file snippets_internals*=file://components/ntp_snippets/OWNERS per-file ntp_tiles_internals_ui.*=file://components/ntp_tiles/OWNERS -per-file popular_sites_internals_ui.*=file://components/ntp_tiles/OWNERS per-file net_export_ui.*=file://net/OWNERS # Maintaining ownership from this file's original Chrome OS location.
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index baced5d..2e1dd19 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -112,7 +112,6 @@ #if defined(OS_ANDROID) #include "chrome/browser/ui/webui/offline/offline_internals_ui.h" -#include "chrome/browser/ui/webui/popular_sites_internals_ui.h" #include "chrome/browser/ui/webui/snippets_internals_ui.h" #include "chrome/browser/ui/webui/webapks_ui.h" #else @@ -495,8 +494,6 @@ #if defined(OS_ANDROID) if (url.host_piece() == chrome::kChromeUIOfflineInternalsHost) return &NewWebUI<OfflineInternalsUI>; - if (url.host_piece() == chrome::kChromeUIPopularSitesInternalsHost) - return &NewWebUI<PopularSitesInternalsUI>; if (url.host_piece() == chrome::kChromeUISnippetsInternalsHost && !profile->IsOffTheRecord()) return &NewWebUI<SnippetsInternalsUI>;
diff --git a/chrome/browser/ui/webui/popular_sites_internals_ui.cc b/chrome/browser/ui/webui/popular_sites_internals_ui.cc deleted file mode 100644 index 88e0779..0000000 --- a/chrome/browser/ui/webui/popular_sites_internals_ui.cc +++ /dev/null
@@ -1,96 +0,0 @@ -// Copyright 2015 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 "chrome/browser/ui/webui/popular_sites_internals_ui.h" - -#include "base/memory/ptr_util.h" -#include "chrome/browser/ntp_tiles/chrome_popular_sites_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/common/url_constants.h" -#include "components/grit/components_resources.h" -#include "components/ntp_tiles/popular_sites.h" -#include "components/ntp_tiles/webui/popular_sites_internals_message_handler.h" -#include "components/ntp_tiles/webui/popular_sites_internals_message_handler_client.h" -#include "content/public/browser/browser_thread.h" -#include "content/public/browser/web_ui.h" -#include "content/public/browser/web_ui_data_source.h" -#include "content/public/browser/web_ui_message_handler.h" - -namespace { - -// The implementation for the chrome://popular-sites-internals page. -class ChromePopularSitesInternalsMessageHandlerBridge - : public content::WebUIMessageHandler, - public ntp_tiles::PopularSitesInternalsMessageHandlerClient { - public: - ChromePopularSitesInternalsMessageHandlerBridge() : handler_(this) {} - - private: - // content::WebUIMessageHandler: - void RegisterMessages() override; - - // ntp_tiles::PopularSitesInternalsMessageHandlerClient - std::unique_ptr<ntp_tiles::PopularSites> MakePopularSites() override; - PrefService* GetPrefs() override; - void RegisterMessageCallback( - const std::string& message, - const base::Callback<void(const base::ListValue*)>& callback) override; - void CallJavascriptFunctionVector( - const std::string& name, - const std::vector<const base::Value*>& values) override; - - ntp_tiles::PopularSitesInternalsMessageHandler handler_; - - DISALLOW_COPY_AND_ASSIGN(ChromePopularSitesInternalsMessageHandlerBridge); -}; - -void ChromePopularSitesInternalsMessageHandlerBridge::RegisterMessages() { - handler_.RegisterMessages(); -} - -std::unique_ptr<ntp_tiles::PopularSites> -ChromePopularSitesInternalsMessageHandlerBridge::MakePopularSites() { - return ChromePopularSitesFactory::NewForProfile(Profile::FromWebUI(web_ui())); -} - -PrefService* ChromePopularSitesInternalsMessageHandlerBridge::GetPrefs() { - return Profile::FromWebUI(web_ui())->GetPrefs(); -} - -void ChromePopularSitesInternalsMessageHandlerBridge::RegisterMessageCallback( - const std::string& message, - const base::Callback<void(const base::ListValue*)>& callback) { - web_ui()->RegisterMessageCallback(message, callback); -} - -void ChromePopularSitesInternalsMessageHandlerBridge:: - CallJavascriptFunctionVector( - const std::string& name, - const std::vector<const base::Value*>& values) { - web_ui()->CallJavascriptFunctionUnsafe(name, values); -} - -} // namespace - -content::WebUIDataSource* CreatePopularSitesInternalsHTMLSource() { - content::WebUIDataSource* source = content::WebUIDataSource::Create( - chrome::kChromeUIPopularSitesInternalsHost); - - source->AddResourcePath("popular_sites_internals.js", - IDR_POPULAR_SITES_INTERNALS_JS); - source->AddResourcePath("popular_sites_internals.css", - IDR_POPULAR_SITES_INTERNALS_CSS); - source->SetDefaultResource(IDR_POPULAR_SITES_INTERNALS_HTML); - return source; -} - -PopularSitesInternalsUI::PopularSitesInternalsUI(content::WebUI* web_ui) - : WebUIController(web_ui) { - content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), - CreatePopularSitesInternalsHTMLSource()); - web_ui->AddMessageHandler( - base::MakeUnique<ChromePopularSitesInternalsMessageHandlerBridge>()); -} - -PopularSitesInternalsUI::~PopularSitesInternalsUI() {}
diff --git a/chrome/browser/ui/webui/popular_sites_internals_ui.h b/chrome/browser/ui/webui/popular_sites_internals_ui.h deleted file mode 100644 index 89955366..0000000 --- a/chrome/browser/ui/webui/popular_sites_internals_ui.h +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2015 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 CHROME_BROWSER_UI_WEBUI_POPULAR_SITES_INTERNALS_UI_H_ -#define CHROME_BROWSER_UI_WEBUI_POPULAR_SITES_INTERNALS_UI_H_ - -#include "base/macros.h" -#include "content/public/browser/web_ui_controller.h" - -// The implementation for the chrome://popular-sites-internals page. -class PopularSitesInternalsUI : public content::WebUIController { - public: - explicit PopularSitesInternalsUI(content::WebUI* web_ui); - ~PopularSitesInternalsUI() override; - - private: - DISALLOW_COPY_AND_ASSIGN(PopularSitesInternalsUI); -}; - -#endif // CHROME_BROWSER_UI_WEBUI_POPULAR_SITES_INTERNALS_UI_H_
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc index 5c9dce3..d43ee64 100644 --- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -1186,6 +1186,9 @@ void AddOnStartupStrings(content::WebUIDataSource* html_source) { LocalizedString localized_strings[] = { {"onStartup", IDS_SETTINGS_ON_STARTUP}, + {"onStartupDescription", IDS_SETTINGS_ON_STARTUP_DESCRIPTION}, + {"onStartupManage", IDS_SETTINGS_ON_STARTUP_MANAGE}, + {"onStartupPages", IDS_SETTINGS_ON_STARTUP_PAGES}, {"onStartupOpenNewTab", IDS_SETTINGS_ON_STARTUP_OPEN_NEW_TAB}, {"onStartupContinue", IDS_SETTINGS_ON_STARTUP_CONTINUE}, {"onStartupOpenSpecific", IDS_SETTINGS_ON_STARTUP_OPEN_SPECIFIC},
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 1b66b34..5c046f4 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -270,6 +270,9 @@ #endif #endif // BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS) +const base::Feature kNetworkPrediction{"NetworkPrediction", + base::FEATURE_ENABLED_BY_DEFAULT}; + // If enabled, the list of content suggestions on the New Tab page will contain // pages that the user downloaded for later use. const base::Feature kOfflinePageDownloadSuggestionsFeature{
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index f96568db..2c1caeea 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -137,6 +137,8 @@ extern const base::Feature kNativeNotifications; #endif +extern const base::Feature kNetworkPrediction; + extern const base::Feature kOfflinePageDownloadSuggestionsFeature; #if !defined(OS_ANDROID)
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc index 5303894..56aad7b3 100644 --- a/chrome/common/url_constants.cc +++ b/chrome/common/url_constants.cc
@@ -294,7 +294,6 @@ const char kChromeUIContextualSearchPromoHost[] = "contextual-search-promo"; const char kChromeUIOfflineInternalsHost[] = "offline-internals"; const char kChromeUIPhysicalWebDiagnosticsHost[] = "physical-web-diagnostics"; -const char kChromeUIPopularSitesInternalsHost[] = "popular-sites-internals"; const char kChromeUISnippetsInternalsHost[] = "snippets-internals"; const char kChromeUIWebApksHost[] = "webapks"; #endif @@ -715,7 +714,6 @@ #if defined(OS_ANDROID) kChromeUINetExportHost, kChromeUIOfflineInternalsHost, - kChromeUIPopularSitesInternalsHost, kChromeUISnippetsInternalsHost, kChromeUIWebApksHost, #endif
diff --git a/chrome/common/url_constants.h b/chrome/common/url_constants.h index 38e1188..9ba18fdc 100644 --- a/chrome/common/url_constants.h +++ b/chrome/common/url_constants.h
@@ -278,7 +278,6 @@ extern const char kChromeUIContextualSearchPromoHost[]; extern const char kChromeUIOfflineInternalsURL[]; extern const char kChromeUIPhysicalWebDiagnosticsHost[]; -extern const char kChromeUIPopularSitesInternalsHost[]; extern const char kChromeUISnippetsInternalsHost[]; extern const char kChromeUIWebApksHost[]; #endif
diff --git a/chrome/gpu/BUILD.gn b/chrome/gpu/BUILD.gn index ee90a75..93bdd8a 100644 --- a/chrome/gpu/BUILD.gn +++ b/chrome/gpu/BUILD.gn
@@ -25,6 +25,8 @@ "chrome_arc_video_decode_accelerator.h", "gpu_arc_video_decode_accelerator.cc", "gpu_arc_video_decode_accelerator.h", + "gpu_arc_video_encode_accelerator.cc", + "gpu_arc_video_encode_accelerator.h", ] } }
diff --git a/chrome/gpu/DEPS b/chrome/gpu/DEPS index c076b70..094dd23 100644 --- a/chrome/gpu/DEPS +++ b/chrome/gpu/DEPS
@@ -7,6 +7,7 @@ "+content/public/gpu", "+media/video", "+media/base/video_frame.h", + "+media/base/video_types.h", "+media/gpu", "+mojo/edk/embedder", "+services/service_manager/public/cpp",
diff --git a/chrome/gpu/chrome_content_gpu_client.cc b/chrome/gpu/chrome_content_gpu_client.cc index 05cfc43f..e5815dd 100644 --- a/chrome/gpu/chrome_content_gpu_client.cc +++ b/chrome/gpu/chrome_content_gpu_client.cc
@@ -21,6 +21,7 @@ #if defined(OS_CHROMEOS) #include "chrome/gpu/gpu_arc_video_decode_accelerator.h" +#include "chrome/gpu/gpu_arc_video_encode_accelerator.h" #include "content/public/common/service_manager_connection.h" #include "services/service_manager/public/cpp/binder_registry.h" #endif @@ -68,6 +69,10 @@ base::Bind(&ChromeContentGpuClient::CreateArcVideoDecodeAccelerator, base::Unretained(this)), base::ThreadTaskRunnerHandle::Get()); + registry->AddInterface( + base::Bind(&ChromeContentGpuClient::CreateArcVideoEncodeAccelerator, + base::Unretained(this)), + base::ThreadTaskRunnerHandle::Get()); #endif } @@ -95,4 +100,12 @@ std::move(request)); } +void ChromeContentGpuClient::CreateArcVideoEncodeAccelerator( + const service_manager::BindSourceInfo& source_info, + ::arc::mojom::VideoEncodeAcceleratorRequest request) { + mojo::MakeStrongBinding( + base::MakeUnique<chromeos::arc::GpuArcVideoEncodeAccelerator>( + gpu_preferences_), + std::move(request)); +} #endif
diff --git a/chrome/gpu/chrome_content_gpu_client.h b/chrome/gpu/chrome_content_gpu_client.h index 768f3a7..f3e9e89d 100644 --- a/chrome/gpu/chrome_content_gpu_client.h +++ b/chrome/gpu/chrome_content_gpu_client.h
@@ -13,7 +13,9 @@ #include "content/public/gpu/content_gpu_client.h" #if defined(OS_CHROMEOS) -#include "chrome/gpu/gpu_arc_video_decode_accelerator.h" +#include "components/arc/common/video_decode_accelerator.mojom.h" +#include "components/arc/common/video_encode_accelerator.mojom.h" +#include "gpu/command_buffer/service/gpu_preferences.h" namespace service_manager { struct BindSourceInfo; @@ -37,6 +39,10 @@ void CreateArcVideoDecodeAccelerator( const service_manager::BindSourceInfo& source_info, ::arc::mojom::VideoDecodeAcceleratorRequest request); + + void CreateArcVideoEncodeAccelerator( + const service_manager::BindSourceInfo& source_info, + ::arc::mojom::VideoEncodeAcceleratorRequest request); #endif std::unique_ptr<variations::ChildProcessFieldTrialSyncer> field_trial_syncer_;
diff --git a/chrome/gpu/gpu_arc_video_encode_accelerator.cc b/chrome/gpu/gpu_arc_video_encode_accelerator.cc new file mode 100644 index 0000000..192f5942a --- /dev/null +++ b/chrome/gpu/gpu_arc_video_encode_accelerator.cc
@@ -0,0 +1,218 @@ +// Copyright 2017 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 "chrome/gpu/gpu_arc_video_encode_accelerator.h" + +#include <utility> + +#include "base/logging.h" +#include "base/sys_info.h" +#include "media/base/video_types.h" +#include "media/gpu/gpu_video_encode_accelerator_factory.h" +#include "mojo/public/cpp/bindings/strong_binding.h" +#include "mojo/public/cpp/bindings/type_converter.h" +#include "mojo/public/cpp/system/platform_handle.h" + +#define DVLOGF(x) DVLOG(x) << __func__ << "(): " + +namespace chromeos { +namespace arc { + +GpuArcVideoEncodeAccelerator::GpuArcVideoEncodeAccelerator( + const gpu::GpuPreferences& gpu_preferences) + : gpu_preferences_(gpu_preferences) {} + +GpuArcVideoEncodeAccelerator::~GpuArcVideoEncodeAccelerator() = default; + +// VideoEncodeAccelerator::Client implementation. +void GpuArcVideoEncodeAccelerator::RequireBitstreamBuffers( + unsigned int input_count, + const gfx::Size& coded_size, + size_t output_buffer_size) { + DVLOGF(2) << "input_count=" << input_count + << ", coded_size=" << coded_size.ToString() + << ", output_buffer_size=" << output_buffer_size; + DCHECK(client_); + coded_size_ = coded_size; + client_->RequireBitstreamBuffers(input_count, coded_size, output_buffer_size); +} + +void GpuArcVideoEncodeAccelerator::BitstreamBufferReady( + int32_t bitstream_buffer_id, + size_t payload_size, + bool key_frame, + base::TimeDelta timestamp) { + DVLOGF(2) << "id=" << bitstream_buffer_id; + DCHECK(client_); + client_->BitstreamBufferReady(bitstream_buffer_id, payload_size, key_frame, + timestamp.InMicroseconds()); +} + +void GpuArcVideoEncodeAccelerator::NotifyError(Error error) { + DVLOGF(2) << "error=" << error; + DCHECK(client_); + client_->NotifyError(error); +} + +// ::arc::mojom::VideoEncodeAccelerator implementation. +void GpuArcVideoEncodeAccelerator::GetSupportedProfiles( + const GetSupportedProfilesCallback& callback) { + callback.Run(media::GpuVideoEncodeAcceleratorFactory::GetSupportedProfiles( + gpu_preferences_)); +} + +void GpuArcVideoEncodeAccelerator::Initialize( + VideoPixelFormat input_format, + const gfx::Size& visible_size, + VideoEncodeAccelerator::StorageType input_storage, + VideoCodecProfile output_profile, + uint32_t initial_bitrate, + VideoEncodeClientPtr client, + const InitializeCallback& callback) { + DVLOGF(2) << "visible_size=" << visible_size.ToString() + << ", profile=" << output_profile; + + input_pixel_format_ = input_format; + visible_size_ = visible_size; + accelerator_ = media::GpuVideoEncodeAcceleratorFactory::CreateVEA( + input_pixel_format_, visible_size_, output_profile, initial_bitrate, this, + gpu_preferences_); + if (accelerator_ == nullptr) { + DLOG(ERROR) << "Failed to create a VideoEncodeAccelerator."; + callback.Run(false); + return; + } + client_ = std::move(client); + callback.Run(true); +} + +static void DropSharedMemory(std::unique_ptr<base::SharedMemory> shm) { + // Just let |shm| fall out of scope. +} + +void GpuArcVideoEncodeAccelerator::Encode( + mojo::ScopedHandle handle, + std::vector<::arc::VideoFramePlane> planes, + int64_t timestamp, + bool force_keyframe) { + DVLOGF(2) << "timestamp=" << timestamp; + if (!accelerator_) { + DLOG(ERROR) << "Accelerator is not initialized."; + return; + } + + if (planes.empty()) { // EOS + accelerator_->Encode(media::VideoFrame::CreateEOSFrame(), force_keyframe); + return; + } + + base::ScopedFD fd = UnwrapFdFromMojoHandle(std::move(handle)); + if (!fd.is_valid()) + return; + + size_t allocation_size = + media::VideoFrame::AllocationSize(input_pixel_format_, coded_size_); + + // TODO(rockot): Pass GUIDs through Mojo. https://crbug.com/713763. + // TODO(rockot): This fd comes from a mojo::ScopedHandle in + // GpuArcVideoService::BindSharedMemory. That should be passed through, + // rather than pulling out the fd. https://crbug.com/713763. + // TODO(rockot): Pass through a real size rather than |0|. + base::UnguessableToken guid = base::UnguessableToken::Create(); + base::SharedMemoryHandle shm_handle(base::FileDescriptor(fd.release(), true), + 0u, guid); + auto shm = base::MakeUnique<base::SharedMemory>(shm_handle, true); + + base::CheckedNumeric<off_t> map_offset = planes[0].offset; + base::CheckedNumeric<size_t> map_size = allocation_size; + const uint32_t aligned_offset = + planes[0].offset % base::SysInfo::VMAllocationGranularity(); + map_offset -= aligned_offset; + map_size += aligned_offset; + + if (!map_offset.IsValid() || !map_size.IsValid()) { + DLOG(ERROR) << "Invalid map_offset or map_size"; + client_->NotifyError(Error::kInvalidArgumentError); + return; + } + if (!shm->MapAt(map_offset.ValueOrDie(), map_size.ValueOrDie())) { + DLOG(ERROR) << "Failed to map memory."; + client_->NotifyError(Error::kPlatformFailureError); + return; + } + + uint8_t* shm_memory = reinterpret_cast<uint8_t*>(shm->memory()); + auto frame = media::VideoFrame::WrapExternalSharedMemory( + input_pixel_format_, coded_size_, gfx::Rect(visible_size_), visible_size_, + shm_memory + aligned_offset, allocation_size, shm_handle, + planes[0].offset, base::TimeDelta::FromMicroseconds(timestamp)); + + // Wrap |shm| in a callback and add it as a destruction observer, so it + // stays alive and mapped until |frame| goes out of scope. + frame->AddDestructionObserver( + base::Bind(&DropSharedMemory, base::Passed(&shm))); + accelerator_->Encode(frame, force_keyframe); +} + +void GpuArcVideoEncodeAccelerator::UseOutputBitstreamBuffer( + int32_t bitstream_buffer_id, + mojo::ScopedHandle shmem_fd, + uint32_t offset, + uint32_t size) { + DVLOGF(2) << "id=" << bitstream_buffer_id; + if (!accelerator_) { + DLOG(ERROR) << "Accelerator is not initialized."; + return; + } + + base::ScopedFD fd = UnwrapFdFromMojoHandle(std::move(shmem_fd)); + if (!fd.is_valid()) + return; + + // TODO(rockot): Pass GUIDs through Mojo. https://crbug.com/713763. + // TODO(rockot): This fd comes from a mojo::ScopedHandle in + // GpuArcVideoService::BindSharedMemory. That should be passed through, + // rather than pulling out the fd. https://crbug.com/713763. + // TODO(rockot): Pass through a real size rather than |0|. + base::UnguessableToken guid = base::UnguessableToken::Create(); + base::SharedMemoryHandle shm_handle(base::FileDescriptor(fd.release(), true), + 0u, guid); + accelerator_->UseOutputBitstreamBuffer( + media::BitstreamBuffer(bitstream_buffer_id, shm_handle, size, offset)); +} + +void GpuArcVideoEncodeAccelerator::RequestEncodingParametersChange( + uint32_t bitrate, + uint32_t framerate) { + DVLOGF(2) << "bitrate=" << bitrate << ", framerate=" << framerate; + if (!accelerator_) { + DLOG(ERROR) << "Accelerator is not initialized."; + return; + } + accelerator_->RequestEncodingParametersChange(bitrate, framerate); +} + +base::ScopedFD GpuArcVideoEncodeAccelerator::UnwrapFdFromMojoHandle( + mojo::ScopedHandle handle) { + DCHECK(client_); + if (!handle.is_valid()) { + DLOG(ERROR) << "handle is invalid."; + client_->NotifyError(Error::kInvalidArgumentError); + return base::ScopedFD(); + } + + base::PlatformFile platform_file; + MojoResult mojo_result = + mojo::UnwrapPlatformFile(std::move(handle), &platform_file); + if (mojo_result != MOJO_RESULT_OK) { + DLOG(ERROR) << "UnwrapPlatformFile failed: " << mojo_result; + client_->NotifyError(Error::kPlatformFailureError); + return base::ScopedFD(); + } + + return base::ScopedFD(platform_file); +} + +} // namespace arc +} // namespace chromeos
diff --git a/chrome/gpu/gpu_arc_video_encode_accelerator.h b/chrome/gpu/gpu_arc_video_encode_accelerator.h new file mode 100644 index 0000000..f388d94 --- /dev/null +++ b/chrome/gpu/gpu_arc_video_encode_accelerator.h
@@ -0,0 +1,86 @@ +// Copyright 2017 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 CHROME_GPU_GPU_ARC_VIDEO_ENCODE_ACCELERATOR_H_ +#define CHROME_GPU_GPU_ARC_VIDEO_ENCODE_ACCELERATOR_H_ + +#include <memory> +#include <vector> + +#include "base/files/scoped_file.h" +#include "base/macros.h" +#include "components/arc/common/video_encode_accelerator.mojom.h" +#include "components/arc/video_accelerator/video_accelerator.h" +#include "gpu/command_buffer/service/gpu_preferences.h" +#include "media/video/video_encode_accelerator.h" + +namespace chromeos { +namespace arc { + +// GpuArcVideoEncodeAccelerator manages life-cycle and IPC message translation +// for media::VideoEncodeAccelerator. +class GpuArcVideoEncodeAccelerator + : public ::arc::mojom::VideoEncodeAccelerator, + public media::VideoEncodeAccelerator::Client { + public: + explicit GpuArcVideoEncodeAccelerator( + const gpu::GpuPreferences& gpu_preferences); + ~GpuArcVideoEncodeAccelerator() override; + + private: + using VideoPixelFormat = media::VideoPixelFormat; + using VideoCodecProfile = media::VideoCodecProfile; + using Error = media::VideoEncodeAccelerator::Error; + using VideoEncodeClientPtr = ::arc::mojom::VideoEncodeClientPtr; + + // VideoEncodeAccelerator::Client implementation. + void RequireBitstreamBuffers(unsigned int input_count, + const gfx::Size& input_coded_size, + size_t output_buffer_size) override; + void BitstreamBufferReady(int32_t bitstream_buffer_id, + size_t payload_size, + bool key_frame, + base::TimeDelta timestamp) override; + void NotifyError(Error error) override; + + // ::arc::mojom::VideoEncodeAccelerator implementation. + void GetSupportedProfiles( + const GetSupportedProfilesCallback& callback) override; + void Initialize(VideoPixelFormat input_format, + const gfx::Size& visible_size, + VideoEncodeAccelerator::StorageType input_storage, + VideoCodecProfile output_profile, + uint32_t initial_bitrate, + VideoEncodeClientPtr client, + const InitializeCallback& callback) override; + void Encode(mojo::ScopedHandle fd, + std::vector<::arc::VideoFramePlane> planes, + int64_t timestamp, + bool force_keyframe) override; + void UseOutputBitstreamBuffer(int32_t bitstream_buffer_id, + mojo::ScopedHandle shmem_fd, + uint32_t offset, + uint32_t size) override; + void RequestEncodingParametersChange(uint32_t bitrate, + uint32_t framerate) override; + + // Unwraps a file descriptor from the given mojo::ScopedHandle. + // If an error is encountered, it returns an invalid base::ScopedFD and + // notifies client about the error via VideoEncodeClient::NotifyError. + base::ScopedFD UnwrapFdFromMojoHandle(mojo::ScopedHandle handle); + + gpu::GpuPreferences gpu_preferences_; + std::unique_ptr<media::VideoEncodeAccelerator> accelerator_; + ::arc::mojom::VideoEncodeClientPtr client_; + gfx::Size coded_size_; + gfx::Size visible_size_; + VideoPixelFormat input_pixel_format_; + + DISALLOW_COPY_AND_ASSIGN(GpuArcVideoEncodeAccelerator); +}; + +} // namespace arc +} // namespace chromeos + +#endif // CHROME_GPU_GPU_ARC_VIDEO_ENCODE_ACCELERATOR_H_
diff --git a/chrome/installer/linux/BUILD.gn b/chrome/installer/linux/BUILD.gn index 292e1e4d..315f8b6 100644 --- a/chrome/installer/linux/BUILD.gn +++ b/chrome/installer/linux/BUILD.gn
@@ -190,6 +190,14 @@ if (!is_chromeos) { public_deps += [ ":rpm_packaging_files" ] } + + # TODO(thomasanderson): Move this variable into a .gni file + # somewhere. It is currently copied from + # buildtools/third_party/libc++/BUILD.gn. + libcpp_is_static = !is_component_build && !using_sanitizer + if (!libcpp_is_static && use_custom_libcxx) { + public_deps += [ "//buildtools/third_party/libc++:libc++" ] + } } # Creates .deb and .rpm (RPM for non-ChromeOS only) installer packages.
diff --git a/chrome/renderer/resources/extensions/browser_action_custom_bindings.js b/chrome/renderer/resources/extensions/browser_action_custom_bindings.js index 4b6ce09a..e844f734 100644 --- a/chrome/renderer/resources/extensions/browser_action_custom_bindings.js +++ b/chrome/renderer/resources/extensions/browser_action_custom_bindings.js
@@ -11,7 +11,12 @@ var sendRequest = bindingUtil ? $Function.bind(bindingUtil.sendRequest, bindingUtil) : require('sendRequest').sendRequest; -var lastError = require('lastError'); + +var jsLastError = bindingUtil ? undefined : require('lastError'); +function hasLastError() { + return bindingUtil ? + bindingUtil.hasLastError() : jsLastError.hasError(chrome); +} binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; @@ -30,7 +35,7 @@ if (!callback) return; - if (lastError.hasError(chrome)) { + if (hasLastError()) { callback(); } else { var views = getExtensionViews(-1, -1, 'POPUP');
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 22226b8..3a190b1a 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -3151,6 +3151,7 @@ "../browser/metrics/chrome_browser_main_extra_parts_metrics_unittest.cc", "../browser/metrics/chrome_metrics_service_accessor_unittest.cc", "../browser/metrics/perf/perf_provider_chromeos_unittest.cc", + "../browser/metrics/process_memory_metrics_emitter_unittest.cc", "../browser/metrics/subprocess_metrics_provider_unittest.cc", "../browser/metrics/thread_watcher_android_unittest.cc", "../browser/metrics/thread_watcher_unittest.cc", @@ -3775,6 +3776,7 @@ "../browser/media/router/discovery/dial/dial_media_sink_service_proxy_unittest.cc", "../browser/media/router/discovery/dial/dial_registry_unittest.cc", "../browser/media/router/discovery/dial/dial_service_unittest.cc", + "../browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc", "../browser/media/router/discovery/mdns/dns_sd_registry_unittest.cc", "../browser/media/router/discovery/media_sink_service_base_unittest.cc", "../browser/media/router/event_page_request_manager_unittest.cc",
diff --git a/chrome/test/base/in_process_browser_test.cc b/chrome/test/base/in_process_browser_test.cc index 27328e5..7f4fc2a 100644 --- a/chrome/test/base/in_process_browser_test.cc +++ b/chrome/test/base/in_process_browser_test.cc
@@ -41,6 +41,7 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/chrome_constants.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/features.h" @@ -192,11 +193,6 @@ // Browser tests will create their own g_browser_process later. DCHECK(!g_browser_process); - // Clear the FeatureList instance from base/test/test_suite.cc. Since this is - // a browser test, a FeatureList will be registered as part of normal browser - // start up in ChromeBrowserMainParts::SetupMetricsAndFieldTrials(). - base::FeatureList::ClearInstanceForTesting(); - base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); // Auto-reload breaks many browser tests, which assume error pages won't be @@ -205,6 +201,10 @@ // here. command_line->AppendSwitch(switches::kDisableOfflineAutoReload); + // Turn off preconnects because they break the brittle python webserver; + // see http://crbug.com/60035. + scoped_feature_list_.InitAndDisableFeature(features::kNetworkPrediction); + // Allow subclasses to change the command line before running any tests. SetUpCommandLine(command_line); // Add command line arguments that are used by all InProcessBrowserTests.
diff --git a/chrome/test/base/in_process_browser_test.h b/chrome/test/base/in_process_browser_test.h index 69cf984..5a59a27 100644 --- a/chrome/test/base/in_process_browser_test.h +++ b/chrome/test/base/in_process_browser_test.h
@@ -10,6 +10,7 @@ #include "base/compiler_specific.h" #include "base/files/scoped_temp_dir.h" #include "base/memory/ref_counted.h" +#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test.h" @@ -266,6 +267,8 @@ // We use hardcoded quota settings to have a consistent testing environment. storage::QuotaSettings quota_settings_; + base::test::ScopedFeatureList scoped_feature_list_; + #if defined(OS_MACOSX) base::mac::ScopedNSAutoreleasePool* autorelease_pool_; std::unique_ptr<ScopedBundleSwizzlerMac> bundle_swizzler_;
diff --git a/chrome/test/base/test_launcher_utils.cc b/chrome/test/base/test_launcher_utils.cc index 7dd5f92..ea6d614 100644 --- a/chrome/test/base/test_launcher_utils.cc +++ b/chrome/test/base/test_launcher_utils.cc
@@ -26,11 +26,6 @@ namespace test_launcher_utils { void PrepareBrowserCommandLineForTests(base::CommandLine* command_line) { - // Turn off preconnects because they break the brittle python webserver; - // see http://crbug.com/60035. - command_line->AppendSwitchASCII(switches::kDisableFeatures, - "NetworkPrediction"); - // Don't show the first run ui. command_line->AppendSwitch(switches::kNoFirstRun);
diff --git a/chrome/test/base/tracing_browsertest.cc b/chrome/test/base/tracing_browsertest.cc index eae1cd38..5347d14 100644 --- a/chrome/test/base/tracing_browsertest.cc +++ b/chrome/test/base/tracing_browsertest.cc
@@ -101,7 +101,13 @@ } }; -IN_PROC_BROWSER_TEST_F(TracingBrowserTest, TestMemoryInfra) { +// crbug.com/708487. +#if defined(OS_MACOSX) && defined(ADDRESS_SANITIZER) +#define MAYBE_TestMemoryInfra DISABLED_TestMemoryInfra +#else +#define MAYBE_TestMemoryInfra TestMemoryInfra +#endif // defined(OS_MACOSX) && defined(ADDRESS_SANITIZER) +IN_PROC_BROWSER_TEST_F(TracingBrowserTest, MAYBE_TestMemoryInfra) { PerformDumpMemoryTestActions( base::trace_event::TraceConfig( base::trace_event::TraceConfigMemoryTestUtil::
diff --git a/chrome/test/data/subresource_filter/worker_fetch.html b/chrome/test/data/subresource_filter/worker_fetch.html new file mode 100644 index 0000000..4560a02 --- /dev/null +++ b/chrome/test/data/subresource_filter/worker_fetch.html
@@ -0,0 +1,4 @@ +<script> +var worker = new Worker('./worker_fetch.js'); +worker.onmessage = event => { document.title = event.data; }; +</script>
diff --git a/chrome/test/data/subresource_filter/worker_fetch.js b/chrome/test/data/subresource_filter/worker_fetch.js new file mode 100644 index 0000000..31c6d39 --- /dev/null +++ b/chrome/test/data/subresource_filter/worker_fetch.js
@@ -0,0 +1,7 @@ +// Copyright 2017 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. + +fetch('./worker_fetch_data.txt') + .then(_ => postMessage('FetchSucceeded'), + _ => postMessage('FetchFailed'));
diff --git a/chrome/test/data/subresource_filter/worker_fetch_data.txt b/chrome/test/data/subresource_filter/worker_fetch_data.txt new file mode 100644 index 0000000..d424ff1 --- /dev/null +++ b/chrome/test/data/subresource_filter/worker_fetch_data.txt
@@ -0,0 +1 @@ +dummy data
diff --git a/chrome/test/data/webui/settings/android_apps_page_test.js b/chrome/test/data/webui/settings/android_apps_page_test.js index 53ef87f..84dab47 100644 --- a/chrome/test/data/webui/settings/android_apps_page_test.js +++ b/chrome/test/data/webui/settings/android_apps_page_test.js
@@ -98,7 +98,7 @@ assertTrue(!subpage.$$('settings-android-settings-element')); }); - test('ManageAppsOpenReqest', function() { + test('ManageAppsOpenRequest', function() { setAndroidAppsState(true, true); var button = subpage.$$('settings-android-settings-element'). $$('#manageApps'); @@ -178,7 +178,7 @@ $$("#manageApps")); }); - test('ManageAppsOpenReqest', function() { + test('ManageAppsOpenRequest', function() { var button = androidAppsPage.$$('settings-android-settings-element'). $$('#manageApps'); assertTrue(!!button);
diff --git a/chrome/test/data/webui/settings/on_startup_browsertest.js b/chrome/test/data/webui/settings/on_startup_browsertest.js index f026de8a0..b9cb0c4 100644 --- a/chrome/test/data/webui/settings/on_startup_browsertest.js +++ b/chrome/test/data/webui/settings/on_startup_browsertest.js
@@ -7,16 +7,6 @@ GEN_INCLUDE(['settings_page_browsertest.js']); /** - * Radio button enum values for restore on startup. - * @enum - */ -var RestoreOnStartupEnum = { - CONTINUE: 1, - OPEN_NEW_TAB: 5, - OPEN_SPECIFIC: 4, -}; - -/** * Test Polymer On Startup Settings elements. * @constructor * @extends {SettingsPageBrowserTest} @@ -39,45 +29,19 @@ }; TEST_F('OnStartupSettingsBrowserTest', 'uiTests', function() { - /** - * The prefs API that will get a fake implementation. - * @type {!SettingsPrivate} - */ - var settingsPrefs; var self = this; - var restoreOnStartup = function() { - return self.getPageElement('#onStartupRadioGroup').querySelector( - '.iron-selected').label; - }; - suite('OnStartupHandler', function() { suiteSetup(function() { self.basicPage.set('pageVisibility.onStartup', true); - Polymer.dom.flush(); - - settingsPrefs = document.querySelector('settings-ui').$$( - 'settings-prefs'); - assertTrue(!!settingsPrefs); - return CrSettingsPrefs.initialized; }); - test('open-continue', function() { - settingsPrefs.set('prefs.session.restore_on_startup.value', - RestoreOnStartupEnum.CONTINUE); - assertEquals('Continue where you left off', restoreOnStartup()); - }); - - test('open-ntp', function() { - settingsPrefs.set('prefs.session.restore_on_startup.value', - RestoreOnStartupEnum.OPEN_NEW_TAB); - assertEquals('Open the New Tab page', restoreOnStartup()); - }); - - test('open-specific', function() { - settingsPrefs.set('prefs.session.restore_on_startup.value', - RestoreOnStartupEnum.OPEN_SPECIFIC); - assertEquals('Open a specific page or set of pages', restoreOnStartup()); + test('ManageStartupUrls', function() { + /* Test that the manage startup urls button is present on the basic page. + */ + var manageButton = + self.getPageElement('#manage-startup-urls-subpage-trigger'); + assertTrue(!!manageButton); }); }); mocha.run();
diff --git a/chrome/test/data/webui/settings/search_engines_page_test.js b/chrome/test/data/webui/settings/search_engines_page_test.js index 5eb5020..ef05e5c1 100644 --- a/chrome/test/data/webui/settings/search_engines_page_test.js +++ b/chrome/test/data/webui/settings/search_engines_page_test.js
@@ -104,7 +104,7 @@ browserProxy.resetResolver('validateSearchEngineInput'); inputElement.fire('input'); return inputElement.value != '' ? - // Expeting validation only on non-empty values. + // Expecting validation only on non-empty values. browserProxy.whenCalled('validateSearchEngineInput') : Promise.resolve(); };
diff --git a/chrome/test/data/webui/settings/startup_urls_page_test.js b/chrome/test/data/webui/settings/startup_urls_page_test.js index fa2aec6..df53358 100644 --- a/chrome/test/data/webui/settings/startup_urls_page_test.js +++ b/chrome/test/data/webui/settings/startup_urls_page_test.js
@@ -148,7 +148,7 @@ }); /** - * Tests that the appropritae browser proxy method is called when the action + * Tests that the appropriate browser proxy method is called when the action * button is tapped. * @param {string} proxyMethodName */ @@ -202,6 +202,16 @@ }); suite('StartupUrlsPage', function() { + /** + * Radio button enum values for restore on startup. + * @enum + */ + var RestoreOnStartupEnum = { + CONTINUE: 1, + OPEN_NEW_TAB: 5, + OPEN_SPECIFIC: 4, + }; + /** @type {?SettingsStartupUrlsPageElement} */ var page = null; @@ -231,7 +241,39 @@ return browserProxy.whenCalled('loadStartupPages'); }); + function restoreOnStartupLabel() { + return page.$$('#onStartupRadioGroup') + .querySelector('.iron-selected') + .label; + } + + test('open-continue', function() { + page.set( + 'prefs.session.restore_on_startup.value', + RestoreOnStartupEnum.CONTINUE); + assertEquals('Continue where you left off', restoreOnStartupLabel()); + }); + + test('open-ntp', function() { + page.set( + 'prefs.session.restore_on_startup.value', + RestoreOnStartupEnum.OPEN_NEW_TAB); + assertEquals('Open the New Tab page', restoreOnStartupLabel()); + }); + + test('open-specific', function() { + page.set( + 'prefs.session.restore_on_startup.value', + RestoreOnStartupEnum.OPEN_SPECIFIC); + assertEquals( + 'Open a specific page or set of pages', restoreOnStartupLabel()); + }); + test('UseCurrentPages', function() { + page.set( + 'prefs.session.restore_on_startup.value', + RestoreOnStartupEnum.OPEN_SPECIFIC); + Polymer.dom.flush(); var useCurrentPagesButton = page.$$('#useCurrentPages > a'); assertTrue(!!useCurrentPagesButton); MockInteractions.tap(useCurrentPagesButton); @@ -239,6 +281,10 @@ }); test('AddPage_OpensDialog', function() { + page.set( + 'prefs.session.restore_on_startup.value', + RestoreOnStartupEnum.OPEN_SPECIFIC); + Polymer.dom.flush(); var addPageButton = page.$$('#addPage > a'); assertTrue(!!addPageButton); assertFalse(!!page.$$('settings-startup-url-dialog')); @@ -284,7 +330,11 @@ assertFalse(!!page.$$('settings-startup-url-dialog')); }); - test('StarupPages_WhenExtensionControlled', function() { + test('StartupPages_WhenExtensionControlled', function() { + page.set( + 'prefs.session.restore_on_startup.value', + RestoreOnStartupEnum.OPEN_SPECIFIC); + Polymer.dom.flush(); assertFalse(!!page.get('prefs.session.startup_urls.controlledBy')); assertFalse(!!page.$$('extension-controlled-indicator')); assertTrue(!!page.$$('#addPage'));
diff --git a/components/arc/arc_session_runner.cc b/components/arc/arc_session_runner.cc index c9af993..e08cfa6 100644 --- a/components/arc/arc_session_runner.cc +++ b/components/arc/arc_session_runner.cc
@@ -228,12 +228,10 @@ // safe place to start the container for login screen. DCHECK(!arc_session_); DCHECK_EQ(state_, State::STOPPED); - - // TODO(yusukes): Once Chrome OS side is ready, uncomment the following: - // arc_session_ = factory_.Run(); - // arc_session_->AddObserver(this); - // state_ = State::STARTING_FOR_LOGIN_SCREEN; - // arc_session_->StartForLoginScreen(); + arc_session_ = factory_.Run(); + arc_session_->AddObserver(this); + state_ = State::STARTING_FOR_LOGIN_SCREEN; + arc_session_->StartForLoginScreen(); } } // namespace arc
diff --git a/components/arc/arc_session_runner_unittest.cc b/components/arc/arc_session_runner_unittest.cc index 144d0b0b..f8f9cc4 100644 --- a/components/arc/arc_session_runner_unittest.cc +++ b/components/arc/arc_session_runner_unittest.cc
@@ -189,7 +189,7 @@ // Does the same with the mini instance for login screen. // TODO(yusukes): Enable the test once EmitLoginPromptVisibleCalled() is fully // enabled. -TEST_F(ArcSessionRunnerTest, DISABLED_BootFailureForLoginScreen) { +TEST_F(ArcSessionRunnerTest, BootFailureForLoginScreen) { ResetArcSessionFactory( base::Bind(&ArcSessionRunnerTest::CreateBootFailureArcSession, ArcStopReason::CRASH)); @@ -214,7 +214,7 @@ // is called. // TODO(yusukes): Enable the test once EmitLoginPromptVisibleCalled() is fully // enabled. -TEST_F(ArcSessionRunnerTest, DISABLED_StartWithLoginScreenInstance) { +TEST_F(ArcSessionRunnerTest, StartWithLoginScreenInstance) { EXPECT_TRUE(arc_session_runner()->IsStopped()); chromeos::DBusThreadManager::Get()
diff --git a/components/arc/common/typemaps.gni b/components/arc/common/typemaps.gni index f43f9fa..32ca073c 100644 --- a/components/arc/common/typemaps.gni +++ b/components/arc/common/typemaps.gni
@@ -10,5 +10,6 @@ "//components/arc/common/ime.typemap", "//components/arc/common/intent_helper.typemap", "//components/arc/common/video_common.typemap", + "//components/arc/common/video_encode_accelerator.typemap", "//components/arc/common/volume_mounter.typemap", ]
diff --git a/components/arc/common/video_encode_accelerator.typemap b/components/arc/common/video_encode_accelerator.typemap new file mode 100644 index 0000000..61b8db22 --- /dev/null +++ b/components/arc/common/video_encode_accelerator.typemap
@@ -0,0 +1,19 @@ +# Copyright 2017 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. + +mojom = "//components/arc/common/video_encode_accelerator.mojom" +public_headers = [ "//media/video/video_encode_accelerator.h" ] +public_deps = [ + "//media", +] +traits_headers = [ "//components/arc/video_accelerator/video_encode_accelerator_struct_traits.h" ] +sources = [ + "//components/arc/video_accelerator/video_encode_accelerator_struct_traits.cc", +] +type_mappings = [ + "arc.mojom.VideoEncodeAccelerator.Error=media::VideoEncodeAccelerator::Error", + "arc.mojom.VideoPixelFormat=media::VideoPixelFormat", + "arc.mojom.VideoCodecProfile=media::VideoCodecProfile", + "arc.mojom.VideoEncodeProfile=media::VideoEncodeAccelerator::SupportedProfile", +]
diff --git a/components/arc/video_accelerator/DEPS b/components/arc/video_accelerator/DEPS new file mode 100644 index 0000000..04dd5ab --- /dev/null +++ b/components/arc/video_accelerator/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+media/video/video_encode_accelerator.h", +]
diff --git a/components/arc/video_accelerator/video_encode_accelerator_struct_traits.cc b/components/arc/video_accelerator/video_encode_accelerator_struct_traits.cc new file mode 100644 index 0000000..32a5737 --- /dev/null +++ b/components/arc/video_accelerator/video_encode_accelerator_struct_traits.cc
@@ -0,0 +1,163 @@ +// Copyright 2017 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 "components/arc/video_accelerator/video_encode_accelerator_struct_traits.h" + +namespace mojo { + +// Make sure values in arc::mojom::VideoEncodeAccelerator::Error and +// media::VideoEncodeAccelerator::Error match. +#define CHECK_ERROR_ENUM(value) \ + static_assert( \ + static_cast<int>(arc::mojom::VideoEncodeAccelerator::Error::value) == \ + media::VideoEncodeAccelerator::Error::value, \ + "enum ##value mismatch") + +CHECK_ERROR_ENUM(kIllegalStateError); +CHECK_ERROR_ENUM(kInvalidArgumentError); +CHECK_ERROR_ENUM(kPlatformFailureError); +CHECK_ERROR_ENUM(kErrorMax); + +#undef CHECK_ERROR_ENUM + +// static +arc::mojom::VideoEncodeAccelerator::Error +EnumTraits<arc::mojom::VideoEncodeAccelerator::Error, + media::VideoEncodeAccelerator::Error>:: + ToMojom(media::VideoEncodeAccelerator::Error input) { + return static_cast<arc::mojom::VideoEncodeAccelerator::Error>(input); +} + +// static +bool EnumTraits<arc::mojom::VideoEncodeAccelerator::Error, + media::VideoEncodeAccelerator::Error>:: + FromMojom(arc::mojom::VideoEncodeAccelerator::Error input, + media::VideoEncodeAccelerator::Error* output) { + NOTIMPLEMENTED(); + return false; +} + +// Make sure values in arc::mojom::VideoPixelFormat match to the values in +// media::VideoPixelFormat. The former is a subset of the later. +#define CHECK_PIXEL_FORMAT_ENUM(value) \ + static_assert( \ + static_cast<int>(arc::mojom::VideoPixelFormat::value) == media::value, \ + "enum ##value mismatch") + +CHECK_PIXEL_FORMAT_ENUM(PIXEL_FORMAT_I420); + +#undef CHECK_PXIEL_FORMAT_ENUM + +// static +arc::mojom::VideoPixelFormat +EnumTraits<arc::mojom::VideoPixelFormat, media::VideoPixelFormat>::ToMojom( + media::VideoPixelFormat input) { + NOTIMPLEMENTED(); + return arc::mojom::VideoPixelFormat::PIXEL_FORMAT_I420; +} + +// static +bool EnumTraits<arc::mojom::VideoPixelFormat, media::VideoPixelFormat>:: + FromMojom(arc::mojom::VideoPixelFormat input, + media::VideoPixelFormat* output) { + switch (input) { + case arc::mojom::VideoPixelFormat::PIXEL_FORMAT_I420: + *output = static_cast<media::VideoPixelFormat>(input); + return true; + default: + DLOG(ERROR) << "Unknown VideoPixelFormat: " << input; + return false; + } +} + +// Make sure values in arc::mojom::VideoCodecProfile match to the values in +// media::VideoCodecProfile. +#define CHECK_PROFILE_ENUM(value) \ + static_assert( \ + static_cast<int>(arc::mojom::VideoCodecProfile::value) == media::value, \ + "enum ##value mismatch") + +CHECK_PROFILE_ENUM(VIDEO_CODEC_PROFILE_UNKNOWN); +CHECK_PROFILE_ENUM(VIDEO_CODEC_PROFILE_MIN); +CHECK_PROFILE_ENUM(H264PROFILE_MIN); +CHECK_PROFILE_ENUM(H264PROFILE_BASELINE); +CHECK_PROFILE_ENUM(H264PROFILE_MAIN); +CHECK_PROFILE_ENUM(H264PROFILE_EXTENDED); +CHECK_PROFILE_ENUM(H264PROFILE_HIGH); +CHECK_PROFILE_ENUM(H264PROFILE_HIGH10PROFILE); +CHECK_PROFILE_ENUM(H264PROFILE_HIGH422PROFILE); +CHECK_PROFILE_ENUM(H264PROFILE_HIGH444PREDICTIVEPROFILE); +CHECK_PROFILE_ENUM(H264PROFILE_SCALABLEBASELINE); +CHECK_PROFILE_ENUM(H264PROFILE_SCALABLEHIGH); +CHECK_PROFILE_ENUM(H264PROFILE_STEREOHIGH); +CHECK_PROFILE_ENUM(H264PROFILE_MULTIVIEWHIGH); +CHECK_PROFILE_ENUM(H264PROFILE_MAX); +CHECK_PROFILE_ENUM(VP8PROFILE_MIN); +CHECK_PROFILE_ENUM(VP8PROFILE_ANY); +CHECK_PROFILE_ENUM(VP8PROFILE_MAX); +CHECK_PROFILE_ENUM(VP9PROFILE_MIN); +CHECK_PROFILE_ENUM(VP9PROFILE_PROFILE0); +CHECK_PROFILE_ENUM(VP9PROFILE_PROFILE1); +CHECK_PROFILE_ENUM(VP9PROFILE_PROFILE2); +CHECK_PROFILE_ENUM(VP9PROFILE_PROFILE3); +CHECK_PROFILE_ENUM(VP9PROFILE_MAX); +CHECK_PROFILE_ENUM(HEVCPROFILE_MIN); +CHECK_PROFILE_ENUM(HEVCPROFILE_MAIN); +CHECK_PROFILE_ENUM(HEVCPROFILE_MAIN10); +CHECK_PROFILE_ENUM(HEVCPROFILE_MAIN_STILL_PICTURE); +CHECK_PROFILE_ENUM(HEVCPROFILE_MAX); +CHECK_PROFILE_ENUM(DOLBYVISION_MIN); +CHECK_PROFILE_ENUM(DOLBYVISION_PROFILE0); +CHECK_PROFILE_ENUM(DOLBYVISION_PROFILE4); +CHECK_PROFILE_ENUM(DOLBYVISION_PROFILE5); +CHECK_PROFILE_ENUM(DOLBYVISION_PROFILE7); +CHECK_PROFILE_ENUM(DOLBYVISION_MAX); +CHECK_PROFILE_ENUM(VIDEO_CODEC_PROFILE_MAX); + +#undef CHECK_PROFILE_ENUM + +// static +arc::mojom::VideoCodecProfile +EnumTraits<arc::mojom::VideoCodecProfile, media::VideoCodecProfile>::ToMojom( + media::VideoCodecProfile input) { + return static_cast<arc::mojom::VideoCodecProfile>(input); +} + +// static +bool EnumTraits<arc::mojom::VideoCodecProfile, media::VideoCodecProfile>:: + FromMojom(arc::mojom::VideoCodecProfile input, + media::VideoCodecProfile* output) { + switch (input) { + case arc::mojom::VideoCodecProfile::VIDEO_CODEC_PROFILE_UNKNOWN: + case arc::mojom::VideoCodecProfile::H264PROFILE_BASELINE: + case arc::mojom::VideoCodecProfile::H264PROFILE_MAIN: + case arc::mojom::VideoCodecProfile::H264PROFILE_EXTENDED: + case arc::mojom::VideoCodecProfile::H264PROFILE_HIGH: + case arc::mojom::VideoCodecProfile::H264PROFILE_HIGH10PROFILE: + case arc::mojom::VideoCodecProfile::H264PROFILE_HIGH422PROFILE: + case arc::mojom::VideoCodecProfile::H264PROFILE_HIGH444PREDICTIVEPROFILE: + case arc::mojom::VideoCodecProfile::H264PROFILE_SCALABLEBASELINE: + case arc::mojom::VideoCodecProfile::H264PROFILE_SCALABLEHIGH: + case arc::mojom::VideoCodecProfile::H264PROFILE_STEREOHIGH: + case arc::mojom::VideoCodecProfile::H264PROFILE_MULTIVIEWHIGH: + case arc::mojom::VideoCodecProfile::VP8PROFILE_ANY: + case arc::mojom::VideoCodecProfile::VP9PROFILE_PROFILE0: + case arc::mojom::VideoCodecProfile::VP9PROFILE_PROFILE1: + case arc::mojom::VideoCodecProfile::VP9PROFILE_PROFILE2: + case arc::mojom::VideoCodecProfile::VP9PROFILE_PROFILE3: + case arc::mojom::VideoCodecProfile::HEVCPROFILE_MAIN: + case arc::mojom::VideoCodecProfile::HEVCPROFILE_MAIN10: + case arc::mojom::VideoCodecProfile::HEVCPROFILE_MAIN_STILL_PICTURE: + case arc::mojom::VideoCodecProfile::DOLBYVISION_PROFILE0: + case arc::mojom::VideoCodecProfile::DOLBYVISION_PROFILE4: + case arc::mojom::VideoCodecProfile::DOLBYVISION_PROFILE5: + case arc::mojom::VideoCodecProfile::DOLBYVISION_PROFILE7: + *output = static_cast<media::VideoCodecProfile>(input); + return true; + } + DLOG(ERROR) << "unknown profile: " << input; + return false; +} + +} // namespace mojo
diff --git a/components/arc/video_accelerator/video_encode_accelerator_struct_traits.h b/components/arc/video_accelerator/video_encode_accelerator_struct_traits.h new file mode 100644 index 0000000..c3b39e1 --- /dev/null +++ b/components/arc/video_accelerator/video_encode_accelerator_struct_traits.h
@@ -0,0 +1,68 @@ +// Copyright 2017 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 COMPONENTS_ARC_VIDEO_ACCELERATOR_VIDEO_ENCODE_ACCELERATOR_STRUCT_TRAITS_H_ +#define COMPONENTS_ARC_VIDEO_ACCELERATOR_VIDEO_ENCODE_ACCELERATOR_STRUCT_TRAITS_H_ + +#include "components/arc/common/video_encode_accelerator.mojom.h" +#include "media/video/video_encode_accelerator.h" + +namespace mojo { + +template <> +struct EnumTraits<arc::mojom::VideoEncodeAccelerator::Error, + media::VideoEncodeAccelerator::Error> { + static arc::mojom::VideoEncodeAccelerator::Error ToMojom( + media::VideoEncodeAccelerator::Error input); + + static bool FromMojom(arc::mojom::VideoEncodeAccelerator::Error input, + media::VideoEncodeAccelerator::Error* output); +}; + +template <> +struct EnumTraits<arc::mojom::VideoPixelFormat, media::VideoPixelFormat> { + static arc::mojom::VideoPixelFormat ToMojom(media::VideoPixelFormat input); + + static bool FromMojom(arc::mojom::VideoPixelFormat input, + media::VideoPixelFormat* output); +}; + +template <> +struct EnumTraits<arc::mojom::VideoCodecProfile, media::VideoCodecProfile> { + static arc::mojom::VideoCodecProfile ToMojom(media::VideoCodecProfile input); + + static bool FromMojom(arc::mojom::VideoCodecProfile input, + media::VideoCodecProfile* output); +}; + +template <> +struct StructTraits<arc::mojom::VideoEncodeProfileDataView, + media::VideoEncodeAccelerator::SupportedProfile> { + static media::VideoCodecProfile profile( + const media::VideoEncodeAccelerator::SupportedProfile& r) { + return r.profile; + } + static const gfx::Size& max_resolution( + const media::VideoEncodeAccelerator::SupportedProfile& r) { + return r.max_resolution; + } + static uint32_t max_framerate_numerator( + const media::VideoEncodeAccelerator::SupportedProfile& r) { + return r.max_framerate_numerator; + } + static uint32_t max_framerate_denominator( + const media::VideoEncodeAccelerator::SupportedProfile& r) { + return r.max_framerate_denominator; + } + + static bool Read(arc::mojom::VideoEncodeProfileDataView data, + media::VideoEncodeAccelerator::SupportedProfile* out) { + NOTIMPLEMENTED(); + return false; + } +}; + +} // namespace mojo + +#endif // COMPONENTS_ARC_VIDEO_ACCELERATOR_VIDEO_ENCODE_ACCELERATOR_STRUCT_TRAITS_H_
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc index 2a32103..bf662aa 100644 --- a/components/autofill/content/renderer/form_autofill_util.cc +++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -111,9 +111,7 @@ return false; const WebFormControlElement form_control_element = element.ToConst<WebFormControlElement>(); - return std::find(control_elements.begin(), - control_elements.end(), - form_control_element) != control_elements.end(); + return base::ContainsValue(control_elements, form_control_element); } bool IsElementInsideFormOrFieldSet(const WebElement& element) {
diff --git a/components/autofill/content/renderer/password_generation_agent.cc b/components/autofill/content/renderer/password_generation_agent.cc index b4ab0cb2..3f833da 100644 --- a/components/autofill/content/renderer/password_generation_agent.cc +++ b/components/autofill/content/renderer/password_generation_agent.cc
@@ -10,6 +10,7 @@ #include "base/command_line.h" #include "base/logging.h" +#include "base/stl_util.h" #include "base/threading/thread_task_runner_handle.h" #include "components/autofill/content/renderer/form_autofill_util.h" #include "components/autofill/content/renderer/form_classifier.h" @@ -58,7 +59,7 @@ } bool ContainsURL(const std::vector<GURL>& urls, const GURL& url) { - return std::find(urls.begin(), urls.end(), url) != urls.end(); + return base::ContainsValue(urls, url); } // Calculates the signature of |form| and searches it in |forms|.
diff --git a/components/autofill/core/browser/address.cc b/components/autofill/core/browser/address.cc index 3a44121..c950f69c 100644 --- a/components/autofill/core/browser/address.cc +++ b/components/autofill/core/browser/address.cc
@@ -9,6 +9,7 @@ #include "base/i18n/case_conversion.h" #include "base/logging.h" +#include "base/stl_util.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -199,8 +200,7 @@ // There's a good chance that this formatting is not intentional, but it's // also not obviously safe to just strip the newlines. if (storable_type == ADDRESS_HOME_STREET_ADDRESS && - std::find(street_address_.begin(), street_address_.end(), - base::string16()) != street_address_.end()) { + base::ContainsValue(street_address_, base::string16())) { street_address_.clear(); return false; }
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc index 1ed3ce5..4f3bef1 100644 --- a/components/autofill/core/browser/personal_data_manager.cc +++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -16,6 +16,7 @@ #include "base/i18n/timezone.h" #include "base/memory/ptr_util.h" #include "base/profiler/scoped_tracker.h" +#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -1115,8 +1116,7 @@ AutofillCountry::CountryCodeForLocale(app_locale()))); } - return std::find(country_codes.begin(), country_codes.end(), - base::ToLowerASCII(country_code)) != country_codes.end(); + return base::ContainsValue(country_codes, base::ToLowerASCII(country_code)); } const std::string& PersonalDataManager::GetDefaultCountryCodeForNewAddress() @@ -1384,8 +1384,7 @@ std::string country_code = base::ToUpperASCII(base::UTF16ToASCII( profiles[i]->GetRawInfo(ADDRESS_HOME_COUNTRY))); - if (std::find(country_codes.begin(), country_codes.end(), country_code) != - country_codes.end()) { + if (base::ContainsValue(country_codes, country_code)) { // Verified profiles count 100x more than unverified ones. votes[country_code] += profiles[i]->IsVerified() ? 100 : 1; }
diff --git a/components/cast_channel/cast_socket_service.h b/components/cast_channel/cast_socket_service.h index eea0aee..bb465e9 100644 --- a/components/cast_channel/cast_socket_service.h +++ b/components/cast_channel/cast_socket_service.h
@@ -37,7 +37,7 @@ // Returns the socket corresponding to |channel_id| if one exists, or nullptr // otherwise. - CastSocket* GetSocket(int channel_id) const; + virtual CastSocket* GetSocket(int channel_id) const; CastSocket* GetSocket(const net::IPEndPoint& ip_endpoint) const; @@ -72,10 +72,10 @@ // |open_cb|: OnOpenCallback invoked when cast socket is opened. // |observer|: Observer handles messages and errors on newly opened socket. // Does not take ownership of |observer|. - int OpenSocket(const net::IPEndPoint& ip_endpoint, - net::NetLog* net_log, - const CastSocket::OnOpenCallback& open_cb, - CastSocket::Observer* observer); + virtual int OpenSocket(const net::IPEndPoint& ip_endpoint, + net::NetLog* net_log, + const CastSocket::OnOpenCallback& open_cb, + CastSocket::Observer* observer); // Returns an observer corresponding to |id|. CastSocket::Observer* GetObserver(const std::string& id); @@ -89,9 +89,10 @@ // Allow test to inject a mock cast socket. void SetSocketForTest(std::unique_ptr<CastSocket> socket_for_test); - private: + protected: ~CastSocketService() override; + private: // RefcountedKeyedService implementation. void ShutdownOnUIThread() override;
diff --git a/components/cdm/browser/media_drm_storage_impl.cc b/components/cdm/browser/media_drm_storage_impl.cc index 800c6275..2f9ee4f 100644 --- a/components/cdm/browser/media_drm_storage_impl.cc +++ b/components/cdm/browser/media_drm_storage_impl.cc
@@ -123,13 +123,13 @@ initialized_ = true; } -void MediaDrmStorageImpl::OnProvisioned(const OnProvisionedCallback& callback) { +void MediaDrmStorageImpl::OnProvisioned(OnProvisionedCallback callback) { DVLOG(1) << __func__; DCHECK(thread_checker_.CalledOnValidThread()); if (!initialized_) { DVLOG(1) << __func__ << ": Not initialized."; - callback.Run(false); + std::move(callback).Run(false); return; } @@ -144,19 +144,19 @@ storage_dict->SetWithoutPathExpansion(origin_string_, CreateOriginDictionary()); - callback.Run(true); + std::move(callback).Run(true); } void MediaDrmStorageImpl::SavePersistentSession( const std::string& session_id, media::mojom::SessionDataPtr session_data, - const SavePersistentSessionCallback& callback) { + SavePersistentSessionCallback callback) { DVLOG(2) << __func__; DCHECK(thread_checker_.CalledOnValidThread()); if (!initialized_) { DVLOG(1) << __func__ << ": Not initialized."; - callback.Run(false); + std::move(callback).Run(false); return; } @@ -196,18 +196,18 @@ session_id, CreateSessionDictionary(session_data->key_set_id, session_data->mime_type)); - callback.Run(true); + std::move(callback).Run(true); } void MediaDrmStorageImpl::LoadPersistentSession( const std::string& session_id, - const LoadPersistentSessionCallback& callback) { + LoadPersistentSessionCallback callback) { DVLOG(2) << __func__; DCHECK(thread_checker_.CalledOnValidThread()); if (!initialized_) { DVLOG(1) << __func__ << ": Not initialized."; - callback.Run(nullptr); + std::move(callback).Run(nullptr); return; } @@ -221,14 +221,14 @@ DVLOG(1) << __func__ << ": Failed to save persistent session data; entry for origin " << origin_ << " does not exist."; - callback.Run(nullptr); + std::move(callback).Run(nullptr); return; } const base::DictionaryValue* sessions_dict = nullptr; if (!origin_dict->GetDictionary(kSessions, &sessions_dict)) { DVLOG(2) << __func__ << ": Sessions dictionary does not exist."; - callback.Run(nullptr); + std::move(callback).Run(nullptr); return; } @@ -236,7 +236,7 @@ if (!sessions_dict->GetDictionaryWithoutPathExpansion(session_id, &session_dict)) { DVLOG(2) << __func__ << ": Session dictionary does not exist."; - callback.Run(nullptr); + std::move(callback).Run(nullptr); return; } @@ -244,22 +244,23 @@ std::string mime_type; if (!GetSessionData(session_dict, &key_set_id, &mime_type)) { DVLOG(2) << __func__ << ": Failed to read session data."; - callback.Run(nullptr); + std::move(callback).Run(nullptr); return; } - callback.Run(media::mojom::SessionData::New(key_set_id, mime_type)); + std::move(callback).Run( + media::mojom::SessionData::New(key_set_id, mime_type)); } void MediaDrmStorageImpl::RemovePersistentSession( const std::string& session_id, - const RemovePersistentSessionCallback& callback) { + RemovePersistentSessionCallback callback) { DVLOG(2) << __func__; DCHECK(thread_checker_.CalledOnValidThread()); if (!initialized_) { DVLOG(1) << __func__ << ": Not initialized."; - callback.Run(false); + std::move(callback).Run(false); return; } @@ -273,19 +274,19 @@ if (!origin_dict) { DVLOG(1) << __func__ << ": Entry for rigin " << origin_string_ << " does not exist."; - callback.Run(true); + std::move(callback).Run(true); return; } base::DictionaryValue* sessions_dict = nullptr; if (!origin_dict->GetDictionary(kSessions, &sessions_dict)) { DVLOG(2) << __func__ << ": Sessions dictionary does not exist."; - callback.Run(true); + std::move(callback).Run(true); return; } sessions_dict->RemoveWithoutPathExpansion(session_id, nullptr); - callback.Run(true); + std::move(callback).Run(true); } void MediaDrmStorageImpl::RenderFrameDeleted(
diff --git a/components/cdm/browser/media_drm_storage_impl.h b/components/cdm/browser/media_drm_storage_impl.h index a581cb6..f6970f6 100644 --- a/components/cdm/browser/media_drm_storage_impl.h +++ b/components/cdm/browser/media_drm_storage_impl.h
@@ -37,17 +37,14 @@ // media::mojom::MediaDrmStorage implementation. void Initialize(const url::Origin& origin) final; - void OnProvisioned(const OnProvisionedCallback& callback) final; - void SavePersistentSession( - const std::string& session_id, - media::mojom::SessionDataPtr session_data, - const SavePersistentSessionCallback& callback) final; - void LoadPersistentSession( - const std::string& session_id, - const LoadPersistentSessionCallback& callback) final; - void RemovePersistentSession( - const std::string& session_id, - const RemovePersistentSessionCallback& callback) final; + void OnProvisioned(OnProvisionedCallback callback) final; + void SavePersistentSession(const std::string& session_id, + media::mojom::SessionDataPtr session_data, + SavePersistentSessionCallback callback) final; + void LoadPersistentSession(const std::string& session_id, + LoadPersistentSessionCallback callback) final; + void RemovePersistentSession(const std::string& session_id, + RemovePersistentSessionCallback callback) final; // content::WebContentsObserver implementation. void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) final;
diff --git a/components/cronet/android/cronet_url_request_context_adapter.cc b/components/cronet/android/cronet_url_request_context_adapter.cc index d62729b6..d9342555 100644 --- a/components/cronet/android/cronet_url_request_context_adapter.cc +++ b/components/cronet/android/cronet_url_request_context_adapter.cc
@@ -1027,7 +1027,7 @@ if (net_log_file_observer_) return; net_log_file_observer_ = net::FileNetLogObserver::CreateUnbounded( - GetFileThread()->task_runner(), file_path, /*constants=*/nullptr); + file_path, /*constants=*/nullptr); CreateNetLogEntriesForActiveObjects({context_.get()}, net_log_file_observer_.get()); net::NetLogCaptureMode capture_mode = @@ -1052,8 +1052,7 @@ DCHECK(base::PathIsWritable(file_path)); net_log_file_observer_ = net::FileNetLogObserver::CreateBounded( - GetFileThread()->task_runner(), file_path, size, kNumNetLogEventFiles, - /*constants=*/nullptr); + file_path, size, kNumNetLogEventFiles, /*constants=*/nullptr); CreateNetLogEntriesForActiveObjects({context_.get()}, net_log_file_observer_.get());
diff --git a/components/exo/DEPS b/components/exo/DEPS index 6971866..c58c382 100644 --- a/components/exo/DEPS +++ b/components/exo/DEPS
@@ -2,6 +2,7 @@ "+ash", "+cc", "+chromeos/audio/chromeos_sounds.h", + "+components/viz/common/quads", "+device/gamepad", "+gpu", "+mojo/public/cpp",
diff --git a/components/exo/buffer.cc b/components/exo/buffer.cc index 5e6b918..dc0977c 100644 --- a/components/exo/buffer.cc +++ b/components/exo/buffer.cc
@@ -25,6 +25,7 @@ #include "cc/resources/single_release_callback.h" #include "cc/resources/texture_mailbox.h" #include "components/exo/layer_tree_frame_sink_holder.h" +#include "components/viz/common/quads/resource_format.h" #include "gpu/command_buffer/client/context_support.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "ui/aura/env.h" @@ -439,7 +440,7 @@ } resource->id = resource_id; - resource->format = cc::RGBA_8888; + resource->format = viz::RGBA_8888; resource->filter = GL_LINEAR; resource->size = gpu_memory_buffer_->GetSize();
diff --git a/components/exo/surface_tree_host.cc b/components/exo/surface_tree_host.cc index 8ca3a7c..36442f58 100644 --- a/components/exo/surface_tree_host.cc +++ b/components/exo/surface_tree_host.cc
@@ -31,7 +31,7 @@ bool EventLocationInsideBounds(aura::Window* window, const ui::LocatedEvent& event) const override { if (window != surface_tree_host_->host_window()) - return false; + return aura::WindowTargeter::EventLocationInsideBounds(window, event); Surface* surface = surface_tree_host_->root_surface(); if (!surface) @@ -49,7 +49,8 @@ ui::EventTarget* FindTargetForEvent(ui::EventTarget* root, ui::Event* event) override { aura::Window* window = static_cast<aura::Window*>(root); - DCHECK_EQ(window, surface_tree_host_->host_window()); + if (window != surface_tree_host_->host_window()) + return aura::WindowTargeter::FindTargetForEvent(root, event); ui::EventTarget* target = aura::WindowTargeter::FindTargetForEvent(root, event); // Do not accept events in SurfaceTreeHost window.
diff --git a/components/favicon/core/large_icon_service.cc b/components/favicon/core/large_icon_service.cc index 043678a..bb99ce88 100644 --- a/components/favicon/core/large_icon_service.cc +++ b/components/favicon/core/large_icon_service.cc
@@ -267,18 +267,31 @@ UMA_HISTOGRAM_COUNTS_1000("Favicons.LargeIconService.DownloadedSize", size); } +void OnSetOnDemandFaviconComplete( + const favicon_base::GoogleFaviconServerCallback& callback, + bool success) { + callback.Run( + success + ? favicon_base::GoogleFaviconServerRequestStatus::SUCCESS + : favicon_base::GoogleFaviconServerRequestStatus::FAILURE_ON_WRITE); +} + void OnFetchIconFromGoogleServerComplete( FaviconService* favicon_service, const GURL& page_url, - const base::Callback<void(bool success)>& callback, + const favicon_base::GoogleFaviconServerCallback& callback, const std::string& server_request_url, const gfx::Image& image, const image_fetcher::RequestMetadata& metadata) { if (image.IsEmpty()) { DLOG(WARNING) << "large icon server fetch empty " << server_request_url; favicon_service->UnableToDownloadFavicon(GURL(server_request_url)); - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, - base::Bind(callback, false)); + callback.Run(metadata.http_response_code == + net::URLFetcher::RESPONSE_CODE_INVALID + ? favicon_base::GoogleFaviconServerRequestStatus:: + FAILURE_CONNECTION_ERROR + : favicon_base::GoogleFaviconServerRequestStatus:: + FAILURE_HTTP_ERROR); ReportDownloadedSize(0); return; } @@ -297,9 +310,9 @@ // something else could've been written). By marking the icons initially // expired (out-of-date), they will be refetched when we visit the original // page any time in the future. - favicon_service->SetOnDemandFavicons(page_url, GURL(original_icon_url), - favicon_base::IconType::TOUCH_ICON, - image, callback); + favicon_service->SetOnDemandFavicons( + page_url, GURL(original_icon_url), favicon_base::IconType::TOUCH_ICON, + image, base::Bind(&OnSetOnDemandFaviconComplete, callback)); } } // namespace @@ -351,7 +364,7 @@ int desired_size_in_pixel, bool may_page_url_be_private, const net::NetworkTrafficAnnotationTag& traffic_annotation, - const base::Callback<void(bool success)>& callback) { + const favicon_base::GoogleFaviconServerCallback& callback) { DCHECK_LE(0, min_source_size_in_pixel); const GURL trimmed_page_url = TrimPageUrlForGoogleServer(page_url); @@ -359,13 +372,23 @@ trimmed_page_url, min_source_size_in_pixel, desired_size_in_pixel, may_page_url_be_private); - // Do not download if the URL is invalid after trimming, or there is a - // previous cache miss recorded for |server_request_url|. if (!server_request_url.is_valid() || !trimmed_page_url.is_valid() || - !image_fetcher_ || - favicon_service_->WasUnableToDownloadFavicon(server_request_url)) { - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, - base::Bind(callback, false)); + !image_fetcher_) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind( + callback, + favicon_base::GoogleFaviconServerRequestStatus::FAILURE_INVALID)); + return; + } + + // Do not download if there is a previous cache miss recorded for + // |server_request_url|. + if (favicon_service_->WasUnableToDownloadFavicon(server_request_url)) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind(callback, favicon_base::GoogleFaviconServerRequestStatus:: + FAILURE_HTTP_ERROR_CACHED)); return; }
diff --git a/components/favicon/core/large_icon_service.h b/components/favicon/core/large_icon_service.h index 0501625..d44ace6 100644 --- a/components/favicon/core/large_icon_service.h +++ b/components/favicon/core/large_icon_service.h
@@ -100,7 +100,7 @@ int desired_size_in_pixel, bool may_page_url_be_private, const net::NetworkTrafficAnnotationTag& traffic_annotation, - const base::Callback<void(bool success)>& callback); + const favicon_base::GoogleFaviconServerCallback& callback); private: base::CancelableTaskTracker::TaskId GetLargeIconOrFallbackStyleImpl(
diff --git a/components/favicon/core/large_icon_service_unittest.cc b/components/favicon/core/large_icon_service_unittest.cc index 23a2a67..e048504 100644 --- a/components/favicon/core/large_icon_service_unittest.cc +++ b/components/favicon/core/large_icon_service_unittest.cc
@@ -151,7 +151,7 @@ EXPECT_CALL(mock_favicon_service_, UnableToDownloadFavicon(_)).Times(0); - base::MockCallback<base::Callback<void(bool success)>> callback; + base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback; EXPECT_CALL(*mock_image_fetcher_, StartOrQueueNetworkRequest(_, kExpectedServerUrl, _, _)) .WillOnce(PostFetchReply(gfx::Image::CreateFrom1xBitmap( @@ -167,7 +167,8 @@ /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true, TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get()); - EXPECT_CALL(callback, Run(true)); + EXPECT_CALL(callback, + Run(favicon_base::GoogleFaviconServerRequestStatus::SUCCESS)); base::RunLoop().RunUntilIdle(); histogram_tester_.ExpectUniqueSample( "Favicons.LargeIconService.DownloadedSize", 64, /*expected_count=*/1); @@ -188,7 +189,7 @@ EXPECT_CALL(mock_favicon_service_, UnableToDownloadFavicon(_)).Times(0); - base::MockCallback<base::Callback<void(bool success)>> callback; + base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback; EXPECT_CALL(*mock_image_fetcher_, StartOrQueueNetworkRequest(_, kExpectedServerUrl, _, _)) .WillOnce(PostFetchReply(gfx::Image::CreateFrom1xBitmap( @@ -204,7 +205,8 @@ /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true, TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get()); - EXPECT_CALL(callback, Run(true)); + EXPECT_CALL(callback, + Run(favicon_base::GoogleFaviconServerRequestStatus::SUCCESS)); base::RunLoop().RunUntilIdle(); } @@ -228,14 +230,15 @@ favicon_base::IconType::TOUCH_ICON, _, _)) .WillOnce(PostBoolReply(true)); - base::MockCallback<base::Callback<void(bool success)>> callback; + base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback; large_icon_service_ .GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache( GURL(kDummyUrl), /*min_source_size_in_pixel=*/42, /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true, TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get()); - EXPECT_CALL(callback, Run(true)); + EXPECT_CALL(callback, + Run(favicon_base::GoogleFaviconServerRequestStatus::SUCCESS)); base::RunLoop().RunUntilIdle(); } @@ -258,7 +261,8 @@ .GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache( GURL(kDummyUrlWithQuery), /*min_source_size_in_pixel=*/42, /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true, - TRAFFIC_ANNOTATION_FOR_TESTS, base::Callback<void(bool success)>()); + TRAFFIC_ANNOTATION_FOR_TESTS, + favicon_base::GoogleFaviconServerCallback()); base::RunLoop().RunUntilIdle(); } @@ -271,7 +275,7 @@ _, Property(&GURL::query, Not(HasSubstr("check_seen=true"))), _, _)) .WillOnce(PostFetchReply(gfx::Image())); - base::MockCallback<base::Callback<void(bool success)>> callback; + base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback; large_icon_service_ .GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache( @@ -279,7 +283,8 @@ /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/false, TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get()); - EXPECT_CALL(callback, Run(false)); + EXPECT_CALL(callback, Run(favicon_base::GoogleFaviconServerRequestStatus:: + FAILURE_CONNECTION_ERROR)); base::RunLoop().RunUntilIdle(); } @@ -289,7 +294,7 @@ EXPECT_CALL(*mock_image_fetcher_, StartOrQueueNetworkRequest(_, _, _, _)) .Times(0); - base::MockCallback<base::Callback<void(bool success)>> callback; + base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback; large_icon_service_ .GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache( @@ -297,7 +302,9 @@ /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true, TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get()); - EXPECT_CALL(callback, Run(false)); + EXPECT_CALL( + callback, + Run(favicon_base::GoogleFaviconServerRequestStatus::FAILURE_INVALID)); base::RunLoop().RunUntilIdle(); EXPECT_THAT(histogram_tester_.GetAllSamples( "Favicons.LargeIconService.DownloadedSize"), @@ -314,7 +321,7 @@ EXPECT_CALL(mock_favicon_service_, SetOnDemandFavicons(_, _, _, _, _)) .Times(0); - base::MockCallback<base::Callback<void(bool success)>> callback; + base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback; EXPECT_CALL(*mock_image_fetcher_, StartOrQueueNetworkRequest(_, kExpectedServerUrl, _, _)) .WillOnce(PostFetchReply(gfx::Image())); @@ -327,7 +334,8 @@ /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true, TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get()); - EXPECT_CALL(callback, Run(false)); + EXPECT_CALL(callback, Run(favicon_base::GoogleFaviconServerRequestStatus:: + FAILURE_CONNECTION_ERROR)); base::RunLoop().RunUntilIdle(); // Verify that download failure gets recorded. histogram_tester_.ExpectUniqueSample( @@ -349,14 +357,15 @@ EXPECT_CALL(mock_favicon_service_, SetOnDemandFavicons(_, _, _, _, _)) .Times(0); - base::MockCallback<base::Callback<void(bool success)>> callback; + base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback; large_icon_service_ .GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache( GURL(kDummyUrl), /*min_source_size_in_pixel=*/42, /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true, TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get()); - EXPECT_CALL(callback, Run(false)); + EXPECT_CALL(callback, Run(favicon_base::GoogleFaviconServerRequestStatus:: + FAILURE_HTTP_ERROR_CACHED)); base::RunLoop().RunUntilIdle(); EXPECT_THAT(histogram_tester_.GetAllSamples( "Favicons.LargeIconService.DownloadedSize"),
diff --git a/components/favicon_base/favicon_callback.h b/components/favicon_base/favicon_callback.h index 28ad5b3..318f64c 100644 --- a/components/favicon_base/favicon_callback.h +++ b/components/favicon_base/favicon_callback.h
@@ -15,6 +15,7 @@ struct FaviconImageResult; struct LargeIconResult; struct LargeIconImageResult; +enum class GoogleFaviconServerRequestStatus; // Callback for functions that can be used to return a |gfx::Image| and the // |GURL| it is loaded from. They are returned as a |FaviconImageResult| object. @@ -44,6 +45,9 @@ typedef base::Callback<void(const LargeIconImageResult&)> LargeIconImageCallback; +typedef base::Callback<void(GoogleFaviconServerRequestStatus)> + GoogleFaviconServerCallback; + } // namespace favicon_base #endif // COMPONENTS_FAVICON_BASE_FAVICON_CALLBACK_H_
diff --git a/components/favicon_base/favicon_types.h b/components/favicon_base/favicon_types.h index 7ad22ff..4afec6f 100644 --- a/components/favicon_base/favicon_types.h +++ b/components/favicon_base/favicon_types.h
@@ -119,6 +119,28 @@ std::unique_ptr<FallbackIconStyle> fallback_icon_style; }; +// Enumeration listing all possible outcomes for fetch attempts from Google +// favicon server. Used for UMA enum GoogleFaviconServerRequestStatus, so do not +// change existing values. Insert new values at the end, and update the +// histogram definition. +enum class GoogleFaviconServerRequestStatus { + // Request sent out and the favicon successfully fetched. + SUCCESS = 0, + // Request sent out and a connection error occurred (no valid HTTP response + // recevied). + FAILURE_CONNECTION_ERROR = 1, + // Request sent out and a HTTP error received. + FAILURE_HTTP_ERROR = 2, + // Request not sent out (previous HTTP error in cache). + FAILURE_HTTP_ERROR_CACHED = 3, + // Request sent out and favicon fetched but writing to database failed. + FAILURE_ON_WRITE = 4, + // Request not sent out (the request or the fetcher was invalid). + FAILURE_INVALID = 5, + // Insert new values here. + COUNT +}; + } // namespace favicon_base #endif // COMPONENTS_FAVICON_BASE_FAVICON_TYPES_H_
diff --git a/components/gcm_driver/gcm_client_impl.cc b/components/gcm_driver/gcm_client_impl.cc index 9cd3eb9..f18900d 100644 --- a/components/gcm_driver/gcm_client_impl.cc +++ b/components/gcm_driver/gcm_client_impl.cc
@@ -80,7 +80,6 @@ RESET_STORE_ERROR_COUNT }; -const char kGCMScope[] = "GCM"; const int kMaxRegistrationRetries = 5; const int kMaxUnregistrationRetries = 5; const char kDeletedCountKey[] = "total_deleted"; @@ -1394,65 +1393,16 @@ bool was_subtype, const mcs_proto::DataMessageStanza& data_message_stanza, MessageData& message_data) { - std::string sender = data_message_stanza.from(); + UMA_HISTOGRAM_BOOLEAN("GCM.DataMessageReceived", true); - // Drop the message when the app is not registered for the sender of the - // message. - bool registered = false; + bool has_collapse_key = + data_message_stanza.has_token() && !data_message_stanza.token().empty(); + UMA_HISTOGRAM_BOOLEAN("GCM.DataMessageReceivedHasCollapseKey", + has_collapse_key); - // First, find among all GCM registrations. - std::unique_ptr<GCMRegistrationInfo> gcm_registration( - new GCMRegistrationInfo); - gcm_registration->app_id = app_id; - auto gcm_registration_iter = registrations_.find( - make_linked_ptr<RegistrationInfo>(gcm_registration.release())); - if (gcm_registration_iter != registrations_.end()) { - GCMRegistrationInfo* cached_gcm_registration = - GCMRegistrationInfo::FromRegistrationInfo( - gcm_registration_iter->first.get()); - if (cached_gcm_registration && - std::find(cached_gcm_registration->sender_ids.begin(), - cached_gcm_registration->sender_ids.end(), - sender) != cached_gcm_registration->sender_ids.end()) { - if (was_subtype) - DLOG(ERROR) << "GCM message for non-IID " << app_id << " used subtype"; - else - registered = true; - } - } - - // Then, find among all InstanceID registrations. - if (!registered) { - std::unique_ptr<InstanceIDTokenInfo> instance_id_token( - new InstanceIDTokenInfo); - instance_id_token->app_id = app_id; - instance_id_token->authorized_entity = sender; - instance_id_token->scope = kGCMScope; - auto instance_id_token_iter = registrations_.find( - make_linked_ptr<RegistrationInfo>(instance_id_token.release())); - if (instance_id_token_iter != registrations_.end()) { - if (was_subtype != InstanceIDUsesSubtypeForAppId(app_id)) { - DLOG(ERROR) << "GCM message for " << app_id - << " incorrectly had was_subtype = " << was_subtype; - } else { - registered = true; - } - } - } - - UMA_HISTOGRAM_BOOLEAN("GCM.DataMessageReceivedHasRegisteredApp", registered); - if (registered) { - UMA_HISTOGRAM_BOOLEAN("GCM.DataMessageReceived", true); - bool has_collapse_key = - data_message_stanza.has_token() && !data_message_stanza.token().empty(); - UMA_HISTOGRAM_BOOLEAN("GCM.DataMessageReceivedHasCollapseKey", - has_collapse_key); - } - recorder_.RecordDataMessageReceived(app_id, sender, - data_message_stanza.ByteSize(), registered, - GCMStatsRecorder::DATA_MESSAGE); - if (!registered) - return; + recorder_.RecordDataMessageReceived(app_id, data_message_stanza.from(), + data_message_stanza.ByteSize(), + GCMStatsRecorder::DATA_MESSAGE); IncomingMessage incoming_message; incoming_message.sender_id = data_message_stanza.from(); @@ -1478,7 +1428,6 @@ recorder_.RecordDataMessageReceived(app_id, data_message_stanza.from(), data_message_stanza.ByteSize(), - true /* to_registered_app */, GCMStatsRecorder::DELETED_MESSAGES); delegate_->OnMessagesDeleted(app_id); }
diff --git a/components/gcm_driver/gcm_client_impl_unittest.cc b/components/gcm_driver/gcm_client_impl_unittest.cc index 827a605..7486c1c 100644 --- a/components/gcm_driver/gcm_client_impl_unittest.cc +++ b/components/gcm_driver/gcm_client_impl_unittest.cc
@@ -65,7 +65,6 @@ const char kSubtypeAppId[] = "app_id"; const char kSender[] = "project_id"; const char kSender2[] = "project_id2"; -const char kSender3[] = "project_id3"; const char kRegistrationResponsePrefix[] = "token="; const char kUnregistrationResponsePrefix[] = "deleted="; const char kRawData[] = "example raw data"; @@ -926,18 +925,6 @@ EXPECT_EQ(expected_data.size(), last_message().data.size()); EXPECT_EQ(expected_data, last_message().data); EXPECT_EQ(kSender2, last_message().sender_id); - - reset_last_event(); - - // Message from kSender3 will be dropped. - MCSMessage message3(BuildDownstreamMessage( - kSender3, kExtensionAppId, std::string() /* subtype */, expected_data, - std::string() /* raw_data */)); - EXPECT_TRUE(message3.IsValid()); - ReceiveMessageFromMCS(message3); - - EXPECT_NE(MESSAGE_RECEIVED, last_event()); - EXPECT_NE(kExtensionAppId, last_app_id()); } TEST_F(GCMClientImplTest, DispatchDownstreamMessageRawData) { @@ -1775,122 +1762,40 @@ AddInstanceID(kExtensionAppId, kInstanceID); GetToken(kExtensionAppId, kSender, kScope); ASSERT_NO_FATAL_FAILURE(CompleteRegistration("token1")); - GetToken(kExtensionAppId, kSender2, kScope); - ASSERT_NO_FATAL_FAILURE(CompleteRegistration("token2")); std::map<std::string, std::string> expected_data; - // Message for kSender with a subtype will be dropped. - MCSMessage message0(BuildDownstreamMessage( - kSender, kProductCategoryForSubtypes, kExtensionAppId /* subtype */, - expected_data, std::string() /* raw_data */)); - EXPECT_TRUE(message0.IsValid()); - ReceiveMessageFromMCS(message0); - - EXPECT_NE(MESSAGE_RECEIVED, last_event()); - - reset_last_event(); - - // Message for kSender will be received. - MCSMessage message1(BuildDownstreamMessage( + MCSMessage message(BuildDownstreamMessage( kSender, kExtensionAppId, std::string() /* subtype */, expected_data, std::string() /* raw_data */)); - EXPECT_TRUE(message1.IsValid()); - ReceiveMessageFromMCS(message1); + EXPECT_TRUE(message.IsValid()); + ReceiveMessageFromMCS(message); EXPECT_EQ(MESSAGE_RECEIVED, last_event()); EXPECT_EQ(kExtensionAppId, last_app_id()); EXPECT_EQ(expected_data.size(), last_message().data.size()); EXPECT_EQ(expected_data, last_message().data); EXPECT_EQ(kSender, last_message().sender_id); - - reset_last_event(); - - // Message for kSender2 will be received. - MCSMessage message2(BuildDownstreamMessage( - kSender2, kExtensionAppId, std::string() /* subtype */, expected_data, - std::string() /* raw_data */)); - EXPECT_TRUE(message2.IsValid()); - ReceiveMessageFromMCS(message2); - - EXPECT_EQ(MESSAGE_RECEIVED, last_event()); - EXPECT_EQ(kExtensionAppId, last_app_id()); - EXPECT_EQ(expected_data.size(), last_message().data.size()); - EXPECT_EQ(expected_data, last_message().data); - EXPECT_EQ(kSender2, last_message().sender_id); - - reset_last_event(); - - // Message from kSender3 will be dropped. - MCSMessage message3(BuildDownstreamMessage( - kSender3, kExtensionAppId, std::string() /* subtype */, expected_data, - std::string() /* raw_data */)); - EXPECT_TRUE(message3.IsValid()); - ReceiveMessageFromMCS(message3); - - EXPECT_NE(MESSAGE_RECEIVED, last_event()); - EXPECT_NE(kExtensionAppId, last_app_id()); } TEST_F(GCMClientInstanceIDTest, DispatchDownstreamMessageWithSubtype) { AddInstanceID(kSubtypeAppId, kInstanceID); GetToken(kSubtypeAppId, kSender, kScope); ASSERT_NO_FATAL_FAILURE(CompleteRegistration("token1")); - GetToken(kSubtypeAppId, kSender2, kScope); - ASSERT_NO_FATAL_FAILURE(CompleteRegistration("token2")); std::map<std::string, std::string> expected_data; - // Message for kSender without a subtype will be dropped. - MCSMessage message0(BuildDownstreamMessage( - kSender, kSubtypeAppId, std::string() /* subtype */, expected_data, - std::string() /* raw_data */)); - EXPECT_TRUE(message0.IsValid()); - ReceiveMessageFromMCS(message0); - - EXPECT_NE(MESSAGE_RECEIVED, last_event()); - - reset_last_event(); - - // Message for kSender will be received. - MCSMessage message1(BuildDownstreamMessage( + MCSMessage message(BuildDownstreamMessage( kSender, kProductCategoryForSubtypes, kSubtypeAppId /* subtype */, expected_data, std::string() /* raw_data */)); - EXPECT_TRUE(message1.IsValid()); - ReceiveMessageFromMCS(message1); + EXPECT_TRUE(message.IsValid()); + ReceiveMessageFromMCS(message); EXPECT_EQ(MESSAGE_RECEIVED, last_event()); EXPECT_EQ(kSubtypeAppId, last_app_id()); EXPECT_EQ(expected_data.size(), last_message().data.size()); EXPECT_EQ(expected_data, last_message().data); EXPECT_EQ(kSender, last_message().sender_id); - - reset_last_event(); - - // Message for kSender2 will be received. - MCSMessage message2(BuildDownstreamMessage( - kSender2, kProductCategoryForSubtypes, kSubtypeAppId /* subtype */, - expected_data, std::string() /* raw_data */)); - EXPECT_TRUE(message2.IsValid()); - ReceiveMessageFromMCS(message2); - - EXPECT_EQ(MESSAGE_RECEIVED, last_event()); - EXPECT_EQ(kSubtypeAppId, last_app_id()); - EXPECT_EQ(expected_data.size(), last_message().data.size()); - EXPECT_EQ(expected_data, last_message().data); - EXPECT_EQ(kSender2, last_message().sender_id); - - reset_last_event(); - - // Message from kSender3 will be dropped. - MCSMessage message3(BuildDownstreamMessage( - kSender3, kProductCategoryForSubtypes, kSubtypeAppId /* subtype */, - expected_data, std::string() /* raw_data */)); - EXPECT_TRUE(message3.IsValid()); - ReceiveMessageFromMCS(message3); - - EXPECT_NE(MESSAGE_RECEIVED, last_event()); - EXPECT_NE(kSubtypeAppId, last_app_id()); } TEST_F(GCMClientInstanceIDTest, DispatchDownstreamMessageWithFakeSubtype) {
diff --git a/components/gcm_driver/gcm_stats_recorder_impl.cc b/components/gcm_driver/gcm_stats_recorder_impl.cc index cf511d8..e3a2711 100644 --- a/components/gcm_driver/gcm_stats_recorder_impl.cc +++ b/components/gcm_driver/gcm_stats_recorder_impl.cc
@@ -415,7 +415,6 @@ const std::string& app_id, const std::string& from, int message_byte_size, - bool to_registered_app, ReceivedMessageType message_type) { base::TimeTicks new_timestamp = base::TimeTicks::Now(); if (last_received_data_message_burst_start_time_.is_null()) { @@ -449,23 +448,16 @@ if (!is_recording_) return; - if (!to_registered_app) { - RecordReceiving(app_id, - from, - message_byte_size, - "Data msg received", - "No such registered app found"); - } else { - switch (message_type) { - case GCMStatsRecorderImpl::DATA_MESSAGE: - RecordReceiving(app_id, from, message_byte_size, "Data msg received", - std::string()); - break; - case GCMStatsRecorderImpl::DELETED_MESSAGES: - RecordReceiving(app_id, from, message_byte_size, "Data msg received", - "Message has been deleted on server"); - break; - } + + switch (message_type) { + case GCMStatsRecorderImpl::DATA_MESSAGE: + RecordReceiving(app_id, from, message_byte_size, "Data msg received", + std::string()); + break; + case GCMStatsRecorderImpl::DELETED_MESSAGES: + RecordReceiving(app_id, from, message_byte_size, "Data msg received", + "Message has been deleted on server"); + break; } }
diff --git a/components/gcm_driver/gcm_stats_recorder_impl.h b/components/gcm_driver/gcm_stats_recorder_impl.h index 77af2970..30f3e73 100644 --- a/components/gcm_driver/gcm_stats_recorder_impl.h +++ b/components/gcm_driver/gcm_stats_recorder_impl.h
@@ -78,7 +78,6 @@ void RecordDataMessageReceived(const std::string& app_id, const std::string& from, int message_byte_size, - bool to_registered_app, ReceivedMessageType message_type) override; void RecordDataSentToWire(const std::string& app_id, const std::string& receiver_id,
diff --git a/components/gcm_driver/gcm_stats_recorder_impl_unittest.cc b/components/gcm_driver/gcm_stats_recorder_impl_unittest.cc index a73a78b..03fe0963 100644 --- a/components/gcm_driver/gcm_stats_recorder_impl_unittest.cc +++ b/components/gcm_driver/gcm_stats_recorder_impl_unittest.cc
@@ -86,9 +86,6 @@ static const char kDataReceivedEvent[] = "Data msg received"; static const char kDataReceivedDetails[] = ""; -static const char kDataReceivedNotRegisteredEvent[] = "Data msg received"; -static const char kDataReceivedNotRegisteredDetails[] = - "No such registered app found"; static const char kDataDeletedMessageEvent[] = "Data msg received"; static const char kDataDeletedMessageDetails[] = "Message has been deleted on server"; @@ -270,13 +267,6 @@ remark); } - void VerifyDataMessageReceivedNotRegistered(const std::string& remark) { - VerifyReceivingData(recorder_.receiving_activities(), - kDataReceivedNotRegisteredEvent, - kDataReceivedNotRegisteredDetails, - remark); - } - void VerifyDataSentToWire(const std::string& remark) { VerifySendingData(recorder_.sending_activities(), kDataSentToWireEvent, @@ -410,12 +400,10 @@ recorder_.RecordUnregistrationRetryDelayed(kAppId, source_, kDelay, kRetries); VerifyAllActivityQueueEmpty("no unregistration"); - recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, true, + recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, GCMStatsRecorder::DATA_MESSAGE); - recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, true, + recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, GCMStatsRecorder::DELETED_MESSAGES); - recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, false, - GCMStatsRecorder::DATA_MESSAGE); VerifyAllActivityQueueEmpty("no receiving"); recorder_.RecordDataSentToWire(kAppId, kReceiverId, kMessageId, kQueuedSec); @@ -511,20 +499,15 @@ TEST_F(GCMStatsRecorderImplTest, RecordReceivingTest) { recorder_.RecordConnectionInitiated(std::string()); recorder_.RecordConnectionSuccess(); - recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, true, + recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, GCMStatsRecorder::DATA_MESSAGE); VerifyRecordedReceivingCount(1); VerifyDataMessageReceived("1st call"); - recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, true, + recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, GCMStatsRecorder::DELETED_MESSAGES); VerifyRecordedReceivingCount(2); VerifyDataDeletedMessage("2nd call"); - - recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, false, - GCMStatsRecorder::DATA_MESSAGE); - VerifyRecordedReceivingCount(3); - VerifyDataMessageReceivedNotRegistered("3rd call"); } TEST_F(GCMStatsRecorderImplTest, RecordSendingTest) {
diff --git a/components/metrics/file_metrics_provider.cc b/components/metrics/file_metrics_provider.cc index c3745b1..d6165f2 100644 --- a/components/metrics/file_metrics_provider.cc +++ b/components/metrics/file_metrics_provider.cc
@@ -579,14 +579,6 @@ UMA_HISTOGRAM_COUNTS_10000( "UMA.FileMetricsProvider.EmbeddedProfile.DroppedHistogramCount", histogram_count); - - base::File::Info info; - if (base::GetFileInfo(source->path, &info)) { - UMA_HISTOGRAM_CUSTOM_COUNTS( - "UMA.FileMetricsProvider.EmbeddedProfile.DroppedFileAge", - (base::Time::Now() - info.last_modified).InMinutes(), 1, - base::TimeDelta::FromDays(30).InMinutes(), 50); - } } // Regardless of whether this source was successfully recorded, it is never
diff --git a/components/metrics/proto/BUILD.gn b/components/metrics/proto/BUILD.gn index d8f8c1fd..c224887b 100644 --- a/components/metrics/proto/BUILD.gn +++ b/components/metrics/proto/BUILD.gn
@@ -16,6 +16,7 @@ "omnibox_input_type.proto", "perf_data.proto", "perf_stat.proto", + "printer_event.proto", "profiler_event.proto", "sampled_profile.proto", "system_profile.proto",
diff --git a/components/metrics/proto/chrome_user_metrics_extension.proto b/components/metrics/proto/chrome_user_metrics_extension.proto index 77950f9..aa930da5 100644 --- a/components/metrics/proto/chrome_user_metrics_extension.proto +++ b/components/metrics/proto/chrome_user_metrics_extension.proto
@@ -19,11 +19,12 @@ import "profiler_event.proto"; import "system_profile.proto"; import "translate_event.proto"; +import "printer_event.proto"; import "user_action_event.proto"; import "perf_data.proto"; import "sampled_profile.proto"; -// Next tag: 16 +// Next tag: 17 message ChromeUserMetricsExtension { // The product (i.e. end user application) for a given UMA log. enum Product { @@ -70,6 +71,7 @@ repeated HistogramEventProto histogram_event = 6; repeated ProfilerEventProto profiler_event = 7; repeated TranslateEventProto translate_event = 15; + repeated PrinterEventProto printer_event = 16; // This field is no longer used. Use |sampled_profile| instead. repeated PerfDataProto perf_data = 8 [deprecated=true];
diff --git a/components/metrics/proto/printer_event.proto b/components/metrics/proto/printer_event.proto new file mode 100644 index 0000000..1c49a57 --- /dev/null +++ b/components/metrics/proto/printer_event.proto
@@ -0,0 +1,64 @@ +// Copyright 2017 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. +// +// Stores information about printer configuration attempts. + +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; +option java_outer_classname = "PrinterEventProtos"; +option java_package = "org.chromium.components.metrics"; + +package metrics; + +// Stores information about a printer that a user is setting up/has attempted to +// set up. +// Next tag: 9 +message PrinterEventProto { + // The detected printer manufacuter name. + optional string usb_printer_manufacturer = 1; + + // The detected printer model name. + optional string usb_printer_model = 2; + + // The usb vendor id of the printer. + optional int32 usb_vendor_id = 3; + + // The usb model id of the printer. + optional int32 usb_model_id = 4; + + // The value reported as a printer's printer-make-and-model attribute. + optional string ipp_make_and_model = 5; + + // A true value means that the user provided their own PPD. + optional bool user_ppd = 6; + + // The identifier for PPDs from our serving system. + optional string ppd_identifier = 7; + + // The action for which the printer was logged. + // Next tag: 5 + enum EventType { + UNKNOWN = 0; + + // Specified printer successfully installed using the detected + // configuration. + SETUP_AUTOMATIC = 1; + + // Specified printer was installed when the user selected the appropriate + // configuration. + SETUP_MANUAL = 2; + + // Setup was started but abandoned when user was prompted to choose a + // configuration. + SETUP_ABANDONED = 3; + + // A printer, which had been successfully installed, was deleted from the + // user's preferences. + PRINTER_DELETED = 4; + } + + // The event for which this was recorded. + optional EventType event_type = 8; +}
diff --git a/components/net_log/chrome_net_log.cc b/components/net_log/chrome_net_log.cc index 509de9d1..8c845413 100644 --- a/components/net_log/chrome_net_log.cc +++ b/components/net_log/chrome_net_log.cc
@@ -4,12 +4,9 @@ #include "components/net_log/chrome_net_log.h" -#include <stdio.h> #include <utility> #include "base/command_line.h" -#include "base/files/scoped_file.h" -#include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/strings/stringprintf.h" #include "base/sys_info.h" @@ -18,9 +15,9 @@ #include "components/data_reduction_proxy/core/common/data_reduction_proxy_event_store.h" #include "components/net_log/net_export_file_writer.h" #include "components/version_info/version_info.h" +#include "net/log/file_net_log_observer.h" #include "net/log/net_log_util.h" #include "net/log/trace_net_log_observer.h" -#include "net/log/write_to_file_net_log_observer.h" namespace net_log { @@ -31,48 +28,22 @@ ChromeNetLog::~ChromeNetLog() { net_export_file_writer_.reset(); - // Remove the observers we own before we're destroyed. - if (write_to_file_observer_) - write_to_file_observer_->StopObserving(nullptr); - if (trace_net_log_observer_) - trace_net_log_observer_->StopWatchForTraceStart(); + ClearFileNetLogObserver(); + trace_net_log_observer_->StopWatchForTraceStart(); } void ChromeNetLog::StartWritingToFile( - const base::FilePath& log_file, - net::NetLogCaptureMode log_file_mode, + const base::FilePath& path, + net::NetLogCaptureMode capture_mode, const base::CommandLine::StringType& command_line_string, const std::string& channel_string) { - DCHECK(!log_file.empty()); + DCHECK(!path.empty()); - // TODO(716570): Use common code to write NetLog to file. + // TODO(739485): The log file does not contain about:flags data. + file_net_log_observer_ = net::FileNetLogObserver::CreateUnbounded( + path, GetConstants(command_line_string, channel_string)); - // Much like logging.h, bypass threading restrictions by using fopen - // directly. Have to write on a thread that's shutdown to handle events on - // shutdown properly, and posting events to another thread as they occur - // would result in an unbounded buffer size, so not much can be gained by - // doing this on another thread. It's only used when debugging Chrome, so - // performance is not a big concern. - base::ScopedFILE file; -#if defined(OS_WIN) - file.reset(_wfopen(log_file.value().c_str(), L"w")); -#elif defined(OS_POSIX) - file.reset(fopen(log_file.value().c_str(), "w")); -#endif - - if (!file) { - LOG(ERROR) << "Could not open file " << log_file.value() - << " for net logging"; - } else { - std::unique_ptr<base::Value> constants( - GetConstants(command_line_string, channel_string)); - write_to_file_observer_.reset(new net::WriteToFileNetLogObserver()); - - write_to_file_observer_->set_capture_mode(log_file_mode); - - write_to_file_observer_->StartObserving(this, std::move(file), - constants.get(), nullptr); - } + file_net_log_observer_->StartObserving(this, capture_mode); } NetExportFileWriter* ChromeNetLog::net_export_file_writer() { @@ -115,4 +86,29 @@ return std::move(constants_dict); } +void ChromeNetLog::ShutDownBeforeTaskScheduler() { + // TODO(eroman): Stop in-progress net_export_file_writer_ or delete its files? + + ClearFileNetLogObserver(); +} + +void ChromeNetLog::ClearFileNetLogObserver() { + if (!file_net_log_observer_) + return; + + // TODO(739487): The log file does not contain any polled data. + // + // TODO(eroman): FileNetLogObserver::StopObserving() posts to the file task + // runner to finish writing the log file. Despite that sequenced task runner + // being marked BLOCK_SHUTDOWN, those tasks are not actually running. + // + // This isn't a big deal when using the unbounded logger since the log + // loading code can handle such truncated logs. But this will need fixing + // if switching to log formats that are not so versatile (also if adding + // polled data). + file_net_log_observer_->StopObserving(nullptr /*polled_data*/, + base::Closure()); + file_net_log_observer_.reset(); +} + } // namespace net_log
diff --git a/components/net_log/chrome_net_log.h b/components/net_log/chrome_net_log.h index 42c0c2a..cfa0298 100644 --- a/components/net_log/chrome_net_log.h +++ b/components/net_log/chrome_net_log.h
@@ -18,7 +18,7 @@ } namespace net { -class WriteToFileNetLogObserver; +class FileNetLogObserver; class TraceNetLogObserver; } @@ -29,6 +29,10 @@ // ChromeNetLog is an implementation of NetLog that manages common observers // (for --log-net-log, chrome://net-export/, tracing), as well as acting as the // entry point for other consumers. +// +// Threading: +// * The methods on net::NetLog are threadsafe +// * The methods defined by ChromeNetLog must be sequenced. class ChromeNetLog : public net::NetLog { public: ChromeNetLog(); @@ -36,11 +40,11 @@ // Starts streaming the NetLog events to a file on disk. This will continue // until the application shuts down. - // * |log_file| - path to write the file. - // * |log_file_mode| - capture mode for event granularity. + // * |path| - destination file path of the log file. + // * |capture_mode| - capture mode for event granularity. void StartWritingToFile( - const base::FilePath& log_file, - net::NetLogCaptureMode log_file_mode, + const base::FilePath& path, + net::NetLogCaptureMode capture_mode, const base::CommandLine::StringType& command_line_string, const std::string& channel_string); @@ -52,9 +56,31 @@ const base::CommandLine::StringType& command_line_string, const std::string& channel_string); + // Notify the ChromeNetLog that things are shutting-down. + // + // If ChromeNetLog does not outlive the TaskScheduler, there is no need to + // call this. + // + // However, if it can outlive the TaskScheduler, this should be called + // before the TaskScheduler is shutdown. This allows for any file writers + // using BLOCK_SHUTDOWN to finish posting their writes. + // + // Not calling this is not a fatal error, however may result in an incomplete + // NetLog file being written to disk. + void ShutDownBeforeTaskScheduler(); + private: - std::unique_ptr<net::WriteToFileNetLogObserver> write_to_file_observer_; + // Deletes file_net_log_observer_. + void ClearFileNetLogObserver(); + + // This observer handles writing NetLogs specified via StartWritingToFile() + // (In Chrome this corresponds to the --log-net-log command line). + std::unique_ptr<net::FileNetLogObserver> file_net_log_observer_; + + // This observer handles writing NetLogs started by chrome://net-export/ std::unique_ptr<NetExportFileWriter> net_export_file_writer_; + + // This observer forwards NetLog events to the chrome://tracing system. std::unique_ptr<net::TraceNetLogObserver> trace_net_log_observer_; DISALLOW_COPY_AND_ASSIGN(ChromeNetLog);
diff --git a/components/net_log/net_export_file_writer.cc b/components/net_log/net_export_file_writer.cc index 07765ee..e20448d 100644 --- a/components/net_log/net_export_file_writer.cc +++ b/components/net_log/net_export_file_writer.cc
@@ -120,7 +120,7 @@ NetExportFileWriter::~NetExportFileWriter() { if (file_net_log_observer_) - file_net_log_observer_->StopObserving(nullptr, base::Bind([] {})); + file_net_log_observer_->StopObserving(nullptr, base::Closure()); } void NetExportFileWriter::AddObserver(StateObserver* observer) { @@ -184,9 +184,9 @@ std::unique_ptr<base::Value> constants( ChromeNetLog::GetConstants(command_line_string, channel_string)); - // Instantiate a FileNetLogObserver in unbounded mode. - file_net_log_observer_ = net::FileNetLogObserver::CreateUnbounded( - file_task_runner_, log_path_, std::move(constants)); + + file_net_log_observer_ = + net::FileNetLogObserver::CreateUnbounded(log_path_, std::move(constants)); net_task_runner_->PostTaskAndReply( FROM_HERE,
diff --git a/components/net_log/net_export_file_writer_unittest.cc b/components/net_log/net_export_file_writer_unittest.cc index 17f3b4b..cf61b07 100644 --- a/components/net_log/net_export_file_writer_unittest.cc +++ b/components/net_log/net_export_file_writer_unittest.cc
@@ -16,8 +16,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/json/json_reader.h" #include "base/json/json_string_value_serializer.h" -#include "base/message_loop/message_loop.h" -#include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" #include "base/values.h" @@ -437,8 +436,7 @@ TestStateObserver test_state_observer_; private: - // Allows tasks to be posted to the main thread. - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; }; TEST_F(NetExportFileWriterTest, InitFail) {
diff --git a/components/ntp_snippets/content_suggestions_service.cc b/components/ntp_snippets/content_suggestions_service.cc index e5a70bbe..1339cc1 100644 --- a/components/ntp_snippets/content_suggestions_service.cc +++ b/components/ntp_snippets/content_suggestions_service.cc
@@ -285,8 +285,8 @@ int minimum_size_in_pixel, int desired_size_in_pixel, const ImageFetchedCallback& callback, - bool success) { - if (!success) { + favicon_base::GoogleFaviconServerRequestStatus status) { + if (status != favicon_base::GoogleFaviconServerRequestStatus::SUCCESS) { callback.Run(gfx::Image()); RecordFaviconFetchResult(FaviconFetchResult::FAILURE); return;
diff --git a/components/ntp_snippets/content_suggestions_service.h b/components/ntp_snippets/content_suggestions_service.h index bf7b4ab..de03d6b 100644 --- a/components/ntp_snippets/content_suggestions_service.h +++ b/components/ntp_snippets/content_suggestions_service.h
@@ -350,7 +350,7 @@ int minimum_size_in_pixel, int desired_size_in_pixel, const ImageFetchedCallback& callback, - bool success); + favicon_base::GoogleFaviconServerRequestStatus status); // Whether the content suggestions feature is enabled. State state_;
diff --git a/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc b/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc index c0922eb..8751a33 100644 --- a/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc +++ b/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc
@@ -186,29 +186,62 @@ return base::TimeDelta::FromSecondsD(value_hours * 3600.0); } -void ReportTimeUntilFirstSoftTrigger(UserClassifier::UserClass user_class, - base::TimeDelta time_until_first_trigger) { +void ReportTimeUntilFirstShownTrigger( + UserClassifier::UserClass user_class, + base::TimeDelta time_until_first_shown_trigger) { switch (user_class) { case UserClassifier::UserClass::RARE_NTP_USER: UMA_HISTOGRAM_CUSTOM_TIMES( - "NewTabPage.ContentSuggestions.TimeUntilFirstSoftTrigger.RareNTPUser", - time_until_first_trigger, base::TimeDelta::FromSeconds(1), + "NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger." + "RareNTPUser", + time_until_first_shown_trigger, base::TimeDelta::FromSeconds(1), base::TimeDelta::FromDays(7), /*bucket_count=*/50); break; case UserClassifier::UserClass::ACTIVE_NTP_USER: UMA_HISTOGRAM_CUSTOM_TIMES( - "NewTabPage.ContentSuggestions.TimeUntilFirstSoftTrigger." + "NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger." "ActiveNTPUser", - time_until_first_trigger, base::TimeDelta::FromSeconds(1), + time_until_first_shown_trigger, base::TimeDelta::FromSeconds(1), base::TimeDelta::FromDays(7), /*bucket_count=*/50); break; case UserClassifier::UserClass::ACTIVE_SUGGESTIONS_CONSUMER: UMA_HISTOGRAM_CUSTOM_TIMES( - "NewTabPage.ContentSuggestions.TimeUntilFirstSoftTrigger." + "NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger." "ActiveSuggestionsConsumer", - time_until_first_trigger, base::TimeDelta::FromSeconds(1), + time_until_first_shown_trigger, base::TimeDelta::FromSeconds(1), + base::TimeDelta::FromDays(7), + /*bucket_count=*/50); + break; + } +} + +void ReportTimeUntilFirstStartupTrigger( + UserClassifier::UserClass user_class, + base::TimeDelta time_until_first_startup_trigger) { + switch (user_class) { + case UserClassifier::UserClass::RARE_NTP_USER: + UMA_HISTOGRAM_CUSTOM_TIMES( + "NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger." + "RareNTPUser", + time_until_first_startup_trigger, base::TimeDelta::FromSeconds(1), + base::TimeDelta::FromDays(7), + /*bucket_count=*/50); + break; + case UserClassifier::UserClass::ACTIVE_NTP_USER: + UMA_HISTOGRAM_CUSTOM_TIMES( + "NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger." + "ActiveNTPUser", + time_until_first_startup_trigger, base::TimeDelta::FromSeconds(1), + base::TimeDelta::FromDays(7), + /*bucket_count=*/50); + break; + case UserClassifier::UserClass::ACTIVE_SUGGESTIONS_CONSUMER: + UMA_HISTOGRAM_CUSTOM_TIMES( + "NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger." + "ActiveSuggestionsConsumer", + time_until_first_startup_trigger, base::TimeDelta::FromSeconds(1), base::TimeDelta::FromDays(7), /*bucket_count=*/50); break; @@ -413,7 +446,8 @@ profile_prefs, RequestThrottler::RequestType:: CONTENT_SUGGESTION_FETCHER_ACTIVE_SUGGESTIONS_CONSUMER), - time_until_first_trigger_reported_(false), + time_until_first_shown_trigger_reported_(false), + time_until_first_startup_trigger_reported_(false), eula_state_(base::MakeUnique<EulaState>(local_state_prefs, this)), profile_prefs_(profile_prefs), clock_(std::move(clock)), @@ -622,17 +656,25 @@ return; } - bool is_soft = trigger != TriggerType::PERSISTENT_SCHEDULER_WAKE_UP; const base::Time last_fetch_attempt_time = base::Time::FromInternalValue( profile_prefs_->GetInt64(prefs::kSnippetLastFetchAttempt)); - if (is_soft && !time_until_first_trigger_reported_) { - time_until_first_trigger_reported_ = true; - ReportTimeUntilFirstSoftTrigger(user_classifier_->GetUserClass(), - clock_->Now() - last_fetch_attempt_time); + if (trigger == TriggerType::NTP_OPENED && + !time_until_first_shown_trigger_reported_) { + time_until_first_shown_trigger_reported_ = true; + ReportTimeUntilFirstShownTrigger(user_classifier_->GetUserClass(), + clock_->Now() - last_fetch_attempt_time); } - if (is_soft && + if ((trigger == TriggerType::BROWSER_FOREGROUNDED || + trigger == TriggerType::BROWSER_COLD_START) && + !time_until_first_startup_trigger_reported_) { + time_until_first_startup_trigger_reported_ = true; + ReportTimeUntilFirstStartupTrigger(user_classifier_->GetUserClass(), + clock_->Now() - last_fetch_attempt_time); + } + + if (trigger != TriggerType::PERSISTENT_SCHEDULER_WAKE_UP && !ShouldRefetchInTheBackgroundNow(last_fetch_attempt_time, trigger)) { return; } @@ -736,7 +778,8 @@ void RemoteSuggestionsSchedulerImpl::OnFetchCompleted(Status fetch_status) { profile_prefs_->SetInt64(prefs::kSnippetLastFetchAttempt, clock_->Now().ToInternalValue()); - time_until_first_trigger_reported_ = false; + time_until_first_shown_trigger_reported_ = false; + time_until_first_startup_trigger_reported_ = false; // Reschedule after a fetch. The persistent schedule is applied only after a // successful fetch. After a failed fetch, we want to keep the previous
diff --git a/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.h b/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.h index 3e10362..8ded08f 100644 --- a/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.h +++ b/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.h
@@ -147,8 +147,10 @@ RequestThrottler request_throttler_active_ntp_user_; RequestThrottler request_throttler_active_suggestions_consumer_; - // To make sure we only report the first trigger to UMA. - bool time_until_first_trigger_reported_; + // Variables to make sure we only report the first trigger of each kind to + // UMA. + bool time_until_first_shown_trigger_reported_; + bool time_until_first_startup_trigger_reported_; // We should not fetch in background before EULA gets accepted. std::unique_ptr<EulaState> eula_state_;
diff --git a/components/ntp_tiles/BUILD.gn b/components/ntp_tiles/BUILD.gn index b0784a80..d970418 100644 --- a/components/ntp_tiles/BUILD.gn +++ b/components/ntp_tiles/BUILD.gn
@@ -36,9 +36,6 @@ "webui/ntp_tiles_internals_message_handler.h", "webui/ntp_tiles_internals_message_handler_client.cc", "webui/ntp_tiles_internals_message_handler_client.h", - "webui/popular_sites_internals_message_handler.cc", - "webui/popular_sites_internals_message_handler.h", - "webui/popular_sites_internals_message_handler_client.h", ] public_deps = [
diff --git a/components/ntp_tiles/icon_cacher_impl.cc b/components/ntp_tiles/icon_cacher_impl.cc index 0ae5160..48769f33 100644 --- a/components/ntp_tiles/icon_cacher_impl.cc +++ b/components/ntp_tiles/icon_cacher_impl.cc
@@ -249,10 +249,15 @@ weak_ptr_factory_.GetWeakPtr(), page_url)); } -void IconCacherImpl::OnMostLikelyFaviconDownloaded(const GURL& request_url, - bool success) { - UMA_HISTOGRAM_BOOLEAN("NewTabPage.TileFaviconFetchSuccess.Server", success); - FinishRequestAndNotifyIconAvailable(request_url, success); +void IconCacherImpl::OnMostLikelyFaviconDownloaded( + const GURL& request_url, + favicon_base::GoogleFaviconServerRequestStatus status) { + UMA_HISTOGRAM_ENUMERATION( + "NewTabPage.TileFaviconFetchStatus.Server", status, + favicon_base::GoogleFaviconServerRequestStatus::COUNT); + FinishRequestAndNotifyIconAvailable( + request_url, + status == favicon_base::GoogleFaviconServerRequestStatus::SUCCESS); } bool IconCacherImpl::StartRequest(const GURL& request_url,
diff --git a/components/ntp_tiles/icon_cacher_impl.h b/components/ntp_tiles/icon_cacher_impl.h index a124b2c..e15ceaf 100644 --- a/components/ntp_tiles/icon_cacher_impl.h +++ b/components/ntp_tiles/icon_cacher_impl.h
@@ -25,6 +25,7 @@ namespace favicon_base { struct FaviconImageResult; struct LargeIconResult; +enum class GoogleFaviconServerRequestStatus; } // namespace favicon_base namespace gfx { @@ -83,7 +84,9 @@ const GURL& page_url, const favicon_base::LargeIconResult& result); - void OnMostLikelyFaviconDownloaded(const GURL& request_url, bool success); + void OnMostLikelyFaviconDownloaded( + const GURL& request_url, + favicon_base::GoogleFaviconServerRequestStatus status); bool StartRequest(const GURL& request_url, const base::Closure& icon_available);
diff --git a/components/ntp_tiles/icon_cacher_impl_unittest.cc b/components/ntp_tiles/icon_cacher_impl_unittest.cc index 54f2fc2..2ce20e89 100644 --- a/components/ntp_tiles/icon_cacher_impl_unittest.cc +++ b/components/ntp_tiles/icon_cacher_impl_unittest.cc
@@ -20,6 +20,7 @@ #include "components/favicon/core/favicon_service_impl.h" #include "components/favicon/core/favicon_util.h" #include "components/favicon/core/large_icon_service.h" +#include "components/favicon_base/favicon_types.h" #include "components/history/core/browser/history_database_params.h" #include "components/history/core/browser/history_service.h" #include "components/image_fetcher/core/image_decoder.h" @@ -479,7 +480,7 @@ EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); EXPECT_THAT(histogram_tester.GetAllSamples( - "NewTabPage.TileFaviconFetchSuccess.Server"), + "NewTabPage.TileFaviconFetchStatus.Server"), IsEmpty()); } @@ -515,10 +516,12 @@ loop.Run(); EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); - EXPECT_THAT( - histogram_tester.GetAllSamples( - "NewTabPage.TileFaviconFetchSuccess.Server"), - ElementsAre(Bucket(/*bucket=*/true, /*count=*/1))); + EXPECT_THAT(histogram_tester.GetAllSamples( + "NewTabPage.TileFaviconFetchStatus.Server"), + ElementsAre(Bucket( + /*bucket=*/static_cast<int>( + favicon_base::GoogleFaviconServerRequestStatus::SUCCESS), + /*count=*/1))); } TEST_F(IconCacherTestMostLikely, NotCachedAndFetchFailed) { @@ -552,10 +555,13 @@ EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); - EXPECT_THAT( - histogram_tester.GetAllSamples( - "NewTabPage.TileFaviconFetchSuccess.Server"), - ElementsAre(Bucket(/*bucket=*/false, /*count=*/1))); + EXPECT_THAT(histogram_tester.GetAllSamples( + "NewTabPage.TileFaviconFetchStatus.Server"), + ElementsAre(Bucket( + /*bucket=*/static_cast<int>( + favicon_base::GoogleFaviconServerRequestStatus:: + FAILURE_CONNECTION_ERROR), + /*count=*/1))); } TEST_F(IconCacherTestMostLikely, HandlesEmptyCallbacksNicely) {
diff --git a/components/ntp_tiles/webui/popular_sites_internals_message_handler.cc b/components/ntp_tiles/webui/popular_sites_internals_message_handler.cc deleted file mode 100644 index 68cc2228..0000000 --- a/components/ntp_tiles/webui/popular_sites_internals_message_handler.cc +++ /dev/null
@@ -1,164 +0,0 @@ -// Copyright 2016 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 "components/ntp_tiles/webui/popular_sites_internals_message_handler.h" - -#include "base/bind.h" -#include "base/callback.h" -#include "base/json/json_writer.h" -#include "base/logging.h" -#include "base/memory/ptr_util.h" -#include "base/values.h" -#include "components/ntp_tiles/popular_sites.h" -#include "components/ntp_tiles/pref_names.h" -#include "components/ntp_tiles/webui/popular_sites_internals_message_handler_client.h" -#include "components/prefs/pref_service.h" -#include "components/url_formatter/url_fixer.h" -#include "url/gurl.h" - -namespace ntp_tiles { - -PopularSitesInternalsMessageHandlerClient:: - PopularSitesInternalsMessageHandlerClient() = default; -PopularSitesInternalsMessageHandlerClient:: - ~PopularSitesInternalsMessageHandlerClient() = default; - -PopularSitesInternalsMessageHandler::PopularSitesInternalsMessageHandler( - PopularSitesInternalsMessageHandlerClient* web_ui) - : web_ui_(web_ui), weak_ptr_factory_(this) {} - -PopularSitesInternalsMessageHandler::~PopularSitesInternalsMessageHandler() = - default; - -void PopularSitesInternalsMessageHandler::RegisterMessages() { - web_ui_->RegisterMessageCallback( - "registerForEvents", - base::Bind(&PopularSitesInternalsMessageHandler::HandleRegisterForEvents, - base::Unretained(this))); - - web_ui_->RegisterMessageCallback( - "update", base::Bind(&PopularSitesInternalsMessageHandler::HandleUpdate, - base::Unretained(this))); - - web_ui_->RegisterMessageCallback( - "viewJson", - base::Bind(&PopularSitesInternalsMessageHandler::HandleViewJson, - base::Unretained(this))); -} - -void PopularSitesInternalsMessageHandler::HandleRegisterForEvents( - const base::ListValue* args) { - DCHECK(args->empty()); - - SendOverrides(); - - popular_sites_ = web_ui_->MakePopularSites(); - SendSites(); -} - -void PopularSitesInternalsMessageHandler::HandleUpdate( - const base::ListValue* args) { - DCHECK_EQ(4u, args->GetSize()); - - PrefService* prefs = web_ui_->GetPrefs(); - - std::string url; - args->GetString(0, &url); - if (url.empty()) - prefs->ClearPref(ntp_tiles::prefs::kPopularSitesOverrideURL); - else - prefs->SetString(ntp_tiles::prefs::kPopularSitesOverrideURL, - url_formatter::FixupURL(url, std::string()).spec()); - - std::string directory; - args->GetString(1, &directory); - if (directory.empty()) - prefs->ClearPref(ntp_tiles::prefs::kPopularSitesOverrideDirectory); - else - prefs->SetString(ntp_tiles::prefs::kPopularSitesOverrideDirectory, - directory); - - std::string country; - args->GetString(2, &country); - if (country.empty()) - prefs->ClearPref(ntp_tiles::prefs::kPopularSitesOverrideCountry); - else - prefs->SetString(ntp_tiles::prefs::kPopularSitesOverrideCountry, country); - - std::string version; - args->GetString(3, &version); - if (version.empty()) - prefs->ClearPref(ntp_tiles::prefs::kPopularSitesOverrideVersion); - else - prefs->SetString(ntp_tiles::prefs::kPopularSitesOverrideVersion, version); - - popular_sites_ = web_ui_->MakePopularSites(); - popular_sites_->MaybeStartFetch( - true, - base::Bind(&PopularSitesInternalsMessageHandler::OnPopularSitesAvailable, - base::Unretained(this))); -} - -void PopularSitesInternalsMessageHandler::HandleViewJson( - const base::ListValue* args) { - DCHECK_EQ(0u, args->GetSize()); - - const base::ListValue* json = popular_sites_->GetCachedJson(); - std::string json_string; - if (json) { - bool success = base::JSONWriter::Write(*json, &json_string); - DCHECK(success); - } - SendJson(json_string); -} - -void PopularSitesInternalsMessageHandler::SendOverrides() { - PrefService* prefs = web_ui_->GetPrefs(); - std::string url = - prefs->GetString(ntp_tiles::prefs::kPopularSitesOverrideURL); - std::string directory = - prefs->GetString(ntp_tiles::prefs::kPopularSitesOverrideDirectory); - std::string country = - prefs->GetString(ntp_tiles::prefs::kPopularSitesOverrideCountry); - std::string version = - prefs->GetString(ntp_tiles::prefs::kPopularSitesOverrideVersion); - web_ui_->CallJavascriptFunction( - "chrome.popular_sites_internals.receiveOverrides", base::Value(url), - base::Value(directory), base::Value(country), base::Value(version)); -} - -void PopularSitesInternalsMessageHandler::SendDownloadResult(bool success) { - base::Value result(success ? "Success" : "Fail"); - web_ui_->CallJavascriptFunction( - "chrome.popular_sites_internals.receiveDownloadResult", result); -} - -void PopularSitesInternalsMessageHandler::SendSites() { - auto sites_list = base::MakeUnique<base::ListValue>(); - for (const PopularSites::Site& site : popular_sites_->sites()) { - auto entry = base::MakeUnique<base::DictionaryValue>(); - entry->SetString("title", site.title); - entry->SetString("url", site.url.spec()); - sites_list->Append(std::move(entry)); - } - - base::DictionaryValue result; - result.Set("sites", std::move(sites_list)); - result.SetString("url", popular_sites_->GetLastURLFetched().spec()); - web_ui_->CallJavascriptFunction("chrome.popular_sites_internals.receiveSites", - result); -} - -void PopularSitesInternalsMessageHandler::SendJson(const std::string& json) { - web_ui_->CallJavascriptFunction("chrome.popular_sites_internals.receiveJson", - base::Value(json)); -} - -void PopularSitesInternalsMessageHandler::OnPopularSitesAvailable( - bool success) { - SendDownloadResult(success); - SendSites(); -} - -} // namespace ntp_tiles
diff --git a/components/ntp_tiles/webui/popular_sites_internals_message_handler.h b/components/ntp_tiles/webui/popular_sites_internals_message_handler.h deleted file mode 100644 index c0e05d0..0000000 --- a/components/ntp_tiles/webui/popular_sites_internals_message_handler.h +++ /dev/null
@@ -1,64 +0,0 @@ -// Copyright 2016 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 COMPONENTS_NTP_TILES_WEBUI_POPULAR_SITES_HANDLER_H_ -#define COMPONENTS_NTP_TILES_WEBUI_POPULAR_SITES_HANDLER_H_ - -#include <memory> -#include <string> - -#include "base/macros.h" -#include "base/memory/weak_ptr.h" - -namespace base { -class ListValue; -} // namespace base - -namespace ntp_tiles { - -class PopularSites; -class PopularSitesInternalsMessageHandlerClient; - -// Implements the WebUI message handler for chrome://popular-sites-internals/ -// -// Because content and iOS use different implementations of WebUI, this class -// implements the generic portion and depends on the embedder to inject a bridge -// to the embedder's API. It cannot itself implement either API directly. -class PopularSitesInternalsMessageHandler { - public: - explicit PopularSitesInternalsMessageHandler( - PopularSitesInternalsMessageHandlerClient* web_ui); - ~PopularSitesInternalsMessageHandler(); - - // Called when the WebUI page's JavaScript has loaded and it is ready to - // receive RegisterMessageCallback() calls. - void RegisterMessages(); - - private: - // Callbacks registered in RegisterMessages(). - void HandleRegisterForEvents(const base::ListValue* args); - void HandleUpdate(const base::ListValue* args); - void HandleViewJson(const base::ListValue* args); - - void SendOverrides(); - void SendDownloadResult(bool success); - void SendSites(); - void SendJson(const std::string& json); - - // Completion handler for popular_sites_->StartFetch(). - void OnPopularSitesAvailable(bool success); - - // Bridge to embedder's API. - PopularSitesInternalsMessageHandlerClient* web_ui_; - - std::unique_ptr<PopularSites> popular_sites_; - - base::WeakPtrFactory<PopularSitesInternalsMessageHandler> weak_ptr_factory_; - - DISALLOW_COPY_AND_ASSIGN(PopularSitesInternalsMessageHandler); -}; - -} // namespace ntp_tiles - -#endif // COMPONENTS_NTP_TILES_WEBUI_POPULAR_SITES_HANDLER_H_
diff --git a/components/ntp_tiles/webui/popular_sites_internals_message_handler_client.h b/components/ntp_tiles/webui/popular_sites_internals_message_handler_client.h deleted file mode 100644 index 43368f8..0000000 --- a/components/ntp_tiles/webui/popular_sites_internals_message_handler_client.h +++ /dev/null
@@ -1,61 +0,0 @@ -// Copyright 2016 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 COMPONENTS_NTP_TILES_WEBUI_POPULAR_SITES_HANDLER_CLIENT_H_ -#define COMPONENTS_NTP_TILES_WEBUI_POPULAR_SITES_HANDLER_CLIENT_H_ - -#include <memory> -#include <string> -#include <vector> - -#include "base/callback_forward.h" -#include "base/macros.h" - -class PrefService; - -namespace base { -class Value; -class ListValue; -} // namespace base - -namespace ntp_tiles { - -class PopularSites; - -// Implemented by embedders to hook up PopularSitesInternalsMessageHandler. -class PopularSitesInternalsMessageHandlerClient { - public: - // Returns the PrefService for the embedder and containing WebUI page. - virtual PrefService* GetPrefs() = 0; - - // Creates a new PopularSites based on the context pf the WebUI page. - virtual std::unique_ptr<ntp_tiles::PopularSites> MakePopularSites() = 0; - - // Registers a callback in Javascript. See content::WebUI and web::WebUIIOS. - virtual void RegisterMessageCallback( - const std::string& message, - const base::Callback<void(const base::ListValue*)>& callback) = 0; - - // Invokes a function in Javascript. See content::WebUI and web::WebUIIOS. - virtual void CallJavascriptFunctionVector( - const std::string& name, - const std::vector<const base::Value*>& values) = 0; - - // Helper function for CallJavascriptFunctionVector(). - template <typename... Arg> - void CallJavascriptFunction(const std::string& name, const Arg&... arg) { - CallJavascriptFunctionVector(name, {&arg...}); - } - - protected: - PopularSitesInternalsMessageHandlerClient(); - virtual ~PopularSitesInternalsMessageHandlerClient(); - - private: - DISALLOW_COPY_AND_ASSIGN(PopularSitesInternalsMessageHandlerClient); -}; - -} // namespace ntp_tiles - -#endif // COMPONENTS_NTP_TILES_WEBUI_POPULAR_SITES_HANDLER_CLIENT_H_
diff --git a/components/ntp_tiles/webui/resources/popular_sites_internals.css b/components/ntp_tiles/webui/resources/popular_sites_internals.css deleted file mode 100644 index ee4c1d4..0000000 --- a/components/ntp_tiles/webui/resources/popular_sites_internals.css +++ /dev/null
@@ -1,48 +0,0 @@ -/* Copyright 2015 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. */ - -html { - font-size: 20px; -} - -#info > div { - width: 100%; -} - -#info h2 { - color: rgb(74, 142, 230); - font-size: 100%; - margin-bottom: 0; -} - -#info .err { - color: red; -} - -#info .section { - display: inline-block; - margin-left: auto; - margin-right: auto; -} - -#info .section.hidden { - display: none; -} - -.section-details { - width: 100%; -} - -.section-details .detail, -.section-details .value { - width: 50%; -} - -.section-details tr:nth-child(odd) { - background: rgb(239, 243, 255); -} - -#json-value { - font-size: 75%; -}
diff --git a/components/ntp_tiles/webui/resources/popular_sites_internals.html b/components/ntp_tiles/webui/resources/popular_sites_internals.html deleted file mode 100644 index 5ce97bcf..0000000 --- a/components/ntp_tiles/webui/resources/popular_sites_internals.html +++ /dev/null
@@ -1,86 +0,0 @@ -<!-- -Copyright 2015 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. ---> -<!DOCTYPE html> -<html> -<head> -<meta charset="utf-8"> -<if expr="is_android or is_ios"> -<meta name="viewport" content="width=device-width, initial-scale=1.0"> -</if> -<title>Popular Sites Internals</title> -<link rel="stylesheet" href="chrome://resources/css/text_defaults.css"> -<link rel="stylesheet" href="chrome://resources/css/list.css"> -<link rel="stylesheet" href="popular_sites_internals.css"> -<script src="chrome://resources/js/cr.js"></script> -<script src="chrome://resources/js/jstemplate_compiled.js"></script> -<script src="chrome://resources/js/load_time_data.js"></script> -<script src="chrome://resources/js/util.js"></script> -<if expr="is_ios"> -<!-- TODO(crbug.com/487000): Remove this once injected by web. --> -<script src="chrome://resources/js/ios/web_ui.js"></script> -</if> -<script src="popular_sites_internals.js"></script> -</head> - -<body> -<div id="info"> - <div class="section" jsskip="true"> - <h2>Download</h2> - <table class="section-details"> - <tr> - <td class="detail">URL (takes precedence over Directory, Country and Version)</td> - <td class="value"><input id="override-url" type="text"></td> - </tr> - <tr> - <td class="detail">Override Directory</td> - <td class="value"><input id="override-directory" type="text"></td> - </tr> - <tr> - <td class="detail">Override Country</td> - <td class="value"><input id="override-country" type="text"></td> - </tr> - <tr> - <td class="detail">Override Version</td> - <td class="value"><input id="override-version" type="text"></td> - </tr> - <tr> - <td class="detail"> - <input id="submit-update" type="submit" value="Update"> - </td> - <td id="download-result" class="value"></td> - </tr> - </table> - </div> - - <div class="section"> - <h2>Info</h2> - <table class="section-details"> - <tr> - <td class="detail">URL</td> - <td class="value" jscontent="url"></td> - </tr> - </table> - </div> - - <div class="section"> - <h2>Sites</h2> - <table class="section-details"> - <tr jsselect="sites"> - <td class="detail" jscontent="title"></td> - <td class="value" jscontent="url"></td> - </tr> - <tr jsskip="true"> - <td class="detail"> - <input id="view-json" type="submit" value="View JSON"> - </td> - <td class="value"><pre id="json-value"></pre></td> - </tr> - </table> - </div> -</div> - -</body> -</html>
diff --git a/components/ntp_tiles/webui/resources/popular_sites_internals.js b/components/ntp_tiles/webui/resources/popular_sites_internals.js deleted file mode 100644 index 3bfcf8b..0000000 --- a/components/ntp_tiles/webui/resources/popular_sites_internals.js +++ /dev/null
@@ -1,63 +0,0 @@ -// Copyright 2015 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. - -cr.define('chrome.popular_sites_internals', function() { - 'use strict'; - - function initialize() { - function submitUpdate(event) { - $('download-result').textContent = ''; - chrome.send('update', [$('override-url').value, - $('override-directory').value, - $('override-country').value, - $('override-version').value]); - event.preventDefault(); - } - - $('submit-update').addEventListener('click', submitUpdate); - - function viewJson(event) { - $('json-value').textContent = ''; - chrome.send('viewJson'); - event.preventDefault(); - } - - $('view-json').addEventListener('click', viewJson); - - chrome.send('registerForEvents'); - } - - function receiveOverrides(url, directory, country, version) { - $('override-url').value = url; - $('override-directory').value = directory; - $('override-country').value = country; - $('override-version').value = version; - } - - function receiveDownloadResult(result) { - $('download-result').textContent = result; - } - - function receiveSites(sites) { - jstProcess(new JsEvalContext(sites), $('info')); - // Also clear the json string, since it's likely stale now. - $('json-value').textContent = ''; - } - - function receiveJson(json) { - $('json-value').textContent = json; - } - - // Return an object with all of the exports. - return { - initialize: initialize, - receiveOverrides: receiveOverrides, - receiveDownloadResult: receiveDownloadResult, - receiveSites: receiveSites, - receiveJson: receiveJson, - }; -}); - -document.addEventListener('DOMContentLoaded', - chrome.popular_sites_internals.initialize);
diff --git a/components/resources/ntp_tiles_resources.grdp b/components/resources/ntp_tiles_resources.grdp index 7d8d6c0a..9367081 100644 --- a/components/resources/ntp_tiles_resources.grdp +++ b/components/resources/ntp_tiles_resources.grdp
@@ -1,9 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <grit-part> <if expr="is_android or is_ios"> - <include name="IDR_POPULAR_SITES_INTERNALS_HTML" file="../ntp_tiles/webui/resources/popular_sites_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" /> - <include name="IDR_POPULAR_SITES_INTERNALS_JS" file="../ntp_tiles/webui/resources/popular_sites_internals.js" type="BINDATA" /> - <include name="IDR_POPULAR_SITES_INTERNALS_CSS" file="../ntp_tiles/webui/resources/popular_sites_internals.css" type="BINDATA" /> <if expr="_google_chrome"> <then> <include name="IDR_DEFAULT_POPULAR_SITES_JSON" file="../ntp_tiles/resources/internal/default_popular_sites.json" type="BINDATA" />
diff --git a/components/search_provider_logos/BUILD.gn b/components/search_provider_logos/BUILD.gn index da7b796..7b9909e1 100644 --- a/components/search_provider_logos/BUILD.gn +++ b/components/search_provider_logos/BUILD.gn
@@ -4,6 +4,8 @@ static_library("search_provider_logos") { sources = [ + "features.cc", + "features.h", "fixed_logo_api.cc", "fixed_logo_api.h", "google_logo_api.cc", @@ -34,6 +36,7 @@ source_set("unit_tests") { testonly = true sources = [ + "google_logo_api_unittest.cc", "logo_cache_unittest.cc", "logo_tracker_unittest.cc", ]
diff --git a/components/search_provider_logos/features.cc b/components/search_provider_logos/features.cc new file mode 100644 index 0000000..1326c7f --- /dev/null +++ b/components/search_provider_logos/features.cc
@@ -0,0 +1,14 @@ +// Copyright 2017 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 "components/search_provider_logos/features.h" + +namespace search_provider_logos { +namespace features { + +const base::Feature kUseDdljsonApi{"UseDdljsonApi", + base::FEATURE_DISABLED_BY_DEFAULT}; + +} // namespace features +} // namespace search_provider_logos
diff --git a/components/search_provider_logos/features.h b/components/search_provider_logos/features.h new file mode 100644 index 0000000..05c46e5e --- /dev/null +++ b/components/search_provider_logos/features.h
@@ -0,0 +1,18 @@ +// Copyright 2017 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 COMPONENTS_SEARCH_PROVIDER_LOGOS_FEATURES_H_ +#define COMPONENTS_SEARCH_PROVIDER_LOGOS_FEATURES_H_ + +#include "base/feature_list.h" + +namespace search_provider_logos { +namespace features { + +extern const base::Feature kUseDdljsonApi; + +} // namespace features +} // namespace search_provider_logos + +#endif // COMPONENTS_SEARCH_PROVIDER_LOGOS_FEATURES_H_
diff --git a/components/search_provider_logos/google_logo_api.cc b/components/search_provider_logos/google_logo_api.cc index 91d8218d..2750c90 100644 --- a/components/search_provider_logos/google_logo_api.cc +++ b/components/search_provider_logos/google_logo_api.cc
@@ -9,21 +9,51 @@ #include <algorithm> #include "base/base64.h" +#include "base/bind.h" +#include "base/callback.h" +#include "base/feature_list.h" #include "base/json/json_reader.h" +#include "base/memory/ptr_util.h" +#include "base/memory/ref_counted.h" #include "base/memory/ref_counted_memory.h" #include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/values.h" +#include "components/search_provider_logos/features.h" +#include "url/url_constants.h" namespace search_provider_logos { +GURL GetGoogleDoodleURL(const GURL& google_base_url) { + GURL::Replacements replacements; + replacements.SetPathStr(base::FeatureList::IsEnabled(features::kUseDdljsonApi) + ? "async/ddljson" + : "async/newtab_mobile"); + return google_base_url.ReplaceComponents(replacements); +} + +AppendQueryparamsToLogoURL GetGoogleAppendQueryparamsCallback( + bool gray_background) { + if (base::FeatureList::IsEnabled(features::kUseDdljsonApi)) + return base::Bind(&GoogleNewAppendQueryparamsToLogoURL, gray_background); + + return base::Bind(&GoogleLegacyAppendQueryparamsToLogoURL, gray_background); +} + +ParseLogoResponse GetGoogleParseLogoResponseCallback(const GURL& base_url) { + if (base::FeatureList::IsEnabled(features::kUseDdljsonApi)) + return base::Bind(&GoogleNewParseLogoResponse, base_url); + + return base::Bind(&GoogleLegacyParseLogoResponse); +} + namespace { const char kResponsePreamble[] = ")]}'"; } -GURL GoogleAppendQueryparamsToLogoURL(bool gray_background, - const GURL& logo_url, - const std::string& fingerprint) { +GURL GoogleLegacyAppendQueryparamsToLogoURL(bool gray_background, + const GURL& logo_url, + const std::string& fingerprint) { // Note: we can't just use net::AppendQueryParameter() because it escapes // ":" to "%3A", but the server requires the colon not to be escaped. // See: http://crbug.com/413845 @@ -55,7 +85,7 @@ return logo_url.ReplaceComponents(replacements); } -std::unique_ptr<EncodedLogo> GoogleParseLogoResponse( +std::unique_ptr<EncodedLogo> GoogleLegacyParseLogoResponse( std::unique_ptr<std::string> response, base::Time response_time, bool* parsing_failed) { @@ -147,4 +177,158 @@ return logo; } +GURL GoogleNewAppendQueryparamsToLogoURL(bool gray_background, + const GURL& logo_url, + const std::string& fingerprint) { + // Note: we can't just use net::AppendQueryParameter() because it escapes + // ":" to "%3A", but the server requires the colon not to be escaped. + // See: http://crbug.com/413845 + + std::string query(logo_url.query()); + if (!query.empty()) + query += "&"; + + query += "async="; + + std::vector<base::StringPiece> params; + params.push_back("ntp:1"); + if (gray_background) { + params.push_back("graybg:1"); + } + if (!fingerprint.empty()) { + params.push_back("es_dfp:" + fingerprint); + } + query += base::JoinString(params, ","); + + GURL::Replacements replacements; + replacements.SetQueryStr(query); + return logo_url.ReplaceComponents(replacements); +} + +namespace { + +GURL ParseUrl(const base::DictionaryValue& parent_dict, + const std::string& key, + const GURL& base_url) { + std::string url_str; + if (!parent_dict.GetString(key, &url_str) || url_str.empty()) { + return GURL(); + } + return base_url.Resolve(url_str); +} + +} // namespace + +std::unique_ptr<EncodedLogo> GoogleNewParseLogoResponse( + const GURL& base_url, + std::unique_ptr<std::string> response, + base::Time response_time, + bool* parsing_failed) { + // The response may start with )]}'. Ignore this. + base::StringPiece response_sp(*response); + if (response_sp.starts_with(kResponsePreamble)) + response_sp.remove_prefix(strlen(kResponsePreamble)); + + // Default parsing failure to be true. + *parsing_failed = true; + + int error_code; + std::string error_string; + int error_line; + int error_col; + std::unique_ptr<base::Value> value = base::JSONReader::ReadAndReturnError( + response_sp, 0, &error_code, &error_string, &error_line, &error_col); + if (!value) { + LOG(WARNING) << error_string << " at " << error_line << ":" << error_col; + return nullptr; + } + + std::unique_ptr<base::DictionaryValue> config = + base::DictionaryValue::From(std::move(value)); + if (!config) + return nullptr; + + const base::DictionaryValue* ddljson = nullptr; + if (!config->GetDictionary("ddljson", &ddljson)) + return nullptr; + + // If there is no logo today, the "ddljson" dictionary will be empty. + if (ddljson->empty()) { + *parsing_failed = false; + return nullptr; + } + + auto logo = base::MakeUnique<EncodedLogo>(); + + // Check if the main image is animated. + bool is_animated = false; + const base::DictionaryValue* image = nullptr; + if (ddljson->GetDictionary("large_image", &image)) { + image->GetBoolean("is_animated", &is_animated); + + // If animated, get the URL for the animated image. + if (is_animated) { + GURL animated_url = ParseUrl(*image, "url", base_url); + if (!animated_url.is_valid()) + return nullptr; + logo->metadata.animated_url = animated_url.spec(); + } + } + + // Data is optional, since we may be revalidating a cached logo. + // If this is an animated doodle, get the CTA image data. + std::string encoded_image_data; + if (ddljson->GetString(is_animated ? "cta_data_uri" : "data_uri", + &encoded_image_data)) { + GURL encoded_image_uri(encoded_image_data); + if (!encoded_image_uri.is_valid() || + !encoded_image_uri.SchemeIs(url::kDataScheme)) { + return nullptr; + } + std::string content = encoded_image_uri.GetContent(); + // The content should look like this: "image/png;base64,aaa..." (where + // "aaa..." is the base64-encoded image data). + size_t mime_type_end = content.find_first_of(';'); + if (mime_type_end == std::string::npos) + return nullptr; + logo->metadata.mime_type = content.substr(0, mime_type_end); + + size_t base64_begin = mime_type_end + 1; + size_t base64_end = content.find_first_of(',', base64_begin); + if (base64_end == std::string::npos) + return nullptr; + base::StringPiece base64(content.begin() + base64_begin, + content.begin() + base64_end); + if (base64 != "base64") + return nullptr; + + size_t data_begin = base64_end + 1; + base::StringPiece data(content.begin() + data_begin, content.end()); + logo->encoded_image = base::MakeRefCounted<base::RefCountedString>(); + if (!base::Base64Decode(data, &logo->encoded_image->data())) + return nullptr; + } + + logo->metadata.on_click_url = + ParseUrl(*ddljson, "target_url", base_url).spec(); + ddljson->GetString("alt_text", &logo->metadata.alt_text); + + ddljson->GetString("fingerprint", &logo->metadata.fingerprint); + + base::TimeDelta time_to_live; + // The JSON doesn't guarantee the number to fit into an int. + double ttl_ms = 0; // Expires immediately if the parameter is missing. + if (ddljson->GetDouble("time_to_live_ms", &ttl_ms)) { + time_to_live = base::TimeDelta::FromMillisecondsD(ttl_ms); + logo->metadata.can_show_after_expiration = false; + } else { + time_to_live = base::TimeDelta::FromMilliseconds(kMaxTimeToLiveMS); + logo->metadata.can_show_after_expiration = true; + } + logo->metadata.expiration_time = response_time + time_to_live; + + *parsing_failed = false; + return logo; +} + } // namespace search_provider_logos
diff --git a/components/search_provider_logos/google_logo_api.h b/components/search_provider_logos/google_logo_api.h index d5f85c7..3c3929e 100644 --- a/components/search_provider_logos/google_logo_api.h +++ b/components/search_provider_logos/google_logo_api.h
@@ -14,14 +14,40 @@ namespace search_provider_logos { -// Implements AppendFingerprintToLogoURL, defined in logo_tracker.h, for Google -// doodles. -GURL GoogleAppendQueryparamsToLogoURL(bool gray_background, - const GURL& logo_url, - const std::string& fingerprint); +// Returns the URL where the doodle can be downloaded, e.g. +// https://www.google.com/async/newtab_mobile. This depends on the user's +// Google domain. +GURL GetGoogleDoodleURL(const GURL& google_base_url); -// Implements ParseLogoResponse, defined in logo_tracker.h, for Google doodles. -std::unique_ptr<EncodedLogo> GoogleParseLogoResponse( +// These return the correct callbacks for appending queryparams and parsing the +// response ("Legacy" or "New"), based on the value of features::kUseDdljsonApi. +AppendQueryparamsToLogoURL GetGoogleAppendQueryparamsCallback( + bool gray_background); +ParseLogoResponse GetGoogleParseLogoResponseCallback(const GURL& base_url); + +// Implements AppendQueryparamsToLogoURL, defined in logo_tracker.h, for Google +// doodles (old newtab_mobile API). +GURL GoogleLegacyAppendQueryparamsToLogoURL(bool gray_background, + const GURL& logo_url, + const std::string& fingerprint); + +// Implements ParseLogoResponse, defined in logo_tracker.h, for Google doodles +// (old newtab_mobile API). +std::unique_ptr<EncodedLogo> GoogleLegacyParseLogoResponse( + std::unique_ptr<std::string> response, + base::Time response_time, + bool* parsing_failed); + +// Implements AppendQueryparamsToLogoURL, defined in logo_tracker.h, for Google +// doodles (new ddljson API). +GURL GoogleNewAppendQueryparamsToLogoURL(bool gray_background, + const GURL& logo_url, + const std::string& fingerprint); + +// Implements ParseLogoResponse, defined in logo_tracker.h, for Google doodles +// (new ddljson API). +std::unique_ptr<EncodedLogo> GoogleNewParseLogoResponse( + const GURL& base_url, std::unique_ptr<std::string> response, base::Time response_time, bool* parsing_failed);
diff --git a/components/search_provider_logos/google_logo_api_unittest.cc b/components/search_provider_logos/google_logo_api_unittest.cc new file mode 100644 index 0000000..221ee31 --- /dev/null +++ b/components/search_provider_logos/google_logo_api_unittest.cc
@@ -0,0 +1,100 @@ +// Copyright 2017 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 "components/search_provider_logos/google_logo_api.h" + +#include <memory> +#include <string> + +#include "base/memory/ptr_util.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +using testing::Eq; + +namespace search_provider_logos { + +TEST(GoogleNewLogoApiTest, ResolvesRelativeUrl) { + const GURL base_url("https://base.doo/"); + const std::string json = R"json()]}' +{ + "ddljson": { + "target_url": "/target" + } +})json"; + + bool failed = false; + std::unique_ptr<EncodedLogo> logo = GoogleNewParseLogoResponse( + base_url, base::MakeUnique<std::string>(json), base::Time(), &failed); + + ASSERT_FALSE(failed); + ASSERT_TRUE(logo); + EXPECT_EQ("https://base.doo/target", logo->metadata.on_click_url); +} + +TEST(GoogleNewLogoApiTest, DoesNotResolveAbsoluteUrl) { + const GURL base_url("https://base.doo/"); + const std::string json = R"json()]}' +{ + "ddljson": { + "target_url": "https://www.doodle.com/target" + } +})json"; + + bool failed = false; + std::unique_ptr<EncodedLogo> logo = GoogleNewParseLogoResponse( + base_url, base::MakeUnique<std::string>(json), base::Time(), &failed); + + ASSERT_FALSE(failed); + ASSERT_TRUE(logo); + EXPECT_EQ("https://www.doodle.com/target", logo->metadata.on_click_url); +} + +TEST(GoogleNewLogoApiTest, ParsesStaticImage) { + const GURL base_url("https://base.doo/"); + // Note: The base64 encoding of "abc" is "YWJj". + const std::string json = R"json()]}' +{ + "ddljson": { + "target_url": "/target", + "data_uri": "data:image/png;base64,YWJj" + } +})json"; + + bool failed = false; + std::unique_ptr<EncodedLogo> logo = GoogleNewParseLogoResponse( + base_url, base::MakeUnique<std::string>(json), base::Time(), &failed); + + ASSERT_FALSE(failed); + ASSERT_TRUE(logo); + EXPECT_EQ("abc", logo->encoded_image->data()); +} + +TEST(GoogleNewLogoApiTest, ParsesAnimatedImage) { + const GURL base_url("https://base.doo/"); + // Note: The base64 encoding of "abc" is "YWJj". + const std::string json = R"json()]}' +{ + "ddljson": { + "target_url": "/target", + "large_image": { + "is_animated": true, + "url": "https://www.doodle.com/image.gif" + }, + "cta_data_uri": "data:image/png;base64,YWJj" + } +})json"; + + bool failed = false; + std::unique_ptr<EncodedLogo> logo = GoogleNewParseLogoResponse( + base_url, base::MakeUnique<std::string>(json), base::Time(), &failed); + + ASSERT_FALSE(failed); + ASSERT_TRUE(logo); + EXPECT_EQ("https://www.doodle.com/image.gif", logo->metadata.animated_url); + EXPECT_EQ("abc", logo->encoded_image->data()); +} + +} // namespace search_provider_logos
diff --git a/components/search_provider_logos/logo_common.h b/components/search_provider_logos/logo_common.h index ce94005f..fbb3a9c 100644 --- a/components/search_provider_logos/logo_common.h +++ b/components/search_provider_logos/logo_common.h
@@ -7,13 +7,17 @@ #include <stdint.h> +#include <memory> #include <string> +#include "base/callback_forward.h" #include "base/memory/ref_counted.h" #include "base/memory/ref_counted_memory.h" #include "base/time/time.h" #include "third_party/skia/include/core/SkBitmap.h" +class GURL; + namespace search_provider_logos { // The maximum number of milliseconds that a logo can be cached. @@ -73,6 +77,18 @@ LogoMetadata metadata; }; +// Parses the response from the server and returns it as an EncodedLogo. Returns +// null if the response is invalid. +using ParseLogoResponse = base::Callback<std::unique_ptr<EncodedLogo>( + std::unique_ptr<std::string> response, + base::Time response_time, + bool* parsing_failed)>; + +// Encodes the fingerprint of the cached logo in the logo URL. This enables the +// server to verify whether the cached logo is up to date. +using AppendQueryparamsToLogoURL = + base::Callback<GURL(const GURL& logo_url, const std::string& fingerprint)>; + } // namespace search_provider_logos #endif // COMPONENTS_SEARCH_PROVIDER_LOGOS_LOGO_COMMON_H_
diff --git a/components/search_provider_logos/logo_tracker.h b/components/search_provider_logos/logo_tracker.h index 1362f75..7a05504 100644 --- a/components/search_provider_logos/logo_tracker.h +++ b/components/search_provider_logos/logo_tracker.h
@@ -67,18 +67,6 @@ base::Callback<void(const SkBitmap&)> image_decoded_callback) = 0; }; -// Parses the response from the server and returns it as an EncodedLogo. Returns -// null if the response is invalid. -using ParseLogoResponse = base::Callback<std::unique_ptr<EncodedLogo>( - std::unique_ptr<std::string> response, - base::Time response_time, - bool* parsing_failed)>; - -// Encodes the fingerprint of the cached logo in the logo URL. This enables the -// server to verify whether the cached logo is up to date. -using AppendQueryparamsToLogoURL = - base::Callback<GURL(const GURL& logo_url, const std::string& fingerprint)>; - // This class provides the logo for a search provider. Logos are downloaded from // the search provider's logo URL and cached on disk. //
diff --git a/components/search_provider_logos/logo_tracker_unittest.cc b/components/search_provider_logos/logo_tracker_unittest.cc index 346ee57..1b634c39 100644 --- a/components/search_provider_logos/logo_tracker_unittest.cc +++ b/components/search_provider_logos/logo_tracker_unittest.cc
@@ -326,8 +326,8 @@ base::ThreadTaskRunnerHandle::Get()), base::MakeUnique<TestLogoDelegate>()); logo_tracker_->SetServerAPI( - logo_url_, base::Bind(&GoogleParseLogoResponse), - base::Bind(&GoogleAppendQueryparamsToLogoURL, false)); + logo_url_, base::Bind(&GoogleLegacyParseLogoResponse), + base::Bind(&GoogleLegacyAppendQueryparamsToLogoURL, false)); logo_tracker_->SetClockForTests(base::WrapUnique(test_clock_)); logo_tracker_->SetLogoCacheForTests(base::WrapUnique(logo_cache_)); } @@ -392,7 +392,7 @@ net::URLRequestStatus::Status request_status, net::HttpStatusCode response_code) { GURL url_with_fp = - GoogleAppendQueryparamsToLogoURL(false, logo_url_, fingerprint); + GoogleLegacyAppendQueryparamsToLogoURL(false, logo_url_, fingerprint); fake_url_fetcher_factory_.SetFakeResponse( url_with_fp, response_when_fingerprint, response_code, request_status); } @@ -405,24 +405,24 @@ // Tests ----------------------------------------------------------------------- TEST_F(LogoTrackerTest, CTAURLHasComma) { - GURL url_with_fp = GoogleAppendQueryparamsToLogoURL( + GURL url_with_fp = GoogleLegacyAppendQueryparamsToLogoURL( false, GURL("http://logourl.com/path"), "abc123"); EXPECT_EQ("http://logourl.com/path?async=es_dfp:abc123,cta:1", url_with_fp.spec()); - url_with_fp = GoogleAppendQueryparamsToLogoURL( + url_with_fp = GoogleLegacyAppendQueryparamsToLogoURL( false, GURL("http://logourl.com/?a=b"), ""); EXPECT_EQ("http://logourl.com/?a=b&async=cta:1", url_with_fp.spec()); } TEST_F(LogoTrackerTest, CTAGrayBackgroundHasCommas) { - GURL url_with_fp = GoogleAppendQueryparamsToLogoURL( + GURL url_with_fp = GoogleLegacyAppendQueryparamsToLogoURL( true, GURL("http://logourl.com/path"), "abc123"); EXPECT_EQ( "http://logourl.com/path?async=es_dfp:abc123,cta:1,transp:1,graybg:1", url_with_fp.spec()); - url_with_fp = GoogleAppendQueryparamsToLogoURL( + url_with_fp = GoogleLegacyAppendQueryparamsToLogoURL( true, GURL("http://logourl.com/?a=b"), ""); EXPECT_EQ("http://logourl.com/?a=b&async=cta:1,transp:1,graybg:1", url_with_fp.spec()); @@ -732,8 +732,8 @@ logo_url_ = GURL("http://example.com/new-logo-url"); logo_tracker_->SetServerAPI( - logo_url_, base::Bind(&GoogleParseLogoResponse), - base::Bind(&GoogleAppendQueryparamsToLogoURL, false)); + logo_url_, base::Bind(&GoogleLegacyParseLogoResponse), + base::Bind(&GoogleLegacyAppendQueryparamsToLogoURL, false)); Logo logo = GetSampleLogo(logo_url_, test_clock_->Now()); SetServerResponse(ServerResponse(logo));
diff --git a/components/subresource_filter/content/common/ruleset_dealer.cc b/components/subresource_filter/content/common/ruleset_dealer.cc index 5977350..04a6fd7 100644 --- a/components/subresource_filter/content/common/ruleset_dealer.cc +++ b/components/subresource_filter/content/common/ruleset_dealer.cc
@@ -44,4 +44,8 @@ return strong_ruleset_ref; } +base::File RulesetDealer::DuplicateRulesetFile() { + return ruleset_file_.Duplicate(); +} + } // namespace subresource_filter
diff --git a/components/subresource_filter/content/common/ruleset_dealer.h b/components/subresource_filter/content/common/ruleset_dealer.h index 14c1723fb..fe5db99 100644 --- a/components/subresource_filter/content/common/ruleset_dealer.h +++ b/components/subresource_filter/content/common/ruleset_dealer.h
@@ -50,6 +50,10 @@ // For testing only. bool has_cached_ruleset() const { return !!weak_cached_ruleset_.get(); } + // Duplicates the ruleset file. This is used to pass the file to another + // thread. + base::File DuplicateRulesetFile(); + protected: bool CalledOnValidSequence() const { return sequence_checker_.CalledOnValidSequence();
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.cc b/components/subresource_filter/content/renderer/subresource_filter_agent.cc index 6697771..c3685ee 100644 --- a/components/subresource_filter/content/renderer/subresource_filter_agent.cc +++ b/components/subresource_filter/content/renderer/subresource_filter_agent.cc
@@ -6,6 +6,7 @@ #include <vector> +#include "base/feature_list.h" #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" @@ -19,8 +20,10 @@ #include "components/subresource_filter/core/common/memory_mapped_ruleset.h" #include "components/subresource_filter/core/common/scoped_timers.h" #include "components/subresource_filter/core/common/time_measurements.h" +#include "content/public/common/content_features.h" #include "content/public/renderer/render_frame.h" #include "ipc/ipc_message.h" +#include "third_party/WebKit/public/platform/WebWorkerFetchContext.h" #include "third_party/WebKit/public/web/WebDataSource.h" #include "third_party/WebKit/public/web/WebDocument.h" #include "third_party/WebKit/public/web/WebLocalFrame.h" @@ -191,4 +194,24 @@ return handled; } +void SubresourceFilterAgent::WillCreateWorkerFetchContext( + blink::WebWorkerFetchContext* worker_fetch_context) { + DCHECK(base::FeatureList::IsEnabled(features::kOffMainThreadFetch)); + if (!filter_for_last_committed_load_) + return; + if (!ruleset_dealer_->IsRulesetFileAvailable()) + return; + base::File ruleset_file = ruleset_dealer_->DuplicateRulesetFile(); + if (!ruleset_file.IsValid()) + return; + worker_fetch_context->SetSubresourceFilterBuilder( + base::MakeUnique<WebDocumentSubresourceFilterImpl::BuilderImpl>( + url::Origin(GetDocumentURL()), + filter_for_last_committed_load_->filter().activation_state(), + std::move(ruleset_file), + base::BindOnce(&SubresourceFilterAgent:: + SignalFirstSubresourceDisallowedForCommittedLoad, + AsWeakPtr()))); +} + } // namespace subresource_filter
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.h b/components/subresource_filter/content/renderer/subresource_filter_agent.h index 22bc3fc2..a990a1c 100644 --- a/components/subresource_filter/content/renderer/subresource_filter_agent.h +++ b/components/subresource_filter/content/renderer/subresource_filter_agent.h
@@ -69,6 +69,7 @@ void DidFailProvisionalLoad(const blink::WebURLError& error) override; void DidFinishLoad() override; bool OnMessageReceived(const IPC::Message& message) override; + void WillCreateWorkerFetchContext(blink::WebWorkerFetchContext*) override; // Owned by the ChromeContentRendererClient and outlives us. UnverifiedRulesetDealer* ruleset_dealer_;
diff --git a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc index 88d5f1c..0d1e297 100644 --- a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc +++ b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc
@@ -6,7 +6,10 @@ #include <utility> +#include "base/bind.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" +#include "base/message_loop/message_loop.h" #include "components/subresource_filter/core/common/activation_state.h" #include "components/subresource_filter/core/common/load_policy.h" #include "components/subresource_filter/core/common/memory_mapped_ruleset.h" @@ -90,6 +93,11 @@ } } +void ProxyToTaskRunner(scoped_refptr<base::SingleThreadTaskRunner> task_runner, + base::OnceClosure callback) { + task_runner->PostTask(FROM_HERE, std::move(callback)); +} + } // namespace WebDocumentSubresourceFilterImpl::~WebDocumentSubresourceFilterImpl() = default; @@ -138,4 +146,29 @@ return ToWebLoadPolicy(filter_.GetLoadPolicy(GURL(url), element_type)); } +WebDocumentSubresourceFilterImpl::BuilderImpl::BuilderImpl( + url::Origin document_origin, + ActivationState activation_state, + base::File ruleset_file, + base::OnceClosure first_disallowed_load_callback) + : document_origin_(std::move(document_origin)), + activation_state_(std::move(activation_state)), + ruleset_file_(std::move(ruleset_file)), + first_disallowed_load_callback_( + std::move(first_disallowed_load_callback)), + main_task_runner_(base::MessageLoop::current()->task_runner()) {} + +WebDocumentSubresourceFilterImpl::BuilderImpl::~BuilderImpl() {} + +std::unique_ptr<blink::WebDocumentSubresourceFilter> +WebDocumentSubresourceFilterImpl::BuilderImpl::Build() { + DCHECK(ruleset_file_.IsValid()); + DCHECK(!main_task_runner_->BelongsToCurrentThread()); + return base::MakeUnique<WebDocumentSubresourceFilterImpl>( + document_origin_, activation_state_, + base::MakeRefCounted<MemoryMappedRuleset>(std::move(ruleset_file_)), + base::BindOnce(&ProxyToTaskRunner, main_task_runner_, + std::move(first_disallowed_load_callback_))); +} + } // namespace subresource_filter
diff --git a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h index 179b0de6..606509b 100644 --- a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h +++ b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h
@@ -6,11 +6,14 @@ #define COMPONENTS_SUBRESOURCE_FILTER_CONTENT_RENDERER_WEB_DOCUMENT_SUBRESOURCE_FILTER_IMPL_H_ #include "base/callback.h" +#include "base/files/file.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/single_thread_task_runner.h" #include "components/subresource_filter/core/common/document_subresource_filter.h" #include "components/url_pattern_index/proto/rules.pb.h" #include "third_party/WebKit/public/platform/WebDocumentSubresourceFilter.h" +#include "url/origin.h" namespace subresource_filter { @@ -21,6 +24,28 @@ : public blink::WebDocumentSubresourceFilter, public base::SupportsWeakPtr<WebDocumentSubresourceFilterImpl> { public: + // This builder class is created on the main thread and passed to a worker + // thread to create the subresource filter for the worker thread. + class BuilderImpl : public blink::WebDocumentSubresourceFilter::Builder { + public: + BuilderImpl(url::Origin document_origin, + ActivationState activation_state, + base::File ruleset_file, + base::OnceClosure first_disallowed_load_callback); + ~BuilderImpl() override; + + std::unique_ptr<blink::WebDocumentSubresourceFilter> Build() override; + + private: + url::Origin document_origin_; + ActivationState activation_state_; + base::File ruleset_file_; + base::OnceClosure first_disallowed_load_callback_; + scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; + + DISALLOW_COPY_AND_ASSIGN(BuilderImpl); + }; + // See DocumentSubresourceFilter description. // // Invokes |first_disallowed_load_callback|, if it is non-null, on the first
diff --git a/components/update_client/background_downloader_win.cc b/components/update_client/background_downloader_win.cc index fd391de..d383e1a1 100644 --- a/components/update_client/background_downloader_win.cc +++ b/components/update_client/background_downloader_win.cc
@@ -7,8 +7,9 @@ #include <atlbase.h> #include <atlcom.h> #include <objbase.h> -#include <stddef.h> +#include <winerror.h> +#include <stddef.h> #include <stdint.h> #include <functional> #include <iomanip> @@ -27,6 +28,7 @@ #include "base/strings/string_piece.h" #include "base/strings/sys_string_conversions.h" #include "base/win/scoped_co_mem.h" +#include "components/update_client/update_client_errors.h" #include "components/update_client/utils.h" #include "url/gurl.h" @@ -129,9 +131,12 @@ // system restarts, etc. Also, the check to purge stale jobs only happens // at most once a day. If the job clean up code is not running, the BITS // default policy is to cancel jobs after 90 days of inactivity. -const int kPurgeStaleJobsAfterDays = 7; +const int kPurgeStaleJobsAfterDays = 3; const int kPurgeStaleJobsIntervalBetweenChecksDays = 1; +// Number of maximum BITS jobs this downloader can create and queue up. +const int kMaxQueuedJobs = 10; + // Retrieves the singleton instance of GIT for this process. HRESULT GetGit(ComPtr<IGlobalInterfaceTable>* git) { return ::CoCreateInstance(CLSID_StdGlobalInterfaceTable, NULL, @@ -388,51 +393,6 @@ DeleteFileAndEmptyParentDirectory(path); } -// Cleans up incompleted jobs that are too old. -HRESULT CleanupStaleJobs(const ComPtr<IBackgroundCopyManager>& bits_manager) { - if (!bits_manager.Get()) - return E_FAIL; - - static base::Time last_sweep; - - const base::TimeDelta time_delta( - base::TimeDelta::FromDays(kPurgeStaleJobsIntervalBetweenChecksDays)); - const base::Time current_time(base::Time::Now()); - if (last_sweep + time_delta > current_time) - return S_OK; - - last_sweep = current_time; - - std::vector<ComPtr<IBackgroundCopyJob>> jobs; - HRESULT hr = FindBitsJobIf( - std::bind2nd(std::ptr_fun(JobCreationOlderThanDaysPredicate), - kPurgeStaleJobsAfterDays), - bits_manager, &jobs); - - if (FAILED(hr)) - return hr; - - for (const auto& job : jobs) - CleanupJob(job); - - return S_OK; -} - -// Returns the number of jobs in the BITS queue which were created by this -// downloader. -HRESULT GetBackgroundDownloaderJobCount( - const ComPtr<IBackgroundCopyManager>& bits_manager, - size_t* num_jobs) { - std::vector<ComPtr<IBackgroundCopyJob>> jobs; - const HRESULT hr = - FindBitsJobIf([](const ComPtr<IBackgroundCopyJob>&) { return true; }, - bits_manager, &jobs); - if (FAILED(hr)) - return hr; - *num_jobs = jobs.size(); - return S_OK; -} - } // namespace BackgroundDownloader::BackgroundDownloader( @@ -500,11 +460,11 @@ if (FAILED(hr)) return hr; - hr = RegisterInterfaceInGit(git, bits_manager_, &git_cookie_bits_manager_); + hr = QueueBitsJob(url, &job_); if (FAILED(hr)) return hr; - hr = QueueBitsJob(url, &job_); + hr = RegisterInterfaceInGit(git, bits_manager_, &git_cookie_bits_manager_); if (FAILED(hr)) return hr; @@ -597,8 +557,6 @@ if (FAILED(error)) CleanupJob(job_); - CleanupStaleJobs(bits_manager_); - ClearGit(); // Consider the url handled if it has been successfully downloaded or a @@ -724,9 +682,16 @@ DCHECK(task_runner()->RunsTasksInCurrentSequence()); size_t num_jobs = 0; - GetBackgroundDownloaderJobCount(bits_manager_, &num_jobs); + GetBackgroundDownloaderJobCount(&num_jobs); UMA_HISTOGRAM_COUNTS_100("UpdateClient.BackgroundDownloaderJobs", num_jobs); + // Remove some old jobs from the BITS queue before creating new jobs. + CleanupStaleJobs(); + + if (num_jobs >= kMaxQueuedJobs) + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, + CrxDownloaderError::BITS_TOO_MANY_JOBS); + ComPtr<IBackgroundCopyJob> local_job; HRESULT hr = CreateOrOpenJob(url, &local_job); if (FAILED(hr)) { @@ -896,4 +861,43 @@ return S_OK; } +HRESULT BackgroundDownloader::GetBackgroundDownloaderJobCount( + size_t* num_jobs) { + DCHECK(task_runner()->RunsTasksInCurrentSequence()); + DCHECK(bits_manager_); + + std::vector<ComPtr<IBackgroundCopyJob>> jobs; + const HRESULT hr = + FindBitsJobIf([](const ComPtr<IBackgroundCopyJob>&) { return true; }, + bits_manager_, &jobs); + if (FAILED(hr)) + return hr; + + *num_jobs = jobs.size(); + return S_OK; +} + +void BackgroundDownloader::CleanupStaleJobs() { + DCHECK(task_runner()->RunsTasksInCurrentSequence()); + DCHECK(bits_manager_); + + static base::Time last_sweep; + + const base::TimeDelta time_delta( + base::TimeDelta::FromDays(kPurgeStaleJobsIntervalBetweenChecksDays)); + const base::Time current_time(base::Time::Now()); + if (last_sweep + time_delta > current_time) + return; + + last_sweep = current_time; + + std::vector<ComPtr<IBackgroundCopyJob>> jobs; + FindBitsJobIf(std::bind2nd(std::ptr_fun(JobCreationOlderThanDaysPredicate), + kPurgeStaleJobsAfterDays), + bits_manager_, &jobs); + + for (const auto& job : jobs) + CleanupJob(job); +} + } // namespace update_client
diff --git a/components/update_client/background_downloader_win.h b/components/update_client/background_downloader_win.h index ca71df0a..be0f26cc 100644 --- a/components/update_client/background_downloader_win.h +++ b/components/update_client/background_downloader_win.h
@@ -115,6 +115,13 @@ // from the thread pool leaves the object to release the interface pointers. void ResetInterfacePointers(); + // Returns the number of jobs in the BITS queue which were created by this + // downloader. + HRESULT GetBackgroundDownloaderJobCount(size_t* num_jobs); + + // Cleans up incompleted jobs that are too old. + void CleanupStaleJobs(); + // Ensures that we are running on the same thread we created the object on. base::ThreadChecker thread_checker_;
diff --git a/components/update_client/update_client_errors.h b/components/update_client/update_client_errors.h index 050ab3c..814f08a 100644 --- a/components/update_client/update_client_errors.h +++ b/components/update_client/update_client_errors.h
@@ -37,6 +37,9 @@ NO_URL = 10, NO_HASH = 11, BAD_HASH = 12, // The downloaded file fails the hash verification. + // The Windows BITS queue contains to many update client jobs. The value is + // chosen so that it can be reported as a custom COM error on this platform. + BITS_TOO_MANY_JOBS = 0x0200, GENERIC_ERROR = -1 };
diff --git a/components/viz/common/BUILD.gn b/components/viz/common/BUILD.gn index fdefcb8..f60c6674 100644 --- a/components/viz/common/BUILD.gn +++ b/components/viz/common/BUILD.gn
@@ -12,9 +12,14 @@ "gl_helper_readback_support.h", "gl_helper_scaling.cc", "gl_helper_scaling.h", + "quads/resource_format.h", + "resources/platform_color.h", + "resources/resource_format_utils.cc", + "resources/resource_format_utils.h", ] deps = [ + "//base", "//gpu/command_buffer/client:gles2_interface", "//skia", "//ui/gfx/geometry", @@ -29,6 +34,7 @@ source_set("unit_tests") { testonly = true sources = [ + "resources/platform_color_unittest.cc", "yuv_readback_unittest.cc", ]
diff --git a/components/viz/common/quads/DEPS b/components/viz/common/quads/DEPS new file mode 100644 index 0000000..b273ae3 --- /dev/null +++ b/components/viz/common/quads/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+ui/gfx", +]
diff --git a/components/viz/common/quads/resource_format.h b/components/viz/common/quads/resource_format.h new file mode 100644 index 0000000..4ae7b06 --- /dev/null +++ b/components/viz/common/quads/resource_format.h
@@ -0,0 +1,35 @@ +// Copyright 2013 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 COMPONENTS_VIZ_COMMON_QUADS_RESOURCE_FORMAT_H_ +#define COMPONENTS_VIZ_COMMON_QUADS_RESOURCE_FORMAT_H_ + +#include "base/logging.h" +#include "ui/gfx/buffer_types.h" + +// TODO(prashant.n): Including third_party/khronos/GLES2/gl2.h causes +// redefinition errors as macros/functions defined in it conflict with +// macros/functions defined in ui/gl/gl_bindings.h. (http://crbug.com/512833). +typedef unsigned int GLenum; + +namespace viz { + +// Keep in sync with arrays below. +enum ResourceFormat { + RGBA_8888, + RGBA_4444, + BGRA_8888, + ALPHA_8, + LUMINANCE_8, + RGB_565, + ETC1, + RED_8, + LUMINANCE_F16, + RGBA_F16, + RESOURCE_FORMAT_MAX = RGBA_F16, +}; + +} // namespace viz + +#endif // COMPONENTS_VIZ_COMMON_QUADS_RESOURCE_FORMAT_H_
diff --git a/components/viz/common/resources/DEPS b/components/viz/common/resources/DEPS new file mode 100644 index 0000000..90a9806 --- /dev/null +++ b/components/viz/common/resources/DEPS
@@ -0,0 +1,4 @@ +include_rules = [ + "+third_party/khronos/GLES2", + "+ui/gfx", +]
diff --git a/cc/resources/platform_color.h b/components/viz/common/resources/platform_color.h similarity index 83% rename from cc/resources/platform_color.h rename to components/viz/common/resources/platform_color.h index 91f249c..505b6d43 100644 --- a/cc/resources/platform_color.h +++ b/components/viz/common/resources/platform_color.h
@@ -2,22 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CC_RESOURCES_PLATFORM_COLOR_H_ -#define CC_RESOURCES_PLATFORM_COLOR_H_ +#ifndef COMPONENTS_VIZ_COMMON_RESOURCES_PLATFORM_COLOR_H_ +#define COMPONENTS_VIZ_COMMON_RESOURCES_PLATFORM_COLOR_H_ #include "base/logging.h" #include "base/macros.h" -#include "cc/resources/resource_format.h" +#include "components/viz/common/quads/resource_format.h" #include "third_party/skia/include/core/SkTypes.h" -namespace cc { +namespace viz { class PlatformColor { public: - enum SourceDataFormat { - SOURCE_FORMAT_RGBA8, - SOURCE_FORMAT_BGRA8 - }; + enum SourceDataFormat { SOURCE_FORMAT_RGBA8, SOURCE_FORMAT_BGRA8 }; static SourceDataFormat Format() { return SK_B32_SHIFT ? SOURCE_FORMAT_RGBA8 : SOURCE_FORMAT_BGRA8; @@ -75,6 +72,6 @@ DISALLOW_IMPLICIT_CONSTRUCTORS(PlatformColor); }; -} // namespace cc +} // namespace viz -#endif // CC_RESOURCES_PLATFORM_COLOR_H_ +#endif // COMPONENTS_VIZ_COMMON_RESOURCES_PLATFORM_COLOR_H_
diff --git a/cc/resources/platform_color_unittest.cc b/components/viz/common/resources/platform_color_unittest.cc similarity index 90% rename from cc/resources/platform_color_unittest.cc rename to components/viz/common/resources/platform_color_unittest.cc index d0d8036..f8012176 100644 --- a/cc/resources/platform_color_unittest.cc +++ b/components/viz/common/resources/platform_color_unittest.cc
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "cc/resources/platform_color.h" +#include "components/viz/common/resources/platform_color.h" #include <stddef.h> #include "testing/gtest/include/gtest/gtest.h" -namespace cc { +namespace viz { namespace { // Verify SameComponentOrder on this platform. @@ -39,4 +39,4 @@ } } // namespace -} // namespace cc +} // namespace viz
diff --git a/cc/resources/resource_format.cc b/components/viz/common/resources/resource_format_utils.cc similarity index 83% rename from cc/resources/resource_format.cc rename to components/viz/common/resources/resource_format_utils.cc index e159f15e..f15ddc7 100644 --- a/cc/resources/resource_format.cc +++ b/components/viz/common/resources/resource_format_utils.cc
@@ -1,14 +1,39 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2016 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 "cc/resources/resource_format.h" +#include "components/viz/common/resources/resource_format_utils.h" #include "third_party/khronos/GLES2/gl2.h" #include "third_party/khronos/GLES2/gl2ext.h" #include "ui/gfx/gpu_memory_buffer.h" -namespace cc { +namespace viz { + +SkColorType ResourceFormatToClosestSkColorType(ResourceFormat format) { + // Use kN32_SkColorType if there is no corresponding SkColorType. + switch (format) { + case RGBA_4444: + return kARGB_4444_SkColorType; + case RGBA_8888: + case BGRA_8888: + return kN32_SkColorType; + case ALPHA_8: + return kAlpha_8_SkColorType; + case RGB_565: + return kRGB_565_SkColorType; + case LUMINANCE_8: + return kGray_8_SkColorType; + case ETC1: + case RED_8: + case LUMINANCE_F16: + return kN32_SkColorType; + case RGBA_F16: + return kRGBA_F16_SkColorType; + } + NOTREACHED(); + return kN32_SkColorType; +} int BitsPerPixel(ResourceFormat format) { switch (format) { @@ -149,4 +174,4 @@ return false; } -} // namespace cc +} // namespace viz
diff --git a/components/viz/common/resources/resource_format_utils.h b/components/viz/common/resources/resource_format_utils.h new file mode 100644 index 0000000..923357e --- /dev/null +++ b/components/viz/common/resources/resource_format_utils.h
@@ -0,0 +1,25 @@ +// Copyright 2016 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 COMPONENTS_VIZ_COMMON_RESOURCES_RESOURCE_FORMAT_UTILS_H_ +#define COMPONENTS_VIZ_COMMON_RESOURCES_RESOURCE_FORMAT_UTILS_H_ + +#include "components/viz/common/quads/resource_format.h" +#include "third_party/skia/include/core/SkImageInfo.h" + +namespace viz { + +SkColorType ResourceFormatToClosestSkColorType(ResourceFormat format); +int BitsPerPixel(ResourceFormat format); +GLenum GLDataType(ResourceFormat format); +GLenum GLDataFormat(ResourceFormat format); +GLenum GLInternalFormat(ResourceFormat format); +GLenum GLCopyTextureInternalFormat(ResourceFormat format); +gfx::BufferFormat BufferFormat(ResourceFormat format); +bool IsResourceFormatCompressed(ResourceFormat format); +bool DoesResourceFormatSupportAlpha(ResourceFormat format); + +} // namespace viz + +#endif // COMPONENTS_VIZ_COMMON_RESOURCES_RESOURCE_FORMAT_UTILS_H_
diff --git a/components/viz/host/DEPS b/components/viz/host/DEPS index b4d33612..18cdf15 100644 --- a/components/viz/host/DEPS +++ b/components/viz/host/DEPS
@@ -8,10 +8,5 @@ "+gpu/ipc/host", "+mojo/public/cpp/bindings", "+services/ui/gpu/interfaces", + "+ui/gfx", ] - -specific_include_rules = { - "server_gpu_memory_buffer_manager_unittest\.cc": [ - "+ui/gfx", - ] -}
diff --git a/components/viz/host/server_gpu_memory_buffer_manager.cc b/components/viz/host/server_gpu_memory_buffer_manager.cc index 460cbf6..ac36c93 100644 --- a/components/viz/host/server_gpu_memory_buffer_manager.cc +++ b/components/viz/host/server_gpu_memory_buffer_manager.cc
@@ -5,14 +5,22 @@ #include "components/viz/host/server_gpu_memory_buffer_manager.h" #include "base/logging.h" +#include "base/strings/stringprintf.h" #include "base/threading/sequenced_task_runner_handle.h" +#include "base/trace_event/memory_dump_manager.h" +#include "base/trace_event/process_memory_dump.h" #include "gpu/ipc/client/gpu_memory_buffer_impl.h" #include "gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.h" #include "gpu/ipc/common/gpu_memory_buffer_support.h" #include "services/ui/gpu/interfaces/gpu_service.mojom.h" +#include "ui/gfx/buffer_format_util.h" +#include "ui/gfx/gpu_memory_buffer_tracing.h" namespace viz { +ServerGpuMemoryBufferManager::BufferInfo::BufferInfo() = default; +ServerGpuMemoryBufferManager::BufferInfo::~BufferInfo() = default; + ServerGpuMemoryBufferManager::ServerGpuMemoryBufferManager( ui::mojom::GpuService* gpu_service, int client_id) @@ -42,6 +50,7 @@ id, size, format, usage, client_id, surface_handle, base::Bind(&ServerGpuMemoryBufferManager::OnGpuMemoryBufferAllocated, weak_factory_.GetWeakPtr(), client_id, + gfx::BufferSizeForBufferFormat(size, format), base::Passed(std::move(callback)))); return; } @@ -55,6 +64,14 @@ format)) { buffer_handle = gpu::GpuMemoryBufferImplSharedMemory::CreateGpuMemoryBuffer( id, size, format); + BufferInfo buffer_info; + DCHECK_EQ(gfx::SHARED_MEMORY_BUFFER, buffer_handle.type); + buffer_info.type = gfx::SHARED_MEMORY_BUFFER; + buffer_info.buffer_size_in_bytes = + gfx::BufferSizeForBufferFormat(size, format); + buffer_info.shared_memory_guid = buffer_handle.handle.GetGUID(); + allocated_buffers_[client_id].insert( + std::make_pair(buffer_handle.id, buffer_info)); } task_runner_->PostTask(FROM_HERE, @@ -104,26 +121,92 @@ sync_token); } +bool ServerGpuMemoryBufferManager::OnMemoryDump( + const base::trace_event::MemoryDumpArgs& args, + base::trace_event::ProcessMemoryDump* pmd) { + DCHECK(task_runner_->RunsTasksInCurrentSequence()); + for (const auto& pair : allocated_buffers_) { + int client_id = pair.first; + for (const auto& buffer_pair : pair.second) { + gfx::GpuMemoryBufferId buffer_id = buffer_pair.first; + const BufferInfo& buffer_info = buffer_pair.second; + base::trace_event::MemoryAllocatorDump* dump = + pmd->CreateAllocatorDump(base::StringPrintf( + "gpumemorybuffer/client_%d/buffer_%d", client_id, buffer_id.id)); + if (!dump) + return false; + dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, + base::trace_event::MemoryAllocatorDump::kUnitsBytes, + buffer_info.buffer_size_in_bytes); + + // Create the cross-process ownership edge. If the client creates a + // corresponding dump for the same buffer, this will avoid to + // double-count them in tracing. If, instead, no other process will emit a + // dump with the same guid, the segment will be accounted to the browser. + uint64_t client_tracing_process_id = ClientIdToTracingId(client_id); + + if (buffer_info.type == gfx::SHARED_MEMORY_BUFFER) { + auto shared_buffer_guid = gfx::GetSharedMemoryGUIDForTracing( + client_tracing_process_id, buffer_id); + pmd->CreateSharedMemoryOwnershipEdge(dump->guid(), shared_buffer_guid, + buffer_info.shared_memory_guid, + 0 /* importance */); + } else { + auto shared_buffer_guid = gfx::GetGenericSharedGpuMemoryGUIDForTracing( + client_tracing_process_id, buffer_id); + pmd->CreateSharedGlobalAllocatorDump(shared_buffer_guid); + pmd->AddOwnershipEdge(dump->guid(), shared_buffer_guid); + } + } + } + return true; +} + void ServerGpuMemoryBufferManager::DestroyGpuMemoryBuffer( gfx::GpuMemoryBufferId id, int client_id, const gpu::SyncToken& sync_token) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); - if (native_buffers_[client_id].erase(id)) + auto iter = allocated_buffers_[client_id].find(id); + if (iter == allocated_buffers_[client_id].end()) + return; + DCHECK_NE(gfx::EMPTY_BUFFER, iter->second.type); + allocated_buffers_[client_id].erase(id); + if (iter->second.type != gfx::SHARED_MEMORY_BUFFER) gpu_service_->DestroyGpuMemoryBuffer(id, client_id, sync_token); } void ServerGpuMemoryBufferManager::DestroyAllGpuMemoryBufferForClient( int client_id) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); - for (gfx::GpuMemoryBufferId id : native_buffers_[client_id]) - gpu_service_->DestroyGpuMemoryBuffer(id, client_id, gpu::SyncToken()); - native_buffers_.erase(client_id); + for (auto pair : allocated_buffers_[client_id]) { + DCHECK_NE(gfx::EMPTY_BUFFER, pair.second.type); + if (pair.second.type != gfx::SHARED_MEMORY_BUFFER) { + gpu_service_->DestroyGpuMemoryBuffer(pair.first, client_id, + gpu::SyncToken()); + } + } + allocated_buffers_.erase(client_id); pending_buffers_.erase(client_id); } +uint64_t ServerGpuMemoryBufferManager::ClientIdToTracingId( + int client_id) const { + if (client_id == client_id_) { + return base::trace_event::MemoryDumpManager::GetInstance() + ->GetTracingProcessId(); + } + // TODO(sad|ssid): Find a better way once crbug.com/661257 is resolved. + // The hash value is incremented so that the tracing id is never equal to + // MemoryDumpManager::kInvalidTracingProcessId. + return static_cast<uint64_t>(base::Hash( + reinterpret_cast<const char*>(&client_id), sizeof(client_id))) + + 1; +} + void ServerGpuMemoryBufferManager::OnGpuMemoryBufferAllocated( int client_id, + size_t buffer_size_in_bytes, base::OnceCallback<void(const gfx::GpuMemoryBufferHandle&)> callback, const gfx::GpuMemoryBufferHandle& handle) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); @@ -136,8 +219,13 @@ std::move(callback).Run(gfx::GpuMemoryBufferHandle()); return; } - if (!handle.is_null()) - native_buffers_[client_id].insert(handle.id); + if (!handle.is_null()) { + BufferInfo buffer_info; + buffer_info.type = handle.type; + buffer_info.buffer_size_in_bytes = buffer_size_in_bytes; + allocated_buffers_[client_id].insert( + std::make_pair(handle.id, buffer_info)); + } std::move(callback).Run(handle); }
diff --git a/components/viz/host/server_gpu_memory_buffer_manager.h b/components/viz/host/server_gpu_memory_buffer_manager.h index 2ee15b6..5ae16d95 100644 --- a/components/viz/host/server_gpu_memory_buffer_manager.h +++ b/components/viz/host/server_gpu_memory_buffer_manager.h
@@ -11,6 +11,7 @@ #include "base/memory/weak_ptr.h" #include "base/sequenced_task_runner.h" #include "base/synchronization/waitable_event.h" +#include "base/trace_event/memory_dump_provider.h" #include "components/viz/host/viz_host_export.h" #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" #include "gpu/ipc/host/gpu_memory_buffer_support.h" @@ -28,7 +29,8 @@ // Note that |CreateGpuMemoryBuffer()| can be called on any thread. All the rest // of the functions must be called on the thread this object is created on. class VIZ_HOST_EXPORT ServerGpuMemoryBufferManager - : public gpu::GpuMemoryBufferManager { + : public gpu::GpuMemoryBufferManager, + public base::trace_event::MemoryDumpProvider { public: ServerGpuMemoryBufferManager(ui::mojom::GpuService* gpu_service, int client_id); @@ -58,9 +60,15 @@ void SetDestructionSyncToken(gfx::GpuMemoryBuffer* buffer, const gpu::SyncToken& sync_token) override; + // Overridden from base::trace_event::MemoryDumpProvider: + bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args, + base::trace_event::ProcessMemoryDump* pmd) override; + private: + uint64_t ClientIdToTracingId(int client_id) const; void OnGpuMemoryBufferAllocated( int client_id, + size_t buffer_size_in_bytes, base::OnceCallback<void(const gfx::GpuMemoryBufferHandle&)> callback, const gfx::GpuMemoryBufferHandle& handle); @@ -68,10 +76,19 @@ const int client_id_; int next_gpu_memory_id_ = 1; - using NativeBuffers = - std::unordered_set<gfx::GpuMemoryBufferId, + struct BufferInfo { + BufferInfo(); + ~BufferInfo(); + gfx::GpuMemoryBufferType type = gfx::EMPTY_BUFFER; + size_t buffer_size_in_bytes = 0; + base::UnguessableToken shared_memory_guid; + }; + + using AllocatedBuffers = + std::unordered_map<gfx::GpuMemoryBufferId, + BufferInfo, BASE_HASH_NAMESPACE::hash<gfx::GpuMemoryBufferId>>; - std::unordered_map<int, NativeBuffers> native_buffers_; + std::unordered_map<int, AllocatedBuffers> allocated_buffers_; std::unordered_set<int> pending_buffers_; const gpu::GpuMemoryBufferConfigurationSet native_configurations_;
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 81f977c..b3c7fa7 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -47,6 +47,8 @@ "//components/metrics:single_sample_metrics", "//components/mime_util", "//components/network_session_configurator/browser", + "//components/offline_pages/core/request_header", + "//components/offline_pages/features:features", "//components/rappor", "//components/tracing", "//components/tracing:startup_tracing", @@ -1932,6 +1934,8 @@ "renderer_host/compositor_impl_android.h", "renderer_host/input/synthetic_gesture_target_android.cc", "renderer_host/input/synthetic_gesture_target_android.h", + "renderer_host/input/touch_selection_controller_client_manager_android.cc", + "renderer_host/input/touch_selection_controller_client_manager_android.h", "renderer_host/native_web_keyboard_event_android.cc", "renderer_host/render_widget_host_view_android.cc", "renderer_host/render_widget_host_view_android.h",
diff --git a/content/browser/DEPS b/content/browser/DEPS index 2aa59bb..13fb093d 100644 --- a/content/browser/DEPS +++ b/content/browser/DEPS
@@ -10,6 +10,8 @@ "+components/metrics:single_sample_metrics", "+components/mime_util", "+components/network_session_configurator/common", + "+components/offline_pages/features/features.h", + "+components/offline_pages/core/request_header", "+components/payments", "+components/profile_service", "+components/rappor/public",
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc index e8af7514..779aa5b 100644 --- a/content/browser/child_process_security_policy_impl.cc +++ b/content/browser/child_process_security_policy_impl.cc
@@ -443,10 +443,12 @@ if (!url.is_valid()) return; // Can't grant the capability to request invalid URLs. - if (IsWebSafeScheme(url.scheme())) + const std::string& scheme = url.scheme(); + + if (IsWebSafeScheme(scheme)) return; // The scheme has already been whitelisted for every child process. - if (IsPseudoScheme(url.scheme())) { + if (IsPseudoScheme(scheme)) { return; // Can't grant the capability to request pseudo schemes. } @@ -462,7 +464,7 @@ // When the child process has been commanded to request this scheme, // we grant it the capability to request all URLs of that scheme. - state->second->GrantScheme(url.scheme()); + state->second->GrantScheme(scheme); } } @@ -632,7 +634,9 @@ if (!url.is_valid()) return false; // Can't request invalid URLs. - if (IsPseudoScheme(url.scheme())) { + const std::string& scheme = url.scheme(); + + if (IsPseudoScheme(scheme)) { // Every child process can request <about:blank>, <about:blank?foo>, // <about:blank/#foo> and <about:srcdoc>. if (url.IsAboutBlank() || url == kAboutSrcDocURL) @@ -655,7 +659,7 @@ CanCommitURL(child_id, GURL(origin.Serialize())); } - if (IsWebSafeScheme(url.scheme())) + if (IsWebSafeScheme(scheme)) return true; // If the process can commit the URL, it can request it. @@ -672,9 +676,11 @@ if (!url.is_valid()) return false; // Can't commit invalid URLs. + const std::string& scheme = url.scheme(); + // Of all the pseudo schemes, only about:blank and about:srcdoc are allowed to // commit. - if (IsPseudoScheme(url.scheme())) + if (IsPseudoScheme(scheme)) return url == url::kAboutBlankURL || url == kAboutSrcDocURL; // Blob and filesystem URLs require special treatment; validate the inner @@ -701,7 +707,7 @@ // site, so CanCommitURL will need to rely on explicit, per-process grants. // Note how today, even with extension isolation, the line below does not // enforce that http pages cannot commit in an extension process. - if (base::ContainsKey(schemes_okay_to_commit_in_any_process_, url.scheme())) + if (base::ContainsKey(schemes_okay_to_commit_in_any_process_, scheme)) return true; SecurityStateMap::iterator state = security_state_.find(child_id); @@ -719,10 +725,12 @@ if (!url.is_valid()) return false; // Can't set invalid URLs as origin headers. + const std::string& scheme = url.scheme(); + // Suborigin URLs are a special case and are allowed to be an origin header. - if (url.scheme() == url::kHttpSuboriginScheme || - url.scheme() == url::kHttpsSuboriginScheme) { - DCHECK(IsPseudoScheme(url.scheme())); + if (scheme == url::kHttpSuboriginScheme || + scheme == url::kHttpsSuboriginScheme) { + DCHECK(IsPseudoScheme(scheme)); return true; } @@ -740,8 +748,7 @@ // document origin. { base::AutoLock lock(lock_); - if (base::ContainsKey(schemes_okay_to_appear_as_origin_headers_, - url.scheme())) + if (base::ContainsKey(schemes_okay_to_appear_as_origin_headers_, scheme)) return true; } return false;
diff --git a/content/browser/cocoa/system_hotkey_helper_mac.mm b/content/browser/cocoa/system_hotkey_helper_mac.mm index f2453404..cbac199 100644 --- a/content/browser/cocoa/system_hotkey_helper_mac.mm +++ b/content/browser/cocoa/system_hotkey_helper_mac.mm
@@ -9,6 +9,9 @@ #include "base/mac/foundation_util.h" #include "base/message_loop/message_loop.h" #include "base/metrics/histogram_macros.h" +#include "base/task_scheduler/post_task.h" +#include "base/task_scheduler/task_traits.h" +#include "base/threading/thread_restrictions.h" #include "content/browser/cocoa/system_hotkey_map.h" #include "content/public/browser/browser_thread.h" @@ -30,9 +33,8 @@ } void SystemHotkeyHelperMac::DeferredLoadSystemHotkeys() { - BrowserThread::PostDelayedTask( - BrowserThread::FILE, - FROM_HERE, + base::PostDelayedTaskWithTraits( + FROM_HERE, {base::MayBlock()}, base::Bind(&SystemHotkeyHelperMac::LoadSystemHotkeys, base::Unretained(this)), base::TimeDelta::FromSeconds(kLoadHotkeysDelaySeconds)); @@ -45,7 +47,7 @@ } void SystemHotkeyHelperMac::LoadSystemHotkeys() { - DCHECK_CURRENTLY_ON(BrowserThread::FILE); + base::ThreadRestrictions::AssertIOAllowed(); std::string library_path(base::mac::GetUserLibraryPath().value()); NSString* expanded_file_path =
diff --git a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc index 866e8fbe..c2be00c 100644 --- a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc +++ b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
@@ -11,6 +11,7 @@ #include "cc/output/output_surface_client.h" #include "cc/output/output_surface_frame.h" #include "cc/resources/resource_provider.h" +#include "components/viz/common/resources/resource_format_utils.h" #include "components/viz/service/display_embedder/compositor_overlay_candidate_validator.h" #include "content/browser/compositor/reflector_impl.h" #include "content/browser/compositor/reflector_texture.h" @@ -26,7 +27,7 @@ namespace content { -static cc::ResourceFormat kFboTextureFormat = cc::RGBA_8888; +static viz::ResourceFormat kFboTextureFormat = viz::RGBA_8888; OffscreenBrowserCompositorOutputSurface:: OffscreenBrowserCompositorOutputSurface(
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc index 0891103..bff4f04c 100644 --- a/content/browser/devtools/protocol/network_handler.cc +++ b/content/browser/devtools/protocol/network_handler.cc
@@ -5,6 +5,7 @@ #include "content/browser/devtools/protocol/network_handler.h" #include <stddef.h> +#include <stdint.h> #include "base/barrier_closure.h" #include "base/base64.h" @@ -190,7 +191,7 @@ }; void ClearedCookiesOnIO(std::unique_ptr<ClearBrowserCookiesCallback> callback, - int num_deleted) { + uint32_t num_deleted) { DCHECK_CURRENTLY_ON(BrowserThread::IO); BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(&ClearBrowserCookiesCallback::sendSuccess,
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc index 4080c66..164e98b 100644 --- a/content/browser/loader/resource_dispatcher_host_impl.cc +++ b/content/browser/loader/resource_dispatcher_host_impl.cc
@@ -142,7 +142,7 @@ "chrome URLs, resources for installed extensions, as well as " "downloads." trigger: - "Navigating to a URL or downloading a file. A webpage, " + "Navigating to a URL or downloading a file. A webpage, " "ServiceWorker, chrome:// page, or extension may also initiate " "requests in the background." data: "Anything the initiator wants to send." @@ -883,9 +883,11 @@ ResourceRequesterInfo* requester_info, int routing_id, int request_id, - const ResourceRequest& request_data) { - OnRequestResourceInternal(requester_info, routing_id, request_id, - request_data, nullptr, nullptr); + const ResourceRequest& request_data, + net::MutableNetworkTrafficAnnotationTag traffic_annotation) { + OnRequestResourceInternal( + requester_info, routing_id, request_id, request_data, nullptr, nullptr, + net::NetworkTrafficAnnotationTag(traffic_annotation)); } void ResourceDispatcherHostImpl::OnRequestResourceInternal( @@ -894,7 +896,8 @@ int request_id, const ResourceRequest& request_data, mojom::URLLoaderAssociatedRequest mojo_request, - mojom::URLLoaderClientPtr url_loader_client) { + mojom::URLLoaderClientPtr url_loader_client, + const net::NetworkTrafficAnnotationTag& traffic_annotation) { DCHECK(requester_info->IsRenderer() || requester_info->IsNavigationPreload()); // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed. tracked_objects::ScopedTracker tracking_profile( @@ -914,7 +917,7 @@ } BeginRequest(requester_info, request_id, request_data, SyncLoadResultCallback(), routing_id, std::move(mojo_request), - std::move(url_loader_client)); + std::move(url_loader_client), traffic_annotation); } // Begins a resource request with the given params on behalf of the specified @@ -934,7 +937,7 @@ base::Bind(&HandleSyncLoadResult, requester_info->filter()->GetWeakPtr(), base::Passed(WrapUnique(sync_result))); BeginRequest(requester_info, request_id, request_data, callback, - sync_result->routing_id(), nullptr, nullptr); + sync_result->routing_id(), nullptr, nullptr, kTrafficAnnotation); } bool ResourceDispatcherHostImpl::IsRequestIDInUse( @@ -1096,7 +1099,8 @@ const SyncLoadResultCallback& sync_result_handler, // only valid for sync int route_id, mojom::URLLoaderAssociatedRequest mojo_request, - mojom::URLLoaderClientPtr url_loader_client) { + mojom::URLLoaderClientPtr url_loader_client, + const net::NetworkTrafficAnnotationTag& traffic_annotation) { DCHECK(requester_info->IsRenderer() || requester_info->IsNavigationPreload()); int child_id = requester_info->child_id(); @@ -1215,7 +1219,7 @@ request_id, request_data, sync_result_handler, route_id, headers, base::Passed(std::move(mojo_request)), base::Passed(std::move(url_loader_client)), - base::Passed(std::move(blob_handles)))); + base::Passed(std::move(blob_handles)), traffic_annotation)); return; } } @@ -1224,7 +1228,8 @@ ContinuePendingBeginRequest( requester_info, request_id, request_data, sync_result_handler, route_id, headers, std::move(mojo_request), std::move(url_loader_client), - std::move(blob_handles), HeaderInterceptorResult::CONTINUE); + std::move(blob_handles), traffic_annotation, + HeaderInterceptorResult::CONTINUE); } void ResourceDispatcherHostImpl::ContinuePendingBeginRequest( @@ -1237,6 +1242,7 @@ mojom::URLLoaderAssociatedRequest mojo_request, mojom::URLLoaderClientPtr url_loader_client, BlobHandles blob_handles, + const net::NetworkTrafficAnnotationTag& traffic_annotation, HeaderInterceptorResult interceptor_result) { DCHECK(requester_info->IsRenderer() || requester_info->IsNavigationPreload()); if (interceptor_result != HeaderInterceptorResult::CONTINUE) { @@ -1282,7 +1288,7 @@ std::unique_ptr<net::URLRequest> new_request = request_context->CreateRequest( is_navigation_stream_request ? request_data.resource_body_stream_url : request_data.url, - request_data.priority, nullptr, kTrafficAnnotation); + request_data.priority, nullptr, traffic_annotation); if (is_navigation_stream_request) { // PlzNavigate: Always set the method to GET when gaining access to the @@ -2255,10 +2261,11 @@ int request_id, const ResourceRequest& request, mojom::URLLoaderAssociatedRequest mojo_request, - mojom::URLLoaderClientPtr url_loader_client) { + mojom::URLLoaderClientPtr url_loader_client, + const net::NetworkTrafficAnnotationTag& traffic_annotation) { OnRequestResourceInternal(requester_info, routing_id, request_id, request, std::move(mojo_request), - std::move(url_loader_client)); + std::move(url_loader_client), traffic_annotation); } void ResourceDispatcherHostImpl::OnSyncLoadWithMojo( @@ -2268,7 +2275,7 @@ const ResourceRequest& request_data, const SyncLoadResultCallback& result_handler) { BeginRequest(requester_info, request_id, request_data, result_handler, - routing_id, nullptr, nullptr); + routing_id, nullptr, nullptr, kTrafficAnnotation); } // static
diff --git a/content/browser/loader/resource_dispatcher_host_impl.h b/content/browser/loader/resource_dispatcher_host_impl.h index 2b95db9..49645a1 100644 --- a/content/browser/loader/resource_dispatcher_host_impl.h +++ b/content/browser/loader/resource_dispatcher_host_impl.h
@@ -41,6 +41,7 @@ #include "ipc/ipc_message.h" #include "net/base/load_states.h" #include "net/base/request_priority.h" +#include "net/traffic_annotation/network_traffic_annotation.h" #include "third_party/WebKit/public/platform/WebMixedContentContextType.h" #include "url/gurl.h" @@ -279,12 +280,14 @@ void OnRenderFrameDeleted(const GlobalFrameRoutingId& global_routing_id); // Called when loading a request with mojo. - void OnRequestResourceWithMojo(ResourceRequesterInfo* requester_info, - int routing_id, - int request_id, - const ResourceRequest& request, - mojom::URLLoaderAssociatedRequest mojo_request, - mojom::URLLoaderClientPtr url_loader_client); + void OnRequestResourceWithMojo( + ResourceRequesterInfo* requester_info, + int routing_id, + int request_id, + const ResourceRequest& request, + mojom::URLLoaderAssociatedRequest mojo_request, + mojom::URLLoaderClientPtr url_loader_client, + const net::NetworkTrafficAnnotationTag& traffic_annotation); void OnSyncLoadWithMojo(ResourceRequesterInfo* requester_info, int routing_id, @@ -530,17 +533,21 @@ const GlobalFrameRoutingId& global_routing_id, bool cancel_requests); - void OnRequestResource(ResourceRequesterInfo* requester_info, - int routing_id, - int request_id, - const ResourceRequest& request_data); + void OnRequestResource( + ResourceRequesterInfo* requester_info, + int routing_id, + int request_id, + const ResourceRequest& request_data, + net::MutableNetworkTrafficAnnotationTag traffic_annotation); - void OnRequestResourceInternal(ResourceRequesterInfo* requester_info, - int routing_id, - int request_id, - const ResourceRequest& request_data, - mojom::URLLoaderAssociatedRequest mojo_request, - mojom::URLLoaderClientPtr url_loader_client); + void OnRequestResourceInternal( + ResourceRequesterInfo* requester_info, + int routing_id, + int request_id, + const ResourceRequest& request_data, + mojom::URLLoaderAssociatedRequest mojo_request, + mojom::URLLoaderClientPtr url_loader_client, + const net::NetworkTrafficAnnotationTag& traffic_annotation); void OnSyncLoad(ResourceRequesterInfo* requester_info, int request_id, @@ -575,7 +582,8 @@ const SyncLoadResultCallback& sync_result_handler, // only valid for sync int route_id, mojom::URLLoaderAssociatedRequest mojo_request, - mojom::URLLoaderClientPtr url_loader_client); + mojom::URLLoaderClientPtr url_loader_client, + const net::NetworkTrafficAnnotationTag& traffic_annotation); // There are requests which need decisions to be made like the following: // Whether the presence of certain HTTP headers like the Origin header are @@ -595,6 +603,7 @@ mojom::URLLoaderAssociatedRequest mojo_request, mojom::URLLoaderClientPtr url_loader_client, BlobHandles blob_handles, + const net::NetworkTrafficAnnotationTag& traffic_annotation, HeaderInterceptorResult interceptor_result); // Creates a ResourceHandler to be used by BeginRequest() for normal resource
diff --git a/content/browser/loader/resource_dispatcher_host_unittest.cc b/content/browser/loader/resource_dispatcher_host_unittest.cc index 35ea64c..6587135 100644 --- a/content/browser/loader/resource_dispatcher_host_unittest.cc +++ b/content/browser/loader/resource_dispatcher_host_unittest.cc
@@ -1155,7 +1155,9 @@ ResourceType type) { ResourceRequest request = CreateResourceRequest("GET", type, url); request.render_frame_id = render_frame_id; - ResourceHostMsg_RequestResource msg(render_view_id, request_id, request); + ResourceHostMsg_RequestResource msg( + render_view_id, request_id, request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(msg, filter_.get()); KickOffRequest(); } @@ -1167,7 +1169,9 @@ const GURL& url, ResourceType type) { ResourceRequest request = CreateResourceRequest("GET", type, url); - ResourceHostMsg_RequestResource msg(render_view_id, request_id, request); + ResourceHostMsg_RequestResource msg( + render_view_id, request_id, request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(msg, filter); KickOffRequest(); } @@ -1187,7 +1191,8 @@ request.origin_pid = web_contents_->GetRenderProcessHost()->GetID(); request.render_frame_id = web_contents_->GetMainFrame()->GetRoutingID(); ResourceHostMsg_RequestResource msg( - web_contents_->GetRenderViewHost()->GetRoutingID(), request_id, request); + web_contents_->GetRenderViewHost()->GetRoutingID(), request_id, request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(msg, web_contents_filter_.get()); KickOffRequest(); } @@ -1209,7 +1214,9 @@ "GET", RESOURCE_TYPE_SUB_RESOURCE, GURL("http://example.com/priority")); request.render_frame_id = render_frame_id; request.priority = priority; - ResourceHostMsg_RequestResource msg(render_view_id, request_id, request); + ResourceHostMsg_RequestResource msg( + render_view_id, request_id, request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(msg, filter_.get()); } @@ -1435,7 +1442,9 @@ ResourceRequest request_to_cache = CreateResourceRequest( "GET", RESOURCE_TYPE_IMAGE, net::URLRequestTestJob::test_url_3()); request_to_cache.download_to_network_cache_only = true; - ResourceHostMsg_RequestResource msg_to_cache(0, 2, request_to_cache); + ResourceHostMsg_RequestResource msg_to_cache( + 0, 2, request_to_cache, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(msg_to_cache, filter_.get()); KickOffRequest(); @@ -1578,9 +1587,13 @@ ResourceRequest request_ping = CreateResourceRequest( "GET", RESOURCE_TYPE_PING, net::URLRequestTestJob::test_url_3()); - ResourceHostMsg_RequestResource msg_prefetch(0, 1, request_prefetch); + ResourceHostMsg_RequestResource msg_prefetch( + 0, 1, request_prefetch, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(msg_prefetch, filter_.get()); - ResourceHostMsg_RequestResource msg_ping(0, 2, request_ping); + ResourceHostMsg_RequestResource msg_ping( + 0, 2, request_ping, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(msg_ping, filter_.get()); // Remove the filter before processing the requests by simulating channel @@ -1626,7 +1639,9 @@ "GET", RESOURCE_TYPE_PREFETCH, net::URLRequestTestJob::test_url_redirect_to_url_2()); - ResourceHostMsg_RequestResource msg(0, 1, request); + ResourceHostMsg_RequestResource msg( + 0, 1, request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(msg, filter_.get()); // Remove the filter before processing the request by simulating channel @@ -2736,7 +2751,8 @@ request.transferred_request_request_id = request_id; ResourceHostMsg_RequestResource transfer_request_msg( - new_render_view_id, new_request_id, request); + new_render_view_id, new_request_id, request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(transfer_request_msg, second_filter.get()); content::RunAllBlockingPoolTasksUntilIdle(); @@ -2805,7 +2821,8 @@ request.transferred_request_request_id = request_id; ResourceHostMsg_RequestResource transfer_request_msg( - new_render_view_id, new_request_id, request); + new_render_view_id, new_request_id, request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(transfer_request_msg, second_filter.get()); content::RunAllBlockingPoolTasksUntilIdle(); @@ -2817,7 +2834,8 @@ request.transferred_request_request_id = second_request_id; ResourceHostMsg_RequestResource second_transfer_request_msg( - new_render_view_id, new_second_request_id, second_request); + new_render_view_id, new_second_request_id, second_request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(second_transfer_request_msg, second_filter.get()); content::RunAllBlockingPoolTasksUntilIdle(); @@ -2887,7 +2905,8 @@ request.transferred_request_request_id = request_id; ResourceHostMsg_RequestResource transfer_request_msg( - new_render_view_id, new_request_id, request); + new_render_view_id, new_request_id, request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(transfer_request_msg, second_filter.get()); content::RunAllBlockingPoolTasksUntilIdle(); @@ -2933,7 +2952,8 @@ "GET", RESOURCE_TYPE_MAIN_FRAME, GURL("http://example.com/blah")); ResourceHostMsg_RequestResource first_request_msg( - render_view_id, request_id, first_request); + render_view_id, request_id, first_request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(first_request_msg, first_filter.get()); content::RunAllBlockingPoolTasksUntilIdle(); @@ -2971,7 +2991,8 @@ // For cleanup. child_ids_.insert(second_filter->child_id()); ResourceHostMsg_RequestResource transfer_request_msg( - new_render_view_id, new_request_id, request); + new_render_view_id, new_request_id, request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(transfer_request_msg, second_filter.get()); content::RunAllBlockingPoolTasksUntilIdle(); @@ -3048,7 +3069,8 @@ // For cleanup. child_ids_.insert(second_filter->child_id()); ResourceHostMsg_RequestResource transfer_request_msg( - new_render_view_id, new_request_id, request); + new_render_view_id, new_request_id, request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(transfer_request_msg, second_filter.get()); // Verify that we update the ResourceRequestInfo. @@ -3399,7 +3421,9 @@ ResourceRequest request = CreateResourceRequest( "GET", RESOURCE_TYPE_SUB_RESOURCE, net::URLRequestTestJob::test_url_1()); request.download_to_file = true; - ResourceHostMsg_RequestResource request_msg(0, 1, request); + ResourceHostMsg_RequestResource request_msg( + 0, 1, request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); OnMessageReceived(request_msg, filter_.get()); // Running the message loop until idle does not work because
diff --git a/content/browser/loader/url_loader_factory_impl.cc b/content/browser/loader/url_loader_factory_impl.cc index 2de2e1f..1c761e5 100644 --- a/content/browser/loader/url_loader_factory_impl.cc +++ b/content/browser/loader/url_loader_factory_impl.cc
@@ -10,6 +10,7 @@ #include "content/public/common/resource_request.h" #include "content/public/common/url_loader.mojom.h" #include "mojo/public/cpp/bindings/strong_binding.h" +#include "net/traffic_annotation/network_traffic_annotation.h" namespace content { @@ -85,7 +86,7 @@ ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); rdh->OnRequestResourceWithMojo(requester_info, routing_id, request_id, url_request, std::move(request), - std::move(client)); + std::move(client), traffic_annotation); } // static
diff --git a/content/browser/media/capture/desktop_capture_device.cc b/content/browser/media/capture/desktop_capture_device.cc index a38923b..5c82401e 100644 --- a/content/browser/media/capture/desktop_capture_device.cc +++ b/content/browser/media/capture/desktop_capture_device.cc
@@ -10,7 +10,6 @@ #include <utility> #include "base/bind.h" -#include "base/feature_list.h" #include "base/location.h" #include "base/logging.h" #include "base/macros.h" @@ -25,6 +24,7 @@ #include "build/build_config.h" #include "content/browser/media/capture/desktop_capture_device_uma_types.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/desktop_capture.h" #include "content/public/browser/desktop_media_id.h" #include "content/public/common/content_switches.h" #include "content/public/common/service_manager_connection.h" @@ -79,11 +79,6 @@ } // namespace -#if defined(OS_WIN) -const base::Feature kDirectXCapturer{"DirectXCapturer", - base::FEATURE_ENABLED_BY_DEFAULT}; -#endif - class DesktopCaptureDevice::Core : public webrtc::DesktopCapturer::Callback { public: Core(scoped_refptr<base::SingleThreadTaskRunner> task_runner, @@ -401,20 +396,7 @@ // static std::unique_ptr<media::VideoCaptureDevice> DesktopCaptureDevice::Create( const DesktopMediaID& source) { - webrtc::DesktopCaptureOptions options = - webrtc::DesktopCaptureOptions::CreateDefault(); - // Leave desktop effects enabled during WebRTC captures. - options.set_disable_effects(false); - -#if defined(OS_WIN) - if (!base::FeatureList::IsEnabled(kDirectXCapturer)) { - options.set_allow_use_magnification_api(true); - } else { - options.set_allow_directx_capturer(true); - options.set_allow_use_magnification_api(false); - } -#endif - + auto options = CreateDesktopCaptureOptions(); std::unique_ptr<webrtc::DesktopCapturer> capturer; switch (source.type) {
diff --git a/content/browser/renderer_host/input/touch_selection_controller_client_manager_android.cc b/content/browser/renderer_host/input/touch_selection_controller_client_manager_android.cc new file mode 100644 index 0000000..c2b3251 --- /dev/null +++ b/content/browser/renderer_host/input/touch_selection_controller_client_manager_android.cc
@@ -0,0 +1,143 @@ +// Copyright 2017 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 "content/browser/renderer_host/input/touch_selection_controller_client_manager_android.h" + +#include "content/browser/renderer_host/render_widget_host_view_android.h" + +namespace content { + +TouchSelectionControllerClientManagerAndroid:: + TouchSelectionControllerClientManagerAndroid( + RenderWidgetHostViewAndroid* rwhv) + : rwhv_(rwhv), active_client_(rwhv), page_scale_factor_(1.f) { + DCHECK(rwhv_); +} + +TouchSelectionControllerClientManagerAndroid:: + ~TouchSelectionControllerClientManagerAndroid() { + for (auto& observer : observers_) + observer.OnManagerWillDestroy(this); +} + +void TouchSelectionControllerClientManagerAndroid::SetPageScaleFactor( + float page_scale_factor) { + page_scale_factor_ = page_scale_factor; +} + +namespace { + +gfx::SelectionBound ScaleSelectionBound(const gfx::SelectionBound& bound, + float scale) { + gfx::SelectionBound scaled_bound; + gfx::PointF scaled_top = bound.edge_top(); + scaled_top.Scale(scale); + gfx::PointF scaled_bottom = bound.edge_bottom(); + scaled_bottom.Scale(scale); + scaled_bound.SetEdge(scaled_top, scaled_bottom); + scaled_bound.set_type(bound.type()); + scaled_bound.set_visible(bound.visible()); + return scaled_bound; +} +} // namespace + +// TouchSelectionControllerClientManager implementation. +void TouchSelectionControllerClientManagerAndroid::UpdateClientSelectionBounds( + const gfx::SelectionBound& start, + const gfx::SelectionBound& end, + ui::TouchSelectionControllerClient* client, + ui::TouchSelectionMenuClient* menu_client) { + if (client != active_client_ && + (start.type() == gfx::SelectionBound::EMPTY || !start.visible()) && + (end.type() == gfx::SelectionBound::EMPTY || !end.visible()) && + (manager_selection_start_.type() != gfx::SelectionBound::EMPTY || + manager_selection_end_.type() != gfx::SelectionBound::EMPTY)) { + return; + } + + active_client_ = client; + if (active_client_ != rwhv_) { + manager_selection_start_ = ScaleSelectionBound(start, page_scale_factor_); + manager_selection_end_ = ScaleSelectionBound(end, page_scale_factor_); + } else { + manager_selection_start_ = start; + manager_selection_end_ = end; + } + // Notify TouchSelectionController if anything should change here. Only + // update if the client is different and not making a change to empty, or + // is the same client. + GetTouchSelectionController()->OnSelectionBoundsChanged( + manager_selection_start_, manager_selection_end_); +} + +void TouchSelectionControllerClientManagerAndroid::InvalidateClient( + ui::TouchSelectionControllerClient* client) { + if (active_client_ == client) + active_client_ = rwhv_; +} + +ui::TouchSelectionController* +TouchSelectionControllerClientManagerAndroid::GetTouchSelectionController() { + return rwhv_->touch_selection_controller(); +} + +void TouchSelectionControllerClientManagerAndroid::AddObserver( + Observer* observer) { + observers_.AddObserver(observer); +} + +void TouchSelectionControllerClientManagerAndroid::RemoveObserver( + Observer* observer) { + observers_.RemoveObserver(observer); +} + +// TouchSelectionControllerClient implementation. +bool TouchSelectionControllerClientManagerAndroid::SupportsAnimation() const { + return rwhv_->SupportsAnimation(); +} + +void TouchSelectionControllerClientManagerAndroid::SetNeedsAnimate() { + rwhv_->SetNeedsAnimate(); +} + +void TouchSelectionControllerClientManagerAndroid::MoveCaret( + const gfx::PointF& position) { + gfx::PointF scaled_position = position; + if (active_client_ != rwhv_) + scaled_position.Scale(1 / page_scale_factor_); + active_client_->MoveCaret(scaled_position); +} + +void TouchSelectionControllerClientManagerAndroid::MoveRangeSelectionExtent( + const gfx::PointF& extent) { + gfx::PointF scaled_extent = extent; + if (active_client_ != rwhv_) + scaled_extent.Scale(1 / page_scale_factor_); + active_client_->MoveRangeSelectionExtent(scaled_extent); +} + +void TouchSelectionControllerClientManagerAndroid::SelectBetweenCoordinates( + const gfx::PointF& base, + const gfx::PointF& extent) { + gfx::PointF scaled_extent = extent; + gfx::PointF scaled_base = base; + if (active_client_ != rwhv_) { + scaled_extent.Scale(1 / page_scale_factor_); + scaled_base.Scale(1 / page_scale_factor_); + } + active_client_->SelectBetweenCoordinates(scaled_base, scaled_extent); +} + +void TouchSelectionControllerClientManagerAndroid::OnSelectionEvent( + ui::SelectionEventType event) { + // Always defer to the top-level RWHV TSC for this. + rwhv_->OnSelectionEvent(event); +} + +std::unique_ptr<ui::TouchHandleDrawable> +TouchSelectionControllerClientManagerAndroid::CreateDrawable() { + return rwhv_->CreateDrawable(); +} + +} // namespace content
diff --git a/content/browser/renderer_host/input/touch_selection_controller_client_manager_android.h b/content/browser/renderer_host/input/touch_selection_controller_client_manager_android.h new file mode 100644 index 0000000..ff406582 --- /dev/null +++ b/content/browser/renderer_host/input/touch_selection_controller_client_manager_android.h
@@ -0,0 +1,63 @@ +// Copyright 2017 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 CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_SELECTION_CONTROLLER_CLIENT_MANAGER_ANDROID_H_ +#define CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_SELECTION_CONTROLLER_CLIENT_MANAGER_ANDROID_H_ + +#include "base/macros.h" +#include "base/observer_list.h" +#include "content/public/browser/touch_selection_controller_client_manager.h" +#include "ui/touch_selection/touch_selection_controller.h" + +namespace content { + +class RenderWidgetHostViewAndroid; + +class TouchSelectionControllerClientManagerAndroid + : public TouchSelectionControllerClientManager, + public ui::TouchSelectionControllerClient { + public: + explicit TouchSelectionControllerClientManagerAndroid( + RenderWidgetHostViewAndroid* rwhv); + ~TouchSelectionControllerClientManagerAndroid() override; + void SetPageScaleFactor(float page_scale_factor); + float page_scale_factor() { return page_scale_factor_; } + + // TouchSelectionControllerClientManager implementation. + void UpdateClientSelectionBounds( + const gfx::SelectionBound& start, + const gfx::SelectionBound& end, + ui::TouchSelectionControllerClient* client, + ui::TouchSelectionMenuClient* menu_client) override; + void InvalidateClient(ui::TouchSelectionControllerClient* client) override; + ui::TouchSelectionController* GetTouchSelectionController() override; + + void AddObserver(Observer* observer) override; + void RemoveObserver(Observer* observer) override; + + // TouchSelectionControllerClient implementation. + bool SupportsAnimation() const override; + void SetNeedsAnimate() override; + void MoveCaret(const gfx::PointF& position) override; + void MoveRangeSelectionExtent(const gfx::PointF& extent) override; + void SelectBetweenCoordinates(const gfx::PointF& base, + const gfx::PointF& extent) override; + void OnSelectionEvent(ui::SelectionEventType event) override; + std::unique_ptr<ui::TouchHandleDrawable> CreateDrawable() override; + + private: + RenderWidgetHostViewAndroid* rwhv_; + TouchSelectionControllerClient* active_client_; + float page_scale_factor_; + gfx::SelectionBound manager_selection_start_; + gfx::SelectionBound manager_selection_end_; + base::ObserverList<TouchSelectionControllerClientManager::Observer> + observers_; + + DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerClientManagerAndroid); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_SELECTION_CONTROLLER_CLIENT_MANAGER_ANDROID_H_
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index 845d0f8d..c7406682 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -55,6 +55,7 @@ #include "content/browser/renderer_host/frame_metadata_util.h" #include "content/browser/renderer_host/input/input_router.h" #include "content/browser/renderer_host/input/synthetic_gesture_target_android.h" +#include "content/browser/renderer_host/input/touch_selection_controller_client_manager_android.h" #include "content/browser/renderer_host/input/web_input_event_builders_android.h" #include "content/browser/renderer_host/render_process_host_impl.h" #include "content/browser/renderer_host/render_view_host_delegate_view.h" @@ -491,6 +492,8 @@ } host_->SetView(this); + touch_selection_controller_client_manager_ = + base::MakeUnique<TouchSelectionControllerClientManagerAndroid>(this); SetContentViewCore(content_view_core); CreateOverscrollControllerIfPossible(); @@ -1369,6 +1372,19 @@ event, GetSelectionRect(*touch_selection_controller_)); } +ui::TouchSelectionControllerClient* +RenderWidgetHostViewAndroid::GetSelectionControllerClientManagerForTesting() { + return touch_selection_controller_client_manager_.get(); +} + +void RenderWidgetHostViewAndroid::SetSelectionControllerClientForTesting( + std::unique_ptr<ui::TouchSelectionControllerClient> client) { + touch_selection_controller_client_for_test_.swap(client); + + touch_selection_controller_ = CreateSelectionController( + touch_selection_controller_client_for_test_.get(), content_view_core_); +} + std::unique_ptr<ui::TouchHandleDrawable> RenderWidgetHostViewAndroid::CreateDrawable() { DCHECK(content_view_core_); @@ -1457,8 +1473,12 @@ overscroll_controller_->OnFrameMetadataUpdated(frame_metadata); if (touch_selection_controller_) { - touch_selection_controller_->OnSelectionBoundsChanged( - frame_metadata.selection.start, frame_metadata.selection.end); + DCHECK(touch_selection_controller_client_manager_); + touch_selection_controller_client_manager_->UpdateClientSelectionBounds( + frame_metadata.selection.start, frame_metadata.selection.end, this, + nullptr); + touch_selection_controller_client_manager_->SetPageScaleFactor( + frame_metadata.page_scale_factor); // Set parameters for adaptive handle orientation. gfx::SizeF viewport_size(frame_metadata.scrollable_viewport_size); @@ -1667,6 +1687,8 @@ needs_animate |= overscroll_controller_->Animate( frame_time, content_view_core_->GetViewAndroid()->GetLayer()); } + // TODO(wjmaclean): Investigate how animation here does or doesn't affect + // an OOPIF client. if (touch_selection_controller_) needs_animate |= touch_selection_controller_->Animate(frame_time); return needs_animate; @@ -1713,33 +1735,6 @@ InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent( const blink::WebInputEvent& input_event) { - if (touch_selection_controller_ && - blink::WebInputEvent::IsGestureEventType(input_event.GetType())) { - const blink::WebGestureEvent& gesture_event = - static_cast<const blink::WebGestureEvent&>(input_event); - switch (gesture_event.GetType()) { - case blink::WebInputEvent::kGestureLongPress: - touch_selection_controller_->HandleLongPressEvent( - base::TimeTicks() + - base::TimeDelta::FromSecondsD(input_event.TimeStampSeconds()), - gfx::PointF(gesture_event.x, gesture_event.y)); - break; - - case blink::WebInputEvent::kGestureTap: - touch_selection_controller_->HandleTapEvent( - gfx::PointF(gesture_event.x, gesture_event.y), - gesture_event.data.tap.tap_count); - break; - - case blink::WebInputEvent::kGestureScrollBegin: - touch_selection_controller_->OnScrollBeginEvent(); - break; - - default: - break; - } - } - if (overscroll_controller_ && blink::WebInputEvent::IsGestureEventType(input_event.GetType()) && overscroll_controller_->WillHandleGestureEvent( @@ -1899,6 +1894,33 @@ if (!host_ || !host_->delegate()) return; + // We let the touch selection controller see gesture events here, since they + // may be routed and not make it to FilterInputEvent(). + if (touch_selection_controller_ && + event.source_device == + blink::WebGestureDevice::kWebGestureDeviceTouchscreen) { + switch (event.GetType()) { + case blink::WebInputEvent::kGestureLongPress: + touch_selection_controller_->HandleLongPressEvent( + base::TimeTicks() + + base::TimeDelta::FromSecondsD(event.TimeStampSeconds()), + gfx::PointF(event.x, event.y)); + break; + + case blink::WebInputEvent::kGestureTap: + touch_selection_controller_->HandleTapEvent( + gfx::PointF(event.x, event.y), event.data.tap.tap_count); + break; + + case blink::WebInputEvent::kGestureScrollBegin: + touch_selection_controller_->OnScrollBeginEvent(); + break; + + default: + break; + } + } + ui::LatencyInfo latency_info = ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event); if (wheel_scroll_latching_enabled()) { @@ -2055,9 +2077,15 @@ if (resize) WasResized(); - if (!touch_selection_controller_) + if (!touch_selection_controller_) { + ui::TouchSelectionControllerClient* client = + touch_selection_controller_client_manager_.get(); + if (touch_selection_controller_client_for_test_) + client = touch_selection_controller_client_for_test_.get(); + touch_selection_controller_ = - CreateSelectionController(this, content_view_core_); + CreateSelectionController(client, content_view_core_); + } if (content_view_core_) CreateOverscrollControllerIfPossible(); @@ -2070,6 +2098,11 @@ } } +TouchSelectionControllerClientManager* +RenderWidgetHostViewAndroid::GetTouchSelectionControllerClientManager() { + return touch_selection_controller_client_manager_.get(); +} + bool RenderWidgetHostViewAndroid::OnTouchEvent( const ui::MotionEventAndroid& event, bool for_touch_handle) {
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h index df19e6808..c7c18a97 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.h +++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -56,6 +56,7 @@ class SelectionPopupController; class SynchronousCompositorHost; class SynchronousCompositorClient; +class TouchSelectionControllerClientManagerAndroid; class WebContentsAccessibilityAndroid; struct NativeWebKeyboardEvent; struct ContextMenuParams; @@ -95,6 +96,10 @@ void AddDestructionObserver(DestructionObserver* connector); void RemoveDestructionObserver(DestructionObserver* connector); + ui::TouchSelectionController* touch_selection_controller() { + return touch_selection_controller_.get(); + } + // RenderWidgetHostView implementation. bool OnMessageReceived(const IPC::Message& msg) override; void InitAsChild(gfx::NativeView parent_view) override; @@ -181,6 +186,8 @@ const gfx::Point& point, RenderWidgetHostViewBase* target_view, gfx::Point* transformed_point) override; + TouchSelectionControllerClientManager* + GetTouchSelectionControllerClientManager() override; // ui::ViewClient implementation. bool OnTouchEvent(const ui::MotionEventAndroid& m, @@ -305,6 +312,11 @@ // Exposed for tests. cc::SurfaceId SurfaceIdForTesting() const override; + ui::TouchSelectionControllerClient* + GetSelectionControllerClientManagerForTesting(); + void SetSelectionControllerClientForTesting( + std::unique_ptr<ui::TouchSelectionControllerClient> client); + private: void RunAckCallbacks(); @@ -414,6 +426,12 @@ // Manages selection handle rendering and manipulation. // This will always be NULL if |content_view_core_| is NULL. std::unique_ptr<ui::TouchSelectionController> touch_selection_controller_; + std::unique_ptr<ui::TouchSelectionControllerClient> + touch_selection_controller_client_for_test_; + // Keeps track of currently active touch selection controller clients (some + // may be representing out-of-process iframes). + std::unique_ptr<TouchSelectionControllerClientManagerAndroid> + touch_selection_controller_client_manager_; // Bounds to use if we have no backing ContentViewCore gfx::Rect default_bounds_;
diff --git a/content/browser/resources/media/client_renderer.js b/content/browser/resources/media/client_renderer.js index 3206ac9..3bdf538 100644 --- a/content/browser/resources/media/client_renderer.js +++ b/content/browser/resources/media/client_renderer.js
@@ -51,7 +51,7 @@ NO_PLAYERS_SELECTED: 'no-players-selected', NO_COMPONENTS_SELECTED: 'no-components-selected', SELECTABLE_BUTTON: 'selectable-button', - DESTRUCTED_PLAYER: 'destructed-player' + DESTRUCTED_PLAYER: 'destructed-player', }; function removeChildren(element) { @@ -60,7 +60,7 @@ } }; - function createSelectableButton(id, groupName, text, select_cb, + function createSelectableButton(id, groupName, buttonLabel, select_cb, isDestructed) { // For CSS styling. var radioButton = document.createElement('input'); @@ -69,12 +69,10 @@ radioButton.id = id; radioButton.name = groupName; - var buttonLabel = document.createElement('label'); buttonLabel.classList.add(ClientRenderer.Css_.SELECTABLE_BUTTON); if (isDestructed) buttonLabel.classList.add(ClientRenderer.Css_.DESTRUCTED_PLAYER); buttonLabel.setAttribute('for', radioButton.id); - buttonLabel.appendChild(document.createTextNode(text)); var fragment = document.createDocumentFragment(); fragment.appendChild(radioButton); @@ -177,14 +175,11 @@ this.drawProperties_(player.properties, this.playerPropertiesTable); this.drawLog_(); } - if (key === 'name' || key === 'url') { - this.redrawPlayerList_(players); - } - if (key === 'event' && value === 'WEBMEDIAPLAYER_DESTROYED') { + if (key === 'event' && value === 'WEBMEDIAPLAYER_DESTROYED') player.destructed = true; - document.querySelector( - "label.selectable-button[for='" + player.id + "']").classList.add( - ClientRenderer.Css_.DESTRUCTED_PLAYER); + if (['url', 'frame_url', 'frame_title', 'audio_codec_name', + 'video_codec_name', 'width', 'height', 'event'].includes(key)) { + this.redrawPlayerList_(players); } }, @@ -307,8 +302,10 @@ var button_cb = this.selectAudioComponent_.bind( this, componentType, id, components[id]); var friendlyName = this.getAudioComponentName_(componentType, id); + var label = document.createElement('label'); + label.appendChild(document.createTextNode(friendlyName)); li.appendChild(createSelectableButton( - id, buttonGroupName, friendlyName, button_cb)); + id, buttonGroupName, label, button_cb)); fragment.appendChild(li); } removeChildren(listElement); @@ -348,14 +345,53 @@ for (var id in players) { hasPlayers = true; var player = players[id]; - var usableName = player.properties.name || - player.properties.url || - 'Player ' + player.id; + var p = player.properties; + var label = document.createElement('label'); + + var name_text = p.url || 'Player ' + player.id; + var name_node = document.createElement('span'); + name_node.appendChild(document.createTextNode(name_text)); + name_node.className = 'player-name'; + label.appendChild(name_node); + + var frame = []; + if (p.frame_title) + frame.push(p.frame_title); + if (p.frame_url) + frame.push(p.frame_url); + var frame_text = frame.join(' - '); + if (frame_text) { + label.appendChild(document.createElement('br')); + var frame_node = document.createElement('span'); + frame_node.className = 'player-frame'; + frame_node.appendChild(document.createTextNode(frame_text)); + label.appendChild(frame_node); + } + + var desc = [] + if (p.width && p.height) + desc.push(p.width + 'x' + p.height); + if (p.video_codec_name) + desc.push(p.video_codec_name); + if (p.video_codec_name && p.audio_codec_name) + desc.push('+'); + if (p.audio_codec_name) + desc.push(p.audio_codec_name); + if (p.event) + desc.push('(' + p.event + ')'); + var desc_text = desc.join(' '); + if (desc_text) { + label.appendChild(document.createElement('br')); + var desc_node = document.createElement('span'); + desc_node.className = 'player-desc'; + desc_node.appendChild(document.createTextNode(desc_text)); + label.appendChild(desc_node); + } var li = document.createElement('li'); var button_cb = this.selectPlayer_.bind(this, player); li.appendChild(createSelectableButton( - id, buttonGroupName, usableName, button_cb, player.destructed)); + id, buttonGroupName, label, button_cb, player.destructed)); fragment.appendChild(li); } removeChildren(this.playerListElement);
diff --git a/content/browser/resources/media/media_internals.css b/content/browser/resources/media/media_internals.css index 372d2a8..72afd8c 100644 --- a/content/browser/resources/media/media_internals.css +++ b/content/browser/resources/media/media_internals.css
@@ -178,10 +178,15 @@ } label.selectable-button { - -webkit-appearance: button; -webkit-user-select: none; - padding: 2px 5px; - margin-bottom: 5px; + display: inline-block; + background: #BDF; + cursor: pointer; + border: solid 1px #999; + border-radius: 3px; + padding: 6px; + margin: 4px 0; + line-height: 1.4; } input.selectable-button { @@ -189,12 +194,25 @@ } input.selectable-button:checked + label.selectable-button { - background-color: #4AA9E4; - color: white; + background-color: #2196F3; + border-color: #666; + color: #FFF; +} + +input.selectable-button:hover + label.selectable-button { + border-color: #666; } label.destructed-player { - background-color: #E4854A; + background-color: #EEE; +} + +.player-name { + font-weight: bold; +} + +.player-frame { + font-style: italic; } .no-players-selected #players .property-wrapper,
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc index 35c121a..be38010 100644 --- a/content/browser/security_exploit_browsertest.cc +++ b/content/browser/security_exploit_browsertest.cc
@@ -46,6 +46,7 @@ #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/url_request/url_request_slow_download_job.h" +#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "third_party/WebKit/public/web/WebTriggeringEventInfo.h" using IPC::IpcSecurityTestUtil; @@ -163,11 +164,15 @@ IPC::IpcSecurityTestUtil::PwnMessageReceived( rfh->GetProcess()->GetChannel(), ResourceHostMsg_RequestResource(rfh->GetRoutingID(), - kRequestIdNotPreviouslyUsed, request)); + kRequestIdNotPreviouslyUsed, request, + net::MutableNetworkTrafficAnnotationTag( + TRAFFIC_ANNOTATION_FOR_TESTS))); IPC::IpcSecurityTestUtil::PwnMessageReceived( rfh->GetProcess()->GetChannel(), ResourceHostMsg_RequestResource(rfh->GetRoutingID(), - kRequestIdNotPreviouslyUsed, request)); + kRequestIdNotPreviouslyUsed, request, + net::MutableNetworkTrafficAnnotationTag( + TRAFFIC_ANNOTATION_FOR_TESTS))); process_killed.Wait(); } @@ -456,7 +461,9 @@ web_rfh->GetProcess()->GetChannel(), ResourceHostMsg_RequestResource(web_rfh->GetRoutingID(), kRequestIdNotPreviouslyUsed, - chrome_origin_msg)); + chrome_origin_msg, + net::MutableNetworkTrafficAnnotationTag( + TRAFFIC_ANNOTATION_FOR_TESTS))); web_process_killed.Wait(); } @@ -476,7 +483,9 @@ web_rfh->GetProcess()->GetChannel(), ResourceHostMsg_RequestResource(web_rfh->GetRoutingID(), kRequestIdNotPreviouslyUsed, - embedder_isolated_origin_msg)); + embedder_isolated_origin_msg, + net::MutableNetworkTrafficAnnotationTag( + TRAFFIC_ANNOTATION_FOR_TESTS))); web_process_killed.Wait(); } @@ -490,7 +499,9 @@ web_rfh->GetProcess()->GetChannel(), ResourceHostMsg_RequestResource(web_rfh->GetRoutingID(), kRequestIdNotPreviouslyUsed, - invalid_origin_msg)); + invalid_origin_msg, + net::MutableNetworkTrafficAnnotationTag( + TRAFFIC_ANNOTATION_FOR_TESTS))); web_process_killed.Wait(); } @@ -504,7 +515,9 @@ web_rfh->GetProcess()->GetChannel(), ResourceHostMsg_RequestResource(web_rfh->GetRoutingID(), kRequestIdNotPreviouslyUsed, - invalid_scheme_origin_msg)); + invalid_scheme_origin_msg, + net::MutableNetworkTrafficAnnotationTag( + TRAFFIC_ANNOTATION_FOR_TESTS))); web_process_killed.Wait(); } }
diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc index f8df38c9..d64ee26 100644 --- a/content/browser/service_worker/embedded_worker_instance.cc +++ b/content/browser/service_worker/embedded_worker_instance.cc
@@ -238,8 +238,8 @@ DISALLOW_COPY_AND_ASSIGN(DevToolsProxy); }; -// A handle for a worker process managed by ServiceWorkerProcessManager on the -// UI thread. +// A handle for a renderer process managed by ServiceWorkerProcessManager on the +// UI thread. Lives on the IO thread. class EmbeddedWorkerInstance::WorkerProcessHandle { public: WorkerProcessHandle(const base::WeakPtr<ServiceWorkerContextCore>& context, @@ -250,12 +250,19 @@ embedded_worker_id_(embedded_worker_id), process_id_(process_id), is_new_process_(is_new_process) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_NE(ChildProcessHost::kInvalidUniqueID, process_id_); } ~WorkerProcessHandle() { - if (context_) - context_->process_manager()->ReleaseWorkerProcess(embedded_worker_id_); + DCHECK_CURRENTLY_ON(BrowserThread::IO); + if (!context_) + return; + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::BindOnce(&ServiceWorkerProcessManager::ReleaseWorkerProcess, + context_->process_manager()->AsWeakPtr(), + embedded_worker_id_)); } int process_id() const { return process_id_; } @@ -290,6 +297,7 @@ is_installed_(false), started_during_browser_startup_(false), weak_factory_(this) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("ServiceWorker", "EmbeddedWorkerInstance::Start", instance_, "Script", script_url.spec()); @@ -309,8 +317,11 @@ break; case ProcessAllocationState::ALLOCATING: // Abort half-baked process allocation on the UI thread. - instance_->context_->process_manager()->ReleaseWorkerProcess( - instance_->embedded_worker_id()); + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::BindOnce(&ServiceWorkerProcessManager::ReleaseWorkerProcess, + instance_->context_->process_manager()->AsWeakPtr(), + instance_->embedded_worker_id())); break; case ProcessAllocationState::ALLOCATED: // Otherwise, the process will be released by EmbeddedWorkerInstance. @@ -461,6 +472,7 @@ } EmbeddedWorkerInstance::~EmbeddedWorkerInstance() { + DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK(status_ == EmbeddedWorkerStatus::STOPPING || status_ == EmbeddedWorkerStatus::STOPPED) << static_cast<int>(status_); @@ -584,7 +596,9 @@ instance_host_binding_(this), devtools_attached_(false), network_accessed_for_script_(false), - weak_factory_(this) {} + weak_factory_(this) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); +} void EmbeddedWorkerInstance::OnProcessAllocated( std::unique_ptr<WorkerProcessHandle> handle,
diff --git a/content/browser/service_worker/embedded_worker_instance.h b/content/browser/service_worker/embedded_worker_instance.h index b99d435..f70c3fc4 100644 --- a/content/browser/service_worker/embedded_worker_instance.h +++ b/content/browser/service_worker/embedded_worker_instance.h
@@ -47,6 +47,8 @@ // This gives an interface to control one EmbeddedWorker instance, which // may be 'in-waiting' or running in one of the child processes added by // AddProcessReference(). +// +// Owned by ServiceWorkerVersion. Lives on the IO thread. class CONTENT_EXPORT EmbeddedWorkerInstance : NON_EXPORTED_BASE(public mojom::EmbeddedWorkerInstanceHost) { public:
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.cc b/content/browser/service_worker/service_worker_controllee_request_handler.cc index 61a3c55..6c679e73 100644 --- a/content/browser/service_worker/service_worker_controllee_request_handler.cc +++ b/content/browser/service_worker/service_worker_controllee_request_handler.cc
@@ -9,6 +9,7 @@ #include <string> #include "base/trace_event/trace_event.h" +#include "components/offline_pages/features/features.h" #include "content/browser/service_worker/service_worker_context_core.h" #include "content/browser/service_worker/service_worker_metrics.h" #include "content/browser/service_worker/service_worker_provider_host.h" @@ -30,6 +31,10 @@ #include "net/url_request/url_request.h" #include "ui/base/page_transition_types.h" +#if BUILDFLAG(ENABLE_OFFLINE_PAGES) +#include "components/offline_pages/core/request_header/offline_page_header.h" +#endif // BUILDFLAG(ENABLE_OFFLINE_PAGES) + namespace content { namespace { @@ -50,6 +55,26 @@ return false; } +#if BUILDFLAG(ENABLE_OFFLINE_PAGES) +// A web page, regardless of whether the service worker is used or not, could +// be downloaded with the offline snapshot captured. The user can then open +// the downloaded page which is identified by the presence of a specific +// offline header in the network request. In this case, we want to fall back +// in order for the subsequent offline page interceptor to bring up the +// offline snapshot of the page. +bool ShouldFallbackToLoadOfflinePage( + const net::HttpRequestHeaders& extra_request_headers) { + std::string offline_header_value; + if (!extra_request_headers.GetHeader(offline_pages::kOfflinePageHeader, + &offline_header_value)) { + return false; + } + offline_pages::OfflinePageHeader offline_header(offline_header_value); + return offline_header.reason == + offline_pages::OfflinePageHeader::Reason::DOWNLOAD; +} +#endif // BUILDFLAG(ENABLE_OFFLINE_PAGES) + } // namespace ServiceWorkerControlleeRequestHandler::ServiceWorkerControlleeRequestHandler( @@ -124,6 +149,13 @@ return NULL; } +#if BUILDFLAG(ENABLE_OFFLINE_PAGES) + // Fall back for the subsequent offline page interceptor to load the offline + // snapshot of the page if required. + if (ShouldFallbackToLoadOfflinePage(request->extra_request_headers())) + return nullptr; +#endif // BUILDFLAG(ENABLE_OFFLINE_PAGES) + // It's for original request (A) or redirect case (B-a or B-b). std::unique_ptr<ServiceWorkerURLRequestJob> job( new ServiceWorkerURLRequestJob( @@ -176,6 +208,17 @@ // never see use_network_ gets true. DCHECK(!use_network_); +#if BUILDFLAG(ENABLE_OFFLINE_PAGES) + // Fall back for the subsequent offline page interceptor to load the offline + // snapshot of the page if required. + net::HttpRequestHeaders extra_request_headers; + extra_request_headers.AddHeadersFromString(resource_request.headers); + if (ShouldFallbackToLoadOfflinePage(extra_request_headers)) { + std::move(callback).Run(StartLoaderCallback()); + return; + } +#endif // BUILDFLAG(ENABLE_OFFLINE_PAGES) + url_job_ = base::MakeUnique<ServiceWorkerURLJobWrapper>( base::MakeUnique<ServiceWorkerURLLoaderJob>( std::move(callback), this, resource_request, blob_storage_context_));
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc index fd10726..5c6f391 100644 --- a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc +++ b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
@@ -11,6 +11,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/logging.h" #include "base/run_loop.h" +#include "components/offline_pages/features/features.h" #include "content/browser/browser_thread_impl.h" #include "content/browser/service_worker/embedded_worker_test_helper.h" #include "content/browser/service_worker/service_worker_context_core.h" @@ -78,6 +79,8 @@ void ResetHandler() { handler_.reset(nullptr); } + net::URLRequest* request() const { return request_.get(); } + private: ServiceWorkerControlleeRequestHandlerTest* test_; std::unique_ptr<net::URLRequest> request_; @@ -378,4 +381,50 @@ EXPECT_FALSE(sub_cors_job->ShouldForwardToServiceWorker()); } +#if BUILDFLAG(ENABLE_OFFLINE_PAGES) +TEST_F(ServiceWorkerControlleeRequestHandlerTest, FallbackWithOfflineHeader) { + version_->set_fetch_handler_existence( + ServiceWorkerVersion::FetchHandlerExistence::EXISTS); + version_->SetStatus(ServiceWorkerVersion::ACTIVATED); + registration_->SetActiveVersion(version_); + context()->storage()->StoreRegistration( + registration_.get(), version_.get(), + base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); + base::RunLoop().RunUntilIdle(); + version_ = NULL; + registration_ = NULL; + + ServiceWorkerRequestTestResources test_resources( + this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME); + // Sets an offline header to indicate force loading offline page. + test_resources.request()->SetExtraRequestHeaderByName( + "X-Chrome-offline", "reason=download", true); + ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob(); + + EXPECT_FALSE(sw_job); +} + +TEST_F(ServiceWorkerControlleeRequestHandlerTest, FallbackWithNoOfflineHeader) { + version_->set_fetch_handler_existence( + ServiceWorkerVersion::FetchHandlerExistence::EXISTS); + version_->SetStatus(ServiceWorkerVersion::ACTIVATED); + registration_->SetActiveVersion(version_); + context()->storage()->StoreRegistration( + registration_.get(), version_.get(), + base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); + base::RunLoop().RunUntilIdle(); + version_ = NULL; + registration_ = NULL; + + ServiceWorkerRequestTestResources test_resources( + this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME); + // Empty offline header value should not cause fallback. + test_resources.request()->SetExtraRequestHeaderByName("X-Chrome-offline", "", + true); + ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob(); + + EXPECT_TRUE(sw_job); +} +#endif // BUILDFLAG(ENABLE_OFFLINE_PAGE + } // namespace content
diff --git a/content/browser/service_worker/service_worker_process_manager.cc b/content/browser/service_worker/service_worker_process_manager.cc index 4cf0da9..48d2547 100644 --- a/content/browser/service_worker/service_worker_process_manager.cc +++ b/content/browser/service_worker/service_worker_process_manager.cc
@@ -237,16 +237,7 @@ } void ServiceWorkerProcessManager::ReleaseWorkerProcess(int embedded_worker_id) { - if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { - BrowserThread::PostTask( - BrowserThread::UI, - FROM_HERE, - base::Bind(&ServiceWorkerProcessManager::ReleaseWorkerProcess, - weak_this_, - embedded_worker_id)); - return; - } - + DCHECK_CURRENTLY_ON(BrowserThread::UI); if (process_id_for_test_ != ChildProcessHost::kInvalidUniqueID) { // Unittests don't increment or decrement the worker refcount of a // RenderProcessHost. @@ -267,7 +258,7 @@ if (info == instance_info_.end()) return; - RenderProcessHost* rph = NULL; + RenderProcessHost* rph = nullptr; if (info->second.site_instance.get()) { rph = info->second.site_instance->GetProcess(); DCHECK_EQ(info->second.process_id, rph->GetID())
diff --git a/content/browser/service_worker/service_worker_process_manager.h b/content/browser/service_worker/service_worker_process_manager.h index 606164f..6c86d491 100644 --- a/content/browser/service_worker/service_worker_process_manager.h +++ b/content/browser/service_worker/service_worker_process_manager.h
@@ -60,9 +60,11 @@ // Returns a reference to a running process suitable for starting the service // worker described by |emdedded_worker_id|, |pattern|, and |script_url|. // - // AllocateWorkerProcess() tries to return an existing process. If one is not - // available, or |can_use_existing_process| is false, it will create a new - // one. + // AllocateWorkerProcess() tries to return a process that already exists in + // this ServiceWorkerProcessManager's map of processes, populated via + // AddProcessReferenceToPattern(). If one is not found, or + // |can_use_existing_process| is false, it will instead use SiteInstance to + // get a process, possibly creating a new one. // // If SERVICE_WORKER_OK is returned, |out_info| contains information about the // process. @@ -79,6 +81,8 @@ // Drops a reference to a process that was running a Service Worker, and its // SiteInstance. This must match a call to AllocateWorkerProcess. + // + // Called on the UI thread. void ReleaseWorkerProcess(int embedded_worker_id); // Sets a single process ID that will be used for all embedded workers. This
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 24a2536..ef3341d9b 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -111,8 +111,11 @@ #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/android/scoped_java_ref.h" +#include "base/json/json_reader.h" #include "content/browser/android/ime_adapter_android.h" +#include "content/browser/renderer_host/input/touch_selection_controller_client_manager_android.h" #include "content/browser/renderer_host/render_widget_host_view_android.h" +#include "ui/gfx/geometry/point_f.h" #endif using ::testing::SizeIs; @@ -10487,4 +10490,306 @@ ->GetProcess()); } +#if defined(OS_ANDROID) +// Tests for Android TouchSelectionEditing. +class TouchSelectionControllerClientAndroidSiteIsolationTest + : public SitePerProcessBrowserTest { + public: + TouchSelectionControllerClientAndroidSiteIsolationTest() {} + + void SetUpCommandLine(base::CommandLine* command_line) override { + IsolateAllSitesForTesting(command_line); + } + + RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid() { + return static_cast<RenderWidgetHostViewAndroid*>( + shell()->web_contents()->GetRenderWidgetHostView()); + } + + void SelectWithLongPress(gfx::Point point) { + // Get main frame view for event insertion. + RenderWidgetHostViewAndroid* main_view = GetRenderWidgetHostViewAndroid(); + + SendTouch(main_view, ui::MotionEvent::ACTION_DOWN, point); + // action_timeout() is far longer than needed for a LongPress, so we use + // a custom timeout here. + DelayBy(base::TimeDelta::FromMilliseconds(2000)); + SendTouch(main_view, ui::MotionEvent::ACTION_UP, point); + } + + void SimpleTap(gfx::Point point) { + // Get main frame view for event insertion. + RenderWidgetHostViewAndroid* main_view = GetRenderWidgetHostViewAndroid(); + + SendTouch(main_view, ui::MotionEvent::ACTION_DOWN, point); + // tiny_timeout() is way shorter than a reasonable user-created tap gesture, + // so we use a custom timeout here. + DelayBy(base::TimeDelta::FromMilliseconds(300)); + SendTouch(main_view, ui::MotionEvent::ACTION_UP, point); + } + + protected: + void DelayBy(base::TimeDelta delta) { + base::RunLoop run_loop; + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), delta); + run_loop.Run(); + } + + private: + void SendTouch(RenderWidgetHostViewAndroid* view, + ui::MotionEvent::Action action, + gfx::Point point) { + DCHECK(action >= ui::MotionEvent::ACTION_DOWN && + action << ui::MotionEvent::ACTION_CANCEL); + ui::MotionEventGeneric touch( + action, ui::EventTimeForNow(), + ui::PointerProperties(point.x(), point.y(), 10)); + view->OnTouchEvent(touch); + } +}; + +class FrameStableObserver { + public: + FrameStableObserver(RenderWidgetHostViewBase* view, base::TimeDelta delta) + : view_(view), delta_(delta) {} + virtual ~FrameStableObserver() {} + + void WaitUntilStable() { + uint32_t current_frame_number = view_->RendererFrameNumber(); + uint32_t previous_frame_number; + + do { + base::RunLoop run_loop; + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), delta_); + run_loop.Run(); + previous_frame_number = current_frame_number; + current_frame_number = view_->RendererFrameNumber(); + } while (current_frame_number != previous_frame_number); + } + + private: + RenderWidgetHostViewBase* view_; + base::TimeDelta delta_; + + DISALLOW_COPY_AND_ASSIGN(FrameStableObserver); +}; + +class TouchSelectionControllerClientTestWrapper + : public ui::TouchSelectionControllerClient { + public: + explicit TouchSelectionControllerClientTestWrapper( + ui::TouchSelectionControllerClient* client) + : expected_event_(ui::SELECTION_HANDLES_SHOWN), client_(client) {} + + ~TouchSelectionControllerClientTestWrapper() override {} + + void InitWaitForSelectionEvent(ui::SelectionEventType expected_event) { + DCHECK(!run_loop_); + expected_event_ = expected_event; + run_loop_.reset(new base::RunLoop()); + } + + void Wait() { + DCHECK(run_loop_); + run_loop_->Run(); + run_loop_.reset(); + } + + private: + // TouchSelectionControllerClient: + void OnSelectionEvent(ui::SelectionEventType event) override { + client_->OnSelectionEvent(event); + if (run_loop_ && event == expected_event_) + run_loop_->Quit(); + } + + bool SupportsAnimation() const override { + return client_->SupportsAnimation(); + } + + void SetNeedsAnimate() override { client_->SetNeedsAnimate(); } + + void MoveCaret(const gfx::PointF& position) override { + client_->MoveCaret(position); + } + + void MoveRangeSelectionExtent(const gfx::PointF& extent) override { + client_->MoveRangeSelectionExtent(extent); + } + + void SelectBetweenCoordinates(const gfx::PointF& base, + const gfx::PointF& extent) override { + client_->SelectBetweenCoordinates(base, extent); + } + + std::unique_ptr<ui::TouchHandleDrawable> CreateDrawable() override { + return client_->CreateDrawable(); + } + + ui::SelectionEventType expected_event_; + std::unique_ptr<base::RunLoop> run_loop_; + // Not owned. + ui::TouchSelectionControllerClient* client_; + + DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerClientTestWrapper); +}; + +namespace { + +bool ConvertJSONToPoint(const std::string& str, gfx::PointF* point) { + std::unique_ptr<base::Value> value = base::JSONReader::Read(str); + if (!value) + return false; + base::DictionaryValue* root; + if (!value->GetAsDictionary(&root)) + return false; + double x, y; + if (!root->GetDouble("x", &x)) + return false; + if (!root->GetDouble("y", &y)) + return false; + point->set_x(x); + point->set_y(y); + return true; +} + +} // namespace + +IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAndroidSiteIsolationTest, + BasicSelectionIsolatedIframe) { + GURL test_url(embedded_test_server()->GetURL( + "a.com", "/cross_site_iframe_factory.html?a(a)")); + EXPECT_TRUE(NavigateToURL(shell(), test_url)); + FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) + ->GetFrameTree() + ->root(); + EXPECT_EQ( + " Site A\n" + " +--Site A\n" + "Where A = http://a.com/", + FrameTreeVisualizer().DepictFrameTree(root)); + TestNavigationObserver observer(shell()->web_contents()); + EXPECT_EQ(1u, root->child_count()); + FrameTreeNode* child = root->child_at(0); + + RenderWidgetHostViewAndroid* parent_view = + static_cast<RenderWidgetHostViewAndroid*>( + root->current_frame_host()->GetRenderWidgetHost()->GetView()); + TouchSelectionControllerClientTestWrapper* selection_controller_client = + new TouchSelectionControllerClientTestWrapper( + parent_view->GetSelectionControllerClientManagerForTesting()); + parent_view->SetSelectionControllerClientForTesting( + base::WrapUnique(selection_controller_client)); + + // We need to load the desired subframe and then wait until it's stable, i.e. + // generates no new compositor frames for some reasonable time period: a stray + // frame between touch selection's pre-handling of GestureLongPress and the + // expected frame containing the selected region can confuse the + // TouchSelectionController, causing it to fail to show selection handles. + // Note this is an issue with the TouchSelectionController in general, and + // not a property of this test. + GURL child_url( + embedded_test_server()->GetURL("b.com", "/touch_selection.html")); + NavigateFrameToURL(child, child_url); + EXPECT_EQ( + " Site A ------------ proxies for B\n" + " +--Site B ------- proxies for A\n" + "Where A = http://a.com/\n" + " B = http://b.com/", + FrameTreeVisualizer().DepictFrameTree(root)); + // The child will change with the cross-site navigation. It shouldn't change + // after this. + child = root->child_at(0); + WaitForChildFrameSurfaceReady(child->current_frame_host()); + + RenderWidgetHostViewChildFrame* child_view = + static_cast<RenderWidgetHostViewChildFrame*>( + child->current_frame_host()->GetRenderWidgetHost()->GetView()); + + EXPECT_EQ(child_url, observer.last_navigation_url()); + EXPECT_TRUE(observer.last_navigation_succeeded()); + FrameStableObserver child_frame_stable_observer(child_view, + TestTimeouts::tiny_timeout()); + child_frame_stable_observer.WaitUntilStable(); + + EXPECT_EQ(ui::TouchSelectionController::INACTIVE, + parent_view->touch_selection_controller()->active_status()); + // Find the location of some text to select. + auto* manager = static_cast<TouchSelectionControllerClientManagerAndroid*>( + parent_view->GetTouchSelectionControllerClientManager()); + float page_scale_factor = manager->page_scale_factor(); + gfx::PointF point_f; + std::string str; + EXPECT_TRUE(ExecuteScriptAndExtractString(child->current_frame_host(), + "get_point_inside_text()", &str)); + ConvertJSONToPoint(str, &point_f); + gfx::Point origin = child_view->GetViewOriginInRoot(); + gfx::Vector2dF origin_vec(origin.x(), origin.y()); + point_f += origin_vec; + point_f.Scale(page_scale_factor); + + // Initiate selection with a sequence of events that go through the targeting + // system. + selection_controller_client->InitWaitForSelectionEvent( + ui::SELECTION_HANDLES_SHOWN); + + SelectWithLongPress(gfx::Point(point_f.x(), point_f.y())); + + selection_controller_client->Wait(); + + // Check that selection is active and the quick menu is showing. + EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, + parent_view->touch_selection_controller()->active_status()); + + // Tap inside/outside the iframe and make sure the selection handles go away. + selection_controller_client->InitWaitForSelectionEvent( + ui::SELECTION_HANDLES_CLEARED); + // Since Android tests may run with page_scale_factor < 1, use an offset a + // bigger than +/-1 for doing the inside/outside taps to cancel the selection + // handles. + gfx::PointF point_inside_iframe = gfx::PointF(+5.f, +5.f) + origin_vec; + point_inside_iframe.Scale(page_scale_factor); + SimpleTap(gfx::Point(point_inside_iframe.x(), point_inside_iframe.y())); + selection_controller_client->Wait(); + + EXPECT_EQ(ui::TouchSelectionController::INACTIVE, + parent_view->touch_selection_controller()->active_status()); + + // Let's wait for the previous events to clear the round-trip to the renders + // and back. + DelayBy(base::TimeDelta::FromMilliseconds(2000)); + + // Initiate selection with a sequence of events that go through the targeting + // system. Repeat of above but this time we'l cancel the selection by + // tapping outside of the OOPIF. + selection_controller_client->InitWaitForSelectionEvent( + ui::SELECTION_HANDLES_SHOWN); + + SelectWithLongPress(gfx::Point(point_f.x(), point_f.y())); + + selection_controller_client->Wait(); + + // Check that selection is active and the quick menu is showing. + EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, + parent_view->touch_selection_controller()->active_status()); + + // Tap inside/outside the iframe and make sure the selection handles go away. + selection_controller_client->InitWaitForSelectionEvent( + ui::SELECTION_HANDLES_CLEARED); + // Since Android tests may run with page_scale_factor < 1, use an offset a + // bigger than +/-1 for doing the inside/outside taps to cancel the selection + // handles. + gfx::PointF point_outside_iframe = gfx::PointF(-5.f, -5.f) + origin_vec; + point_outside_iframe.Scale(page_scale_factor); + SimpleTap(gfx::Point(point_outside_iframe.x(), point_outside_iframe.y())); + selection_controller_client->Wait(); + + EXPECT_EQ(ui::TouchSelectionController::INACTIVE, + parent_view->touch_selection_controller()->active_status()); +} + +#endif // defined(OS_ANDROID) + } // namespace content
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc index 4ff9f579..c50b6ef 100644 --- a/content/browser/storage_partition_impl.cc +++ b/content/browser/storage_partition_impl.cc
@@ -5,6 +5,7 @@ #include "content/browser/storage_partition_impl.h" #include <stddef.h> +#include <stdint.h> #include <set> #include <vector> @@ -64,7 +65,7 @@ return cookie.IsHostCookie() && cookie.IsDomainMatch(host); } -void OnClearedCookies(const base::Closure& callback, int num_deleted) { +void OnClearedCookies(const base::Closure& callback, uint32_t num_deleted) { // The final callback needs to happen from UI thread. if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { BrowserThread::PostTask(
diff --git a/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc b/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc index f9da9d08..008ee47f 100644 --- a/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc +++ b/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc
@@ -4,6 +4,7 @@ #include "base/command_line.h" #include "base/strings/stringprintf.h" +#include "build/build_config.h" #include "content/browser/webrtc/webrtc_content_browsertest_base.h" #include "content/public/common/content_switches.h" #include "media/base/media_switches.h" @@ -101,8 +102,15 @@ MakeTypicalCall("testCanvasCapture(drawWebGL);", kCanvasCaptureTestHtmlFile); } +#if defined(OS_LINUX) +#define MAYBE_VerifyCanvasCaptureOffscreenCanvasCommitFrames \ + DISABLED_VerifyCanvasCaptureOffscreenCanvasCommitFrames +#else +#define MAYBE_VerifyCanvasCaptureOffscreenCanvasCommitFrames \ + VerifyCanvasCaptureOffscreenCanvasCommitFrames +#endif IN_PROC_BROWSER_TEST_F(WebRtcCaptureFromElementBrowserTest, - VerifyCanvasCaptureOffscreenCanvasCommitFrames) { + MAYBE_VerifyCanvasCaptureOffscreenCanvasCommitFrames) { MakeTypicalCall("testCanvasCapture(drawOffscreenCanvasCommit);", kCanvasCaptureTestHtmlFile); }
diff --git a/content/browser/webrtc/webrtc_eventlog_host_unittest.cc b/content/browser/webrtc/webrtc_eventlog_host_unittest.cc index a9659cb8..776c80d 100644 --- a/content/browser/webrtc/webrtc_eventlog_host_unittest.cc +++ b/content/browser/webrtc/webrtc_eventlog_host_unittest.cc
@@ -189,7 +189,7 @@ // maximum allowed number of IPC messages and log files will be opened, but we // expect the number of stop IPC messages to be equal to the actual number of // PeerConnections. -TEST_F(WebRtcEventlogHostTest, ExceedMaxPeerConnectionsTest) { +TEST_F(WebRtcEventlogHostTest, DISABLED_ExceedMaxPeerConnectionsTest) { #if defined(OS_ANDROID) const int kMaxNumberLogFiles = 3; #else
diff --git a/content/child/resource_dispatcher.cc b/content/child/resource_dispatcher.cc index 4d724c1..a0b9c47 100644 --- a/content/child/resource_dispatcher.cc +++ b/content/child/resource_dispatcher.cc
@@ -662,6 +662,30 @@ return request_id; } + net::NetworkTrafficAnnotationTag traffic_annotation = + net::DefineNetworkTrafficAnnotation("blink_resource_loader", R"( + semantics { + sender: "Blink Resource Loader" + description: + "Blink initiated request, which includes all resources for " + "normal page loads, chrome URLs, resources for installed " + "extensions, as well as downloads." + trigger: + "Navigating to a URL or downloading a file. A webpage, " + "ServiceWorker, chrome:// page, or extension may also initiate " + "requests in the background." + data: "Anything the initiator wants to send." + destination: OTHER + } + policy { + cookies_allowed: true + cookies_store: "user" + setting: "These requests cannot be disabled in settings." + policy_exception_justification: + "Not implemented. Without these requests, Chrome will be unable " + "to load any webpage." + })"); + if (ipc_type == blink::WebURLRequest::LoadingIPCType::kMojo) { scoped_refptr<base::SingleThreadTaskRunner> task_runner = loading_task_runner ? loading_task_runner : thread_task_runner_; @@ -671,12 +695,13 @@ ThrottlingURLLoader::CreateLoaderAndStart( url_loader_factory, std::move(throttles), routing_id, request_id, mojom::kURLLoadOptionNone, *request, client.get(), - NO_TRAFFIC_ANNOTATION_YET, std::move(task_runner)); + traffic_annotation, std::move(task_runner)); pending_requests_[request_id]->url_loader = std::move(url_loader); pending_requests_[request_id]->url_loader_client = std::move(client); } else { - message_sender_->Send( - new ResourceHostMsg_RequestResource(routing_id, request_id, *request)); + message_sender_->Send(new ResourceHostMsg_RequestResource( + routing_id, request_id, *request, + net::MutableNetworkTrafficAnnotationTag(traffic_annotation))); } return request_id;
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index d80a199..8affb3fe 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -9,6 +9,7 @@ #include "base/command_line.h" #include "base/feature_list.h" #include "base/metrics/field_trial.h" +#include "base/metrics/field_trial_params.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "build/build_config.h" @@ -390,6 +391,10 @@ WebRuntimeFeatures::EnableModuleScripts( base::FeatureList::IsEnabled(features::kModuleScripts)); + WebRuntimeFeatures::EnableClientPlaceholdersForServerLoFi( + base::GetFieldTrialParamValue("PreviewsClientLoFi", + "replace_server_placeholders") == "true"); + // Enable explicitly enabled features, and then disable explicitly disabled // ones. if (command_line.HasSwitch(switches::kEnableBlinkFeatures)) {
diff --git a/content/common/resource_messages.h b/content/common/resource_messages.h index 0fe7c8438..885adb0 100644 --- a/content/common/resource_messages.h +++ b/content/common/resource_messages.h
@@ -27,6 +27,7 @@ #include "net/cert/signed_certificate_timestamp_and_status.h" #include "net/http/http_response_info.h" #include "net/ssl/ssl_info.h" +#include "net/traffic_annotation/network_traffic_annotation.h" #include "net/url_request/redirect_info.h" #include "third_party/WebKit/public/platform/WebMixedContentContextType.h" @@ -236,6 +237,10 @@ IPC_STRUCT_TRAITS_MEMBER(referred_token_binding_host) IPC_STRUCT_TRAITS_END() +IPC_STRUCT_TRAITS_BEGIN(net::MutableNetworkTrafficAnnotationTag) + IPC_STRUCT_TRAITS_MEMBER(unique_id_hash_code) +IPC_STRUCT_TRAITS_END() + IPC_STRUCT_TRAITS_BEGIN(net::SignedCertificateTimestampAndStatus) IPC_STRUCT_TRAITS_MEMBER(sct) IPC_STRUCT_TRAITS_MEMBER(status) @@ -369,10 +374,12 @@ // Resource messages sent from the renderer to the browser. // Makes a resource request via the browser. -IPC_MESSAGE_CONTROL3(ResourceHostMsg_RequestResource, - int /* routing_id */, - int /* request_id */, - content::ResourceRequest) +IPC_MESSAGE_CONTROL4( + ResourceHostMsg_RequestResource, + int /* routing_id */, + int /* request_id */, + content::ResourceRequest, + net::MutableNetworkTrafficAnnotationTag /* network_traffic_annotation */) // Cancels a resource request with the ID given as the parameter. IPC_MESSAGE_CONTROL1(ResourceHostMsg_CancelRequest,
diff --git a/content/common/sandbox_init_mac.cc b/content/common/sandbox_init_mac.cc index f73e85db..314bfbb 100644 --- a/content/common/sandbox_init_mac.cc +++ b/content/common/sandbox_init_mac.cc
@@ -4,6 +4,7 @@ #include "content/common/sandbox_init_mac.h" +#include "base/callback.h" #include "base/command_line.h" #include "base/files/file_path.h" #include "base/logging.h" @@ -14,14 +15,28 @@ namespace content { -bool InitializeSandbox(int sandbox_type, const base::FilePath& allowed_dir) { +namespace { + +bool InitializeSandbox(int sandbox_type, + const base::FilePath& allowed_dir, + base::OnceClosure hook) { // Warm up APIs before turning on the sandbox. Sandbox::SandboxWarmup(sandbox_type); + // Execute the post warmup callback. + if (!hook.is_null()) + std::move(hook).Run(); + // Actually sandbox the process. return Sandbox::EnableSandbox(sandbox_type, allowed_dir); } +} // namespace + +bool InitializeSandbox(int sandbox_type, const base::FilePath& allowed_dir) { + return InitializeSandbox(sandbox_type, allowed_dir, base::OnceClosure()); +} + // Fill in |sandbox_type| and |allowed_dir| based on the command line, returns // false if the current process type doesn't need to be sandboxed or if the // sandbox was disabled from the command line. @@ -72,12 +87,16 @@ return true; } -bool InitializeSandbox() { +bool InitializeSandboxWithPostWarmupHook(base::OnceClosure hook) { int sandbox_type = 0; base::FilePath allowed_dir; if (!GetSandboxTypeFromCommandLine(&sandbox_type, &allowed_dir)) return true; - return InitializeSandbox(sandbox_type, allowed_dir); + return InitializeSandbox(sandbox_type, allowed_dir, std::move(hook)); +} + +bool InitializeSandbox() { + return InitializeSandboxWithPostWarmupHook(base::OnceClosure()); } } // namespace content
diff --git a/content/common/sandbox_init_mac.h b/content/common/sandbox_init_mac.h index 8f860efd..375b3d99 100644 --- a/content/common/sandbox_init_mac.h +++ b/content/common/sandbox_init_mac.h
@@ -5,6 +5,8 @@ #ifndef CONTENT_COMMON_SANDBOX_INIT_MAC_H_ #define CONTENT_COMMON_SANDBOX_INIT_MAC_H_ +#include "base/callback_forward.h" + namespace content { // Initialize the sandbox for renderer, gpu, utility, worker, and plugin @@ -15,6 +17,10 @@ // returned. bool InitializeSandbox(); +// Initializes the sandbox, as described above, but executes the callback after +// warmup and before initialization. +bool InitializeSandboxWithPostWarmupHook(base::OnceClosure hook); + } // namespace content #endif // CONTENT_COMMON_SANDBOX_INIT_MAC_H_
diff --git a/content/common/sandbox_mac.mm b/content/common/sandbox_mac.mm index 49886fde..cfe004f 100644 --- a/content/common/sandbox_mac.mm +++ b/content/common/sandbox_mac.mm
@@ -41,12 +41,6 @@ #include "ui/base/layout.h" #include "ui/gl/init/gl_factory.h" -extern "C" { -void CGSSetDenyWindowServerConnections(bool); -void CGSShutdownServerConnections(); -OSStatus SetApplicationIsDaemon(Boolean isDaemon); -}; - namespace content { namespace { @@ -175,21 +169,6 @@ NSColor* color = [NSColor controlTextColor]; [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; } - - if (sandbox_type == SANDBOX_TYPE_RENDERER) { - // Now disconnect from WindowServer, after all objects have been warmed up. - // Shutting down the connection requires connecting to WindowServer, - // so do this before actually engaging the sandbox. This may cause two log - // messages to be printed to the system logger on certain OS versions. - CGSSetDenyWindowServerConnections(true); - CGSShutdownServerConnections(); - - // Allow the process to continue without a LaunchServices ASN. The - // INIT_Process function in HIServices will abort if it cannot connect to - // launchservicesd to get an ASN. By setting this flag, HIServices skips - // that. - SetApplicationIsDaemon(true); - } } // Load the appropriate template for the given sandbox type.
diff --git a/content/common/view_messages.h b/content/common/view_messages.h index d52258a..8ca428f 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h
@@ -38,7 +38,6 @@ #include "media/base/audio_parameters.h" #include "media/base/channel_layout.h" #include "media/base/ipc/media_param_traits.h" -#include "media/base/media_log_event.h" #include "media/capture/ipc/capture_param_traits.h" #include "net/base/network_change_notifier.h" #include "ppapi/features/features.h" @@ -109,8 +108,6 @@ content::TAP_MULTIPLE_TARGETS_STRATEGY_MAX) IPC_ENUM_TRAITS_MAX_VALUE(content::ThreeDAPIType, content::THREE_D_API_TYPE_LAST) -IPC_ENUM_TRAITS_MAX_VALUE(media::MediaLogEvent::Type, - media::MediaLogEvent::TYPE_LAST) IPC_ENUM_TRAITS_MAX_VALUE(ui::TextInputMode, ui::TEXT_INPUT_MODE_MAX) IPC_ENUM_TRAITS_MAX_VALUE(ui::TextInputType, ui::TEXT_INPUT_TYPE_MAX) @@ -258,13 +255,6 @@ IPC_STRUCT_TRAITS_MEMBER(default_font_size) IPC_STRUCT_TRAITS_END() -IPC_STRUCT_TRAITS_BEGIN(media::MediaLogEvent) - IPC_STRUCT_TRAITS_MEMBER(id) - IPC_STRUCT_TRAITS_MEMBER(type) - IPC_STRUCT_TRAITS_MEMBER(params) - IPC_STRUCT_TRAITS_MEMBER(time) -IPC_STRUCT_TRAITS_END() - IPC_STRUCT_TRAITS_BEGIN(content::TextInputState) IPC_STRUCT_TRAITS_MEMBER(type) IPC_STRUCT_TRAITS_MEMBER(mode)
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn index e9a3dfe..53ceaab2 100644 --- a/content/public/android/BUILD.gn +++ b/content/public/android/BUILD.gn
@@ -114,6 +114,7 @@ "java/src/org/chromium/content/browser/BrowserStartupController.java", "java/src/org/chromium/content/browser/ChildConnectionAllocator.java", "java/src/org/chromium/content/browser/ChildProcessConnection.java", + "java/src/org/chromium/content/browser/ChildProcessLauncher.java", "java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java", "java/src/org/chromium/content/browser/ContentChildProcessConstants.java", "java/src/org/chromium/content/browser/ContentClassFactory.java", @@ -373,6 +374,9 @@ android_library("content_javatests") { testonly = true + + srcjar_deps = [ "//content/shell/android:content_javatests_aidl" ] + deps = [ ":content_java", "//base:base_java", @@ -396,6 +400,7 @@ "//net/android:net_java_test_support", "//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:runner_java", + "//third_party/jsr-305:jsr_305_javalib", "//third_party/junit", "//ui/android:ui_java", "//ui/gfx/geometry/mojo:mojo_java", @@ -405,6 +410,7 @@ "javatests/src/org/chromium/content/browser/BrowserStartupControllerTest.java", "javatests/src/org/chromium/content/browser/ChildProcessLauncherIntegrationTest.java", "javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java", + "javatests/src/org/chromium/content/browser/ChildProcessLauncherHelperTest.java", "javatests/src/org/chromium/content/browser/ClipboardTest.java", "javatests/src/org/chromium/content/browser/ContentCommandLineTest.java", "javatests/src/org/chromium/content/browser/ContentViewCoreSelectionTest.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildConnectionAllocator.java b/content/public/android/java/src/org/chromium/content/browser/ChildConnectionAllocator.java index 8d1e260..c1972fc 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ChildConnectionAllocator.java +++ b/content/public/android/java/src/org/chromium/content/browser/ChildConnectionAllocator.java
@@ -27,14 +27,14 @@ private static final String TAG = "ChildConnAllocator"; /** Listener that clients can use to get notified when connections get allocated/freed. */ - public interface Listener { + public abstract static class Listener { /** Called when a connection has been allocated, before it gets bound. */ - void onConnectionAllocated( - ChildConnectionAllocator allocator, ChildProcessConnection connection); + public void onConnectionAllocated( + ChildConnectionAllocator allocator, ChildProcessConnection connection) {} /** Called when a connection has been freed. */ - void onConnectionFreed( - ChildConnectionAllocator allocator, ChildProcessConnection connection); + public void onConnectionFreed( + ChildConnectionAllocator allocator, ChildProcessConnection connection) {} } /** Factory interface. Used by tests to specialize created connections. */ @@ -103,8 +103,7 @@ // Check that the service exists. try { - // PackageManager#getServiceInfo() throws an exception if the service does not - // exist. + // PackageManager#getServiceInfo() throws an exception if the service does not exist. packageManager.getServiceInfo( new ComponentName(packageName, serviceClassName + "0"), 0); } catch (PackageManager.NameNotFoundException e) {
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java new file mode 100644 index 0000000..4fc7085 --- /dev/null +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
@@ -0,0 +1,298 @@ +// Copyright 2017 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. + +package org.chromium.content.browser; + +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; + +import org.chromium.base.ContextUtils; +import org.chromium.base.Log; +import org.chromium.base.TraceEvent; +import org.chromium.base.annotations.SuppressFBWarnings; +import org.chromium.base.process_launcher.ChildProcessConstants; +import org.chromium.base.process_launcher.FileDescriptorInfo; + +import java.io.IOException; + +/** + * This class is used to start a child process by connecting to a ChildProcessService. + */ +public class ChildProcessLauncher { + private static final String TAG = "ChildProcLauncher"; + + /** Delegate that client should use to customize the process launching. */ + public interface Delegate { + /** + * Called before a connection is allocated. + * Note that this is only called if the ChildProcessLauncher is created with + * {@link #createWithConnectionAllocator}. + * @param serviceBundle the bundle passed in the service intent. Clients can add their own + * extras to the bundle. + */ + void onBeforeConnectionAllocated(Bundle serviceBundle); + + /** + * Called before setup is called on the connection. + * @param connectionBundle the bundle passed to the {@link ChildProcessService} in the + * setup call. Clients can add their own extras to the bundle. + */ + void onBeforeConnectionSetup(Bundle connectionBundle); + + /** + * Called when the connection was successfully established, meaning the setup call on the + * service was successful. + * @param connection the connection over which the setup call was made. + */ + void onConnectionEstablished(ChildProcessConnection connection); + + /** + * Called when a connection has been disconnected. Only invoked if onConnectionEstablished + * was called, meaning the connection was already established. + * @param connection the connection that got disconnected. + */ + void onConnectionLost(ChildProcessConnection connection); + } + + /** + * Interface used by clients that already have a bound connection ready when instanciating the + * ChildProcessLauncher. + */ + public interface BoundConnectionProvider { + ChildProcessConnection getConnection( + ChildProcessConnection.ServiceCallback serviceCallback); + } + + // Represents an invalid process handle; same as base/process/process.h kNullProcessHandle. + private static final int NULL_PROCESS_HANDLE = 0; + + // The handle for the thread we were created on and on which all methods should be called. + private final Handler mLauncherHandler = new Handler(); + + private final Delegate mDelegate; + + private final String[] mCommandLine; + private final FileDescriptorInfo[] mFilesToBeMapped; + + // The allocator used to create the connection. + private final BoundConnectionProvider mConnectionProvider; + + // The allocator used to create the connection. + private final ChildConnectionAllocator mConnectionAllocator; + + // The IBinder provided to the created service. + private final IBinder mIBinderCallback; + + // The actual service connection. Set once we have connected to the service. + private ChildProcessConnection mConnection; + + /** + * Creates a ChildProcessLauncher using the already bound connection provided. + * Note that onBeforeConnectionAllocated and onConnectionBound will not be invoked on the + * delegate since the connection is already available. + */ + public static ChildProcessLauncher createWithBoundConnectionProvider(Delegate delegate, + String[] commandLine, FileDescriptorInfo[] filesToBeMapped, + BoundConnectionProvider connectionProvider, IBinder binderCallback) { + return new ChildProcessLauncher(delegate, commandLine, filesToBeMapped, connectionProvider, + null /* connectionAllocator */, binderCallback); + } + + /** + * Creates a ChildProcessLauncher that will create a connection using the specified + * ChildConnectionAllocator. + */ + public static ChildProcessLauncher createWithConnectionAllocator(Delegate delegate, + String[] commandLine, FileDescriptorInfo[] filesToBeMapped, + ChildConnectionAllocator connectionAllocator, IBinder binderCallback) { + return new ChildProcessLauncher(delegate, commandLine, filesToBeMapped, + null /* connection */, connectionAllocator, binderCallback); + } + + @SuppressFBWarnings("EI_EXPOSE_REP2") + private ChildProcessLauncher(Delegate delegate, String[] commandLine, + FileDescriptorInfo[] filesToBeMapped, BoundConnectionProvider connectionProvider, + ChildConnectionAllocator connectionAllocator, IBinder binderCallback) { + // Either a bound connection provider or a connection allocator should be provided. + assert (connectionProvider == null) != (connectionAllocator == null); + mCommandLine = commandLine; + mConnectionProvider = connectionProvider; + mConnectionAllocator = connectionAllocator; + mDelegate = delegate; + mFilesToBeMapped = filesToBeMapped; + mIBinderCallback = binderCallback; + } + + /** + * Starts the child process and calls setup on it if {@param setupConnection} is true. + * @param setupConnection whether the setup should be performed on the connection once + * established + * @param queueIfNoFreeConnection whether to queue that request if no service connection is + * available. If the launcher was created with a connection provider, this parameter has no + * effect. + * @return true if the connection was started or was queued. + */ + public boolean start(final boolean setupConnection, final boolean queueIfNoFreeConnection) { + assert isRunningOnLauncherThread(); + try { + TraceEvent.begin("ChildProcessLauncher.start"); + ChildProcessConnection.ServiceCallback serviceCallback = + new ChildProcessConnection.ServiceCallback() { + @Override + public void onChildStarted() {} + + @Override + public void onChildStartFailed() { + assert isRunningOnLauncherThread(); + Log.e(TAG, "ChildProcessConnection.start failed, trying again"); + mLauncherHandler.post(new Runnable() { + @Override + public void run() { + // The child process may already be bound to another client + // (this can happen if multi-process WebView is used in more + // than one process), so try starting the process again. + // This connection that failed to start has not been freed, + // so a new bound connection will be allocated. + mConnection = null; + start(setupConnection, queueIfNoFreeConnection); + } + }); + } + + @Override + public void onChildProcessDied(ChildProcessConnection connection) { + assert LauncherThread.runningOnLauncherThread(); + assert mConnection == connection; + ChildProcessLauncher.this.onChildProcessDied(); + } + }; + if (mConnectionProvider != null) { + mConnection = mConnectionProvider.getConnection(serviceCallback); + assert mConnection != null; + setupConnection(); + } else { + assert mConnectionAllocator != null; + if (!allocateAndSetupConnection( + serviceCallback, setupConnection, queueIfNoFreeConnection) + && !queueIfNoFreeConnection) { + return false; + } + } + return true; + } finally { + TraceEvent.end("ChildProcessLauncher.start"); + } + } + + public ChildProcessConnection getConnection() { + return mConnection; + } + + public ChildConnectionAllocator getConnectionAllocator() { + return mConnectionAllocator; + } + + private boolean allocateAndSetupConnection( + final ChildProcessConnection.ServiceCallback serviceCallback, + final boolean setupConnection, final boolean queueIfNoFreeConnection) { + assert mConnection == null; + Bundle serviceBundle = new Bundle(); + mDelegate.onBeforeConnectionAllocated(serviceBundle); + + mConnection = mConnectionAllocator.allocate( + ContextUtils.getApplicationContext(), serviceBundle, serviceCallback); + if (mConnection == null) { + if (!queueIfNoFreeConnection) { + Log.d(TAG, "Failed to allocate a child connection (no queuing)."); + return false; + } + // No connection is available at this time. Add a listener so when one becomes + // available we can create the service. + mConnectionAllocator.addListener(new ChildConnectionAllocator.Listener() { + @Override + public void onConnectionFreed( + ChildConnectionAllocator allocator, ChildProcessConnection connection) { + assert allocator == mConnectionAllocator; + if (!allocator.isFreeConnectionAvailable()) return; + allocator.removeListener(this); + allocateAndSetupConnection( + serviceCallback, setupConnection, queueIfNoFreeConnection); + } + }); + return false; + } + assert mConnection != null; + + if (setupConnection) { + setupConnection(); + } + return true; + } + + private void setupConnection() { + ChildProcessConnection.ConnectionCallback connectionCallback = + new ChildProcessConnection.ConnectionCallback() { + @Override + public void onConnected(ChildProcessConnection connection) { + assert mConnection == connection; + onServiceConnected(); + } + }; + Bundle connectionBundle = createConnectionBundle(); + mDelegate.onBeforeConnectionSetup(connectionBundle); + mConnection.setupConnection(connectionBundle, getIBinderCallback(), connectionCallback); + } + + private void onServiceConnected() { + assert isRunningOnLauncherThread(); + + Log.d(TAG, "on connect callback, pid=%d", mConnection.getPid()); + + mDelegate.onConnectionEstablished(mConnection); + + // Proactively close the FDs rather than waiting for the GC to do it. + try { + for (FileDescriptorInfo fileInfo : mFilesToBeMapped) { + fileInfo.fd.close(); + } + } catch (IOException ioe) { + Log.w(TAG, "Failed to close FD.", ioe); + } + } + + public int getPid() { + assert isRunningOnLauncherThread(); + return mConnection == null ? NULL_PROCESS_HANDLE : mConnection.getPid(); + } + + public IBinder getIBinderCallback() { + return mIBinderCallback; + } + + private boolean isRunningOnLauncherThread() { + return mLauncherHandler.getLooper() == Looper.myLooper(); + } + + private Bundle createConnectionBundle() { + Bundle bundle = new Bundle(); + bundle.putStringArray(ChildProcessConstants.EXTRA_COMMAND_LINE, mCommandLine); + bundle.putParcelableArray(ChildProcessConstants.EXTRA_FILES, mFilesToBeMapped); + return bundle; + } + + private void onChildProcessDied() { + assert LauncherThread.runningOnLauncherThread(); + if (getPid() != 0) { + mDelegate.onConnectionLost(mConnection); + } + } + + public void stop() { + assert isRunningOnLauncherThread(); + Log.d(TAG, "stopping child connection: pid=%d", mConnection.getPid()); + mConnection.stop(); + } +}
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java index ce2e033..9e4204a 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java
@@ -15,7 +15,6 @@ import org.chromium.base.CpuFeatures; import org.chromium.base.Log; import org.chromium.base.ThreadUtils; -import org.chromium.base.TraceEvent; import org.chromium.base.VisibleForTesting; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; @@ -51,12 +50,6 @@ private static final String PRIVILEGED_SERVICES_NAME_KEY = "org.chromium.content.browser.PRIVILEGED_SERVICES_NAME"; - // Represents an invalid process handle; same as base/process/process.h kNullProcessHandle. - private static final int NULL_PROCESS_HANDLE = 0; - - // Delay between the call to freeConnection and the connection actually beeing freed. - private static final long FREE_CONNECTION_DELAY_MILLIS = 1; - // A warmed-up connection to a sandboxed service. private static SpareChildConnection sSpareSandboxedConnection; @@ -64,6 +57,9 @@ private static final Map<String, ChildConnectionAllocator> sSandboxedChildConnectionAllocatorMap = new HashMap<>(); + // Map from PID to ChildProcessLauncherHelper. + private static final Map<Integer, ChildProcessLauncherHelper> sLauncherByPid = new HashMap<>(); + // Allocator used for non-sandboxed services. private static ChildConnectionAllocator sPrivilegedChildConnectionAllocator; @@ -72,40 +68,75 @@ private static int sSandboxedServicesCountForTesting = -1; private static String sSandboxedServicesNameForTesting; - // Map from PID to ChildService connection. - private static Map<Integer, ChildProcessLauncherHelper> sLauncherByPid = new HashMap<>(); - // Manages OOM bindings used to bind chind services. Lazily initialized by getBindingManager(). private static BindingManager sBindingManager; // Whether the main application is currently brought to the foreground. private static boolean sApplicationInForeground = true; - // The IBinder provided to the created service. - private final IBinder mIBinderCallback; - - // Whether the connection should be setup once connected. Tests can set this to false to - // simulate a connected but not yet setup connection. - private final boolean mDoSetupConnection; + // Whether the connection is managed by the BindingManager. + private final boolean mUseBindingManager; private final ChildProcessCreationParams mCreationParams; - private final String[] mCommandLine; - - private final FileDescriptorInfo[] mFilesToBeMapped; - - // The allocator used to create the connection. - private final ChildConnectionAllocator mConnectionAllocator; - // Whether the created process should be sandboxed. private final boolean mSandboxed; + private final ChildProcessLauncher.Delegate mLauncherDelegate = + new ChildProcessLauncher.Delegate() { + @Override + public void onBeforeConnectionAllocated(Bundle bundle) { + populateServiceBundle(bundle, mCreationParams); + } + + @Override + public void onBeforeConnectionSetup(Bundle connectionBundle) { + // Populate the bundle passed to the service setup call with content specific + // parameters. + connectionBundle.putInt( + ContentChildProcessConstants.EXTRA_CPU_COUNT, CpuFeatures.getCount()); + connectionBundle.putLong( + ContentChildProcessConstants.EXTRA_CPU_FEATURES, CpuFeatures.getMask()); + connectionBundle.putBundle(Linker.EXTRA_LINKER_SHARED_RELROS, + Linker.getInstance().getSharedRelros()); + } + + @Override + public void onConnectionEstablished(ChildProcessConnection connection) { + int pid = connection.getPid(); + assert pid > 0; + + sLauncherByPid.put(pid, ChildProcessLauncherHelper.this); + + if (mUseBindingManager) { + getBindingManager().addNewConnection(pid, connection); + } + + // If the connection fails and pid == 0, the Java-side cleanup was already + // handled by DeathCallback. We still have to call back to native for cleanup + // there. + if (mNativeChildProcessLauncherHelper != 0) { + nativeOnChildProcessStarted( + mNativeChildProcessLauncherHelper, connection.getPid()); + } + mNativeChildProcessLauncherHelper = 0; + } + + @Override + public void onConnectionLost(ChildProcessConnection connection) { + assert connection.getPid() > 0; + sLauncherByPid.remove(connection.getPid()); + if (mUseBindingManager) { + getBindingManager().removeConnection(connection.getPid()); + } + } + }; + + private final ChildProcessLauncher mLauncher; + // Note native pointer is only guaranteed live until nativeOnChildProcessStarted. private long mNativeChildProcessLauncherHelper; - // The actual service connection. Set once we have connected to the service. - private ChildProcessConnection mConnection; - @CalledByNative private static FileDescriptorInfo makeFdInfo( int id, int fd, boolean autoClose, long offset, long size) { @@ -152,11 +183,11 @@ ? new GpuProcessCallback() : null; - ChildProcessLauncherHelper process_launcher = - new ChildProcessLauncherHelper(nativePointer, creationParams, commandLine, - filesToBeMapped, sandboxed, binderCallback, true /* doSetupConnection */); - process_launcher.start(); - return process_launcher; + ChildProcessLauncherHelper processLauncher = new ChildProcessLauncherHelper(nativePointer, + creationParams, commandLine, filesToBeMapped, sandboxed, binderCallback); + processLauncher.mLauncher.start( + true /* doSetupConnection */, true /* queueIfNoFreeConnection */); + return processLauncher; } /** @@ -169,23 +200,23 @@ LauncherThread.post(new Runnable() { @Override public void run() { - if (sSpareSandboxedConnection != null && !sSpareSandboxedConnection.isEmpty()) { - return; - } - - ChildProcessCreationParams creationParams = ChildProcessCreationParams.getDefault(); - boolean bindToCallerCheck = - creationParams == null ? false : creationParams.getBindToCallerCheck(); - Bundle serviceBundle = - ChildProcessLauncherHelper.createServiceBundle(bindToCallerCheck); - ChildConnectionAllocator allocator = - getConnectionAllocator(context, creationParams, true /* sandboxed */); - sSpareSandboxedConnection = - new SpareChildConnection(context, allocator, serviceBundle); + warmUpOnLauncherThread(context); } }); } + private static void warmUpOnLauncherThread(Context context) { + if (sSpareSandboxedConnection != null && !sSpareSandboxedConnection.isEmpty()) { + return; + } + + ChildProcessCreationParams creationParams = ChildProcessCreationParams.getDefault(); + Bundle serviceBundle = populateServiceBundle(new Bundle(), creationParams); + ChildConnectionAllocator allocator = + getConnectionAllocator(context, creationParams, true /* sandboxed */); + sSpareSandboxedConnection = new SpareChildConnection(context, allocator, serviceBundle); + } + public static String getPackageNameFromCreationParams( Context context, ChildProcessCreationParams params, boolean sandboxed) { return (sandboxed && params != null) ? params.getPackageNameForSandboxedService() @@ -314,6 +345,7 @@ sSandboxedServiceFactoryForTesting); } sSandboxedChildConnectionAllocatorMap.put(packageName, connectionAllocator); + final ChildConnectionAllocator finalConnectionAllocator = connectionAllocator; // Tracks connections removal so the allocator can be freed when no longer used. connectionAllocator.addListener(new ChildConnectionAllocator.Listener() { @@ -321,6 +353,7 @@ public void onConnectionAllocated( ChildConnectionAllocator allocator, ChildProcessConnection connection) { assert connection != null; + assert allocator == finalConnectionAllocator; if (!allocator.isFreeConnectionAvailable()) { // Proactively releases all the moderate bindings once all the sandboxed // services are allocated, which will be very likely to have some of them @@ -349,195 +382,61 @@ private ChildProcessLauncherHelper(long nativePointer, ChildProcessCreationParams creationParams, String[] commandLine, - FileDescriptorInfo[] filesToBeMapped, boolean sandboxed, IBinder binderCallback, - boolean doSetupConnection) { + FileDescriptorInfo[] filesToBeMapped, boolean sandboxed, IBinder binderCallback) { assert LauncherThread.runningOnLauncherThread(); - mCreationParams = creationParams; - mCommandLine = commandLine; - mFilesToBeMapped = filesToBeMapped; mNativeChildProcessLauncherHelper = nativePointer; - mIBinderCallback = binderCallback; - mDoSetupConnection = doSetupConnection; + mCreationParams = creationParams; + mUseBindingManager = sandboxed; mSandboxed = sandboxed; - mConnectionAllocator = getConnectionAllocator( + final ChildConnectionAllocator connectionAllocator = getConnectionAllocator( ContextUtils.getApplicationContext(), mCreationParams, sandboxed); - - initLinker(); - } - - private void start() { - assert LauncherThread.runningOnLauncherThread(); - assert mConnection == null; - try { - TraceEvent.begin("ChildProcessLauncher.start"); - - ChildProcessConnection.ServiceCallback serviceCallback = - new ChildProcessConnection.ServiceCallback() { + if (sSpareSandboxedConnection != null && !sSpareSandboxedConnection.isEmpty() + && sSpareSandboxedConnection.isForAllocator(connectionAllocator)) { + // Use the warmed-up connection. + ChildProcessLauncher.BoundConnectionProvider connectionProvider = + new ChildProcessLauncher.BoundConnectionProvider() { @Override - public void onChildStarted() {} - - @Override - public void onChildStartFailed() { - assert LauncherThread.runningOnLauncherThread(); - Log.e(TAG, "ChildProcessConnection.start failed, trying again"); - LauncherThread.post(new Runnable() { - @Override - public void run() { - // The child process may already be bound to another client - // (this can happen if multi-process WebView is used in more - // than one process), so try starting the process again. - // This connection that failed to start has not been freed, - // so a new bound connection will be allocated. - mConnection = null; - start(); - } - }); - } - - @Override - public void onChildProcessDied(ChildProcessConnection connection) { - assert LauncherThread.runningOnLauncherThread(); - assert mConnection == connection; - ChildProcessLauncherHelper.this.onChildProcessDied(); + public ChildProcessConnection getConnection( + ChildProcessConnection.ServiceCallback serviceCallback) { + return sSpareSandboxedConnection.getConnection( + connectionAllocator, serviceCallback); } }; - - // Try to use the spare connection if there's one. - if (sSpareSandboxedConnection != null) { - mConnection = sSpareSandboxedConnection.getConnection( - mConnectionAllocator, serviceCallback); - if (mConnection != null) { - Log.d(TAG, "Using warmed-up connection for service %s.", - mConnection.getServiceName()); - // Clear the spare connection now that it's been used. - sSpareSandboxedConnection = null; - } - } - - allocateAndSetupConnection(serviceCallback); - } finally { - TraceEvent.end("ChildProcessLauncher.start"); - } - } - - // Allocates a new connection and calls setUp on it. - // If there are no available connections, it will retry when one becomes available. - private boolean allocateAndSetupConnection( - final ChildProcessConnection.ServiceCallback serviceCallback) { - if (mConnection == null) { - final Context context = ContextUtils.getApplicationContext(); - boolean bindToCallerCheck = - mCreationParams == null ? false : mCreationParams.getBindToCallerCheck(); - Bundle serviceBundle = createServiceBundle(bindToCallerCheck); - onBeforeConnectionAllocated(serviceBundle); - - boolean useBindingManager = mSandboxed; - mConnection = mConnectionAllocator.allocate(context, serviceBundle, serviceCallback); - if (mConnection == null) { - // No connection is available at this time. Add a listener so when one becomes - // available we can create the service. - mConnectionAllocator.addListener(new ChildConnectionAllocator.Listener() { - @Override - public void onConnectionAllocated(ChildConnectionAllocator allocator, - ChildProcessConnection connection) {} - - @Override - public void onConnectionFreed( - ChildConnectionAllocator allocator, ChildProcessConnection connection) { - assert allocator == mConnectionAllocator; - if (!allocator.isFreeConnectionAvailable()) return; - allocator.removeListener(this); - boolean success = allocateAndSetupConnection(serviceCallback); - assert success; - } - }); - return false; - } - } - - assert mConnection != null; - Bundle connectionBundle = createConnectionBundle(); - onConnectionBound(mConnection, mConnectionAllocator, connectionBundle); - - if (mDoSetupConnection) { - setupConnection(connectionBundle); - } - return true; - } - - private void setupConnection(Bundle connectionBundle) { - ChildProcessConnection.ConnectionCallback connectionCallback = - new ChildProcessConnection.ConnectionCallback() { - @Override - public void onConnected(ChildProcessConnection connection) { - assert mConnection == connection; - onChildProcessStarted(); - } - }; - mConnection.setupConnection(connectionBundle, getIBinderCallback(), connectionCallback); - } - - private void onChildProcessStarted() { - assert LauncherThread.runningOnLauncherThread(); - - int pid = mConnection.getPid(); - Log.d(TAG, "on connect callback, pid=%d", pid); - - onConnectionEstablished(mConnection); - - sLauncherByPid.put(pid, this); - - // Proactively close the FDs rather than waiting for the GC to do it. - try { - for (FileDescriptorInfo fileInfo : mFilesToBeMapped) { - fileInfo.fd.close(); - } - } catch (IOException ioe) { - Log.w(TAG, "Failed to close FD.", ioe); - } - - // If the connection fails and pid == 0, the Java-side cleanup was already handled by - // ServiceCallback.onChildStopped. We still have to call back to native for cleanup there. - if (mNativeChildProcessLauncherHelper != 0) { - nativeOnChildProcessStarted(mNativeChildProcessLauncherHelper, getPid()); - } - mNativeChildProcessLauncherHelper = 0; - } - - private void onChildProcessDied() { - assert LauncherThread.runningOnLauncherThread(); - if (getPid() != 0) { - onConnectionLost(mConnection, getPid()); - sLauncherByPid.remove(getPid()); + mLauncher = ChildProcessLauncher.createWithBoundConnectionProvider(mLauncherDelegate, + commandLine, filesToBeMapped, connectionProvider, binderCallback); + } else { + mLauncher = ChildProcessLauncher.createWithConnectionAllocator(mLauncherDelegate, + commandLine, filesToBeMapped, connectionAllocator, binderCallback); } } public int getPid() { assert LauncherThread.runningOnLauncherThread(); - return mConnection == null ? NULL_PROCESS_HANDLE : mConnection.getPid(); + return mLauncher.getPid(); } // Called on client (UI or IO) thread. @CalledByNative private boolean isOomProtected() { - // mConnection is set on a different thread but does not change once it's been set. So it is - // safe to test whether it's null from a different thread. - if (mConnection == null) { + ChildProcessConnection connection = mLauncher.getConnection(); + // Here we are accessing the connection from a thread other than the launcher thread, but it + // does not change once it's been set. So it is safe to test whether it's null here and + // access it afterwards. + if (connection == null) { return false; } // We consider the process to be child protected if it has a strong or moderate binding and // the app is in the foreground. - return sApplicationInForeground && !mConnection.isWaivedBoundOnlyOrWasWhenDied(); + return sApplicationInForeground && !connection.isWaivedBoundOnlyOrWasWhenDied(); } @CalledByNative private void setInForeground(int pid, boolean foreground, boolean boostForPendingViews) { assert LauncherThread.runningOnLauncherThread(); - assert mConnection != null; - assert getPid() == pid; + assert mLauncher.getPid() == pid; getBindingManager().setPriority(pid, foreground, boostForPendingViews); } @@ -545,10 +444,11 @@ static void stop(int pid) { assert LauncherThread.runningOnLauncherThread(); Log.d(TAG, "stopping child connection: pid=%d", pid); - ChildProcessLauncherHelper launcher = sLauncherByPid.get(pid); - // Launcher can be null for single process. + ChildProcessLauncherHelper launcher = getByPid(pid); + // launcher can be null for single process. if (launcher != null) { - launcher.mConnection.stop(); + // Can happen for single process. + launcher.mLauncher.stop(); } } @@ -579,8 +479,7 @@ private static boolean sLinkerInitialized; private static long sLinkerLoadAddress; - @VisibleForTesting - static void initLinker() { + private static void initLinker() { assert LauncherThread.runningOnLauncherThread(); if (sLinkerInitialized) return; if (Linker.isUsed()) { @@ -594,8 +493,9 @@ private static ChromiumLinkerParams getLinkerParamsForNewConnection() { assert LauncherThread.runningOnLauncherThread(); - assert sLinkerInitialized; + initLinker(); + assert sLinkerInitialized; if (sLinkerLoadAddress == 0) return null; // Always wait for the shared RELROs in service processes. @@ -610,70 +510,18 @@ } } - /** - * Creates the common bundle to be passed to child processes through the service binding intent. - * If the service gets recreated by the framework the intent will be reused, so these parameters - * should be common to all processes of that type. - * - * @param commandLine Command line params to be passed to the service. - * @param linkerParams Linker params to start the service. - */ - private static Bundle createServiceBundle(boolean bindToCallerCheck) { - initLinker(); - Bundle bundle = new Bundle(); + private static Bundle populateServiceBundle( + Bundle bundle, ChildProcessCreationParams creationParams) { + boolean bindToCallerCheck = + creationParams == null ? false : creationParams.getBindToCallerCheck(); bundle.putBoolean(ChildProcessConstants.EXTRA_BIND_TO_CALLER, bindToCallerCheck); bundle.putParcelable(ContentChildProcessConstants.EXTRA_LINKER_PARAMS, getLinkerParamsForNewConnection()); return bundle; } - public Bundle createConnectionBundle() { - Bundle bundle = new Bundle(); - bundle.putStringArray(ChildProcessConstants.EXTRA_COMMAND_LINE, mCommandLine); - bundle.putParcelableArray(ChildProcessConstants.EXTRA_FILES, mFilesToBeMapped); - return bundle; - } - - // Below are methods that will eventually be moved to a content delegate class. - - private void onBeforeConnectionAllocated(Bundle commonParameters) { - // TODO(jcivelli): move createServiceBundle in there. - } - - // Called once a connection has been allocated. - private void onConnectionBound(ChildProcessConnection connection, - ChildConnectionAllocator connectionAllocator, Bundle connectionBundle) { - if (mSandboxed && !connectionAllocator.isFreeConnectionAvailable()) { - // Proactively releases all the moderate bindings once all the sandboxed services are - // allocated, which will be very likely to have some of them killed by OOM killer. - getBindingManager().releaseAllModerateBindings(); - } - - // Popuplate the bundle passed to the service setup call with content specific parameters. - connectionBundle.putInt( - ContentChildProcessConstants.EXTRA_CPU_COUNT, CpuFeatures.getCount()); - connectionBundle.putLong( - ContentChildProcessConstants.EXTRA_CPU_FEATURES, CpuFeatures.getMask()); - connectionBundle.putBundle( - Linker.EXTRA_LINKER_SHARED_RELROS, Linker.getInstance().getSharedRelros()); - } - - private void onConnectionEstablished(ChildProcessConnection connection) { - if (mSandboxed) { - getBindingManager().addNewConnection(connection.getPid(), connection); - } - } - - // Called when a connection has been disconnected. Only invoked if onConnectionEstablished was - // called, meaning the connection was already established. - private void onConnectionLost(ChildProcessConnection connection, int pid) { - if (mSandboxed) { - getBindingManager().removeConnection(pid); - } - } - - private IBinder getIBinderCallback() { - return mIBinderCallback; + public static ChildProcessLauncherHelper getByPid(int pid) { + return sLauncherByPid.get(pid); } // Testing only related methods. @@ -682,18 +530,12 @@ ChildProcessCreationParams creationParams, String[] commandLine, FileDescriptorInfo[] filesToBeMapped, boolean sandboxed, IBinder binderCallback, boolean doSetupConnection) { - ChildProcessLauncherHelper launcherHelper = - new ChildProcessLauncherHelper(0L, creationParams, commandLine, filesToBeMapped, - sandboxed, binderCallback, doSetupConnection); - launcherHelper.start(); + ChildProcessLauncherHelper launcherHelper = new ChildProcessLauncherHelper( + 0L, creationParams, commandLine, filesToBeMapped, sandboxed, binderCallback); + launcherHelper.mLauncher.start(doSetupConnection, true /* queueIfNoFreeConnection */); return launcherHelper; } - @VisibleForTesting - public static ChildProcessLauncherHelper getLauncherForPid(int pid) { - return sLauncherByPid.get(pid); - } - /** @return the count of services set-up and working. */ @VisibleForTesting static int getConnectedServicesCountForTesting() { @@ -720,18 +562,13 @@ } @VisibleForTesting - ChildProcessConnection getConnection() { - return mConnection; - } - - @VisibleForTesting public ChildProcessConnection getChildProcessConnection() { - return mConnection; + return mLauncher.getConnection(); } @VisibleForTesting public ChildConnectionAllocator getChildConnectionAllocatorForTesting() { - return mConnectionAllocator; + return mLauncher.getConnectionAllocator(); } @VisibleForTesting @@ -743,9 +580,8 @@ public static boolean crashProcessForTesting(int pid) { if (sLauncherByPid.get(pid) == null) return false; - ChildProcessConnection connection = sLauncherByPid.get(pid).mConnection; + ChildProcessConnection connection = sLauncherByPid.get(pid).mLauncher.getConnection(); if (connection == null) return false; - try { connection.crashServiceForTesting(); return true;
diff --git a/content/public/android/java/src/org/chromium/content/browser/SpareChildConnection.java b/content/public/android/java/src/org/chromium/content/browser/SpareChildConnection.java index dec2322a..6538cc7 100644 --- a/content/public/android/java/src/org/chromium/content/browser/SpareChildConnection.java +++ b/content/public/android/java/src/org/chromium/content/browser/SpareChildConnection.java
@@ -84,8 +84,7 @@ public ChildProcessConnection getConnection(ChildConnectionAllocator allocator, @NonNull final ChildProcessConnection.ServiceCallback serviceCallback) { assert LauncherThread.runningOnLauncherThread(); - if (mConnection == null || allocator != mConnectionAllocator - || mConnectionServiceCallback != null) { + if (isEmpty() || !isForAllocator(allocator) || mConnectionServiceCallback != null) { return null; } @@ -117,6 +116,11 @@ return mConnection == null || mConnectionServiceCallback != null; } + /** Returns true if this spare connection uses {@param allocator}. */ + public boolean isForAllocator(ChildConnectionAllocator allocator) { + return mConnectionAllocator == allocator; + } + private void clearConnection() { assert LauncherThread.runningOnLauncherThread(); mConnection = null;
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherHelperTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherHelperTest.java new file mode 100644 index 0000000..3e87a5f --- /dev/null +++ b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherHelperTest.java
@@ -0,0 +1,563 @@ +// Copyright 2014 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. + +package org.chromium.content.browser; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.MediumTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.BaseSwitches; +import org.chromium.base.ThreadUtils; +import org.chromium.base.library_loader.LibraryLoader; +import org.chromium.base.library_loader.LibraryProcessType; +import org.chromium.base.process_launcher.ChildProcessCreationParams; +import org.chromium.base.process_launcher.FileDescriptorInfo; +import org.chromium.base.test.util.Feature; +import org.chromium.content.browser.test.ChildProcessAllocatorSettings; +import org.chromium.content.browser.test.ContentJUnit4ClassRunner; +import org.chromium.content.browser.test.util.Criteria; +import org.chromium.content.browser.test.util.CriteriaHelper; +import org.chromium.content_shell_apk.ChildProcessLauncherTestHelperService; +import org.chromium.content_shell_apk.ChildProcessLauncherTestUtils; + +import java.util.concurrent.Callable; + +/** + * Instrumentation tests for ChildProcessLauncher. + */ +@RunWith(ContentJUnit4ClassRunner.class) +public class ChildProcessLauncherHelperTest { + // Pseudo command line arguments to instruct the child process to wait until being killed. + // Allowing the process to continue would lead to a crash when attempting to initialize IPC + // channels that are not being set up in this test. + private static final String[] sProcessWaitArguments = { + "_", "--" + BaseSwitches.RENDERER_WAIT_FOR_JAVA_DEBUGGER}; + private static final String EXTERNAL_APK_PACKAGE_NAME = "org.chromium.external.apk"; + private static final String DEFAULT_SANDBOXED_PROCESS_SERVICE = + "org.chromium.content.app.SandboxedProcessService"; + + private static final int DONT_BLOCK = 0; + private static final int BLOCK_UNTIL_CONNECTED = 1; + private static final int BLOCK_UNTIL_SETUP = 2; + + @Before + public void setUp() throws Exception { + LibraryLoader.get(LibraryProcessType.PROCESS_CHILD).ensureInitialized(); + } + + /** + * Tests that external APKs and regular use different ChildConnectionAllocators. + */ + @Test + @MediumTest + @Feature({"ProcessManagement"}) + @ChildProcessAllocatorSettings( + sandboxedServiceCount = 4, sandboxedServiceName = DEFAULT_SANDBOXED_PROCESS_SERVICE) + public void testAllocatorForPackage() { + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + ChildConnectionAllocator connectionAllocator = getChildConnectionAllocator( + appContext, appContext.getPackageName(), true /* sandboxed */); + ChildConnectionAllocator externalConnectionAllocator = getChildConnectionAllocator( + appContext, EXTERNAL_APK_PACKAGE_NAME, true /* sandboxed */); + Assert.assertNotEquals(connectionAllocator, externalConnectionAllocator); + } + + /** + * Tests binding to the same sandboxed service process from multiple processes in the + * same package. This uses the ChildProcessLauncherTestHelperService declared in + * ContentShell.apk as a separate android:process to bind the first (slot 0) service. The + * instrumentation test then tries to bind the same slot, which fails, so the + * ChildProcessLauncher retries on a new connection. + */ + @Test + @MediumTest + @Feature({"ProcessManagement"}) + public void testBindServiceFromMultipleProcesses() throws RemoteException { + final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + // Start the Helper service. + class HelperConnection implements ServiceConnection { + Messenger mMessenger = null; + + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + mMessenger = new Messenger(service); + } + + @Override + public void onServiceDisconnected(ComponentName name) {} + } + final HelperConnection serviceConnection = new HelperConnection(); + + Intent intent = new Intent(); + intent.setComponent(new ComponentName(context.getPackageName(), + context.getPackageName() + ".ChildProcessLauncherTestHelperService")); + Assert.assertTrue(context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)); + + // Wait for the Helper service to connect. + CriteriaHelper.pollInstrumentationThread( + new Criteria("Failed to get helper service Messenger") { + @Override + public boolean isSatisfied() { + return serviceConnection.mMessenger != null; + } + }); + + Assert.assertNotNull(serviceConnection.mMessenger); + + class ReplyHandler implements Handler.Callback { + Message mMessage; + + @Override + public boolean handleMessage(Message msg) { + // Copy the message so its contents outlive this Binder transaction. + mMessage = Message.obtain(); + mMessage.copyFrom(msg); + return true; + } + } + final ReplyHandler replyHandler = new ReplyHandler(); + + // Send a message to the Helper and wait for the reply. This will cause the slot 0 + // sandboxed service connection to be bound by a different PID (i.e., not this process). + Message msg = Message.obtain(null, ChildProcessLauncherTestHelperService.MSG_BIND_SERVICE); + msg.replyTo = new Messenger(new Handler(Looper.getMainLooper(), replyHandler)); + serviceConnection.mMessenger.send(msg); + + CriteriaHelper.pollInstrumentationThread( + new Criteria("Failed waiting for helper service reply") { + @Override + public boolean isSatisfied() { + return replyHandler.mMessage != null; + } + }); + + // Verify that the Helper was able to launch the sandboxed service. + Assert.assertNotNull(replyHandler.mMessage); + Assert.assertEquals(ChildProcessLauncherTestHelperService.MSG_BIND_SERVICE_REPLY, + replyHandler.mMessage.what); + Assert.assertEquals( + "Connection slot from helper service is not 0", 0, replyHandler.mMessage.arg2); + + final int helperConnectionPid = replyHandler.mMessage.arg1; + Assert.assertTrue(helperConnectionPid > 0); + + // Launch a service from this process. Since slot 0 is already bound by the Helper, it + // will fail to start and the ChildProcessLauncher will retry and use the slot 1. + ChildProcessCreationParams creationParams = new ChildProcessCreationParams( + context.getPackageName(), false /* isExternalService */, + LibraryProcessType.PROCESS_CHILD, true /* bindToCallerCheck */); + ChildProcessLauncherHelper launcher = startSandboxedChildProcessWithCreationParams( + creationParams, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); + + final ChildProcessConnection retryConnection = + ChildProcessLauncherTestUtils.getConnection(launcher); + Assert.assertEquals( + 1, ChildProcessLauncherTestUtils.getConnectionServiceNumber(retryConnection)); + + ChildConnectionAllocator connectionAllocator = + launcher.getChildConnectionAllocatorForTesting(); + + // Check that only two connections are created. + for (int i = 0; i < connectionAllocator.getNumberOfServices(); ++i) { + ChildProcessConnection sandboxedConn = + connectionAllocator.getChildProcessConnectionAtSlotForTesting(i); + if (i <= 1) { + Assert.assertNotNull(sandboxedConn); + Assert.assertNotNull( + ChildProcessLauncherTestUtils.getConnectionService(sandboxedConn)); + } else { + Assert.assertNull(sandboxedConn); + } + } + + Assert.assertEquals( + connectionAllocator.getChildProcessConnectionAtSlotForTesting(1), retryConnection); + + ChildProcessConnection failedConnection = + connectionAllocator.getChildProcessConnectionAtSlotForTesting(0); + Assert.assertEquals(0, ChildProcessLauncherTestUtils.getConnectionPid(failedConnection)); + Assert.assertFalse(ChildProcessLauncherTestUtils.getConnectionService(failedConnection) + .bindToCaller()); + + CriteriaHelper.pollInstrumentationThread( + new Criteria("Failed waiting retry connection to get pid") { + @Override + public boolean isSatisfied() { + return ChildProcessLauncherTestUtils.getConnectionPid(retryConnection) > 0; + } + }); + Assert.assertTrue(ChildProcessLauncherTestUtils.getConnectionPid(retryConnection) + != helperConnectionPid); + Assert.assertTrue( + ChildProcessLauncherTestUtils.getConnectionService(retryConnection).bindToCaller()); + } + + private static void warmUpOnUiThreadBlocking(final Context context) { + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + ChildProcessLauncherHelper.warmUp(context); + } + }); + ChildProcessConnection connection = getWarmUpConnection(); + Assert.assertNotNull(connection); + blockUntilConnected(connection); + } + + private void testWarmUpWithCreationParams(ChildProcessCreationParams creationParams) { + if (creationParams != null) { + ChildProcessCreationParams.registerDefault(creationParams); + } + + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); + warmUpOnUiThreadBlocking(context); + + Assert.assertEquals(1, getConnectedSandboxedServicesCount()); + + ChildProcessLauncherHelper launcherHelper = startSandboxedChildProcessWithCreationParams( + creationParams, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); + + // The warm-up connection was used, so no new process should have been created. + Assert.assertEquals(1, getConnectedSandboxedServicesCount()); + + int pid = getPid(launcherHelper); + Assert.assertNotEquals(0, pid); + + stopProcess(launcherHelper); + + waitForConnectedSandboxedServicesCount(0); + } + + @Test + @MediumTest + @Feature({"ProcessManagement"}) + public void testWarmUp() { + // Use the default creation parameters. + testWarmUpWithCreationParams(null /* creationParams */); + } + + @Test + @MediumTest + @Feature({"ProcessManagement"}) + public void testWarmUpWithBindToCaller() { + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); + ChildProcessCreationParams creationParams = new ChildProcessCreationParams( + context.getPackageName(), false /* isExternalService */, + LibraryProcessType.PROCESS_CHILD, true /* bindToCallerCheck */); + testWarmUpWithCreationParams(creationParams); + } + + // Tests that the warm-up connection is freed from its allocator if it crashes. + @Test + @MediumTest + @Feature({"ProcessManagement"}) + public void testWarmUpProcessCrashBeforeUse() throws RemoteException { + Assert.assertEquals(0, getConnectedSandboxedServicesCount()); + + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); + warmUpOnUiThreadBlocking(context); + + Assert.assertEquals(1, getConnectedSandboxedServicesCount()); + + // Crash the warm-up connection before it gets used. + ChildProcessConnection connection = getWarmUpConnection(); + Assert.assertNotNull(connection); + connection.crashServiceForTesting(); + + // It should get cleaned-up. + waitForConnectedSandboxedServicesCount(0); + + // And subsequent process launches should work. + ChildProcessLauncherHelper launcher = startSandboxedChildProcess( + null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); + Assert.assertEquals(1, getConnectedSandboxedServicesCount()); + Assert.assertNotNull(ChildProcessLauncherTestUtils.getConnection(launcher)); + } + + // Tests that the warm-up connection is freed from its allocator if it crashes after being used. + @Test + @MediumTest + @Feature({"ProcessManagement"}) + public void testWarmUpProcessCrashAfterUse() throws RemoteException { + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); + warmUpOnUiThreadBlocking(context); + + Assert.assertEquals(1, getConnectedSandboxedServicesCount()); + + ChildProcessLauncherHelper launcherHelper = startSandboxedChildProcessWithCreationParams( + null /* creationParams */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); + + // The warm-up connection was used, so no new process should have been created. + Assert.assertEquals(1, getConnectedSandboxedServicesCount()); + + int pid = getPid(launcherHelper); + Assert.assertNotEquals(0, pid); + + ChildProcessConnection connection = retrieveConnection(launcherHelper); + connection.crashServiceForTesting(); + + waitForConnectedSandboxedServicesCount(0); + } + + @Test + @MediumTest + @Feature({"ProcessManagement"}) + public void testSandboxedAllocatorFreed() { + final String packageName = + InstrumentationRegistry.getInstrumentation().getTargetContext().getPackageName(); + + ChildProcessLauncherHelper launcher = startSandboxedChildProcess( + null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); + + Assert.assertTrue(hasSandboxedConnectionAllocatorForPackage(packageName)); + + stopProcess(launcher); + + // Poll until allocator is removed. Need to poll here because actually freeing a connection + // from allocator is a posted task, rather than a direct call from stop. + CriteriaHelper.pollInstrumentationThread( + new Criteria("The connection allocator was not removed.") { + @Override + public boolean isSatisfied() { + return !hasSandboxedConnectionAllocatorForPackage(packageName); + } + }); + } + + @Test + @MediumTest + @Feature({"ProcessManagement"}) + @ChildProcessAllocatorSettings(sandboxedServiceCount = 4) + public void testCustomCreationParamDoesNotReuseWarmupConnection() { + // Since warmUp only uses default params. + final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); + ChildProcessCreationParams defaultCreationParams = + getDefaultChildProcessCreationParams(context.getPackageName()); + ChildProcessCreationParams.registerDefault(defaultCreationParams); + ChildProcessCreationParams otherCreationParams = getDefaultChildProcessCreationParams( + InstrumentationRegistry.getInstrumentation().getContext().getPackageName()); + + warmUpOnUiThreadBlocking(context); + Assert.assertEquals(1, getConnectedSandboxedServicesCount()); + + // First create a connnection with different creation params than the default, it should not + // use the warmup connection (note that it won't bind since we are using the wrong package, + // but we need to use a different package to differentiate them, and we can only have 1 + // valid package per app). + startSandboxedChildProcessWithCreationParams( + otherCreationParams, DONT_BLOCK, false /* doSetupConnection */); + Assert.assertNotNull(getWarmUpConnection()); + + // Then start a process with the default creation params, the warmup-connection should be + // used. + startSandboxedChildProcessWithCreationParams( + defaultCreationParams, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); + Assert.assertNull(getWarmUpConnection()); + } + + @Test + @MediumTest + @Feature({"ProcessManagement"}) + public void testLauncherCleanup() throws RemoteException { + ChildProcessLauncherHelper launcher = startSandboxedChildProcess( + null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); + int pid = getPid(launcher); + Assert.assertNotEquals(0, pid); + + // Stop the process explicitly, the launcher should get cleared. + stopProcess(launcher); + waitForConnectedSandboxedServicesCount(0); + + launcher = startSandboxedChildProcess( + null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); + pid = getPid(launcher); + Assert.assertNotEquals(0, pid); + + // This time crash the connection, the launcher should also get cleared. + ChildProcessConnection connection = retrieveConnection(launcher); + connection.crashServiceForTesting(); + waitForConnectedSandboxedServicesCount(0); + } + + private static ChildProcessLauncherHelper startSandboxedChildProcess( + final String packageName, int blockingPolicy, final boolean doSetupConnection) { + ChildProcessCreationParams creationParams = + packageName == null ? null : getDefaultChildProcessCreationParams(packageName); + return startSandboxedChildProcessWithCreationParams( + creationParams, blockingPolicy, doSetupConnection); + } + + private static ChildProcessLauncherHelper startSandboxedChildProcessWithCreationParams( + final ChildProcessCreationParams creationParams, int blockingPolicy, + final boolean doSetupConnection) { + assert doSetupConnection || blockingPolicy != BLOCK_UNTIL_SETUP; + ChildProcessLauncherHelper launcher = + ChildProcessLauncherTestUtils.runOnLauncherAndGetResult( + new Callable<ChildProcessLauncherHelper>() { + @Override + public ChildProcessLauncherHelper call() { + return ChildProcessLauncherHelper.createAndStartForTesting( + creationParams, sProcessWaitArguments, + new FileDescriptorInfo[0], true /* sandboxed */, + null /* binderCallback */, doSetupConnection); + } + }); + if (blockingPolicy != DONT_BLOCK) { + assert blockingPolicy == BLOCK_UNTIL_CONNECTED || blockingPolicy == BLOCK_UNTIL_SETUP; + blockUntilConnected(launcher); + if (blockingPolicy == BLOCK_UNTIL_SETUP) { + blockUntilSetup(launcher); + } + } + return launcher; + } + + private static void blockUntilConnected(final ChildProcessLauncherHelper launcher) { + CriteriaHelper.pollInstrumentationThread( + new Criteria("The connection wasn't established.") { + @Override + public boolean isSatisfied() { + return launcher.getChildProcessConnection() != null + && launcher.getChildProcessConnection().isConnected(); + } + }); + } + + private static void blockUntilConnected(final ChildProcessConnection connection) { + CriteriaHelper.pollInstrumentationThread( + new Criteria("The connection wasn't established.") { + @Override + public boolean isSatisfied() { + return connection.isConnected(); + } + }); + } + + private static void blockUntilSetup(final ChildProcessLauncherHelper launcher) { + CriteriaHelper.pollInstrumentationThread( + new Criteria("The connection wasn't established.") { + @Override + public boolean isSatisfied() { + return getPid(launcher) != 0; + } + }); + } + + private static ChildConnectionAllocator getChildConnectionAllocator( + final Context context, final String packageName, final boolean sandboxed) { + return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult( + new Callable<ChildConnectionAllocator>() { + @Override + public ChildConnectionAllocator call() { + return ChildProcessLauncherHelper.getConnectionAllocator(context, + getDefaultChildProcessCreationParams(packageName), sandboxed); + } + }); + } + + // Returns the number of sandboxed connection currently connected, + private static int getConnectedSandboxedServicesCount() { + return getConnectedSandboxedServicesCountForPackage(null /* packageName */); + } + + // Returns the number of sandboxed connection matching the specificed package name that are + // connected, + private static int getConnectedSandboxedServicesCountForPackage(final String packageName) { + return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(new Callable<Integer>() { + @Override + public Integer call() { + return ChildProcessLauncherHelper.getConnectedSandboxedServicesCountForTesting( + packageName); + } + }); + } + + // Blocks until the number of sandboxed connections reaches targetCount. + private static void waitForConnectedSandboxedServicesCount(int targetCount) { + CriteriaHelper.pollInstrumentationThread( + Criteria.equals(targetCount, new Callable<Integer>() { + @Override + public Integer call() { + return getConnectedSandboxedServicesCountForPackage(null /* packageName */); + } + })); + } + + private static ChildProcessCreationParams getDefaultChildProcessCreationParams( + String packageName) { + return packageName == null + ? null + : new ChildProcessCreationParams(packageName, false /* isExternalService */, + LibraryProcessType.PROCESS_CHILD, false /* bindToCallerCheck */); + } + + private static boolean hasSandboxedConnectionAllocatorForPackage(final String packageName) { + return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(new Callable<Boolean>() { + @Override + public Boolean call() { + return ChildProcessLauncherHelper.hasSandboxedConnectionAllocatorForPackage( + packageName); + } + }); + } + + private static ChildProcessConnection retrieveConnection( + final ChildProcessLauncherHelper launcherHelper) { + CriteriaHelper.pollInstrumentationThread( + new Criteria("Failed waiting for child process to connect") { + @Override + public boolean isSatisfied() { + return ChildProcessLauncherTestUtils.getConnection(launcherHelper) != null; + } + }); + + return ChildProcessLauncherTestUtils.getConnection(launcherHelper); + } + + private static void stopProcess(ChildProcessLauncherHelper launcherHelper) { + final ChildProcessConnection connection = retrieveConnection(launcherHelper); + ChildProcessLauncherTestUtils.runOnLauncherThreadBlocking(new Runnable() { + @Override + public void run() { + ChildProcessLauncherHelper.stop(connection.getPid()); + } + }); + } + + private static int getPid(final ChildProcessLauncherHelper launcherHelper) { + return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(new Callable<Integer>() { + @Override + public Integer call() { + return launcherHelper.getPid(); + } + }); + } + + private static ChildProcessConnection getWarmUpConnection() { + return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult( + new Callable<ChildProcessConnection>() { + @Override + public ChildProcessConnection call() { + return ChildProcessLauncherHelper.getWarmUpConnectionForTesting(); + } + }); + } +}
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java index 3a36065f..5ff7ab2 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java
@@ -1,4 +1,4 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. +// Copyright 2017 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. @@ -6,15 +6,11 @@ import android.content.ComponentName; import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.os.Handler; +import android.os.Bundle; import android.os.IBinder; -import android.os.Looper; -import android.os.Message; -import android.os.Messenger; import android.os.RemoteException; import android.support.test.InstrumentationRegistry; +import android.support.test.filters.LargeTest; import android.support.test.filters.MediumTest; import org.junit.Assert; @@ -22,49 +18,381 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.BaseSwitches; -import org.chromium.base.ThreadUtils; -import org.chromium.base.library_loader.LibraryLoader; -import org.chromium.base.library_loader.LibraryProcessType; -import org.chromium.base.process_launcher.ChildProcessCreationParams; import org.chromium.base.process_launcher.FileDescriptorInfo; +import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.Feature; -import org.chromium.content.browser.test.ChildProcessAllocatorSettings; import org.chromium.content.browser.test.ContentJUnit4ClassRunner; import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; -import org.chromium.content_shell_apk.ChildProcessLauncherTestHelperService; import org.chromium.content_shell_apk.ChildProcessLauncherTestUtils; +import org.chromium.content_shell_apk.IChildProcessTest; import java.util.concurrent.Callable; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicReference; /** * Instrumentation tests for ChildProcessLauncher. */ @RunWith(ContentJUnit4ClassRunner.class) public class ChildProcessLauncherTest { - // Pseudo command line arguments to instruct the child process to wait until being killed. - // Allowing the process to continue would lead to a crash when attempting to initialize IPC - // channels that are not being set up in this test. - private static final String[] sProcessWaitArguments = { - "_", "--" + BaseSwitches.RENDERER_WAIT_FOR_JAVA_DEBUGGER }; - private static final String EXTERNAL_APK_PACKAGE_NAME = "org.chromium.external.apk"; - private static final String DEFAULT_SANDBOXED_PROCESS_SERVICE = - "org.chromium.content.app.SandboxedProcessService"; + private static final long CONDITION_WAIT_TIMEOUT_MS = 5000; - private static final int DONT_BLOCK = 0; - private static final int BLOCK_UNTIL_CONNECTED = 1; - private static final int BLOCK_UNTIL_SETUP = 2; + private static final String SERVICE_PACKAGE_NAME = "org.chromium.content_shell_apk"; + private static final String SERVICE_NAME_META_DATA_KEY = + "org.chromium.content.browser.TEST_SERVICES_NAME"; + private static final String SERVICE_COUNT_META_DATA_KEY = + "org.chromium.content.browser.NUM_TEST_SERVICES"; + private static final String SERVICE0_FULL_NAME = + "org.chromium.content_shell_apk.TestChildProcessService0"; + + private static final String EXTRA_SERVICE_PARAM = "org.chromium.content.browser.SERVICE_EXTRA"; + private static final String EXTRA_SERVICE_PARAM_VALUE = "SERVICE_EXTRA"; + + private static final String EXTRA_CONNECTION_PARAM = + "org.chromium.content.browser.CONNECTION_EXTRA"; + private static final String EXTRA_CONNECTION_PARAM_VALUE = "CONNECTION_EXTRA"; + + private static final int CONNECTION_BLOCK_UNTIL_CONNECTED = 1; + private static final int CONNECTION_BLOCK_UNTIL_SETUP = 2; + + /** + * A factory used to create a ChildProcessLauncher with a bound connection or with a connection + * connection allocator so that the test code can be reused for both scenarios. + */ + private abstract static class ChildProcessLauncherFactory { + private final boolean mConnectionProvided; + + public ChildProcessLauncherFactory(boolean connectionProvided) { + mConnectionProvided = connectionProvided; + } + + public abstract ChildProcessLauncher createChildProcessLauncher( + ChildProcessLauncher.Delegate delegate, String[] commandLine, + FileDescriptorInfo[] filesToBeMapped, IBinder binderCallback); + + public boolean isConnectionProvided() { + return mConnectionProvided; + } + } + + private static final ChildProcessLauncher.Delegate EMPTY_LAUNCHER_DELEGATE = + new ChildProcessLauncher.Delegate() { + @Override + public void onBeforeConnectionAllocated(Bundle serviceBundle) {} + + @Override + public void onBeforeConnectionSetup(Bundle connectionBundle) {} + + @Override + public void onConnectionEstablished(ChildProcessConnection connection) {} + + @Override + public void onConnectionLost(ChildProcessConnection connection) {} + }; + + private ChildConnectionAllocator mConnectionAllocator; @Before public void setUp() throws Exception { - LibraryLoader.get(LibraryProcessType.PROCESS_CHILD).ensureInitialized(); + mConnectionAllocator = ChildProcessLauncherTestUtils.runOnLauncherAndGetResult( + new Callable<ChildConnectionAllocator>() { + @Override + public ChildConnectionAllocator call() { + Context context = + InstrumentationRegistry.getInstrumentation().getTargetContext(); + return ChildConnectionAllocator.create(context, null /* creationParams */, + SERVICE_PACKAGE_NAME, SERVICE_NAME_META_DATA_KEY, + SERVICE_COUNT_META_DATA_KEY, false /* bindAsExternalService */, + false /* useStrongBinding */); + } + }); + } + + private static class IChildProcessBinder extends IChildProcessTest.Stub { + private final CallbackHelper mOnConnectionSetupHelper = new CallbackHelper(); + private final CallbackHelper mOnLoadNativeHelper = new CallbackHelper(); + private final CallbackHelper mOnBeforeMainHelper = new CallbackHelper(); + private final CallbackHelper mOnRunMainHelper = new CallbackHelper(); + private final CallbackHelper mOnDestroyHelper = new CallbackHelper(); + + // Can be accessed after mOnConnectionSetupCalled is signaled. + private boolean mServiceCreated; + private Bundle mServiceBundle; + private Bundle mConnectionBundle; + + // Can be accessed after mOnLoadNativeCalled is signaled. + private boolean mNativeLibraryLoaded; + + // Can be accessed after mOnBeforeMainCalled is signaled. + private String[] mCommandLine; + + @Override + public void onConnectionSetup( + boolean serviceCreatedCalled, Bundle serviceBundle, Bundle connectionBundle) { + mServiceCreated = serviceCreatedCalled; + mServiceBundle = serviceBundle; + mConnectionBundle = connectionBundle; + Assert.assertEquals(0, mOnConnectionSetupHelper.getCallCount()); + mOnConnectionSetupHelper.notifyCalled(); + } + + @Override + public void onLoadNativeLibrary(boolean loadedSuccessfully) { + mNativeLibraryLoaded = loadedSuccessfully; + Assert.assertEquals(0, mOnLoadNativeHelper.getCallCount()); + mOnLoadNativeHelper.notifyCalled(); + } + + @Override + public void onBeforeMain(String[] commandLine) { + mCommandLine = commandLine; + Assert.assertEquals(0, mOnBeforeMainHelper.getCallCount()); + mOnBeforeMainHelper.notifyCalled(); + } + + @Override + public void onRunMain() { + Assert.assertEquals(0, mOnRunMainHelper.getCallCount()); + mOnRunMainHelper.notifyCalled(); + } + + @Override + public void onDestroy() { + Assert.assertEquals(0, mOnDestroyHelper.getCallCount()); + mOnDestroyHelper.notifyCalled(); + } + + public void waitForOnConnectionSetupCalled() throws InterruptedException, TimeoutException { + mOnConnectionSetupHelper.waitForCallback(0 /* currentCallCount */); + } + + public void waitForOnNativeLibraryCalled() throws InterruptedException, TimeoutException { + mOnLoadNativeHelper.waitForCallback(0 /* currentCallCount */); + } + + public void waitOnBeforeMainCalled() throws InterruptedException, TimeoutException { + mOnBeforeMainHelper.waitForCallback(0 /* currentCallCount */); + } + + public void waitOnRunMainCalled() throws InterruptedException, TimeoutException { + mOnRunMainHelper.waitForCallback(0 /* currentCallCount */); + } + + public void waitOnDestroyCalled() throws InterruptedException, TimeoutException { + mOnDestroyHelper.waitForCallback(0 /* currentCallCount */); + } + }; + + /** + * Creates a child process with the ChildProcessLauncher created with {@param launcherFactory} + * and tests that the all callbacks on the client and in the service are called appropriately. + * The service echos back the delegate calls through the IBinder callback so that the test can + * validate them. + */ + private void testProcessLauncher(final ChildProcessLauncherFactory launcherFactory) + throws InterruptedException, TimeoutException { + // ConditionVariables used to check the ChildProcessLauncher.Delegate methods get called. + final CallbackHelper onBeforeConnectionAllocatedHelper = new CallbackHelper(); + final CallbackHelper onBeforeConnectionSetupHelper = new CallbackHelper(); + final CallbackHelper onConnectionEstablishedHelper = new CallbackHelper(); + final CallbackHelper onConnectionLostHelper = new CallbackHelper(); + + final ChildProcessLauncher.Delegate delegate = new ChildProcessLauncher.Delegate() { + @Override + public void onBeforeConnectionAllocated(Bundle serviceBundle) { + // Should only be called when the ChildProcessLauncher creates the connection. + Assert.assertFalse(launcherFactory.isConnectionProvided()); + Assert.assertEquals(0, onBeforeConnectionAllocatedHelper.getCallCount()); + serviceBundle.putString(EXTRA_SERVICE_PARAM, EXTRA_SERVICE_PARAM_VALUE); + onBeforeConnectionAllocatedHelper.notifyCalled(); + } + + @Override + public void onBeforeConnectionSetup(Bundle connectionBundle) { + connectionBundle.putString(EXTRA_CONNECTION_PARAM, EXTRA_CONNECTION_PARAM_VALUE); + Assert.assertEquals(0, onBeforeConnectionSetupHelper.getCallCount()); + onBeforeConnectionSetupHelper.notifyCalled(); + } + + @Override + public void onConnectionEstablished(ChildProcessConnection connection) { + Assert.assertEquals(0, onConnectionEstablishedHelper.getCallCount()); + onConnectionEstablishedHelper.notifyCalled(); + } + + @Override + public void onConnectionLost(ChildProcessConnection connection) { + Assert.assertEquals(0, onConnectionLostHelper.getCallCount()); + onConnectionLostHelper.notifyCalled(); + } + }; + + final String[] commandLine = new String[] {"--test-param1", "--test-param2"}; + final FileDescriptorInfo[] filesToBeMapped = new FileDescriptorInfo[0]; + + final IChildProcessBinder childProcessBinder = new IChildProcessBinder(); + + final ChildProcessLauncher processLauncher = + ChildProcessLauncherTestUtils.runOnLauncherAndGetResult( + new Callable<ChildProcessLauncher>() { + @Override + public ChildProcessLauncher call() { + ChildProcessLauncher processLauncher = + launcherFactory.createChildProcessLauncher(delegate, + commandLine, filesToBeMapped, childProcessBinder); + processLauncher.start(true /* setupConnection */, + false /*queueIfNoFreeConnection */); + return processLauncher; + } + }); + + Assert.assertNotNull(processLauncher); + + if (!launcherFactory.isConnectionProvided()) { + onBeforeConnectionAllocatedHelper.waitForCallback(0 /* currentCallback */); + } + + onBeforeConnectionSetupHelper.waitForCallback(0 /* currentCallback */); + + // Wait for the service to notify its onConnectionSetup was called. + childProcessBinder.waitForOnConnectionSetupCalled(); + Assert.assertTrue(childProcessBinder.mServiceCreated); + Assert.assertNotNull(childProcessBinder.mServiceBundle); + Assert.assertNotNull(childProcessBinder.mConnectionBundle); + if (!launcherFactory.isConnectionProvided()) { + Assert.assertEquals(EXTRA_SERVICE_PARAM_VALUE, + childProcessBinder.mServiceBundle.getString(EXTRA_SERVICE_PARAM)); + } + Assert.assertEquals(EXTRA_CONNECTION_PARAM_VALUE, + childProcessBinder.mConnectionBundle.getString(EXTRA_CONNECTION_PARAM)); + + // Wait for the client onConnectionEstablished call. + onConnectionEstablishedHelper.waitForCallback(0 /* currentCallback */); + + // Wait for the service to notify its library got loaded. + childProcessBinder.waitForOnNativeLibraryCalled(); + Assert.assertTrue(childProcessBinder.mNativeLibraryLoaded); + + // Wait for the service to notify its onBeforeMain was called. + childProcessBinder.waitOnBeforeMainCalled(); + Assert.assertArrayEquals(commandLine, childProcessBinder.mCommandLine); + + // Wait for the service to notify its onRunMain was called. + childProcessBinder.waitOnRunMainCalled(); + + // Stop the launcher. ChildProcessLauncherTestUtils.runOnLauncherThreadBlocking(new Runnable() { @Override public void run() { - ChildProcessLauncherHelper.initLinker(); + processLauncher.stop(); } }); + // Wait for service to notify its onDestroy was called. + childProcessBinder.waitOnDestroyCalled(); + // The client should also get a notification that the connection was lost. + onConnectionLostHelper.waitForCallback(0 /* currentCallback */); + } + + @Test + @LargeTest + @Feature({"ProcessManagement"}) + public void testLaunchServiceCreatedWithConnectionAllocator() throws Exception { + final ChildProcessLauncherFactory childProcessLauncherFactory = + new ChildProcessLauncherFactory(false /* providesConnection */) { + @Override + public ChildProcessLauncher createChildProcessLauncher( + ChildProcessLauncher.Delegate delegate, String[] commandLine, + FileDescriptorInfo[] filesToBeMapped, IBinder binderCallback) { + return ChildProcessLauncher.createWithConnectionAllocator(delegate, + commandLine, filesToBeMapped, mConnectionAllocator, binderCallback); + } + }; + + testProcessLauncher(childProcessLauncherFactory); + } + + @Test + @LargeTest + @Feature({"ProcessManagement"}) + public void testLaunchServiceCreatedWithBoundConnection() throws Exception { + // Wraps the serviceCallback provided by the ChildProcessLauncher so that the + // ChildProcessConnection can forward to them appropriately. + final AtomicReference<ChildProcessConnection.ServiceCallback> serviceCallbackWrapper = + new AtomicReference<>(); + + final ChildProcessConnection boundConnection = + ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(new Callable< + ChildProcessConnection>() { + @Override + public ChildProcessConnection call() { + Context context = + InstrumentationRegistry.getInstrumentation().getTargetContext(); + ComponentName serviceName = + new ComponentName(SERVICE_PACKAGE_NAME, SERVICE0_FULL_NAME); + ChildProcessConnection connection = new ChildProcessConnection(context, + serviceName, false /* bindAsExternalService */, + new Bundle() /* serviceBundle */, null /* creationParams */); + connection.start(false /* useStrongBinding */, + new ChildProcessConnection.ServiceCallback() { + @Override + public void onChildStarted() { + if (serviceCallbackWrapper.get() != null) { + serviceCallbackWrapper.get().onChildStarted(); + } + } + + @Override + public void onChildStartFailed() { + if (serviceCallbackWrapper.get() != null) { + serviceCallbackWrapper.get().onChildStartFailed(); + } + } + + @Override + public void onChildProcessDied( + ChildProcessConnection connection) { + if (serviceCallbackWrapper.get() != null) { + serviceCallbackWrapper.get().onChildProcessDied( + connection); + } + } + }); + return connection; + } + }); + + Assert.assertNotNull(boundConnection); + + CriteriaHelper.pollInstrumentationThread(new Criteria("Connection failed to connect") { + @Override + public boolean isSatisfied() { + return boundConnection.isConnected(); + } + }); + + final ChildProcessLauncher.BoundConnectionProvider connectionProvider = + new ChildProcessLauncher.BoundConnectionProvider() { + @Override + public ChildProcessConnection getConnection( + ChildProcessConnection.ServiceCallback serviceCallback) { + serviceCallbackWrapper.set(serviceCallback); + return boundConnection; + } + }; + + final ChildProcessLauncherFactory childProcessLauncherFactory = + new ChildProcessLauncherFactory(true /* providesConnection */) { + @Override + public ChildProcessLauncher createChildProcessLauncher( + ChildProcessLauncher.Delegate delegate, String[] commandLine, + FileDescriptorInfo[] filesToBeMapped, IBinder binderCallback) { + return ChildProcessLauncher.createWithBoundConnectionProvider(delegate, + commandLine, filesToBeMapped, connectionProvider, binderCallback); + } + }; + + testProcessLauncher(childProcessLauncherFactory); } /** @@ -73,19 +401,32 @@ @Test @MediumTest @Feature({"ProcessManagement"}) - @ChildProcessAllocatorSettings(sandboxedServiceCount = 4) public void testServiceFailedToBind() { - Assert.assertEquals(0, getConnectedSandboxedServicesCount()); + final ChildConnectionAllocator badConnectionAllocator = + ChildProcessLauncherTestUtils.runOnLauncherAndGetResult( + new Callable<ChildConnectionAllocator>() { + @Override + public ChildConnectionAllocator call() { + return ChildConnectionAllocator.createForTest( + null /* creationParams */, "org.chromium.wrong_package", + "WrongService", 2 /* serviceCount */, + false /* bindAsExternalService */, + false /* useStrongBinding */); + } + }); + Assert.assertFalse(badConnectionAllocator.anyConnectionAllocated()); // Try to allocate a connection to service class in incorrect package. We can do that by // using the instrumentation context (getContext()) instead of the app context // (getTargetContext()). - Context context = InstrumentationRegistry.getInstrumentation().getContext(); - startSandboxedChildProcess( - context.getPackageName(), DONT_BLOCK, true /* doSetupConnection */); + ChildProcessLauncher processLauncher = createChildProcessLauncher(badConnectionAllocator, + true /* setupConnection */, false /* queueIfNoFreeConnection */); - // Verify that the connection is not considered as allocated. - waitForConnectedSandboxedServicesCount(0); + Assert.assertNotNull(processLauncher); + + // Verify that the connection is not considered as allocated (or only briefly, as the + // freeing is delayed). + waitForConnectionAllocatorState(badConnectionAllocator, true /* isEmpty */); } /** @@ -95,617 +436,166 @@ @MediumTest @Feature({"ProcessManagement"}) public void testServiceCrashedBeforeSetup() throws RemoteException { - Assert.assertEquals(0, getConnectedSandboxedServicesCount()); + Assert.assertFalse(mConnectionAllocator.anyConnectionAllocated()); // Start and connect to a new service. - ChildProcessLauncherHelper launcher = startSandboxedChildProcess( - null /* packageName */, BLOCK_UNTIL_CONNECTED, false /* doSetupConnection */); + ChildProcessLauncher processLauncher = createChildProcessLauncher(mConnectionAllocator, + false /* setupConnection */, false /* queueIfNoFreeConnection */); // Verify that the service is bound but not yet set up. - Assert.assertEquals(1, getConnectedSandboxedServicesCount()); - ChildProcessConnection connection = retrieveConnection(launcher); + Assert.assertTrue(mConnectionAllocator.anyConnectionAllocated()); + ChildProcessConnection connection = processLauncher.getConnection(); Assert.assertNotNull(connection); - Assert.assertTrue(connection.isConnected()); - Assert.assertEquals(0, ChildProcessLauncherTestUtils.getConnectionPid(connection)); + waitForConnectionState(connection, CONNECTION_BLOCK_UNTIL_CONNECTED); + Assert.assertEquals(0, getConnectionPid(connection)); // Crash the service. connection.crashServiceForTesting(); // Verify that the connection gets cleaned-up. - waitForConnectedSandboxedServicesCount(0); + waitForConnectionAllocatorState(mConnectionAllocator, true /* isEmpty */); } - /** - * Tests cleanup for a connection that terminates after setup. - */ @Test @MediumTest @Feature({"ProcessManagement"}) public void testServiceCrashedAfterSetup() throws RemoteException { - Assert.assertEquals(0, getConnectedSandboxedServicesCount()); + Assert.assertFalse(mConnectionAllocator.anyConnectionAllocated()); // Start and connect to a new service. - ChildProcessLauncherHelper launcher = startSandboxedChildProcess( - null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); - Assert.assertEquals(1, getConnectedSandboxedServicesCount()); + ChildProcessLauncher processLauncher = createChildProcessLauncher(mConnectionAllocator, + true /* setupConnection */, false /* queueIfNoFreeConnection */); - int pid = getPid(launcher); - Assert.assertNotEquals(0, pid); + Assert.assertTrue(mConnectionAllocator.anyConnectionAllocated()); + ChildProcessConnection connection = processLauncher.getConnection(); + Assert.assertNotNull(connection); + waitForConnectionState(connection, CONNECTION_BLOCK_UNTIL_SETUP); + // We are passed set-up, the connection should have received its PID. + Assert.assertNotEquals(0, getConnectionPid(connection)); // Crash the service. - ChildProcessConnection connection = retrieveConnection(launcher); connection.crashServiceForTesting(); // Verify that the connection gets cleaned-up. - waitForConnectedSandboxedServicesCount(0); + waitForConnectionAllocatorState(mConnectionAllocator, true /* isEmpty */); // Verify that the connection pid remains set after termination. - Assert.assertTrue(ChildProcessLauncherTestUtils.getConnectionPid(connection) != 0); - // And that the launcher is cleared. - Assert.assertNull(ChildProcessLauncherHelper.getLauncherForPid(pid)); + Assert.assertNotEquals(0, getConnectionPid(connection)); } - /** - * Tests that connection requests get queued when no slot is availabe and created once a slot - * frees up . - */ @Test @MediumTest @Feature({"ProcessManagement"}) - @ChildProcessAllocatorSettings(sandboxedServiceCount = 1) public void testPendingSpawnQueue() throws RemoteException { - Assert.assertEquals(0, getConnectedSandboxedServicesCount()); + Assert.assertFalse(mConnectionAllocator.anyConnectionAllocated()); - ChildProcessLauncherHelper launcher1 = startSandboxedChildProcess( - null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); - Assert.assertEquals(1, getConnectedSandboxedServicesCount()); - Assert.assertNotNull(ChildProcessLauncherTestUtils.getConnection(launcher1)); - - ChildProcessLauncherHelper launcher2 = startSandboxedChildProcess( - null /* packageName */, DONT_BLOCK, true /* doSetupConnection */); - Assert.assertEquals(1, getConnectedSandboxedServicesCount()); - Assert.assertNull(ChildProcessLauncherTestUtils.getConnection(launcher2)); - - final ChildProcessConnection connection1 = - ChildProcessLauncherTestUtils.getConnection(launcher1); - connection1.crashServiceForTesting(); - - // The previous service crashing should have freed a connection that should be used for the - // pending process. - blockUntilConnected(launcher2); - } - - /** - * Tests that external APKs and regular use different ChildConnectionAllocators. - */ - @Test - @MediumTest - @Feature({"ProcessManagement"}) - @ChildProcessAllocatorSettings( - sandboxedServiceCount = 4, sandboxedServiceName = DEFAULT_SANDBOXED_PROCESS_SERVICE) - public void testAllocatorForPackage() { - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - - ChildConnectionAllocator connectionAllocator = getChildConnectionAllocator( - appContext, appContext.getPackageName(), true /* sandboxed */); - ChildConnectionAllocator externalConnectionAllocator = getChildConnectionAllocator( - appContext, EXTERNAL_APK_PACKAGE_NAME, true /* sandboxed */); - Assert.assertNotEquals(connectionAllocator, externalConnectionAllocator); - } - - /** - * Tests binding to the same sandboxed service process from multiple processes in the - * same package. This uses the ChildProcessLauncherTestHelperService declared in - * ContentShell.apk as a separate android:process to bind the first (slot 0) service. The - * instrumentation test then tries to bind the same slot, which fails, so the - * ChildProcessLauncher retries on a new connection. - */ - @Test - @MediumTest - @Feature({"ProcessManagement"}) - public void testBindServiceFromMultipleProcesses() throws RemoteException { - final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); - - // Start the Helper service. - class HelperConnection implements ServiceConnection { - Messenger mMessenger = null; - - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - mMessenger = new Messenger(service); - } - - @Override - public void onServiceDisconnected(ComponentName name) {} + // Launch 4 processes. Since we have only 2 services, the 3rd and 4th should get queued. + ChildProcessLauncher[] launchers = new ChildProcessLauncher[4]; + ChildProcessConnection[] connections = new ChildProcessConnection[4]; + for (int i = 0; i < 4; i++) { + launchers[i] = createChildProcessLauncher(mConnectionAllocator, + true /* setupConnection */, true /* queueIfNoFreeConnection */); + Assert.assertNotNull(launchers[i]); + connections[i] = launchers[i].getConnection(); } - final HelperConnection serviceConnection = new HelperConnection(); + Assert.assertNotNull(connections[0]); + Assert.assertNotNull(connections[1]); + Assert.assertNull(connections[2]); + Assert.assertNull(connections[3]); - Intent intent = new Intent(); - intent.setComponent(new ComponentName(context.getPackageName(), - context.getPackageName() + ".ChildProcessLauncherTestHelperService")); - Assert.assertTrue(context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)); + // Test creating a launcher with queueIfNoFreeConnection false with no connection available. + Assert.assertNull(createChildProcessLauncher(mConnectionAllocator, + true /* setupConnection */, false /* queueIfNoFreeConnection */)); - // Wait for the Helper service to connect. - CriteriaHelper.pollInstrumentationThread( - new Criteria("Failed to get helper service Messenger") { - @Override - public boolean isSatisfied() { - return serviceConnection.mMessenger != null; - } - }); + // Stop one connection, that should free-up a connection and the first queued launcher + // should use it. + stopLauncher(launchers[0]); + waitUntilLauncherSetup(launchers[2]); - Assert.assertNotNull(serviceConnection.mMessenger); + // Last launcher is still queued. + Assert.assertNull(launchers[3].getConnection()); - class ReplyHandler implements Handler.Callback { - Message mMessage; - - @Override - public boolean handleMessage(Message msg) { - // Copy the message so its contents outlive this Binder transaction. - mMessage = Message.obtain(); - mMessage.copyFrom(msg); - return true; - } - } - final ReplyHandler replyHandler = new ReplyHandler(); - - // Send a message to the Helper and wait for the reply. This will cause the slot 0 - // sandboxed service connection to be bound by a different PID (i.e., not this process). - Message msg = Message.obtain(null, ChildProcessLauncherTestHelperService.MSG_BIND_SERVICE); - msg.replyTo = new Messenger(new Handler(Looper.getMainLooper(), replyHandler)); - serviceConnection.mMessenger.send(msg); - - CriteriaHelper.pollInstrumentationThread( - new Criteria("Failed waiting for helper service reply") { - @Override - public boolean isSatisfied() { - return replyHandler.mMessage != null; - } - }); - - // Verify that the Helper was able to launch the sandboxed service. - Assert.assertNotNull(replyHandler.mMessage); - Assert.assertEquals(ChildProcessLauncherTestHelperService.MSG_BIND_SERVICE_REPLY, - replyHandler.mMessage.what); - Assert.assertEquals( - "Connection slot from helper service is not 0", 0, replyHandler.mMessage.arg2); - - final int helperConnectionPid = replyHandler.mMessage.arg1; - Assert.assertTrue(helperConnectionPid > 0); - - // Launch a service from this process. Since slot 0 is already bound by the Helper, it - // will fail to start and the ChildProcessLauncher will retry and use the slot 1. - ChildProcessCreationParams creationParams = new ChildProcessCreationParams( - context.getPackageName(), false /* isExternalService */, - LibraryProcessType.PROCESS_CHILD, true /* bindToCallerCheck */); - ChildProcessLauncherHelper launcher = startSandboxedChildProcessWithCreationParams( - creationParams, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); - - final ChildProcessConnection retryConnection = - ChildProcessLauncherTestUtils.getConnection(launcher); - Assert.assertEquals( - 1, ChildProcessLauncherTestUtils.getConnectionServiceNumber(retryConnection)); - - ChildConnectionAllocator connectionAllocator = - launcher.getChildConnectionAllocatorForTesting(); - - // Check that only two connections are created. - for (int i = 0; i < connectionAllocator.getNumberOfServices(); ++i) { - ChildProcessConnection sandboxedConn = - connectionAllocator.getChildProcessConnectionAtSlotForTesting(i); - if (i <= 1) { - Assert.assertNotNull(sandboxedConn); - Assert.assertNotNull( - ChildProcessLauncherTestUtils.getConnectionService(sandboxedConn)); - } else { - Assert.assertNull(sandboxedConn); - } - } - - Assert.assertEquals( - connectionAllocator.getChildProcessConnectionAtSlotForTesting(1), retryConnection); - - ChildProcessConnection failedConnection = - connectionAllocator.getChildProcessConnectionAtSlotForTesting(0); - Assert.assertEquals(0, ChildProcessLauncherTestUtils.getConnectionPid(failedConnection)); - Assert.assertFalse(ChildProcessLauncherTestUtils.getConnectionService(failedConnection) - .bindToCaller()); - - CriteriaHelper.pollInstrumentationThread( - new Criteria("Failed waiting retry connection to get pid") { - @Override - public boolean isSatisfied() { - return ChildProcessLauncherTestUtils.getConnectionPid(retryConnection) > 0; - } - }); - Assert.assertTrue(ChildProcessLauncherTestUtils.getConnectionPid(retryConnection) - != helperConnectionPid); - Assert.assertTrue( - ChildProcessLauncherTestUtils.getConnectionService(retryConnection).bindToCaller()); + // Crash another launcher. It should free-up another connection that the queued-up launcher + // should use. + connections[1].crashServiceForTesting(); + waitUntilLauncherSetup(launchers[3]); } - private static void warmUpOnUiThreadBlocking(final Context context) { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - ChildProcessLauncherHelper.warmUp(context); - } - }); - ChildProcessConnection connection = getWarmUpConnection(); - Assert.assertNotNull(connection); - blockUntilConnected(connection); - } - - private void testWarmUpWithCreationParams(ChildProcessCreationParams creationParams) { - if (creationParams != null) { - ChildProcessCreationParams.registerDefault(creationParams); - } - - Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); - warmUpOnUiThreadBlocking(context); - - Assert.assertEquals(1, getConnectedSandboxedServicesCount()); - - ChildProcessLauncherHelper launcherHelper = startSandboxedChildProcessWithCreationParams( - creationParams, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); - - // The warm-up connection was used, so no new process should have been created. - Assert.assertEquals(1, getConnectedSandboxedServicesCount()); - - int pid = getPid(launcherHelper); - Assert.assertNotEquals(0, pid); - - stopProcess(launcherHelper); - - waitForConnectedSandboxedServicesCount(0); - Assert.assertNull(ChildProcessLauncherHelper.getLauncherForPid(pid)); - } - - @Test - @MediumTest - @Feature({"ProcessManagement"}) - public void testWarmUp() { - // Use the default creation parameters. - testWarmUpWithCreationParams(null /* creationParams */); - } - - @Test - @MediumTest - @Feature({"ProcessManagement"}) - public void testWarmUpWithBindToCaller() { - Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); - ChildProcessCreationParams creationParams = new ChildProcessCreationParams( - context.getPackageName(), false /* isExternalService */, - LibraryProcessType.PROCESS_CHILD, true /* bindToCallerCheck */); - testWarmUpWithCreationParams(creationParams); - } - - // Tests that the warm-up connection is freed from its allocator if it crashes. - @Test - @MediumTest - @Feature({"ProcessManagement"}) - public void testWarmUpProcessCrashBeforeUse() throws RemoteException { - Assert.assertEquals(0, getConnectedSandboxedServicesCount()); - - Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); - warmUpOnUiThreadBlocking(context); - - Assert.assertEquals(1, getConnectedSandboxedServicesCount()); - - // Crash the warm-up connection before it gets used. - ChildProcessConnection connection = getWarmUpConnection(); - Assert.assertNotNull(connection); - connection.crashServiceForTesting(); - - // It should get cleaned-up. - waitForConnectedSandboxedServicesCount(0); - - // And subsequent process launches should work. - ChildProcessLauncherHelper launcher = startSandboxedChildProcess( - null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); - Assert.assertEquals(1, getConnectedSandboxedServicesCount()); - Assert.assertNotNull(ChildProcessLauncherTestUtils.getConnection(launcher)); - } - - // Tests that the warm-up connection is freed from its allocator if it crashes after being used. - @Test - @MediumTest - @Feature({"ProcessManagement"}) - public void testWarmUpProcessCrashAfterUse() throws RemoteException { - Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); - warmUpOnUiThreadBlocking(context); - - Assert.assertEquals(1, getConnectedSandboxedServicesCount()); - - ChildProcessLauncherHelper launcherHelper = startSandboxedChildProcessWithCreationParams( - null /* creationParams */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); - - // The warm-up connection was used, so no new process should have been created. - Assert.assertEquals(1, getConnectedSandboxedServicesCount()); - - int pid = getPid(launcherHelper); - Assert.assertNotEquals(0, pid); - - ChildProcessConnection connection = retrieveConnection(launcherHelper); - connection.crashServiceForTesting(); - - waitForConnectedSandboxedServicesCount(0); - Assert.assertNull(ChildProcessLauncherHelper.getLauncherForPid(pid)); - } - - @Test - @MediumTest - @Feature({"ProcessManagement"}) - public void testSandboxedAllocatorFreed() { - final String packageName = - InstrumentationRegistry.getInstrumentation().getTargetContext().getPackageName(); - - ChildProcessLauncherHelper launcher = startSandboxedChildProcess( - null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); - - Assert.assertTrue(hasSandboxedConnectionAllocatorForPackage(packageName)); - - stopProcess(launcher); - - // Poll until allocator is removed. Need to poll here because actually freeing a connection - // from allocator is a posted task, rather than a direct call from stop. - CriteriaHelper.pollInstrumentationThread( - new Criteria("The connection allocator was not removed.") { - @Override - public boolean isSatisfied() { - return !hasSandboxedConnectionAllocatorForPackage(packageName); - } - }); - } - - @Test - @MediumTest - @Feature({"ProcessManagement"}) - @ChildProcessAllocatorSettings(sandboxedServiceCount = 4) - public void testCustomCreationParamDoesNotReuseWarmupConnection() { - // Since warmUp only uses default params. - final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); - ChildProcessCreationParams defaultCreationParams = - getDefaultChildProcessCreationParams(context.getPackageName()); - ChildProcessCreationParams.registerDefault(defaultCreationParams); - ChildProcessCreationParams otherCreationParams = getDefaultChildProcessCreationParams( - InstrumentationRegistry.getInstrumentation().getContext().getPackageName()); - - warmUpOnUiThreadBlocking(context); - Assert.assertEquals(1, getConnectedSandboxedServicesCount()); - - // First create a connnection with different creation params than the default, it should not - // use the warmup connection (note that it won't bind since we are using the wrong package, - // but we need to use a different package to differentiate them, and we can only have 1 - // valid package per app). - startSandboxedChildProcessWithCreationParams( - otherCreationParams, DONT_BLOCK, false /* doSetupConnection */); - Assert.assertNotNull(getWarmUpConnection()); - - // Then start a process with the default creation params, the warmup-connection should be - // used. - startSandboxedChildProcessWithCreationParams( - defaultCreationParams, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); - Assert.assertNull(getWarmUpConnection()); - } - - @Test - @MediumTest - @Feature({"ProcessManagement"}) - public void testUseStrongBindingConnection() { - // Since warmUp only uses default params. - Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); - ChildProcessCreationParams creationParams = new ChildProcessCreationParams( - context.getPackageName(), false /* isExternalService */, - LibraryProcessType.PROCESS_CHILD, true /* bindToCallerCheck */); - - for (final boolean sandboxed : new boolean[] {true, false}) { - ChildProcessLauncherHelper launcher = ChildProcessLauncherTestUtils.startForTesting( - sandboxed, sProcessWaitArguments, new FileDescriptorInfo[0], creationParams, - true /* doSetupConnection */); - final ChildProcessConnection connection = - ChildProcessLauncherTestUtils.getConnection(launcher); - Assert.assertNotNull(connection); - ChildProcessLauncherTestUtils.runOnLauncherThreadBlocking(new Runnable() { - @Override - public void run() { - // Only non sandboxed connections should use strong bindings. - Assert.assertNotEquals(sandboxed, connection.isStrongBindingBound()); - } - }); - } - } - - @Test - @MediumTest - @Feature({"ProcessManagement"}) - public void testLauncherCleanup() throws RemoteException { - ChildProcessLauncherHelper launcher = startSandboxedChildProcess( - null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); - int pid = getPid(launcher); - Assert.assertNotEquals(0, pid); - Assert.assertNotNull(ChildProcessLauncherHelper.getLauncherForPid(pid)); - - // Stop the process explicitly, the launcher should get cleared. - stopProcess(launcher); - waitForConnectedSandboxedServicesCount(0); - Assert.assertNull(ChildProcessLauncherHelper.getLauncherForPid(pid)); - - launcher = startSandboxedChildProcess( - null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */); - pid = getPid(launcher); - Assert.assertNotEquals(0, pid); - Assert.assertNotNull(ChildProcessLauncherHelper.getLauncherForPid(pid)); - - // This time crash the connection, the launcher should also get cleared. - ChildProcessConnection connection = retrieveConnection(launcher); - connection.crashServiceForTesting(); - waitForConnectedSandboxedServicesCount(0); - Assert.assertNull(ChildProcessLauncherHelper.getLauncherForPid(pid)); - } - - private static ChildProcessLauncherHelper startSandboxedChildProcess( - final String packageName, int blockingPolicy, final boolean doSetupConnection) { - ChildProcessCreationParams creationParams = - packageName == null ? null : getDefaultChildProcessCreationParams(packageName); - return startSandboxedChildProcessWithCreationParams( - creationParams, blockingPolicy, doSetupConnection); - } - - private static ChildProcessLauncherHelper startSandboxedChildProcessWithCreationParams( - final ChildProcessCreationParams creationParams, int blockingPolicy, - final boolean doSetupConnection) { - assert doSetupConnection || blockingPolicy != BLOCK_UNTIL_SETUP; - ChildProcessLauncherHelper launcher = - ChildProcessLauncherTestUtils.runOnLauncherAndGetResult( - new Callable<ChildProcessLauncherHelper>() { - @Override - public ChildProcessLauncherHelper call() { - return ChildProcessLauncherHelper.createAndStartForTesting( - creationParams, sProcessWaitArguments, - new FileDescriptorInfo[0], true /* sandboxed */, - null /* binderCallback */, doSetupConnection); - } - }); - if (blockingPolicy != DONT_BLOCK) { - assert blockingPolicy == BLOCK_UNTIL_CONNECTED || blockingPolicy == BLOCK_UNTIL_SETUP; - blockUntilConnected(launcher); - if (blockingPolicy == BLOCK_UNTIL_SETUP) { - blockUntilSetup(launcher); - } - } - return launcher; - } - - private static void blockUntilConnected(final ChildProcessLauncherHelper launcher) { - CriteriaHelper.pollInstrumentationThread( - new Criteria("The connection wasn't established.") { - @Override - public boolean isSatisfied() { - return launcher.getConnection() != null - && launcher.getConnection().isConnected(); - } - }); - } - - private static void blockUntilConnected(final ChildProcessConnection connection) { - CriteriaHelper.pollInstrumentationThread( - new Criteria("The connection wasn't established.") { - @Override - public boolean isSatisfied() { - return connection.isConnected(); - } - }); - } - - private static void blockUntilSetup(final ChildProcessLauncherHelper launcher) { - CriteriaHelper.pollInstrumentationThread( - new Criteria("The connection wasn't established.") { - @Override - public boolean isSatisfied() { - return getPid(launcher) != 0; - } - }); - } - - private static ChildConnectionAllocator getChildConnectionAllocator( - final Context context, final String packageName, final boolean sandboxed) { + private static ChildProcessLauncher createChildProcessLauncher( + final ChildConnectionAllocator connectionAllocator, final boolean setupConnection, + final boolean queueIfNoFreeConnection) { return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult( - new Callable<ChildConnectionAllocator>() { + new Callable<ChildProcessLauncher>() { @Override - public ChildConnectionAllocator call() { - return ChildProcessLauncherHelper.getConnectionAllocator(context, - getDefaultChildProcessCreationParams(packageName), sandboxed); + public ChildProcessLauncher call() { + ChildProcessLauncher processLauncher = + ChildProcessLauncher.createWithConnectionAllocator( + EMPTY_LAUNCHER_DELEGATE, new String[0], + new FileDescriptorInfo[0], connectionAllocator, + null /* binderCallback */); + if (!processLauncher.start(setupConnection, queueIfNoFreeConnection)) { + return null; + } + return processLauncher; } }); } - // Returns the number of sandboxed connection currently connected, - private static int getConnectedSandboxedServicesCount() { - return getConnectedSandboxedServicesCountForPackage(null /* packageName */); - } - - // Returns the number of sandboxed connection matching the specificed package name that are - // connected, - private static int getConnectedSandboxedServicesCountForPackage(final String packageName) { - return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult( - new Callable<Integer>() { - @Override - public Integer call() { - return ChildProcessLauncherHelper - .getConnectedSandboxedServicesCountForTesting(packageName); - } - }); - } - - // Blocks until the number of sandboxed connections reaches targetCount. - private static void waitForConnectedSandboxedServicesCount(int targetCount) { + private static void waitForConnectionAllocatorState( + final ChildConnectionAllocator connectionAllocator, final boolean emptyState) { CriteriaHelper.pollInstrumentationThread( - Criteria.equals(targetCount, new Callable<Integer>() { - @Override - public Integer call() { - return getConnectedSandboxedServicesCountForPackage(null /* packageName */); - } - })); - } - - private static ChildProcessCreationParams getDefaultChildProcessCreationParams( - String packageName) { - return packageName == null - ? null - : new ChildProcessCreationParams(packageName, false /* isExternalService */, - LibraryProcessType.PROCESS_CHILD, false /* bindToCallerCheck */); - } - - private static boolean hasSandboxedConnectionAllocatorForPackage(final String packageName) { - return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(new Callable<Boolean>() { - @Override - public Boolean call() { - return ChildProcessLauncherHelper.hasSandboxedConnectionAllocatorForPackage( - packageName); - } - }); - } - - private static ChildProcessConnection retrieveConnection( - final ChildProcessLauncherHelper launcherHelper) { - CriteriaHelper.pollInstrumentationThread( - new Criteria("Failed waiting for child process to connect") { + new Criteria("Failed to wait for connection allocator.") { @Override public boolean isSatisfied() { - return ChildProcessLauncherTestUtils.getConnection(launcherHelper) != null; + return emptyState ? !connectionAllocator.anyConnectionAllocated() + : connectionAllocator.anyConnectionAllocated(); } }); - - return ChildProcessLauncherTestUtils.getConnection(launcherHelper); } - private static void stopProcess(ChildProcessLauncherHelper launcherHelper) { - final ChildProcessConnection connection = retrieveConnection(launcherHelper); - ChildProcessLauncherTestUtils.runOnLauncherThreadBlocking(new Runnable() { - @Override - public void run() { - ChildProcessLauncherHelper.stop(connection.getPid()); - } - }); + private static void waitForConnectionState( + final ChildProcessConnection connection, final int connectionState) { + assert connectionState == CONNECTION_BLOCK_UNTIL_CONNECTED + || connectionState == CONNECTION_BLOCK_UNTIL_SETUP; + CriteriaHelper.pollInstrumentationThread( + new Criteria("Failed wait for connection to connect.") { + @Override + public boolean isSatisfied() { + if (connectionState == CONNECTION_BLOCK_UNTIL_CONNECTED) { + return connection.isConnected(); + } + assert connectionState == CONNECTION_BLOCK_UNTIL_SETUP; + return getConnectionPid(connection) != 0; + } + }); } - private static int getPid(final ChildProcessLauncherHelper launcherHelper) { + private static void waitUntilLauncherSetup(final ChildProcessLauncher launcher) { + CriteriaHelper.pollInstrumentationThread( + new Criteria("Failed wait for launcher to connect.") { + @Override + public boolean isSatisfied() { + return launcher.getConnection() != null; + } + }); + waitForConnectionState(launcher.getConnection(), CONNECTION_BLOCK_UNTIL_SETUP); + } + + private static int getConnectionPid(final ChildProcessConnection connection) { return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(new Callable<Integer>() { @Override public Integer call() { - return launcherHelper.getPid(); + return connection.getPid(); } }); } - private static ChildProcessConnection getWarmUpConnection() { - return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult( - new Callable<ChildProcessConnection>() { - @Override - public ChildProcessConnection call() { - return ChildProcessLauncherHelper.getWarmUpConnectionForTesting(); - } - }); + private static void stopLauncher(final ChildProcessLauncher launcher) { + ChildProcessLauncherTestUtils.runOnLauncherThreadBlocking(new Runnable() { + @Override + public void run() { + launcher.stop(); + } + }); } }
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn index d29dd4f6..df45385 100644 --- a/content/public/browser/BUILD.gn +++ b/content/public/browser/BUILD.gn
@@ -87,6 +87,8 @@ "content_browser_client.h", "context_factory.h", "cookie_store_factory.h", + "desktop_capture.cc", + "desktop_capture.h", "desktop_media_id.cc", "desktop_media_id.h", "devtools_agent_host.h", @@ -326,6 +328,7 @@ "//ui/events", "//ui/gl", "//ui/surface", + "//third_party/webrtc/modules/desktop_capture", ] allow_circular_includes_from = [
diff --git a/content/public/browser/DEPS b/content/public/browser/DEPS index f6f0e3bb..b1bf25da 100644 --- a/content/public/browser/DEPS +++ b/content/public/browser/DEPS
@@ -13,4 +13,10 @@ # file will be moved elsewhere. See http://crbug.com/598073. "!content/browser/loader/resource_dispatcher_host_impl.h", ], + + "desktop_capture\.h": [ + # desktop_capture.h creates a DesktopCaptureOptions to share between + # content/browser and chrome/browser. + "+third_party/webrtc/modules/desktop_capture/desktop_capture_options.h", + ], }
diff --git a/content/public/browser/desktop_capture.cc b/content/public/browser/desktop_capture.cc new file mode 100644 index 0000000..139ea14a --- /dev/null +++ b/content/public/browser/desktop_capture.cc
@@ -0,0 +1,30 @@ +// Copyright 2017 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 "content/public/browser/desktop_capture.h" + +#include "base/feature_list.h" +#include "build/build_config.h" + +namespace content { + +webrtc::DesktopCaptureOptions CreateDesktopCaptureOptions() { + auto options = webrtc::DesktopCaptureOptions::CreateDefault(); + // Leave desktop effects enabled during WebRTC captures. + options.set_disable_effects(false); +#if defined(OS_WIN) + static constexpr base::Feature kDirectXCapturer{ + "DirectXCapturer", + base::FEATURE_ENABLED_BY_DEFAULT}; + if (base::FeatureList::IsEnabled(kDirectXCapturer)) { + options.set_allow_directx_capturer(true); + options.set_allow_use_magnification_api(false); + } else { + options.set_allow_use_magnification_api(true); + } +#endif // defined(OS_WIN) + return options; +} + +} // namespace content
diff --git a/content/public/browser/desktop_capture.h b/content/public/browser/desktop_capture.h new file mode 100644 index 0000000..1b44477 --- /dev/null +++ b/content/public/browser/desktop_capture.h
@@ -0,0 +1,18 @@ +// Copyright 2017 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 CONTENT_PUBLIC_BROWSER_DESKTOP_CAPTURE_H_ +#define CONTENT_PUBLIC_BROWSER_DESKTOP_CAPTURE_H_ + +#include "content/common/content_export.h" +#include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h" + +namespace content { + +// Creates a DesktopCaptureOptions with required settings. +CONTENT_EXPORT webrtc::DesktopCaptureOptions CreateDesktopCaptureOptions(); + +} // namespace content + +#endif // CONTENT_PUBLIC_BROWSER_DESKTOP_CAPTURE_H_
diff --git a/content/public/browser/provision_fetcher_impl.cc b/content/public/browser/provision_fetcher_impl.cc index 1663f3e..ddfcc14 100644 --- a/content/public/browser/provision_fetcher_impl.cc +++ b/content/public/browser/provision_fetcher_impl.cc
@@ -32,19 +32,19 @@ void ProvisionFetcherImpl::Retrieve(const std::string& default_url, const std::string& request_data, - const RetrieveCallback& callback) { + RetrieveCallback callback) { DVLOG(1) << __FUNCTION__ << ": " << default_url; provision_fetcher_->Retrieve( default_url, request_data, base::Bind(&ProvisionFetcherImpl::OnResponse, weak_factory_.GetWeakPtr(), - callback)); + base::Passed(&callback))); } -void ProvisionFetcherImpl::OnResponse(const RetrieveCallback& callback, +void ProvisionFetcherImpl::OnResponse(RetrieveCallback callback, bool success, const std::string& response) { DVLOG(1) << __FUNCTION__ << ": " << success; - callback.Run(success, response); + std::move(callback).Run(success, response); } } // namespace content
diff --git a/content/public/browser/provision_fetcher_impl.h b/content/public/browser/provision_fetcher_impl.h index b3d63023..a37d9ee 100644 --- a/content/public/browser/provision_fetcher_impl.h +++ b/content/public/browser/provision_fetcher_impl.h
@@ -40,11 +40,11 @@ // media::mojom::ProvisionFetcher implementation. void Retrieve(const std::string& default_url, const std::string& request_data, - const RetrieveCallback& callback) final; + RetrieveCallback callback) final; private: // Callback for media::ProvisionFetcher::Retrieve(). - void OnResponse(const RetrieveCallback& callback, + void OnResponse(RetrieveCallback callback, bool success, const std::string& response);
diff --git a/content/public/renderer/render_frame_observer.h b/content/public/renderer/render_frame_observer.h index 8bb72a3..48b932e 100644 --- a/content/public/renderer/render_frame_observer.h +++ b/content/public/renderer/render_frame_observer.h
@@ -24,6 +24,7 @@ class WebNode; class WebString; struct WebURLError; +class WebWorkerFetchContext; } namespace content { @@ -127,6 +128,9 @@ // Called when draggable regions change. virtual void DraggableRegionsChanged() {} + // Called when a worker fetch context will be created. + virtual void WillCreateWorkerFetchContext(blink::WebWorkerFetchContext*) {} + // IPC::Listener implementation. bool OnMessageReceived(const IPC::Message& message) override;
diff --git a/content/public/test/web_contents_tester.h b/content/public/test/web_contents_tester.h index 9918445..f3f802f 100644 --- a/content/public/test/web_contents_tester.h +++ b/content/public/test/web_contents_tester.h
@@ -151,6 +151,9 @@ int http_status_code, const std::vector<SkBitmap>& bitmaps, const std::vector<gfx::Size>& original_bitmap_sizes) = 0; + + // Sets the return value of GetLastCommittedUrl() of TestWebContents. + virtual void SetLastCommittedURL(const GURL& url) = 0; }; } // namespace content
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc index 301ea0e..a532eff 100644 --- a/content/renderer/browser_plugin/browser_plugin.cc +++ b/content/renderer/browser_plugin/browser_plugin.cc
@@ -589,7 +589,7 @@ std::vector<blink::WebCompositionUnderline> std_underlines; for (size_t i = 0; i < underlines.size(); ++i) { - std_underlines.push_back(std_underlines[i]); + std_underlines.push_back(underlines[i]); } gfx::Range replacement_range = replacementRange.IsNull()
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc index 46049eac..29447582 100644 --- a/content/renderer/gpu/render_widget_compositor.cc +++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -474,7 +474,7 @@ // and are disabled for Android WebView as it doesn't support the format. if (!cmd.HasSwitch(switches::kDisableRGBA4444Textures) && base::SysInfo::AmountOfPhysicalMemoryMB() <= 512) - settings.preferred_tile_format = cc::RGBA_4444; + settings.preferred_tile_format = viz::RGBA_4444; } else { // On other devices we have increased memory excessively to avoid // raster-on-demand already, so now we reserve 50% _only_ to avoid @@ -522,11 +522,11 @@ if (cmd.HasSwitch(switches::kEnableRGBA4444Textures) && !cmd.HasSwitch(switches::kDisableRGBA4444Textures)) { - settings.preferred_tile_format = cc::RGBA_4444; + settings.preferred_tile_format = viz::RGBA_4444; } if (cmd.HasSwitch(cc::switches::kEnableTileCompression)) { - settings.preferred_tile_format = cc::ETC1; + settings.preferred_tile_format = viz::ETC1; } settings.max_staging_buffer_usage_in_bytes = 32 * 1024 * 1024; // 32MB
diff --git a/content/renderer/media/audio_renderer_sink_cache_impl.cc b/content/renderer/media/audio_renderer_sink_cache_impl.cc index 7cbfe8b..157fd88460 100644 --- a/content/renderer/media/audio_renderer_sink_cache_impl.cc +++ b/content/renderer/media/audio_renderer_sink_cache_impl.cc
@@ -173,8 +173,9 @@ void AudioRendererSinkCacheImpl::DeleteLaterIfUnused( const media::AudioRendererSink* sink_ptr) { task_runner_->PostDelayedTask( - FROM_HERE, base::Bind(&AudioRendererSinkCacheImpl::DeleteSink, weak_this_, - sink_ptr, false /*do not delete if used*/), + FROM_HERE, + base::Bind(&AudioRendererSinkCacheImpl::DeleteSink, weak_this_, + base::RetainedRef(sink_ptr), false /*do not delete if used*/), delete_timeout_); }
diff --git a/content/renderer/media/gpu/rtc_video_encoder.cc b/content/renderer/media/gpu/rtc_video_encoder.cc index 2185d7e..dc153db4 100644 --- a/content/renderer/media/gpu/rtc_video_encoder.cc +++ b/content/renderer/media/gpu/rtc_video_encoder.cc
@@ -100,6 +100,16 @@ return true; } +void RecordInitEncodeUMA(int32_t init_retval, + media::VideoCodecProfile profile) { + UMA_HISTOGRAM_BOOLEAN("Media.RTCVideoEncoderInitEncodeSuccess", + init_retval == WEBRTC_VIDEO_CODEC_OK); + if (init_retval != WEBRTC_VIDEO_CODEC_OK) + return; + UMA_HISTOGRAM_ENUMERATION("Media.RTCVideoEncoderProfile", profile, + media::VIDEO_CODEC_PROFILE_MAX + 1); +} + } // namespace // This private class of RTCVideoEncoder does the actual work of communicating @@ -154,7 +164,7 @@ // Return the status of Impl. One of WEBRTC_VIDEO_CODEC_XXX value. int32_t GetStatus() const; - webrtc::VideoCodecType video_codec_type() { return video_codec_type_; } + webrtc::VideoCodecType video_codec_type() const { return video_codec_type_; } // media::VideoEncodeAccelerator::Client implementation. void RequireBitstreamBuffers(unsigned int input_count, @@ -309,7 +319,7 @@ media::VideoCodecProfile profile, base::WaitableEvent* async_waiter, int32_t* async_retval) { - DVLOG(3) << "Impl::CreateAndInitializeVEA()"; + DVLOG(3) << __func__; DCHECK(thread_checker_.CalledOnValidThread()); SetStatus(WEBRTC_VIDEO_CODEC_UNINITIALIZED); @@ -340,7 +350,7 @@ bool force_keyframe, base::WaitableEvent* async_waiter, int32_t* async_retval) { - DVLOG(3) << "Impl::Enqueue()"; + DVLOG(3) << __func__; DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(!input_next_frame_); @@ -383,8 +393,7 @@ void RTCVideoEncoder::Impl::UseOutputBitstreamBufferId( int32_t bitstream_buffer_id) { - DVLOG(3) << "Impl::UseOutputBitstreamBufferIndex(): " - "bitstream_buffer_id=" << bitstream_buffer_id; + DVLOG(3) << __func__ << " bitstream_buffer_id=" << bitstream_buffer_id; DCHECK(thread_checker_.CalledOnValidThread()); if (video_encoder_) { video_encoder_->UseOutputBitstreamBuffer(media::BitstreamBuffer( @@ -398,8 +407,7 @@ void RTCVideoEncoder::Impl::RequestEncodingParametersChange( uint32_t bitrate, uint32_t framerate) { - DVLOG(3) << "Impl::RequestEncodingParametersChange(): bitrate=" << bitrate - << ", framerate=" << framerate; + DVLOG(3) << __func__ << " bitrate=" << bitrate << ", framerate=" << framerate; DCHECK(thread_checker_.CalledOnValidThread()); // Check for overflow converting bitrate (kilobits/sec) to bits/sec. @@ -411,7 +419,7 @@ } void RTCVideoEncoder::Impl::Destroy(base::WaitableEvent* async_waiter) { - DVLOG(3) << "Impl::Destroy()"; + DVLOG(3) << __func__; DCHECK(thread_checker_.CalledOnValidThread()); RecordTimestampMatchUMA(); if (video_encoder_) { @@ -440,7 +448,7 @@ unsigned int input_count, const gfx::Size& input_coded_size, size_t output_buffer_size) { - DVLOG(3) << "Impl::RequireBitstreamBuffers(): input_count=" << input_count + DVLOG(3) << __func__ << " input_count=" << input_count << ", input_coded_size=" << input_coded_size.ToString() << ", output_buffer_size=" << output_buffer_size; DCHECK(thread_checker_.CalledOnValidThread()); @@ -489,9 +497,8 @@ size_t payload_size, bool key_frame, base::TimeDelta timestamp) { - DVLOG(3) << "Impl::BitstreamBufferReady(): bitstream_buffer_id=" - << bitstream_buffer_id << ", payload_size=" << payload_size - << ", key_frame=" << key_frame + DVLOG(3) << __func__ << " bitstream_buffer_id=" << bitstream_buffer_id + << ", payload_size=" << payload_size << ", key_frame=" << key_frame << ", timestamp ms=" << timestamp.InMilliseconds(); DCHECK(thread_checker_.CalledOnValidThread()); @@ -726,7 +733,7 @@ int32_t* async_retval, webrtc::EncodedImageCallback* callback) { DCHECK(thread_checker_.CalledOnValidThread()); - DVLOG(3) << "RegisterEncodeCompleteCallback()"; + DVLOG(3) << __func__; RegisterAsyncWaiter(async_waiter, async_retval); int32_t retval = GetStatus(); if (retval == WEBRTC_VIDEO_CODEC_OK) @@ -739,8 +746,7 @@ int32_t bitstream_buffer_id, uint16_t picture_id) { DCHECK(thread_checker_.CalledOnValidThread()); - DVLOG(3) << "ReturnEncodedImage(): " - << "bitstream_buffer_id=" << bitstream_buffer_id + DVLOG(3) << __func__ << " bitstream_buffer_id=" << bitstream_buffer_id << ", picture_id=" << picture_id; if (!encoded_image_callback_) @@ -797,11 +803,11 @@ : video_codec_type_(type), gpu_factories_(gpu_factories), gpu_task_runner_(gpu_factories->GetTaskRunner()) { - DVLOG(1) << "RTCVideoEncoder(): codec type=" << type; + DVLOG(1) << __func__ << " codec type=" << type; } RTCVideoEncoder::~RTCVideoEncoder() { - DVLOG(3) << "~RTCVideoEncoder"; + DVLOG(3) << __func__; Release(); DCHECK(!impl_.get()); } @@ -809,14 +815,12 @@ int32_t RTCVideoEncoder::InitEncode(const webrtc::VideoCodec* codec_settings, int32_t number_of_cores, size_t max_payload_size) { - DVLOG(1) << "InitEncode(): codecType=" << codec_settings->codecType + DVLOG(1) << __func__ << " codecType=" << codec_settings->codecType << ", width=" << codec_settings->width << ", height=" << codec_settings->height << ", startBitrate=" << codec_settings->startBitrate; - if (impl_) { - DVLOG(1) << "Release because of reinitialization"; + if (impl_) Release(); - } impl_ = new Impl(gpu_factories_, video_codec_type_); const media::VideoCodecProfile profile = WebRTCVideoCodecToVideoCodecProfile( @@ -846,7 +850,7 @@ const webrtc::VideoFrame& input_image, const webrtc::CodecSpecificInfo* codec_specific_info, const std::vector<webrtc::FrameType>* frame_types) { - DVLOG(3) << "Encode()"; + DVLOG(3) << __func__; if (!impl_.get()) { DVLOG(3) << "Encoder is not initialized"; return WEBRTC_VIDEO_CODEC_UNINITIALIZED; @@ -875,7 +879,7 @@ int32_t RTCVideoEncoder::RegisterEncodeCompleteCallback( webrtc::EncodedImageCallback* callback) { - DVLOG(3) << "RegisterEncodeCompleteCallback()"; + DVLOG(3) << __func__; if (!impl_.get()) { DVLOG(3) << "Encoder is not initialized"; return WEBRTC_VIDEO_CODEC_UNINITIALIZED; @@ -894,7 +898,7 @@ } int32_t RTCVideoEncoder::Release() { - DVLOG(3) << "Release()"; + DVLOG(3) << __func__; if (!impl_.get()) return WEBRTC_VIDEO_CODEC_OK; @@ -911,14 +915,13 @@ int32_t RTCVideoEncoder::SetChannelParameters(uint32_t packet_loss, int64_t rtt) { - DVLOG(3) << "SetChannelParameters(): packet_loss=" << packet_loss - << ", rtt=" << rtt; + DVLOG(3) << __func__ << " packet_loss=" << packet_loss << ", rtt=" << rtt; // Ignored. return WEBRTC_VIDEO_CODEC_OK; } int32_t RTCVideoEncoder::SetRates(uint32_t new_bit_rate, uint32_t frame_rate) { - DVLOG(3) << "SetRates(): new_bit_rate=" << new_bit_rate + DVLOG(3) << __func__ << " new_bit_rate=" << new_bit_rate << ", frame_rate=" << frame_rate; if (!impl_.get()) { DVLOG(3) << "Encoder is not initialized"; @@ -927,7 +930,7 @@ const int32_t retval = impl_->GetStatus(); if (retval != WEBRTC_VIDEO_CODEC_OK) { - DVLOG(3) << "SetRates(): returning " << retval; + DVLOG(3) << __func__ << " returning " << retval; return retval; } @@ -944,15 +947,4 @@ return true; } -void RTCVideoEncoder::RecordInitEncodeUMA( - int32_t init_retval, media::VideoCodecProfile profile) { - UMA_HISTOGRAM_BOOLEAN("Media.RTCVideoEncoderInitEncodeSuccess", - init_retval == WEBRTC_VIDEO_CODEC_OK); - if (init_retval == WEBRTC_VIDEO_CODEC_OK) { - UMA_HISTOGRAM_ENUMERATION("Media.RTCVideoEncoderProfile", - profile, - media::VIDEO_CODEC_PROFILE_MAX + 1); - } -} - } // namespace content
diff --git a/content/renderer/media/gpu/rtc_video_encoder.h b/content/renderer/media/gpu/rtc_video_encoder.h index bef4f21c..390dc7b 100644 --- a/content/renderer/media/gpu/rtc_video_encoder.h +++ b/content/renderer/media/gpu/rtc_video_encoder.h
@@ -65,9 +65,6 @@ class Impl; friend class RTCVideoEncoder::Impl; - void RecordInitEncodeUMA(int32_t init_retval, - media::VideoCodecProfile profile); - // The video codec type, as reported to WebRTC. const webrtc::VideoCodecType video_codec_type_;
diff --git a/content/renderer/media/mojo_audio_output_ipc_unittest.cc b/content/renderer/media/mojo_audio_output_ipc_unittest.cc index a88c8da..bfb02beb 100644 --- a/content/renderer/media/mojo_audio_output_ipc_unittest.cc +++ b/content/renderer/media/mojo_audio_output_ipc_unittest.cc
@@ -139,7 +139,7 @@ void Acquire(media::mojom::AudioOutputStreamRequest stream_request, const media::AudioParameters& params, - const AcquireCallback& callback) override { + AcquireCallback callback) override { EXPECT_EQ(binding_, base::nullopt); EXPECT_NE(stream_, nullptr); binding_.emplace(stream_, std::move(stream_request));
diff --git a/content/renderer/mojo/blink_interface_provider_impl.cc b/content/renderer/mojo/blink_interface_provider_impl.cc index 251de34..95cb7bf 100644 --- a/content/renderer/mojo/blink_interface_provider_impl.cc +++ b/content/renderer/mojo/blink_interface_provider_impl.cc
@@ -23,14 +23,6 @@ weak_ptr_ = weak_ptr_factory_.GetWeakPtr(); } -BlinkInterfaceProviderImpl::BlinkInterfaceProviderImpl( - base::WeakPtr<service_manager::InterfaceProvider> remote_interfaces) - : remote_interfaces_(remote_interfaces), - main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()), - weak_ptr_factory_(this) { - weak_ptr_ = weak_ptr_factory_.GetWeakPtr(); -} - BlinkInterfaceProviderImpl::~BlinkInterfaceProviderImpl() = default; void BlinkInterfaceProviderImpl::GetInterface( @@ -49,14 +41,10 @@ return; } - if (connector_) { - connector_->BindInterface( - service_manager::Identity(mojom::kBrowserServiceName, - service_manager::mojom::kInheritUserID), - name, std::move(handle)); - } else { - remote_interfaces_->GetInterface(name, std::move(handle)); - } + connector_->BindInterface( + service_manager::Identity(mojom::kBrowserServiceName, + service_manager::mojom::kInheritUserID), + name, std::move(handle)); } } // namespace content
diff --git a/content/renderer/mojo/blink_interface_provider_impl.h b/content/renderer/mojo/blink_interface_provider_impl.h index c14509504..a7c320da 100644 --- a/content/renderer/mojo/blink_interface_provider_impl.h +++ b/content/renderer/mojo/blink_interface_provider_impl.h
@@ -17,7 +17,6 @@ namespace service_manager { class Connector; -class InterfaceProvider; } namespace content { @@ -28,8 +27,6 @@ public: explicit BlinkInterfaceProviderImpl( base::WeakPtr<service_manager::Connector> connector); - explicit BlinkInterfaceProviderImpl( - base::WeakPtr<service_manager::InterfaceProvider> remote_interfaces); ~BlinkInterfaceProviderImpl(); // blink::InterfaceProvider override. @@ -41,7 +38,6 @@ mojo::ScopedMessagePipeHandle handle); const base::WeakPtr<service_manager::Connector> connector_; - const base::WeakPtr<service_manager::InterfaceProvider> remote_interfaces_; scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 9255fbd..d0dc5c7c 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -994,7 +994,6 @@ render_frame->InitializeBlameContext(nullptr); WebLocalFrame* web_frame = WebLocalFrame::CreateMainFrame( render_view->webview(), render_frame, - render_frame->blink_interface_provider_.get(), render_frame->blink_interface_registry_.get(), opener, // This conversion is a little sad, as this often comes from a // WebString... @@ -1045,7 +1044,6 @@ web_frame = parent_web_frame->CreateLocalChild( replicated_state.scope, WebString::FromUTF8(replicated_state.name), replicated_state.sandbox_flags, render_frame, - render_frame->blink_interface_provider_.get(), render_frame->blink_interface_registry_.get(), previous_sibling_web_frame, FeaturePolicyHeaderToWeb(replicated_state.container_policy), @@ -1071,9 +1069,8 @@ render_frame->proxy_routing_id_ = proxy_routing_id; proxy->set_provisional_frame_routing_id(routing_id); web_frame = blink::WebLocalFrame::CreateProvisional( - render_frame, render_frame->blink_interface_provider_.get(), - render_frame->blink_interface_registry_.get(), proxy->web_frame(), - replicated_state.sandbox_flags, + render_frame, render_frame->blink_interface_registry_.get(), + proxy->web_frame(), replicated_state.sandbox_flags, FeaturePolicyHeaderToWeb(replicated_state.container_policy)); } CHECK(parent_routing_id != MSG_ROUTING_NONE || !web_frame->Parent()); @@ -1209,8 +1206,6 @@ pending_remote_interface_provider_request_ = MakeRequest(&remote_interfaces); remote_interfaces_.reset(new service_manager::InterfaceProvider); remote_interfaces_->Bind(std::move(remote_interfaces)); - blink_interface_provider_.reset(new BlinkInterfaceProviderImpl( - remote_interfaces_->GetWeakPtr())); blink_interface_registry_.reset( new BlinkInterfaceRegistryImpl(interface_registry_->GetWeakPtr())); @@ -2965,6 +2960,8 @@ worker_fetch_context->set_is_controlled_by_service_worker( provider->IsControlledByServiceWorker()); } + for (auto& observer : observers_) + observer.WillCreateWorkerFetchContext(worker_fetch_context.get()); return std::move(worker_fetch_context); } @@ -3109,7 +3106,6 @@ child_render_frame->InitializeBlameContext(this); blink::WebLocalFrame* web_frame = parent->CreateLocalChild( scope, child_render_frame, - child_render_frame->blink_interface_provider_.get(), child_render_frame->blink_interface_registry_.get()); child_render_frame->in_frame_tree_ = true;
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 6db17694..351489a5 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -48,7 +48,6 @@ #include "content/public/renderer/render_frame.h" #include "content/renderer/frame_blame_context.h" #include "content/renderer/media/media_factory.h" -#include "content/renderer/mojo/blink_interface_provider_impl.h" #include "content/renderer/renderer_webcookiejar_impl.h" #include "ipc/ipc_message.h" #include "ipc/ipc_platform_file.h" @@ -1276,7 +1275,6 @@ std::unique_ptr<service_manager::BinderRegistry> interface_registry_; std::unique_ptr<service_manager::InterfaceProvider> remote_interfaces_; - std::unique_ptr<BlinkInterfaceProviderImpl> blink_interface_provider_; std::unique_ptr<BlinkInterfaceRegistryImpl> blink_interface_registry_; service_manager::mojom::InterfaceProviderRequest pending_remote_interface_provider_request_;
diff --git a/content/renderer/renderer_main_platform_delegate_mac.mm b/content/renderer/renderer_main_platform_delegate_mac.mm index c890040b..c4d1da8d 100644 --- a/content/renderer/renderer_main_platform_delegate_mac.mm +++ b/content/renderer/renderer_main_platform_delegate_mac.mm
@@ -9,6 +9,7 @@ #include <objc/runtime.h> #include <stdint.h> +#include "base/bind.h" #include "base/command_line.h" #include "base/logging.h" #include "base/mac/mac_util.h" @@ -18,11 +19,34 @@ #include "content/common/sandbox_init_mac.h" #include "content/common/sandbox_mac.h" #include "content/public/common/content_switches.h" +#include "sandbox/mac/seatbelt.h" + +extern "C" { +void CGSSetDenyWindowServerConnections(bool); +void CGSShutdownServerConnections(); +OSStatus SetApplicationIsDaemon(Boolean isDaemon); +}; namespace content { namespace { +// This disconnects from the window server, and then indicates that Chrome +// should continue execution without access to launchservicesd. +void DisconnectWindowServer() { + // Now disconnect from WindowServer, after all objects have been warmed up. + // Shutting down the connection requires connecting to WindowServer, + // so do this before actually engaging the sandbox. This may cause two log + // messages to be printed to the system logger on certain OS versions. + CGSSetDenyWindowServerConnections(true); + CGSShutdownServerConnections(); + // Allow the process to continue without a LaunchServices ASN. The + // INIT_Process function in HIServices will abort if it cannot connect to + // launchservicesd to get an ASN. By setting this flag, HIServices skips + // that. + SetApplicationIsDaemon(true); +} + // You are about to read a pretty disgusting hack. In a static initializer, // CoreFoundation decides to connect with cfprefsd(8) using Mach IPC. There is // no public way to close this Mach port after-the-fact, nor a way to stop it @@ -128,8 +152,15 @@ } bool RendererMainPlatformDelegate::EnableSandbox() { - // Enable the sandbox. - bool sandbox_initialized = InitializeSandbox(); + bool sandbox_initialized = sandbox::Seatbelt::IsSandboxed(); + + // If the sandbox is already engaged, just disconnect from the window server. + if (sandbox_initialized) { + DisconnectWindowServer(); + } else { + sandbox_initialized = InitializeSandboxWithPostWarmupHook( + base::BindOnce(&DisconnectWindowServer)); + } // The sandbox is now engaged. Make sure that the renderer has not connected // itself to Cocoa.
diff --git a/content/renderer/renderer_v2.sb b/content/renderer/renderer_v2.sb index 341bbf3..4e10b34 100644 --- a/content/renderer/renderer_v2.sb +++ b/content/renderer/renderer_v2.sb
@@ -119,6 +119,7 @@ (global-name "com.apple.distributed_notifications@Uv3") (global-name "com.apple.fonts") (global-name "com.apple.logd") + (global-name "com.apple.lsd.mapdb") (global-name "com.apple.system.logger") (global-name "com.apple.system.notification_center") (global-name "com.apple.system.opendirectoryd.libinfo")
diff --git a/content/renderer/scheduler/resource_dispatch_throttler_unittest.cc b/content/renderer/scheduler/resource_dispatch_throttler_unittest.cc index 6a85000..e5a0d661 100644 --- a/content/renderer/scheduler/resource_dispatch_throttler_unittest.cc +++ b/content/renderer/scheduler/resource_dispatch_throttler_unittest.cc
@@ -14,6 +14,7 @@ #include "base/memory/ptr_util.h" #include "content/common/resource_messages.h" #include "content/public/common/resource_request.h" +#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/WebKit/public/platform/scheduler/test/fake_renderer_scheduler.h" @@ -135,7 +136,8 @@ ResourceRequest request; request.download_to_file = true; return throttler_->Send(new ResourceHostMsg_RequestResource( - kRoutingId, ++last_request_id_, request)); + kRoutingId, ++last_request_id_, request, + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS))); } bool RequestResourceSync() {
diff --git a/content/renderer/service_worker/worker_fetch_context_impl.cc b/content/renderer/service_worker/worker_fetch_context_impl.cc index 96721068..c608bf78 100644 --- a/content/renderer/service_worker/worker_fetch_context_impl.cc +++ b/content/renderer/service_worker/worker_fetch_context_impl.cc
@@ -91,6 +91,19 @@ url)); } +void WorkerFetchContextImpl::SetSubresourceFilterBuilder( + std::unique_ptr<blink::WebDocumentSubresourceFilter::Builder> + subresource_filter_builder) { + subresource_filter_builder_ = std::move(subresource_filter_builder); +} + +std::unique_ptr<blink::WebDocumentSubresourceFilter> +WorkerFetchContextImpl::TakeSubresourceFilter() { + if (!subresource_filter_builder_) + return nullptr; + return std::move(subresource_filter_builder_)->Build(); +} + void WorkerFetchContextImpl::set_service_worker_provider_id(int id) { service_worker_provider_id_ = id; }
diff --git a/content/renderer/service_worker/worker_fetch_context_impl.h b/content/renderer/service_worker/worker_fetch_context_impl.h index f89ce10b..200f2fe 100644 --- a/content/renderer/service_worker/worker_fetch_context_impl.h +++ b/content/renderer/service_worker/worker_fetch_context_impl.h
@@ -54,6 +54,10 @@ const blink::WebURL& url) override; void SetApplicationCacheHostID(int id) override; int ApplicationCacheHostID() const override; + void SetSubresourceFilterBuilder( + std::unique_ptr<blink::WebDocumentSubresourceFilter::Builder>) override; + std::unique_ptr<blink::WebDocumentSubresourceFilter> TakeSubresourceFilter() + override; // mojom::ServiceWorkerWorkerClient implementation: void SetControllerServiceWorker(int64_t controller_version_id) override; @@ -88,6 +92,8 @@ int controller_version_id_ = kInvalidServiceWorkerVersionId; scoped_refptr<ThreadSafeSender> thread_safe_sender_; + std::unique_ptr<blink::WebDocumentSubresourceFilter::Builder> + subresource_filter_builder_; bool is_data_saver_enabled_ = false; int parent_frame_id_ = MSG_ROUTING_NONE; GURL first_party_for_cookies_;
diff --git a/content/shell/android/BUILD.gn b/content/shell/android/BUILD.gn index b6fd7b6..96af4c2 100644 --- a/content/shell/android/BUILD.gn +++ b/content/shell/android/BUILD.gn
@@ -99,6 +99,9 @@ android_library("content_shell_apk_java") { testonly = true + + srcjar_deps = [ ":content_javatests_aidl" ] + deps = [ ":content_shell_apk_resources", ":content_shell_java", @@ -107,6 +110,7 @@ "//content/public/android:content_java", "//media/capture/video/android:capture_java", "//net/android:net_java", + "//third_party/jsr-305:jsr_305_javalib", "//ui/android:ui_java", ] @@ -118,6 +122,16 @@ "shell_apk/src/org/chromium/content_shell_apk/ChildProcessLauncherTestUtils.java", "shell_apk/src/org/chromium/content_shell_apk/ContentShellActivity.java", "shell_apk/src/org/chromium/content_shell_apk/ContentShellApplication.java", + "shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService.java", + "shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService0.java", + "shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService1.java", + ] +} + +android_aidl("content_javatests_aidl") { + import_include = [ "shell_apk/src" ] + sources = [ + "shell_apk/src/org/chromium/content_shell_apk/IChildProcessTest.aidl", ] }
diff --git a/content/shell/android/shell_apk/AndroidManifest.xml.jinja2 b/content/shell/android/shell_apk/AndroidManifest.xml.jinja2 index ea6845e..9862508b 100644 --- a/content/shell/android/shell_apk/AndroidManifest.xml.jinja2 +++ b/content/shell/android/shell_apk/AndroidManifest.xml.jinja2
@@ -67,5 +67,20 @@ <service android:name="org.chromium.content_shell_apk.ChildProcessLauncherTestHelperService" android:process=":ChildProcessLauncherHelper" /> + + <!-- The following entries are for ChildProcessLauncherTest. They should eventually be moved + to base. --> + {% set num_test_services = 2 %} + <meta-data android:name="org.chromium.content.browser.NUM_TEST_SERVICES" + android:value="{{ num_test_services }}"/> + <meta-data android:name="org.chromium.content.browser.TEST_SERVICES_NAME" + android:value="org.chromium.content_shell_apk.TestChildProcessService"/> + {% for i in range(num_test_services) %} + <service android:name="org.chromium.content_shell_apk.TestChildProcessService{{ i }}" + android:process=":test_child_service_process{{ i }}" + android:isolatedProcess="true" + android:exported="false" /> + {% endfor %} + </application> </manifest>
diff --git a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/IChildProcessTest.aidl b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/IChildProcessTest.aidl new file mode 100644 index 0000000..b413d556 --- /dev/null +++ b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/IChildProcessTest.aidl
@@ -0,0 +1,25 @@ +// Copyright 2017 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. + +package org.chromium.content_shell_apk; + +import android.os.Bundle; + +/** + * Interface provided to the TestChildProcessService. Used to echo back the calls made on the + * ChildProcessServiceDelegate to the test process. + */ +interface IChildProcessTest { + // Called by the service when onConnectionSetup is received. Echos back the parameters received + // so far. + oneway void onConnectionSetup(boolean serviceCreatedCalled, in Bundle serviceBundle, in Bundle connectionBundle); + + oneway void onLoadNativeLibrary(boolean loadedSuccessfully); + + oneway void onBeforeMain(in String[] commandLine); + + oneway void onRunMain(); + + oneway void onDestroy(); +}
diff --git a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/OWNERS b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/OWNERS new file mode 100644 index 0000000..8f094e0 --- /dev/null +++ b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/OWNERS
@@ -0,0 +1,2 @@ +per-file *.aidl=set noparent +per-file *.aidl=file://ipc/SECURITY_OWNERS
diff --git a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService.java b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService.java new file mode 100644 index 0000000..6cc7189 --- /dev/null +++ b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService.java
@@ -0,0 +1,153 @@ +// Copyright 2017 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. + +package org.chromium.content_shell_apk; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.IBinder; +import android.os.Looper; +import android.os.RemoteException; +import android.util.SparseArray; + +import org.chromium.base.CommandLine; +import org.chromium.base.Log; +import org.chromium.base.library_loader.LibraryLoader; +import org.chromium.base.library_loader.LibraryProcessType; +import org.chromium.base.library_loader.ProcessInitException; +import org.chromium.base.process_launcher.ChildProcessService; +import org.chromium.base.process_launcher.ChildProcessServiceDelegate; + +import javax.annotation.concurrent.GuardedBy; + +/** + * Child service started by ChildProcessLauncherTest. + */ +public class TestChildProcessService extends ChildProcessService { + private static final String TAG = "TestProcessService"; + + private static final long MAIN_BLOCKING_DURATION_MS = 5000; + + private static class TestChildProcessServiceDelegate implements ChildProcessServiceDelegate { + private final Object mConnectionSetupLock = new Object(); + @GuardedBy("mConnectionSetupLock") + private boolean mConnectionSetup; + + private boolean mServiceCreated; + private Bundle mServiceBundle; + private String[] mCommandLine; + private IChildProcessTest mIChildProcessTest; + + @Override + public void onServiceCreated() { + mServiceCreated = true; + } + + @Override + public void onServiceBound(Intent intent) { + mServiceBundle = intent.getExtras(); + } + + @Override + public void onConnectionSetup(Bundle connectionBundle, IBinder callback) { + if (callback != null) { + mIChildProcessTest = IChildProcessTest.Stub.asInterface(callback); + } + if (mIChildProcessTest != null) { + try { + mIChildProcessTest.onConnectionSetup( + mServiceCreated, mServiceBundle, connectionBundle); + } catch (RemoteException re) { + Log.e(TAG, "Failed to call IChildProcessTest.onConnectionSetup.", re); + } + } + synchronized (mConnectionSetupLock) { + mConnectionSetup = true; + mConnectionSetupLock.notifyAll(); + } + } + + @Override + public void onDestroy() { + if (mIChildProcessTest == null) return; + try { + mIChildProcessTest.onDestroy(); + } catch (RemoteException re) { + Log.e(TAG, "Failed to call IChildProcessTest.onDestroy.", re); + } + } + + @Override + public boolean loadNativeLibrary(Context hostContext) { + // Store the command line before loading the library to avoid an assert in CommandLine. + mCommandLine = CommandLine.getJavaSwitchesOrNull(); + + LibraryLoader libraryLoader = null; + boolean isLoaded = false; + try { + libraryLoader = LibraryLoader.get(LibraryProcessType.PROCESS_CHILD); + libraryLoader.loadNow(); + libraryLoader.ensureInitialized(); + isLoaded = true; + } catch (ProcessInitException e) { + Log.e(TAG, "Failed to load native library.", e); + } + + // Loading the library happen on the main thread and onConnectionSetup is called from + // the client. Wait for onConnectionSetup so mIChildProcessTest is set. + synchronized (mConnectionSetupLock) { + while (!mConnectionSetup) { + try { + mConnectionSetupLock.wait(); + } catch (InterruptedException e) { + // Ignore. + } + } + } + + if (mIChildProcessTest != null) { + try { + mIChildProcessTest.onLoadNativeLibrary(isLoaded); + } catch (RemoteException re) { + Log.e(TAG, "Failed to call IChildProcessTest.onLoadNativeLibrary.", re); + } + } + return true; + } + + @Override + public SparseArray<String> getFileDescriptorsIdsToKeys() { + return null; + } + + @Override + public void onBeforeMain() { + if (mIChildProcessTest == null) return; + try { + mIChildProcessTest.onBeforeMain(mCommandLine); + } catch (RemoteException re) { + Log.e(TAG, "Failed to call IChildProcessTest.onBeforeMain.", re); + } + } + + @Override + public void runMain() { + if (mIChildProcessTest != null) { + try { + mIChildProcessTest.onRunMain(); + } catch (RemoteException re) { + Log.e(TAG, "Failed to call IChildProcessTest.onRunMain.", re); + } + } + // Run a message loop to keep the service from exiting. + Looper.prepare(); + Looper.loop(); + } + }; + + public TestChildProcessService() { + super(new TestChildProcessServiceDelegate()); + } +}
diff --git a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService0.java b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService0.java new file mode 100644 index 0000000..90fb3336 --- /dev/null +++ b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService0.java
@@ -0,0 +1,8 @@ +// Copyright 2017 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. + +package org.chromium.content_shell_apk; + +/** One of the TestChildProcessService defined in the AndroidManifest.xml. */ +public class TestChildProcessService0 extends TestChildProcessService {}
diff --git a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService1.java b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService1.java new file mode 100644 index 0000000..e7429bac --- /dev/null +++ b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService1.java
@@ -0,0 +1,8 @@ +// Copyright 2017 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. + +package org.chromium.content_shell_apk; + +/** One of the TestChildProcessService defined in the AndroidManifest.xml. */ +public class TestChildProcessService1 extends TestChildProcessService {}
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index c3234aac..f55394f 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1504,6 +1504,7 @@ "//cc/surfaces", "//components/leveldb/public/cpp", "//components/metrics/proto", + "//components/offline_pages/features:features", "//components/rappor:test_support", "//components/ukm:test_support", "//components/viz/common",
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc index 7369046..f495cd8 100644 --- a/content/test/test_web_contents.cc +++ b/content/test/test_web_contents.cc
@@ -100,6 +100,13 @@ return g_next_image_download_id; } +const GURL& TestWebContents::GetLastCommittedURL() const { + if (last_committed_url_.is_valid()) { + return last_committed_url_; + } + return WebContentsImpl::GetLastCommittedURL(); +} + void TestWebContents::TestDidNavigate(RenderFrameHost* render_frame_host, int nav_entry_id, bool did_create_new_entry, @@ -208,6 +215,10 @@ return true; } +void TestWebContents::SetLastCommittedURL(const GURL& url) { + last_committed_url_ = url; +} + bool TestWebContents::CrossProcessNavigationPending() { if (IsBrowserSideNavigationEnabled()) { return GetRenderManager()->speculative_render_frame_host_ != nullptr;
diff --git a/content/test/test_web_contents.h b/content/test/test_web_contents.h index f075d52a..c8ca044 100644 --- a/content/test/test_web_contents.h +++ b/content/test/test_web_contents.h
@@ -55,6 +55,7 @@ uint32_t max_bitmap_size, bool bypass_cache, const ImageDownloadCallback& callback) override; + const GURL& GetLastCommittedURL() const override; // WebContentsTester implementation. void CommitPendingNavigation() override; @@ -90,6 +91,7 @@ int http_status_code, const std::vector<SkBitmap>& bitmaps, const std::vector<gfx::Size>& original_bitmap_sizes) override; + void SetLastCommittedURL(const GURL& url) override; // True if a cross-site navigation is pending. bool CrossProcessNavigationPending(); @@ -187,6 +189,7 @@ // Map keyed by image URL. Values are <id, callback> pairs. std::map<GURL, std::list<std::pair<int, ImageDownloadCallback>>> pending_image_downloads_; + GURL last_committed_url_; }; } // namespace content
diff --git a/docs/fuchsia_build_instructions.md b/docs/fuchsia_build_instructions.md index 16197d4..1d9eb5a3 100644 --- a/docs/fuchsia_build_instructions.md +++ b/docs/fuchsia_build_instructions.md
@@ -90,7 +90,7 @@ configurations. To create a build directory, run: ```shell -$ gn gen out/fuch --args="is_debug=false dcheck_always_on=true is_component_build=false target_os=\"fuchsia\"" +$ gn gen out/fuchsia --args="is_debug=false dcheck_always_on=true is_component_build=false target_os=\"fuchsia\"" ``` `use_goma=true` is fine to use also if you're a Googler. @@ -101,7 +101,7 @@ example: ```shell -$ ninja -C out/fuch base_unittests +$ ninja -C out/fuchsia base_unittests ``` ## Run @@ -122,6 +122,6 @@ A useful alias (for "Build And Run Filtered") is: ```shell -alias barf='ninja -C out/fuch base_unittests -j1000 && out/fuch/bin/run_base_unittests --test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.base_unittests.filter' +alias barf='ninja -C out/fuchsia base_unittests -j1000 && out/fuch/bin/run_base_unittests --test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.base_unittests.filter' ``` to build and run only the tests that are not excluded/known-failing on the bot.
diff --git a/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.cc b/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.cc index 45933bc4..69fb27f 100644 --- a/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.cc +++ b/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.cc
@@ -354,39 +354,6 @@ namespace api { -BluetoothLowEnergyExtensionFunctionDeprecated:: - BluetoothLowEnergyExtensionFunctionDeprecated() {} - -BluetoothLowEnergyExtensionFunctionDeprecated:: - ~BluetoothLowEnergyExtensionFunctionDeprecated() {} - -bool BluetoothLowEnergyExtensionFunctionDeprecated::RunAsync() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - if (!BluetoothManifestData::CheckLowEnergyPermitted(extension())) { - error_ = kErrorPermissionDenied; - return false; - } - - BluetoothLowEnergyEventRouter* event_router = - GetEventRouter(browser_context()); - if (!event_router->IsBluetoothSupported()) { - SetError(kErrorPlatformNotSupported); - return false; - } - - // It is safe to pass |this| here as ExtensionFunction is refcounted. - if (!event_router->InitializeAdapterAndInvokeCallback(base::Bind( - &DoWorkCallback<bool>, - base::Bind(&BluetoothLowEnergyExtensionFunctionDeprecated::DoWork, - this)))) { - SetError(kErrorAdapterNotInitialized); - return false; - } - - return true; -} - BluetoothLowEnergyExtensionFunction::BluetoothLowEnergyExtensionFunction() : event_router_(nullptr) {} @@ -395,6 +362,8 @@ ExtensionFunction::ResponseAction BluetoothLowEnergyExtensionFunction::Run() { DCHECK_CURRENTLY_ON(BrowserThread::UI); + EXTENSION_FUNCTION_VALIDATE(ParseParams()); + if (!BluetoothManifestData::CheckLowEnergyPermitted(extension())) return RespondNow(Error(kErrorPermissionDenied)); @@ -414,6 +383,8 @@ } void BluetoothLowEnergyExtensionFunction::PreDoWork() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router_->HasAdapter()) { @@ -423,15 +394,11 @@ DoWork(); } -template <typename Params> -BLEPeripheralExtensionFunction<Params>::BLEPeripheralExtensionFunction() {} +BLEPeripheralExtensionFunction::BLEPeripheralExtensionFunction() {} -template <typename Params> -BLEPeripheralExtensionFunction<Params>::~BLEPeripheralExtensionFunction() {} +BLEPeripheralExtensionFunction::~BLEPeripheralExtensionFunction() {} -template <typename Params> -ExtensionFunction::ResponseAction -BLEPeripheralExtensionFunction<Params>::Run() { +ExtensionFunction::ResponseAction BLEPeripheralExtensionFunction::Run() { DCHECK_CURRENTLY_ON(BrowserThread::UI); // Check permissions in manifest. @@ -443,219 +410,212 @@ return RespondNow(Error(kErrorPermissionDenied)); } -// Causes link error on Windows. API will never be on Windows, so #ifdefing. -#if !defined(OS_WIN) - params_ = Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get() != NULL); -#endif - return BluetoothLowEnergyExtensionFunction::Run(); } -bool BluetoothLowEnergyConnectFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyConnectFunction::BluetoothLowEnergyConnectFunction() {} +BluetoothLowEnergyConnectFunction::~BluetoothLowEnergyConnectFunction() {} + +bool BluetoothLowEnergyConnectFunction::ParseParams() { + params_ = apibtle::Connect::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyConnectFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::Connect::Params> params( - apibtle::Connect::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - bool persistent = false; // Not persistent by default. - apibtle::ConnectProperties* properties = params->properties.get(); + apibtle::ConnectProperties* properties = params_->properties.get(); if (properties) persistent = properties->persistent; event_router->Connect( - persistent, extension(), params->device_address, + persistent, extension(), params_->device_address, base::Bind(&BluetoothLowEnergyConnectFunction::SuccessCallback, this), base::Bind(&BluetoothLowEnergyConnectFunction::ErrorCallback, this)); - - return true; } void BluetoothLowEnergyConnectFunction::SuccessCallback() { - SendResponse(true); + Respond(NoArguments()); } void BluetoothLowEnergyConnectFunction::ErrorCallback( BluetoothLowEnergyEventRouter::Status status) { - SetError(StatusToString(status)); - SendResponse(false); + Respond(Error(StatusToString(status))); } -bool BluetoothLowEnergyDisconnectFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyDisconnectFunction::BluetoothLowEnergyDisconnectFunction() {} +BluetoothLowEnergyDisconnectFunction::~BluetoothLowEnergyDisconnectFunction() {} + +bool BluetoothLowEnergyDisconnectFunction::ParseParams() { + params_ = apibtle::Disconnect::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyDisconnectFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::Disconnect::Params> params( - apibtle::Disconnect::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - event_router->Disconnect( - extension(), params->device_address, + extension(), params_->device_address, base::Bind(&BluetoothLowEnergyDisconnectFunction::SuccessCallback, this), base::Bind(&BluetoothLowEnergyDisconnectFunction::ErrorCallback, this)); - - return true; } void BluetoothLowEnergyDisconnectFunction::SuccessCallback() { - SendResponse(true); + Respond(NoArguments()); } void BluetoothLowEnergyDisconnectFunction::ErrorCallback( BluetoothLowEnergyEventRouter::Status status) { - SetError(StatusToString(status)); - SendResponse(false); + Respond(Error(StatusToString(status))); } -bool BluetoothLowEnergyGetServiceFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyGetServiceFunction::BluetoothLowEnergyGetServiceFunction() {} +BluetoothLowEnergyGetServiceFunction::~BluetoothLowEnergyGetServiceFunction() {} + +bool BluetoothLowEnergyGetServiceFunction::ParseParams() { + params_ = apibtle::GetService::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyGetServiceFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::GetService::Params> params( - apibtle::GetService::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - apibtle::Service service; BluetoothLowEnergyEventRouter::Status status = - event_router->GetService(params->service_id, &service); + event_router->GetService(params_->service_id, &service); if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) { - SetError(StatusToString(status)); - SendResponse(false); - return false; + Respond(Error(StatusToString(status))); + return; } - results_ = apibtle::GetService::Results::Create(service); - SendResponse(true); - - return true; + Respond(ArgumentList(apibtle::GetService::Results::Create(service))); } -bool BluetoothLowEnergyGetServicesFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyGetServicesFunction::BluetoothLowEnergyGetServicesFunction() { +} +BluetoothLowEnergyGetServicesFunction:: + ~BluetoothLowEnergyGetServicesFunction() {} + +bool BluetoothLowEnergyGetServicesFunction::ParseParams() { + params_ = apibtle::GetServices::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyGetServicesFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::GetServices::Params> params( - apibtle::GetServices::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - BluetoothLowEnergyEventRouter::ServiceList service_list; - if (!event_router->GetServices(params->device_address, &service_list)) { - SetError(kErrorNotFound); - SendResponse(false); - return false; + if (!event_router->GetServices(params_->device_address, &service_list)) { + Respond(Error(kErrorNotFound)); + return; } - results_ = apibtle::GetServices::Results::Create(service_list); - SendResponse(true); - - return true; + Respond(ArgumentList(apibtle::GetServices::Results::Create(service_list))); } -bool BluetoothLowEnergyGetCharacteristicFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyGetCharacteristicFunction:: + BluetoothLowEnergyGetCharacteristicFunction() {} +BluetoothLowEnergyGetCharacteristicFunction:: + ~BluetoothLowEnergyGetCharacteristicFunction() {} + +bool BluetoothLowEnergyGetCharacteristicFunction::ParseParams() { + params_ = apibtle::GetCharacteristic::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyGetCharacteristicFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::GetCharacteristic::Params> params( - apibtle::GetCharacteristic::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - apibtle::Characteristic characteristic; BluetoothLowEnergyEventRouter::Status status = - event_router->GetCharacteristic(extension(), params->characteristic_id, + event_router->GetCharacteristic(extension(), params_->characteristic_id, &characteristic); if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) { - SetError(StatusToString(status)); - SendResponse(false); - return false; + Respond(Error(StatusToString(status))); + return; } // Manually construct the result instead of using // apibtle::GetCharacteristic::Result::Create as it doesn't convert lists of // enums correctly. - SetResult(apibtle::CharacteristicToValue(&characteristic)); - SendResponse(true); - - return true; + Respond(OneArgument(apibtle::CharacteristicToValue(&characteristic))); } -bool BluetoothLowEnergyGetCharacteristicsFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyGetCharacteristicsFunction:: + BluetoothLowEnergyGetCharacteristicsFunction() {} +BluetoothLowEnergyGetCharacteristicsFunction:: + ~BluetoothLowEnergyGetCharacteristicsFunction() {} + +bool BluetoothLowEnergyGetCharacteristicsFunction::ParseParams() { + params_ = apibtle::GetCharacteristics::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyGetCharacteristicsFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::GetCharacteristics::Params> params( - apibtle::GetCharacteristics::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - BluetoothLowEnergyEventRouter::CharacteristicList characteristic_list; BluetoothLowEnergyEventRouter::Status status = - event_router->GetCharacteristics(extension(), params->service_id, + event_router->GetCharacteristics(extension(), params_->service_id, &characteristic_list); if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) { - SetError(StatusToString(status)); - SendResponse(false); - return false; + Respond(Error(StatusToString(status))); + return; } // Manually construct the result instead of using @@ -665,106 +625,107 @@ for (apibtle::Characteristic& characteristic : characteristic_list) result->Append(apibtle::CharacteristicToValue(&characteristic)); - SetResult(std::move(result)); - SendResponse(true); - - return true; + Respond(OneArgument(std::move(result))); } -bool BluetoothLowEnergyGetIncludedServicesFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyGetIncludedServicesFunction:: + BluetoothLowEnergyGetIncludedServicesFunction() {} +BluetoothLowEnergyGetIncludedServicesFunction:: + ~BluetoothLowEnergyGetIncludedServicesFunction() {} + +bool BluetoothLowEnergyGetIncludedServicesFunction::ParseParams() { + params_ = apibtle::GetIncludedServices::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyGetIncludedServicesFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::GetIncludedServices::Params> params( - apibtle::GetIncludedServices::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - BluetoothLowEnergyEventRouter::ServiceList service_list; BluetoothLowEnergyEventRouter::Status status = - event_router->GetIncludedServices(params->service_id, &service_list); + event_router->GetIncludedServices(params_->service_id, &service_list); if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) { - SetError(StatusToString(status)); - SendResponse(false); - return false; + Respond(Error(StatusToString(status))); + return; } - results_ = apibtle::GetIncludedServices::Results::Create(service_list); - SendResponse(true); - - return true; + Respond(ArgumentList( + apibtle::GetIncludedServices::Results::Create(service_list))); } -bool BluetoothLowEnergyGetDescriptorFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyGetDescriptorFunction:: + BluetoothLowEnergyGetDescriptorFunction() {} +BluetoothLowEnergyGetDescriptorFunction:: + ~BluetoothLowEnergyGetDescriptorFunction() {} + +bool BluetoothLowEnergyGetDescriptorFunction::ParseParams() { + params_ = apibtle::GetDescriptor::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyGetDescriptorFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::GetDescriptor::Params> params( - apibtle::GetDescriptor::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - apibtle::Descriptor descriptor; BluetoothLowEnergyEventRouter::Status status = event_router->GetDescriptor( - extension(), params->descriptor_id, &descriptor); + extension(), params_->descriptor_id, &descriptor); if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) { - SetError(StatusToString(status)); - SendResponse(false); - return false; + Respond(Error(StatusToString(status))); + return; } // Manually construct the result instead of using // apibtle::GetDescriptor::Result::Create as it doesn't convert lists of enums // correctly. - SetResult(apibtle::DescriptorToValue(&descriptor)); - SendResponse(true); - - return true; + Respond(OneArgument(apibtle::DescriptorToValue(&descriptor))); } -bool BluetoothLowEnergyGetDescriptorsFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyGetDescriptorsFunction:: + BluetoothLowEnergyGetDescriptorsFunction() {} +BluetoothLowEnergyGetDescriptorsFunction:: + ~BluetoothLowEnergyGetDescriptorsFunction() {} + +bool BluetoothLowEnergyGetDescriptorsFunction::ParseParams() { + params_ = apibtle::GetDescriptors::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyGetDescriptorsFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::GetDescriptors::Params> params( - apibtle::GetDescriptors::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - BluetoothLowEnergyEventRouter::DescriptorList descriptor_list; BluetoothLowEnergyEventRouter::Status status = event_router->GetDescriptors( - extension(), params->characteristic_id, &descriptor_list); + extension(), params_->characteristic_id, &descriptor_list); if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) { - SetError(StatusToString(status)); - SendResponse(false); - return false; + Respond(Error(StatusToString(status))); + return; } // Manually construct the result instead of using @@ -774,31 +735,32 @@ for (apibtle::Descriptor& descriptor : descriptor_list) result->Append(apibtle::DescriptorToValue(&descriptor)); - SetResult(std::move(result)); - SendResponse(true); - - return true; + Respond(OneArgument(std::move(result))); } -bool BluetoothLowEnergyReadCharacteristicValueFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyReadCharacteristicValueFunction:: + BluetoothLowEnergyReadCharacteristicValueFunction() {} +BluetoothLowEnergyReadCharacteristicValueFunction:: + ~BluetoothLowEnergyReadCharacteristicValueFunction() {} + +bool BluetoothLowEnergyReadCharacteristicValueFunction::ParseParams() { + params_ = apibtle::ReadCharacteristicValue::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyReadCharacteristicValueFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::ReadCharacteristicValue::Params> params( - apibtle::ReadCharacteristicValue::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - - instance_id_ = params->characteristic_id; + instance_id_ = params_->characteristic_id; event_router->ReadCharacteristicValue( extension(), instance_id_, base::Bind( @@ -807,8 +769,6 @@ base::Bind( &BluetoothLowEnergyReadCharacteristicValueFunction::ErrorCallback, this)); - - return true; } void BluetoothLowEnergyReadCharacteristicValueFunction::SuccessCallback() { @@ -819,172 +779,175 @@ GetEventRouter(browser_context()) ->GetCharacteristic(extension(), instance_id_, &characteristic); if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) { - SetError(StatusToString(status)); - SendResponse(false); + Respond(Error(StatusToString(status))); return; } // Manually construct the result instead of using // apibtle::GetCharacteristic::Result::Create as it doesn't convert lists of // enums correctly. - SetResult(apibtle::CharacteristicToValue(&characteristic)); - SendResponse(true); + Respond(OneArgument(apibtle::CharacteristicToValue(&characteristic))); } void BluetoothLowEnergyReadCharacteristicValueFunction::ErrorCallback( BluetoothLowEnergyEventRouter::Status status) { - SetError(StatusToString(status)); - SendResponse(false); + Respond(Error(StatusToString(status))); } -bool BluetoothLowEnergyWriteCharacteristicValueFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyWriteCharacteristicValueFunction:: + BluetoothLowEnergyWriteCharacteristicValueFunction() {} +BluetoothLowEnergyWriteCharacteristicValueFunction:: + ~BluetoothLowEnergyWriteCharacteristicValueFunction() {} + +bool BluetoothLowEnergyWriteCharacteristicValueFunction::ParseParams() { + params_ = apibtle::WriteCharacteristicValue::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyWriteCharacteristicValueFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::WriteCharacteristicValue::Params> params( - apibtle::WriteCharacteristicValue::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - - std::vector<uint8_t> value(params->value.begin(), params->value.end()); + std::vector<uint8_t> value(params_->value.begin(), params_->value.end()); event_router->WriteCharacteristicValue( - extension(), params->characteristic_id, value, + extension(), params_->characteristic_id, value, base::Bind( &BluetoothLowEnergyWriteCharacteristicValueFunction::SuccessCallback, this), base::Bind( &BluetoothLowEnergyWriteCharacteristicValueFunction::ErrorCallback, this)); - - return true; } void BluetoothLowEnergyWriteCharacteristicValueFunction::SuccessCallback() { - results_ = apibtle::WriteCharacteristicValue::Results::Create(); - SendResponse(true); + Respond(ArgumentList(apibtle::WriteCharacteristicValue::Results::Create())); } void BluetoothLowEnergyWriteCharacteristicValueFunction::ErrorCallback( BluetoothLowEnergyEventRouter::Status status) { - SetError(StatusToString(status)); - SendResponse(false); + Respond(Error(StatusToString(status))); } -bool BluetoothLowEnergyStartCharacteristicNotificationsFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyStartCharacteristicNotificationsFunction:: + BluetoothLowEnergyStartCharacteristicNotificationsFunction() {} +BluetoothLowEnergyStartCharacteristicNotificationsFunction:: + ~BluetoothLowEnergyStartCharacteristicNotificationsFunction() {} + +bool BluetoothLowEnergyStartCharacteristicNotificationsFunction::ParseParams() { + params_ = apibtle::StartCharacteristicNotifications::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyStartCharacteristicNotificationsFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::StartCharacteristicNotifications::Params> params( - apibtle::StartCharacteristicNotifications::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - bool persistent = false; // Not persistent by default. - apibtle::NotificationProperties* properties = params->properties.get(); + apibtle::NotificationProperties* properties = params_->properties.get(); if (properties) persistent = properties->persistent; event_router->StartCharacteristicNotifications( - persistent, extension(), params->characteristic_id, + persistent, extension(), params_->characteristic_id, base::Bind(&BluetoothLowEnergyStartCharacteristicNotificationsFunction:: SuccessCallback, this), base::Bind(&BluetoothLowEnergyStartCharacteristicNotificationsFunction:: ErrorCallback, this)); - - return true; } void BluetoothLowEnergyStartCharacteristicNotificationsFunction:: SuccessCallback() { - SendResponse(true); + Respond(NoArguments()); } void BluetoothLowEnergyStartCharacteristicNotificationsFunction::ErrorCallback( BluetoothLowEnergyEventRouter::Status status) { - SetError(StatusToString(status)); - SendResponse(false); + Respond(Error(StatusToString(status))); } -bool BluetoothLowEnergyStopCharacteristicNotificationsFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyStopCharacteristicNotificationsFunction:: + BluetoothLowEnergyStopCharacteristicNotificationsFunction() {} +BluetoothLowEnergyStopCharacteristicNotificationsFunction:: + ~BluetoothLowEnergyStopCharacteristicNotificationsFunction() {} + +bool BluetoothLowEnergyStopCharacteristicNotificationsFunction::ParseParams() { + params_ = apibtle::StopCharacteristicNotifications::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyStopCharacteristicNotificationsFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::StopCharacteristicNotifications::Params> params( - apibtle::StopCharacteristicNotifications::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - event_router->StopCharacteristicNotifications( - extension(), params->characteristic_id, + extension(), params_->characteristic_id, base::Bind(&BluetoothLowEnergyStopCharacteristicNotificationsFunction:: SuccessCallback, this), base::Bind(&BluetoothLowEnergyStopCharacteristicNotificationsFunction:: ErrorCallback, this)); - - return true; } void BluetoothLowEnergyStopCharacteristicNotificationsFunction:: SuccessCallback() { - SendResponse(true); + Respond(NoArguments()); } void BluetoothLowEnergyStopCharacteristicNotificationsFunction::ErrorCallback( BluetoothLowEnergyEventRouter::Status status) { - SetError(StatusToString(status)); - SendResponse(false); + Respond(Error(StatusToString(status))); } -bool BluetoothLowEnergyReadDescriptorValueFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyReadDescriptorValueFunction:: + BluetoothLowEnergyReadDescriptorValueFunction() {} +BluetoothLowEnergyReadDescriptorValueFunction:: + ~BluetoothLowEnergyReadDescriptorValueFunction() {} + +bool BluetoothLowEnergyReadDescriptorValueFunction::ParseParams() { + params_ = apibtle::ReadDescriptorValue::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyReadDescriptorValueFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::ReadDescriptorValue::Params> params( - apibtle::ReadDescriptorValue::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - - instance_id_ = params->descriptor_id; + instance_id_ = params_->descriptor_id; event_router->ReadDescriptorValue( extension(), instance_id_, base::Bind( @@ -992,8 +955,6 @@ this), base::Bind(&BluetoothLowEnergyReadDescriptorValueFunction::ErrorCallback, this)); - - return true; } void BluetoothLowEnergyReadDescriptorValueFunction::SuccessCallback() { @@ -1004,63 +965,60 @@ GetEventRouter(browser_context()) ->GetDescriptor(extension(), instance_id_, &descriptor); if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) { - SetError(StatusToString(status)); - SendResponse(false); + Respond(Error(StatusToString(status))); return; } // Manually construct the result instead of using // apibtle::GetDescriptor::Results::Create as it doesn't convert lists of // enums correctly. - SetResult(apibtle::DescriptorToValue(&descriptor)); - SendResponse(true); + Respond(OneArgument(apibtle::DescriptorToValue(&descriptor))); } void BluetoothLowEnergyReadDescriptorValueFunction::ErrorCallback( BluetoothLowEnergyEventRouter::Status status) { - SetError(StatusToString(status)); - SendResponse(false); + Respond(Error(StatusToString(status))); } -bool BluetoothLowEnergyWriteDescriptorValueFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyWriteDescriptorValueFunction:: + BluetoothLowEnergyWriteDescriptorValueFunction() {} +BluetoothLowEnergyWriteDescriptorValueFunction:: + ~BluetoothLowEnergyWriteDescriptorValueFunction() {} + +bool BluetoothLowEnergyWriteDescriptorValueFunction::ParseParams() { + params_ = apibtle::WriteDescriptorValue::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyWriteDescriptorValueFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::WriteDescriptorValue::Params> params( - apibtle::WriteDescriptorValue::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - - std::vector<uint8_t> value(params->value.begin(), params->value.end()); + std::vector<uint8_t> value(params_->value.begin(), params_->value.end()); event_router->WriteDescriptorValue( - extension(), params->descriptor_id, value, + extension(), params_->descriptor_id, value, base::Bind( &BluetoothLowEnergyWriteDescriptorValueFunction::SuccessCallback, this), base::Bind(&BluetoothLowEnergyWriteDescriptorValueFunction::ErrorCallback, this)); - - return true; } void BluetoothLowEnergyWriteDescriptorValueFunction::SuccessCallback() { - results_ = apibtle::WriteDescriptorValue::Results::Create(); - SendResponse(true); + Respond(ArgumentList(apibtle::WriteDescriptorValue::Results::Create())); } void BluetoothLowEnergyWriteDescriptorValueFunction::ErrorCallback( BluetoothLowEnergyEventRouter::Status status) { - SetError(StatusToString(status)); - SendResponse(false); + Respond(Error(StatusToString(status))); } BluetoothLowEnergyAdvertisementFunction:: @@ -1094,25 +1052,11 @@ return advertisements_manager_->GetResourceIds(extension_id()); } -bool BluetoothLowEnergyAdvertisementFunction::RunAsync() { +ExtensionFunction::ResponseAction +BluetoothLowEnergyAdvertisementFunction::Run() { Initialize(); - // Check permission in the manifest. - if (!BluetoothManifestData::CheckPeripheralPermitted(extension())) { - SetError(kErrorPermissionDenied); - return false; - } - - // For advertisement API to be available the app has to be either auto - // launched in Kiosk Mode or the enable-ble-advertisement-in-apps - // should be set. - if (!(IsAutoLaunchedKioskApp(extension()->id()) || - IsPeripheralFlagEnabled())) { - SetError(kErrorPermissionDenied); - return false; - } - - return BluetoothLowEnergyExtensionFunctionDeprecated::RunAsync(); + return BLEPeripheralExtensionFunction::Run(); } void BluetoothLowEnergyAdvertisementFunction::Initialize() { @@ -1122,27 +1066,31 @@ // RegisterAdvertisement: -bool BluetoothLowEnergyRegisterAdvertisementFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyRegisterAdvertisementFunction:: + BluetoothLowEnergyRegisterAdvertisementFunction() {} +BluetoothLowEnergyRegisterAdvertisementFunction:: + ~BluetoothLowEnergyRegisterAdvertisementFunction() {} + +bool BluetoothLowEnergyRegisterAdvertisementFunction::ParseParams() { + params_ = apibtle::RegisterAdvertisement::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyRegisterAdvertisementFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // The adapter must be initialized at this point, but return an error instead // of asserting. if (!event_router->HasAdapter()) { - SetError(kErrorAdapterNotInitialized); - SendResponse(false); - return false; + Respond(Error(kErrorAdapterNotInitialized)); + return; } - std::unique_ptr<apibtle::RegisterAdvertisement::Params> params( - apibtle::RegisterAdvertisement::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); - std::unique_ptr<device::BluetoothAdvertisement::Data> advertisement_data( new device::BluetoothAdvertisement::Data( - params->advertisement.type == + params_->advertisement.type == apibtle::AdvertisementType::ADVERTISEMENT_TYPE_BROADCAST ? device::BluetoothAdvertisement::AdvertisementType:: ADVERTISEMENT_TYPE_BROADCAST @@ -1150,16 +1098,16 @@ ADVERTISEMENT_TYPE_PERIPHERAL)); advertisement_data->set_service_uuids( - std::move(params->advertisement.service_uuids)); + std::move(params_->advertisement.service_uuids)); advertisement_data->set_solicit_uuids( - std::move(params->advertisement.solicit_uuids)); - if (params->advertisement.manufacturer_data) { + std::move(params_->advertisement.solicit_uuids)); + if (params_->advertisement.manufacturer_data) { advertisement_data->set_manufacturer_data( - CreateManufacturerData(params->advertisement.manufacturer_data.get())); + CreateManufacturerData(params_->advertisement.manufacturer_data.get())); } - if (params->advertisement.service_data) { + if (params_->advertisement.service_data) { advertisement_data->set_service_data( - CreateServiceData(params->advertisement.service_data.get())); + CreateServiceData(params_->advertisement.service_data.get())); } event_router->adapter()->RegisterAdvertisement( @@ -1170,15 +1118,13 @@ base::Bind( &BluetoothLowEnergyRegisterAdvertisementFunction::ErrorCallback, this)); - - return true; } void BluetoothLowEnergyRegisterAdvertisementFunction::SuccessCallback( scoped_refptr<device::BluetoothAdvertisement> advertisement) { - results_ = apibtle::RegisterAdvertisement::Results::Create(AddAdvertisement( - new BluetoothApiAdvertisement(extension_id(), advertisement))); - SendResponse(true); + Respond(ArgumentList( + apibtle::RegisterAdvertisement::Results::Create(AddAdvertisement( + new BluetoothApiAdvertisement(extension_id(), advertisement))))); } void BluetoothLowEnergyRegisterAdvertisementFunction::ErrorCallback( @@ -1186,57 +1132,60 @@ switch (status) { case device::BluetoothAdvertisement::ErrorCode:: ERROR_ADVERTISEMENT_ALREADY_EXISTS: - SetError(kStatusAdvertisementAlreadyExists); + Respond(Error(kStatusAdvertisementAlreadyExists)); break; case device::BluetoothAdvertisement::ErrorCode:: ERROR_ADVERTISEMENT_INVALID_LENGTH: - SetError(kErrorInvalidAdvertisementLength); + Respond(Error(kErrorInvalidAdvertisementLength)); break; default: - SetError(kErrorOperationFailed); + Respond(Error(kErrorOperationFailed)); } - SendResponse(false); } // UnregisterAdvertisement: -bool BluetoothLowEnergyUnregisterAdvertisementFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyUnregisterAdvertisementFunction:: + BluetoothLowEnergyUnregisterAdvertisementFunction() {} +BluetoothLowEnergyUnregisterAdvertisementFunction:: + ~BluetoothLowEnergyUnregisterAdvertisementFunction() {} + +bool BluetoothLowEnergyUnregisterAdvertisementFunction::ParseParams() { + params_ = apibtle::UnregisterAdvertisement::Params::Create(*args_); + return params_.get() != nullptr; +} + +void BluetoothLowEnergyUnregisterAdvertisementFunction::DoWork() { BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // If we don't have an initialized adapter, unregistering is a no-op. - if (!event_router->HasAdapter()) - return true; - - std::unique_ptr<apibtle::UnregisterAdvertisement::Params> params( - apibtle::UnregisterAdvertisement::Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); + if (!event_router->HasAdapter()) { + Respond(NoArguments()); + return; + } BluetoothApiAdvertisement* advertisement = - GetAdvertisement(params->advertisement_id); + GetAdvertisement(params_->advertisement_id); if (!advertisement) { - error_ = kStatusAdvertisementDoesNotExist; - SendResponse(false); - return false; + Respond(Error(kStatusAdvertisementDoesNotExist)); + return; } advertisement->advertisement()->Unregister( base::Bind( &BluetoothLowEnergyUnregisterAdvertisementFunction::SuccessCallback, - this, params->advertisement_id), + this, params_->advertisement_id), base::Bind( &BluetoothLowEnergyUnregisterAdvertisementFunction::ErrorCallback, - this, params->advertisement_id)); - - return true; + this, params_->advertisement_id)); } void BluetoothLowEnergyUnregisterAdvertisementFunction::SuccessCallback( int advertisement_id) { RemoveAdvertisement(advertisement_id); - SendResponse(true); + Respond(NoArguments()); } void BluetoothLowEnergyUnregisterAdvertisementFunction::ErrorCallback( @@ -1246,33 +1195,40 @@ switch (status) { case device::BluetoothAdvertisement::ErrorCode:: ERROR_ADVERTISEMENT_DOES_NOT_EXIST: - SetError(kStatusAdvertisementDoesNotExist); + Respond(Error(kStatusAdvertisementDoesNotExist)); break; default: - SetError(kErrorOperationFailed); + Respond(Error(kErrorOperationFailed)); } - SendResponse(false); } // ResetAdvertising: -bool BluetoothLowEnergyResetAdvertisingFunction::DoWork() { -#if defined(OS_CHROMEOS) || defined(OS_LINUX) - DCHECK_CURRENTLY_ON(BrowserThread::UI); +BluetoothLowEnergyResetAdvertisingFunction:: + BluetoothLowEnergyResetAdvertisingFunction() {} +BluetoothLowEnergyResetAdvertisingFunction:: + ~BluetoothLowEnergyResetAdvertisingFunction() {} + +bool BluetoothLowEnergyResetAdvertisingFunction::ParseParams() { + return true; +} + +void BluetoothLowEnergyResetAdvertisingFunction::DoWork() { +#if defined(OS_CHROMEOS) || defined(OS_LINUX) BluetoothLowEnergyEventRouter* event_router = GetEventRouter(browser_context()); // If the adapter is not initialized, there is nothing to reset. if (!event_router->HasAdapter()) { - SendResponse(true); - return true; + Respond(NoArguments()); + return; } const base::hash_set<int>* advertisement_ids = GetAdvertisementIds(); if (!advertisement_ids || advertisement_ids->empty()) { - SendResponse(true); - return true; + Respond(NoArguments()); + return; } // Copy the hash set, as RemoveAdvertisement can change advertisement_ids @@ -1288,24 +1244,29 @@ base::Bind(&BluetoothLowEnergyResetAdvertisingFunction::ErrorCallback, this)); #endif - - return true; } void BluetoothLowEnergyResetAdvertisingFunction::SuccessCallback() { - SendResponse(true); + Respond(NoArguments()); } void BluetoothLowEnergyResetAdvertisingFunction::ErrorCallback( device::BluetoothAdvertisement::ErrorCode status) { - error_ = kErrorOperationFailed; - SendResponse(false); + Respond(Error(kErrorOperationFailed)); } // SetAdvertisingInterval: -template class BLEPeripheralExtensionFunction< - apibtle::SetAdvertisingInterval::Params>; +BluetoothLowEnergySetAdvertisingIntervalFunction:: + BluetoothLowEnergySetAdvertisingIntervalFunction() {} + +BluetoothLowEnergySetAdvertisingIntervalFunction:: + ~BluetoothLowEnergySetAdvertisingIntervalFunction() {} + +bool BluetoothLowEnergySetAdvertisingIntervalFunction::ParseParams() { + params_ = apibtle::SetAdvertisingInterval::Params::Create(*args_); + return params_.get() != nullptr; +} void BluetoothLowEnergySetAdvertisingIntervalFunction::DoWork() { #if defined(OS_CHROMEOS) || defined(OS_LINUX) @@ -1343,10 +1304,23 @@ // createService: -template class BLEPeripheralExtensionFunction<apibtle::CreateService::Params>; +BluetoothLowEnergyCreateServiceFunction:: + BluetoothLowEnergyCreateServiceFunction() {} + +BluetoothLowEnergyCreateServiceFunction:: + ~BluetoothLowEnergyCreateServiceFunction() {} + +bool BluetoothLowEnergyCreateServiceFunction::ParseParams() { +// Causes link error on Windows. API will never be on Windows, so #ifdefing. +#if !defined(OS_WIN) + params_ = apibtle::CreateService::Params::Create(*args_); + return params_.get() != nullptr; +#else + return true; +#endif +} void BluetoothLowEnergyCreateServiceFunction::DoWork() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); // Causes link error on Windows. API will never be on Windows, so #ifdefing. // TODO: Ideally this should be handled by our feature system, so that this // code doesn't even compile on OSes it isn't being used on, but currently this @@ -1368,8 +1342,16 @@ // createCharacteristic: -template class BLEPeripheralExtensionFunction< - apibtle::CreateCharacteristic::Params>; +BluetoothLowEnergyCreateCharacteristicFunction:: + BluetoothLowEnergyCreateCharacteristicFunction() {} + +BluetoothLowEnergyCreateCharacteristicFunction:: + ~BluetoothLowEnergyCreateCharacteristicFunction() {} + +bool BluetoothLowEnergyCreateCharacteristicFunction::ParseParams() { + params_ = apibtle::CreateCharacteristic::Params::Create(*args_); + return params_.get() != nullptr; +} void BluetoothLowEnergyCreateCharacteristicFunction::DoWork() { device::BluetoothLocalGattService* service = @@ -1396,8 +1378,16 @@ // createDescriptor: -template class BLEPeripheralExtensionFunction< - apibtle::CreateDescriptor::Params>; +BluetoothLowEnergyCreateDescriptorFunction:: + BluetoothLowEnergyCreateDescriptorFunction() {} + +BluetoothLowEnergyCreateDescriptorFunction:: + ~BluetoothLowEnergyCreateDescriptorFunction() {} + +bool BluetoothLowEnergyCreateDescriptorFunction::ParseParams() { + params_ = apibtle::CreateDescriptor::Params::Create(*args_); + return params_.get() != nullptr; +} void BluetoothLowEnergyCreateDescriptorFunction::DoWork() { device::BluetoothLocalGattCharacteristic* characteristic = @@ -1419,7 +1409,16 @@ // registerService: -template class BLEPeripheralExtensionFunction<apibtle::RegisterService::Params>; +BluetoothLowEnergyRegisterServiceFunction:: + BluetoothLowEnergyRegisterServiceFunction() {} + +BluetoothLowEnergyRegisterServiceFunction:: + ~BluetoothLowEnergyRegisterServiceFunction() {} + +bool BluetoothLowEnergyRegisterServiceFunction::ParseParams() { + params_ = apibtle::RegisterService::Params::Create(*args_); + return params_.get() != nullptr; +} void BluetoothLowEnergyRegisterServiceFunction::DoWork() { event_router_->RegisterGattService( @@ -1441,8 +1440,16 @@ // unregisterService: -template class BLEPeripheralExtensionFunction< - apibtle::UnregisterService::Params>; +BluetoothLowEnergyUnregisterServiceFunction:: + BluetoothLowEnergyUnregisterServiceFunction() {} + +BluetoothLowEnergyUnregisterServiceFunction:: + ~BluetoothLowEnergyUnregisterServiceFunction() {} + +bool BluetoothLowEnergyUnregisterServiceFunction::ParseParams() { + params_ = apibtle::UnregisterService::Params::Create(*args_); + return params_.get() != nullptr; +} void BluetoothLowEnergyUnregisterServiceFunction::DoWork() { event_router_->UnregisterGattService( @@ -1464,8 +1471,16 @@ // notifyCharacteristicValueChanged: -template class BLEPeripheralExtensionFunction< - apibtle::NotifyCharacteristicValueChanged::Params>; +BluetoothLowEnergyNotifyCharacteristicValueChangedFunction:: + BluetoothLowEnergyNotifyCharacteristicValueChangedFunction() {} + +BluetoothLowEnergyNotifyCharacteristicValueChangedFunction:: + ~BluetoothLowEnergyNotifyCharacteristicValueChangedFunction() {} + +bool BluetoothLowEnergyNotifyCharacteristicValueChangedFunction::ParseParams() { + params_ = apibtle::NotifyCharacteristicValueChanged::Params::Create(*args_); + return params_.get() != nullptr; +} void BluetoothLowEnergyNotifyCharacteristicValueChangedFunction::DoWork() { device::BluetoothLocalGattCharacteristic* characteristic = @@ -1505,7 +1520,16 @@ // removeService: -template class BLEPeripheralExtensionFunction<apibtle::RemoveService::Params>; +BluetoothLowEnergyRemoveServiceFunction:: + BluetoothLowEnergyRemoveServiceFunction() {} + +BluetoothLowEnergyRemoveServiceFunction:: + ~BluetoothLowEnergyRemoveServiceFunction() {} + +bool BluetoothLowEnergyRemoveServiceFunction::ParseParams() { + params_ = apibtle::RemoveService::Params::Create(*args_); + return params_.get() != nullptr; +} void BluetoothLowEnergyRemoveServiceFunction::DoWork() { device::BluetoothLocalGattService* service = @@ -1521,8 +1545,16 @@ // sendRequestResponse: -template class BLEPeripheralExtensionFunction< - apibtle::SendRequestResponse::Params>; +BluetoothLowEnergySendRequestResponseFunction:: + BluetoothLowEnergySendRequestResponseFunction() {} + +BluetoothLowEnergySendRequestResponseFunction:: + ~BluetoothLowEnergySendRequestResponseFunction() {} + +bool BluetoothLowEnergySendRequestResponseFunction::ParseParams() { + params_ = apibtle::SendRequestResponse::Params::Create(*args_); + return params_.get() != nullptr; +} void BluetoothLowEnergySendRequestResponseFunction::DoWork() { std::vector<uint8_t> uint8_vector;
diff --git a/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h b/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h index 26c3303d..69d72ca 100644 --- a/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h +++ b/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h
@@ -89,34 +89,6 @@ // Base class for bluetoothLowEnergy API functions. This class handles some of // the common logic involved in all API functions, such as checking for // platform support and returning the correct error. -// -// DEPRECATED: This inherits from AsyncExtensionFunction, which we're trying to -// get rid of for various reasons. Please inherit from the -// BluetoothLowEnergyExtensionFunction class instead. -class BluetoothLowEnergyExtensionFunctionDeprecated - : public AsyncExtensionFunction { - public: - BluetoothLowEnergyExtensionFunctionDeprecated(); - - protected: - ~BluetoothLowEnergyExtensionFunctionDeprecated() override; - - // AsyncExtensionFunction override. - bool RunAsync() override; - - // Implemented by individual bluetoothLowEnergy extension functions to perform - // the body of the function. This invoked asynchonously after RunAsync after - // the BluetoothLowEnergyEventRouter has obtained a handle on the - // BluetoothAdapter. - virtual bool DoWork() = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(BluetoothLowEnergyExtensionFunctionDeprecated); -}; - -// Replacement for BluetoothLowEnergyExtensionFunctionDeprecated. Has the same -// functionality except that instead of the SendResponse/return combo, we'll -// return our response with Respond(). class BluetoothLowEnergyExtensionFunction : public UIThreadExtensionFunction { public: BluetoothLowEnergyExtensionFunction(); @@ -133,6 +105,12 @@ // BluetoothAdapter. virtual void DoWork() = 0; + // Subclasses to implement this method to set and validate its type-specific + // params. This method should return true if the params is valid and + // false otherwise. This method is called before DoWork() to allow early exit + // in the case of invalid params. + virtual bool ParseParams() = 0; + BluetoothLowEnergyEventRouter* event_router_; private: @@ -146,7 +124,6 @@ // handles some of the common logic involved in all API peripheral mode // functions, such as checking for peripheral permissions and returning the // correct error. -template <typename Params> class BLEPeripheralExtensionFunction : public BluetoothLowEnergyExtensionFunction { public: @@ -158,28 +135,26 @@ // ExtensionFunction override. ResponseAction Run() override; -// Causes link error on Windows. API will never be on Windows, so #ifdefing. -#if !defined(OS_WIN) - std::unique_ptr<Params> params_; -#else - Params* params_; -#endif - private: DISALLOW_COPY_AND_ASSIGN(BLEPeripheralExtensionFunction); }; class BluetoothLowEnergyConnectFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.connect", BLUETOOTHLOWENERGY_CONNECT); - protected: - ~BluetoothLowEnergyConnectFunction() override {} + BluetoothLowEnergyConnectFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyConnectFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::Connect::Params> params_; private: // Success and error callbacks, called by @@ -189,16 +164,21 @@ }; class BluetoothLowEnergyDisconnectFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.disconnect", BLUETOOTHLOWENERGY_DISCONNECT); - protected: - ~BluetoothLowEnergyDisconnectFunction() override {} + BluetoothLowEnergyDisconnectFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyDisconnectFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::Disconnect::Params> params_; private: // Success and error callbacks, called by @@ -208,107 +188,148 @@ }; class BluetoothLowEnergyGetServiceFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getService", BLUETOOTHLOWENERGY_GETSERVICE); - protected: - ~BluetoothLowEnergyGetServiceFunction() override {} + BluetoothLowEnergyGetServiceFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyGetServiceFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::GetService::Params> params_; }; class BluetoothLowEnergyGetServicesFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getServices", BLUETOOTHLOWENERGY_GETSERVICES); - protected: - ~BluetoothLowEnergyGetServicesFunction() override {} + BluetoothLowEnergyGetServicesFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyGetServicesFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::GetServices::Params> params_; }; class BluetoothLowEnergyGetCharacteristicFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getCharacteristic", BLUETOOTHLOWENERGY_GETCHARACTERISTIC); - protected: - ~BluetoothLowEnergyGetCharacteristicFunction() override {} + BluetoothLowEnergyGetCharacteristicFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyGetCharacteristicFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::GetCharacteristic::Params> params_; }; class BluetoothLowEnergyGetCharacteristicsFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getCharacteristics", BLUETOOTHLOWENERGY_GETCHARACTERISTICS); - protected: - ~BluetoothLowEnergyGetCharacteristicsFunction() override {} + BluetoothLowEnergyGetCharacteristicsFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyGetCharacteristicsFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::GetCharacteristics::Params> params_; }; class BluetoothLowEnergyGetIncludedServicesFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getIncludedServices", BLUETOOTHLOWENERGY_GETINCLUDEDSERVICES); - protected: - ~BluetoothLowEnergyGetIncludedServicesFunction() override {} + BluetoothLowEnergyGetIncludedServicesFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyGetIncludedServicesFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::GetIncludedServices::Params> params_; }; class BluetoothLowEnergyGetDescriptorFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getDescriptor", BLUETOOTHLOWENERGY_GETDESCRIPTOR); - protected: - ~BluetoothLowEnergyGetDescriptorFunction() override {} + BluetoothLowEnergyGetDescriptorFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyGetDescriptorFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::GetDescriptor::Params> params_; }; class BluetoothLowEnergyGetDescriptorsFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getDescriptors", BLUETOOTHLOWENERGY_GETDESCRIPTORS); - protected: - ~BluetoothLowEnergyGetDescriptorsFunction() override {} + BluetoothLowEnergyGetDescriptorsFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyGetDescriptorsFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::GetDescriptors::Params> params_; }; class BluetoothLowEnergyReadCharacteristicValueFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.readCharacteristicValue", BLUETOOTHLOWENERGY_READCHARACTERISTICVALUE); - protected: - ~BluetoothLowEnergyReadCharacteristicValueFunction() override {} + BluetoothLowEnergyReadCharacteristicValueFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyReadCharacteristicValueFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::ReadCharacteristicValue::Params> + params_; private: // Success and error callbacks, called by @@ -321,16 +342,22 @@ }; class BluetoothLowEnergyWriteCharacteristicValueFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.writeCharacteristicValue", BLUETOOTHLOWENERGY_WRITECHARACTERISTICVALUE); - protected: - ~BluetoothLowEnergyWriteCharacteristicValueFunction() override {} + BluetoothLowEnergyWriteCharacteristicValueFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyWriteCharacteristicValueFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::WriteCharacteristicValue::Params> + params_; private: // Success and error callbacks, called by @@ -343,17 +370,24 @@ }; class BluetoothLowEnergyStartCharacteristicNotificationsFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION( "bluetoothLowEnergy.startCharacteristicNotifications", BLUETOOTHLOWENERGY_STARTCHARACTERISTICNOTIFICATIONS); - protected: - ~BluetoothLowEnergyStartCharacteristicNotificationsFunction() override {} + BluetoothLowEnergyStartCharacteristicNotificationsFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyStartCharacteristicNotificationsFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr< + bluetooth_low_energy::StartCharacteristicNotifications::Params> + params_; private: // Success and error callbacks, called by @@ -363,17 +397,23 @@ }; class BluetoothLowEnergyStopCharacteristicNotificationsFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION( "bluetoothLowEnergy.stopCharacteristicNotifications", BLUETOOTHLOWENERGY_STOPCHARACTERISTICNOTIFICATIONS); - protected: - ~BluetoothLowEnergyStopCharacteristicNotificationsFunction() override {} + BluetoothLowEnergyStopCharacteristicNotificationsFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyStopCharacteristicNotificationsFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::StopCharacteristicNotifications::Params> + params_; private: // Success and error callbacks, called by @@ -383,16 +423,21 @@ }; class BluetoothLowEnergyReadDescriptorValueFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.readDescriptorValue", BLUETOOTHLOWENERGY_READDESCRIPTORVALUE); - protected: - ~BluetoothLowEnergyReadDescriptorValueFunction() override {} + BluetoothLowEnergyReadDescriptorValueFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyReadDescriptorValueFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::ReadDescriptorValue::Params> params_; private: // Success and error callbacks, called by @@ -405,16 +450,21 @@ }; class BluetoothLowEnergyWriteDescriptorValueFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BluetoothLowEnergyExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.writeDescriptorValue", BLUETOOTHLOWENERGY_WRITEDESCRIPTORVALUE); - protected: - ~BluetoothLowEnergyWriteDescriptorValueFunction() override {} + BluetoothLowEnergyWriteDescriptorValueFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyWriteDescriptorValueFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::WriteDescriptorValue::Params> params_; private: // Success and error callbacks, called by @@ -427,7 +477,7 @@ }; class BluetoothLowEnergyAdvertisementFunction - : public BluetoothLowEnergyExtensionFunctionDeprecated { + : public BLEPeripheralExtensionFunction { public: BluetoothLowEnergyAdvertisementFunction(); @@ -441,7 +491,7 @@ const base::hash_set<int>* GetAdvertisementIds(); // ExtensionFunction override. - bool RunAsync() override; + ResponseAction Run() override; private: void Initialize(); @@ -457,11 +507,16 @@ DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.registerAdvertisement", BLUETOOTHLOWENERGY_REGISTERADVERTISEMENT); - protected: - ~BluetoothLowEnergyRegisterAdvertisementFunction() override {} + BluetoothLowEnergyRegisterAdvertisementFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyRegisterAdvertisementFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::RegisterAdvertisement::Params> params_; private: void SuccessCallback(scoped_refptr<device::BluetoothAdvertisement>); @@ -474,11 +529,17 @@ DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.unregisterAdvertisement", BLUETOOTHLOWENERGY_UNREGISTERADVERTISEMENT); - protected: - ~BluetoothLowEnergyUnregisterAdvertisementFunction() override {} + BluetoothLowEnergyUnregisterAdvertisementFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyUnregisterAdvertisementFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::UnregisterAdvertisement::Params> + params_; private: void SuccessCallback(int advertisement_id); @@ -492,11 +553,14 @@ DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.resetAdvertising", BLUETOOTHLOWENERGY_RESETADVERTISING); - protected: - ~BluetoothLowEnergyResetAdvertisingFunction() override {} + BluetoothLowEnergyResetAdvertisingFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. - bool DoWork() override; + protected: + ~BluetoothLowEnergyResetAdvertisingFunction() override; + + // BluetoothLowEnergyExtensionFunction override. + void DoWork() override; + bool ParseParams() override; private: void SuccessCallback(); @@ -504,18 +568,21 @@ }; class BluetoothLowEnergySetAdvertisingIntervalFunction - : public BLEPeripheralExtensionFunction< - extensions::api::bluetooth_low_energy::SetAdvertisingInterval:: - Params> { + : public BLEPeripheralExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.setAdvertisingInterval", BLUETOOTHLOWENERGY_SETADVERTISINGINTERVAL); - protected: - ~BluetoothLowEnergySetAdvertisingIntervalFunction() override {} + BluetoothLowEnergySetAdvertisingIntervalFunction(); - // BluetoothLowEnergyExtensionFunctionDeprecated override. + protected: + ~BluetoothLowEnergySetAdvertisingIntervalFunction() override; + + // BluetoothLowEnergyExtensionFunction override. void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::SetAdvertisingInterval::Params> params_; private: void SuccessCallback(); @@ -523,75 +590,99 @@ }; class BluetoothLowEnergyCreateServiceFunction - : public BLEPeripheralExtensionFunction< - extensions::api::bluetooth_low_energy::CreateService::Params> { + : public BLEPeripheralExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.createService", BLUETOOTHLOWENERGY_CREATESERVICE); + BluetoothLowEnergyCreateServiceFunction(); + protected: - ~BluetoothLowEnergyCreateServiceFunction() override {} + ~BluetoothLowEnergyCreateServiceFunction() override; // BluetoothLowEnergyPeripheralExtensionFunction override. void DoWork() override; + bool ParseParams() override; + + // Causes link error on Windows. API will never be on Windows, so #ifdefing. +#if !defined(OS_WIN) + std::unique_ptr<bluetooth_low_energy::CreateService::Params> params_; +#endif }; class BluetoothLowEnergyCreateCharacteristicFunction - : public BLEPeripheralExtensionFunction< - extensions::api::bluetooth_low_energy::CreateCharacteristic::Params> { + : public BLEPeripheralExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.createCharacteristic", BLUETOOTHLOWENERGY_CREATECHARACTERISTIC); + BluetoothLowEnergyCreateCharacteristicFunction(); + protected: - ~BluetoothLowEnergyCreateCharacteristicFunction() override {} + ~BluetoothLowEnergyCreateCharacteristicFunction() override; // BluetoothLowEnergyPeripheralExtensionFunction override. void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::CreateCharacteristic::Params> params_; }; class BluetoothLowEnergyNotifyCharacteristicValueChangedFunction - : public BLEPeripheralExtensionFunction< - extensions::api::bluetooth_low_energy:: - NotifyCharacteristicValueChanged::Params> { + : public BLEPeripheralExtensionFunction { public: DECLARE_EXTENSION_FUNCTION( "bluetoothLowEnergy.notifyCharacteristicValueChanged", BLUETOOTHLOWENERGY_NOTIFYCHARACTERISTICVALUECHANGED); + BluetoothLowEnergyNotifyCharacteristicValueChangedFunction(); + protected: - ~BluetoothLowEnergyNotifyCharacteristicValueChangedFunction() override {} + ~BluetoothLowEnergyNotifyCharacteristicValueChangedFunction() override; // BluetoothLowEnergyPeripheralExtensionFunction override. void DoWork() override; + bool ParseParams() override; + + std::unique_ptr< + bluetooth_low_energy::NotifyCharacteristicValueChanged::Params> + params_; }; class BluetoothLowEnergyCreateDescriptorFunction - : public BLEPeripheralExtensionFunction< - extensions::api::bluetooth_low_energy::CreateDescriptor::Params> { + : public BLEPeripheralExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.createDescriptor", BLUETOOTHLOWENERGY_CREATEDESCRIPTOR); + BluetoothLowEnergyCreateDescriptorFunction(); + protected: - ~BluetoothLowEnergyCreateDescriptorFunction() override {} + ~BluetoothLowEnergyCreateDescriptorFunction() override; // BluetoothLowEnergyPeripheralExtensionFunction override. void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::CreateDescriptor::Params> params_; }; class BluetoothLowEnergyRegisterServiceFunction - : public BLEPeripheralExtensionFunction< - extensions::api::bluetooth_low_energy::RegisterService::Params> { + : public BLEPeripheralExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.registerService", BLUETOOTHLOWENERGY_REGISTERSERVICE); + BluetoothLowEnergyRegisterServiceFunction(); + protected: - ~BluetoothLowEnergyRegisterServiceFunction() override {} + ~BluetoothLowEnergyRegisterServiceFunction() override; // BluetoothLowEnergyPeripheralExtensionFunction override. void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::RegisterService::Params> params_; private: void SuccessCallback(); @@ -599,17 +690,21 @@ }; class BluetoothLowEnergyUnregisterServiceFunction - : public BLEPeripheralExtensionFunction< - extensions::api::bluetooth_low_energy::UnregisterService::Params> { + : public BLEPeripheralExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.unregisterService", BLUETOOTHLOWENERGY_UNREGISTERSERVICE); + BluetoothLowEnergyUnregisterServiceFunction(); + protected: - ~BluetoothLowEnergyUnregisterServiceFunction() override {} + ~BluetoothLowEnergyUnregisterServiceFunction() override; // BluetoothLowEnergyPeripheralExtensionFunction override. void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::UnregisterService::Params> params_; private: // Success and error callbacks, called by @@ -619,31 +714,39 @@ }; class BluetoothLowEnergyRemoveServiceFunction - : public BLEPeripheralExtensionFunction< - extensions::api::bluetooth_low_energy::RemoveService::Params> { + : public BLEPeripheralExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.removeService", BLUETOOTHLOWENERGY_REMOVESERVICE); + BluetoothLowEnergyRemoveServiceFunction(); + protected: - ~BluetoothLowEnergyRemoveServiceFunction() override {} + ~BluetoothLowEnergyRemoveServiceFunction() override; // BluetoothLowEnergyPeripheralExtensionFunction override. void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::RemoveService::Params> params_; }; class BluetoothLowEnergySendRequestResponseFunction - : public BLEPeripheralExtensionFunction< - extensions::api::bluetooth_low_energy::SendRequestResponse::Params> { + : public BLEPeripheralExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.sendRequestResponse", BLUETOOTHLOWENERGY_SENDREQUESTRESPONSE); + BluetoothLowEnergySendRequestResponseFunction(); + protected: - ~BluetoothLowEnergySendRequestResponseFunction() override {} + ~BluetoothLowEnergySendRequestResponseFunction() override; // BluetoothLowEnergyPeripheralExtensionFunction override. void DoWork() override; + bool ParseParams() override; + + std::unique_ptr<bluetooth_low_energy::SendRequestResponse::Params> params_; }; } // namespace api
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc index 7dfb51c..67d8bea 100644 --- a/extensions/renderer/dispatcher.cc +++ b/extensions/renderer/dispatcher.cc
@@ -727,7 +727,6 @@ {"guestViewEvents", IDR_GUEST_VIEW_EVENTS_JS}, {"imageUtil", IDR_IMAGE_UTIL_JS}, {"json_schema", IDR_JSON_SCHEMA_JS}, - {"lastError", IDR_LAST_ERROR_JS}, {"messaging", IDR_MESSAGING_JS}, {"messaging_utils", IDR_MESSAGING_UTILS_JS}, {kSchemaUtils, IDR_SCHEMA_UTILS_JS}, @@ -801,6 +800,7 @@ if (!FeatureSwitch::native_crx_bindings()->IsEnabled()) { resources.emplace_back("binding", IDR_BINDING_JS); resources.emplace_back(kEventBindings, IDR_EVENT_BINDINGS_JS); + resources.emplace_back("lastError", IDR_LAST_ERROR_JS); resources.emplace_back("sendRequest", IDR_SEND_REQUEST_JS); // Custom types sources.
diff --git a/extensions/renderer/resources/file_entry_binding_util.js b/extensions/renderer/resources/file_entry_binding_util.js index 6ae219c..cdef7222 100644 --- a/extensions/renderer/resources/file_entry_binding_util.js +++ b/extensions/renderer/resources/file_entry_binding_util.js
@@ -4,12 +4,20 @@ var fileSystemNatives = requireNative('file_system_natives'); var GetIsolatedFileSystem = fileSystemNatives.GetIsolatedFileSystem; -var lastError = require('lastError'); var GetModuleSystem = requireNative('v8_context').GetModuleSystem; // TODO(sammc): Don't require extension. See http://crbug.com/235689. var GetExtensionViews = requireNative('runtime').GetExtensionViews; var safeCallbackApply = require('uncaught_exception_handler').safeCallbackApply; +var jsLastError = bindingUtil ? undefined : require('lastError'); +function runCallbackWithLastError(name, message, stack, callback) { + if (bindingUtil) + bindingUtil.runCallbackWithLastError(message, callback); + else + jsLastError.run(name, message, stack, callback); +} + + var WINDOW = {}; try { WINDOW = window; @@ -51,7 +59,7 @@ var getEntryError = function(fileError) { if (!hasError) { hasError = true; - lastError.run( + runCallbackWithLastError( apiName + '.' + functionName, 'Error getting fileEntry, code: ' + fileError.code, request.stack, @@ -103,10 +111,9 @@ } catch (e) { if (!hasError) { hasError = true; - lastError.run(apiName + '.' + functionName, - 'Error getting fileEntry: ' + e.stack, - request.stack, - callback); + runCallbackWithLastError(apiName + '.' + functionName, + 'Error getting fileEntry: ' + e.stack, + request.stack, callback); } } }); @@ -150,16 +157,15 @@ try { fs.root.getDirectory(baseName, {}, callback, function(fileError) { - lastError.run('runtime.' + functionName, - 'Error getting Entry, code: ' + fileError.code, - request.stack, - callback); + runCallbackWithLastError( + 'runtime.' + functionName, + 'Error getting Entry, code: ' + fileError.code, + request.stack, callback); }); } catch (e) { - lastError.run('runtime.' + functionName, - 'Error: ' + e.stack, - request.stack, - callback); + runCallbackWithLastError('runtime.' + functionName, + 'Error: ' + e.stack, + request.stack, callback); } } }
diff --git a/extensions/renderer/resources/messaging.js b/extensions/renderer/resources/messaging.js index f44d753d..d0ca6c8 100644 --- a/extensions/renderer/resources/messaging.js +++ b/extensions/renderer/resources/messaging.js
@@ -7,7 +7,6 @@ // TODO(kalman): factor requiring chrome out of here. var chrome = requireNative('chrome').GetChrome(); - var lastError = require('lastError'); var logActivity = requireNative('activityLogger'); var logging = requireNative('logging'); var messagingNatives = requireNative('messaging_natives'); @@ -46,6 +45,28 @@ privates(event).impl.destroy_(); } + var jsLastError = bindingUtil ? undefined : require('lastError'); + function setLastError(name, error) { + if (bindingUtil) + bindingUtil.setLastError(error); + else + jsLastError.set(name, error, null, chrome); + } + + function clearLastError() { + if (bindingUtil) + bindingUtil.clearLastError(); + else + jsLastError.clear(chrome); + } + + function hasLastError() { + if (bindingUtil) + return bindingUtil.hasLastError(); + else + return jsLastError.hasError(chrome); + } + // Map of port IDs to port object. var ports = {__proto__: null}; @@ -152,7 +173,7 @@ if (sourceUrl) errorMsg += ' for URL ' + sourceUrl; errorMsg += ').'; - lastError.set(eventName, errorMsg, null, chrome); + setLastError(eventName, errorMsg); } // Helper function for dispatchOnConnect @@ -348,12 +369,12 @@ if (port) { delete ports[portId]; if (errorMessage) - lastError.set('Port', errorMessage, null, chrome); + setLastError('Port', errorMessage); try { port.onDisconnect.dispatch(port); } finally { privates(port).impl.destroy_(); - lastError.clear(chrome); + clearLastError(); } } }; @@ -406,17 +427,16 @@ if (!responseCallback) return; - if (lastError.hasError(chrome)) { + if (hasLastError()) { sendResponseAndClearCallback(); } else { - lastError.set( + setLastError( port.name, - 'The message port closed before a response was received.', null, - chrome); + 'The message port closed before a response was received.'); try { sendResponseAndClearCallback(); } finally { - lastError.clear(chrome); + clearLastError(); } } }
diff --git a/extensions/shell/installer/linux/BUILD.gn b/extensions/shell/installer/linux/BUILD.gn index d537e713..08f8bfa 100644 --- a/extensions/shell/installer/linux/BUILD.gn +++ b/extensions/shell/installer/linux/BUILD.gn
@@ -128,6 +128,14 @@ "//ppapi/native_client:irt", ] } + + # TODO(thomasanderson): Move this variable into a .gni file + # somewhere. It is currently copied from + # buildtools/third_party/libc++/BUILD.gn. + libcpp_is_static = !is_component_build && !using_sanitizer + if (!libcpp_is_static && use_custom_libcxx) { + public_deps += [ "//buildtools/third_party/libc++:libc++" ] + } } # Creates .deb installer package.
diff --git a/google_apis/gcm/monitoring/fake_gcm_stats_recorder.cc b/google_apis/gcm/monitoring/fake_gcm_stats_recorder.cc index 5b138d2fa..62ca46e 100644 --- a/google_apis/gcm/monitoring/fake_gcm_stats_recorder.cc +++ b/google_apis/gcm/monitoring/fake_gcm_stats_recorder.cc
@@ -56,6 +56,12 @@ int64_t delay_msec, int retries_left) {} +void FakeGCMStatsRecorder::RecordDataMessageReceived( + const std::string& app_id, + const std::string& from, + int message_byte_size, + ReceivedMessageType message_type) {} + void FakeGCMStatsRecorder::RecordUnregistrationSent( const std::string& app_id, const std::string& source) { } @@ -72,14 +78,6 @@ int64_t delay_msec, int retries_left) {} -void FakeGCMStatsRecorder::RecordDataMessageReceived( - const std::string& app_id, - const std::string& from, - int message_byte_size, - bool to_registered_app, - ReceivedMessageType message_type) { -} - void FakeGCMStatsRecorder::RecordDataSentToWire( const std::string& app_id, const std::string& receiver_id,
diff --git a/google_apis/gcm/monitoring/fake_gcm_stats_recorder.h b/google_apis/gcm/monitoring/fake_gcm_stats_recorder.h index 8e10231..a998a02c 100644 --- a/google_apis/gcm/monitoring/fake_gcm_stats_recorder.h +++ b/google_apis/gcm/monitoring/fake_gcm_stats_recorder.h
@@ -52,7 +52,6 @@ void RecordDataMessageReceived(const std::string& app_id, const std::string& from, int message_byte_size, - bool to_registered_app, ReceivedMessageType message_type) override; void RecordDataSentToWire(const std::string& app_id, const std::string& receiver_id,
diff --git a/google_apis/gcm/monitoring/gcm_stats_recorder.h b/google_apis/gcm/monitoring/gcm_stats_recorder.h index 7cd45eb..dff4a47 100644 --- a/google_apis/gcm/monitoring/gcm_stats_recorder.h +++ b/google_apis/gcm/monitoring/gcm_stats_recorder.h
@@ -109,14 +109,12 @@ int64_t delay_msec, int retries_left) = 0; - // Records that a data message has been received. If this message is not - // sent to a registered app, to_registered_app should be false. If it - // indicates that one or more messages were dropped on the server, - // message_type should be DELETED_MESSAGES. + // Records that a data message has been received. If it indicates that one or + // more messages were dropped on the server, message_type should be + // DELETED_MESSAGES. virtual void RecordDataMessageReceived(const std::string& app_id, const std::string& from, int message_byte_size, - bool to_registered_app, ReceivedMessageType message_type) = 0; // Records that an outgoing data message was sent over the wire.
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn index 3fa2b3e..86b3d704 100644 --- a/gpu/BUILD.gn +++ b/gpu/BUILD.gn
@@ -157,6 +157,7 @@ "command_buffer/tests/gl_map_buffer_range_unittest.cc", "command_buffer/tests/gl_native_gmb_backbuffer_unittest.cc", "command_buffer/tests/gl_object_bindings_unittest.cc", + "command_buffer/tests/gl_oob_attrib_unittest.cc", "command_buffer/tests/gl_pointcoord_unittest.cc", "command_buffer/tests/gl_program_unittest.cc", "command_buffer/tests/gl_query_unittest.cc",
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc index 9fb9cc8..c1ffc0a 100644 --- a/gpu/command_buffer/service/program_manager.cc +++ b/gpu/command_buffer/service/program_manager.cc
@@ -225,6 +225,26 @@ return total.ValueOrDefault(std::numeric_limits<GLsizeiptr>::max()); } +size_t LocationCountForAttribType(GLenum type) { + switch (type) { + case GL_FLOAT_MAT2: + case GL_FLOAT_MAT2x3: + case GL_FLOAT_MAT2x4: + return 2; + case GL_FLOAT_MAT3x2: + case GL_FLOAT_MAT3: + case GL_FLOAT_MAT3x4: + return 3; + break; + case GL_FLOAT_MAT4x2: + case GL_FLOAT_MAT4x3: + case GL_FLOAT_MAT4: + return 4; + default: + return 1; + } +} + } // anonymous namespace. Program::UniformInfo::UniformInfo() @@ -457,16 +477,21 @@ void Program::UpdateVertexInputBaseTypes() { ClearVertexInputMasks(); - DCHECK_LE(attrib_infos_.size(), manager_->max_vertex_attribs()); for (size_t ii = 0; ii < attrib_infos_.size(); ++ii) { const VertexAttrib& input = attrib_infos_[ii]; if (ProgramManager::HasBuiltInPrefix(input.name)) { continue; } - int shift_bits = (input.location % 16) * 2; - vertex_input_active_mask_[ii / 16] |= 0x3 << shift_bits; - vertex_input_base_type_mask_[ii / 16] |= - InputOutputTypeToBaseType(true, input.type) << shift_bits; + + DCHECK_LE(input.location + input.location_count, + manager_->max_vertex_attribs()); + for (size_t location = input.location; + location < input.location + input.location_count; ++location) { + int shift_bits = (location % 16) * 2; + vertex_input_active_mask_[location / 16] |= 0x3 << shift_bits; + vertex_input_base_type_mask_[location / 16] |= + InputOutputTypeToBaseType(true, input.type) << shift_bits; + } } } @@ -706,7 +731,7 @@ uniforms_cleared_ = false; GLint num_attribs = 0; GLint max_len = 0; - GLint max_location = -1; + size_t num_locations = 0; glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTES, &num_attribs); glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_len); // TODO(gman): Should we check for error? @@ -721,26 +746,25 @@ DCHECK(length == 0 || name_buffer[length] == '\0'); std::string original_name; GetVertexAttribData(name_buffer.get(), &original_name, &type); + size_t location_count = size * LocationCountForAttribType(type); // TODO(gman): Should we check for error? GLint location = glGetAttribLocation(service_id_, name_buffer.get()); - if (location > max_location) { - max_location = location; - } - attrib_infos_.push_back(VertexAttrib(1, type, original_name, location)); + num_locations = std::max(num_locations, location + location_count); + attrib_infos_.push_back( + VertexAttrib(1, type, original_name, location, location_count)); max_attrib_name_length_ = std::max( max_attrib_name_length_, static_cast<GLsizei>(original_name.size())); } // Create attrib location to index map. - attrib_location_to_index_map_.resize(max_location + 1); - for (GLint ii = 0; ii <= max_location; ++ii) { - attrib_location_to_index_map_[ii] = -1; - } + attrib_location_to_index_map_.resize(num_locations, -1); for (size_t ii = 0; ii < attrib_infos_.size(); ++ii) { const VertexAttrib& info = attrib_infos_[ii]; - if (info.location >= 0 && info.location <= max_location) { - attrib_location_to_index_map_[info.location] = ii; - } + if (info.location < 0) + continue; + DCHECK_LE(info.location + info.location_count, num_locations); + for (size_t j = 0; j < info.location_count; ++j) + attrib_location_to_index_map_[info.location + j] = ii; } if (manager_->gpu_preferences_.enable_gpu_service_logging_gpu) { @@ -1864,20 +1888,7 @@ } } if (attrib) { - size_t num_of_locations = 1; - switch (attrib->type) { - case GL_FLOAT_MAT2: - num_of_locations = 2; - break; - case GL_FLOAT_MAT3: - num_of_locations = 3; - break; - case GL_FLOAT_MAT4: - num_of_locations = 4; - break; - default: - break; - } + size_t num_of_locations = LocationCountForAttribType(attrib->type); for (size_t ii = 0; ii < num_of_locations; ++ii) { GLint loc = key_value.second + ii; auto result = location_binding_used.insert(loc);
diff --git a/gpu/command_buffer/service/program_manager.h b/gpu/command_buffer/service/program_manager.h index 74bb256..a3b8e64 100644 --- a/gpu/command_buffer/service/program_manager.h +++ b/gpu/command_buffer/service/program_manager.h
@@ -133,16 +133,20 @@ std::vector<GLuint> texture_units; }; struct VertexAttrib { - VertexAttrib(GLsizei _size, GLenum _type, const std::string& _name, - GLint _location) - : size(_size), - type(_type), - location(_location), - name(_name) { - } + VertexAttrib(GLsizei size, + GLenum type, + const std::string& name, + GLint location, + size_t location_count) + : size(size), + type(type), + location(location), + location_count(location_count), + name(name) {} GLsizei size; GLenum type; GLint location; + size_t location_count; std::string name; }; struct UniformBlockSizeInfo {
diff --git a/gpu/command_buffer/service/program_manager_unittest.cc b/gpu/command_buffer/service/program_manager_unittest.cc index 154bf9d..e0269249 100644 --- a/gpu/command_buffer/service/program_manager_unittest.cc +++ b/gpu/command_buffer/service/program_manager_unittest.cc
@@ -187,19 +187,24 @@ static const char* kAttrib1Name; static const char* kAttrib2Name; static const char* kAttrib3Name; + static const char* kAttrib4Name; static const GLint kAttrib1Size = 1; static const GLint kAttrib2Size = 1; static const GLint kAttrib3Size = 1; + static const GLint kAttrib4Size = 1; static const GLenum kAttrib1Precision = GL_MEDIUM_FLOAT; static const GLenum kAttrib2Precision = GL_HIGH_FLOAT; - static const GLenum kAttrib3Precision = GL_LOW_FLOAT; + static const GLenum kAttrib3Precision = GL_LOW_INT; + static const GLenum kAttrib4Precision = GL_HIGH_FLOAT; static const bool kAttribStaticUse = true; static const GLint kAttrib1Location = 0; static const GLint kAttrib2Location = 1; static const GLint kAttrib3Location = 2; + static const GLint kAttrib4Location = 3; static const GLenum kAttrib1Type = GL_FLOAT_VEC4; static const GLenum kAttrib2Type = GL_FLOAT_VEC2; - static const GLenum kAttrib3Type = GL_FLOAT_VEC3; + static const GLenum kAttrib3Type = GL_INT_VEC3; + static const GLenum kAttrib4Type = GL_FLOAT_MAT3x2; static const GLint kInvalidAttribLocation = 30; static const GLint kBadAttribIndex = kNumVertexAttribs; @@ -459,9 +464,18 @@ ProgramManagerWithShaderTest::AttribInfo ProgramManagerWithShaderTest::kAttribs[] = { - { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, - { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, }, - { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, + { + kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, + }, + { + kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, + }, + { + kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, + }, + { + kAttrib4Name, kAttrib4Size, kAttrib4Type, kAttrib4Location, + }, }; // GCC requires these declarations, but MSVC requires they not be present @@ -476,12 +490,15 @@ const GLint ProgramManagerWithShaderTest::kAttrib1Size; const GLint ProgramManagerWithShaderTest::kAttrib2Size; const GLint ProgramManagerWithShaderTest::kAttrib3Size; +const GLint ProgramManagerWithShaderTest::kAttrib4Size; const GLint ProgramManagerWithShaderTest::kAttrib1Location; const GLint ProgramManagerWithShaderTest::kAttrib2Location; const GLint ProgramManagerWithShaderTest::kAttrib3Location; +const GLint ProgramManagerWithShaderTest::kAttrib4Location; const GLenum ProgramManagerWithShaderTest::kAttrib1Type; const GLenum ProgramManagerWithShaderTest::kAttrib2Type; const GLenum ProgramManagerWithShaderTest::kAttrib3Type; +const GLenum ProgramManagerWithShaderTest::kAttrib4Type; const GLint ProgramManagerWithShaderTest::kInvalidAttribLocation; const GLint ProgramManagerWithShaderTest::kBadAttribIndex; const GLint ProgramManagerWithShaderTest::kUniform1Size; @@ -540,6 +557,7 @@ const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1"; const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2"; const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3"; +const char* ProgramManagerWithShaderTest::kAttrib4Name = "attrib4"; const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1"; const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2"; const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex = @@ -580,6 +598,31 @@ EXPECT_TRUE(program->GetAttribInfo(kInvalidIndex) == NULL); } +TEST_F(ProgramManagerWithShaderTest, GetAttribInfoByLocation) { + const GLint kInvalidLocation = 1000; + const Program* program = SetupDefaultProgram(); + ASSERT_TRUE(program != NULL); + + // attrib2 is a vec2, takes 1 location + const Program::VertexAttrib* expected_info = program->GetAttribInfo(1); + EXPECT_EQ(1u, expected_info->location_count); + const Program::VertexAttrib* info = + program->GetAttribInfoByLocation(kAttrib2Location); + EXPECT_EQ(expected_info, info); + + // attrib4 is a mat3x2, takes 3 locations (1 per column) + expected_info = program->GetAttribInfo(3); + EXPECT_EQ(3u, expected_info->location_count); + info = program->GetAttribInfoByLocation(kAttrib4Location); + EXPECT_EQ(expected_info, info); + info = program->GetAttribInfoByLocation(kAttrib4Location + 1); + EXPECT_EQ(expected_info, info); + info = program->GetAttribInfoByLocation(kAttrib4Location + 2); + EXPECT_EQ(expected_info, info); + + EXPECT_TRUE(program->GetAttribInfoByLocation(kInvalidLocation) == NULL); +} + TEST_F(ProgramManagerWithShaderTest, GetAttribLocation) { const char* kInvalidName = "foo"; const Program* program = SetupDefaultProgram(); @@ -588,6 +631,27 @@ EXPECT_EQ(-1, program->GetAttribLocation(kInvalidName)); } +TEST_F(ProgramManagerWithShaderTest, VertexArrayMasks) { + const Program* program = SetupDefaultProgram(); + ASSERT_TRUE(program != NULL); + + std::vector<uint32_t> active_mask = program->vertex_input_active_mask(); + ASSERT_EQ(1u, active_mask.size()); + uint32_t expected = 0x3 << 0 | // attrib1 + 0x3 << 2 | // attrib2 + 0x3 << 4 | // attrib3 + (0x3 * 0b010101) << 6; // attrib4 + EXPECT_EQ(expected, active_mask[0]); + + std::vector<uint32_t> base_type_mask = program->vertex_input_base_type_mask(); + ASSERT_EQ(1u, base_type_mask.size()); + expected = SHADER_VARIABLE_FLOAT << 0 | // attrib1 + SHADER_VARIABLE_FLOAT << 2 | // attrib2 + SHADER_VARIABLE_INT << 4 | // attrib3 + (SHADER_VARIABLE_FLOAT * 0b010101) << 6; // attrib4 + EXPECT_EQ(expected, base_type_mask[0]); +} + TEST_F(ProgramManagerWithShaderTest, GetUniformInfo) { const GLint kInvalidIndex = 1000; const Program* program = SetupDefaultProgram(); @@ -770,7 +834,7 @@ program->Link(NULL, Program::kCountOnlyStaticallyUsed, this); GLint value = 0; program->GetProgramiv(GL_ACTIVE_ATTRIBUTES, &value); - EXPECT_EQ(3, value); + EXPECT_EQ(4, value); // Check that we didn't skip the "gl_" uniform. program->GetProgramiv(GL_ACTIVE_UNIFORMS, &value); EXPECT_EQ(3, value);
diff --git a/gpu/command_buffer/tests/gl_oob_attrib_unittest.cc b/gpu/command_buffer/tests/gl_oob_attrib_unittest.cc new file mode 100644 index 0000000..d4c050f5 --- /dev/null +++ b/gpu/command_buffer/tests/gl_oob_attrib_unittest.cc
@@ -0,0 +1,86 @@ +// Copyright 2017 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 <GLES2/gl2.h> +#include <GLES2/gl2ext.h> +#include <stdint.h> + +#include "gpu/command_buffer/tests/gl_manager.h" +#include "gpu/command_buffer/tests/gl_test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace gpu { + +namespace { + +class GLOOBAttribTest : public testing::Test { + protected: + void SetUp() override { gl_.Initialize(GLManager::Options()); } + void TearDown() override { gl_.Destroy(); } + GLManager gl_; +}; + +// Tests that enabling a vertex array for a location that matches any column of +// a matrix attribute correctly triggers out-of-bounds checks. +TEST_F(GLOOBAttribTest, DrawUsingOOBMatrixAttrib) { + const char kVertexShader[] = + "attribute mat3 attrib;\n" + "varying vec4 color;\n" + "void main () {\n" + " color = vec4(1.0,\n" + " attrib[0][0] + attrib[0][1] + attrib[0][2] +\n" + " attrib[1][0] + attrib[1][1] + attrib[1][2] +\n" + " attrib[2][0] + attrib[2][1] + attrib[2][2],\n" + " 1.0,\n" + " 1.0);\n" + "}\n"; + const char kFragmentShader[] = + "precision mediump float;\n" + "varying vec4 color;\n" + "void main() {\n" + " gl_FragColor = color;\n" + "}\n"; + + GLuint program = GLTestHelper::LoadProgram(kVertexShader, kFragmentShader); + DCHECK(program); + glUseProgram(program); + GLuint vbo; + glGenBuffers(1, &vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, 16, nullptr, GL_STATIC_DRAW); + GLint location = glGetAttribLocation(program, "attrib"); + EXPECT_GE(0, location); + + // All attribs disabled - no error. + glDrawArrays(GL_TRIANGLES, 0, 1000); + GLenum expected = GL_NO_ERROR; + EXPECT_EQ(expected, glGetError()); + + for (int i = 0; i < 3; ++i) { + // Enable any of the valid locations for the attribute, should raise an + // error if trying to access attributes out-of-bounds. + glVertexAttribPointer(location + i, 4, GL_UNSIGNED_BYTE, false, 0, nullptr); + glEnableVertexAttribArray(location + i); + glDrawArrays(GL_TRIANGLES, 0, 1000); + expected = GL_INVALID_OPERATION; + EXPECT_EQ(expected, glGetError()); + + // But in-bounds should pass. + glDrawArrays(GL_TRIANGLES, 0, 3); + expected = GL_NO_ERROR; + EXPECT_EQ(expected, glGetError()); + glDisableVertexAttribArray(location + i); + } + + // Enable an unused location, should not trigger out-of-bounds checks. + glVertexAttribPointer(location + 3, 4, GL_UNSIGNED_BYTE, false, 0, nullptr); + glEnableVertexAttribArray(location + 3); + glDrawArrays(GL_TRIANGLES, 0, 1000); + expected = GL_NO_ERROR; + EXPECT_EQ(expected, glGetError()); +} + +} // anonymous namespace + +} // namespace gpu
diff --git a/headless/OWNERS b/headless/OWNERS index f8f1df65..e96cb2c 100644 --- a/headless/OWNERS +++ b/headless/OWNERS
@@ -2,6 +2,10 @@ alexclarke@chromium.org altimin@chromium.org eseckler@chromium.org +dvallet@chromium.org +irisu@chromium.org +jzfeng@chromium.org +rvera@chromium.org # TEAM: headless-dev@chromium.org # COMPONENT: Internals>Headless
diff --git a/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm b/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm index 115c6ff..ba09317 100644 --- a/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm +++ b/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm
@@ -6,6 +6,8 @@ #import <WebKit/WebKit.h> +#include <stdint.h> + #include <memory> #include "base/bind.h" @@ -39,7 +41,7 @@ namespace { // Empty callback used by DeleteAllCreatedBetweenAsync below. -void DoNothing(int n) {} +void DoNothing(uint32_t n) {} } @interface BrowsingDataRemovalController ()
diff --git a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h index 643c1db..979d8bf08 100644 --- a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h +++ b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_BROWSING_DATA_IOS_CHROME_BROWSING_DATA_REMOVER_H_ #define IOS_CHROME_BROWSER_BROWSING_DATA_IOS_CHROME_BROWSING_DATA_REMOVER_H_ +#include <stdint.h> + #include <memory> #include <set> @@ -189,7 +191,7 @@ void OnClearedPasswords(); // Callback for when Cookies has been deleted. Invokes NotifyAndDeleteIfDone. - void OnClearedCookies(int num_deleted); + void OnClearedCookies(uint32_t num_deleted); // Invoked on the IO thread to delete cookies. void ClearCookiesOnIOThread(
diff --git a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm index a9f0d06..19ae87a 100644 --- a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm +++ b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm
@@ -447,7 +447,7 @@ NotifyAndDeleteIfDone(); } -void IOSChromeBrowsingDataRemover::OnClearedCookies(int num_deleted) { +void IOSChromeBrowsingDataRemover::OnClearedCookies(uint32_t num_deleted) { if (!WebThread::CurrentlyOn(WebThread::UI)) { WebThread::PostTask( WebThread::UI, FROM_HERE,
diff --git a/ios/chrome/browser/chrome_url_constants.cc b/ios/chrome/browser/chrome_url_constants.cc index b23d0ff..e4268bd 100644 --- a/ios/chrome/browser/chrome_url_constants.cc +++ b/ios/chrome/browser/chrome_url_constants.cc
@@ -20,8 +20,6 @@ const char kChromeUINTPTilesInternalsURL[] = "chrome://ntp-tiles-internals/"; const char kChromeUIOfflineURL[] = "chrome://offline/"; const char kChromeUIPhysicalWebURL[] = "chrome://physical-web/"; -const char kChromeUIPopularSitesInternalsURL[] = - "chrome://popular-sites-internals/"; const char kChromeUISettingsURL[] = "chrome://settings/"; const char kChromeUITermsURL[] = "chrome://terms/"; const char kChromeUIVersionURL[] = "chrome://version/"; @@ -44,7 +42,6 @@ const char kChromeUIOfflineHost[] = "offline"; const char kChromeUIOmahaHost[] = "omaha"; const char kChromeUIPhysicalWebHost[] = "physical-web"; -const char kChromeUIPopularSitesInternalsHost[] = "popular-sites-internals"; const char kChromeUIPolicyHost[] = "policy"; const char kChromeUISignInInternalsHost[] = "signin-internals"; const char kChromeUISyncInternalsHost[] = "sync-internals"; @@ -60,8 +57,8 @@ kChromeUIHistogramHost, kChromeUINetExportHost, kChromeUINewTabHost, kChromeUINTPTilesInternalsHost, kChromeUISignInInternalsHost, kChromeUISyncInternalsHost, - kChromeUIPhysicalWebHost, kChromeUIPopularSitesInternalsHost, - kChromeUITermsHost, kChromeUIVersionHost, + kChromeUIPhysicalWebHost, kChromeUITermsHost, + kChromeUIVersionHost, }; const size_t kNumberOfChromeHostURLs = arraysize(kChromeHostURLs);
diff --git a/ios/chrome/browser/google/google_logo_service.mm b/ios/chrome/browser/google/google_logo_service.mm index 1d58dfe..3a93491 100644 --- a/ios/chrome/browser/google/google_logo_service.mm +++ b/ios/chrome/browser/google/google_logo_service.mm
@@ -27,7 +27,6 @@ namespace { -const char kGoogleDoodleURLPath[] = "async/newtab_mobile"; static NSArray* const kDoodleCacheDirectory = @[ @"Chromium", @"Doodle" ]; // Cache directory for doodle. @@ -42,21 +41,6 @@ base::SysNSStringToUTF8([NSString pathWithComponents:path_components])); } -// Returns the URL where the doodle can be downloaded, e.g. -// https://www.google.com/async/newtab_mobile. This depends on the user's -// Google domain. -GURL GetGoogleDoodleURL(ios::ChromeBrowserState* browser_state) { - GURL google_base_url( - ios::UIThreadSearchTermsData(browser_state).GoogleBaseURLValue()); - // SetPathStr() requires its argument to stay in scope as long as - // |replacements| is, so a std::string is needed, instead of a char*. - std::string path = kGoogleDoodleURLPath; - GURL::Replacements replacements; - replacements.SetPathStr(path); - - return google_base_url.ReplaceComponents(replacements); -} - class IOSChromeLogoDelegate : public search_provider_logos::LogoDelegate { public: IOSChromeLogoDelegate() {} @@ -103,11 +87,15 @@ base::MakeUnique<IOSChromeLogoDelegate>()); } + GURL google_base_url( + ios::UIThreadSearchTermsData(browser_state_).GoogleBaseURLValue()); + logo_tracker_->SetServerAPI( - GetGoogleDoodleURL(browser_state_), - base::Bind(&search_provider_logos::GoogleParseLogoResponse), - base::Bind(&search_provider_logos::GoogleAppendQueryparamsToLogoURL, - false /* gray_background */)); + search_provider_logos::GetGoogleDoodleURL(google_base_url), + search_provider_logos::GetGoogleParseLogoResponseCallback( + google_base_url), + search_provider_logos::GetGoogleAppendQueryparamsCallback( + /*gray_background=*/false)); logo_tracker_->GetLogo(observer); }
diff --git a/ios/chrome/browser/net/cookie_util.mm b/ios/chrome/browser/net/cookie_util.mm index 48a2187..2b513cd4 100644 --- a/ios/chrome/browser/net/cookie_util.mm +++ b/ios/chrome/browser/net/cookie_util.mm
@@ -6,6 +6,7 @@ #import <Foundation/Foundation.h> #include <stddef.h> +#include <stdint.h> #include <sys/sysctl.h> #include "base/logging.h" @@ -34,7 +35,7 @@ NSString* const kLastCookieDeletionDate = @"LastCookieDeletionDate"; // Empty callback. -void DoNothing(int n) {} +void DoNothing(uint32_t n) {} // Creates a SQLitePersistentCookieStore running on a background thread. scoped_refptr<net::SQLitePersistentCookieStore> CreatePersistentCookieStore(
diff --git a/ios/chrome/browser/payments/BUILD.gn b/ios/chrome/browser/payments/BUILD.gn index 33bd463..a57b8fa 100644 --- a/ios/chrome/browser/payments/BUILD.gn +++ b/ios/chrome/browser/payments/BUILD.gn
@@ -9,6 +9,8 @@ sources = [ "ios_can_make_payment_query_factory.cc", "ios_can_make_payment_query_factory.h", + "itunes_json_request.cc", + "itunes_json_request.h", "payment_request.h", "payment_request.mm", "payment_request_util.h", @@ -27,7 +29,9 @@ "//ios/chrome/browser/browser_state", "//ios/chrome/browser/signin", "//ios/web", + "//net", "//ui/base", + "//url", ] libs = [ "UIKit.framework" ] }
diff --git a/ios/chrome/browser/payments/itunes_json_request.cc b/ios/chrome/browser/payments/itunes_json_request.cc new file mode 100644 index 0000000..ef7904b --- /dev/null +++ b/ios/chrome/browser/payments/itunes_json_request.cc
@@ -0,0 +1,117 @@ +// Copyright 2017 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 "ios/chrome/browser/payments/itunes_json_request.h" + +#include <utility> + +#include "base/bind.h" +#include "base/json/json_reader.h" +#include "base/memory/ptr_util.h" +#include "base/values.h" +#include "net/base/load_flags.h" +#include "net/http/http_status_code.h" +#include "net/url_request/url_fetcher.h" +#include "net/url_request/url_request_status.h" +#include "url/gurl.h" + +namespace payment_request_util { + +const char kBadResponse[] = "Bad iTunes Store search response"; +const char kITunesStoreLookupPrefix[] = "https://itunes.apple.com/lookup?"; +const char kITunesStoreSearchPrefix[] = "https://itunes.apple.com/search?"; + +ITunesJsonRequest::ITunesJsonRequest( + const Callback& callback, + net::URLRequestContextGetter* context_getter) + : callback_(callback), + context_getter_(context_getter), + weak_factory_(this) { + DCHECK(!callback_.is_null()); +} + +ITunesJsonRequest::~ITunesJsonRequest() {} + +void ITunesJsonRequest::Start(ITunesStoreRequestType request_type, + const std::string& request_query) { + Stop(); + + std::string complete_query; + switch (request_type) { + case LOOKUP: + complete_query = kITunesStoreLookupPrefix + request_query; + case SEARCH: + complete_query = kITunesStoreSearchPrefix + request_query; + } + + fetcher_ = + net::URLFetcher::Create(GURL(complete_query), net::URLFetcher::GET, this); + fetcher_->SetRequestContext(context_getter_); + fetcher_->SetLoadFlags(net::LOAD_MAYBE_USER_GESTURE | + net::LOAD_DO_NOT_SAVE_COOKIES | + net::LOAD_VERIFY_EV_CERT); + fetcher_->Start(); +} + +void ITunesJsonRequest::Stop() { + fetcher_.reset(); + weak_factory_.InvalidateWeakPtrs(); +} + +void ITunesJsonRequest::ParseJson( + const std::string& json, + const payment_request_util::ITunesJsonRequest::SuccessCallback& + success_callback, + const payment_request_util::ITunesJsonRequest::ErrorCallback& + error_callback) { + DCHECK(!success_callback.is_null()); + DCHECK(!error_callback.is_null()); + + base::JSONReader json_reader; + std::unique_ptr<base::Value> value = json_reader.ReadToValue(json); + if (value) { + success_callback.Run(std::move(value)); + } else { + error_callback.Run(json_reader.GetErrorMessage()); + } +} + +void ITunesJsonRequest::OnJsonParseSuccess( + std::unique_ptr<base::Value> parsed_json) { + if (!parsed_json->IsType(base::Value::Type::DICTIONARY)) { + OnJsonParseError(kBadResponse); + return; + } + + callback_.Run(base::WrapUnique( + static_cast<base::DictionaryValue*>(parsed_json.release()))); +} + +void ITunesJsonRequest::OnJsonParseError(const std::string& error) { + callback_.Run(std::unique_ptr<base::DictionaryValue>()); +} + +void ITunesJsonRequest::OnURLFetchComplete(const net::URLFetcher* source) { + CHECK_EQ(fetcher_.get(), source); + + std::unique_ptr<net::URLFetcher> fetcher(std::move(fetcher_)); + + if (!fetcher->GetStatus().is_success() || + fetcher->GetResponseCode() != net::HTTP_OK) { + OnJsonParseError(kBadResponse); + return; + } + + std::string json_data; + fetcher->GetResponseAsString(&json_data); + + // The parser will call us back via one of the callbacks. + ParseJson(json_data, + base::Bind(&ITunesJsonRequest::OnJsonParseSuccess, + weak_factory_.GetWeakPtr()), + base::Bind(&ITunesJsonRequest::OnJsonParseError, + weak_factory_.GetWeakPtr())); +} + +} // namespace payment_request_util
diff --git a/ios/chrome/browser/payments/itunes_json_request.h b/ios/chrome/browser/payments/itunes_json_request.h new file mode 100644 index 0000000..fbae57f --- /dev/null +++ b/ios/chrome/browser/payments/itunes_json_request.h
@@ -0,0 +1,80 @@ +// Copyright 2017 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 IOS_CHROME_BROWSER_PAYMENTS_ITUNES_JSON_REQUEST_H_ +#define IOS_CHROME_BROWSER_PAYMENTS_ITUNES_JSON_REQUEST_H_ + +#include <memory> +#include <string> + +#include "base/callback.h" +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "net/url_request/url_fetcher_delegate.h" + +namespace base { +class DictionaryValue; +class Value; +} // namespace base + +namespace net { +class URLFetcher; +class URLRequestContextGetter; +} // namespace net + +namespace payment_request_util { + +// A class that fetches a JSON formatted response from the iTunes Store using +// the iTunes Search API and a basic JSON parser to parse the response as a +// DictionaryValue. +class ITunesJsonRequest : public net::URLFetcherDelegate { + public: + // Callback to pass back the parsed json dictionary returned from iTunes. + // Invoked with NULL if there is an error. + typedef base::Callback<void(std::unique_ptr<base::DictionaryValue>)> Callback; + + ITunesJsonRequest(const Callback& callback, + net::URLRequestContextGetter* context_getter); + ~ITunesJsonRequest() override; + + // Used to express the type of request. Please view the following for info: + // https://affiliate.itunes.apple.com/resources/documentation/itunes-store-web-service-search-api/ + enum ITunesStoreRequestType { + LOOKUP, + SEARCH, + }; + + // Starts to fetch results for the given |request_type| and |request_query|. + void Start(ITunesStoreRequestType request_type, + const std::string& request_query); + void Stop(); + + private: + // Callbacks for JSON parsing. + typedef base::Callback<void(std::unique_ptr<base::Value> result)> + SuccessCallback; + typedef base::Callback<void(const std::string& error)> ErrorCallback; + + void ParseJson(const std::string& raw_json_string, + const SuccessCallback& success_callback, + const ErrorCallback& error_callback); + + void OnJsonParseSuccess(std::unique_ptr<base::Value> parsed_json); + void OnJsonParseError(const std::string& error); + + // net::URLFetcherDelegate overrides: + void OnURLFetchComplete(const net::URLFetcher* source) override; + + Callback callback_; + net::URLRequestContextGetter* context_getter_; + + std::unique_ptr<net::URLFetcher> fetcher_; + base::WeakPtrFactory<ITunesJsonRequest> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(ITunesJsonRequest); +}; + +} // namespace payment_request_util + +#endif // IOS_CHROME_BROWSER_PAYMENTS_ITUNES_JSON_REQUEST_H_
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn index 8319da47..08ed9ac 100644 --- a/ios/chrome/browser/ui/bookmarks/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -30,6 +30,8 @@ "bookmark_home_primary_view.h", "bookmark_home_tablet_ntp_controller.h", "bookmark_home_tablet_ntp_controller.mm", + "bookmark_home_view_controller.h", + "bookmark_home_view_controller.mm", "bookmark_home_waiting_view.h", "bookmark_home_waiting_view.mm", "bookmark_interaction_controller.h", @@ -147,6 +149,7 @@ testonly = true sources = [ "bookmark_home_handset_view_controller_unittest.mm", + "bookmark_home_view_controller_unittest.mm", "bookmark_ios_unittest.h", "bookmark_ios_unittest.mm", "bookmark_position_cache_unittest.mm",
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.h index 83bd477..2d09e87 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_HANDSET_VIEW_CONTROLLER_H_ #define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_HANDSET_VIEW_CONTROLLER_H_ +#import "ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h" + #import <UIKit/UIKit.h> #include <set> @@ -16,14 +18,9 @@ @protocol UrlLoader; namespace bookmarks { -class BookmarkModel; class BookmarkNode; } // namespace bookmarks -namespace ios { -class ChromeBrowserState; -} // namespace ios - @protocol BookmarkHomeHandsetViewControllerDelegate // The view controller wants to be dismissed. // If |url| != GURL(), then the user has selected |url| for navigation. @@ -33,7 +30,7 @@ @end // Navigate/edit the bookmark hierarchy on a handset. -@interface BookmarkHomeHandsetViewController : UIViewController { +@interface BookmarkHomeHandsetViewController : BookmarkHomeViewController { @protected // The following 2 ivars both represent the set of nodes being edited. // The set is for fast lookup. @@ -43,9 +40,6 @@ std::set<const bookmarks::BookmarkNode*> _editNodes; std::vector<const bookmarks::BookmarkNode*> _editNodesOrdered; } -// Designated initializer. -- (instancetype)initWithLoader:(id<UrlLoader>)loader - browserState:(ios::ChromeBrowserState*)browserState; #pragma mark - Properties Relevant To Presenters @@ -57,9 +51,6 @@ @property(nonatomic, assign, readonly) BOOL editing; // The set of selected index paths for edition. @property(nonatomic, strong, readonly) NSMutableArray* editIndexPaths; -@property(nonatomic, assign, readonly) bookmarks::BookmarkModel* bookmarks; -@property(nonatomic, weak, readonly) id<UrlLoader> loader; -@property(nonatomic, assign, readonly) ios::ChromeBrowserState* browserState; #pragma mark - Relevant Methods // Replaces |_editNodes| and |_editNodesOrdered| with new container objects.
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm index 7a139fb..d642cb6 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm
@@ -45,10 +45,6 @@ using bookmarks::BookmarkNode; -namespace { -const CGFloat kBookmarkMenuWidth = 264; -} // namespace - @interface BookmarkHomeHandsetViewController ()< BookmarkCollectionViewDelegate, BookmarkEditViewControllerDelegate, @@ -74,26 +70,12 @@ // This views holds the primary content of this view controller. @property(nonatomic, strong) UIView* contentView; -// The possible views that can be shown from the menu. -@property(nonatomic, strong) BookmarkCollectionView* folderView; -// This view is created and used if the model is not fully loaded yet by the -// time this controller starts. -@property(nonatomic, strong) BookmarkHomeWaitingView* waitForModelView; -// The menu with all the folders and special entries. -@property(nonatomic, strong) BookmarkMenuView* menuView; -// At any point in time, there is exactly one collection view whose view is part -// of the view hierarchy. This property determine which collection view is -// visible. Not by accident, this property also reflects the selected menu item -// in the BookmarkMenuView. -@property(nonatomic, strong) BookmarkMenuItem* primaryMenuItem; // When the view is first shown on the screen, this property represents the // cached value of the y of the content offset of the primary view. This // property is set to nil after it is used. @property(nonatomic, strong) NSNumber* cachedContentPosition; -// The navigation bar sits on top of the main content. -@property(nonatomic, strong) BookmarkNavigationBar* navigationBar; // The layout code in this class relies on the assumption that the editingBar // has the same frame as the navigationBar. @property(nonatomic, strong) BookmarkEditingBar* editingBar; @@ -109,25 +91,15 @@ @property(nonatomic, strong) BookmarkFolderEditorViewController* folderEditor; #pragma mark Specific to this class. -// The panel view slides on top of the content to display the menu. -@property(nonatomic, strong) BookmarkPanelView* panelView; - -// Either the menu or the primaryView can scrollToTop. -@property(nonatomic, assign) BOOL scrollingMenuToTop; // The controller managing the display of the promo cell and the promo view // controller. @property(nonatomic, strong) BookmarkPromoController* bookmarkPromoController; #pragma mark View loading and switching -// This method is called if the view needs to be loaded and the model is not -// ready yet. -- (void)loadWaitingView; // This method should be called at most once in the life-cycle of the // class. It should be called at the soonest possible time after the // view has been loaded, and the bookmark model is loaded. - (void)loadBookmarkViews; -// If the view doesn't exist, create it. -- (void)ensureFolderViewExists; // Updates the property 'primaryMenuItem'. // Updates the UI to reflect the new state of 'primaryMenuItem'. - (void)updatePrimaryMenuItem:(BookmarkMenuItem*)menuItem @@ -201,9 +173,6 @@ - (void)navigationBarBack:(id)sender; #pragma mark private methods -// The active collection view that corresponds to primaryMenuItem. -// This must be implemented by subclass. -- (UIView<BookmarkHomePrimaryView>*)primaryView; // Returns the size of the primary view. - (CGRect)frameForPrimaryView; // Updates the UI to reflect the given orientation, with an animation lasting @@ -223,13 +192,8 @@ @implementation BookmarkHomeHandsetViewController @synthesize contentView = _contentView; -@synthesize folderView = _folderView; -@synthesize waitForModelView = _waitForModelView; -@synthesize menuView = _menuView; -@synthesize primaryMenuItem = _primaryMenuItem; @synthesize cachedContentPosition = _cachedContentPosition; -@synthesize navigationBar = _navigationBar; @synthesize editingBar = _editingBar; @synthesize actionSheetCoordinator = _actionSheetCoordinator; @@ -237,26 +201,16 @@ @synthesize folderSelector = _folderSelector; @synthesize folderEditor = _folderEditor; -@synthesize panelView = _panelView; -@synthesize scrollingMenuToTop = _scrollingMenuToTop; @synthesize bookmarkPromoController = _bookmarkPromoController; @synthesize delegate = _delegate; @synthesize editIndexPaths = _editIndexPaths; @synthesize editing = _editing; -@synthesize bookmarks = _bookmarks; -@synthesize loader = _loader; -@synthesize browserState = _browserState; - (instancetype)initWithLoader:(id<UrlLoader>)loader browserState:(ios::ChromeBrowserState*)browserState { - DCHECK(browserState); - self = [super initWithNibName:nil bundle:nil]; + self = [super initWithLoader:loader browserState:browserState]; if (self) { - _browserState = browserState->GetOriginalChromeBrowserState(); - _loader = loader; - - _bookmarks = ios::BookmarkModelFactory::GetForBrowserState(_browserState); _editIndexPaths = [[NSMutableArray alloc] init]; [self resetEditNodes]; @@ -272,19 +226,8 @@ } - (void)dealloc { - _folderView.delegate = nil; - - _menuView.delegate = nil; - _editViewController.delegate = nil; _folderSelector.delegate = nil; - - _panelView.delegate = nil; -} - -- (void)loadView { - CGRect frame = [[UIScreen mainScreen] bounds]; - self.view = [[UIView alloc] initWithFrame:frame]; } - (void)resetEditNodes { @@ -343,9 +286,7 @@ - (void)viewDidLoad { [super viewDidLoad]; - BookmarkNavigationBar* bar = - [[BookmarkNavigationBar alloc] initWithFrame:[self navigationBarFrame]]; - self.navigationBar = bar; + self.navigationBar.frame = [self navigationBarFrame]; [self.navigationBar setEditTarget:self action:@selector(navigationBarWantsEditing:)]; [self.navigationBar setMenuTarget:self @@ -376,27 +317,15 @@ #pragma mark - Methods duplicated from BookmarkHomeTabletNTPController. -- (void)loadWaitingView { - DCHECK(!self.waitForModelView); - DCHECK([self isViewLoaded]); - - // Present a waiting view. - BookmarkHomeWaitingView* waitingView = - [[BookmarkHomeWaitingView alloc] initWithFrame:self.view.bounds]; - self.waitForModelView = waitingView; - [self.view addSubview:self.waitForModelView]; - [self.waitForModelView startWaiting]; -} - - (void)loadBookmarkViews { + [super loadBookmarkViews]; DCHECK(self.bookmarks->loaded()); DCHECK([self isViewLoaded]); - self.panelView = - [[BookmarkPanelView alloc] initWithFrame:[self frameForPrimaryView] - menuViewWidth:kBookmarkMenuWidth]; - self.panelView.autoresizingMask = - UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + self.folderView.delegate = self; + [self.folderView setFrame:[self frameForPrimaryView]]; + + [self.panelView setFrame:[self frameForPrimaryView]]; self.panelView.delegate = self; [self.view insertSubview:self.panelView atIndex:0]; @@ -406,15 +335,8 @@ UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.panelView.contentView addSubview:self.contentView]; - // The user can swipe the BookmarkPanelView to show the menuView. - // Therefore, it must be created here. - self.menuView = [[BookmarkMenuView alloc] - initWithBrowserState:self.browserState - frame:self.panelView.menuView.bounds]; self.menuView.delegate = self; [self.panelView.menuView addSubview:self.menuView]; - self.menuView.autoresizingMask = - UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; // Load the last primary menu item which the user had active. BookmarkMenuItem* item = nil; @@ -439,55 +361,21 @@ } } -- (void)ensureFolderViewExists { - if (self.folderView) - return; - - BookmarkCollectionView* view = [[BookmarkCollectionView alloc] - initWithBrowserState:self.browserState - frame:[self frameForPrimaryView]]; - self.folderView = view; - self.folderView.delegate = self; - [self.folderView setEditing:self.editing animated:NO]; - self.folderView.autoresizingMask = - UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; -} - - (void)updatePrimaryMenuItem:(BookmarkMenuItem*)menuItem animated:(BOOL)animated { - DCHECK(menuItem.type == bookmarks::MenuItemFolder); - if ([self.primaryMenuItem isEqual:menuItem]) - return; + [super updatePrimaryMenuItem:menuItem]; // Disable editing on previous primary view before dismissing it. No need to // animate because this view is immediately removed from hierarchy. if ([[self primaryMenuItem] supportsEditing]) [self.primaryView setEditing:NO animated:NO]; - [[self primaryView] removeFromSuperview]; - self.primaryMenuItem = menuItem; - - [self ensureFolderViewExists]; - [self.folderView resetFolder:self.primaryMenuItem.folder]; - [self.folderView promoStateChangedAnimated:NO]; - UIView* primaryView = [self primaryView]; - [[self primaryView] changeOrientation:GetInterfaceOrientation()]; - [[self primaryView] setScrollsToTop:!self.scrollingMenuToTop]; - [self.contentView insertSubview:primaryView atIndex:0]; primaryView.frame = self.contentView.bounds; [self updateNavigationBarAnimated:animated orientation:GetInterfaceOrientation()]; - - [self.menuView updatePrimaryMenuItem:self.primaryMenuItem]; -} - -- (UIView<BookmarkHomePrimaryView>*)primaryView { - if (self.primaryMenuItem.type == bookmarks::MenuItemFolder) - return self.folderView; - return nil; } #pragma mark - Editing bar methods. @@ -1023,7 +911,7 @@ - (void)showMenuAnimated:(BOOL)animated { [self.menuView setScrollsToTop:YES]; [[self primaryView] setScrollsToTop:NO]; - self.scrollingMenuToTop = YES; + self.scrollToTop = YES; [self.panelView showMenuAnimated:animated]; [self updateNavigationBarAnimated:animated orientation:GetInterfaceOrientation()]; @@ -1032,7 +920,7 @@ - (void)hideMenuAnimated:(BOOL)animated updateNavigationBar:(BOOL)update { [self.menuView setScrollsToTop:NO]; [[self primaryView] setScrollsToTop:YES]; - self.scrollingMenuToTop = NO; + self.scrollToTop = NO; [self.panelView hideMenuAnimated:animated]; if (update) { UIInterfaceOrientation orient = GetInterfaceOrientation(); @@ -1053,11 +941,11 @@ if (showMenu) { [self.menuView setScrollsToTop:YES]; [[self primaryView] setScrollsToTop:NO]; - self.scrollingMenuToTop = YES; + self.scrollToTop = YES; } else { [self.menuView setScrollsToTop:NO]; [[self primaryView] setScrollsToTop:YES]; - self.scrollingMenuToTop = NO; + self.scrollToTop = NO; } if ([self shouldShowEditButtonWithMenuVisibility:showMenu])
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.h index 5ba0323e..615bf17 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.h
@@ -5,20 +5,15 @@ #ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_TABLET_NTP_CONTROLLER_H_ #define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_TABLET_NTP_CONTROLLER_H_ +#import "ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_panel_protocol.h" @protocol UrlLoader; -namespace ios { -class ChromeBrowserState; -} // namespace ios - // Navigate/edit the bookmark hierarchy on tablet, from the New Tab Page (NTP). @interface BookmarkHomeTabletNTPController - : UIViewController<NewTabPagePanelProtocol> -// Designated initializer. -- (instancetype)initWithLoader:(id<UrlLoader>)loader - browserState:(ios::ChromeBrowserState*)browserState; + : BookmarkHomeViewController<NewTabPagePanelProtocol> + @end #endif // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_TABLET_NTP_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.mm index e2f6e0a..f7d4eba 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.mm
@@ -50,30 +50,10 @@ using bookmarks::BookmarkNode; namespace { -// The width of the bookmark menu, displaying the different sections. -const CGFloat kMenuWidth = 264.0; // The margin on top to the navigation bar. const CGFloat kNavigationBarTopMargin = 8.0; } // namespace -// A simple UIView subclass to pass on relayout information to its delegate. -@protocol ContentViewDelegate<NSObject> -- (void)willLayoutSubviews; -@end - -@interface ContentView : UIView -@property(nonatomic, weak) id<ContentViewDelegate> delegate; -@end - -@implementation ContentView -@synthesize delegate = _delegate; - -- (void)layoutSubviews { - [self.delegate willLayoutSubviews]; - [super layoutSubviews]; -} -@end - @interface BookmarkHomeTabletNTPController ()< BookmarkCollectionViewDelegate, BookmarkEditViewControllerDelegate, @@ -81,12 +61,9 @@ BookmarkFolderViewControllerDelegate, BookmarkMenuViewDelegate, BookmarkModelBridgeObserver, - BookmarkPromoControllerDelegate, - ContentViewDelegate> { + BookmarkPromoControllerDelegate> { // Bridge to register for bookmark changes. std::unique_ptr<bookmarks::BookmarkModelBridge> _bridge; - ios::ChromeBrowserState* _browserState; // Weak. - __weak id<UrlLoader> _loader; // The following 2 ivars both represent the set of nodes being edited. // The set is for fast lookup. @@ -97,19 +74,12 @@ std::vector<const BookmarkNode*> _editNodesOrdered; } -@property(nonatomic, strong) BookmarkPanelView* panelView; - #pragma mark - Properties and methods akin to BookmarkHomeHandsetViewController // Whether the view controller is in editing mode. @property(nonatomic, assign) BOOL editing; // The set of edited index paths. @property(nonatomic, strong) NSMutableArray* editIndexPaths; -// The bookmark model used. -@property(nonatomic, assign, readonly) bookmarks::BookmarkModel* bookmarks; -// The user's browser state model used. -@property(nonatomic, assign, readonly) - ios::ChromeBrowserState* browserState; // from superclass. // Replaces |_editNodes| and |_editNodesOrdered| with new container objects. - (void)resetEditNodes; @@ -123,31 +93,12 @@ - (void)setEditing:(BOOL)editing animated:(BOOL)animated; #pragma mark - Properties and methods akin to BookmarkHomeHandsetViewController - -// This views holds the primary content of this controller. -@property(nonatomic, readwrite, strong) ContentView* view; - -// The possible views that can be shown from the menu. -@property(nonatomic, strong) BookmarkCollectionView* folderView; -// This view is created and used if the model is not fully loaded yet by the -// time this controller starts. -@property(nonatomic, strong) BookmarkHomeWaitingView* waitForModelView; - -// The menu with all the folders and special entries. -@property(nonatomic, strong) BookmarkMenuView* menuView; -// At any point in time, there is exactly one collection view whose view is part -// of the view hierarchy. This property determines which collection view is -// visible. Not by accident, this property also reflects the selected menu item -// in the BookmarkMenuView. -@property(nonatomic, strong) BookmarkMenuItem* primaryMenuItem; // When the view is first shown on the screen, this property represents the // cached value of the y of the content offset of the primary view. This // property is set to nil after it is used. @property(nonatomic, strong) NSNumber* cachedContentPosition; // FIXME: INACTIVE -// The navigation bar sits on top of the main content. -@property(nonatomic, strong) BookmarkNavigationBar* navigationBar; // The editing bar present when items are selected. @property(nonatomic, strong) BookmarkEditingBar* editingBar; @@ -167,31 +118,19 @@ #pragma mark Specific to this class. -// Either the menu or the primaryView can scrollToTop. -@property(nonatomic, assign) BOOL scrollToTop; - // Opens the url. - (void)loadURL:(const GURL&)url; #pragma mark View loading, laying out, and switching. -// This method is called if the view needs to be loaded and the model is not -// ready yet. -- (void)loadWaitingView; // This method should be called at most once in the life-cycle of the class. // It should be called at the soonest possible time after the view has been // loaded, and the bookmark model is loaded. - (void)loadBookmarkViews; -// If the view doesn't exist, create it. -- (void)ensureFolderViewExists; // Updates the property 'primaryMenuItem'. // Updates the UI to reflect the new state of 'primaryMenuItem'. - (void)updatePrimaryMenuItem:(BookmarkMenuItem*)menuItem animated:(BOOL)animated; -// The active collection view that corresponds to primaryMenuItem. -- (UIView<BookmarkHomePrimaryView>*)primaryView; // Returns whether the menu should be in a side panel that slides in. - (BOOL)shouldPresentMenuInSlideInPanel; -// Returns the width of the menu. -- (CGFloat)menuWidth; // Returns the leading margin of the primary view. - (CGFloat)primaryViewLeadingMargin; // Moves the menu and primary view to their correct parent views depending on @@ -273,20 +212,10 @@ @implementation BookmarkHomeTabletNTPController -@dynamic view; @synthesize editing = _editing; @synthesize editIndexPaths = _editIndexPaths; -@synthesize bookmarks = _bookmarks; - -@synthesize folderView = _folderView; -@synthesize waitForModelView = _waitForModelView; - -@synthesize menuView = _menuView; -@synthesize primaryMenuItem = _primaryMenuItem; @synthesize cachedContentPosition = _cachedContentPosition; -@synthesize navigationBar = _navigationBar; @synthesize editingBar = _editingBar; -@synthesize panelView = _panelView; @synthesize actionSheetCoordinator = _actionSheetCoordinator; @synthesize editViewController = _editViewController; @@ -294,21 +223,14 @@ @synthesize folderEditor = _folderEditor; @synthesize bookmarkPromoController = _bookmarkPromoController; -@synthesize scrollToTop = _scrollToTop; - // Property declared in NewTabPagePanelProtocol. @synthesize delegate = _delegate; - (id)initWithLoader:(id<UrlLoader>)loader browserState:(ios::ChromeBrowserState*)browserState { - self = [super init]; + self = [super initWithLoader:loader browserState:browserState]; if (self) { - DCHECK(browserState); - _browserState = browserState->GetOriginalChromeBrowserState(); - _loader = loader; - - _bookmarks = ios::BookmarkModelFactory::GetForBrowserState(_browserState); - _bridge.reset(new bookmarks::BookmarkModelBridge(self, _bookmarks)); + _bridge.reset(new bookmarks::BookmarkModelBridge(self, self.bookmarks)); _editIndexPaths = [[NSMutableArray alloc] init]; // It is important to initialize the promo controller with the browser state // passed in, as it could be incognito. @@ -320,23 +242,14 @@ } - (void)dealloc { - self.view.delegate = nil; - - _folderView.delegate = nil; - - _menuView.delegate = nil; - _editViewController.delegate = nil; _folderSelector.delegate = nil; } -- (ios::ChromeBrowserState*)browserState { - return _browserState; -} +#pragma mark - UIViewController method. -#pragma mark - ContentViewDelegate method. - -- (void)willLayoutSubviews { +- (void)viewWillLayoutSubviews { + [super viewWillLayoutSubviews]; if (![self primaryView] && ![self primaryMenuItem] && self.bookmarks->loaded()) { BookmarkMenuItem* item = nil; @@ -428,7 +341,7 @@ new_tab_page_uma::ACTION_OPENED_BOOKMARK); base::RecordAction( base::UserMetricsAction("MobileBookmarkManagerEntryOpened")); - [_loader loadURL:url + [self.loader loadURL:url referrer:web::Referrer() transition:ui::PAGE_TRANSITION_AUTO_BOOKMARK rendererInitiated:NO]; @@ -436,18 +349,6 @@ #pragma mark - Views -- (void)loadWaitingView { - DCHECK(!self.waitForModelView); - DCHECK(self.view); - - // Present a waiting view. - BookmarkHomeWaitingView* waitingView = - [[BookmarkHomeWaitingView alloc] initWithFrame:self.view.bounds]; - self.waitForModelView = waitingView; - [self.view addSubview:self.waitForModelView]; - [self.waitForModelView startWaiting]; -} - - (void)updateMenuViewLayout { LayoutRect menuLayout = LayoutRectMake(0, self.view.bounds.size.width, 0, self.menuWidth, @@ -456,17 +357,11 @@ } - (void)loadBookmarkViews { + [super loadBookmarkViews]; DCHECK(self.bookmarks->loaded()); - // Create the menu. - LayoutRect menuLayout = - LayoutRectMake(0, self.view.bounds.size.width, 0, self.menuWidth, - self.view.bounds.size.height); - self.menuView = [[BookmarkMenuView alloc] - initWithBrowserState:self.browserState - frame:LayoutRectGetRect(menuLayout)]; self.menuView.delegate = self; - self.menuView.autoresizingMask = UIViewAutoresizingFlexibleHeight; + self.folderView.delegate = self; [self moveMenuAndPrimaryViewToAdequateParent]; @@ -495,38 +390,12 @@ } } -- (void)ensureFolderViewExists { - if (self.folderView) - return; - - BookmarkCollectionView* view = - [[BookmarkCollectionView alloc] initWithBrowserState:self.browserState - frame:CGRectZero]; - self.folderView = view; - self.folderView.delegate = self; - [self.folderView setEditing:self.editing animated:NO]; - self.folderView.autoresizingMask = - UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; -} - - (void)updatePrimaryMenuItem:(BookmarkMenuItem*)menuItem animated:(BOOL)animated { - DCHECK(menuItem.type == bookmarks::MenuItemFolder); - if ([self.primaryMenuItem isEqual:menuItem]) - return; - if (![self.view superview]) return; - [[self primaryView] removeFromSuperview]; - self.primaryMenuItem = menuItem; - - [self ensureFolderViewExists]; - [self.folderView resetFolder:self.primaryMenuItem.folder]; - [self.folderView promoStateChangedAnimated:NO]; - - [[self primaryView] changeOrientation:GetInterfaceOrientation()]; - [[self primaryView] setScrollsToTop:self.scrollToTop]; + [super updatePrimaryMenuItem:menuItem]; [self moveMenuAndPrimaryViewToAdequateParent]; @@ -536,25 +405,13 @@ self.navigationBar.hidden = NO; [self updateNavigationBarAnimated:animated orientation:GetInterfaceOrientation()]; - - [self.menuView updatePrimaryMenuItem:self.primaryMenuItem]; [self updateEditBarShadow]; } -- (UIView<BookmarkHomePrimaryView>*)primaryView { - if (self.primaryMenuItem.type == bookmarks::MenuItemFolder) - return self.folderView; - return nil; -} - - (BOOL)shouldPresentMenuInSlideInPanel { return IsCompactTablet(); } -- (CGFloat)menuWidth { - return kMenuWidth; -} - - (CGFloat)primaryViewLeadingMargin { if ([self shouldPresentMenuInSlideInPanel]) return 0; @@ -572,12 +429,7 @@ [primaryView removeFromSuperview]; if ([self shouldPresentMenuInSlideInPanel]) { - // Create (if needed), and add the panelView to the view hierarchy. - if (!self.panelView) { - self.panelView = - [[BookmarkPanelView alloc] initWithFrame:CGRectZero - menuViewWidth:[self menuWidth]]; - } + // Add the panelView to the view hierarchy. [self.view addSubview:self.panelView]; CGSize size = self.view.bounds.size; CGFloat navBarHeight = CGRectGetHeight([self navigationBarFrame]); @@ -1159,12 +1011,12 @@ } - (void)wasShown { - [_folderView wasShown]; + [self.folderView wasShown]; } - (void)wasHidden { [self cachePosition]; - [_folderView wasHidden]; + [self.folderView wasHidden]; } - (void)dismissModals { @@ -1184,17 +1036,9 @@ [[self primaryView] setScrollsToTop:self.scrollToTop]; } -- (void)loadView { - self.view = [[ContentView alloc] initWithFrame:CGRectZero]; -} - - (void)viewDidLoad { [super viewDidLoad]; - self.view.delegate = self; self.view.backgroundColor = bookmark_utils_ios::mainBackgroundColor(); - BookmarkNavigationBar* bar = - [[BookmarkNavigationBar alloc] initWithFrame:CGRectZero]; - self.navigationBar = bar; self.navigationBar.autoresizingMask = UIViewAutoresizingFlexibleWidth; [self.navigationBar setEditTarget:self
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h new file mode 100644 index 0000000..9f29228 --- /dev/null +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h
@@ -0,0 +1,97 @@ +// Copyright 2017 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 IOS_CHROME_BROWSER_UI_BOOKMARKS_HOME_VIEW_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_UI_BOOKMARKS_HOME_VIEW_CONTROLLER_H_ + +#import <UIKit/UIKit.h> + +#include <set> +#include <vector> + +@protocol UrlLoader; +@protocol BookmarkHomePrimaryView; + +namespace ios { +class ChromeBrowserState; +} // namespace ios + +namespace bookmarks { +class BookmarkModel; +} // namespace bookmarks + +@class BookmarkCollectionView; +@class BookmarkPanelView; +@class BookmarkMenuView; +@class BookmarkHomeWaitingView; +@class BookmarkNavigationBar; +@class BookmarkMenuItem; + +// Class to navigate the bookmark hierarchy, needs subclassing for tablet / +// handset case. +@interface BookmarkHomeViewController : UIViewController + +- (instancetype)initWithNibName:(NSString*)nibNameOrNil + bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE; +- (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE; +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)initWithLoader:(id<UrlLoader>)loader + browserState:(ios::ChromeBrowserState*)browserState + NS_DESIGNATED_INITIALIZER; + +// The bookmark model used. +@property(nonatomic, assign, readonly) bookmarks::BookmarkModel* bookmarks; + +// The user's browser state model used. +@property(nonatomic, assign, readonly) ios::ChromeBrowserState* browserState; + +// The main view showing all the bookmarks. +@property(nonatomic, strong, readonly) BookmarkCollectionView* folderView; + +// Object to load URLs. +@property(nonatomic, weak, readonly) id<UrlLoader> loader; + +// The menu with all the folders. +@property(nonatomic, strong, readonly) BookmarkMenuView* menuView; + +// The navigation bar sits on top of the main content. +@property(nonatomic, strong, readonly) BookmarkNavigationBar* navigationBar; + +// At any point in time, there is exactly one collection view whose view is part +// of the view hierarchy. This property determines what data is visible in the +// collection view. +@property(nonatomic, strong, readonly) BookmarkMenuItem* primaryMenuItem; + +// This view holds a content view, and a menu view. +@property(nonatomic, strong, readonly) BookmarkPanelView* panelView; + +// Either the menu or the primaryView can scrollToTop. +@property(nonatomic, assign) BOOL scrollToTop; + +// This view is created and used if the model is not fully loaded yet by the +// time this controller starts. Property is readwrite, so that subclasses can +// set it to nil, once finished with it. +@property(nonatomic, strong) BookmarkHomeWaitingView* waitForModelView; + +// This method should be called at most once in the life-cycle of the class. +// It should be called at the soonest possible time after the view has been +// loaded, and the bookmark model is loaded. +- (void)loadBookmarkViews; + +// Returns the width of the menu. +- (CGFloat)menuWidth; + +// This method is called if the view needs to be loaded and the model is not +// ready yet. +- (void)loadWaitingView; + +// Updates the property 'primaryMenuItem'. +// Updates the UI to reflect the new state of 'primaryMenuItem'. +- (void)updatePrimaryMenuItem:(BookmarkMenuItem*)menuItem; + +// The active collection view that corresponds to primaryMenuItem. +- (UIView<BookmarkHomePrimaryView>*)primaryView; +@end + +#endif // IOS_CHROME_BROWSER_UI_BOOKMARKS_HOME_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm new file mode 100644 index 0000000..4ebcdcc --- /dev/null +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
@@ -0,0 +1,153 @@ +// Copyright 2017 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. + +#import "ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h" + +#include "components/bookmarks/browser/bookmark_model.h" +#include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" +#include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/ui/bookmarks/bars/bookmark_navigation_bar.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_collection_view.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_home_primary_view.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_home_waiting_view.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_menu_item.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_menu_view.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_panel_view.h" +#import "ios/chrome/browser/ui/rtl_geometry.h" +#import "ios/chrome/browser/ui/ui_util.h" +#import "ios/chrome/browser/ui/uikit_ui_util.h" +#import "ios/chrome/browser/ui/url_loader.h" + +using bookmarks::BookmarkNode; + +namespace { +// The width of the bookmark menu, displaying the different sections. +const CGFloat kMenuWidth = 264; +} + +@interface BookmarkHomeViewController () +// Read / write declaration of read only properties. +@property(nonatomic, assign) bookmarks::BookmarkModel* bookmarks; +@property(nonatomic, assign) ios::ChromeBrowserState* browserState; +@property(nonatomic, strong) BookmarkCollectionView* folderView; +@property(nonatomic, weak) id<UrlLoader> loader; +@property(nonatomic, strong) BookmarkMenuView* menuView; +@property(nonatomic, strong) BookmarkNavigationBar* navigationBar; +@property(nonatomic, strong) BookmarkPanelView* panelView; +@property(nonatomic, strong) BookmarkMenuItem* primaryMenuItem; +@end + +@implementation BookmarkHomeViewController + +@synthesize bookmarks = _bookmarks; +@synthesize browserState = _browserState; +@synthesize folderView = _folderView; +@synthesize loader = _loader; +@synthesize menuView = _menuView; +@synthesize navigationBar = _navigationBar; +@synthesize panelView = _panelView; +@synthesize primaryMenuItem = _primaryMenuItem; +@synthesize waitForModelView = _waitForModelView; +@synthesize scrollToTop = _scrollToTop; + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#pragma mark - Initializer + +- (instancetype)initWithLoader:(id<UrlLoader>)loader + browserState:(ios::ChromeBrowserState*)browserState { + DCHECK(browserState); + self = [super initWithNibName:nil bundle:nil]; + if (self) { + _browserState = browserState->GetOriginalChromeBrowserState(); + _loader = loader; + + _bookmarks = ios::BookmarkModelFactory::GetForBrowserState(browserState); + } + return self; +} + +#pragma mark - UIViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.navigationBar = [[BookmarkNavigationBar alloc] initWithFrame:CGRectZero]; +} + +#pragma mark - Public + +- (void)loadBookmarkViews { + LayoutRect menuLayout = + LayoutRectMake(0, self.view.bounds.size.width, 0, self.menuWidth, + self.view.bounds.size.height); + + // Create menu view. + self.menuView = [[BookmarkMenuView alloc] + initWithBrowserState:_browserState + frame:LayoutRectGetRect(menuLayout)]; + self.menuView.autoresizingMask = + UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + + // Create panel view. + self.panelView = [[BookmarkPanelView alloc] initWithFrame:CGRectZero + menuViewWidth:self.menuWidth]; + self.panelView.autoresizingMask = + UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + + // Create folder view. + BookmarkCollectionView* view = + [[BookmarkCollectionView alloc] initWithBrowserState:self.browserState + frame:CGRectZero]; + self.folderView = view; + [self.folderView setEditing:self.editing animated:NO]; + self.folderView.autoresizingMask = + UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; +} + +- (void)updatePrimaryMenuItem:(BookmarkMenuItem*)menuItem { + DCHECK(menuItem.type == bookmarks::MenuItemFolder); + if ([self.primaryMenuItem isEqual:menuItem]) + return; + + // TODO(crbug.com/705339): Folder view is the only primary view now, + // hence we don't need to remove primary view anymore. + // Simplify this code that removes primary view and adds it back + // in subclasses, once the addition code moves here. + [[self primaryView] removeFromSuperview]; + self.primaryMenuItem = menuItem; + + [self.folderView resetFolder:self.primaryMenuItem.folder]; + [self.folderView promoStateChangedAnimated:NO]; + + [[self primaryView] changeOrientation:GetInterfaceOrientation()]; + [[self primaryView] setScrollsToTop:!self.scrollToTop]; + + [self.menuView updatePrimaryMenuItem:self.primaryMenuItem]; +} + +- (UIView<BookmarkHomePrimaryView>*)primaryView { + if (self.primaryMenuItem.type == bookmarks::MenuItemFolder) + return self.folderView; + return nil; +} + +- (void)loadWaitingView { + DCHECK(!self.waitForModelView); + DCHECK(self.view); + + // Present a waiting view. + BookmarkHomeWaitingView* waitingView = + [[BookmarkHomeWaitingView alloc] initWithFrame:self.view.bounds]; + self.waitForModelView = waitingView; + [self.view addSubview:self.waitForModelView]; + [self.waitForModelView startWaiting]; +} + +- (CGFloat)menuWidth { + return kMenuWidth; +} + +@end
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm new file mode 100644 index 0000000..039f704 --- /dev/null +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm
@@ -0,0 +1,51 @@ +// Copyright 2017 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. + +#import "ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h" + +#import "ios/chrome/browser/browser_state/test_chrome_browser_state.h" +#include "ios/chrome/browser/ui/bookmarks/bookmark_ios_unittest.h" + +namespace { + +using BookmarkHomeViewControllerTest = BookmarkIOSUnitTest; + +TEST_F(BookmarkHomeViewControllerTest, LoadBookmarks) { + @autoreleasepool { + BookmarkHomeViewController* controller = [[BookmarkHomeViewController alloc] + initWithLoader:nil + browserState:chrome_browser_state_.get()]; + + EXPECT_EQ(nil, controller.menuView); + EXPECT_EQ(nil, controller.panelView); + EXPECT_EQ(nil, controller.folderView); + + [controller view]; + [controller loadBookmarkViews]; + + EXPECT_NE(nil, controller); + EXPECT_NE(nil, controller.navigationBar); + EXPECT_NE(nil, controller.menuView); + EXPECT_NE(nil, controller.panelView); + EXPECT_NE(nil, controller.folderView); + } +} + +TEST_F(BookmarkHomeViewControllerTest, LoadWaitingView) { + @autoreleasepool { + BookmarkHomeViewController* controller = [[BookmarkHomeViewController alloc] + initWithLoader:nil + browserState:chrome_browser_state_.get()]; + + EXPECT_TRUE(controller.waitForModelView == nil); + + [controller view]; + [controller loadWaitingView]; + + EXPECT_TRUE(controller != nil); + EXPECT_TRUE(controller.waitForModelView != nil); + } +} + +} // namespace
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm index e2389e0..c39ee90 100644 --- a/ios/chrome/browser/ui/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -4044,6 +4044,21 @@ } } +- (void)sharePage { + ShareToData* data = activity_services::ShareToDataForTab([_model currentTab]); + if (data) + [self sharePageWithData:data]; +} + +- (void)bookmarkPage { + [self initializeBookmarkInteractionController]; + [_bookmarkInteractionController + presentBookmarkForTab:[_model currentTab] + currentlyBookmarked:_toolbarModelIOS->IsCurrentTabBookmarkedByUser() + inView:[_toolbarController bookmarkButtonView] + originRect:[_toolbarController bookmarkButtonAnchorRect]]; +} + #pragma mark - Command Handling - (IBAction)chromeExecuteCommand:(id)sender { @@ -4054,14 +4069,6 @@ Tab* currentTab = [_model currentTab]; switch (command) { - case IDC_BOOKMARK_PAGE: - [self initializeBookmarkInteractionController]; - [_bookmarkInteractionController - presentBookmarkForTab:[_model currentTab] - currentlyBookmarked:_toolbarModelIOS->IsCurrentTabBookmarkedByUser() - inView:[_toolbarController bookmarkButtonView] - originRect:[_toolbarController bookmarkButtonAnchorRect]]; - break; case IDC_FIND: [self initFindBarForTab]; break; @@ -4122,9 +4129,6 @@ [self.dispatcher reload]; break; } - case IDC_SHARE_PAGE: - [self sharePage]; - break; case IDC_SHOW_MAIL_COMPOSER: [self showMailComposer:sender]; break; @@ -4248,11 +4252,6 @@ } } -- (void)sharePage { - ShareToData* data = activity_services::ShareToDataForTab([_model currentTab]); - if (data) - [self sharePageWithData:data]; -} - (void)sharePageWithData:(ShareToData*)data { id<ShareProtocol> controller = [_dependencyFactory shareControllerInstance];
diff --git a/ios/chrome/browser/ui/browser_view_controller_unittest.mm b/ios/chrome/browser/ui/browser_view_controller_unittest.mm index 72f2e73..917d8fd 100644 --- a/ios/chrome/browser/ui/browser_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/browser_view_controller_unittest.mm
@@ -33,6 +33,7 @@ #import "ios/chrome/browser/ui/browser_view_controller.h" #import "ios/chrome/browser/ui/browser_view_controller_dependency_factory.h" #import "ios/chrome/browser/ui/browser_view_controller_testing.h" +#import "ios/chrome/browser/ui/commands/browser_commands.h" #import "ios/chrome/browser/ui/commands/generic_chrome_command.h" #include "ios/chrome/browser/ui/commands/ios_command_ids.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h" @@ -429,7 +430,7 @@ } // Verifies that BVC invokes -shareURL on ShareController with the correct -// parameters in response to the IDC_SHARE_PAGE command. +// parameters in response to the -sharePage command. TEST_F(BrowserViewControllerTest, TestSharePageCommandHandling) { GURL expectedUrl("http://www.testurl.net"); NSString* expectedTitle = @"title"; @@ -472,12 +473,12 @@ shareToDelegate:bvc_ fromRect:[bvc_ testing_shareButtonAnchorRect] inView:[OCMArg any]]; - [bvc_ chromeExecuteCommand:GetCommandWithTag(IDC_SHARE_PAGE)]; + [bvc_.dispatcher sharePage]; EXPECT_OCMOCK_VERIFY(shareControllerMock); } // Verifies that BVC does not invoke -shareURL on ShareController in response -// to the IDC_SHARE_PAGE command if tab is in the process of being closed. +// to the |-sharePage| command if tab is in the process of being closed. TEST_F(BrowserViewControllerTest, TestSharePageWhenClosing) { GURL expectedUrl("http://www.testurl.net"); NSString* expectedTitle = @"title"; @@ -498,7 +499,7 @@ shareToDelegate:bvc_ fromRect:[bvc_ testing_shareButtonAnchorRect] inView:[OCMArg any]]; - [bvc_ chromeExecuteCommand:GetCommandWithTag(IDC_SHARE_PAGE)]; + [bvc_.dispatcher sharePage]; EXPECT_OCMOCK_VERIFY(shareControllerMock); }
diff --git a/ios/chrome/browser/ui/chrome_web_view_factory.mm b/ios/chrome/browser/ui/chrome_web_view_factory.mm index c53d324..cbd7be9 100644 --- a/ios/chrome/browser/ui/chrome_web_view_factory.mm +++ b/ios/chrome/browser/ui/chrome_web_view_factory.mm
@@ -4,6 +4,8 @@ #import "ios/chrome/browser/ui/chrome_web_view_factory.h" +#include <stdint.h> + #include "base/base64.h" #include "base/logging.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" @@ -52,7 +54,7 @@ scoped_refptr<web::RequestTrackerImpl> g_request_tracker; // Empty callback used by ClearCookiesOnIOThread below. -void DoNothing(int n) {} +void DoNothing(uint32_t n) {} // Clears the cookies. void ClearCookiesOnIOThread(net::URLRequestContextGetter* context_getter,
diff --git a/ios/chrome/browser/ui/commands/browser_commands.h b/ios/chrome/browser/ui/commands/browser_commands.h index 3c97d78b..07ed08b 100644 --- a/ios/chrome/browser/ui/commands/browser_commands.h +++ b/ios/chrome/browser/ui/commands/browser_commands.h
@@ -24,6 +24,12 @@ // Reloads the current web page - (void)reload; +// Shows the share sheet for the current page. +- (void)sharePage; + +// Bookmarks the current page. +- (void)bookmarkPage; + @end #endif // IOS_CHROME_BROWSER_UI_COMMANDS_BROWSER_COMMANDS_H_
diff --git a/ios/chrome/browser/ui/commands/ios_command_ids.h b/ios/chrome/browser/ui/commands/ios_command_ids.h index ad25284..23e66f2 100644 --- a/ios/chrome/browser/ui/commands/ios_command_ids.h +++ b/ios/chrome/browser/ui/commands/ios_command_ids.h
@@ -16,7 +16,6 @@ #define IDC_RELOAD 33002 #define IDC_NEW_TAB 34014 #define IDC_FULLSCREEN 34030 -#define IDC_BOOKMARK_PAGE 35000 #define IDC_VIEW_SOURCE 35002 #define IDC_PRINT 35003 #define IDC_FIND 37000 @@ -52,7 +51,6 @@ #define IDC_CLEAR_BROWSING_DATA_IOS 40924 #define IDC_SHOW_MAIL_COMPOSER 40926 #define IDC_RESET_ALL_WEBVIEWS 40928 -#define IDC_SHARE_PAGE 40929 #define IDC_BACK_FORWARD_IN_TAB_HISTORY 40930 #define IDC_SHOW_PRIVACY_SETTINGS 40934 #define IDC_HIDE_SETTINGS_AND_SHOW_PRIVACY_SETTINGS 40935
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.h index 6d9d043..cedd920 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.h
@@ -76,7 +76,8 @@ // header containing the fake omnibox and the logo. - (BOOL)isHeaderSection:(NSInteger)section; -// Updates the number of Most Visited tiles shown for the |size|. +// Updates the number of Most Visited tiles shown for the |size| on the model +// only. The collection needs to be updated separately. - (void)updateMostVisitedForSize:(CGSize)size; // Dismisses the |item| from the model. Does not change the UI.
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm index 8b33943..1f6b8a3 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm
@@ -446,24 +446,22 @@ if (currentCount == newCount) return; - // If the animations are enabled, the items are added then the rotation - // animation is triggered, creating a weird sequenced animation. - [UIView setAnimationsEnabled:NO]; if (currentCount > newCount) { for (NSInteger i = newCount; i < currentCount; i++) { - NSIndexPath* itemToRemove = - [NSIndexPath indexPathForItem:newCount inSection:mostVisitedSection]; - [self.collectionViewController dismissEntryAtIndexPath:itemToRemove]; + [self.collectionViewController.collectionViewModel + removeItemWithType:ItemTypeMostVisited + fromSectionWithIdentifier:SectionIdentifierMostVisited + atIndex:newCount]; } } else { - NSMutableArray* itemsToBeAdded = [NSMutableArray array]; for (NSInteger i = currentCount; i < newCount; i++) { - [itemsToBeAdded addObject:mostVisited[i]]; + CSCollectionViewItem* item = mostVisited[i]; + item.type = ItemTypeMostVisited; + [self.collectionViewController.collectionViewModel + addItem:item + toSectionWithIdentifier:SectionIdentifierMostVisited]; } - [self.collectionViewController addSuggestions:itemsToBeAdded - toSectionInfo:mostVisitedSectionInfo]; } - [UIView setAnimationsEnabled:YES]; } - (void)dismissItem:(CSCollectionViewItem*)item {
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm index 597a0d6..95ba674 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
@@ -204,7 +204,7 @@ UIEdgeInsetsMake(0, self.cardStyleMargin, 0, self.cardStyleMargin); } [self.collectionUpdater updateMostVisitedForSize:size]; - [self.collectionView.collectionViewLayout invalidateLayout]; + [self.collectionView reloadData]; } - (void)willTransitionToTraitCollection:(UITraitCollection*)newCollection @@ -212,6 +212,10 @@ (id<UIViewControllerTransitionCoordinator>)coordinator { [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator]; + // Invalidating the layout after changing the cellStyle/contentInset results + // in the layout not being updated. Do it before to have it taken into + // account. + [self.collectionView.collectionViewLayout invalidateLayout]; if (ShouldCellsBeFullWidth(newCollection)) { self.collectionView.contentInset = UIEdgeInsetsZero; self.styler.cellStyle = MDCCollectionViewCellStyleGrouped; @@ -220,7 +224,6 @@ UIEdgeInsetsMake(0, self.cardStyleMargin, 0, self.cardStyleMargin); self.styler.cellStyle = MDCCollectionViewCellStyleCard; } - [self.collectionView.collectionViewLayout invalidateLayout]; } #pragma mark - UICollectionViewDelegate
diff --git a/ios/chrome/browser/ui/external_url_error_page_egtest.mm b/ios/chrome/browser/ui/external_url_error_page_egtest.mm index 6397978..26f250b 100644 --- a/ios/chrome/browser/ui/external_url_error_page_egtest.mm +++ b/ios/chrome/browser/ui/external_url_error_page_egtest.mm
@@ -24,8 +24,6 @@ using chrome_test_util::OmniboxText; using chrome_test_util::TapWebViewElementWithId; -using chrome_test_util::WebViewNotContainingText; - using web::test::HttpServer; // Tests display of error pages for bad URLs. @@ -49,8 +47,7 @@ assertWithMatcher:grey_notNil()]; const std::string kError = l10n_util::GetStringUTF8(IDS_ERRORPAGES_HEADING_NOT_AVAILABLE); - [[EarlGrey selectElementWithMatcher:WebViewNotContainingText(kError)] - assertWithMatcher:grey_notNil()]; + [ChromeEarlGrey waitForWebViewNotContainingText:kError]; } #pragma mark - tests
diff --git a/ios/chrome/browser/ui/key_commands_provider.mm b/ios/chrome/browser/ui/key_commands_provider.mm index 06d711d4..1a387aa 100644 --- a/ios/chrome/browser/ui/key_commands_provider.mm +++ b/ios/chrome/browser/ui/key_commands_provider.mm
@@ -129,7 +129,7 @@ title:l10n_util::GetNSStringWithFixup( IDS_IOS_KEYBOARD_BOOKMARK_THIS_PAGE) action:^{ - execute(IDC_BOOKMARK_PAGE); + [weakDispatcher bookmarkPage]; }], [UIKeyCommand cr_keyCommandWithInput:@"f" modifierFlags:UIKeyModifierCommand
diff --git a/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm b/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm index d1a678d4..ea70274a 100644 --- a/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm
@@ -65,18 +65,6 @@ ItemTypeBlacklisted, // This is a repeated item type. }; -// TODO(crbug.com/669538): This function should be removed after original -// version of GetHumanReadableOrigin will be moved to affiliation_utils. -std::string GetHumanReadableOriginCopy( - const autofill::PasswordForm& password_form) { - password_manager::FacetURI facet_uri = - password_manager::FacetURI::FromPotentiallyInvalidSpec( - password_form.signon_realm); - if (facet_uri.IsValidAndroidFacetURI()) - return facet_uri.scheme() + "://" + facet_uri.android_package_name(); - return base::UTF16ToUTF8(url_formatter::FormatUrl(password_form.origin)); -} - } // namespace namespace password_manager { @@ -274,7 +262,7 @@ SavedFormContentItem* passwordItem = [[SavedFormContentItem alloc] initWithType:ItemTypeSavedPassword]; passwordItem.text = - base::SysUTF8ToNSString(GetHumanReadableOriginCopy(*form)); + base::SysUTF8ToNSString(password_manager::GetHumanReadableOrigin(*form)); passwordItem.detailText = base::SysUTF16ToNSString(form->username_value); if (experimental_flags::IsViewCopyPasswordsEnabled()) { passwordItem.accessibilityTraits |= UIAccessibilityTraitButton; @@ -289,7 +277,7 @@ BlacklistedFormContentItem* passwordItem = [[BlacklistedFormContentItem alloc] initWithType:ItemTypeBlacklisted]; passwordItem.text = - base::SysUTF8ToNSString(GetHumanReadableOriginCopy(*form)); + base::SysUTF8ToNSString(password_manager::GetHumanReadableOrigin(*form)); return passwordItem; } @@ -460,8 +448,8 @@ autofill::PasswordForm* form = savedForms_[indexPath.item].get(); NSString* username = base::SysUTF16ToNSString(form->username_value); NSString* password = base::SysUTF16ToNSString(form->password_value); - NSString* origin = - base::SysUTF8ToNSString(GetHumanReadableOriginCopy(*form)); + NSString* origin = base::SysUTF8ToNSString( + password_manager::GetHumanReadableOrigin(*form)); UIViewController* controller = [[PasswordDetailsCollectionViewController alloc] initWithPasswordForm:*form
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_controller.mm b/ios/chrome/browser/ui/toolbar/toolbar_controller.mm index 9b526c8..3921ae95 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_controller.mm +++ b/ios/chrome/browser/ui/toolbar/toolbar_controller.mm
@@ -16,7 +16,7 @@ #include "base/metrics/user_metrics_action.h" #import "ios/chrome/browser/ui/animation_util.h" #import "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h" -#import "ios/chrome/browser/ui/commands/generic_chrome_command.h" +#import "ios/chrome/browser/ui/commands/browser_commands.h" #include "ios/chrome/browser/ui/commands/ios_command_ids.h" #import "ios/chrome/browser/ui/fullscreen_controller.h" #import "ios/chrome/browser/ui/image_util.h" @@ -302,7 +302,6 @@ if (idiom == IPAD_IDIOM) { CGRect shareButtonFrame = LayoutRectGetRect(kShareMenuButtonFrame); shareButton_ = [[UIButton alloc] initWithFrame:shareButtonFrame]; - [shareButton_ setTag:IDC_SHARE_PAGE]; [shareButton_ setAutoresizingMask:UIViewAutoresizingFlexibleLeadingMargin() | UIViewAutoresizingFlexibleBottomMargin]; @@ -311,6 +310,9 @@ forInitialState:UIControlStateNormal hasDisabledImage:YES synchronously:NO]; + [shareButton_ addTarget:self.dispatcher + action:@selector(sharePage) + forControlEvents:UIControlEventTouchUpInside]; SetA11yLabelAndUiAutomationName(shareButton_, IDS_IOS_TOOLS_MENU_SHARE, kToolbarShareButtonIdentifier); [view_ addSubview:shareButton_];
diff --git a/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm b/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm index a067d08..3b4039b 100644 --- a/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm +++ b/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm
@@ -508,7 +508,6 @@ // Assign tags before calling -setUpButton, since only buttons with tags // have -chromeExecuteCommand added as a target. - [_starButton setTag:IDC_BOOKMARK_PAGE]; [_voiceSearchButton setTag:IDC_VOICE_SEARCH]; [_webToolbar addSubview:_voiceSearchButton]; @@ -544,6 +543,9 @@ [_reloadButton addTarget:self.dispatcher action:@selector(reload) forControlEvents:UIControlEventTouchUpInside]; + [_starButton addTarget:self.dispatcher + action:@selector(bookmarkPage) + forControlEvents:UIControlEventTouchUpInside]; } else { [_forwardButton setAlpha:0.0]; }
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_constants.h b/ios/chrome/browser/ui/tools_menu/tools_menu_constants.h index b7904b6..7fada93 100644 --- a/ios/chrome/browser/ui/tools_menu/tools_menu_constants.h +++ b/ios/chrome/browser/ui/tools_menu/tools_menu_constants.h
@@ -43,6 +43,9 @@ // All of these values must be < 0. TOOLS_STOP_ITEM = -1, TOOLS_RELOAD_ITEM = -2, + TOOLS_BOOKMARK_ITEM = -3, + TOOLS_BOOKMARK_EDIT = -4, + TOOLS_SHARE_ITEM = -5, }; #endif // IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm index 3928cfaa..5806909 100644 --- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm +++ b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm
@@ -194,7 +194,6 @@ - (void)setCanShowShareMenu:(BOOL)enabled { ToolsMenuViewToolsCell* toolsCell = [self toolsCell]; [[toolsCell shareButton] setEnabled:enabled]; - [self setItemEnabled:enabled withTag:IDC_SHARE_PAGE]; } - (UIButton*)toolsButton { @@ -473,6 +472,12 @@ [toolsCell.reloadButton removeTarget:self.dispatcher action:@selector(reload) forControlEvents:UIControlEventTouchUpInside]; + [toolsCell.starButton removeTarget:self.dispatcher + action:@selector(bookmarkPage) + forControlEvents:UIControlEventTouchUpInside]; + [toolsCell.starredButton removeTarget:self.dispatcher + action:@selector(bookmarkPage) + forControlEvents:UIControlEventTouchUpInside]; } #pragma mark - Button event handling @@ -480,20 +485,12 @@ - (void)buttonPressed:(id)sender { int commandId = [sender tag]; DCHECK(commandId); - // The bookmark command workaround is only needed for metrics; remap it - // to the real command for the dispatch. This is very hacky, but it will go - // away soon. See crbug/228521 - DCHECK([sender respondsToSelector:@selector(setTag:)]); - if (commandId == IDC_TEMP_EDIT_BOOKMARK) - [sender setTag:IDC_BOOKMARK_PAGE]; // Do nothing when tapping the tools menu a second time. // Do not use -chromeExecuteCommand: for tags < 0 -- that is, items that have // been refactored to use the dispatcher. if (commandId != IDC_SHOW_TOOLS_MENU && commandId > 0) { [self chromeExecuteCommand:sender]; } - if (commandId == IDC_TEMP_EDIT_BOOKMARK) - [sender setTag:IDC_TEMP_EDIT_BOOKMARK]; // Do any metrics logging for the command, and then close the menu. [_delegate commandWasSelected:commandId]; @@ -598,6 +595,12 @@ [cell.reloadButton addTarget:self.dispatcher action:@selector(reload) forControlEvents:UIControlEventTouchUpInside]; + [cell.starButton addTarget:self.dispatcher + action:@selector(bookmarkPage) + forControlEvents:UIControlEventTouchUpInside]; + [cell.starredButton addTarget:self.dispatcher + action:@selector(bookmarkPage) + forControlEvents:UIControlEventTouchUpInside]; for (UIButton* button in [cell allButtons]) { [button addTarget:self action:@selector(buttonPressed:)
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.mm index 7d4c069..9935171a 100644 --- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.mm +++ b/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.mm
@@ -12,12 +12,6 @@ #import "ios/chrome/browser/ui/uikit_ui_util.h" #include "ios/chrome/grit/ios_strings.h" -// TODO(crbug.com/228521): Remove this once the new command/metric handling is -// implemented. This is a temporary workaround to allow metrics recording to -// distinguish the action. The value used is in the dynamic range (< -// IDC_MinimumLabelValue) to avoid collisions. -#define IDC_TEMP_EDIT_BOOKMARK 3900 - #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif @@ -53,13 +47,13 @@ int star[2][3] = TOOLBAR_IDR_TWO_STATE(STAR); _starButton = [self newButtonForImageIds:star - commandID:IDC_BOOKMARK_PAGE + commandID:TOOLS_BOOKMARK_ITEM accessibilityLabelID:IDS_BOOKMARK_ADD_EDITOR_TITLE automationName:@"Add Bookmark"]; int star_pressed[2][3] = TOOLBAR_IDR_ONE_STATE(STAR_PRESSED); _starredButton = [self newButtonForImageIds:star_pressed - commandID:IDC_TEMP_EDIT_BOOKMARK + commandID:TOOLS_BOOKMARK_EDIT accessibilityLabelID:IDS_IOS_TOOLS_MENU_EDIT_BOOKMARK automationName:@"Edit Bookmark"]; @@ -78,7 +72,7 @@ int share[2][3] = TOOLBAR_IDR_THREE_STATE(SHARE); _shareButton = [self newButtonForImageIds:share - commandID:IDC_SHARE_PAGE + commandID:TOOLS_SHARE_ITEM accessibilityLabelID:IDS_IOS_TOOLS_MENU_SHARE automationName:@"Stop"]; int tools[2][3] = TOOLBAR_IDR_ONE_STATE(TOOLS_PRESSED);
diff --git a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm b/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm index 02d7b2f6..b5b339f 100644 --- a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm +++ b/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm
@@ -163,10 +163,10 @@ - (void)commandWasSelected:(int)commandID { // Record the corresponding metric. switch (commandID) { - case IDC_TEMP_EDIT_BOOKMARK: + case TOOLS_BOOKMARK_EDIT: base::RecordAction(UserMetricsAction("MobileMenuEditBookmark")); break; - case IDC_BOOKMARK_PAGE: + case TOOLS_BOOKMARK_ITEM: base::RecordAction(UserMetricsAction("MobileMenuAddToBookmarks")); break; case IDC_CLOSE_ALL_TABS: @@ -193,7 +193,7 @@ case TOOLS_RELOAD_ITEM: base::RecordAction(UserMetricsAction("MobileMenuReload")); break; - case IDC_SHARE_PAGE: + case TOOLS_SHARE_ITEM: base::RecordAction(UserMetricsAction("MobileMenuShare")); break; case IDC_REQUEST_DESKTOP_SITE:
diff --git a/ios/chrome/browser/ui/webui/BUILD.gn b/ios/chrome/browser/ui/webui/BUILD.gn index 48b462d..fcda20bd 100644 --- a/ios/chrome/browser/ui/webui/BUILD.gn +++ b/ios/chrome/browser/ui/webui/BUILD.gn
@@ -16,8 +16,6 @@ "ntp_tiles_internals_ui.h", "physical_web_ui.cc", "physical_web_ui.h", - "popular_sites_internals_ui.cc", - "popular_sites_internals_ui.h", "terms_ui.h", "terms_ui.mm", "version_handler.cc",
diff --git a/ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.mm b/ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.mm index 7153cfb1..510a5ab 100644 --- a/ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.mm +++ b/ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.mm
@@ -17,7 +17,6 @@ #include "ios/chrome/browser/ui/webui/ntp_tiles_internals_ui.h" #include "ios/chrome/browser/ui/webui/omaha_ui.h" #include "ios/chrome/browser/ui/webui/physical_web_ui.h" -#include "ios/chrome/browser/ui/webui/popular_sites_internals_ui.h" #include "ios/chrome/browser/ui/webui/signin_internals_ui_ios.h" #include "ios/chrome/browser/ui/webui/sync_internals/sync_internals_ui.h" #include "ios/chrome/browser/ui/webui/terms_ui.h" @@ -80,8 +79,6 @@ if (url_host == kChromeUIPhysicalWebHost) return &NewWebUIIOS<PhysicalWebUI>; } - if (url_host == kChromeUIPopularSitesInternalsHost) - return &NewWebUIIOS<PopularSitesInternalsUI>; if (url_host == kChromeUISignInInternalsHost) return &NewWebUIIOS<SignInInternalsUIIOS>; if (url_host == kChromeUISyncInternalsHost)
diff --git a/ios/chrome/browser/ui/webui/popular_sites_internals_ui.cc b/ios/chrome/browser/ui/webui/popular_sites_internals_ui.cc deleted file mode 100644 index d06f078..0000000 --- a/ios/chrome/browser/ui/webui/popular_sites_internals_ui.cc +++ /dev/null
@@ -1,96 +0,0 @@ -// Copyright 2016 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 "ios/chrome/browser/ui/webui/popular_sites_internals_ui.h" - -#include "base/memory/ptr_util.h" -#include "components/grit/components_resources.h" -#include "components/ntp_tiles/popular_sites.h" -#include "components/ntp_tiles/webui/popular_sites_internals_message_handler.h" -#include "components/ntp_tiles/webui/popular_sites_internals_message_handler_client.h" -#include "ios/chrome/browser/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/chrome_url_constants.h" -#include "ios/chrome/browser/ntp_tiles/ios_popular_sites_factory.h" -#include "ios/web/public/web_thread.h" -#include "ios/web/public/web_ui_ios_data_source.h" -#include "ios/web/public/webui/web_ui_ios.h" -#include "ios/web/public/webui/web_ui_ios_message_handler.h" - -namespace { - -// The implementation for the chrome://popular-sites-internals page. -class IOSPopularSitesInternalsMessageHandlerBridge - : public web::WebUIIOSMessageHandler, - public ntp_tiles::PopularSitesInternalsMessageHandlerClient { - public: - IOSPopularSitesInternalsMessageHandlerBridge() : handler_(this) {} - - private: - // web::WebUIIOSMessageHandler: - void RegisterMessages() override; - - // ntp_tiles::PopularSitesInternalsMessageHandlerClient - std::unique_ptr<ntp_tiles::PopularSites> MakePopularSites() override; - PrefService* GetPrefs() override; - void RegisterMessageCallback( - const std::string& message, - const base::Callback<void(const base::ListValue*)>& callback) override; - void CallJavascriptFunctionVector( - const std::string& name, - const std::vector<const base::Value*>& values) override; - - ntp_tiles::PopularSitesInternalsMessageHandler handler_; - - DISALLOW_COPY_AND_ASSIGN(IOSPopularSitesInternalsMessageHandlerBridge); -}; - -void IOSPopularSitesInternalsMessageHandlerBridge::RegisterMessages() { - handler_.RegisterMessages(); -} - -std::unique_ptr<ntp_tiles::PopularSites> -IOSPopularSitesInternalsMessageHandlerBridge::MakePopularSites() { - return IOSPopularSitesFactory::NewForBrowserState( - ios::ChromeBrowserState::FromWebUIIOS(web_ui())); -} - -PrefService* IOSPopularSitesInternalsMessageHandlerBridge::GetPrefs() { - return ios::ChromeBrowserState::FromWebUIIOS(web_ui())->GetPrefs(); -} - -void IOSPopularSitesInternalsMessageHandlerBridge::RegisterMessageCallback( - const std::string& message, - const base::Callback<void(const base::ListValue*)>& callback) { - web_ui()->RegisterMessageCallback(message, callback); -} - -void IOSPopularSitesInternalsMessageHandlerBridge::CallJavascriptFunctionVector( - const std::string& name, - const std::vector<const base::Value*>& values) { - web_ui()->CallJavascriptFunction(name, values); -} - -} // namespace - -web::WebUIIOSDataSource* CreatePopularSitesInternalsHTMLSource() { - web::WebUIIOSDataSource* source = - web::WebUIIOSDataSource::Create(kChromeUIPopularSitesInternalsHost); - - source->AddResourcePath("popular_sites_internals.js", - IDR_POPULAR_SITES_INTERNALS_JS); - source->AddResourcePath("popular_sites_internals.css", - IDR_POPULAR_SITES_INTERNALS_CSS); - source->SetDefaultResource(IDR_POPULAR_SITES_INTERNALS_HTML); - return source; -} - -PopularSitesInternalsUI::PopularSitesInternalsUI(web::WebUIIOS* web_ui) - : web::WebUIIOSController(web_ui) { - web::WebUIIOSDataSource::Add(ios::ChromeBrowserState::FromWebUIIOS(web_ui), - CreatePopularSitesInternalsHTMLSource()); - web_ui->AddMessageHandler( - base::MakeUnique<IOSPopularSitesInternalsMessageHandlerBridge>()); -} - -PopularSitesInternalsUI::~PopularSitesInternalsUI() {}
diff --git a/ios/chrome/browser/ui/webui/popular_sites_internals_ui.h b/ios/chrome/browser/ui/webui/popular_sites_internals_ui.h deleted file mode 100644 index a36f295..0000000 --- a/ios/chrome/browser/ui/webui/popular_sites_internals_ui.h +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2016 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 IOS_CHROME_BROWSER_UI_WEBUI_POPULAR_SITES_INTERNALS_UI_H_ -#define IOS_CHROME_BROWSER_UI_WEBUI_POPULAR_SITES_INTERNALS_UI_H_ - -#include <string> - -#include "base/macros.h" -#include "ios/web/public/webui/web_ui_ios_controller.h" - -// The WebUI handler for chrome://physical-web. -class PopularSitesInternalsUI : public web::WebUIIOSController { - public: - explicit PopularSitesInternalsUI(web::WebUIIOS* web_ui); - ~PopularSitesInternalsUI() override; - - private: - DISALLOW_COPY_AND_ASSIGN(PopularSitesInternalsUI); -}; - -#endif // IOS_CHROME_BROWSER_UI_WEBUI_POPULAR_SITES_INTERNALS_UI_H_
diff --git a/ios/chrome/browser/web/navigation_egtest.mm b/ios/chrome/browser/web/navigation_egtest.mm index 084f3de..8ba939e 100644 --- a/ios/chrome/browser/web/navigation_egtest.mm +++ b/ios/chrome/browser/web/navigation_egtest.mm
@@ -471,11 +471,7 @@ std::string hashChangeContent = "FAIL_loadUrlHashChange"; [self addHashChangeListenerWithContent:hashChangeContent]; [ChromeEarlGrey loadURL:hashChangedWithHistoryURL]; - // TODO(crbug.com/714157): Remove matcher that waits. - [[EarlGrey - selectElementWithMatcher:chrome_test_util::WebViewNotContainingText( - hashChangeContent)] - assertWithMatcher:grey_notNil()]; + [ChromeEarlGrey waitForWebViewNotContainingText:hashChangeContent]; } // Loads a URL and replaces its location, then updates its location.hash
diff --git a/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm b/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm index 2b3870b..b67f2a08 100644 --- a/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm +++ b/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm
@@ -329,10 +329,7 @@ if (pageLoaded) { [ChromeEarlGrey waitForWebViewContainingText:"onload"]; } else { - id<GREYMatcher> pageLoadedMatcher = - chrome_test_util::WebViewNotContainingText("onload"); - [[EarlGrey selectElementWithMatcher:pageLoadedMatcher] - assertWithMatcher:grey_notNil()]; + [ChromeEarlGrey waitForWebViewNotContainingText:"onload"]; } if (status != NULL) {
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.h b/ios/chrome/test/earl_grey/chrome_matchers.h index 6c4fb37..ec003bd 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers.h +++ b/ios/chrome/test/earl_grey/chrome_matchers.h
@@ -31,9 +31,6 @@ // accessibility trait UIAccessibilityTraitStaticText. id<GREYMatcher> StaticTextWithAccessibilityLabel(NSString* label); -// Returns matcher for webview not containing |text|. -id<GREYMatcher> WebViewNotContainingText(std::string text); - // Returns matcher for WKWebView containing a blocked |image_id|. When blocked, // the image element will be smaller than actual image. id<GREYMatcher> WebViewContainingBlockedImage(std::string image_id);
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm index 3a951c9..67beef5 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers.mm +++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -95,10 +95,6 @@ l10n_util::GetNSStringWithFixup(message_id)); } -id<GREYMatcher> WebViewNotContainingText(std::string text) { - return web::WebViewNotContainingText(std::move(text), GetCurrentWebState()); -} - id<GREYMatcher> WebViewContainingBlockedImage(std::string image_id) { return web::WebViewContainingBlockedImage( std::move(image_id), chrome_test_util::GetCurrentWebState());
diff --git a/ios/clean/chrome/DEPS b/ios/clean/chrome/DEPS index e6eb2ee..d9539617 100644 --- a/ios/clean/chrome/DEPS +++ b/ios/clean/chrome/DEPS
@@ -3,6 +3,7 @@ "+ui/base", "+ios/chrome", "+ios/shared", + "+ios/testing/perf", "+ios/third_party", "+ios/web",
diff --git a/ios/clean/chrome/app/BUILD.gn b/ios/clean/chrome/app/BUILD.gn index 21655ec..e5d414ba 100644 --- a/ios/clean/chrome/app/BUILD.gn +++ b/ios/clean/chrome/app/BUILD.gn
@@ -85,6 +85,7 @@ "//ios/chrome/browser:browser_internal", "//ios/chrome/browser/crash_report", "//ios/chrome/common", + "//ios/testing/perf:startup", "//third_party/google_toolbox_for_mac", ] @@ -104,6 +105,7 @@ deps = [ "//base", "//ios/shared/chrome/browser/ui/coordinators", + "//ios/testing/perf:startup", ] } @@ -118,5 +120,6 @@ deps = [ ":application_state", "//ios/clean/chrome/app/steps", + "//ios/testing/perf:startup", ] }
diff --git a/ios/clean/chrome/app/app_delegate.mm b/ios/clean/chrome/app/app_delegate.mm index d83998a..1325e27 100644 --- a/ios/clean/chrome/app/app_delegate.mm +++ b/ios/clean/chrome/app/app_delegate.mm
@@ -9,6 +9,7 @@ #import "ios/clean/chrome/app/steps/launch_to_basic.h" #import "ios/clean/chrome/app/steps/launch_to_foreground.h" #import "ios/clean/chrome/app/steps/root_coordinator+application_step.h" +#import "ios/testing/perf/startupLoggers.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -26,6 +27,7 @@ - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { + startup_loggers::RegisterAppDidFinishLaunchingTime(); self.applicationState = [[ApplicationState alloc] init]; self.applicationState.application = application; [self configureApplicationState]; @@ -35,6 +37,7 @@ } - (void)applicationDidBecomeActive:(UIApplication*)application { + startup_loggers::RegisterAppDidBecomeActiveTime(); } - (void)applicationWillResignActive:(UIApplication*)application {
diff --git a/ios/clean/chrome/app/main.mm b/ios/clean/chrome/app/main.mm index 7b81862..aa03753 100644 --- a/ios/clean/chrome/app/main.mm +++ b/ios/clean/chrome/app/main.mm
@@ -12,6 +12,7 @@ #include "ios/chrome/browser/crash_report/crash_keys.h" #include "ios/chrome/common/channel_info.h" #include "ios/clean/chrome/app/app_delegate.h" +#include "ios/testing/perf/startupLoggers.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -36,6 +37,7 @@ base::AtExitManager at_exit; IOSChromeMain::InitStartTime(); + startup_loggers::RegisterAppStartTime(); // Pre-launch actions are in their own autorelease pool so they get cleaned // up before the main app starts.
diff --git a/ios/clean/chrome/browser/ui/tab_collection/BUILD.gn b/ios/clean/chrome/browser/ui/tab_collection/BUILD.gn index 6239acd..e9bb6bd 100644 --- a/ios/clean/chrome/browser/ui/tab_collection/BUILD.gn +++ b/ios/clean/chrome/browser/ui/tab_collection/BUILD.gn
@@ -30,6 +30,7 @@ deps = [ "//base", "//ios/chrome/app/theme:theme_grit", + "//ios/chrome/browser/snapshots", "//ios/chrome/browser/ui", "//ios/chrome/browser/ui/tab_switcher", "//ios/clean/chrome/browser/ui/commands", @@ -40,6 +41,7 @@ source_set("unit_tests") { sources = [ "tab_collection_mediator_unittest.mm", + "tab_collection_tab_cell_unittest.mm", "tab_collection_view_controller_unittest.mm", ] deps = [ @@ -47,6 +49,8 @@ ":tab_collection_ui", "//base", "//base/test:test_support", + "//ios/chrome/browser/snapshots", + "//ios/chrome/browser/ui/tab_switcher", "//ios/chrome/browser/web", "//ios/chrome/browser/web_state_list", "//ios/chrome/browser/web_state_list:test_support", @@ -54,6 +58,7 @@ "//ios/web/public/test/fakes", "//testing/gtest", "//third_party/ocmock", + "//ui/base:test_support", "//url:url", ] configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.h b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.h index ed919d5..ad34a1b 100644 --- a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.h +++ b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.h
@@ -5,10 +5,9 @@ #ifndef IOS_CLEAN_CHROME_BROWSER_UI_TAB_COLLECTION_TAB_COLLECTION_TAB_CELL_H_ #define IOS_CLEAN_CHROME_BROWSER_UI_TAB_COLLECTION_TAB_COLLECTION_TAB_CELL_H_ -#import <UIKit/UIKit.h> - #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.h" +@class SnapshotCache; @class TabCollectionItem; // Cell represents a tab for use in the tab collection. It has a title, favicon, @@ -16,7 +15,8 @@ // highlight in the tintColor. // PLACEHOLDER: Create custom implemementation rather than subclassing. @interface TabCollectionTabCell : TabSwitcherLocalSessionCell -@property(nonatomic, strong) TabCollectionItem* item; +- (void)configureCell:(TabCollectionItem*)item + snapshotCache:(SnapshotCache*)snapshotCache; @end #endif // IOS_CLEAN_CHROME_BROWSER_UI_TAB_COLLECTION_TAB_COLLECTION_TAB_CELL_H_
diff --git a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.mm b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.mm index f9c7914..2367e1c4 100644 --- a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.mm +++ b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.mm
@@ -4,6 +4,7 @@ #import "ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.h" +#import "ios/chrome/browser/snapshots/snapshot_cache.h" #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_button.h" #import "ios/chrome/browser/ui/uikit_ui_util.h" #include "ios/chrome/grit/ios_theme_resources.h" @@ -20,6 +21,7 @@ } @interface TabCollectionTabCell () +@property(nonatomic, strong) TabCollectionItem* item; @property(nonatomic, strong) UILabel* titleLabel; @property(nonatomic, strong) UIImageView* favicon; @property(nonatomic, strong) TabSwitcherButton* snapshotButton; @@ -38,19 +40,38 @@ return self; } -#pragma mark - Properties +#pragma mark - Cell lifecycle -- (void)setItem:(TabCollectionItem*)item { +- (void)prepareForReuse { + [super prepareForReuse]; + self.item = nil; +} + +#pragma mark - Public methods + +- (void)configureCell:(TabCollectionItem*)item + snapshotCache:(SnapshotCache*)snapshotCache { DCHECK(item); - _item = item; + self.item = item; self.titleLabel.text = item.title; self.snapshotButton.accessibilityIdentifier = [NSString stringWithFormat:@"%@_button", item.title]; self.contentView.accessibilityLabel = item.title; self.favicon.image = NativeImage(IDR_IOS_OMNIBOX_HTTP); + __weak TabCollectionTabCell* weakSelf = self; + [snapshotCache + retrieveImageForSessionID:self.item.tabID + callback:^(UIImage* snapshot) { + // PLACEHOLDER: This operation will be cancellable. + if ([weakSelf.item.tabID isEqualToString:item.tabID]) { + [weakSelf.snapshotButton + setImage:snapshot + forState:UIControlStateNormal]; + } + }]; } -#pragma mark - Private +#pragma mark - Private methods - (void)setupSelectedBackgroundView { self.selectedBackgroundView = [[UIView alloc] init];
diff --git a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell_unittest.mm b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell_unittest.mm new file mode 100644 index 0000000..23605ab --- /dev/null +++ b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell_unittest.mm
@@ -0,0 +1,104 @@ +// Copyright 2017 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. + +#import "ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.h" + +#import <UIKit/UIKit.h> + +#include "base/test/ios/wait_util.h" +#import "ios/chrome/browser/snapshots/snapshot_cache.h" +#import "ios/chrome/browser/ui/tab_switcher/tab_switcher_button.h" +#import "ios/clean/chrome/browser/ui/tab_collection/tab_collection_item.h" +#include "testing/gtest/include/gtest/gtest.h" +#import "testing/gtest_mac.h" +#include "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" +#include "third_party/ocmock/gtest_support.h" +#include "ui/base/test/ios/ui_image_test_utils.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@interface TestTabCell : TabCollectionTabCell +@property(nonatomic) UILabel* titleLabel; +@property(nonatomic) TabSwitcherButton* snapshotButton; +@end + +@implementation TestTabCell +@dynamic titleLabel; +@dynamic snapshotButton; +@end + +class TabCollectionTabCellTest : public PlatformTest { + public: + TabCollectionTabCellTest() { + cell_ = [[TestTabCell alloc] init]; + snapshotCache_ = OCMClassMock([SnapshotCache class]); + item_ = [[TabCollectionItem alloc] init]; + item_.tabID = @"1234"; + item_.title = @"Title"; + snapshot_ = ui::test::uiimage_utils::UIImageWithSizeAndSolidColor( + CGSizeMake(30, 40), [UIColor blueColor]); + } + ~TabCollectionTabCellTest() override {} + + protected: + TestTabCell* cell_; + id snapshotCache_; + TabCollectionItem* item_; + UIImage* snapshot_; +}; + +// Tests that -configureCell updates the title. +TEST_F(TabCollectionTabCellTest, TestConfigureTitle) { + EXPECT_EQ(nil, cell_.titleLabel.text); + [cell_ configureCell:item_ snapshotCache:snapshotCache_]; + EXPECT_NSEQ(@"Title", cell_.titleLabel.text); +} + +// Tests that -configureCell: does not change the cell's snapshot if the +// snapshotCache does not contain the image. +TEST_F(TabCollectionTabCellTest, TestSnapshotMissing) { + OCMStub([snapshotCache_ retrieveImageForSessionID:[OCMArg any] + callback:[OCMArg any]]) + .andDo(^(NSInvocation* invocation) { + void (^callback)(UIImage* image); + [invocation getArgument:&callback atIndex:3]; + callback(nil); + }); + [cell_ configureCell:item_ snapshotCache:snapshotCache_]; + EXPECT_EQ(nil, [cell_.snapshotButton imageForState:UIControlStateNormal]); +} + +// Tests that -configureCell: updates the cell's snapshot from the cache. +TEST_F(TabCollectionTabCellTest, TestSnapshotUpdated) { + OCMStub([snapshotCache_ retrieveImageForSessionID:[OCMArg any] + callback:[OCMArg any]]) + .andDo(^(NSInvocation* invocation) { + void (^callback)(UIImage* image); + [invocation getArgument:&callback atIndex:3]; + callback(snapshot_); + }); + [cell_ configureCell:item_ snapshotCache:snapshotCache_]; + UIImage* cellImage = + [cell_.snapshotButton imageForState:UIControlStateNormal]; + EXPECT_TRUE(ui::test::uiimage_utils::UIImagesAreEqual(snapshot_, cellImage)); +} + +// Tests that asynchronous snapshot retrieval does not set the image after +// -prepareForReuse. +TEST_F(TabCollectionTabCellTest, TestPrepareForReuse) { + OCMStub([snapshotCache_ retrieveImageForSessionID:[OCMArg any] + callback:[OCMArg any]]) + .andDo(^(NSInvocation* invocation) { + void (^callback)(UIImage* image); + [invocation getArgument:&callback atIndex:3]; + // -prepareForReuse is called before the callback. + [cell_ prepareForReuse]; + callback(snapshot_); + }); + [cell_ configureCell:item_ snapshotCache:snapshotCache_]; + EXPECT_EQ(nil, [cell_.snapshotButton imageForState:UIControlStateNormal]); +}
diff --git a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.h b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.h index 907f4b99..643b890 100644 --- a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.h +++ b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.h
@@ -9,6 +9,8 @@ #import "ios/clean/chrome/browser/ui/tab_collection/tab_collection_consumer.h" +@class SnapshotCache; + // Controller for a scrolling view displaying square cells that represent // the user's open tabs. @interface TabCollectionViewController @@ -18,6 +20,8 @@ // Model for collection view. @property(nonatomic, strong, readonly) NSMutableArray<TabCollectionItem*>* items; +// Cache used to retrieve snapshot images for tab cells. +@property(nonatomic, weak) SnapshotCache* snapshotCache; @end #endif // IOS_CLEAN_CHROME_BROWSER_UI_TAB_COLLECTION_TAB_COLLECTION_VIEW_CONTROLLER_H_
diff --git a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.mm b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.mm index dba8b4c..87b9107 100644 --- a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.mm +++ b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.mm
@@ -28,6 +28,7 @@ @synthesize tabs = _tabs; @synthesize items = _items; @synthesize selectedIndex = _selectedIndex; +@synthesize snapshotCache = _snapshotCache; #pragma mark - UIViewController @@ -118,7 +119,7 @@ [cell setSessionType:TabSwitcherSessionType::REGULAR_SESSION]; DCHECK_LE(indexPath.item, INT_MAX); int index = static_cast<int>(indexPath.item); - cell.item = self.items[index]; + [cell configureCell:self.items[index] snapshotCache:self.snapshotCache]; return cell; } @@ -133,7 +134,7 @@ #pragma mark - SessionCellDelegate - (TabSwitcherCache*)tabSwitcherCache { - // PLACEHOLDER: return image cache. + // PLACEHOLDER: SnapshotCache will be passed into the cell. return nil; } @@ -186,13 +187,14 @@ } - (void)replaceItemAtIndex:(int)index withItem:(TabCollectionItem*)item { + DCHECK(item); DCHECK_GE(index, 0); DCHECK_LT(static_cast<NSUInteger>(index), self.items.count); self.items[index] = item; TabCollectionTabCell* cell = base::mac::ObjCCastStrict<TabCollectionTabCell>( [self.tabs cellForItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0]]); - cell.item = self.items[index]; + [cell configureCell:self.items[index] snapshotCache:self.snapshotCache]; } - (void)populateItems:(NSArray<TabCollectionItem*>*)items
diff --git a/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn b/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn index dffab41..6dce052d 100644 --- a/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn +++ b/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn
@@ -16,6 +16,7 @@ ":tab_grid_ui", "//base", "//ios/chrome/browser/browser_state", + "//ios/chrome/browser/snapshots", "//ios/chrome/browser/web_state_list", "//ios/clean/chrome/browser", "//ios/clean/chrome/browser/ui/commands",
diff --git a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm index 1049789..26e1b554 100644 --- a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm +++ b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
@@ -9,6 +9,7 @@ #include "base/mac/foundation_util.h" #include "base/strings/sys_string_conversions.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/snapshots/snapshot_cache_factory.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/clean/chrome/browser/ui/commands/context_menu_commands.h" #import "ios/clean/chrome/browser/ui/commands/settings_commands.h" @@ -43,6 +44,7 @@ @property(nonatomic, weak) TabCoordinator* activeTabCoordinator; @property(nonatomic, readonly) WebStateList& webStateList; @property(nonatomic, strong) TabGridMediator* mediator; +@property(nonatomic, readonly) SnapshotCache* snapshotCache; @end @implementation TabGridCoordinator @@ -58,6 +60,11 @@ return self.browser->web_state_list(); } +- (SnapshotCache*)snapshotCache { + return SnapshotCacheFactory::GetForBrowserState( + self.browser->browser_state()); +} + #pragma mark - BrowserCoordinator - (void)start { @@ -71,6 +78,7 @@ self.viewController = [[TabGridViewController alloc] init]; self.viewController.dispatcher = static_cast<id>(self.browser->dispatcher()); + self.viewController.snapshotCache = self.snapshotCache; self.mediator.consumer = self.viewController;
diff --git a/ios/clean/chrome/test/BUILD.gn b/ios/clean/chrome/test/BUILD.gn index f4a6f6aa..446e0c6c 100644 --- a/ios/clean/chrome/test/BUILD.gn +++ b/ios/clean/chrome/test/BUILD.gn
@@ -9,6 +9,7 @@ testonly = true deps = [ ":ios_clean_chrome_unittests", + "//ios/clean/chrome/test/perf:ios_clean_skeleton_perf_egtests", ] }
diff --git a/ios/clean/chrome/test/perf/BUILD.gn b/ios/clean/chrome/test/perf/BUILD.gn new file mode 100644 index 0000000..2be9ae9 --- /dev/null +++ b/ios/clean/chrome/test/perf/BUILD.gn
@@ -0,0 +1,80 @@ +# Copyright 2017 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. + +import("//build/config/ios/rules.gni") +import("//build/config/mac/base_rules.gni") +import("//build/mac/tweak_info_plist.gni") +import("//ios/build/chrome_build.gni") +import("//ios/third_party/earl_grey/ios_eg_test.gni") + +tweak_info_plist("info_plist") { + info_plists = [ + "//ios/chrome/app/resources/Info.plist", + "//ios/chrome/app/resources/ChromeAddition+Info.plist", + ] + if (ios_chrome_info_plist_additions != []) { + info_plists += ios_chrome_info_plist_additions + } + if (ios_encryption_export_compliance_code != "") { + info_plists += + [ "//ios/chrome/app/resources/EncryptionExportCompliance+Info.plist" ] + } + args = [ + "--breakpad=$breakpad_enabled_as_int", + "--branding=$chromium_short_name", + ] +} + +compile_plist("entitlements") { + format = "xml1" + plist_templates = [ "resources/Chrome.entitlements" ] + if (ios_chrome_entitlements_additions != []) { + # TODO(crbug.com/707206): Allow additional entitlements once the CSChromium + # mobile provisioning profiles have been updated. + # plist_templates += ios_chrome_entitlements_additions + } + substitutions = [ "IOS_BUNDLE_ID_PREFIX=$ios_app_bundle_id_prefix" ] + output_name = "$target_gen_dir/$chromium_short_name.entitlements" +} + +ios_eg_test("ios_clean_skeleton_perf_egtests") { + entitlements_target = ":entitlements" + info_plist_target = ":info_plist" + + sources = [ + "startup_egtests.mm", + ] + + deps = [ + "//ios/clean/chrome/app:main", + "//ios/testing/perf:startup", + ] + + bundle_deps = [ "//ios/chrome/app/resources" ] + + configs += [ "//build/config/compiler:enable_arc" ] + + extra_substitutions = [ + "CHROMIUM_HANDOFF_ID=$chromium_handoff_id", + "CHROMIUM_SHORT_NAME=$target_name", + "CHROMIUM_URL_SCHEME_1=$url_unsecure_scheme", + "CHROMIUM_URL_SCHEME_2=$url_secure_scheme", + "CHROMIUM_URL_SCHEME_3=$url_x_callback_scheme", + "CHROMIUM_URL_SCHEME_4=$url_channel_scheme", + "SSOAUTH_URL_SCHEME=$url_ssoauth_scheme", + ] + + if (ios_automatically_manage_certs) { + # Use the same bundle identifier for EarlGrey tests as for unit tests + # when managing certificates as the number of free certs is limited. + extra_substitutions += + [ "CHROMIUM_BUNDLE_ID=gtest.${ios_generic_test_bundle_id_suffix}" ] + } else { + extra_substitutions += [ "CHROMIUM_BUNDLE_ID=gtest.$target_name" ] + } + + if (ios_encryption_export_compliance_code != "") { + extra_substitutions += [ "ENCRYPTION_EXPORT_COMPLIANCE_CODE=$ios_encryption_export_compliance_code" ] + } +}
diff --git a/ios/clean/chrome/test/perf/resources/Chrome.entitlements b/ios/clean/chrome/test/perf/resources/Chrome.entitlements new file mode 100644 index 0000000..061639e --- /dev/null +++ b/ios/clean/chrome/test/perf/resources/Chrome.entitlements
@@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>application-identifier</key> + <string>$(AppIdentifierPrefix)$(CFBundleIdentifier)</string> +</dict> +</plist>
diff --git a/ios/clean/chrome/test/perf/startup_egtests.mm b/ios/clean/chrome/test/perf/startup_egtests.mm new file mode 100644 index 0000000..c25e853 --- /dev/null +++ b/ios/clean/chrome/test/perf/startup_egtests.mm
@@ -0,0 +1,23 @@ +// Copyright 2017 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. + +#import <XCTest/XCTest.h> + +#import "ios/testing/perf/startupLoggers.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@interface StartupTestCase : XCTestCase +@end + +@implementation StartupTestCase + +// Simple test to launch the app and log startup data. +- (void)testColdStartUp { + XCTAssertTrue(startup_loggers::LogData(@"testColdStartUp")); +} + +@end
diff --git a/ios/net/cookies/cookie_store_ios.h b/ios/net/cookies/cookie_store_ios.h index 04a37f19..3877586 100644 --- a/ios/net/cookies/cookie_store_ios.h +++ b/ios/net/cookies/cookie_store_ios.h
@@ -5,6 +5,8 @@ #ifndef IOS_NET_COOKIES_COOKIE_STORE_IOS_H_ #define IOS_NET_COOKIES_COOKIE_STORE_IOS_H_ +#include <stdint.h> + #include <map> #include <memory> #include <string> @@ -253,7 +255,7 @@ // calling the provided callback. void UpdateCachesAfterSet(SetCookiesCallback callback, bool success); - void UpdateCachesAfterDelete(DeleteCallback callback, int num_deleted); + void UpdateCachesAfterDelete(DeleteCallback callback, uint32_t num_deleted); void UpdateCachesAfterClosure(base::OnceClosure callback); // Takes an NSArray of NSHTTPCookies as returns a net::CookieList.
diff --git a/ios/net/cookies/cookie_store_ios.mm b/ios/net/cookies/cookie_store_ios.mm index edb3bad..87baca6b 100644 --- a/ios/net/cookies/cookie_store_ios.mm +++ b/ios/net/cookies/cookie_store_ios.mm
@@ -861,7 +861,7 @@ } void CookieStoreIOS::UpdateCachesAfterDelete(DeleteCallback callback, - int num_deleted) { + uint32_t num_deleted) { DCHECK(thread_checker_.CalledOnValidThread()); UpdateCachesFromCookieMonster(); if (!callback.is_null())
diff --git a/ios/testing/perf/BUILD.gn b/ios/testing/perf/BUILD.gn new file mode 100644 index 0000000..13700de --- /dev/null +++ b/ios/testing/perf/BUILD.gn
@@ -0,0 +1,14 @@ +# Copyright 2017 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. + +source_set("startup") { + sources = [ + "startupLoggers.h", + "startupLoggers.mm", + ] + deps = [ + "//base", + ] + configs += [ "//build/config/compiler:enable_arc" ] +}
diff --git a/ios/testing/perf/startupLoggers.h b/ios/testing/perf/startupLoggers.h new file mode 100644 index 0000000..d16a2b2 --- /dev/null +++ b/ios/testing/perf/startupLoggers.h
@@ -0,0 +1,23 @@ +// Copyright 2017 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. + +#import <Foundation/Foundation.h> + +namespace startup_loggers { + +// Registers the current time variable. This function should be called when the +// app is launched. +void RegisterAppStartTime(); +// Registers the current time variable. This function should be called when the +// app gets didFinishLaunchingWithOptions notification. +void RegisterAppDidFinishLaunchingTime(); +// Registers the current time variable. Chrome does some lauch option steps +// after the app gets didFinishLaunchingWithOptions notification. This function +// should be called when the app gets applicationDidBecomeActive notification. +void RegisterAppDidBecomeActiveTime(); +// Returns whether data is successfully stored in the output json file. This +// function stores the time variables into a json file. +bool LogData(NSString* testName); + +} // namespace startup_loggers
diff --git a/ios/testing/perf/startupLoggers.mm b/ios/testing/perf/startupLoggers.mm new file mode 100644 index 0000000..389e919 --- /dev/null +++ b/ios/testing/perf/startupLoggers.mm
@@ -0,0 +1,70 @@ +// Copyright 2017 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. + +#import "ios/testing/perf/startupLoggers.h" +#include "base/time/time.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace startup_loggers { +// Stores the time of app startup states. +base::Time* g_start_time; +base::Time* g_finish_launching_time; +base::Time* g_become_active_time; + +void RegisterAppStartTime() { + DCHECK(!g_start_time); + g_start_time = new base::Time(base::Time::Now()); +} + +void RegisterAppDidFinishLaunchingTime() { + DCHECK(g_start_time); + DCHECK(!g_finish_launching_time); + g_finish_launching_time = new base::Time(base::Time::Now()); +} + +void RegisterAppDidBecomeActiveTime() { + DCHECK(g_start_time); + DCHECK(!g_become_active_time); + g_become_active_time = new base::Time(base::Time::Now()); +} + +bool LogData(NSString* testName) { + // Store the data into a format compatiable with infra scripts. + double finishLaunchingDuration = + g_finish_launching_time->ToDoubleT() - g_start_time->ToDoubleT(); + double becomeActiveDuration = + g_become_active_time->ToDoubleT() - g_start_time->ToDoubleT(); + NSDictionary* values = @{ + @"AppDidFinishLaunchingTime" : @(finishLaunchingDuration), + @"AppDidBecomeActiveTime" : @(becomeActiveDuration) + }; + NSDictionary* timingData = + @{ testName : @{@"unit" : @"seconds", @"value" : values} }; + NSDictionary* summary = @{@"Perf Data" : timingData}; + + // Converts data into json format. + NSError* error; + NSData* jsonData = + [NSJSONSerialization dataWithJSONObject:summary + options:NSJSONWritingPrettyPrinted + error:&error]; + if (error) { + return false; + } + + // Stores data into a json file under the app's document directory. + NSString* fileName = @"perf_result.json"; + NSArray<NSString*>* outputDirectories = NSSearchPathForDirectoriesInDomains( + NSDocumentDirectory, NSUserDomainMask, YES); + if ([outputDirectories count] == 0) { + return false; + } + NSString* outputPath = + [outputDirectories[0] stringByAppendingPathComponent:fileName]; + return [jsonData writeToFile:outputPath atomically:YES]; +} +}
diff --git a/media/base/decoder_factory.cc b/media/base/decoder_factory.cc index fa002d6..4b9b0b3 100644 --- a/media/base/decoder_factory.cc +++ b/media/base/decoder_factory.cc
@@ -19,6 +19,7 @@ void DecoderFactory::CreateVideoDecoders( scoped_refptr<base::SingleThreadTaskRunner> task_runner, GpuVideoAcceleratorFactories* gpu_factories, + MediaLog* media_log, std::vector<std::unique_ptr<VideoDecoder>>* video_decoders) {} } // namespace media
diff --git a/media/base/decoder_factory.h b/media/base/decoder_factory.h index 4d90ee3..7de18e0 100644 --- a/media/base/decoder_factory.h +++ b/media/base/decoder_factory.h
@@ -20,6 +20,7 @@ class AudioDecoder; class GpuVideoAcceleratorFactories; +class MediaLog; class VideoDecoder; // A factory class for creating audio and video decoders. @@ -39,6 +40,7 @@ virtual void CreateVideoDecoders( scoped_refptr<base::SingleThreadTaskRunner> task_runner, GpuVideoAcceleratorFactories* gpu_factories, + MediaLog* media_log, std::vector<std::unique_ptr<VideoDecoder>>* video_decoders); private:
diff --git a/media/base/ipc/media_param_traits_macros.h b/media/base/ipc/media_param_traits_macros.h index 79083bc..a127800c 100644 --- a/media/base/ipc/media_param_traits_macros.h +++ b/media/base/ipc/media_param_traits_macros.h
@@ -18,6 +18,7 @@ #include "media/base/demuxer_stream.h" #include "media/base/eme_constants.h" #include "media/base/encryption_scheme.h" +#include "media/base/media_log_event.h" #include "media/base/output_device_info.h" #include "media/base/sample_format.h" #include "media/base/subsample_entry.h" @@ -42,6 +43,15 @@ IPC_ENUM_TRAITS_MAX_VALUE(media::CdmKeyInformation::KeyStatus, media::CdmKeyInformation::KEY_STATUS_MAX) +IPC_ENUM_TRAITS_MAX_VALUE(media::CdmMessageType, + media::CdmMessageType::MESSAGE_TYPE_MAX) + +IPC_ENUM_TRAITS_MAX_VALUE(media::CdmPromise::Exception, + media::CdmPromise::EXCEPTION_MAX) + +IPC_ENUM_TRAITS_MAX_VALUE(media::CdmSessionType, + media::CdmSessionType::SESSION_TYPE_MAX) + IPC_ENUM_TRAITS_MAX_VALUE(media::ChannelLayout, media::CHANNEL_LAYOUT_MAX) IPC_ENUM_TRAITS_MAX_VALUE(media::ColorSpace, media::COLOR_SPACE_MAX) @@ -66,14 +76,8 @@ IPC_ENUM_TRAITS_MAX_VALUE(media::EncryptionScheme::CipherMode, media::EncryptionScheme::CipherMode::CIPHER_MODE_MAX) -IPC_ENUM_TRAITS_MAX_VALUE(media::CdmPromise::Exception, - media::CdmPromise::EXCEPTION_MAX) - -IPC_ENUM_TRAITS_MAX_VALUE(media::CdmMessageType, - media::CdmMessageType::MESSAGE_TYPE_MAX) - -IPC_ENUM_TRAITS_MAX_VALUE(media::CdmSessionType, - media::CdmSessionType::SESSION_TYPE_MAX) +IPC_ENUM_TRAITS_MAX_VALUE(media::MediaLogEvent::Type, + media::MediaLogEvent::TYPE_LAST) IPC_ENUM_TRAITS_MAX_VALUE(media::OutputDeviceStatus, media::OUTPUT_DEVICE_STATUS_MAX) @@ -114,6 +118,13 @@ IPC_STRUCT_TRAITS_MEMBER(system_code) IPC_STRUCT_TRAITS_END() +IPC_STRUCT_TRAITS_BEGIN(media::MediaLogEvent) + IPC_STRUCT_TRAITS_MEMBER(id) + IPC_STRUCT_TRAITS_MEMBER(type) + IPC_STRUCT_TRAITS_MEMBER(params) + IPC_STRUCT_TRAITS_MEMBER(time) +IPC_STRUCT_TRAITS_END() + IPC_STRUCT_TRAITS_BEGIN(media::SubsampleEntry) IPC_STRUCT_TRAITS_MEMBER(clear_bytes) IPC_STRUCT_TRAITS_MEMBER(cypher_bytes)
diff --git a/media/base/media_log.h b/media/base/media_log.h index d138fd6..08eadc5 100644 --- a/media/base/media_log.h +++ b/media/base/media_log.h
@@ -101,6 +101,10 @@ void SetDoubleProperty(const std::string& key, double value); void SetBooleanProperty(const std::string& key, bool value); + // Getter for |id_|. Used by MojoMediaLogService to construct MediaLogEvents + // to log into this MediaLog. + int32_t id() const { return id_; } + private: // A unique (to this process) id for this MediaLog. int32_t id_;
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc index d21c201..479e72c 100644 --- a/media/base/pipeline_impl.cc +++ b/media/base/pipeline_impl.cc
@@ -201,7 +201,6 @@ text_renderer_ended_(false), weak_factory_(this) { weak_this_ = weak_factory_.GetWeakPtr(); - media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(kCreated)); } PipelineImpl::RendererWrapper::~RendererWrapper() {
diff --git a/media/base/test_helpers.cc b/media/base/test_helpers.cc index 73114df..aa89ecec 100644 --- a/media/base/test_helpers.cc +++ b/media/base/test_helpers.cc
@@ -180,6 +180,12 @@ return kLargeSize; } +AudioDecoderConfig TestAudioConfig::Normal() { + return AudioDecoderConfig(kCodecVorbis, kSampleFormatPlanarF32, + CHANNEL_LAYOUT_STEREO, 44100, EmptyExtraData(), + Unencrypted()); +} + // static AudioParameters TestAudioParameters::Normal() { return AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
diff --git a/media/base/test_helpers.h b/media/base/test_helpers.h index e54d0a4..dc0ff01 100644 --- a/media/base/test_helpers.h +++ b/media/base/test_helpers.h
@@ -101,6 +101,13 @@ DISALLOW_COPY_AND_ASSIGN(TestVideoConfig); }; +// Provides pre-canned AudioDecoderConfig. These types are used for tests that +// don't care about detailed parameters of the config. +class TestAudioConfig { + public: + static AudioDecoderConfig Normal(); +}; + // Provides pre-canned AudioParameters objects. class TestAudioParameters { public: @@ -171,10 +178,36 @@ "SourceBuffer with multiple tracks"); } +MATCHER_P2(NonkeyframePrecedesGopStartWarning, + keyframe_time_string, + nonkeyframe_time_string, + "") { + return CONTAINS_STRING( + arg, + "Warning: presentation time of most recently processed random access " + "point (" + + std::string(keyframe_time_string) + + " s) is later than the presentation time of a non-keyframe (" + + nonkeyframe_time_string + + " s) that depends on it. This type of random access point is not " + "well supported by MSE; buffered range reporting may be less " + "precise."); +} + MATCHER(StreamParsingFailed, "") { return CONTAINS_STRING(arg, "Append: stream parsing failed."); } +MATCHER(ParsedBuffersNotInDTSSequence, "") { + return CONTAINS_STRING(arg, "Parsed buffers not in DTS sequence"); +} + +MATCHER(ParsedDTSGreaterThanPTS, "") { + return CONTAINS_STRING(arg, "Parsed ") && + CONTAINS_STRING(arg, "frame has DTS ") && + CONTAINS_STRING(arg, ", which is after the frame's PTS"); +} + MATCHER_P(FoundStream, stream_type_string, "") { return CONTAINS_STRING( arg, "found_" + std::string(stream_type_string) + "_stream") && @@ -203,6 +236,12 @@ " track track_id=" + id); } +MATCHER_P2(FrameTypeMismatchesTrackType, frame_type, track_type, "") { + return CONTAINS_STRING(arg, std::string("Frame type ") + frame_type + + " doesn't match track buffer type " + + track_type); +} + MATCHER_P2(SkippingSpliceAtOrBefore, new_microseconds, existing_microseconds,
diff --git a/media/base/video_decoder_config.cc b/media/base/video_decoder_config.cc index 9599ff1..845c37a 100644 --- a/media/base/video_decoder_config.cc +++ b/media/base/video_decoder_config.cc
@@ -53,7 +53,8 @@ VideoDecoderConfig::VideoDecoderConfig() : codec_(kUnknownVideoCodec), profile_(VIDEO_CODEC_PROFILE_UNKNOWN), - format_(PIXEL_FORMAT_UNKNOWN) {} + format_(PIXEL_FORMAT_UNKNOWN), + color_space_(COLOR_SPACE_UNSPECIFIED) {} VideoDecoderConfig::VideoDecoderConfig( VideoCodec codec, @@ -79,7 +80,7 @@ color_space_info_ = color_space_info; } -VideoColorSpace VideoDecoderConfig::color_space_info() const { +const VideoColorSpace& VideoDecoderConfig::color_space_info() const { return color_space_info_; } @@ -87,7 +88,7 @@ hdr_metadata_ = hdr_metadata; } -base::Optional<HDRMetadata> VideoDecoderConfig::hdr_metadata() const { +const base::Optional<HDRMetadata>& VideoDecoderConfig::hdr_metadata() const { return hdr_metadata_; }
diff --git a/media/base/video_decoder_config.h b/media/base/video_decoder_config.h index ec6b315..80b5c8f 100644 --- a/media/base/video_decoder_config.h +++ b/media/base/video_decoder_config.h
@@ -89,14 +89,14 @@ // Deprecated. TODO(wolenetz): Remove. See https://crbug.com/665539. // Width and height of video frame immediately post-decode. Not all pixels // in this region are valid. - gfx::Size coded_size() const { return coded_size_; } + const gfx::Size& coded_size() const { return coded_size_; } // Region of |coded_size_| that is visible. - gfx::Rect visible_rect() const { return visible_rect_; } + const gfx::Rect& visible_rect() const { return visible_rect_; } // Final visible width and height of a video frame with aspect ratio taken // into account. - gfx::Size natural_size() const { return natural_size_; } + const gfx::Size& natural_size() const { return natural_size_; } // Optional byte data required to initialize video decoders, such as H.264 // AVCC data. @@ -114,10 +114,10 @@ } void set_color_space_info(const VideoColorSpace& color_space_info); - VideoColorSpace color_space_info() const; + const VideoColorSpace& color_space_info() const; void set_hdr_metadata(const HDRMetadata& hdr_metadata); - base::Optional<HDRMetadata> hdr_metadata() const; + const base::Optional<HDRMetadata>& hdr_metadata() const; // Sets the config to be encrypted or not encrypted manually. This can be // useful for decryptors that decrypts an encrypted stream to a clear stream.
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index 28911b1..c558870 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -290,6 +290,10 @@ media_log_->AddEvent(media_log_->CreateCreatedEvent( url::Origin(frame_->GetSecurityOrigin()).GetURL().spec())); + media_log_->SetStringProperty("frame_url", + frame_->GetDocument().Url().GetString().Utf8()); + media_log_->SetStringProperty("frame_title", + frame_->GetDocument().Title().Utf8()); if (params->initial_cdm()) SetCdm(params->initial_cdm());
diff --git a/media/filters/frame_processor.cc b/media/filters/frame_processor.cc index 41d79c8..b770e68 100644 --- a/media/filters/frame_processor.cc +++ b/media/filters/frame_processor.cc
@@ -18,6 +18,7 @@ const int kMaxDroppedPrerollWarnings = 10; const int kMaxDtsBeyondPtsWarnings = 10; const int kMaxMuxedSequenceModeWarnings = 1; +const int kMaxNumNonkeyframePrecedesGopStartWarnings = 1; // Helper class to capture per-track details needed by a frame processor. Some // of this information may be duplicated in the short-term in the associated @@ -26,7 +27,7 @@ // http://www.w3.org/TR/media-source/#track-buffers. class MseTrackBuffer { public: - explicit MseTrackBuffer(ChunkDemuxerStream* stream); + MseTrackBuffer(ChunkDemuxerStream* stream, MediaLog* media_log); ~MseTrackBuffer(); // Get/set |last_decode_timestamp_|. @@ -104,6 +105,14 @@ // also FrameProcessor::ProcessFrame(). DecodeTimestamp last_processed_decode_timestamp_; + // This is used to understand if the stream parser is producing random access + // points that are not SAP Type 1, whose support is likely going to be + // deprecated from MSE API pending real-world usage data. This is kNoTimestamp + // if no frames have been enqueued ever or since the last + // NotifyStartOfCodedFrameGroup() or Reset(). Otherwise, this is the most + // recently enqueued keyframe's presentation timestamp. + base::TimeDelta last_keyframe_presentation_timestamp_; + // The coded frame duration of the last coded frame appended in the current // coded frame group. Initially kNoTimestamp, meaning "unset". base::TimeDelta last_frame_duration_; @@ -128,16 +137,24 @@ // clears it. StreamParser::BufferQueue processed_frames_; + // MediaLog for reporting messages and properties to debug content and engine. + MediaLog* media_log_; + + // Counter that limits spam to |media_log_| for MseTrackBuffer warnings. + int num_nonkeyframe_precedes_gop_start_warnings_ = 0; + DISALLOW_COPY_AND_ASSIGN(MseTrackBuffer); }; -MseTrackBuffer::MseTrackBuffer(ChunkDemuxerStream* stream) +MseTrackBuffer::MseTrackBuffer(ChunkDemuxerStream* stream, MediaLog* media_log) : last_decode_timestamp_(kNoDecodeTimestamp()), last_processed_decode_timestamp_(DecodeTimestamp()), + last_keyframe_presentation_timestamp_(kNoTimestamp), last_frame_duration_(kNoTimestamp), highest_presentation_timestamp_(kNoTimestamp), needs_random_access_point_(true), - stream_(stream) { + stream_(stream), + media_log_(media_log) { DCHECK(stream_); } @@ -152,6 +169,7 @@ last_frame_duration_ = kNoTimestamp; highest_presentation_timestamp_ = kNoTimestamp; needs_random_access_point_ = true; + last_keyframe_presentation_timestamp_ = kNoTimestamp; } void MseTrackBuffer::SetHighestPresentationTimestampIfIncreased( @@ -164,6 +182,28 @@ void MseTrackBuffer::EnqueueProcessedFrame( const scoped_refptr<StreamParserBuffer>& frame) { + if (frame->is_key_frame()) { + last_keyframe_presentation_timestamp_ = frame->timestamp(); + } else { + DCHECK(last_keyframe_presentation_timestamp_ != kNoTimestamp); + // This is just one case of potentially problematic GOP structures, though + // others are more clearly disallowed in at least some of the MSE bytestream + // specs, especially ISOBMFF. + if (frame->timestamp() < last_keyframe_presentation_timestamp_) { + LIMITED_MEDIA_LOG(DEBUG, media_log_, + num_nonkeyframe_precedes_gop_start_warnings_, + kMaxNumNonkeyframePrecedesGopStartWarnings) + << "Warning: presentation time of most recently processed random " + "access point (" + << last_keyframe_presentation_timestamp_ + << ") is later than the presentation time of a non-keyframe (" + << frame->timestamp() + << ") that depends on it. This type of random access point is not " + "well supported by MSE; buffered range reporting may be less " + "precise."; + } + } + last_processed_decode_timestamp_ = frame->GetDecodeTimestamp(); processed_frames_.push_back(frame); } @@ -182,6 +222,7 @@ } void MseTrackBuffer::NotifyStartOfCodedFrameGroup(DecodeTimestamp start_time) { + last_keyframe_presentation_timestamp_ = kNoTimestamp; last_processed_decode_timestamp_ = start_time; stream_->OnStartOfCodedFrameGroup(start_time); } @@ -294,7 +335,7 @@ return false; } - track_buffers_[id] = base::MakeUnique<MseTrackBuffer>(stream); + track_buffers_[id] = base::MakeUnique<MseTrackBuffer>(stream, media_log_); return true; }
diff --git a/media/filters/frame_processor_unittest.cc b/media/filters/frame_processor_unittest.cc index 7c5fb88..1240e7b2 100644 --- a/media/filters/frame_processor_unittest.cc +++ b/media/filters/frame_processor_unittest.cc
@@ -20,6 +20,7 @@ #include "media/base/media_log.h" #include "media/base/media_util.h" #include "media/base/mock_filters.h" +#include "media/base/mock_media_log.h" #include "media/base/test_helpers.h" #include "media/base/timestamp_constants.h" #include "media/filters/chunk_demuxer.h" @@ -263,7 +264,7 @@ } base::MessageLoop message_loop_; - MediaLog media_log_; + StrictMock<MockMediaLog> media_log_; StrictMock<FrameProcessorTestCallbackHelper> callbacks_; std::unique_ptr<FrameProcessor> frame_processor_; @@ -336,6 +337,7 @@ const auto& audio_buffers = StringToBufferQueue("0K", audio_id_, DemuxerStream::VIDEO); buffer_queue_map.insert(std::make_pair(audio_id_, audio_buffers)); + EXPECT_MEDIA_LOG(FrameTypeMismatchesTrackType("video", "1")); ASSERT_FALSE( frame_processor_->ProcessFrames(buffer_queue_map, append_window_start_, append_window_end_, ×tamp_offset_)); @@ -352,6 +354,7 @@ const auto& audio_buffers = StringToBufferQueue("10K 0K", audio_id_, DemuxerStream::AUDIO); buffer_queue_map.insert(std::make_pair(audio_id_, audio_buffers)); + EXPECT_MEDIA_LOG(ParsedBuffersNotInDTSSequence()); ASSERT_FALSE( frame_processor_->ProcessFrames(buffer_queue_map, append_window_start_, append_window_end_, ×tamp_offset_)); @@ -536,8 +539,10 @@ // (a0,a10,a20,a30,a40);(v0,v10,v20,v30) InSequence s; AddTestTracks(HAS_AUDIO | HAS_VIDEO); - if (GetParam()) + if (GetParam()) { frame_processor_->SetSequenceMode(true); + EXPECT_MEDIA_LOG(MuxedSequenceModeWarning()); + } EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 3)); ProcessFrames("0K 10K", "0K 10 20"); @@ -568,6 +573,7 @@ bool using_sequence_mode = GetParam(); if (using_sequence_mode) { frame_processor_->SetSequenceMode(true); + EXPECT_MEDIA_LOG(MuxedSequenceModeWarning()); EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 7)); } else { EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 6)); @@ -603,6 +609,8 @@ AddTestTracks(HAS_AUDIO | HAS_VIDEO); bool using_sequence_mode = GetParam(); frame_processor_->SetSequenceMode(using_sequence_mode); + if (using_sequence_mode) + EXPECT_MEDIA_LOG(MuxedSequenceModeWarning()); // Start a coded frame group at time 100ms. Note the jagged start still uses // the coded frame group's start time as the range start for both streams. @@ -722,6 +730,7 @@ // applied to frames beginning at the first frame after the discontinuity // caused by the video append at 160K, below. SetTimestampOffset(frame_duration_ * 10); + EXPECT_MEDIA_LOG(MuxedSequenceModeWarning()); } EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 14)); ProcessFrames("100K 110K 120K", "110K 120K 130K"); @@ -906,6 +915,8 @@ InSequence s; AddTestTracks(HAS_AUDIO); bool using_sequence_mode = GetParam(); + + EXPECT_MEDIA_LOG(ParsedDTSGreaterThanPTS()).Times(2); if (using_sequence_mode) { frame_processor_->SetSequenceMode(true); EXPECT_CALL(callbacks_, PossibleDurationIncrease( @@ -941,9 +952,12 @@ // partial front trim, to prevent incorrect introduction of a discontinuity // and potentially a non-keyframe video frame to be processed next after the // discontinuity. + bool using_sequence_mode = GetParam(); InSequence s; AddTestTracks(HAS_AUDIO | HAS_VIDEO); - frame_processor_->SetSequenceMode(GetParam()); + frame_processor_->SetSequenceMode(using_sequence_mode); + if (using_sequence_mode) + EXPECT_MEDIA_LOG(MuxedSequenceModeWarning()); EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_)); ProcessFrames("", "0K"); EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_)); @@ -1027,6 +1041,45 @@ last_read_parser_buffer->preroll_buffer()->duration()); } +TEST_P(FrameProcessorTest, + OOOKeyframePrecededByDependantNonKeyframeShouldWarn) { + bool is_sequence_mode = GetParam(); + InSequence s; + AddTestTracks(HAS_VIDEO); + frame_processor_->SetSequenceMode(is_sequence_mode); + + if (is_sequence_mode) { + // Allow room in the timeline for the last video append (40|70, below) in + // this test to remain within default append window [0, +Infinity]. Moving + // the sequence mode appends to begin at time 50ms, the same time as the + // first append, below, also results in identical expectation checks for + // buffered ranges and buffer reads for both segments and sequence modes. + SetTimestampOffset(frame_duration_ * 5); + } + + EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 7)); + ProcessFrames("", "50K 60"); + + CheckExpectedRangesByTimestamp(video_.get(), "{ [50,70) }"); + + EXPECT_MEDIA_LOG(ParsedDTSGreaterThanPTS()); + EXPECT_MEDIA_LOG(NonkeyframePrecedesGopStartWarning("0.05", "0.04")); + EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 7)); + ProcessFrames("", "40|70"); // PTS=40, DTS=70 + + // Verify DTS-based range is increased. + // TODO(wolenetz): Update this expectation to be { [50,70] } when switching to + // managing and reporting buffered ranges by PTS intervals instead of DTS + // intervals. This reflects the expectation that PTS start is not "pulled + // backward" for the new frame at PTS=40 because current spec text doesn't + // support SAP Type 2; it has no steps in the coded frame processing algorithm + // that would do that "pulling backward". See https://crbug.com/718641 and + // https://github.com/w3c/media-source/issues/187. + CheckExpectedRangesByTimestamp(video_.get(), "{ [50,80) }"); + seek(video_.get(), base::TimeDelta()); + CheckReadsThenReadStalls(video_.get(), "50 60 40"); +} + INSTANTIATE_TEST_CASE_P(SequenceMode, FrameProcessorTest, Values(true)); INSTANTIATE_TEST_CASE_P(SegmentsMode, FrameProcessorTest, Values(false));
diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc index 8afb950..c92214f 100644 --- a/media/filters/gpu_video_decoder.cc +++ b/media/filters/gpu_video_decoder.cc
@@ -83,21 +83,15 @@ enum { kMaxInFlightDecodes = 4 }; struct GpuVideoDecoder::PendingDecoderBuffer { - PendingDecoderBuffer(std::unique_ptr<SHMBuffer> s, + PendingDecoderBuffer(std::unique_ptr<base::SharedMemory> s, const scoped_refptr<DecoderBuffer>& b, const DecodeCB& done_cb) - : shm_buffer(std::move(s)), buffer(b), done_cb(done_cb) {} - std::unique_ptr<SHMBuffer> shm_buffer; + : shared_memory(std::move(s)), buffer(b), done_cb(done_cb) {} + std::unique_ptr<base::SharedMemory> shared_memory; scoped_refptr<DecoderBuffer> buffer; DecodeCB done_cb; }; -GpuVideoDecoder::SHMBuffer::SHMBuffer(std::unique_ptr<base::SharedMemory> m, - size_t s) - : shm(std::move(m)), size(s) {} - -GpuVideoDecoder::SHMBuffer::~SHMBuffer() {} - GpuVideoDecoder::BufferData::BufferData(int32_t bbid, base::TimeDelta ts, const gfx::Rect& vr, @@ -439,17 +433,17 @@ } size_t size = buffer->data_size(); - std::unique_ptr<SHMBuffer> shm_buffer = GetSHM(size); - if (!shm_buffer) { + auto shared_memory = GetSharedMemory(size); + if (!shared_memory) { bound_decode_cb.Run(DecodeStatus::DECODE_ERROR); return; } - memcpy(shm_buffer->shm->memory(), buffer->data(), size); + memcpy(shared_memory->memory(), buffer->data(), size); // AndroidVideoDecodeAccelerator needs the timestamp to output frames in // presentation order. BitstreamBuffer bitstream_buffer(next_bitstream_buffer_id_, - shm_buffer->shm->handle(), size, 0, + shared_memory->handle(), size, 0, buffer->timestamp()); if (buffer->decrypt_config()) @@ -461,7 +455,7 @@ !base::ContainsKey(bitstream_buffers_in_decoder_, bitstream_buffer.id())); bitstream_buffers_in_decoder_.emplace( bitstream_buffer.id(), - PendingDecoderBuffer(std::move(shm_buffer), buffer, decode_cb)); + PendingDecoderBuffer(std::move(shared_memory), buffer, decode_cb)); DCHECK_LE(static_cast<int>(bitstream_buffers_in_decoder_.size()), kMaxInFlightDecodes); RecordBufferData(bitstream_buffer, *buffer.get()); @@ -748,27 +742,24 @@ vda_->ReusePictureBuffer(picture_buffer_id); } -std::unique_ptr<GpuVideoDecoder::SHMBuffer> GpuVideoDecoder::GetSHM( +std::unique_ptr<base::SharedMemory> GpuVideoDecoder::GetSharedMemory( size_t min_size) { DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); if (available_shm_segments_.empty() || - available_shm_segments_.back()->size < min_size) { + available_shm_segments_.back()->mapped_size() < min_size) { size_t size_to_allocate = std::max(min_size, kSharedMemorySegmentBytes); - std::unique_ptr<base::SharedMemory> shm = - factories_->CreateSharedMemory(size_to_allocate); // CreateSharedMemory() can return NULL during Shutdown. - if (!shm) - return NULL; - return base::MakeUnique<SHMBuffer>(std::move(shm), size_to_allocate); + return factories_->CreateSharedMemory(size_to_allocate); } - std::unique_ptr<SHMBuffer> ret(std::move(available_shm_segments_.back())); + auto ret = std::move(available_shm_segments_.back()); available_shm_segments_.pop_back(); return ret; } -void GpuVideoDecoder::PutSHM(std::unique_ptr<SHMBuffer> shm_buffer) { +void GpuVideoDecoder::PutSharedMemory( + std::unique_ptr<base::SharedMemory> shared_memory) { DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); - available_shm_segments_.push_back(std::move(shm_buffer)); + available_shm_segments_.push_back(std::move(shared_memory)); } void GpuVideoDecoder::NotifyEndOfBitstreamBuffer(int32_t id) { @@ -783,7 +774,7 @@ return; } - PutSHM(std::move(it->second.shm_buffer)); + PutSharedMemory(std::move(it->second.shared_memory)); it->second.done_cb.Run(state_ == kError ? DecodeStatus::DECODE_ERROR : DecodeStatus::OK); bitstream_buffers_in_decoder_.erase(it);
diff --git a/media/filters/gpu_video_decoder.h b/media/filters/gpu_video_decoder.h index 4463a0e..c765d31c 100644 --- a/media/filters/gpu_video_decoder.h +++ b/media/filters/gpu_video_decoder.h
@@ -90,14 +90,6 @@ kError }; - // A shared memory segment and its allocated size. - struct SHMBuffer { - SHMBuffer(std::unique_ptr<base::SharedMemory> m, size_t s); - ~SHMBuffer(); - std::unique_ptr<base::SharedMemory> shm; - size_t size; - }; - // A SHMBuffer and the DecoderBuffer its data came from. struct PendingDecoderBuffer; @@ -125,10 +117,10 @@ // Request a shared-memory segment of at least |min_size| bytes. Will // allocate as necessary. - std::unique_ptr<SHMBuffer> GetSHM(size_t min_size); + std::unique_ptr<base::SharedMemory> GetSharedMemory(size_t min_size); // Return a shared-memory segment to the available pool. - void PutSHM(std::unique_ptr<SHMBuffer> shm_buffer); + void PutSharedMemory(std::unique_ptr<base::SharedMemory> shm_buffer); // Destroy all PictureBuffers in |buffers|, and delete their textures. void DestroyPictureBuffers(PictureBufferMap* buffers); @@ -187,7 +179,7 @@ // Shared-memory buffer pool. Since allocating SHM segments requires a // round-trip to the browser process, we keep allocation out of the // steady-state of the decoder. - std::vector<std::unique_ptr<SHMBuffer>> available_shm_segments_; + std::vector<std::unique_ptr<base::SharedMemory>> available_shm_segments_; // Placeholder sync token that was created and validated after the most // recent picture buffers were created.
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn index 6066206a..5a4cc5dd7 100644 --- a/media/gpu/BUILD.gn +++ b/media/gpu/BUILD.gn
@@ -133,6 +133,8 @@ "fake_jpeg_decode_accelerator.h", "fake_video_decode_accelerator.cc", "fake_video_decode_accelerator.h", + "gles2_decoder_helper.cc", + "gles2_decoder_helper.h", "gpu_video_accelerator_util.cc", "gpu_video_accelerator_util.h", "gpu_video_decode_accelerator_factory.cc",
diff --git a/media/gpu/gles2_decoder_helper.cc b/media/gpu/gles2_decoder_helper.cc new file mode 100644 index 0000000..25726f9a --- /dev/null +++ b/media/gpu/gles2_decoder_helper.cc
@@ -0,0 +1,124 @@ +// Copyright 2017 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 "media/gpu/gles2_decoder_helper.h" + +#include "base/macros.h" +#include "base/memory/ptr_util.h" +#include "base/threading/thread_checker.h" +#include "gpu/command_buffer/common/mailbox.h" +#include "gpu/command_buffer/service/context_group.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder.h" +#include "gpu/command_buffer/service/mailbox_manager.h" +#include "gpu/command_buffer/service/texture_manager.h" +#include "ui/gl/gl_context.h" + +namespace media { + +class GLES2DecoderHelperImpl : public GLES2DecoderHelper { + public: + explicit GLES2DecoderHelperImpl(gpu::gles2::GLES2Decoder* decoder) + : decoder_(decoder) {} + + bool MakeContextCurrent() override { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + return decoder_->MakeCurrent(); + } + + scoped_refptr<gpu::gles2::TextureRef> CreateTexture(GLenum target, + GLenum internal_format, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type) override { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + DCHECK(decoder_->GetGLContext()->IsCurrent(nullptr)); + gpu::gles2::ContextGroup* group = decoder_->GetContextGroup(); + gpu::gles2::TextureManager* texture_manager = group->texture_manager(); + // TODO(sandersd): Support GLES2DecoderPassthroughImpl. + DCHECK(texture_manager); + + // We can't use texture_manager->CreateTexture(), since it requires a unique + // |client_id|. Instead we create the texture directly, and create our own + // TextureRef for it. + GLuint texture_id; + glGenTextures(1, &texture_id); + glBindTexture(target, texture_id); + + scoped_refptr<gpu::gles2::TextureRef> texture_ref = + gpu::gles2::TextureRef::Create(texture_manager, 0, texture_id); + texture_manager->SetTarget(texture_ref.get(), target); + texture_manager->SetLevelInfo(texture_ref.get(), // ref + target, // target + 0, // level + internal_format, // internal_format + width, // width + height, // height + 1, // depth + 0, // border + format, // format + type, // type + gfx::Rect()); // cleared_rect + + texture_manager->SetParameteri(__func__, decoder_->GetErrorState(), + texture_ref.get(), GL_TEXTURE_MAG_FILTER, + GL_LINEAR); + texture_manager->SetParameteri(__func__, decoder_->GetErrorState(), + texture_ref.get(), GL_TEXTURE_MIN_FILTER, + GL_LINEAR); + + texture_manager->SetParameteri(__func__, decoder_->GetErrorState(), + texture_ref.get(), GL_TEXTURE_WRAP_S, + GL_CLAMP_TO_EDGE); + texture_manager->SetParameteri(__func__, decoder_->GetErrorState(), + texture_ref.get(), GL_TEXTURE_WRAP_T, + GL_CLAMP_TO_EDGE); + + texture_manager->SetParameteri(__func__, decoder_->GetErrorState(), + texture_ref.get(), GL_TEXTURE_BASE_LEVEL, 0); + texture_manager->SetParameteri(__func__, decoder_->GetErrorState(), + texture_ref.get(), GL_TEXTURE_MAX_LEVEL, 0); + + // TODO(sandersd): Do we always want to allocate for GL_TEXTURE_2D? + if (target == GL_TEXTURE_2D) { + glTexImage2D(target, // target + 0, // level + internal_format, // internal_format + width, // width + height, // height + 0, // border + format, // format + type, // type + nullptr); // data + } + + decoder_->RestoreActiveTextureUnitBinding(target); + return texture_ref; + } + + gpu::Mailbox CreateMailbox(gpu::gles2::TextureRef* texture_ref) override { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + gpu::gles2::ContextGroup* group = decoder_->GetContextGroup(); + gpu::gles2::MailboxManager* mailbox_manager = group->mailbox_manager(); + gpu::Mailbox mailbox = gpu::Mailbox::Generate(); + mailbox_manager->ProduceTexture(mailbox, texture_ref->texture()); + return mailbox; + } + + private: + gpu::gles2::GLES2Decoder* decoder_; + THREAD_CHECKER(thread_checker_); + + DISALLOW_COPY_AND_ASSIGN(GLES2DecoderHelperImpl); +}; + +// static +std::unique_ptr<GLES2DecoderHelper> GLES2DecoderHelper::Create( + gpu::gles2::GLES2Decoder* decoder) { + if (!decoder) + return nullptr; + return base::MakeUnique<GLES2DecoderHelperImpl>(decoder); +} + +} // namespace media
diff --git a/media/gpu/gles2_decoder_helper.h b/media/gpu/gles2_decoder_helper.h new file mode 100644 index 0000000..60f8dfae --- /dev/null +++ b/media/gpu/gles2_decoder_helper.h
@@ -0,0 +1,59 @@ +// Copyright 2017 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 MEDIA_GPU_GLES2_DECODER_HELPER_H_ +#define MEDIA_GPU_GLES2_DECODER_HELPER_H_ + +#include <stdint.h> + +#include <memory> + +#include "base/memory/ref_counted.h" +#include "base/optional.h" +#include "media/gpu/media_gpu_export.h" +#include "ui/gl/gl_bindings.h" + +namespace gpu { +struct Mailbox; +namespace gles2 { +class GLES2Decoder; +class TextureRef; +} // namespace gles2 +} // namespace gpu + +namespace media { + +// Utility methods to simplify working with a gpu::gles2::GLES2Decoder from +// inside VDAs. +class MEDIA_GPU_EXPORT GLES2DecoderHelper { + public: + static std::unique_ptr<GLES2DecoderHelper> Create( + gpu::gles2::GLES2Decoder* decoder); + + virtual ~GLES2DecoderHelper() {} + + // TODO(sandersd): Provide scoped version? + virtual bool MakeContextCurrent() = 0; + + // Creates a texture and configures it as a video frame (linear filtering, + // clamp to edge, no mipmaps). The context must be current. + // + // See glTexImage2D() for parameter definitions. + // + // Returns nullptr on failure, but there are currently no failure paths. + virtual scoped_refptr<gpu::gles2::TextureRef> CreateTexture( + GLenum target, + GLenum internal_format, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type) = 0; + + // Creates a mailbox for a texture. + virtual gpu::Mailbox CreateMailbox(gpu::gles2::TextureRef* texture_ref) = 0; +}; + +} // namespace media + +#endif // MEDIA_GPU_GLES2_DECODER_HELPER_H_
diff --git a/media/gpu/ipc/client/gpu_video_encode_accelerator_host.cc b/media/gpu/ipc/client/gpu_video_encode_accelerator_host.cc index 3f18bc0..9e4fe86 100644 --- a/media/gpu/ipc/client/gpu_video_encode_accelerator_host.cc +++ b/media/gpu/ipc/client/gpu_video_encode_accelerator_host.cc
@@ -223,9 +223,8 @@ Error error, const std::string& message) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DLOG(ERROR) << "Error from " << location.function_name() << "(" - << location.file_name() << ":" << location.line_number() << ") " - << message << " (error = " << error << ")"; + DLOG(ERROR) << "Error from " << location.ToString() << ", " << message + << " (error = " << error << ")"; // Post the error notification back to this thread, to avoid re-entrancy. media_task_runner_->PostTask( FROM_HERE, base::Bind(&GpuVideoEncodeAcceleratorHost::OnNotifyError, @@ -249,10 +248,10 @@ DVLOG(2) << __func__ << " input_count=" << input_count << ", input_coded_size=" << input_coded_size.ToString() << ", output_buffer_size=" << output_buffer_size; - if (client_) { - client_->RequireBitstreamBuffers(input_count, input_coded_size, - output_buffer_size); - } + if (!client_) + return; + client_->RequireBitstreamBuffers(input_count, input_coded_size, + output_buffer_size); } void GpuVideoEncodeAcceleratorHost::OnNotifyInputDone(int32_t frame_id) { @@ -283,9 +282,10 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DVLOG(3) << __func__ << " bitstream_buffer_id=" << bitstream_buffer_id << ", payload_size=" << payload_size << ", key_frame=" << key_frame; - if (client_) - client_->BitstreamBufferReady(bitstream_buffer_id, payload_size, key_frame, - timestamp); + if (!client_) + return; + client_->BitstreamBufferReady(bitstream_buffer_id, payload_size, key_frame, + timestamp); } void GpuVideoEncodeAcceleratorHost::OnNotifyError(Error error) {
diff --git a/media/mojo/BUILD.gn b/media/mojo/BUILD.gn index 224db04..6b9e99f 100644 --- a/media/mojo/BUILD.gn +++ b/media/mojo/BUILD.gn
@@ -74,6 +74,9 @@ "common/media_type_converters_unittest.cc", "common/mojo_decoder_buffer_converter_unittest.cc", "common/mojo_shared_buffer_video_frame_unittest.cc", + "interfaces/audio_decoder_config_struct_traits_unittest.cc", + "interfaces/encryption_scheme_struct_traits_unittest.cc", + "interfaces/video_decoder_config_struct_traits_unittest.cc", "interfaces/video_frame_struct_traits_unittest.cc", "services/mojo_audio_output_stream_unittest.cc", "services/mojo_cdm_allocator_unittest.cc",
diff --git a/media/mojo/clients/BUILD.gn b/media/mojo/clients/BUILD.gn index a299b51d..407b7dd9 100644 --- a/media/mojo/clients/BUILD.gn +++ b/media/mojo/clients/BUILD.gn
@@ -35,6 +35,8 @@ "mojo_decryptor.h", "mojo_demuxer_stream_impl.cc", "mojo_demuxer_stream_impl.h", + "mojo_media_log_service.cc", + "mojo_media_log_service.h", "mojo_renderer.cc", "mojo_renderer.h", "mojo_renderer_factory.cc",
diff --git a/media/mojo/clients/mojo_audio_decoder.cc b/media/mojo/clients/mojo_audio_decoder.cc index 2023236..94a86b3 100644 --- a/media/mojo/clients/mojo_audio_decoder.cc +++ b/media/mojo/clients/mojo_audio_decoder.cc
@@ -70,7 +70,7 @@ // Using base::Unretained(this) is safe because |this| owns |remote_decoder_|, // and the callback won't be dispatched if |remote_decoder_| is destroyed. remote_decoder_->Initialize( - mojom::AudioDecoderConfig::From(config), cdm_id, + config, cdm_id, base::Bind(&MojoAudioDecoder::OnInitialized, base::Unretained(this))); }
diff --git a/media/mojo/clients/mojo_decoder_factory.cc b/media/mojo/clients/mojo_decoder_factory.cc index e187d48e..1a9e6e8b 100644 --- a/media/mojo/clients/mojo_decoder_factory.cc +++ b/media/mojo/clients/mojo_decoder_factory.cc
@@ -38,13 +38,14 @@ void MojoDecoderFactory::CreateVideoDecoders( scoped_refptr<base::SingleThreadTaskRunner> task_runner, GpuVideoAcceleratorFactories* gpu_factories, + MediaLog* media_log, std::vector<std::unique_ptr<VideoDecoder>>* video_decoders) { #if BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER) mojom::VideoDecoderPtr remote_decoder; service_manager::GetInterface<mojom::VideoDecoder>(interface_provider_, &remote_decoder); video_decoders->push_back(base::MakeUnique<MojoVideoDecoder>( - task_runner, gpu_factories, std::move(remote_decoder))); + task_runner, gpu_factories, media_log, std::move(remote_decoder))); #endif }
diff --git a/media/mojo/clients/mojo_decoder_factory.h b/media/mojo/clients/mojo_decoder_factory.h index edf3546..cd6725ed 100644 --- a/media/mojo/clients/mojo_decoder_factory.h +++ b/media/mojo/clients/mojo_decoder_factory.h
@@ -25,6 +25,7 @@ void CreateVideoDecoders( scoped_refptr<base::SingleThreadTaskRunner> task_runner, GpuVideoAcceleratorFactories* gpu_factories, + MediaLog* media_log, std::vector<std::unique_ptr<VideoDecoder>>* video_decoders) final; private:
diff --git a/media/mojo/clients/mojo_decryptor.cc b/media/mojo/clients/mojo_decryptor.cc index 4b57ed9a1..9297175 100644 --- a/media/mojo/clients/mojo_decryptor.cc +++ b/media/mojo/clients/mojo_decryptor.cc
@@ -102,8 +102,7 @@ DVLOG(1) << __func__; DCHECK(thread_checker_.CalledOnValidThread()); - remote_decryptor_->InitializeAudioDecoder( - mojom::AudioDecoderConfig::From(config), init_cb); + remote_decryptor_->InitializeAudioDecoder(config, init_cb); } void MojoDecryptor::InitializeVideoDecoder(const VideoDecoderConfig& config, @@ -111,8 +110,7 @@ DVLOG(1) << __func__; DCHECK(thread_checker_.CalledOnValidThread()); - remote_decryptor_->InitializeVideoDecoder( - mojom::VideoDecoderConfig::From(config), init_cb); + remote_decryptor_->InitializeVideoDecoder(config, init_cb); } void MojoDecryptor::DecryptAndDecodeAudio(
diff --git a/media/mojo/clients/mojo_demuxer_stream_impl.cc b/media/mojo/clients/mojo_demuxer_stream_impl.cc index 8d51802..89d4772 100644 --- a/media/mojo/clients/mojo_demuxer_stream_impl.cc +++ b/media/mojo/clients/mojo_demuxer_stream_impl.cc
@@ -29,18 +29,16 @@ // This is called when our DemuxerStreamClient has connected itself and is // ready to receive messages. Send an initial config and notify it that // we are now ready for business. -void MojoDemuxerStreamImpl::Initialize(const InitializeCallback& callback) { +void MojoDemuxerStreamImpl::Initialize(InitializeCallback callback) { DVLOG(2) << __func__; // Prepare the initial config. - mojom::AudioDecoderConfigPtr audio_config; - mojom::VideoDecoderConfigPtr video_config; + base::Optional<AudioDecoderConfig> audio_config; + base::Optional<VideoDecoderConfig> video_config; if (stream_->type() == Type::AUDIO) { - audio_config = - mojom::AudioDecoderConfig::From(stream_->audio_decoder_config()); + audio_config = stream_->audio_decoder_config(); } else if (stream_->type() == Type::VIDEO) { - video_config = - mojom::VideoDecoderConfig::From(stream_->video_decoder_config()); + video_config = stream_->video_decoder_config(); } else { NOTREACHED() << "Unsupported stream type: " << stream_->type(); return; @@ -50,13 +48,14 @@ mojo_decoder_buffer_writer_ = MojoDecoderBufferWriter::Create(stream_->type(), &remote_consumer_handle); - callback.Run(stream_->type(), std::move(remote_consumer_handle), - std::move(audio_config), std::move(video_config)); + std::move(callback).Run(stream_->type(), std::move(remote_consumer_handle), + audio_config, video_config); } -void MojoDemuxerStreamImpl::Read(const ReadCallback& callback) { +void MojoDemuxerStreamImpl::Read(ReadCallback callback) { stream_->Read(base::Bind(&MojoDemuxerStreamImpl::OnBufferReady, - weak_factory_.GetWeakPtr(), callback)); + weak_factory_.GetWeakPtr(), + base::Passed(&callback))); } void MojoDemuxerStreamImpl::EnableBitstreamConverter() { @@ -64,35 +63,33 @@ } void MojoDemuxerStreamImpl::OnBufferReady( - const ReadCallback& callback, + ReadCallback callback, Status status, const scoped_refptr<media::DecoderBuffer>& buffer) { - mojom::AudioDecoderConfigPtr audio_config; - mojom::VideoDecoderConfigPtr video_config; + base::Optional<AudioDecoderConfig> audio_config; + base::Optional<VideoDecoderConfig> video_config; if (status == Status::kConfigChanged) { DVLOG(2) << __func__ << ": ConfigChange!"; // Send the config change so our client can read it once it parses the // Status obtained via Run() below. if (stream_->type() == Type::AUDIO) { - audio_config = - mojom::AudioDecoderConfig::From(stream_->audio_decoder_config()); + audio_config = stream_->audio_decoder_config(); } else if (stream_->type() == Type::VIDEO) { - video_config = - mojom::VideoDecoderConfig::From(stream_->video_decoder_config()); + video_config = stream_->video_decoder_config(); } else { NOTREACHED() << "Unsupported config change encountered for type: " << stream_->type(); } - callback.Run(Status::kConfigChanged, mojom::DecoderBufferPtr(), - std::move(audio_config), std::move(video_config)); + std::move(callback).Run(Status::kConfigChanged, mojom::DecoderBufferPtr(), + audio_config, video_config); return; } if (status == Status::kAborted) { - callback.Run(Status::kAborted, mojom::DecoderBufferPtr(), - std::move(audio_config), std::move(video_config)); + std::move(callback).Run(Status::kAborted, mojom::DecoderBufferPtr(), + audio_config, video_config); return; } @@ -101,16 +98,16 @@ mojom::DecoderBufferPtr mojo_buffer = mojo_decoder_buffer_writer_->WriteDecoderBuffer(buffer); if (!mojo_buffer) { - callback.Run(Status::kAborted, mojom::DecoderBufferPtr(), - std::move(audio_config), std::move(video_config)); + std::move(callback).Run(Status::kAborted, mojom::DecoderBufferPtr(), + audio_config, video_config); return; } // TODO(dalecurtis): Once we can write framed data to the DataPipe, fill via // the producer handle and then read more to keep the pipe full. Waiting for // space can be accomplished using an AsyncWaiter. - callback.Run(status, std::move(mojo_buffer), std::move(audio_config), - std::move(video_config)); + std::move(callback).Run(status, std::move(mojo_buffer), audio_config, + video_config); } } // namespace media
diff --git a/media/mojo/clients/mojo_demuxer_stream_impl.h b/media/mojo/clients/mojo_demuxer_stream_impl.h index 684c262..4524b1d5 100644 --- a/media/mojo/clients/mojo_demuxer_stream_impl.h +++ b/media/mojo/clients/mojo_demuxer_stream_impl.h
@@ -32,8 +32,8 @@ // mojom::DemuxerStream implementation. // InitializeCallback and ReadCallback are defined in // mojom::DemuxerStream. - void Initialize(const InitializeCallback& callback) override; - void Read(const ReadCallback& callback) override; + void Initialize(InitializeCallback callback) override; + void Read(ReadCallback callback) override; void EnableBitstreamConverter() override; // Sets an error handler that will be called if a connection error occurs on @@ -46,7 +46,7 @@ using Type = media::DemuxerStream::Type; using Status = media::DemuxerStream::Status; - void OnBufferReady(const ReadCallback& callback, + void OnBufferReady(ReadCallback callback, Status status, const scoped_refptr<media::DecoderBuffer>& buffer);
diff --git a/media/mojo/clients/mojo_media_log_service.cc b/media/mojo/clients/mojo_media_log_service.cc new file mode 100644 index 0000000..5403543 --- /dev/null +++ b/media/mojo/clients/mojo_media_log_service.cc
@@ -0,0 +1,40 @@ +// Copyright 2017 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 "media/mojo/clients/mojo_media_log_service.h" + +#include <memory> + +#include "base/logging.h" +#include "base/memory/ptr_util.h" +#include "media/base/media_log_event.h" + +namespace media { + +MojoMediaLogService::MojoMediaLogService(media::MediaLog* media_log) + : media_log_(media_log) { + DVLOG(1) << __func__; + DCHECK(media_log_); +} + +MojoMediaLogService::~MojoMediaLogService() { + DVLOG(1) << __func__; +} + +void MojoMediaLogService::AddEvent(const media::MediaLogEvent& event) { + DVLOG(1) << __func__; + + // Make a copy so that we can transfer ownership to |media_log_|. + std::unique_ptr<media::MediaLogEvent> modified_event = + base::MakeUnique<media::MediaLogEvent>(event); + + // |id| is player-unique per-process, but the remote side does not know the + // correct value (nor would we necessarily trust it). Overwrite with the + // correct value. + modified_event->id = media_log_->id(); + + media_log_->AddEvent(std::move(modified_event)); +} + +} // namespace media
diff --git a/media/mojo/clients/mojo_media_log_service.h b/media/mojo/clients/mojo_media_log_service.h new file mode 100644 index 0000000..80d2a3a --- /dev/null +++ b/media/mojo/clients/mojo_media_log_service.h
@@ -0,0 +1,33 @@ +// Copyright 2017 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 MEDIA_MOJO_CLIENTS_MOJO_MEDIA_LOG_SERVICE_H_ +#define MEDIA_MOJO_CLIENTS_MOJO_MEDIA_LOG_SERVICE_H_ + +#include <stdint.h> + +#include "base/macros.h" +#include "media/base/media_log.h" +#include "media/mojo/interfaces/media_log.mojom.h" + +namespace media { + +// Implementation of a mojom::MediaLog service which wraps a media::MediaLog. +class MojoMediaLogService : public mojom::MediaLog { + public: + explicit MojoMediaLogService(media::MediaLog* media_log); + ~MojoMediaLogService() final; + + // mojom::MediaLog implementation + void AddEvent(const media::MediaLogEvent& event) final; + + private: + media::MediaLog* media_log_; + + DISALLOW_COPY_AND_ASSIGN(MojoMediaLogService); +}; + +} // namespace media + +#endif // MEDIA_MOJO_CLIENTS_MOJO_MEDIA_LOG_SERVICE_H_
diff --git a/media/mojo/clients/mojo_renderer_unittest.cc b/media/mojo/clients/mojo_renderer_unittest.cc index 6b54148f..222543f 100644 --- a/media/mojo/clients/mojo_renderer_unittest.cc +++ b/media/mojo/clients/mojo_renderer_unittest.cc
@@ -105,6 +105,7 @@ void CreateAudioStream() { audio_stream_ = CreateStream(DemuxerStream::AUDIO); + audio_stream_->set_audio_decoder_config(TestAudioConfig::Normal()); streams_.push_back(audio_stream_.get()); EXPECT_CALL(demuxer_, GetAllStreams()).WillRepeatedly(Return(streams_)); }
diff --git a/media/mojo/clients/mojo_video_decoder.cc b/media/mojo/clients/mojo_video_decoder.cc index 37135b8a..637bf89 100644 --- a/media/mojo/clients/mojo_video_decoder.cc +++ b/media/mojo/clients/mojo_video_decoder.cc
@@ -26,11 +26,14 @@ MojoVideoDecoder::MojoVideoDecoder( scoped_refptr<base::SingleThreadTaskRunner> task_runner, GpuVideoAcceleratorFactories* gpu_factories, + MediaLog* media_log, mojom::VideoDecoderPtr remote_decoder) : task_runner_(task_runner), remote_decoder_info_(remote_decoder.PassInterface()), gpu_factories_(gpu_factories), client_binding_(this), + media_log_service_(media_log), + media_log_binding_(&media_log_service_), weak_factory_(this) { DVLOG(1) << __func__; } @@ -67,7 +70,7 @@ init_cb_ = init_cb; output_cb_ = output_cb; remote_decoder_->Initialize( - mojom::VideoDecoderConfig::From(config), low_delay, + config, low_delay, base::Bind(&MojoVideoDecoder::OnInitializeDone, base::Unretained(this))); } @@ -198,10 +201,12 @@ remote_decoder_.set_connection_error_handler( base::Bind(&MojoVideoDecoder::Stop, base::Unretained(this))); - // TODO(sandersd): Does this need its own error handler? mojom::VideoDecoderClientAssociatedPtrInfo client_ptr_info; client_binding_.Bind(mojo::MakeRequest(&client_ptr_info)); + mojom::MediaLogAssociatedPtrInfo media_log_ptr_info; + media_log_binding_.Bind(mojo::MakeRequest(&media_log_ptr_info)); + // TODO(sandersd): Better buffer sizing. mojo::ScopedDataPipeConsumerHandle remote_consumer_handle; mojo_decoder_buffer_writer_ = MojoDecoderBufferWriter::Create( @@ -217,9 +222,9 @@ } } - remote_decoder_->Construct(std::move(client_ptr_info), - std::move(remote_consumer_handle), - std::move(command_buffer_id)); + remote_decoder_->Construct( + std::move(client_ptr_info), std::move(media_log_ptr_info), + std::move(remote_consumer_handle), std::move(command_buffer_id)); } void MojoVideoDecoder::Stop() {
diff --git a/media/mojo/clients/mojo_video_decoder.h b/media/mojo/clients/mojo_video_decoder.h index 1f2f9f8..c8d9d27 100644 --- a/media/mojo/clients/mojo_video_decoder.h +++ b/media/mojo/clients/mojo_video_decoder.h
@@ -9,6 +9,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "media/base/video_decoder.h" +#include "media/mojo/clients/mojo_media_log_service.h" #include "media/mojo/interfaces/video_decoder.mojom.h" #include "mojo/public/cpp/bindings/associated_binding.h" @@ -19,6 +20,7 @@ namespace media { class GpuVideoAcceleratorFactories; +class MediaLog; class MojoDecoderBufferWriter; // A VideoDecoder, for use in the renderer process, that proxies to a @@ -30,6 +32,7 @@ public: MojoVideoDecoder(scoped_refptr<base::SingleThreadTaskRunner> task_runner, GpuVideoAcceleratorFactories* gpu_factories, + MediaLog* media_log, mojom::VideoDecoderPtr remote_decoder); ~MojoVideoDecoder() final; @@ -87,7 +90,9 @@ std::unique_ptr<MojoDecoderBufferWriter> mojo_decoder_buffer_writer_; bool remote_decoder_bound_ = false; bool has_connection_error_ = false; - mojo::AssociatedBinding<VideoDecoderClient> client_binding_; + mojo::AssociatedBinding<mojom::VideoDecoderClient> client_binding_; + MojoMediaLogService media_log_service_; + mojo::AssociatedBinding<mojom::MediaLog> media_log_binding_; bool initialized_ = false; bool needs_bitstream_conversion_ = false;
diff --git a/media/mojo/common/media_type_converters.cc b/media/mojo/common/media_type_converters.cc index 5571a8b..d1f584c 100644 --- a/media/mojo/common/media_type_converters.cc +++ b/media/mojo/common/media_type_converters.cc
@@ -17,7 +17,6 @@ #include "media/base/decrypt_config.h" #include "media/base/encryption_scheme.h" #include "media/base/subsample_entry.h" -#include "media/base/video_decoder_config.h" #include "mojo/public/cpp/system/buffer.h" namespace mojo { @@ -36,44 +35,6 @@ }; // static -media::mojom::PatternPtr -TypeConverter<media::mojom::PatternPtr, media::EncryptionScheme::Pattern>:: - Convert(const media::EncryptionScheme::Pattern& input) { - media::mojom::PatternPtr mojo_pattern(media::mojom::Pattern::New()); - mojo_pattern->encrypt_blocks = input.encrypt_blocks(); - mojo_pattern->skip_blocks = input.skip_blocks(); - return mojo_pattern; -} - -// static -media::EncryptionScheme::Pattern TypeConverter< - media::EncryptionScheme::Pattern, - media::mojom::PatternPtr>::Convert(const media::mojom::PatternPtr& input) { - return media::EncryptionScheme::Pattern(input->encrypt_blocks, - input->skip_blocks); -} - -// static -media::mojom::EncryptionSchemePtr TypeConverter< - media::mojom::EncryptionSchemePtr, - media::EncryptionScheme>::Convert(const media::EncryptionScheme& input) { - media::mojom::EncryptionSchemePtr mojo_encryption_scheme( - media::mojom::EncryptionScheme::New()); - mojo_encryption_scheme->mode = input.mode(); - mojo_encryption_scheme->pattern = - media::mojom::Pattern::From(input.pattern()); - return mojo_encryption_scheme; -} - -// static -media::EncryptionScheme -TypeConverter<media::EncryptionScheme, media::mojom::EncryptionSchemePtr>:: - Convert(const media::mojom::EncryptionSchemePtr& input) { - return media::EncryptionScheme( - input->mode, input->pattern.To<media::EncryptionScheme::Pattern>()); -} - -// static media::mojom::DecryptConfigPtr TypeConverter<media::mojom::DecryptConfigPtr, media::DecryptConfig>::Convert( const media::DecryptConfig& input) { @@ -183,8 +144,7 @@ config->extra_data = input.extra_data(); config->seek_preroll = input.seek_preroll(); config->codec_delay = input.codec_delay(); - config->encryption_scheme = - media::mojom::EncryptionScheme::From(input.encryption_scheme()); + config->encryption_scheme = input.encryption_scheme(); return config; } @@ -195,45 +155,8 @@ media::AudioDecoderConfig config; config.Initialize(input->codec, input->sample_format, input->channel_layout, input->samples_per_second, input->extra_data, - input->encryption_scheme.To<media::EncryptionScheme>(), - input->seek_preroll, input->codec_delay); - return config; -} - -// static -media::mojom::VideoDecoderConfigPtr -TypeConverter<media::mojom::VideoDecoderConfigPtr, media::VideoDecoderConfig>:: - Convert(const media::VideoDecoderConfig& input) { - media::mojom::VideoDecoderConfigPtr config( - media::mojom::VideoDecoderConfig::New()); - config->codec = input.codec(); - config->profile = input.profile(); - config->format = input.format(); - config->color_space = input.color_space(); - config->coded_size = input.coded_size(); - config->visible_rect = input.visible_rect(); - config->natural_size = input.natural_size(); - config->extra_data = input.extra_data(); - config->encryption_scheme = - media::mojom::EncryptionScheme::From(input.encryption_scheme()); - config->color_space_info = input.color_space_info(); - if (input.hdr_metadata()) - config->hdr_metadata = *input.hdr_metadata(); - return config; -} - -// static -media::VideoDecoderConfig -TypeConverter<media::VideoDecoderConfig, media::mojom::VideoDecoderConfigPtr>:: - Convert(const media::mojom::VideoDecoderConfigPtr& input) { - media::VideoDecoderConfig config; - config.Initialize(input->codec, input->profile, input->format, - input->color_space, input->coded_size, input->visible_rect, - input->natural_size, input->extra_data, - input->encryption_scheme.To<media::EncryptionScheme>()); - config.set_color_space_info(input->color_space_info); - if (input->hdr_metadata) - config.set_hdr_metadata(*input->hdr_metadata); + input->encryption_scheme, input->seek_preroll, + input->codec_delay); return config; }
diff --git a/media/mojo/common/media_type_converters.h b/media/mojo/common/media_type_converters.h index c10c277..d99cf1b66 100644 --- a/media/mojo/common/media_type_converters.h +++ b/media/mojo/common/media_type_converters.h
@@ -17,8 +17,6 @@ class AudioDecoderConfig; class DecoderBuffer; class DecryptConfig; -class EncryptionScheme; -class VideoDecoderConfig; struct CdmConfig; struct CdmKeyInformation; } @@ -28,19 +26,6 @@ namespace mojo { template <> -struct TypeConverter<media::mojom::EncryptionSchemePtr, - media::EncryptionScheme> { - static media::mojom::EncryptionSchemePtr Convert( - const media::EncryptionScheme& input); -}; -template <> -struct TypeConverter<media::EncryptionScheme, - media::mojom::EncryptionSchemePtr> { - static media::EncryptionScheme Convert( - const media::mojom::EncryptionSchemePtr& input); -}; - -template <> struct TypeConverter<media::mojom::DecryptConfigPtr, media::DecryptConfig> { static media::mojom::DecryptConfigPtr Convert( const media::DecryptConfig& input); @@ -79,19 +64,6 @@ }; template <> -struct TypeConverter<media::mojom::VideoDecoderConfigPtr, - media::VideoDecoderConfig> { - static media::mojom::VideoDecoderConfigPtr Convert( - const media::VideoDecoderConfig& input); -}; -template <> -struct TypeConverter<media::VideoDecoderConfig, - media::mojom::VideoDecoderConfigPtr> { - static media::VideoDecoderConfig Convert( - const media::mojom::VideoDecoderConfigPtr& input); -}; - -template <> struct TypeConverter<media::mojom::CdmKeyInformationPtr, media::CdmKeyInformation> { static media::mojom::CdmKeyInformationPtr Convert(
diff --git a/media/mojo/common/media_type_converters_unittest.cc b/media/mojo/common/media_type_converters_unittest.cc index 7ba0fa5..3d5d2a5 100644 --- a/media/mojo/common/media_type_converters_unittest.cc +++ b/media/mojo/common/media_type_converters_unittest.cc
@@ -24,10 +24,6 @@ namespace { -static const gfx::Size kCodedSize(320, 240); -static const gfx::Rect kVisibleRect(320, 240); -static const gfx::Size kNaturalSize(320, 240); - void CompareBytes(uint8_t* original_data, uint8_t* result_data, size_t length) { EXPECT_GT(length, 0u); EXPECT_EQ(memcmp(original_data, result_data, length), 0); @@ -167,112 +163,6 @@ EXPECT_TRUE(buffer->decrypt_config()->iv().empty()); } -// TODO(tim): Check other properties. - -TEST(MediaTypeConvertersTest, ConvertAudioDecoderConfig_Normal) { - const uint8_t kExtraData[] = "config extra data"; - const std::vector<uint8_t> kExtraDataVector( - &kExtraData[0], &kExtraData[0] + arraysize(kExtraData)); - - AudioDecoderConfig config; - config.Initialize(kCodecAAC, kSampleFormatU8, CHANNEL_LAYOUT_SURROUND, 48000, - kExtraDataVector, Unencrypted(), base::TimeDelta(), 0); - mojom::AudioDecoderConfigPtr ptr(mojom::AudioDecoderConfig::From(config)); - EXPECT_FALSE(ptr->extra_data.empty()); - AudioDecoderConfig result(ptr.To<AudioDecoderConfig>()); - EXPECT_TRUE(result.Matches(config)); -} - -TEST(MediaTypeConvertersTest, ConvertAudioDecoderConfig_EmptyExtraData) { - AudioDecoderConfig config; - config.Initialize(kCodecAAC, kSampleFormatU8, CHANNEL_LAYOUT_SURROUND, 48000, - EmptyExtraData(), Unencrypted(), base::TimeDelta(), 0); - mojom::AudioDecoderConfigPtr ptr(mojom::AudioDecoderConfig::From(config)); - EXPECT_TRUE(ptr->extra_data.empty()); - AudioDecoderConfig result(ptr.To<AudioDecoderConfig>()); - EXPECT_TRUE(result.Matches(config)); -} - -TEST(MediaTypeConvertersTest, ConvertAudioDecoderConfig_Encrypted) { - AudioDecoderConfig config; - config.Initialize(kCodecAAC, kSampleFormatU8, CHANNEL_LAYOUT_SURROUND, 48000, - EmptyExtraData(), AesCtrEncryptionScheme(), - base::TimeDelta(), 0); - mojom::AudioDecoderConfigPtr ptr(mojom::AudioDecoderConfig::From(config)); - AudioDecoderConfig result(ptr.To<AudioDecoderConfig>()); - EXPECT_TRUE(result.Matches(config)); -} - -TEST(MediaTypeConvertersTest, ConvertVideoDecoderConfig_Normal) { - const uint8_t kExtraData[] = "config extra data"; - const std::vector<uint8_t> kExtraDataVector( - &kExtraData[0], &kExtraData[0] + arraysize(kExtraData)); - - VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12, - COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect, - kNaturalSize, kExtraDataVector, Unencrypted()); - mojom::VideoDecoderConfigPtr ptr(mojom::VideoDecoderConfig::From(config)); - EXPECT_FALSE(ptr->extra_data.empty()); - VideoDecoderConfig result(ptr.To<VideoDecoderConfig>()); - EXPECT_TRUE(result.Matches(config)); -} - -TEST(MediaTypeConvertersTest, ConvertVideoDecoderConfig_EmptyExtraData) { - VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12, - COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect, - kNaturalSize, EmptyExtraData(), Unencrypted()); - mojom::VideoDecoderConfigPtr ptr(mojom::VideoDecoderConfig::From(config)); - EXPECT_TRUE(ptr->extra_data.empty()); - VideoDecoderConfig result(ptr.To<VideoDecoderConfig>()); - EXPECT_TRUE(result.Matches(config)); -} - -TEST(MediaTypeConvertersTest, ConvertVideoDecoderConfig_Encrypted) { - VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12, - COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect, - kNaturalSize, EmptyExtraData(), - AesCtrEncryptionScheme()); - mojom::VideoDecoderConfigPtr ptr(mojom::VideoDecoderConfig::From(config)); - VideoDecoderConfig result(ptr.To<VideoDecoderConfig>()); - EXPECT_TRUE(result.Matches(config)); -} - -TEST(MediaTypeConvertersTest, ConvertVideoDecoderConfig_ColorSpaceInfo) { - VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12, - COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect, - kNaturalSize, EmptyExtraData(), Unencrypted()); - config.set_color_space_info(VideoColorSpace( - VideoColorSpace::PrimaryID::BT2020, - VideoColorSpace::TransferID::SMPTEST2084, - VideoColorSpace::MatrixID::BT2020_CL, gfx::ColorSpace::RangeID::LIMITED)); - mojom::VideoDecoderConfigPtr ptr(mojom::VideoDecoderConfig::From(config)); - VideoDecoderConfig result(ptr.To<VideoDecoderConfig>()); - EXPECT_TRUE(result.Matches(config)); -} - -TEST(MediaTypeConvertersTest, ConvertVideoDecoderConfig_HDRMetadata) { - VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12, - COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect, - kNaturalSize, EmptyExtraData(), Unencrypted()); - HDRMetadata hdr_metadata; - hdr_metadata.max_frame_average_light_level = 123; - hdr_metadata.max_content_light_level = 456; - hdr_metadata.mastering_metadata.primary_r.set_x(0.1f); - hdr_metadata.mastering_metadata.primary_r.set_y(0.2f); - hdr_metadata.mastering_metadata.primary_g.set_x(0.3f); - hdr_metadata.mastering_metadata.primary_g.set_y(0.4f); - hdr_metadata.mastering_metadata.primary_b.set_x(0.5f); - hdr_metadata.mastering_metadata.primary_b.set_y(0.6f); - hdr_metadata.mastering_metadata.white_point.set_x(0.7f); - hdr_metadata.mastering_metadata.white_point.set_y(0.8f); - hdr_metadata.mastering_metadata.luminance_max = 1000; - hdr_metadata.mastering_metadata.luminance_min = 0; - config.set_hdr_metadata(hdr_metadata); - mojom::VideoDecoderConfigPtr ptr(mojom::VideoDecoderConfig::From(config)); - VideoDecoderConfig result(ptr.To<VideoDecoderConfig>()); - EXPECT_TRUE(result.Matches(config)); -} - TEST(MediaTypeConvertersTest, ConvertCdmConfig) { CdmConfig config; config.allow_distinctive_identifier = true; @@ -334,20 +224,4 @@ CompareAudioBuffers(kSampleFormatPlanarF32, buffer, result); } -TEST(MediaTypeConvertersTest, ConvertEncryptionSchemeAesCbcWithPattern) { - // Original. - EncryptionScheme scheme(EncryptionScheme::CIPHER_MODE_AES_CBC, - EncryptionScheme::Pattern(1, 9)); - - // Convert to and back. - mojom::EncryptionSchemePtr ptr(mojom::EncryptionScheme::From(scheme)); - EncryptionScheme result(ptr.To<EncryptionScheme>()); - - EXPECT_TRUE(result.Matches(scheme)); - - // Verify a couple of negative cases. - EXPECT_FALSE(result.Matches(Unencrypted())); - EXPECT_FALSE(result.Matches(AesCtrEncryptionScheme())); -} - } // namespace media
diff --git a/media/mojo/interfaces/BUILD.gn b/media/mojo/interfaces/BUILD.gn index 9055e38e..ad90949 100644 --- a/media/mojo/interfaces/BUILD.gn +++ b/media/mojo/interfaces/BUILD.gn
@@ -13,6 +13,7 @@ "decryptor.mojom", "demuxer_stream.mojom", "interface_factory.mojom", + "media_log.mojom", "media_service.mojom", "media_types.mojom", "output_protection.mojom", @@ -41,9 +42,6 @@ "//url/mojo:url_mojom_gurl", "//url/mojo:url_mojom_origin", ] - - # TODO(crbug.com/714018): Convert the implementation to use OnceCallback. - use_once_callback = false } mojom("constants") {
diff --git a/media/mojo/interfaces/audio_decoder_config.typemap b/media/mojo/interfaces/audio_decoder_config.typemap new file mode 100644 index 0000000..a2d7d1a --- /dev/null +++ b/media/mojo/interfaces/audio_decoder_config.typemap
@@ -0,0 +1,27 @@ +# Copyright 2017 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. + +mojom = "//media/mojo/interfaces/media_types.mojom" + +public_headers = [ "//media/base/audio_decoder_config.h" ] + +traits_headers = + [ "//media/mojo/interfaces/audio_decoder_config_struct_traits.h" ] + +sources = [ + "//media/mojo/interfaces/audio_decoder_config_struct_traits.cc", +] + +public_deps = [ + "//base", + "//media", +] + +deps = [ + "//media/base/ipc", + "//mojo/common:struct_traits", +] + +# See media_types.typemap for enum mappings. +type_mappings = [ "media.mojom.AudioDecoderConfig=media::AudioDecoderConfig" ]
diff --git a/media/mojo/interfaces/audio_decoder_config_struct_traits.cc b/media/mojo/interfaces/audio_decoder_config_struct_traits.cc new file mode 100644 index 0000000..192e269 --- /dev/null +++ b/media/mojo/interfaces/audio_decoder_config_struct_traits.cc
@@ -0,0 +1,48 @@ +// Copyright 2017 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 "media/mojo/interfaces/audio_decoder_config_struct_traits.h" + +namespace mojo { + +// static +bool StructTraits<media::mojom::AudioDecoderConfigDataView, + media::AudioDecoderConfig>:: + Read(media::mojom::AudioDecoderConfigDataView input, + media::AudioDecoderConfig* output) { + media::AudioCodec codec; + if (!input.ReadCodec(&codec)) + return false; + + media::SampleFormat sample_format; + if (!input.ReadSampleFormat(&sample_format)) + return false; + + media::ChannelLayout channel_layout; + if (!input.ReadChannelLayout(&channel_layout)) + return false; + + std::vector<uint8_t> extra_data; + if (!input.ReadExtraData(&extra_data)) + return false; + + media::EncryptionScheme encryption_scheme; + if (!input.ReadEncryptionScheme(&encryption_scheme)) + return false; + + base::TimeDelta seek_preroll; + if (!input.ReadSeekPreroll(&seek_preroll)) + return false; + + output->Initialize(codec, sample_format, channel_layout, + input.samples_per_second(), extra_data, encryption_scheme, + seek_preroll, input.codec_delay()); + + if (!output->IsValidConfig()) + return false; + + return true; +} + +} // namespace mojo \ No newline at end of file
diff --git a/media/mojo/interfaces/audio_decoder_config_struct_traits.h b/media/mojo/interfaces/audio_decoder_config_struct_traits.h new file mode 100644 index 0000000..81b95bc --- /dev/null +++ b/media/mojo/interfaces/audio_decoder_config_struct_traits.h
@@ -0,0 +1,61 @@ +// Copyright 2017 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 MEDIA_MOJO_INTERFACES_AUDIO_DECODER_CONFIG_STRUCT_TRAITS_H_ +#define MEDIA_MOJO_INTERFACES_AUDIO_DECODER_CONFIG_STRUCT_TRAITS_H_ + +#include "media/base/audio_decoder_config.h" +#include "media/base/ipc/media_param_traits.h" +#include "media/mojo/interfaces/encryption_scheme_struct_traits.h" +#include "media/mojo/interfaces/media_types.mojom.h" +#include "mojo/common/common_custom_types_struct_traits.h" + +namespace mojo { + +template <> +struct StructTraits<media::mojom::AudioDecoderConfigDataView, + media::AudioDecoderConfig> { + static media::AudioCodec codec(const media::AudioDecoderConfig& input) { + return input.codec(); + } + + static media::SampleFormat sample_format( + const media::AudioDecoderConfig& input) { + return input.sample_format(); + } + + static media::ChannelLayout channel_layout( + const media::AudioDecoderConfig& input) { + return input.channel_layout(); + } + + static int samples_per_second(const media::AudioDecoderConfig& input) { + return input.samples_per_second(); + } + + static const std::vector<uint8_t>& extra_data( + const media::AudioDecoderConfig& input) { + return input.extra_data(); + } + + static base::TimeDelta seek_preroll(const media::AudioDecoderConfig& input) { + return input.seek_preroll(); + } + + static int codec_delay(const media::AudioDecoderConfig& input) { + return input.codec_delay(); + } + + static const media::EncryptionScheme& encryption_scheme( + const media::AudioDecoderConfig& input) { + return input.encryption_scheme(); + } + + static bool Read(media::mojom::AudioDecoderConfigDataView input, + media::AudioDecoderConfig* output); +}; + +} // namespace mojo + +#endif // MEDIA_MOJO_INTERFACES_AUDIO_DECODER_CONFIG_STRUCT_TRAITS_H_
diff --git a/media/mojo/interfaces/audio_decoder_config_struct_traits_unittest.cc b/media/mojo/interfaces/audio_decoder_config_struct_traits_unittest.cc new file mode 100644 index 0000000..0ff6756 --- /dev/null +++ b/media/mojo/interfaces/audio_decoder_config_struct_traits_unittest.cc
@@ -0,0 +1,58 @@ +// Copyright 2017 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 "media/mojo/interfaces/audio_decoder_config_struct_traits.h" + +#include <utility> + +#include "base/macros.h" +#include "media/base/audio_decoder_config.h" +#include "media/base/media_util.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace media { + +TEST(AudioDecoderConfigStructTraitsTest, ConvertAudioDecoderConfig_Normal) { + const uint8_t kExtraData[] = "input extra data"; + const std::vector<uint8_t> kExtraDataVector( + &kExtraData[0], &kExtraData[0] + arraysize(kExtraData)); + + AudioDecoderConfig input; + input.Initialize(kCodecAAC, kSampleFormatU8, CHANNEL_LAYOUT_SURROUND, 48000, + kExtraDataVector, Unencrypted(), base::TimeDelta(), 0); + std::vector<uint8_t> data = + media::mojom::AudioDecoderConfig::Serialize(&input); + AudioDecoderConfig output; + EXPECT_TRUE( + media::mojom::AudioDecoderConfig::Deserialize(std::move(data), &output)); + EXPECT_TRUE(output.Matches(input)); +} + +TEST(AudioDecoderConfigStructTraitsTest, + ConvertAudioDecoderConfig_EmptyExtraData) { + AudioDecoderConfig input; + input.Initialize(kCodecAAC, kSampleFormatU8, CHANNEL_LAYOUT_SURROUND, 48000, + EmptyExtraData(), Unencrypted(), base::TimeDelta(), 0); + std::vector<uint8_t> data = + media::mojom::AudioDecoderConfig::Serialize(&input); + AudioDecoderConfig output; + EXPECT_TRUE( + media::mojom::AudioDecoderConfig::Deserialize(std::move(data), &output)); + EXPECT_TRUE(output.Matches(input)); +} + +TEST(AudioDecoderConfigStructTraitsTest, ConvertAudioDecoderConfig_Encrypted) { + AudioDecoderConfig input; + input.Initialize(kCodecAAC, kSampleFormatU8, CHANNEL_LAYOUT_SURROUND, 48000, + EmptyExtraData(), AesCtrEncryptionScheme(), + base::TimeDelta(), 0); + std::vector<uint8_t> data = + media::mojom::AudioDecoderConfig::Serialize(&input); + AudioDecoderConfig output; + EXPECT_TRUE( + media::mojom::AudioDecoderConfig::Deserialize(std::move(data), &output)); + EXPECT_TRUE(output.Matches(input)); +} + +} // namespace media
diff --git a/media/mojo/interfaces/encryption_scheme.typemap b/media/mojo/interfaces/encryption_scheme.typemap new file mode 100644 index 0000000..13a2c655 --- /dev/null +++ b/media/mojo/interfaces/encryption_scheme.typemap
@@ -0,0 +1,27 @@ +# Copyright 2017 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. + +mojom = "//media/mojo/interfaces/media_types.mojom" + +public_headers = [ "//media/base/encryption_scheme.h" ] + +traits_headers = [ "//media/mojo/interfaces/encryption_scheme_struct_traits.h" ] + +sources = [ + "//media/mojo/interfaces/encryption_scheme_struct_traits.cc", +] + +public_deps = [ + "//media", +] + +deps = [ + "//media/base/ipc", +] + +# See media_types.typemap for enum mappings. +type_mappings = [ + "media.mojom.Pattern=media::EncryptionScheme::Pattern", + "media.mojom.EncryptionScheme=media::EncryptionScheme", +]
diff --git a/media/mojo/interfaces/encryption_scheme_struct_traits.cc b/media/mojo/interfaces/encryption_scheme_struct_traits.cc new file mode 100644 index 0000000..e2052a93 --- /dev/null +++ b/media/mojo/interfaces/encryption_scheme_struct_traits.cc
@@ -0,0 +1,37 @@ +// Copyright 2017 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 "media/mojo/interfaces/encryption_scheme_struct_traits.h" + +namespace mojo { + +// static +bool StructTraits<media::mojom::PatternDataView, + media::EncryptionScheme::Pattern>:: + Read(media::mojom::PatternDataView input, + media::EncryptionScheme::Pattern* output) { + *output = media::EncryptionScheme::Pattern(input.encrypt_blocks(), + input.skip_blocks()); + return true; +} + +// static +bool StructTraits< + media::mojom::EncryptionSchemeDataView, + media::EncryptionScheme>::Read(media::mojom::EncryptionSchemeDataView input, + media::EncryptionScheme* output) { + media::EncryptionScheme::CipherMode mode; + if (!input.ReadMode(&mode)) + return false; + + media::EncryptionScheme::Pattern pattern; + if (!input.ReadPattern(&pattern)) + return false; + + *output = media::EncryptionScheme(mode, pattern); + + return true; +} + +} // namespace mojo \ No newline at end of file
diff --git a/media/mojo/interfaces/encryption_scheme_struct_traits.h b/media/mojo/interfaces/encryption_scheme_struct_traits.h new file mode 100644 index 0000000..7eaa35a --- /dev/null +++ b/media/mojo/interfaces/encryption_scheme_struct_traits.h
@@ -0,0 +1,49 @@ +// Copyright 2017 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 MEDIA_MOJO_INTERFACES_ENCRYPTION_SCHEME_STRUCT_TRAITS_H_ +#define MEDIA_MOJO_INTERFACES_ENCRYPTION_SCHEME_STRUCT_TRAITS_H_ + +#include "media/base/encryption_scheme.h" +#include "media/base/ipc/media_param_traits.h" +#include "media/mojo/interfaces/media_types.mojom.h" + +namespace mojo { + +template <> +struct StructTraits<media::mojom::PatternDataView, + media::EncryptionScheme::Pattern> { + static uint32_t encrypt_blocks( + const media::EncryptionScheme::Pattern& input) { + return input.encrypt_blocks(); + } + + static uint32_t skip_blocks(const media::EncryptionScheme::Pattern& input) { + return input.skip_blocks(); + } + + static bool Read(media::mojom::PatternDataView input, + media::EncryptionScheme::Pattern* output); +}; + +template <> +struct StructTraits<media::mojom::EncryptionSchemeDataView, + media::EncryptionScheme> { + static media::EncryptionScheme::CipherMode mode( + const media::EncryptionScheme& input) { + return input.mode(); + } + + static media::EncryptionScheme::Pattern pattern( + const media::EncryptionScheme& input) { + return input.pattern(); + } + + static bool Read(media::mojom::EncryptionSchemeDataView input, + media::EncryptionScheme* output); +}; + +} // namespace mojo + +#endif // MEDIA_MOJO_INTERFACES_ENCRYPTION_SCHEME_STRUCT_TRAITS_H_
diff --git a/media/mojo/interfaces/encryption_scheme_struct_traits_unittest.cc b/media/mojo/interfaces/encryption_scheme_struct_traits_unittest.cc new file mode 100644 index 0000000..cb017a3f --- /dev/null +++ b/media/mojo/interfaces/encryption_scheme_struct_traits_unittest.cc
@@ -0,0 +1,31 @@ +// Copyright 2017 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 "media/mojo/interfaces/encryption_scheme_struct_traits.h" + +#include <utility> + +#include "media/base/encryption_scheme.h" +#include "media/base/media_util.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace media { + +TEST(EncryptionSchemeStructTraitsTest, + ConvertEncryptionSchemeAesCbcWithPattern) { + EncryptionScheme input(EncryptionScheme::CIPHER_MODE_AES_CBC, + EncryptionScheme::Pattern(1, 9)); + std::vector<uint8_t> data = media::mojom::EncryptionScheme::Serialize(&input); + + EncryptionScheme output; + EXPECT_TRUE( + media::mojom::EncryptionScheme::Deserialize(std::move(data), &output)); + EXPECT_TRUE(output.Matches(input)); + + // Verify a couple of negative cases. + EXPECT_FALSE(output.Matches(Unencrypted())); + EXPECT_FALSE(output.Matches(AesCtrEncryptionScheme())); +} + +} // namespace media
diff --git a/media/mojo/interfaces/media_log.mojom b/media/mojo/interfaces/media_log.mojom new file mode 100644 index 0000000..05f3b64 --- /dev/null +++ b/media/mojo/interfaces/media_log.mojom
@@ -0,0 +1,11 @@ +// Copyright 2017 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. + +module media.mojom; + +import "media/mojo/interfaces/media_types.mojom"; + +interface MediaLog { + AddEvent(MediaLogEvent event); +};
diff --git a/media/mojo/interfaces/media_types.mojom b/media/mojo/interfaces/media_types.mojom index 5448756c..bb40ad4f 100644 --- a/media/mojo/interfaces/media_types.mojom +++ b/media/mojo/interfaces/media_types.mojom
@@ -8,21 +8,29 @@ import "mojo/common/time.mojom"; import "ui/gfx/geometry/mojo/geometry.mojom"; +// See media/base/audio_codecs.h for descriptions. +[Native] +enum AudioCodec; + // See media/base/buffering_state.h for descriptions. [Native] enum BufferingState; +// See media/base/channel_layout.h for descriptions. +[Native] +enum ChannelLayout; + +// See media/base/video_types.h for descriptions. +[Native] +enum ColorSpace; + // See media/base/decode_status.h for descriptions. [Native] enum DecodeStatus; -// See media/base/audio_codecs.h for descriptions. +// See media/base/media_log_event.h for description. [Native] -enum AudioCodec; - -// See media/base/channel_layout.h for descriptions. -[Native] -enum ChannelLayout; +struct MediaLogEvent; // See media/base/output_device_info.h for descriptions. [Native] @@ -32,14 +40,6 @@ [Native] enum SampleFormat; -// See media/base/video_types.h for descriptions. -[Native] -enum VideoPixelFormat; - -// See media/base/video_types.h for descriptions. -[Native] -enum ColorSpace; - // See media/base/video_codecs.h for descriptions. [Native] enum VideoCodec; @@ -48,6 +48,10 @@ [Native] enum VideoCodecProfile; +// See media/base/video_types.h for descriptions. +[Native] +enum VideoPixelFormat; + // This defines a mojo transport format for media::EncryptionScheme::Pattern // See media/base/encryption_scheme.h for description. struct Pattern {
diff --git a/media/mojo/interfaces/media_types.typemap b/media/mojo/interfaces/media_types.typemap index cc8b655..f885864 100644 --- a/media/mojo/interfaces/media_types.typemap +++ b/media/mojo/interfaces/media_types.typemap
@@ -11,6 +11,7 @@ "//media/base/decode_status.h", "//media/base/encryption_scheme.h", "//media/base/hdr_metadata.h", + "//media/base/media_log_event.h", "//media/base/output_device_info.h", "//media/base/sample_format.h", "//media/base/subsample_entry.h", @@ -35,6 +36,7 @@ "media.mojom.ColorSpace=media::ColorSpace", "media.mojom.DecodeStatus=media::DecodeStatus", "media.mojom.EncryptionScheme.CipherMode=media::EncryptionScheme::CipherMode", + "media.mojom.MediaLogEvent=media::MediaLogEvent", "media.mojom.OutputDeviceStatus=media::OutputDeviceStatus", "media.mojom.SampleFormat=media::SampleFormat", "media.mojom.SubsampleEntry=media::SubsampleEntry",
diff --git a/media/mojo/interfaces/typemaps.gni b/media/mojo/interfaces/typemaps.gni index f485f00..1785024 100644 --- a/media/mojo/interfaces/typemaps.gni +++ b/media/mojo/interfaces/typemaps.gni
@@ -3,13 +3,16 @@ # found in the LICENSE file. typemaps = [ + "//media/mojo/interfaces/audio_decoder_config.typemap", "//media/mojo/interfaces/audio_parameters.typemap", "//media/mojo/interfaces/content_decryption_module.typemap", "//media/mojo/interfaces/decryptor.typemap", "//media/mojo/interfaces/demuxer_stream.typemap", + "//media/mojo/interfaces/encryption_scheme.typemap", "//media/mojo/interfaces/hdr_metadata.typemap", "//media/mojo/interfaces/media_types.typemap", "//media/mojo/interfaces/pipeline_statistics.typemap", "//media/mojo/interfaces/video_color_space.typemap", + "//media/mojo/interfaces/video_decoder_config.typemap", "//media/mojo/interfaces/video_frame.typemap", ]
diff --git a/media/mojo/interfaces/video_decoder.mojom b/media/mojo/interfaces/video_decoder.mojom index 36ae91f..3b1430d 100644 --- a/media/mojo/interfaces/video_decoder.mojom +++ b/media/mojo/interfaces/video_decoder.mojom
@@ -5,6 +5,7 @@ module media.mojom; import "gpu/ipc/common/sync_token.mojom"; +import "media/mojo/interfaces/media_log.mojom"; import "media/mojo/interfaces/media_types.mojom"; import "mojo/common/unguessable_token.mojom"; @@ -28,6 +29,7 @@ // TODO(sandersd): Rename to Initialize() if/when // media::VideoDecoder::Initialize() is renamed to Configure(). Construct(associated VideoDecoderClient client, + associated MediaLog media_log, handle<data_pipe_consumer> decoder_buffer_pipe, CommandBufferId? command_buffer_id);
diff --git a/media/mojo/interfaces/video_decoder_config.typemap b/media/mojo/interfaces/video_decoder_config.typemap new file mode 100644 index 0000000..41fbc5b --- /dev/null +++ b/media/mojo/interfaces/video_decoder_config.typemap
@@ -0,0 +1,27 @@ +# Copyright 2017 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. + +mojom = "//media/mojo/interfaces/media_types.mojom" + +public_headers = [ "//media/base/video_decoder_config.h" ] + +traits_headers = + [ "//media/mojo/interfaces/video_decoder_config_struct_traits.h" ] + +sources = [ + "video_decoder_config_struct_traits.cc", +] + +public_deps = [ + "//base", + "//media", +] + +deps = [ + "//media/base/ipc", + "//ui/gfx/geometry/mojo:struct_traits", +] + +# See media_types.typemap for enum mappings. +type_mappings = [ "media.mojom.VideoDecoderConfig=media::VideoDecoderConfig" ]
diff --git a/media/mojo/interfaces/video_decoder_config_struct_traits.cc b/media/mojo/interfaces/video_decoder_config_struct_traits.cc new file mode 100644 index 0000000..3e2c2457 --- /dev/null +++ b/media/mojo/interfaces/video_decoder_config_struct_traits.cc
@@ -0,0 +1,72 @@ +// Copyright 2017 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 "media/mojo/interfaces/video_decoder_config_struct_traits.h" + +namespace mojo { + +// static +bool StructTraits<media::mojom::VideoDecoderConfigDataView, + media::VideoDecoderConfig>:: + Read(media::mojom::VideoDecoderConfigDataView input, + media::VideoDecoderConfig* output) { + media::VideoCodec codec; + if (!input.ReadCodec(&codec)) + return false; + + media::VideoCodecProfile profile; + if (!input.ReadProfile(&profile)) + return false; + + media::VideoPixelFormat format; + if (!input.ReadFormat(&format)) + return false; + + media::ColorSpace color_space; + if (!input.ReadColorSpace(&color_space)) + return false; + + gfx::Size coded_size; + if (!input.ReadCodedSize(&coded_size)) + return false; + + gfx::Rect visible_rect; + if (!input.ReadVisibleRect(&visible_rect)) + return false; + + gfx::Size natural_size; + if (!input.ReadNaturalSize(&natural_size)) + return false; + + std::vector<uint8_t> extra_data; + if (!input.ReadExtraData(&extra_data)) + return false; + + media::EncryptionScheme encryption_scheme; + if (!input.ReadEncryptionScheme(&encryption_scheme)) + return false; + + media::VideoColorSpace color_space_info; + if (!input.ReadColorSpaceInfo(&color_space_info)) + return false; + + base::Optional<media::HDRMetadata> hdr_metadata; + if (!input.ReadHdrMetadata(&hdr_metadata)) + return false; + + output->Initialize(codec, profile, format, color_space, coded_size, + visible_rect, natural_size, extra_data, encryption_scheme); + + output->set_color_space_info(color_space_info); + + if (hdr_metadata) + output->set_hdr_metadata(hdr_metadata.value()); + + if (!output->IsValidConfig()) + return false; + + return true; +} + +} // namespace mojo \ No newline at end of file
diff --git a/media/mojo/interfaces/video_decoder_config_struct_traits.h b/media/mojo/interfaces/video_decoder_config_struct_traits.h new file mode 100644 index 0000000..c6cbb52 --- /dev/null +++ b/media/mojo/interfaces/video_decoder_config_struct_traits.h
@@ -0,0 +1,77 @@ +// Copyright 2017 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 MEDIA_MOJO_INTERFACES_VIDEO_DECODER_CONFIG_STRUCT_TRAITS_H_ +#define MEDIA_MOJO_INTERFACES_VIDEO_DECODER_CONFIG_STRUCT_TRAITS_H_ + +#include "media/base/ipc/media_param_traits.h" +#include "media/base/video_decoder_config.h" +#include "media/mojo/interfaces/encryption_scheme_struct_traits.h" +#include "media/mojo/interfaces/hdr_metadata_struct_traits.h" +#include "media/mojo/interfaces/media_types.mojom.h" +#include "media/mojo/interfaces/video_color_space_struct_traits.h" +#include "ui/gfx/geometry/mojo/geometry_struct_traits.h" + +namespace mojo { + +template <> +struct StructTraits<media::mojom::VideoDecoderConfigDataView, + media::VideoDecoderConfig> { + static media::VideoCodec codec(const media::VideoDecoderConfig& input) { + return input.codec(); + } + + static media::VideoCodecProfile profile( + const media::VideoDecoderConfig& input) { + return input.profile(); + } + + static media::VideoPixelFormat format( + const media::VideoDecoderConfig& input) { + return input.format(); + } + + static media::ColorSpace color_space(const media::VideoDecoderConfig& input) { + return input.color_space(); + } + + static const gfx::Size& coded_size(const media::VideoDecoderConfig& input) { + return input.coded_size(); + } + + static const gfx::Rect& visible_rect(const media::VideoDecoderConfig& input) { + return input.visible_rect(); + } + + static const gfx::Size& natural_size(const media::VideoDecoderConfig& input) { + return input.natural_size(); + } + + static const std::vector<uint8_t>& extra_data( + const media::VideoDecoderConfig& input) { + return input.extra_data(); + } + + static const media::EncryptionScheme& encryption_scheme( + const media::VideoDecoderConfig& input) { + return input.encryption_scheme(); + } + + static const media::VideoColorSpace& color_space_info( + const media::VideoDecoderConfig& input) { + return input.color_space_info(); + } + + static const base::Optional<media::HDRMetadata>& hdr_metadata( + const media::VideoDecoderConfig& input) { + return input.hdr_metadata(); + } + + static bool Read(media::mojom::VideoDecoderConfigDataView input, + media::VideoDecoderConfig* output); +}; + +} // namespace mojo + +#endif // MEDIA_MOJO_INTERFACES_VIDEO_DECODER_CONFIG_STRUCT_TRAITS_H_
diff --git a/media/mojo/interfaces/video_decoder_config_struct_traits_unittest.cc b/media/mojo/interfaces/video_decoder_config_struct_traits_unittest.cc new file mode 100644 index 0000000..3b49841 --- /dev/null +++ b/media/mojo/interfaces/video_decoder_config_struct_traits_unittest.cc
@@ -0,0 +1,135 @@ +// Copyright 2017 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 "media/mojo/interfaces/video_decoder_config_struct_traits.h" + +#include <utility> + +#include "base/macros.h" +#include "media/base/media_util.h" +#include "media/base/video_decoder_config.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace media { + +namespace { + +static const gfx::Size kCodedSize(320, 240); +static const gfx::Rect kVisibleRect(320, 240); +static const gfx::Size kNaturalSize(320, 240); + +} // namespace + +TEST(VideoDecoderConfigStructTraitsTest, ConvertVideoDecoderConfig_Normal) { + const uint8_t kExtraData[] = "config extra data"; + const std::vector<uint8_t> kExtraDataVector( + &kExtraData[0], &kExtraData[0] + arraysize(kExtraData)); + VideoDecoderConfig input(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12, + COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect, + kNaturalSize, kExtraDataVector, Unencrypted()); + std::vector<uint8_t> data = + media::mojom::VideoDecoderConfig::Serialize(&input); + VideoDecoderConfig output; + EXPECT_TRUE( + media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output)); + EXPECT_TRUE(output.Matches(input)); +} + +TEST(VideoDecoderConfigStructTraitsTest, + ConvertVideoDecoderConfig_EmptyExtraData) { + VideoDecoderConfig input(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12, + COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect, + kNaturalSize, EmptyExtraData(), Unencrypted()); + std::vector<uint8_t> data = + media::mojom::VideoDecoderConfig::Serialize(&input); + VideoDecoderConfig output; + EXPECT_TRUE( + media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output)); + EXPECT_TRUE(output.Matches(input)); +} + +TEST(VideoDecoderConfigStructTraitsTest, ConvertVideoDecoderConfig_Encrypted) { + VideoDecoderConfig input(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12, + COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect, + kNaturalSize, EmptyExtraData(), + AesCtrEncryptionScheme()); + std::vector<uint8_t> data = + media::mojom::VideoDecoderConfig::Serialize(&input); + VideoDecoderConfig output; + EXPECT_TRUE( + media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output)); + EXPECT_TRUE(output.Matches(input)); +} + +TEST(VideoDecoderConfigStructTraitsTest, + ConvertVideoDecoderConfig_ColorSpaceInfo) { + VideoDecoderConfig input(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12, + COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect, + kNaturalSize, EmptyExtraData(), Unencrypted()); + input.set_color_space_info(VideoColorSpace( + VideoColorSpace::PrimaryID::BT2020, + VideoColorSpace::TransferID::SMPTEST2084, + VideoColorSpace::MatrixID::BT2020_CL, gfx::ColorSpace::RangeID::LIMITED)); + std::vector<uint8_t> data = + media::mojom::VideoDecoderConfig::Serialize(&input); + VideoDecoderConfig output; + EXPECT_TRUE( + media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output)); + EXPECT_TRUE(output.Matches(input)); +} + +TEST(VideoDecoderConfigStructTraitsTest, + ConvertVideoDecoderConfig_HDRMetadata) { + VideoDecoderConfig input(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12, + COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect, + kNaturalSize, EmptyExtraData(), Unencrypted()); + HDRMetadata hdr_metadata; + hdr_metadata.max_frame_average_light_level = 123; + hdr_metadata.max_content_light_level = 456; + hdr_metadata.mastering_metadata.primary_r.set_x(0.1f); + hdr_metadata.mastering_metadata.primary_r.set_y(0.2f); + hdr_metadata.mastering_metadata.primary_g.set_x(0.3f); + hdr_metadata.mastering_metadata.primary_g.set_y(0.4f); + hdr_metadata.mastering_metadata.primary_b.set_x(0.5f); + hdr_metadata.mastering_metadata.primary_b.set_y(0.6f); + hdr_metadata.mastering_metadata.white_point.set_x(0.7f); + hdr_metadata.mastering_metadata.white_point.set_y(0.8f); + hdr_metadata.mastering_metadata.luminance_max = 1000; + hdr_metadata.mastering_metadata.luminance_min = 0; + input.set_hdr_metadata(hdr_metadata); + std::vector<uint8_t> data = + media::mojom::VideoDecoderConfig::Serialize(&input); + VideoDecoderConfig output; + EXPECT_TRUE( + media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output)); + EXPECT_TRUE(output.Matches(input)); +} + +TEST(VideoDecoderConfigStructTraitsTest, + ConvertVideoDecoderConfig_InvalidConfigs) { + // Create an invalid empty config. + VideoDecoderConfig input; + EXPECT_FALSE(input.IsValidConfig()); + + std::vector<uint8_t> data = + media::mojom::VideoDecoderConfig::Serialize(&input); + VideoDecoderConfig output; + + // Deserialize should only pass for valid configs. + EXPECT_FALSE( + media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output)); + + // Next try an non-empty invalid config. Natural size must not be zero. + const gfx::Size kInvalidNaturalSize(0, 0); + input.Initialize(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12, + COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect, + kInvalidNaturalSize, EmptyExtraData(), Unencrypted()); + EXPECT_FALSE(input.IsValidConfig()); + + // Deserialize should again fail due to invalid config. + EXPECT_FALSE( + media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output)); +} + +} // namespace media
diff --git a/media/mojo/services/BUILD.gn b/media/mojo/services/BUILD.gn index 87b60ed..8cd21c59 100644 --- a/media/mojo/services/BUILD.gn +++ b/media/mojo/services/BUILD.gn
@@ -55,6 +55,8 @@ "mojo_demuxer_stream_adapter.h", "mojo_media_client.cc", "mojo_media_client.h", + "mojo_media_log.cc", + "mojo_media_log.h", "mojo_provision_fetcher.cc", "mojo_provision_fetcher.h", "mojo_renderer_service.cc",
diff --git a/media/mojo/services/gpu_mojo_media_client.cc b/media/mojo/services/gpu_mojo_media_client.cc index 786b64c..b46d574 100644 --- a/media/mojo/services/gpu_mojo_media_client.cc +++ b/media/mojo/services/gpu_mojo_media_client.cc
@@ -68,6 +68,7 @@ std::unique_ptr<VideoDecoder> GpuMojoMediaClient::CreateVideoDecoder( scoped_refptr<base::SingleThreadTaskRunner> task_runner, + MediaLog* media_log, mojom::CommandBufferIdPtr command_buffer_id, OutputWithReleaseMailboxCB output_cb) { static_cast<void>(media_gpu_channel_manager_);
diff --git a/media/mojo/services/gpu_mojo_media_client.h b/media/mojo/services/gpu_mojo_media_client.h index 9be197bc..a3c6cb40 100644 --- a/media/mojo/services/gpu_mojo_media_client.h +++ b/media/mojo/services/gpu_mojo_media_client.h
@@ -31,6 +31,7 @@ scoped_refptr<base::SingleThreadTaskRunner> task_runner) final; std::unique_ptr<VideoDecoder> CreateVideoDecoder( scoped_refptr<base::SingleThreadTaskRunner> task_runner, + MediaLog* media_log, mojom::CommandBufferIdPtr command_buffer_id, OutputWithReleaseMailboxCB output_cb) final; std::unique_ptr<CdmFactory> CreateCdmFactory(
diff --git a/media/mojo/services/mojo_audio_decoder_service.cc b/media/mojo/services/mojo_audio_decoder_service.cc index 2fd18de..c11f536 100644 --- a/media/mojo/services/mojo_audio_decoder_service.cc +++ b/media/mojo/services/mojo_audio_decoder_service.cc
@@ -32,42 +32,40 @@ client_.Bind(std::move(client)); } -void MojoAudioDecoderService::Initialize( - mojom::AudioDecoderConfigPtr config, - int32_t cdm_id, - const InitializeCallback& callback) { - DVLOG(1) << __func__ << " " - << config.To<media::AudioDecoderConfig>().AsHumanReadableString(); +void MojoAudioDecoderService::Initialize(const AudioDecoderConfig& config, + int32_t cdm_id, + InitializeCallback callback) { + DVLOG(1) << __func__ << " " << config.AsHumanReadableString(); // Get CdmContext from cdm_id if the stream is encrypted. CdmContext* cdm_context = nullptr; scoped_refptr<ContentDecryptionModule> cdm; - if (config.To<media::AudioDecoderConfig>().is_encrypted()) { + if (config.is_encrypted()) { if (!mojo_cdm_service_context_) { DVLOG(1) << "CDM service context not available."; - callback.Run(false, false); + std::move(callback).Run(false, false); return; } cdm = mojo_cdm_service_context_->GetCdm(cdm_id); if (!cdm) { DVLOG(1) << "CDM not found for CDM id: " << cdm_id; - callback.Run(false, false); + std::move(callback).Run(false, false); return; } cdm_context = cdm->GetCdmContext(); if (!cdm_context) { DVLOG(1) << "CDM context not available for CDM id: " << cdm_id; - callback.Run(false, false); + std::move(callback).Run(false, false); return; } } decoder_->Initialize( - config.To<media::AudioDecoderConfig>(), cdm_context, - base::Bind(&MojoAudioDecoderService::OnInitialized, weak_this_, callback, - cdm), + config, cdm_context, + base::Bind(&MojoAudioDecoderService::OnInitialized, weak_this_, + base::Passed(&callback), cdm), base::Bind(&MojoAudioDecoderService::OnAudioBufferReady, weak_this_)); } @@ -80,31 +78,31 @@ } void MojoAudioDecoderService::Decode(mojom::DecoderBufferPtr buffer, - const DecodeCallback& callback) { + DecodeCallback callback) { DVLOG(3) << __func__; mojo_decoder_buffer_reader_->ReadDecoderBuffer( std::move(buffer), base::BindOnce(&MojoAudioDecoderService::OnReadDone, - weak_this_, callback)); + weak_this_, std::move(callback))); } -void MojoAudioDecoderService::Reset(const ResetCallback& callback) { +void MojoAudioDecoderService::Reset(ResetCallback callback) { DVLOG(1) << __func__; - decoder_->Reset( - base::Bind(&MojoAudioDecoderService::OnResetDone, weak_this_, callback)); + decoder_->Reset(base::Bind(&MojoAudioDecoderService::OnResetDone, weak_this_, + base::Passed(&callback))); } void MojoAudioDecoderService::OnInitialized( - const InitializeCallback& callback, + InitializeCallback callback, scoped_refptr<ContentDecryptionModule> cdm, bool success) { DVLOG(1) << __func__ << " success:" << success; if (success) { cdm_ = cdm; - callback.Run(success, decoder_->NeedsBitstreamConversion()); + std::move(callback).Run(success, decoder_->NeedsBitstreamConversion()); } else { // Do not call decoder_->NeedsBitstreamConversion() if init failed. - callback.Run(false, false); + std::move(callback).Run(false, false); } } @@ -112,28 +110,28 @@ // to avoid running the |callback| after connection error happens and |this| is // deleted. It's not safe to run the |callback| after a connection error. -void MojoAudioDecoderService::OnReadDone(const DecodeCallback& callback, +void MojoAudioDecoderService::OnReadDone(DecodeCallback callback, scoped_refptr<DecoderBuffer> buffer) { DVLOG(3) << __func__ << " success:" << !!buffer; if (!buffer) { - callback.Run(DecodeStatus::DECODE_ERROR); + std::move(callback).Run(DecodeStatus::DECODE_ERROR); return; } decoder_->Decode(buffer, base::Bind(&MojoAudioDecoderService::OnDecodeStatus, - weak_this_, callback)); + weak_this_, base::Passed(&callback))); } -void MojoAudioDecoderService::OnDecodeStatus(const DecodeCallback& callback, +void MojoAudioDecoderService::OnDecodeStatus(DecodeCallback callback, media::DecodeStatus status) { DVLOG(3) << __func__ << " status:" << status; - callback.Run(status); + std::move(callback).Run(status); } -void MojoAudioDecoderService::OnResetDone(const ResetCallback& callback) { +void MojoAudioDecoderService::OnResetDone(ResetCallback callback) { DVLOG(1) << __func__; - callback.Run(); + std::move(callback).Run(); } void MojoAudioDecoderService::OnAudioBufferReady(
diff --git a/media/mojo/services/mojo_audio_decoder_service.h b/media/mojo/services/mojo_audio_decoder_service.h index 6230892..37b27957 100644 --- a/media/mojo/services/mojo_audio_decoder_service.h +++ b/media/mojo/services/mojo_audio_decoder_service.h
@@ -32,32 +32,29 @@ // mojom::AudioDecoder implementation void Construct(mojom::AudioDecoderClientAssociatedPtrInfo client) final; - void Initialize(mojom::AudioDecoderConfigPtr config, + void Initialize(const AudioDecoderConfig& config, int32_t cdm_id, - const InitializeCallback& callback) final; + InitializeCallback callback) final; void SetDataSource(mojo::ScopedDataPipeConsumerHandle receive_pipe) final; - void Decode(mojom::DecoderBufferPtr buffer, - const DecodeCallback& callback) final; + void Decode(mojom::DecoderBufferPtr buffer, DecodeCallback callback) final; - void Reset(const ResetCallback& callback) final; + void Reset(ResetCallback callback) final; private: // Called by |decoder_| upon finishing initialization. - void OnInitialized(const InitializeCallback& callback, + void OnInitialized(InitializeCallback callback, scoped_refptr<ContentDecryptionModule> cdm, bool success); - void OnReadDone(const DecodeCallback& callback, - scoped_refptr<DecoderBuffer> buffer); + void OnReadDone(DecodeCallback callback, scoped_refptr<DecoderBuffer> buffer); // Called by |decoder_| when DecoderBuffer is accepted or rejected. - void OnDecodeStatus(const DecodeCallback& callback, - media::DecodeStatus status); + void OnDecodeStatus(DecodeCallback callback, media::DecodeStatus status); // Called by |decoder_| when reset sequence is finished. - void OnResetDone(const ResetCallback& callback); + void OnResetDone(ResetCallback callback); // Called by |decoder_| for each decoded buffer. void OnAudioBufferReady(const scoped_refptr<AudioBuffer>& audio_buffer);
diff --git a/media/mojo/services/mojo_audio_output_stream_provider.cc b/media/mojo/services/mojo_audio_output_stream_provider.cc index 6141a48..01ec1422 100644 --- a/media/mojo/services/mojo_audio_output_stream_provider.cc +++ b/media/mojo/services/mojo_audio_output_stream_provider.cc
@@ -30,7 +30,7 @@ void MojoAudioOutputStreamProvider::Acquire( mojom::AudioOutputStreamRequest stream_request, const AudioParameters& params, - const AcquireCallback& callback) { + AcquireCallback callback) { DCHECK(thread_checker_.CalledOnValidThread()); if (audio_output_) { LOG(ERROR) << "Output acquired twice.";
diff --git a/media/mojo/services/mojo_audio_output_stream_provider.h b/media/mojo/services/mojo_audio_output_stream_provider.h index 5a1b2f5..2d014d6 100644 --- a/media/mojo/services/mojo_audio_output_stream_provider.h +++ b/media/mojo/services/mojo_audio_output_stream_provider.h
@@ -41,7 +41,7 @@ // mojom::AudioOutputStreamProvider implementation. void Acquire(mojom::AudioOutputStreamRequest stream_request, const AudioParameters& params, - const AcquireCallback& acquire_callback) override; + AcquireCallback acquire_callback) override; // Called when |audio_output_| had an error. void OnError();
diff --git a/media/mojo/services/mojo_cdm_promise.cc b/media/mojo/services/mojo_cdm_promise.cc index da9ae8c..01b013be 100644 --- a/media/mojo/services/mojo_cdm_promise.cc +++ b/media/mojo/services/mojo_cdm_promise.cc
@@ -27,8 +27,8 @@ } template <typename... T> -MojoCdmPromise<T...>::MojoCdmPromise(const CallbackType& callback) - : callback_(callback) { +MojoCdmPromise<T...>::MojoCdmPromise(CallbackType callback) + : callback_(std::move(callback)) { DCHECK(!callback_.is_null()); } @@ -46,8 +46,7 @@ MarkPromiseSettled(); mojom::CdmPromiseResultPtr cdm_promise_result(mojom::CdmPromiseResult::New()); cdm_promise_result->success = true; - callback_.Run(std::move(cdm_promise_result), result...); - callback_.Reset(); + std::move(callback_).Run(std::move(cdm_promise_result), result...); } template <typename... T> @@ -55,8 +54,8 @@ uint32_t system_code, const std::string& error_message) { MarkPromiseSettled(); - callback_.Run(GetRejectResult(exception, system_code, error_message), T()...); - callback_.Reset(); + std::move(callback_).Run( + GetRejectResult(exception, system_code, error_message), T()...); } template class MojoCdmPromise<>;
diff --git a/media/mojo/services/mojo_cdm_promise.h b/media/mojo/services/mojo_cdm_promise.h index cfb7930..dcd5e2f 100644 --- a/media/mojo/services/mojo_cdm_promise.h +++ b/media/mojo/services/mojo_cdm_promise.h
@@ -19,9 +19,9 @@ class MojoCdmPromise : public CdmPromiseTemplate<T...> { public: using CallbackType = - base::Callback<void(mojom::CdmPromiseResultPtr, const T&...)>; + base::OnceCallback<void(mojom::CdmPromiseResultPtr, const T&...)>; - explicit MojoCdmPromise(const CallbackType& callback); + explicit MojoCdmPromise(CallbackType callback); ~MojoCdmPromise() final; // CdmPromiseTemplate<> implementation.
diff --git a/media/mojo/services/mojo_cdm_service.cc b/media/mojo/services/mojo_cdm_service.cc index 29c3e78..98257c09 100644 --- a/media/mojo/services/mojo_cdm_service.cc +++ b/media/mojo/services/mojo_cdm_service.cc
@@ -55,7 +55,7 @@ void MojoCdmService::Initialize(const std::string& key_system, const std::string& security_origin, mojom::CdmConfigPtr cdm_config, - const InitializeCallback& callback) { + InitializeCallback callback) { DVLOG(1) << __func__ << ": " << key_system; DCHECK(!cdm_); @@ -66,57 +66,60 @@ base::Bind(&MojoCdmService::OnSessionClosed, weak_this), base::Bind(&MojoCdmService::OnSessionKeysChange, weak_this), base::Bind(&MojoCdmService::OnSessionExpirationUpdate, weak_this), - base::Bind(&MojoCdmService::OnCdmCreated, weak_this, callback)); + base::Bind(&MojoCdmService::OnCdmCreated, weak_this, + base::Passed(&callback))); } void MojoCdmService::SetServerCertificate( const std::vector<uint8_t>& certificate_data, - const SetServerCertificateCallback& callback) { + SetServerCertificateCallback callback) { DVLOG(2) << __func__; - cdm_->SetServerCertificate(certificate_data, - base::MakeUnique<SimpleMojoCdmPromise>(callback)); + cdm_->SetServerCertificate( + certificate_data, + base::MakeUnique<SimpleMojoCdmPromise>(std::move(callback))); } void MojoCdmService::CreateSessionAndGenerateRequest( CdmSessionType session_type, EmeInitDataType init_data_type, const std::vector<uint8_t>& init_data, - const CreateSessionAndGenerateRequestCallback& callback) { + CreateSessionAndGenerateRequestCallback callback) { DVLOG(2) << __func__; cdm_->CreateSessionAndGenerateRequest( session_type, init_data_type, init_data, - base::MakeUnique<NewSessionMojoCdmPromise>(callback)); + base::MakeUnique<NewSessionMojoCdmPromise>(std::move(callback))); } void MojoCdmService::LoadSession(CdmSessionType session_type, const std::string& session_id, - const LoadSessionCallback& callback) { + LoadSessionCallback callback) { DVLOG(2) << __func__; - cdm_->LoadSession(session_type, session_id, - base::MakeUnique<NewSessionMojoCdmPromise>(callback)); + cdm_->LoadSession( + session_type, session_id, + base::MakeUnique<NewSessionMojoCdmPromise>(std::move(callback))); } void MojoCdmService::UpdateSession(const std::string& session_id, const std::vector<uint8_t>& response, - const UpdateSessionCallback& callback) { + UpdateSessionCallback callback) { DVLOG(2) << __func__; - cdm_->UpdateSession( - session_id, response, - std::unique_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback))); + cdm_->UpdateSession(session_id, response, + std::unique_ptr<SimpleCdmPromise>( + new SimpleMojoCdmPromise(std::move(callback)))); } void MojoCdmService::CloseSession(const std::string& session_id, - const CloseSessionCallback& callback) { + CloseSessionCallback callback) { DVLOG(2) << __func__; - cdm_->CloseSession(session_id, - base::MakeUnique<SimpleMojoCdmPromise>(callback)); + cdm_->CloseSession( + session_id, base::MakeUnique<SimpleMojoCdmPromise>(std::move(callback))); } void MojoCdmService::RemoveSession(const std::string& session_id, - const RemoveSessionCallback& callback) { + RemoveSessionCallback callback) { DVLOG(2) << __func__; - cdm_->RemoveSession(session_id, - base::MakeUnique<SimpleMojoCdmPromise>(callback)); + cdm_->RemoveSession( + session_id, base::MakeUnique<SimpleMojoCdmPromise>(std::move(callback))); } scoped_refptr<ContentDecryptionModule> MojoCdmService::GetCdm() { @@ -124,7 +127,7 @@ } void MojoCdmService::OnCdmCreated( - const InitializeCallback& callback, + InitializeCallback callback, const scoped_refptr<::media::ContentDecryptionModule>& cdm, const std::string& error_message) { mojom::CdmPromiseResultPtr cdm_promise_result(mojom::CdmPromiseResult::New()); @@ -136,7 +139,7 @@ cdm_promise_result->exception = CdmPromise::Exception::NOT_SUPPORTED_ERROR; cdm_promise_result->system_code = 0; cdm_promise_result->error_message = error_message; - callback.Run(std::move(cdm_promise_result), 0, nullptr); + std::move(callback).Run(std::move(cdm_promise_result), 0, nullptr); return; } @@ -158,8 +161,8 @@ DVLOG(1) << __func__ << ": CDM successfully created with ID " << cdm_id_; cdm_promise_result->success = true; - callback.Run(std::move(cdm_promise_result), cdm_id_, - std::move(decryptor_service)); + std::move(callback).Run(std::move(cdm_promise_result), cdm_id_, + std::move(decryptor_service)); } void MojoCdmService::OnSessionMessage(const std::string& session_id,
diff --git a/media/mojo/services/mojo_cdm_service.h b/media/mojo/services/mojo_cdm_service.h index cd77fe24..c7b7c82 100644 --- a/media/mojo/services/mojo_cdm_service.h +++ b/media/mojo/services/mojo_cdm_service.h
@@ -53,31 +53,31 @@ void Initialize(const std::string& key_system, const std::string& security_origin, mojom::CdmConfigPtr cdm_config, - const InitializeCallback& callback) final; + InitializeCallback callback) final; void SetServerCertificate(const std::vector<uint8_t>& certificate_data, - const SetServerCertificateCallback& callback) final; + SetServerCertificateCallback callback) final; void CreateSessionAndGenerateRequest( CdmSessionType session_type, EmeInitDataType init_data_type, const std::vector<uint8_t>& init_data, - const CreateSessionAndGenerateRequestCallback& callback) final; + CreateSessionAndGenerateRequestCallback callback) final; void LoadSession(CdmSessionType session_type, const std::string& session_id, - const LoadSessionCallback& callback) final; + LoadSessionCallback callback) final; void UpdateSession(const std::string& session_id, const std::vector<uint8_t>& response, - const UpdateSessionCallback& callback) final; + UpdateSessionCallback callback) final; void CloseSession(const std::string& session_id, - const CloseSessionCallback& callback) final; + CloseSessionCallback callback) final; void RemoveSession(const std::string& session_id, - const RemoveSessionCallback& callback) final; + RemoveSessionCallback callback) final; // Get CDM to be used by the media pipeline. scoped_refptr<::media::ContentDecryptionModule> GetCdm(); private: // Callback for CdmFactory::Create(). - void OnCdmCreated(const InitializeCallback& callback, + void OnCdmCreated(InitializeCallback callback, const scoped_refptr<::media::ContentDecryptionModule>& cdm, const std::string& error_message);
diff --git a/media/mojo/services/mojo_decryptor_service.cc b/media/mojo/services/mojo_decryptor_service.cc index 0e140b7..e96a74b 100644 --- a/media/mojo/services/mojo_decryptor_service.cc +++ b/media/mojo/services/mojo_decryptor_service.cc
@@ -71,11 +71,12 @@ void MojoDecryptorService::Decrypt(StreamType stream_type, mojom::DecoderBufferPtr encrypted, - const DecryptCallback& callback) { + DecryptCallback callback) { DVLOG(3) << __func__; mojo_decoder_buffer_reader_->ReadDecoderBuffer( - std::move(encrypted), base::BindOnce(&MojoDecryptorService::OnReadDone, - weak_this_, stream_type, callback)); + std::move(encrypted), + base::BindOnce(&MojoDecryptorService::OnReadDone, weak_this_, stream_type, + std::move(callback))); } void MojoDecryptorService::CancelDecrypt(StreamType stream_type) { @@ -84,41 +85,39 @@ } void MojoDecryptorService::InitializeAudioDecoder( - mojom::AudioDecoderConfigPtr config, - const InitializeAudioDecoderCallback& callback) { + const AudioDecoderConfig& config, + InitializeAudioDecoderCallback callback) { DVLOG(1) << __func__; decryptor_->InitializeAudioDecoder( - config.To<AudioDecoderConfig>(), - base::Bind(&MojoDecryptorService::OnAudioDecoderInitialized, weak_this_, - callback)); + config, base::Bind(&MojoDecryptorService::OnAudioDecoderInitialized, + weak_this_, base::Passed(&callback))); } void MojoDecryptorService::InitializeVideoDecoder( - mojom::VideoDecoderConfigPtr config, - const InitializeVideoDecoderCallback& callback) { + const VideoDecoderConfig& config, + InitializeVideoDecoderCallback callback) { DVLOG(1) << __func__; decryptor_->InitializeVideoDecoder( - config.To<VideoDecoderConfig>(), - base::Bind(&MojoDecryptorService::OnVideoDecoderInitialized, weak_this_, - callback)); + config, base::Bind(&MojoDecryptorService::OnVideoDecoderInitialized, + weak_this_, base::Passed(&callback))); } void MojoDecryptorService::DecryptAndDecodeAudio( mojom::DecoderBufferPtr encrypted, - const DecryptAndDecodeAudioCallback& callback) { + DecryptAndDecodeAudioCallback callback) { DVLOG(3) << __func__; mojo_decoder_buffer_reader_->ReadDecoderBuffer( - std::move(encrypted), - base::BindOnce(&MojoDecryptorService::OnAudioRead, weak_this_, callback)); + std::move(encrypted), base::BindOnce(&MojoDecryptorService::OnAudioRead, + weak_this_, std::move(callback))); } void MojoDecryptorService::DecryptAndDecodeVideo( mojom::DecoderBufferPtr encrypted, - const DecryptAndDecodeVideoCallback& callback) { + DecryptAndDecodeVideoCallback callback) { DVLOG(3) << __func__; mojo_decoder_buffer_reader_->ReadDecoderBuffer( - std::move(encrypted), - base::BindOnce(&MojoDecryptorService::OnVideoRead, weak_this_, callback)); + std::move(encrypted), base::BindOnce(&MojoDecryptorService::OnVideoRead, + weak_this_, std::move(callback))); } void MojoDecryptorService::ResetDecoder(StreamType stream_type) { @@ -132,20 +131,20 @@ } void MojoDecryptorService::OnReadDone(StreamType stream_type, - const DecryptCallback& callback, + DecryptCallback callback, scoped_refptr<DecoderBuffer> buffer) { if (!buffer) { - callback.Run(Status::kError, nullptr); + std::move(callback).Run(Status::kError, nullptr); return; } - decryptor_->Decrypt( - stream_type, std::move(buffer), - base::Bind(&MojoDecryptorService::OnDecryptDone, weak_this_, callback)); + decryptor_->Decrypt(stream_type, std::move(buffer), + base::Bind(&MojoDecryptorService::OnDecryptDone, + weak_this_, base::Passed(&callback))); } void MojoDecryptorService::OnDecryptDone( - const DecryptCallback& callback, + DecryptCallback callback, Status status, const scoped_refptr<DecoderBuffer>& buffer) { DVLOG_IF(1, status != Status::kSuccess) << __func__ << "(" << status << ")"; @@ -153,62 +152,61 @@ if (!buffer) { DCHECK_NE(status, Status::kSuccess); - callback.Run(status, nullptr); + std::move(callback).Run(status, nullptr); return; } mojom::DecoderBufferPtr mojo_buffer = mojo_decoder_buffer_writer_->WriteDecoderBuffer(buffer); if (!mojo_buffer) { - callback.Run(Status::kError, nullptr); + std::move(callback).Run(Status::kError, nullptr); return; } - callback.Run(status, std::move(mojo_buffer)); + std::move(callback).Run(status, std::move(mojo_buffer)); } void MojoDecryptorService::OnAudioDecoderInitialized( - const InitializeAudioDecoderCallback& callback, + InitializeAudioDecoderCallback callback, bool success) { DVLOG(1) << __func__ << "(" << success << ")"; - callback.Run(success); + std::move(callback).Run(success); } void MojoDecryptorService::OnVideoDecoderInitialized( - const InitializeVideoDecoderCallback& callback, + InitializeVideoDecoderCallback callback, bool success) { DVLOG(1) << __func__ << "(" << success << ")"; - callback.Run(success); + std::move(callback).Run(success); } -void MojoDecryptorService::OnAudioRead( - const DecryptAndDecodeAudioCallback& callback, - scoped_refptr<DecoderBuffer> buffer) { +void MojoDecryptorService::OnAudioRead(DecryptAndDecodeAudioCallback callback, + scoped_refptr<DecoderBuffer> buffer) { if (!buffer) { - callback.Run(Status::kError, std::vector<mojom::AudioBufferPtr>()); + std::move(callback).Run(Status::kError, + std::vector<mojom::AudioBufferPtr>()); return; } decryptor_->DecryptAndDecodeAudio( - std::move(buffer), - base::Bind(&MojoDecryptorService::OnAudioDecoded, weak_this_, callback)); + std::move(buffer), base::Bind(&MojoDecryptorService::OnAudioDecoded, + weak_this_, base::Passed(&callback))); } -void MojoDecryptorService::OnVideoRead( - const DecryptAndDecodeVideoCallback& callback, - scoped_refptr<DecoderBuffer> buffer) { +void MojoDecryptorService::OnVideoRead(DecryptAndDecodeVideoCallback callback, + scoped_refptr<DecoderBuffer> buffer) { if (!buffer) { - callback.Run(Status::kError, nullptr, nullptr); + std::move(callback).Run(Status::kError, nullptr, nullptr); return; } decryptor_->DecryptAndDecodeVideo( - std::move(buffer), - base::Bind(&MojoDecryptorService::OnVideoDecoded, weak_this_, callback)); + std::move(buffer), base::Bind(&MojoDecryptorService::OnVideoDecoded, + weak_this_, base::Passed(&callback))); } void MojoDecryptorService::OnAudioDecoded( - const DecryptAndDecodeAudioCallback& callback, + DecryptAndDecodeAudioCallback callback, Status status, const media::Decryptor::AudioFrames& frames) { DVLOG_IF(1, status != Status::kSuccess) << __func__ << "(" << status << ")"; @@ -220,11 +218,11 @@ for (const auto& frame : frames) audio_buffers.push_back(mojom::AudioBuffer::From(frame)); - callback.Run(status, std::move(audio_buffers)); + std::move(callback).Run(status, std::move(audio_buffers)); } void MojoDecryptorService::OnVideoDecoded( - const DecryptAndDecodeVideoCallback& callback, + DecryptAndDecodeVideoCallback callback, Status status, const scoped_refptr<VideoFrame>& frame) { DVLOG_IF(1, status != Status::kSuccess) << __func__ << "(" << status << ")"; @@ -232,7 +230,7 @@ if (!frame) { DCHECK_NE(status, Status::kSuccess); - callback.Run(status, nullptr, nullptr); + std::move(callback).Run(status, nullptr, nullptr); return; } @@ -244,7 +242,7 @@ mojo::MakeRequest(&releaser)); } - callback.Run(status, std::move(frame), std::move(releaser)); + std::move(callback).Run(status, std::move(frame), std::move(releaser)); } } // namespace media
diff --git a/media/mojo/services/mojo_decryptor_service.h b/media/mojo/services/mojo_decryptor_service.h index e3f9909..be49029 100644 --- a/media/mojo/services/mojo_decryptor_service.h +++ b/media/mojo/services/mojo_decryptor_service.h
@@ -46,49 +46,45 @@ mojo::ScopedDataPipeProducerHandle transmit_pipe) final; void Decrypt(StreamType stream_type, mojom::DecoderBufferPtr encrypted, - const DecryptCallback& callback) final; + DecryptCallback callback) final; void CancelDecrypt(StreamType stream_type) final; - void InitializeAudioDecoder( - mojom::AudioDecoderConfigPtr config, - const InitializeAudioDecoderCallback& callback) final; - void InitializeVideoDecoder( - mojom::VideoDecoderConfigPtr config, - const InitializeVideoDecoderCallback& callback) final; - void DecryptAndDecodeAudio( - mojom::DecoderBufferPtr encrypted, - const DecryptAndDecodeAudioCallback& callback) final; - void DecryptAndDecodeVideo( - mojom::DecoderBufferPtr encrypted, - const DecryptAndDecodeVideoCallback& callback) final; + void InitializeAudioDecoder(const AudioDecoderConfig& config, + InitializeAudioDecoderCallback callback) final; + void InitializeVideoDecoder(const VideoDecoderConfig& config, + InitializeVideoDecoderCallback callback) final; + void DecryptAndDecodeAudio(mojom::DecoderBufferPtr encrypted, + DecryptAndDecodeAudioCallback callback) final; + void DecryptAndDecodeVideo(mojom::DecoderBufferPtr encrypted, + DecryptAndDecodeVideoCallback callback) final; void ResetDecoder(StreamType stream_type) final; void DeinitializeDecoder(StreamType stream_type) final; private: void OnReadDone(StreamType stream_type, - const DecryptCallback& callback, + DecryptCallback callback, scoped_refptr<DecoderBuffer> buffer); // Callback executed once Decrypt() is done. - void OnDecryptDone(const DecryptCallback& callback, + void OnDecryptDone(DecryptCallback callback, Status status, const scoped_refptr<DecoderBuffer>& buffer); // Callbacks executed once decoder initialized. - void OnAudioDecoderInitialized(const InitializeAudioDecoderCallback& callback, + void OnAudioDecoderInitialized(InitializeAudioDecoderCallback callback, bool success); - void OnVideoDecoderInitialized(const InitializeVideoDecoderCallback& callback, + void OnVideoDecoderInitialized(InitializeVideoDecoderCallback callback, bool success); - void OnAudioRead(const DecryptAndDecodeAudioCallback& callback, + void OnAudioRead(DecryptAndDecodeAudioCallback callback, scoped_refptr<DecoderBuffer> buffer); - void OnVideoRead(const DecryptAndDecodeVideoCallback& callback, + void OnVideoRead(DecryptAndDecodeVideoCallback callback, scoped_refptr<DecoderBuffer> buffer); // Callbacks executed when DecryptAndDecode are done. - void OnAudioDecoded(const DecryptAndDecodeAudioCallback& callback, + void OnAudioDecoded(DecryptAndDecodeAudioCallback callback, Status status, const media::Decryptor::AudioFrames& frames); - void OnVideoDecoded(const DecryptAndDecodeVideoCallback& callback, + void OnVideoDecoded(DecryptAndDecodeVideoCallback callback, Status status, const scoped_refptr<VideoFrame>& frame);
diff --git a/media/mojo/services/mojo_demuxer_stream_adapter.cc b/media/mojo/services/mojo_demuxer_stream_adapter.cc index 17a73eb1..23e0a7ca 100644 --- a/media/mojo/services/mojo_demuxer_stream_adapter.cc +++ b/media/mojo/services/mojo_demuxer_stream_adapter.cc
@@ -74,8 +74,8 @@ void MojoDemuxerStreamAdapter::OnStreamReady( Type type, mojo::ScopedDataPipeConsumerHandle consumer_handle, - mojom::AudioDecoderConfigPtr audio_config, - mojom::VideoDecoderConfigPtr video_config) { + const base::Optional<AudioDecoderConfig>& audio_config, + const base::Optional<VideoDecoderConfig>& video_config) { DVLOG(1) << __func__; DCHECK_EQ(UNKNOWN, type_); DCHECK(consumer_handle.is_valid()); @@ -93,8 +93,8 @@ void MojoDemuxerStreamAdapter::OnBufferReady( Status status, mojom::DecoderBufferPtr buffer, - mojom::AudioDecoderConfigPtr audio_config, - mojom::VideoDecoderConfigPtr video_config) { + const base::Optional<AudioDecoderConfig>& audio_config, + const base::Optional<VideoDecoderConfig>& video_config) { DVLOG(3) << __func__; DCHECK(!read_cb_.is_null()); DCHECK_NE(type_, UNKNOWN); @@ -127,18 +127,18 @@ } void MojoDemuxerStreamAdapter::UpdateConfig( - mojom::AudioDecoderConfigPtr audio_config, - mojom::VideoDecoderConfigPtr video_config) { + const base::Optional<AudioDecoderConfig>& audio_config, + const base::Optional<VideoDecoderConfig>& video_config) { DCHECK_NE(type_, UNKNOWN); switch(type_) { case AUDIO: DCHECK(audio_config && !video_config); - audio_config_ = audio_config.To<AudioDecoderConfig>(); + audio_config_ = audio_config.value(); break; case VIDEO: DCHECK(video_config && !audio_config); - video_config_ = video_config.To<VideoDecoderConfig>(); + video_config_ = video_config.value(); break; default: NOTREACHED();
diff --git a/media/mojo/services/mojo_demuxer_stream_adapter.h b/media/mojo/services/mojo_demuxer_stream_adapter.h index 4db24ec..8350899 100644 --- a/media/mojo/services/mojo_demuxer_stream_adapter.h +++ b/media/mojo/services/mojo_demuxer_stream_adapter.h
@@ -10,6 +10,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/optional.h" #include "media/base/audio_decoder_config.h" #include "media/base/demuxer_stream.h" #include "media/base/video_decoder_config.h" @@ -48,20 +49,20 @@ private: void OnStreamReady(Type type, mojo::ScopedDataPipeConsumerHandle consumer_handle, - mojom::AudioDecoderConfigPtr audio_config, - mojom::VideoDecoderConfigPtr video_config); + const base::Optional<AudioDecoderConfig>& audio_config, + const base::Optional<VideoDecoderConfig>& video_config); // The callback from |demuxer_stream_| that a read operation has completed. // |read_cb| is a callback from the client who invoked Read() on |this|. void OnBufferReady(Status status, mojom::DecoderBufferPtr buffer, - mojom::AudioDecoderConfigPtr audio_config, - mojom::VideoDecoderConfigPtr video_config); + const base::Optional<AudioDecoderConfig>& audio_config, + const base::Optional<VideoDecoderConfig>& video_config); void OnBufferRead(scoped_refptr<DecoderBuffer> buffer); - void UpdateConfig(mojom::AudioDecoderConfigPtr audio_config, - mojom::VideoDecoderConfigPtr video_config); + void UpdateConfig(const base::Optional<AudioDecoderConfig>& audio_config, + const base::Optional<VideoDecoderConfig>& video_config); // See constructor for descriptions. mojom::DemuxerStreamPtr demuxer_stream_;
diff --git a/media/mojo/services/mojo_media_client.cc b/media/mojo/services/mojo_media_client.cc index 6c9207a..2f2e0818 100644 --- a/media/mojo/services/mojo_media_client.cc +++ b/media/mojo/services/mojo_media_client.cc
@@ -28,6 +28,7 @@ std::unique_ptr<VideoDecoder> MojoMediaClient::CreateVideoDecoder( scoped_refptr<base::SingleThreadTaskRunner> task_runner, + MediaLog* media_log, mojom::CommandBufferIdPtr command_buffer_id, OutputWithReleaseMailboxCB output_cb) { return nullptr;
diff --git a/media/mojo/services/mojo_media_client.h b/media/mojo/services/mojo_media_client.h index a3e64921..d96798f 100644 --- a/media/mojo/services/mojo_media_client.h +++ b/media/mojo/services/mojo_media_client.h
@@ -63,6 +63,7 @@ // See https://crbug.com/733828. virtual std::unique_ptr<VideoDecoder> CreateVideoDecoder( scoped_refptr<base::SingleThreadTaskRunner> task_runner, + MediaLog* media_log, mojom::CommandBufferIdPtr command_buffer_id, OutputWithReleaseMailboxCB output_cb);
diff --git a/media/mojo/services/mojo_media_log.cc b/media/mojo/services/mojo_media_log.cc new file mode 100644 index 0000000..f13f13e --- /dev/null +++ b/media/mojo/services/mojo_media_log.cc
@@ -0,0 +1,28 @@ +// Copyright 2017 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 "media/mojo/services/mojo_media_log.h" + +#include "base/logging.h" + +namespace media { + +// TODO(sandersd): Do we need to respond to the channel closing? +MojoMediaLog::MojoMediaLog( + mojo::AssociatedInterfacePtr<mojom::MediaLog> remote_media_log) + : remote_media_log_(std::move(remote_media_log)) { + DVLOG(1) << __func__; +} + +MojoMediaLog::~MojoMediaLog() { + DVLOG(1) << __func__; +} + +void MojoMediaLog::AddEvent(std::unique_ptr<MediaLogEvent> event) { + DVLOG(1) << __func__; + DCHECK(event); + remote_media_log_->AddEvent(*event); +} + +} // namespace media
diff --git a/media/mojo/services/mojo_media_log.h b/media/mojo/services/mojo_media_log.h new file mode 100644 index 0000000..bf46c38 --- /dev/null +++ b/media/mojo/services/mojo_media_log.h
@@ -0,0 +1,35 @@ +// Copyright 2017 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 MEDIA_MOJO_SERVICES_MOJO_MEDIA_LOG_H_ +#define MEDIA_MOJO_SERVICES_MOJO_MEDIA_LOG_H_ + +#include <memory> + +#include "base/macros.h" +#include "media/base/media_log.h" +#include "media/mojo/interfaces/media_log.mojom.h" +#include "mojo/public/cpp/bindings/associated_interface_ptr.h" + +namespace media { + +class MojoMediaLog final : public MediaLog { + public: + // TODO(sandersd): Template on Ptr type to support non-associated. + explicit MojoMediaLog( + mojo::AssociatedInterfacePtr<mojom::MediaLog> remote_media_log); + ~MojoMediaLog() final; + + // MediaLog implementation. + void AddEvent(std::unique_ptr<MediaLogEvent> event) override; + + private: + mojo::AssociatedInterfacePtr<mojom::MediaLog> remote_media_log_; + + DISALLOW_COPY_AND_ASSIGN(MojoMediaLog); +}; + +} // namespace media + +#endif // MEDIA_MOJO_SERVICES_MOJO_MEDIA_LOG_H_
diff --git a/media/mojo/services/mojo_renderer_service.cc b/media/mojo/services/mojo_renderer_service.cc index 81661f86..7f45af51 100644 --- a/media/mojo/services/mojo_renderer_service.cc +++ b/media/mojo/services/mojo_renderer_service.cc
@@ -80,7 +80,7 @@ base::Optional<std::vector<mojom::DemuxerStreamPtr>> streams, const base::Optional<GURL>& media_url, const base::Optional<GURL>& first_party_for_cookies, - const InitializeCallback& callback) { + InitializeCallback callback) { DVLOG(1) << __func__; DCHECK_EQ(state_, STATE_UNINITIALIZED); @@ -90,8 +90,8 @@ if (media_url == base::nullopt) { DCHECK(streams.has_value()); media_resource_.reset(new MediaResourceShim( - std::move(*streams), - base::Bind(&MojoRendererService::OnStreamReady, weak_this_, callback))); + std::move(*streams), base::Bind(&MojoRendererService::OnStreamReady, + weak_this_, base::Passed(&callback)))); return; } @@ -102,17 +102,17 @@ renderer_->Initialize( media_resource_.get(), this, base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_, - callback)); + base::Passed(&callback))); } -void MojoRendererService::Flush(const FlushCallback& callback) { +void MojoRendererService::Flush(FlushCallback callback) { DVLOG(2) << __func__; DCHECK_EQ(state_, STATE_PLAYING); state_ = STATE_FLUSHING; CancelPeriodicMediaTimeUpdates(); - renderer_->Flush( - base::Bind(&MojoRendererService::OnFlushCompleted, weak_this_, callback)); + renderer_->Flush(base::Bind(&MojoRendererService::OnFlushCompleted, + weak_this_, base::Passed(&callback))); } void MojoRendererService::StartPlayingFrom(base::TimeDelta time_delta) { @@ -132,11 +132,10 @@ renderer_->SetVolume(volume); } -void MojoRendererService::SetCdm(int32_t cdm_id, - const SetCdmCallback& callback) { +void MojoRendererService::SetCdm(int32_t cdm_id, SetCdmCallback callback) { if (!mojo_cdm_service_context_) { DVLOG(1) << "CDM service context not available."; - callback.Run(false); + std::move(callback).Run(false); return; } @@ -144,19 +143,20 @@ mojo_cdm_service_context_->GetCdm(cdm_id); if (!cdm) { DVLOG(1) << "CDM not found: " << cdm_id; - callback.Run(false); + std::move(callback).Run(false); return; } CdmContext* cdm_context = cdm->GetCdmContext(); if (!cdm_context) { DVLOG(1) << "CDM context not available: " << cdm_id; - callback.Run(false); + std::move(callback).Run(false); return; } - renderer_->SetCdm(cdm_context, base::Bind(&MojoRendererService::OnCdmAttached, - weak_this_, cdm, callback)); + renderer_->SetCdm(cdm_context, + base::Bind(&MojoRendererService::OnCdmAttached, weak_this_, + cdm, base::Passed(&callback))); } void MojoRendererService::OnError(PipelineStatus error) { @@ -201,29 +201,29 @@ } void MojoRendererService::OnStreamReady( - const base::Callback<void(bool)>& callback) { + base::OnceCallback<void(bool)> callback) { DCHECK_EQ(state_, STATE_INITIALIZING); renderer_->Initialize( media_resource_.get(), this, base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_, - callback)); + base::Passed(&callback))); } void MojoRendererService::OnRendererInitializeDone( - const base::Callback<void(bool)>& callback, + base::OnceCallback<void(bool)> callback, PipelineStatus status) { DVLOG(1) << __func__; DCHECK_EQ(state_, STATE_INITIALIZING); if (status != PIPELINE_OK) { state_ = STATE_ERROR; - callback.Run(false); + std::move(callback).Run(false); return; } state_ = STATE_PLAYING; - callback.Run(true); + std::move(callback).Run(true); } void MojoRendererService::UpdateMediaTime(bool force) { @@ -256,27 +256,27 @@ base::Bind(&MojoRendererService::UpdateMediaTime, weak_this_, false)); } -void MojoRendererService::OnFlushCompleted(const FlushCallback& callback) { +void MojoRendererService::OnFlushCompleted(FlushCallback callback) { DVLOG(1) << __func__; DCHECK_EQ(state_, STATE_FLUSHING); state_ = STATE_PLAYING; - callback.Run(); + std::move(callback).Run(); } void MojoRendererService::OnCdmAttached( scoped_refptr<ContentDecryptionModule> cdm, - const base::Callback<void(bool)>& callback, + base::OnceCallback<void(bool)> callback, bool success) { DVLOG(1) << __func__ << "(" << success << ")"; if (success) cdm_ = cdm; - callback.Run(success); + std::move(callback).Run(success); } void MojoRendererService::InitiateScopedSurfaceRequest( - const InitiateScopedSurfaceRequestCallback& callback) { + InitiateScopedSurfaceRequestCallback callback) { if (initiate_surface_request_cb_.is_null()) { // |renderer_| is likely not of type MediaPlayerRenderer. // This is an unexpected call, and the connection should be closed. @@ -289,7 +289,7 @@ return; } - callback.Run(initiate_surface_request_cb_.Run()); + std::move(callback).Run(initiate_surface_request_cb_.Run()); } } // namespace media
diff --git a/media/mojo/services/mojo_renderer_service.h b/media/mojo/services/mojo_renderer_service.h index 734af43..9d2a83c 100644 --- a/media/mojo/services/mojo_renderer_service.h +++ b/media/mojo/services/mojo_renderer_service.h
@@ -66,14 +66,14 @@ base::Optional<std::vector<mojom::DemuxerStreamPtr>> streams, const base::Optional<GURL>& media_url, const base::Optional<GURL>& first_party_for_cookies, - const InitializeCallback& callback) final; - void Flush(const FlushCallback& callback) final; + InitializeCallback callback) final; + void Flush(FlushCallback callback) final; void StartPlayingFrom(base::TimeDelta time_delta) final; void SetPlaybackRate(double playback_rate) final; void SetVolume(float volume) final; - void SetCdm(int32_t cdm_id, const SetCdmCallback& callback) final; + void SetCdm(int32_t cdm_id, SetCdmCallback callback) final; void InitiateScopedSurfaceRequest( - const InitiateScopedSurfaceRequestCallback& callback) final; + InitiateScopedSurfaceRequestCallback callback) final; void set_bad_message_cb(base::Closure bad_message_cb) { bad_message_cb_ = bad_message_cb; @@ -100,10 +100,10 @@ // Called when the MediaResourceShim is ready to go (has a config, // pipe handle, etc) and can be handed off to a renderer for use. - void OnStreamReady(const base::Callback<void(bool)>& callback); + void OnStreamReady(base::OnceCallback<void(bool)> callback); // Called when |audio_renderer_| initialization has completed. - void OnRendererInitializeDone(const base::Callback<void(bool)>& callback, + void OnRendererInitializeDone(base::OnceCallback<void(bool)> callback, PipelineStatus status); // Periodically polls the media time from the renderer and notifies the client @@ -115,11 +115,11 @@ void SchedulePeriodicMediaTimeUpdates(); // Callback executed once Flush() completes. - void OnFlushCompleted(const FlushCallback& callback); + void OnFlushCompleted(FlushCallback callback); // Callback executed once SetCdm() completes. void OnCdmAttached(scoped_refptr<ContentDecryptionModule> cdm, - const base::Callback<void(bool)>& callback, + base::OnceCallback<void(bool)> callback, bool success); base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context_;
diff --git a/media/mojo/services/mojo_video_decoder_service.cc b/media/mojo/services/mojo_video_decoder_service.cc index 2c4885c..1c4d1ef 100644 --- a/media/mojo/services/mojo_video_decoder_service.cc +++ b/media/mojo/services/mojo_video_decoder_service.cc
@@ -16,6 +16,7 @@ #include "media/mojo/common/media_type_converters.h" #include "media/mojo/common/mojo_decoder_buffer_converter.h" #include "media/mojo/services/mojo_media_client.h" +#include "media/mojo/services/mojo_media_log.h" #include "mojo/public/c/system/types.h" #include "mojo/public/cpp/system/buffer.h" #include "mojo/public/cpp/system/handle.h" @@ -32,6 +33,7 @@ void MojoVideoDecoderService::Construct( mojom::VideoDecoderClientAssociatedPtrInfo client, + mojom::MediaLogAssociatedPtrInfo media_log, mojo::ScopedDataPipeConsumerHandle decoder_buffer_pipe, mojom::CommandBufferIdPtr command_buffer_id) { DVLOG(1) << __func__; @@ -41,92 +43,96 @@ return; } - decoder_ = mojo_media_client_->CreateVideoDecoder( - base::ThreadTaskRunnerHandle::Get(), std::move(command_buffer_id), - base::Bind(&MojoVideoDecoderService::OnDecoderOutput, weak_this_)); - client_.Bind(std::move(client)); + mojom::MediaLogAssociatedPtr media_log_ptr; + media_log_ptr.Bind(std::move(media_log)); + media_log_ = base::MakeUnique<MojoMediaLog>(std::move(media_log_ptr)); + mojo_decoder_buffer_reader_.reset( new MojoDecoderBufferReader(std::move(decoder_buffer_pipe))); + + decoder_ = mojo_media_client_->CreateVideoDecoder( + base::ThreadTaskRunnerHandle::Get(), media_log_.get(), + std::move(command_buffer_id), + base::Bind(&MojoVideoDecoderService::OnDecoderOutput, weak_this_)); } -void MojoVideoDecoderService::Initialize(mojom::VideoDecoderConfigPtr config, +void MojoVideoDecoderService::Initialize(const VideoDecoderConfig& config, bool low_delay, - const InitializeCallback& callback) { + InitializeCallback callback) { DVLOG(1) << __func__; if (!decoder_) { - callback.Run(false, false, 1); + std::move(callback).Run(false, false, 1); return; } decoder_->Initialize( - config.To<VideoDecoderConfig>(), low_delay, nullptr, + config, low_delay, nullptr, base::Bind(&MojoVideoDecoderService::OnDecoderInitialized, weak_this_, - callback), + base::Passed(&callback)), base::Bind(&MojoVideoDecoderService::OnDecoderOutput, weak_this_, MojoMediaClient::ReleaseMailboxCB())); } void MojoVideoDecoderService::Decode(mojom::DecoderBufferPtr buffer, - const DecodeCallback& callback) { + DecodeCallback callback) { DVLOG(2) << __func__; if (!decoder_) { - callback.Run(DecodeStatus::DECODE_ERROR); + std::move(callback).Run(DecodeStatus::DECODE_ERROR); return; } mojo_decoder_buffer_reader_->ReadDecoderBuffer( std::move(buffer), base::BindOnce(&MojoVideoDecoderService::OnDecoderRead, - weak_this_, callback)); + weak_this_, std::move(callback))); } -void MojoVideoDecoderService::Reset(const ResetCallback& callback) { +void MojoVideoDecoderService::Reset(ResetCallback callback) { DVLOG(1) << __func__; if (!decoder_) { - callback.Run(); + std::move(callback).Run(); return; } decoder_->Reset(base::Bind(&MojoVideoDecoderService::OnDecoderReset, - weak_this_, callback)); + weak_this_, base::Passed(&callback))); } -void MojoVideoDecoderService::OnDecoderInitialized( - const InitializeCallback& callback, - bool success) { +void MojoVideoDecoderService::OnDecoderInitialized(InitializeCallback callback, + bool success) { DVLOG(1) << __func__; DCHECK(decoder_); - callback.Run(success, decoder_->NeedsBitstreamConversion(), - decoder_->GetMaxDecodeRequests()); + std::move(callback).Run(success, decoder_->NeedsBitstreamConversion(), + decoder_->GetMaxDecodeRequests()); } void MojoVideoDecoderService::OnDecoderRead( - const DecodeCallback& callback, + DecodeCallback callback, scoped_refptr<DecoderBuffer> buffer) { if (!buffer) { // TODO(sandersd): Close the channel. - callback.Run(DecodeStatus::DECODE_ERROR); + std::move(callback).Run(DecodeStatus::DECODE_ERROR); return; } decoder_->Decode( buffer, base::Bind(&MojoVideoDecoderService::OnDecoderDecoded, weak_this_, - callback)); + base::Passed(&callback))); } -void MojoVideoDecoderService::OnDecoderDecoded(const DecodeCallback& callback, +void MojoVideoDecoderService::OnDecoderDecoded(DecodeCallback callback, DecodeStatus status) { DVLOG(2) << __func__; - callback.Run(status); + std::move(callback).Run(status); } -void MojoVideoDecoderService::OnDecoderReset(const ResetCallback& callback) { +void MojoVideoDecoderService::OnDecoderReset(ResetCallback callback) { DVLOG(1) << __func__; - callback.Run(); + std::move(callback).Run(); } void MojoVideoDecoderService::OnDecoderOutput(
diff --git a/media/mojo/services/mojo_video_decoder_service.h b/media/mojo/services/mojo_video_decoder_service.h index 54e91a2c..93bf6edb 100644 --- a/media/mojo/services/mojo_video_decoder_service.h +++ b/media/mojo/services/mojo_video_decoder_service.h
@@ -24,6 +24,7 @@ class DecoderBuffer; class MojoDecoderBufferReader; class MojoMediaClient; +class MojoMediaLog; class VideoDecoder; class VideoFrame; @@ -36,14 +37,14 @@ // mojom::VideoDecoder implementation void Construct(mojom::VideoDecoderClientAssociatedPtrInfo client, + mojom::MediaLogAssociatedPtrInfo media_log, mojo::ScopedDataPipeConsumerHandle decoder_buffer_pipe, mojom::CommandBufferIdPtr command_buffer_id) final; - void Initialize(mojom::VideoDecoderConfigPtr config, + void Initialize(const VideoDecoderConfig& config, bool low_delay, - const InitializeCallback& callback) final; - void Decode(mojom::DecoderBufferPtr buffer, - const DecodeCallback& callback) final; - void Reset(const ResetCallback& callback) final; + InitializeCallback callback) final; + void Decode(mojom::DecoderBufferPtr buffer, DecodeCallback callback) final; + void Reset(ResetCallback callback) final; void OnReleaseMailbox(const base::UnguessableToken& release_token, const gpu::SyncToken& release_sync_token) final; @@ -52,16 +53,17 @@ // running mojom::VideoDecoder callbacks after connection error happens and // |this| is deleted. It's not safe to run the callbacks after a connection // error. - void OnDecoderInitialized(const InitializeCallback& callback, bool success); - void OnDecoderRead(const DecodeCallback& callback, + void OnDecoderInitialized(InitializeCallback callback, bool success); + void OnDecoderRead(DecodeCallback callback, scoped_refptr<DecoderBuffer> buffer); - void OnDecoderDecoded(const DecodeCallback& callback, DecodeStatus status); - void OnDecoderReset(const ResetCallback& callback); + void OnDecoderDecoded(DecodeCallback callback, DecodeStatus status); + void OnDecoderReset(ResetCallback callback); void OnDecoderOutput(MojoMediaClient::ReleaseMailboxCB, const scoped_refptr<VideoFrame>& frame); mojom::VideoDecoderClientAssociatedPtr client_; + std::unique_ptr<MojoMediaLog> media_log_; std::unique_ptr<MojoDecoderBufferReader> mojo_decoder_buffer_reader_; MojoMediaClient* mojo_media_client_;
diff --git a/media/renderers/default_renderer_factory.cc b/media/renderers/default_renderer_factory.cc index 2410d1b..814c5fbd 100644 --- a/media/renderers/default_renderer_factory.cc +++ b/media/renderers/default_renderer_factory.cc
@@ -79,7 +79,7 @@ if (decoder_factory_) { decoder_factory_->CreateVideoDecoders(media_task_runner, gpu_factories, - &video_decoders); + media_log_, &video_decoders); } video_decoders.push_back(base::MakeUnique<GpuVideoDecoder>( gpu_factories, request_overlay_info_cb, media_log_));
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc index d084a239..8145802 100644 --- a/net/cookies/cookie_monster.cc +++ b/net/cookies/cookie_monster.cc
@@ -610,18 +610,18 @@ } // Task class for DeleteAllCreatedBetween call. -class CookieMonster::DeleteAllCreatedBetweenTask : public DeleteTask<int> { +class CookieMonster::DeleteAllCreatedBetweenTask : public DeleteTask<uint32_t> { public: DeleteAllCreatedBetweenTask(CookieMonster* cookie_monster, const Time& delete_begin, const Time& delete_end, DeleteCallback callback) - : DeleteTask<int>(cookie_monster, std::move(callback)), + : DeleteTask<uint32_t>(cookie_monster, std::move(callback)), delete_begin_(delete_begin), delete_end_(delete_end) {} // DeleteTask: - int RunDeleteTask() override; + uint32_t RunDeleteTask() override; protected: ~DeleteAllCreatedBetweenTask() override {} @@ -633,14 +633,14 @@ DISALLOW_COPY_AND_ASSIGN(DeleteAllCreatedBetweenTask); }; -int CookieMonster::DeleteAllCreatedBetweenTask::RunDeleteTask() { +uint32_t CookieMonster::DeleteAllCreatedBetweenTask::RunDeleteTask() { return this->cookie_monster()->DeleteAllCreatedBetween(delete_begin_, delete_end_); } // Task class for DeleteAllCreatedBetweenWithPredicate call. class CookieMonster::DeleteAllCreatedBetweenWithPredicateTask - : public DeleteTask<int> { + : public DeleteTask<uint32_t> { public: DeleteAllCreatedBetweenWithPredicateTask( CookieMonster* cookie_monster, @@ -648,13 +648,13 @@ Time delete_end, base::Callback<bool(const CanonicalCookie&)> predicate, DeleteCallback callback) - : DeleteTask<int>(cookie_monster, std::move(callback)), + : DeleteTask<uint32_t>(cookie_monster, std::move(callback)), delete_begin_(delete_begin), delete_end_(delete_end), predicate_(predicate) {} // DeleteTask: - int RunDeleteTask() override; + uint32_t RunDeleteTask() override; protected: ~DeleteAllCreatedBetweenWithPredicateTask() override {} @@ -667,21 +667,23 @@ DISALLOW_COPY_AND_ASSIGN(DeleteAllCreatedBetweenWithPredicateTask); }; -int CookieMonster::DeleteAllCreatedBetweenWithPredicateTask::RunDeleteTask() { +uint32_t +CookieMonster::DeleteAllCreatedBetweenWithPredicateTask::RunDeleteTask() { return this->cookie_monster()->DeleteAllCreatedBetweenWithPredicate( delete_begin_, delete_end_, predicate_); } // Task class for DeleteCanonicalCookie call. -class CookieMonster::DeleteCanonicalCookieTask : public DeleteTask<int> { +class CookieMonster::DeleteCanonicalCookieTask : public DeleteTask<uint32_t> { public: DeleteCanonicalCookieTask(CookieMonster* cookie_monster, const CanonicalCookie& cookie, DeleteCallback callback) - : DeleteTask<int>(cookie_monster, std::move(callback)), cookie_(cookie) {} + : DeleteTask<uint32_t>(cookie_monster, std::move(callback)), + cookie_(cookie) {} // DeleteTask: - int RunDeleteTask() override; + uint32_t RunDeleteTask() override; protected: ~DeleteCanonicalCookieTask() override {} @@ -692,7 +694,7 @@ DISALLOW_COPY_AND_ASSIGN(DeleteCanonicalCookieTask); }; -int CookieMonster::DeleteCanonicalCookieTask::RunDeleteTask() { +uint32_t CookieMonster::DeleteCanonicalCookieTask::RunDeleteTask() { return this->cookie_monster()->DeleteCanonicalCookie(cookie_); } @@ -873,14 +875,14 @@ } // Task class for DeleteSessionCookies call. -class CookieMonster::DeleteSessionCookiesTask : public DeleteTask<int> { +class CookieMonster::DeleteSessionCookiesTask : public DeleteTask<uint32_t> { public: DeleteSessionCookiesTask(CookieMonster* cookie_monster, DeleteCallback callback) - : DeleteTask<int>(cookie_monster, std::move(callback)) {} + : DeleteTask<uint32_t>(cookie_monster, std::move(callback)) {} // DeleteTask: - int RunDeleteTask() override; + uint32_t RunDeleteTask() override; protected: ~DeleteSessionCookiesTask() override {} @@ -889,7 +891,7 @@ DISALLOW_COPY_AND_ASSIGN(DeleteSessionCookiesTask); }; -int CookieMonster::DeleteSessionCookiesTask::RunDeleteTask() { +uint32_t CookieMonster::DeleteSessionCookiesTask::RunDeleteTask() { return this->cookie_monster()->DeleteSessionCookies(); } @@ -1207,11 +1209,11 @@ return cookies; } -int CookieMonster::DeleteAllCreatedBetween(const Time& delete_begin, - const Time& delete_end) { +uint32_t CookieMonster::DeleteAllCreatedBetween(const Time& delete_begin, + const Time& delete_end) { DCHECK(thread_checker_.CalledOnValidThread()); - int num_deleted = 0; + uint32_t num_deleted = 0; for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { CookieMap::iterator curit = it; CanonicalCookie* cc = curit->second.get(); @@ -1228,11 +1230,11 @@ return num_deleted; } -int CookieMonster::DeleteAllCreatedBetweenWithPredicate( +uint32_t CookieMonster::DeleteAllCreatedBetweenWithPredicate( const base::Time& delete_begin, const base::Time& delete_end, const base::Callback<bool(const CanonicalCookie&)>& predicate) { - int num_deleted = 0; + uint32_t num_deleted = 0; for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { CookieMap::iterator curit = it; CanonicalCookie* cc = curit->second.get(); @@ -1315,7 +1317,7 @@ } } -int CookieMonster::DeleteCanonicalCookie(const CanonicalCookie& cookie) { +uint32_t CookieMonster::DeleteCanonicalCookie(const CanonicalCookie& cookie) { DCHECK(thread_checker_.CalledOnValidThread()); for (CookieMapItPair its = cookies_.equal_range(GetKey(cookie.Domain())); @@ -1323,10 +1325,10 @@ // The creation date acts as the unique index... if (its.first->second->CreationDate() == cookie.CreationDate()) { InternalDeleteCookie(its.first, true, DELETE_COOKIE_CANONICAL); - return 1; + return 1u; } } - return 0; + return 0u; } bool CookieMonster::SetCookieWithCreationTime(const GURL& url, @@ -1347,10 +1349,10 @@ CookieOptions()); } -int CookieMonster::DeleteSessionCookies() { +uint32_t CookieMonster::DeleteSessionCookies() { DCHECK(thread_checker_.CalledOnValidThread()); - int num_deleted = 0; + uint32_t num_deleted = 0; for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { CookieMap::iterator curit = it; CanonicalCookie* cc = curit->second.get();
diff --git a/net/cookies/cookie_monster.h b/net/cookies/cookie_monster.h index 7fb91e44..13ebf88 100644 --- a/net/cookies/cookie_monster.h +++ b/net/cookies/cookie_monster.h
@@ -444,11 +444,11 @@ CookieList GetCookieListWithOptions(const GURL& url, const CookieOptions& options); - int DeleteAllCreatedBetween(const base::Time& delete_begin, - const base::Time& delete_end); + uint32_t DeleteAllCreatedBetween(const base::Time& delete_begin, + const base::Time& delete_end); // Predicate will be called with the calling thread. - int DeleteAllCreatedBetweenWithPredicate( + uint32_t DeleteAllCreatedBetweenWithPredicate( const base::Time& delete_begin, const base::Time& delete_end, const base::Callback<bool(const CanonicalCookie&)>& predicate); @@ -462,13 +462,13 @@ void DeleteCookie(const GURL& url, const std::string& cookie_name); - int DeleteCanonicalCookie(const CanonicalCookie& cookie); + uint32_t DeleteCanonicalCookie(const CanonicalCookie& cookie); bool SetCookieWithCreationTime(const GURL& url, const std::string& cookie_line, const base::Time& creation_time); - int DeleteSessionCookies(); + uint32_t DeleteSessionCookies(); // The first access to the cookie store initializes it. This method should be // called before any access to the cookie store.
diff --git a/net/cookies/cookie_monster_unittest.cc b/net/cookies/cookie_monster_unittest.cc index aace43f..5dd66bad 100644 --- a/net/cookies/cookie_monster_unittest.cc +++ b/net/cookies/cookie_monster_unittest.cc
@@ -4,6 +4,8 @@ #include "net/cookies/cookie_monster.h" +#include <stdint.h> + #include <algorithm> #include <memory> #include <string> @@ -163,28 +165,29 @@ return callback.result(); } - int DeleteAllCreatedBetween(CookieMonster* cm, - const base::Time& delete_begin, - const base::Time& delete_end) { + uint32_t DeleteAllCreatedBetween(CookieMonster* cm, + const base::Time& delete_begin, + const base::Time& delete_end) { DCHECK(cm); - ResultSavingCookieCallback<int> callback; + ResultSavingCookieCallback<uint32_t> callback; cm->DeleteAllCreatedBetweenAsync( delete_begin, delete_end, - base::Bind(&ResultSavingCookieCallback<int>::Run, + base::Bind(&ResultSavingCookieCallback<uint32_t>::Run, base::Unretained(&callback))); callback.WaitUntilDone(); return callback.result(); } - int DeleteAllCreatedBetweenWithPredicate(CookieMonster* cm, - const base::Time delete_begin, - const base::Time delete_end, - const CookiePredicate& predicate) { + uint32_t DeleteAllCreatedBetweenWithPredicate( + CookieMonster* cm, + const base::Time delete_begin, + const base::Time delete_end, + const CookiePredicate& predicate) { DCHECK(cm); - ResultSavingCookieCallback<int> callback; + ResultSavingCookieCallback<uint32_t> callback; cm->DeleteAllCreatedBetweenWithPredicateAsync( delete_begin, delete_end, predicate, - base::Bind(&ResultSavingCookieCallback<int>::Run, + base::Bind(&ResultSavingCookieCallback<uint32_t>::Run, base::Unretained(&callback))); callback.WaitUntilDone(); return callback.result(); @@ -1356,7 +1359,7 @@ EXPECT_EQ("A=B; C=D", GetCookiesWithOptions(cm.get(), http_www_foo_.url(), options)); - EXPECT_EQ(2, DeleteAll(cm.get())); + EXPECT_EQ(2u, DeleteAll(cm.get())); EXPECT_EQ("", GetCookiesWithOptions(cm.get(), http_www_foo_.url(), options)); EXPECT_EQ(0u, store->commands().size()); @@ -1367,7 +1370,7 @@ ASSERT_EQ(1u, store->commands().size()); EXPECT_EQ(CookieStoreCommand::ADD, store->commands()[0].type); - EXPECT_EQ(1, DeleteAll(cm.get())); // sync_to_store = true. + EXPECT_EQ(1u, DeleteAll(cm.get())); // sync_to_store = true. ASSERT_EQ(2u, store->commands().size()); EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[1].type); @@ -1379,8 +1382,8 @@ Time now = Time::Now(); // Nothing has been added so nothing should be deleted. - EXPECT_EQ(0, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(99), - Time())); + EXPECT_EQ(0u, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(99), + Time())); // Create 5 cookies with different creation dates. EXPECT_TRUE( @@ -1395,23 +1398,23 @@ now - TimeDelta::FromDays(7))); // Try to delete threedays and the daybefore. - EXPECT_EQ(2, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(3), - now - TimeDelta::FromDays(1))); + EXPECT_EQ(2u, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(3), + now - TimeDelta::FromDays(1))); // Try to delete yesterday, also make sure that delete_end is not // inclusive. EXPECT_EQ( - 1, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(2), now)); + 1u, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(2), now)); // Make sure the delete_begin is inclusive. EXPECT_EQ( - 1, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(7), now)); + 1u, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(7), now)); // Delete the last (now) item. - EXPECT_EQ(1, DeleteAllCreatedBetween(cm.get(), Time(), Time())); + EXPECT_EQ(1u, DeleteAllCreatedBetween(cm.get(), Time(), Time())); // Really make sure everything is gone. - EXPECT_EQ(0, DeleteAll(cm.get())); + EXPECT_EQ(0u, DeleteAll(cm.get())); } TEST_F(CookieMonsterTest, @@ -1428,8 +1431,8 @@ // Nothing has been added so nothing should be deleted. EXPECT_EQ( - 0, DeleteAllCreatedBetweenWithPredicate( - cm.get(), now - TimeDelta::FromDays(99), Time(), true_predicate)); + 0u, DeleteAllCreatedBetweenWithPredicate( + cm.get(), now - TimeDelta::FromDays(99), Time(), true_predicate)); // Create 5 cookies with different creation dates. EXPECT_TRUE( @@ -1445,24 +1448,24 @@ // Try to delete threedays and the daybefore, but we should do nothing due // to the predicate. - EXPECT_EQ(0, DeleteAllCreatedBetweenWithPredicate( - cm.get(), now - TimeDelta::FromDays(3), - now - TimeDelta::FromDays(1), false_predicate)); + EXPECT_EQ(0u, DeleteAllCreatedBetweenWithPredicate( + cm.get(), now - TimeDelta::FromDays(3), + now - TimeDelta::FromDays(1), false_predicate)); // Same as above with a null predicate, so it shouldn't delete anything. - EXPECT_EQ(0, DeleteAllCreatedBetweenWithPredicate( - cm.get(), now - TimeDelta::FromDays(3), - now - TimeDelta::FromDays(1), CookiePredicate())); + EXPECT_EQ(0u, DeleteAllCreatedBetweenWithPredicate( + cm.get(), now - TimeDelta::FromDays(3), + now - TimeDelta::FromDays(1), CookiePredicate())); // Same as above, but we use the true_predicate, so it works. - EXPECT_EQ(2, DeleteAllCreatedBetweenWithPredicate( - cm.get(), now - TimeDelta::FromDays(3), - now - TimeDelta::FromDays(1), true_predicate)); + EXPECT_EQ(2u, DeleteAllCreatedBetweenWithPredicate( + cm.get(), now - TimeDelta::FromDays(3), + now - TimeDelta::FromDays(1), true_predicate)); // Try to delete yesterday, also make sure that delete_end is not // inclusive. - EXPECT_EQ(0, + EXPECT_EQ(0u, DeleteAllCreatedBetweenWithPredicate( cm.get(), now - TimeDelta::FromDays(2), now, false_predicate)); - EXPECT_EQ(1, + EXPECT_EQ(1u, DeleteAllCreatedBetweenWithPredicate( cm.get(), now - TimeDelta::FromDays(2), now, true_predicate)); // Check our cookie values. @@ -1475,18 +1478,18 @@ << expected_cookie->DebugString(); // Make sure the delete_begin is inclusive. - EXPECT_EQ(0, + EXPECT_EQ(0u, DeleteAllCreatedBetweenWithPredicate( cm.get(), now - TimeDelta::FromDays(7), now, false_predicate)); - EXPECT_EQ(1, + EXPECT_EQ(1u, DeleteAllCreatedBetweenWithPredicate( cm.get(), now - TimeDelta::FromDays(7), now, true_predicate)); // Delete the last (now) item. - EXPECT_EQ(0, DeleteAllCreatedBetweenWithPredicate(cm.get(), Time(), Time(), - false_predicate)); - EXPECT_EQ(1, DeleteAllCreatedBetweenWithPredicate(cm.get(), Time(), Time(), - true_predicate)); + EXPECT_EQ(0u, DeleteAllCreatedBetweenWithPredicate(cm.get(), Time(), Time(), + false_predicate)); + EXPECT_EQ(1u, DeleteAllCreatedBetweenWithPredicate(cm.get(), Time(), Time(), + true_predicate)); expected_cookie = CanonicalCookie::Create(http_www_foo_.url(), "T-0=Now", now, CookieOptions()); EXPECT_THAT(test_cookie, CookieEquals(*expected_cookie)) @@ -1495,7 +1498,7 @@ << expected_cookie->DebugString(); // Really make sure everything is gone. - EXPECT_EQ(0, DeleteAll(cm.get())); + EXPECT_EQ(0u, DeleteAll(cm.get())); } static const base::TimeDelta kLastAccessThreshold = @@ -1937,8 +1940,8 @@ CookiePredicate value_matcher = base::Bind(&CookieValuePredicate, kTrueValue); PopulateCmForPredicateCheck(cm.get()); - EXPECT_EQ(7, DeleteAllCreatedBetweenWithPredicate( - cm.get(), base::Time(), base::Time::Now(), value_matcher)); + EXPECT_EQ(7u, DeleteAllCreatedBetweenWithPredicate( + cm.get(), base::Time(), base::Time::Now(), value_matcher)); EXPECT_EQ("dom_2=B; dom_3=C; host_3=C", GetCookies(cm.get(), GURL(kTopLevelDomainPlus3))); @@ -2300,8 +2303,8 @@ store->set_store_load_commands(true); std::unique_ptr<CookieMonster> cm(new CookieMonster(store.get(), nullptr)); - ResultSavingCookieCallback<int> delete_callback; - cm->DeleteAllAsync(base::Bind(&ResultSavingCookieCallback<int>::Run, + ResultSavingCookieCallback<uint32_t> delete_callback; + cm->DeleteAllAsync(base::Bind(&ResultSavingCookieCallback<uint32_t>::Run, base::Unretained(&delete_callback))); GetCookieListCallback get_cookie_list_callback; @@ -2323,7 +2326,7 @@ store->commands()[0].loaded_callback.Run(std::move(cookies)); delete_callback.WaitUntilDone(); - EXPECT_EQ(1, delete_callback.result()); + EXPECT_EQ(1u, delete_callback.result()); get_cookie_list_callback.WaitUntilDone(); EXPECT_EQ(0u, get_cookie_list_callback.cookies().size()); @@ -2764,7 +2767,7 @@ EXPECT_TRUE(SetCookie(cm.get(), http_www_foo_.url(), "X=Y; path=/")); ASSERT_EQ(0, store->flush_count()); - EXPECT_EQ(1, DeleteAll(cm.get())); + EXPECT_EQ(1u, DeleteAll(cm.get())); EXPECT_EQ(1, store->flush_count()); }
diff --git a/net/cookies/cookie_store.h b/net/cookies/cookie_store.h index 9ef7535..1a4d3d4 100644 --- a/net/cookies/cookie_store.h +++ b/net/cookies/cookie_store.h
@@ -7,6 +7,8 @@ #ifndef NET_COOKIES_COOKIE_STORE_H_ #define NET_COOKIES_COOKIE_STORE_H_ +#include <stdint.h> + #include <memory> #include <string> #include <vector> @@ -69,7 +71,7 @@ typedef base::OnceCallback<void(const std::string& cookie)> GetCookiesCallback; typedef base::OnceCallback<void(bool success)> SetCookiesCallback; - typedef base::OnceCallback<void(int num_deleted)> DeleteCallback; + typedef base::OnceCallback<void(uint32_t num_deleted)> DeleteCallback; typedef base::Callback<void(const CanonicalCookie& cookie, ChangeCause cause)> CookieChangedCallback;
diff --git a/net/cookies/cookie_store_unittest.h b/net/cookies/cookie_store_unittest.h index 4aa2a3c..56ee4248 100644 --- a/net/cookies/cookie_store_unittest.h +++ b/net/cookies/cookie_store_unittest.h
@@ -5,6 +5,8 @@ #ifndef NET_COOKIES_COOKIE_STORE_UNITTEST_H_ #define NET_COOKIES_COOKIE_STORE_UNITTEST_H_ +#include <stdint.h> + #include <set> #include <string> #include <vector> @@ -226,60 +228,59 @@ callback.WaitUntilDone(); } - int DeleteCanonicalCookie(CookieStore* cs, const CanonicalCookie& cookie) { + uint32_t DeleteCanonicalCookie(CookieStore* cs, + const CanonicalCookie& cookie) { DCHECK(cs); - ResultSavingCookieCallback<int> callback; + ResultSavingCookieCallback<uint32_t> callback; cs->DeleteCanonicalCookieAsync( - cookie, base::Bind(&ResultSavingCookieCallback<int>::Run, + cookie, base::Bind(&ResultSavingCookieCallback<uint32_t>::Run, base::Unretained(&callback))); callback.WaitUntilDone(); return callback.result(); } - int DeleteCreatedBetween(CookieStore* cs, - const base::Time& delete_begin, - const base::Time& delete_end) { + uint32_t DeleteCreatedBetween(CookieStore* cs, + const base::Time& delete_begin, + const base::Time& delete_end) { DCHECK(cs); - ResultSavingCookieCallback<int> callback; + ResultSavingCookieCallback<uint32_t> callback; cs->DeleteAllCreatedBetweenAsync( delete_begin, delete_end, - base::Bind( - &ResultSavingCookieCallback<int>::Run, - base::Unretained(&callback))); - callback.WaitUntilDone(); - return callback.result(); - } - - int DeleteAllCreatedBetweenWithPredicate( - CookieStore* cs, - const base::Time delete_begin, - const base::Time delete_end, - const CookieStore::CookiePredicate& predicate) { - DCHECK(cs); - ResultSavingCookieCallback<int> callback; - cs->DeleteAllCreatedBetweenWithPredicateAsync( - delete_begin, delete_end, predicate, - base::Bind(&ResultSavingCookieCallback<int>::Run, + base::Bind(&ResultSavingCookieCallback<uint32_t>::Run, base::Unretained(&callback))); callback.WaitUntilDone(); return callback.result(); } - int DeleteSessionCookies(CookieStore* cs) { + uint32_t DeleteAllCreatedBetweenWithPredicate( + CookieStore* cs, + const base::Time delete_begin, + const base::Time delete_end, + const CookieStore::CookiePredicate& predicate) { DCHECK(cs); - ResultSavingCookieCallback<int> callback; - cs->DeleteSessionCookiesAsync( - base::Bind( - &ResultSavingCookieCallback<int>::Run, - base::Unretained(&callback))); + ResultSavingCookieCallback<uint32_t> callback; + cs->DeleteAllCreatedBetweenWithPredicateAsync( + delete_begin, delete_end, predicate, + base::Bind(&ResultSavingCookieCallback<uint32_t>::Run, + base::Unretained(&callback))); callback.WaitUntilDone(); return callback.result(); } - int DeleteAll(CookieStore* cs) { + uint32_t DeleteSessionCookies(CookieStore* cs) { DCHECK(cs); - ResultSavingCookieCallback<int> callback; - cs->DeleteAllAsync(base::Bind(&ResultSavingCookieCallback<int>::Run, + ResultSavingCookieCallback<uint32_t> callback; + cs->DeleteSessionCookiesAsync( + base::Bind(&ResultSavingCookieCallback<uint32_t>::Run, + base::Unretained(&callback))); + callback.WaitUntilDone(); + return callback.result(); + } + + uint32_t DeleteAll(CookieStore* cs) { + DCHECK(cs); + ResultSavingCookieCallback<uint32_t> callback; + cs->DeleteAllAsync(base::Bind(&ResultSavingCookieCallback<uint32_t>::Run, base::Unretained(&callback))); callback.WaitUntilDone(); return callback.result(); @@ -1216,7 +1217,7 @@ EXPECT_EQ(2u, this->GetAllCookies(cs).size()); // Delete both, and make sure it works - EXPECT_EQ(2, this->DeleteAll(cs)); + EXPECT_EQ(2u, this->DeleteAll(cs)); EXPECT_EQ(0u, this->GetAllCookies(cs).size()); } @@ -1238,14 +1239,14 @@ this->GetCookies(cs, this->http_www_foo_.url())); // Remove cookies in empty intervals. - EXPECT_EQ(0, this->DeleteCreatedBetween(cs, last_month, last_minute)); - EXPECT_EQ(0, this->DeleteCreatedBetween(cs, next_minute, next_month)); + EXPECT_EQ(0u, this->DeleteCreatedBetween(cs, last_month, last_minute)); + EXPECT_EQ(0u, this->DeleteCreatedBetween(cs, next_minute, next_month)); // Check that the cookie is still there. this->MatchCookieLines("A=B", this->GetCookies(cs, this->http_www_foo_.url())); // Remove the cookie with an interval defined by two dates. - EXPECT_EQ(1, this->DeleteCreatedBetween(cs, last_minute, next_minute)); + EXPECT_EQ(1u, this->DeleteCreatedBetween(cs, last_minute, next_minute)); // Check that the cookie disappeared. this->MatchCookieLines(std::string(), this->GetCookies(cs, this->http_www_foo_.url())); @@ -1257,7 +1258,7 @@ this->GetCookies(cs, this->http_www_foo_.url())); // Remove the cookie with a null ending time. - EXPECT_EQ(1, this->DeleteCreatedBetween(cs, last_minute, base::Time())); + EXPECT_EQ(1u, this->DeleteCreatedBetween(cs, last_minute, base::Time())); // Check that the cookie disappeared. this->MatchCookieLines(std::string(), this->GetCookies(cs, this->http_www_foo_.url())); @@ -1284,7 +1285,7 @@ EXPECT_TRUE(this->SetCookie(cs, this->https_www_foo_.url(), "E=B")); // Delete cookies. - EXPECT_EQ(2, // Deletes A=B, E=B + EXPECT_EQ(2u, // Deletes A=B, E=B this->DeleteAllCreatedBetweenWithPredicate( cs, now, base::Time::Max(), base::Bind(&CookieHasValue, desired_value))); @@ -1294,20 +1295,21 @@ this->GetCookies(cs, this->https_www_foo_.url())); // Now check that using a null predicate will do nothing. - EXPECT_EQ(0, this->DeleteAllCreatedBetweenWithPredicate( - cs, now, base::Time::Max(), CookieStore::CookiePredicate())); + EXPECT_EQ(0u, + this->DeleteAllCreatedBetweenWithPredicate( + cs, now, base::Time::Max(), CookieStore::CookiePredicate())); // Finally, check that we don't delete cookies when our time range is off. desired_value = "D"; - EXPECT_EQ(0, this->DeleteAllCreatedBetweenWithPredicate( - cs, last_month, last_minute, - base::Bind(&CookieHasValue, desired_value))); + EXPECT_EQ(0u, this->DeleteAllCreatedBetweenWithPredicate( + cs, last_month, last_minute, + base::Bind(&CookieHasValue, desired_value))); this->MatchCookieLines("C=D;Y=Z", this->GetCookies(cs, this->https_www_foo_.url())); // Same thing, but with a good time range. - EXPECT_EQ(1, this->DeleteAllCreatedBetweenWithPredicate( - cs, now, base::Time::Max(), - base::Bind(&CookieHasValue, desired_value))); + EXPECT_EQ(1u, this->DeleteAllCreatedBetweenWithPredicate( + cs, now, base::Time::Max(), + base::Bind(&CookieHasValue, desired_value))); this->MatchCookieLines("Y=Z", this->GetCookies(cs, this->https_www_foo_.url())); } @@ -1440,14 +1442,14 @@ EXPECT_EQ(1u, list.size()); EXPECT_EQ("", list[0].Name()); EXPECT_EQ("a", list[0].Value()); - EXPECT_EQ(1, this->DeleteAll(cs)); + EXPECT_EQ(1u, this->DeleteAll(cs)); EXPECT_TRUE(this->SetCookieWithOptions(cs, url_foo, "=b", options)); list = this->GetAllCookiesForURL(cs, url_foo); EXPECT_EQ(1u, list.size()); EXPECT_EQ("", list[0].Name()); EXPECT_EQ("b", list[0].Value()); - EXPECT_EQ(1, this->DeleteAll(cs)); + EXPECT_EQ(1u, this->DeleteAll(cs)); } TYPED_TEST_P(CookieStoreTest, CookieOrdering) { @@ -1570,20 +1572,20 @@ CookieList cookies = this->GetCookieListWithOptions( cs, this->www_foo_foo_.url(), CookieOptions()); ASSERT_EQ(1u, cookies.size()); - EXPECT_EQ(1, this->DeleteCanonicalCookie(cs, cookies[0])); + EXPECT_EQ(1u, this->DeleteCanonicalCookie(cs, cookies[0])); EXPECT_EQ(1u, this->GetAllCookies(cs).size()); EXPECT_EQ("", this->GetCookies(cs, this->www_foo_foo_.url())); EXPECT_EQ("A=C", this->GetCookies(cs, this->www_foo_bar_.url())); // Deleting the "/foo" cookie again should fail. - EXPECT_EQ(0, this->DeleteCanonicalCookie(cs, cookies[0])); + EXPECT_EQ(0u, this->DeleteCanonicalCookie(cs, cookies[0])); // Try to delete the "/bar" cookie after overwriting it with a new cookie. cookies = this->GetCookieListWithOptions(cs, this->www_foo_bar_.url(), CookieOptions()); ASSERT_EQ(1u, cookies.size()); EXPECT_TRUE(this->SetCookie(cs, this->http_www_foo_.url(), "A=D;Path=/bar")); - EXPECT_EQ(0, this->DeleteCanonicalCookie(cs, cookies[0])); + EXPECT_EQ(0u, this->DeleteCanonicalCookie(cs, cookies[0])); EXPECT_EQ(1u, this->GetAllCookies(cs).size()); EXPECT_EQ("A=D", this->GetCookies(cs, this->www_foo_bar_.url())); @@ -1591,7 +1593,7 @@ cookies = this->GetCookieListWithOptions(cs, this->www_foo_bar_.url(), CookieOptions()); ASSERT_EQ(1u, cookies.size()); - EXPECT_EQ(1, this->DeleteCanonicalCookie(cs, cookies[0])); + EXPECT_EQ(1u, this->DeleteCanonicalCookie(cs, cookies[0])); EXPECT_EQ(0u, this->GetAllCookies(cs).size()); EXPECT_EQ("", this->GetCookies(cs, this->www_foo_bar_.url())); }
diff --git a/net/log/file_net_log_observer.cc b/net/log/file_net_log_observer.cc index 0c05f9e1..7f78c9f 100644 --- a/net/log/file_net_log_observer.cc +++ b/net/log/file_net_log_observer.cc
@@ -16,10 +16,10 @@ #include "base/files/file_util.h" #include "base/json/json_writer.h" #include "base/logging.h" -#include "base/single_thread_task_runner.h" +#include "base/sequenced_task_runner.h" #include "base/strings/string_number_conversions.h" #include "base/synchronization/lock.h" -#include "base/threading/thread.h" +#include "base/task_scheduler/post_task.h" #include "base/values.h" #include "net/log/net_log_capture_mode.h" #include "net/log/net_log_entry.h" @@ -28,10 +28,21 @@ namespace { -// Number of events that can build up in |write_queue_| before file thread -// is triggered to drain the queue. +// Number of events that can build up in |write_queue_| before a task is posted +// to the file task runner to flush them to disk. const int kNumWriteQueueEvents = 15; +scoped_refptr<base::SequencedTaskRunner> CreateFileTaskRunner() { + // The tasks posted to this sequenced task runner do synchronous File I/O for + // the purposes of writing NetLog files. + // + // These intentionally block shutdown to ensure the log file has finished + // being written. + return base::CreateSequencedTaskRunnerWithTraits( + {base::MayBlock(), base::TaskPriority::USER_VISIBLE, + base::TaskShutdownBehavior::BLOCK_SHUTDOWN}); +} + } // namespace namespace net { @@ -41,14 +52,14 @@ // WriteQueue receives events from FileNetLogObserver on the main thread and // holds them in a queue until they are drained from the queue and written to -// file on the file thread. +// file on the file task runner. // // WriteQueue contains the resources shared between the main thread and the -// file thread. |lock_| must be acquired to read or write to |queue_| and +// file task runner. |lock_| must be acquired to read or write to |queue_| and // |memory_|. // // WriteQueue is refcounted and should be destroyed once all events on the -// file thread have finished executing. +// file task runner have finished executing. class FileNetLogObserver::WriteQueue : public base::RefCountedThreadSafe<WriteQueue> { public: @@ -73,17 +84,17 @@ ~WriteQueue(); - // Queue of events to be written shared between main thread and file thread. - // Main thread adds events to the queue and the file thread drains them and - // writes the events to file. + // Queue of events to be written, shared between main thread and file task + // runner. Main thread adds events to the queue and the file task runner + // drains them and writes the events to file. // // |lock_| must be acquired to read or write to this. EventQueue queue_; // Tracks how much memory is being used by the virtual write queue. // Incremented in AddEntryToQueue() when events are added to the - // buffer, and decremented when SwapQueue() is called and the file thread's - // local queue is swapped with the shared write queue. + // buffer, and decremented when SwapQueue() is called and the file task + // runner's local queue is swapped with the shared write queue. // // |lock_| must be acquired to read or write to this. size_t memory_; @@ -95,14 +106,14 @@ // Protects access to |queue_| and |memory_|. // // A lock is necessary because |queue_| and |memory_| are shared between the - // file thread and the main thread. NetLog's lock protects OnAddEntry(), + // file task runner and the main thread. NetLog's lock protects OnAddEntry(), // which calls AddEntryToQueue(), but it does not protect access to the // observer's member variables. Thus, a race condition exists if a thread is - // calling OnAddEntry() at the same time that the file thread is accessing - // |memory_| and |queue_| to write events to file. The |queue_| and |memory_| - // counter are necessary to bound the amount of memory that is used for the - // queue in the event that the file thread lags significantly behind the main - // thread in writing events to file. + // calling OnAddEntry() at the same time that the file task runner is + // accessing |memory_| and |queue_| to write events to file. The |queue_| and + // |memory_| counter are necessary to bound the amount of memory that is used + // for the queue in the event that the file task runner lags significantly + // behind the main thread in writing events to file. base::Lock lock_; DISALLOW_COPY_AND_ASSIGN(WriteQueue); @@ -138,14 +149,14 @@ // This implementation of FileWriter is used when the observer is in bounded // mode. // BoundedFileWriter can be constructed on any thread, and afterwards is only -// accessed on the file thread. +// accessed on the file task runner. class FileNetLogObserver::BoundedFileWriter : public FileNetLogObserver::FileWriter { public: BoundedFileWriter(const base::FilePath& directory, size_t max_file_size, size_t total_num_files, - scoped_refptr<base::SingleThreadTaskRunner> task_runner); + scoped_refptr<base::SequencedTaskRunner> task_runner); ~BoundedFileWriter() override; @@ -180,8 +191,8 @@ // the constant file. const size_t max_file_size_; - // Task runner from the file thread. - const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + // Task runner for doing file operations. + const scoped_refptr<base::SequencedTaskRunner> task_runner_; DISALLOW_COPY_AND_ASSIGN(BoundedFileWriter); }; @@ -189,12 +200,12 @@ // This implementation of FileWriter is used when the observer is in unbounded // mode. // UnboundedFileWriter can be constructed on any thread, and afterwards is only -// accessed on the file thread. +// accessed on the file task runner. class FileNetLogObserver::UnboundedFileWriter : public FileNetLogObserver::FileWriter { public: UnboundedFileWriter(const base::FilePath& path, - scoped_refptr<base::SingleThreadTaskRunner> task_runner); + scoped_refptr<base::SequencedTaskRunner> task_runner); ~UnboundedFileWriter() override; @@ -211,19 +222,22 @@ // Is set to true after the first event is written to the log file. bool first_event_written_; - // Task runner from the file thread. - const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + // Task runner for doing file operations. + const scoped_refptr<base::SequencedTaskRunner> task_runner_; DISALLOW_COPY_AND_ASSIGN(UnboundedFileWriter); }; std::unique_ptr<FileNetLogObserver> FileNetLogObserver::CreateBounded( - scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, const base::FilePath& directory, size_t max_total_size, size_t total_num_files, std::unique_ptr<base::Value> constants) { DCHECK_GT(total_num_files, 0u); + + scoped_refptr<base::SequencedTaskRunner> file_task_runner = + CreateFileTaskRunner(); + // The BoundedFileWriter uses a soft limit to write events to file that allows // the size of the file to exceed the limit, but the WriteQueue uses a hard // limit which the size of |WriteQueue::queue_| cannot exceed. Thus, the @@ -248,9 +262,11 @@ } std::unique_ptr<FileNetLogObserver> FileNetLogObserver::CreateUnbounded( - scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, const base::FilePath& log_path, std::unique_ptr<base::Value> constants) { + scoped_refptr<base::SequencedTaskRunner> file_task_runner = + CreateFileTaskRunner(); + std::unique_ptr<FileWriter> file_writer( new UnboundedFileWriter(log_path, file_task_runner)); @@ -268,9 +284,9 @@ net_log()->DeprecatedRemoveObserver(this); file_task_runner_->PostTask( FROM_HERE, base::Bind(&FileNetLogObserver::FileWriter::DeleteAllFiles, - base::Unretained(file_writer_))); + base::Unretained(file_writer_.get()))); } - file_task_runner_->DeleteSoon(FROM_HERE, file_writer_); + file_task_runner_->DeleteSoon(FROM_HERE, file_writer_.release()); } void FileNetLogObserver::StartObserving(NetLog* net_log, @@ -279,14 +295,22 @@ } void FileNetLogObserver::StopObserving(std::unique_ptr<base::Value> polled_data, - const base::Closure& callback) { + base::OnceClosure optional_callback) { net_log()->DeprecatedRemoveObserver(this); - file_task_runner_->PostTaskAndReply( - FROM_HERE, base::Bind(&FileNetLogObserver::FileWriter::FlushThenStop, - base::Unretained(file_writer_), write_queue_, - base::Passed(&polled_data)), - callback); + base::OnceClosure bound_flush_then_stop = + base::Bind(&FileNetLogObserver::FileWriter::FlushThenStop, + base::Unretained(file_writer_.get()), write_queue_, + base::Passed(&polled_data)); + + // Note that PostTaskAndReply() requires a non-null closure. + if (!optional_callback.is_null()) { + file_task_runner_->PostTaskAndReply(FROM_HERE, + std::move(bound_flush_then_stop), + std::move(optional_callback)); + } else { + file_task_runner_->PostTask(FROM_HERE, std::move(bound_flush_then_stop)); + } } void FileNetLogObserver::OnAddEntry(const NetLogEntry& entry) { @@ -298,31 +322,32 @@ size_t queue_size = write_queue_->AddEntryToQueue(std::move(json)); - // If events build up in |write_queue_|, trigger the file thread to drain + // If events build up in |write_queue_|, trigger the file task runner to drain // the queue. Because only 1 item is added to the queue at a time, if // queue_size > kNumWriteQueueEvents a task has already been posted, or will // be posted. if (queue_size == kNumWriteQueueEvents) { file_task_runner_->PostTask( - FROM_HERE, base::Bind(&FileNetLogObserver::FileWriter::Flush, - base::Unretained(file_writer_), write_queue_)); + FROM_HERE, + base::Bind(&FileNetLogObserver::FileWriter::Flush, + base::Unretained(file_writer_.get()), write_queue_)); } } FileNetLogObserver::FileNetLogObserver( - scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, + scoped_refptr<base::SequencedTaskRunner> file_task_runner, std::unique_ptr<FileWriter> file_writer, scoped_refptr<WriteQueue> write_queue, std::unique_ptr<base::Value> constants) : file_task_runner_(std::move(file_task_runner)), write_queue_(std::move(write_queue)), - file_writer_(file_writer.release()) { + file_writer_(std::move(file_writer)) { if (!constants) constants = GetNetConstants(); file_task_runner_->PostTask( - FROM_HERE, - base::Bind(&FileNetLogObserver::FileWriter::Initialize, - base::Unretained(file_writer_), base::Passed(&constants))); + FROM_HERE, base::Bind(&FileNetLogObserver::FileWriter::Initialize, + base::Unretained(file_writer_.get()), + base::Passed(&constants))); } FileNetLogObserver::WriteQueue::WriteQueue(size_t memory_max) @@ -367,12 +392,12 @@ const base::FilePath& directory, size_t max_file_size, size_t total_num_files, - scoped_refptr<base::SingleThreadTaskRunner> task_runner) + scoped_refptr<base::SequencedTaskRunner> task_runner) : directory_(directory), total_num_files_(total_num_files), current_file_idx_(0), max_file_size_(max_file_size), - task_runner_(task_runner) { + task_runner_(std::move(task_runner)) { event_files_.resize(total_num_files_); } @@ -473,8 +498,8 @@ FileNetLogObserver::UnboundedFileWriter::UnboundedFileWriter( const base::FilePath& path, - scoped_refptr<base::SingleThreadTaskRunner> task_runner) - : file_path_(path), task_runner_(task_runner) {} + scoped_refptr<base::SequencedTaskRunner> task_runner) + : file_path_(path), task_runner_(std::move(task_runner)) {} FileNetLogObserver::UnboundedFileWriter::~UnboundedFileWriter() {}
diff --git a/net/log/file_net_log_observer.h b/net/log/file_net_log_observer.h index 2b2b3a8..fc1fd8a 100644 --- a/net/log/file_net_log_observer.h +++ b/net/log/file_net_log_observer.h
@@ -15,7 +15,7 @@ namespace base { class Value; class FilePath; -class SingleThreadTaskRunner; +class SequencedTaskRunner; } // namespace base namespace net { @@ -42,17 +42,12 @@ // large this file can grow; all events added will be written to the file. // // The consumer must call StartObserving before calling StopObserving, and must -// call each method exactly once in the lifetime of the observer. StartObserving -// and StopObserving must be called on the same thread, but there is no -// restriction on which thread is used. +// call each method exactly once in the lifetime of the observer. class NET_EXPORT FileNetLogObserver : public NetLog::ThreadSafeObserver { public: // Creates a FileNetLogObserver in bounded mode. // - // |file_task_runner| indicates the task runner that should be used to post - // tasks from the main thread to the file thread. - // - // |directory| is the directory where the log files will be. + // |directory| is the directory where the log files will be written to. // // |max_total_size| is the approximate limit on the cumulative size of all // netlog files. @@ -64,7 +59,6 @@ // the log. It should generally be a modified version of GetNetConstants(). // If not present, the output of GetNetConstants() will be used. static std::unique_ptr<FileNetLogObserver> CreateBounded( - scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, const base::FilePath& directory, size_t max_total_size, size_t total_num_files, @@ -72,16 +66,12 @@ // Creates a FileNetLogObserver in unbounded mode. // - // |file_task_runner| indicates the task runner that should be used to post - // tasks from the main thread to the file thread. - // - // |log_path| is where the log file will be. + // |log_path| is where the log file will be written to. // // |constants| is an optional legend for decoding constant values used in // the log. It should generally be a modified version of GetNetConstants(). // If not present, the output of GetNetConstants() will be used. static std::unique_ptr<FileNetLogObserver> CreateUnbounded( - scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, const base::FilePath& log_path, std::unique_ptr<base::Value> constants); @@ -98,11 +88,11 @@ // |polled_data| is an optional argument used to add additional network stack // state to the log. // - // |callback| will be run on whichever thread StopObserving() was called on - // once all file writing is complete and the netlog files can be accessed - // safely. + // If non-null, |optional_callback| will be run on whichever thread + // StopObserving() was called on once all file writing is complete and the + // netlog files can be accessed safely. void StopObserving(std::unique_ptr<base::Value> polled_data, - const base::Closure& callback); + base::OnceClosure optional_callback); // NetLog::ThreadSafeObserver void OnAddEntry(const NetLogEntry& entry) override; @@ -113,29 +103,26 @@ class BoundedFileWriter; class UnboundedFileWriter; - FileNetLogObserver( - scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, - std::unique_ptr<FileWriter> file_writer, - scoped_refptr<WriteQueue> write_queue, - std::unique_ptr<base::Value> constants); + FileNetLogObserver(scoped_refptr<base::SequencedTaskRunner> file_task_runner, + std::unique_ptr<FileWriter> file_writer, + scoped_refptr<WriteQueue> write_queue, + std::unique_ptr<base::Value> constants); - scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; + scoped_refptr<base::SequencedTaskRunner> file_task_runner_; - // The |write_queue_| object is shared between the file thread and the main - // thread, and should be alive for the entirety of the observer's lifetime. - // It should be destroyed once both the observer has been destroyed and all - // tasks posted to the file thread have completed. + // The |write_queue_| object is shared between the file task runner and the + // main thread, and should be alive for the entirety of the observer's + // lifetime. It should be destroyed once both the observer has been destroyed + // and all tasks posted to the file task runner have completed. scoped_refptr<WriteQueue> write_queue_; - // This is the owning reference to a file thread object. The observer is - // responsible for destroying the file thread object by posting a task from - // the main thread to the file thread to destroy the FileWriter when the - // observer is destroyed. + // The FileNetLogObserver is shared between the main thread and + // |file_task_runner_|. // - // The use of base::Unretained with |file_writer_| to post tasks to the file - // thread is safe because the FileWriter object will be alive until the - // observer's destruction. - FileWriter* file_writer_; + // Conceptually FileNetLogObserver owns it, however on destruction its + // deletion is deferred until outstanding tasks on |file_task_runner_| have + // finished (since it is posted using base::Unretained()). + std::unique_ptr<FileWriter> file_writer_; DISALLOW_COPY_AND_ASSIGN(FileNetLogObserver); };
diff --git a/net/log/file_net_log_observer_unittest.cc b/net/log/file_net_log_observer_unittest.cc index 0cbf7d1..75082a766 100644 --- a/net/log/file_net_log_observer_unittest.cc +++ b/net/log/file_net_log_observer_unittest.cc
@@ -21,6 +21,7 @@ #include "base/message_loop/message_loop.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" +#include "base/task_scheduler/task_scheduler.h" #include "base/threading/thread.h" #include "base/values.h" #include "net/base/test_completion_callback.h" @@ -159,21 +160,16 @@ ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); bounded_log_dir_ = temp_dir_.GetPath(); unbounded_log_path_ = bounded_log_dir_.AppendASCII("net-log.json"); - file_thread_.reset(new base::Thread("NetLog File Thread")); - file_thread_->StartWithOptions( - base::Thread::Options(base::MessageLoop::TYPE_DEFAULT, 0)); - ASSERT_TRUE(file_thread_->WaitUntilThreadStarted()); } void CreateAndStartObserving(std::unique_ptr<base::Value> constants) { bool bounded = GetParam(); if (bounded) { logger_ = FileNetLogObserver::CreateBounded( - file_thread_->task_runner(), bounded_log_dir_, kLargeFileSize, - kTotalNumFiles, std::move(constants)); + bounded_log_dir_, kLargeFileSize, kTotalNumFiles, + std::move(constants)); } else { - logger_ = FileNetLogObserver::CreateUnbounded(file_thread_->task_runner(), - unbounded_log_path_, + logger_ = FileNetLogObserver::CreateUnbounded(unbounded_log_path_, std::move(constants)); } @@ -194,6 +190,11 @@ } bool LogFilesExist() { + // The log files are written by a sequenced task runner. Drain all the + // scheduled tasks to ensure that the file writing ones have run before + // checking if they exist. + base::TaskScheduler::GetInstance()->FlushForTesting(); + bool bounded = GetParam(); if (bounded) { if (base::PathExists(bounded_log_dir_.AppendASCII("constants.json")) || @@ -212,7 +213,6 @@ protected: NetLog net_log_; - std::unique_ptr<base::Thread> file_thread_; std::unique_ptr<FileNetLogObserver> logger_; private: @@ -227,18 +227,13 @@ void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); bounded_log_dir_ = temp_dir_.GetPath(); - file_thread_.reset(new base::Thread("NetLog File Thread")); - file_thread_->StartWithOptions( - base::Thread::Options(base::MessageLoop::TYPE_DEFAULT, 0)); - ASSERT_TRUE(file_thread_->WaitUntilThreadStarted()); } void CreateAndStartObserving(std::unique_ptr<base::Value> constants, int total_file_size, int num_files) { logger_ = FileNetLogObserver::CreateBounded( - file_thread_->task_runner(), bounded_log_dir_, total_file_size, - num_files, std::move(constants)); + bounded_log_dir_, total_file_size, num_files, std::move(constants)); logger_->StartObserving(&net_log_, NetLogCaptureMode::Default()); } @@ -263,7 +258,6 @@ protected: NetLog net_log_; - std::unique_ptr<base::Thread> file_thread_; std::unique_ptr<FileNetLogObserver> logger_; private: @@ -276,18 +270,41 @@ FileNetLogObserverTest, ::testing::Values(true, false)); +// Tests deleting a FileNetLogObserver without first calling StopObserving(). TEST_P(FileNetLogObserverTest, ObserverDestroyedWithoutStopObserving) { CreateAndStartObserving(nullptr); // Send dummy event AddEntries(logger_.get(), 1, kDummyEventSize); - logger_.reset(); - file_thread_.reset(); + // The log files should have been started. + ASSERT_TRUE(LogFilesExist()); + logger_.reset(); + + // When the logger is re-set without having called StopObserving(), the + // partially written log files are deleted. ASSERT_FALSE(LogFilesExist()); } +// Tests calling StopObserving() with a null closure. +TEST_P(FileNetLogObserverTest, StopObservingNullClosure) { + CreateAndStartObserving(nullptr); + + // Send dummy event + AddEntries(logger_.get(), 1, kDummyEventSize); + + // The log files should have been started. + ASSERT_TRUE(LogFilesExist()); + + logger_->StopObserving(nullptr, base::OnceClosure()); + + logger_.reset(); + + // Since the logger was explicitly stopped, its files should still exist. + ASSERT_TRUE(LogFilesExist()); +} + TEST_P(FileNetLogObserverTest, GeneratesValidJSONWithNoEvents) { TestClosure closure; @@ -801,7 +818,7 @@ TEST_P(FileNetLogObserverTest, AddEventsFromMultipleThreadsWithStopObserving) { const size_t kNumThreads = 10; std::vector<std::unique_ptr<base::Thread>> threads(kNumThreads); - // Start all the threads. Waiting for them to start is to hopefuly improve + // Start all the threads. Waiting for them to start is to hopefully improve // the odds of hitting interesting races once events start being added. for (size_t i = 0; i < threads.size(); ++i) { threads[i] = base::MakeUnique<base::Thread>( @@ -828,13 +845,15 @@ // Join all the threads. threads.clear(); + + ASSERT_TRUE(LogFilesExist()); } TEST_P(FileNetLogObserverTest, AddEventsFromMultipleThreadsWithoutStopObserving) { const size_t kNumThreads = 10; std::vector<std::unique_ptr<base::Thread>> threads(kNumThreads); - // Start all the threads. Waiting for them to start is to hopefuly improve + // Start all the threads. Waiting for them to start is to hopefully improve // the odds of hitting interesting races once events start being added. for (size_t i = 0; i < threads.size(); ++i) { threads[i] = base::MakeUnique<base::Thread>( @@ -859,6 +878,9 @@ // Join all the threads. threads.clear(); + + // The log file doesn't exist since StopObserving() was not called. + ASSERT_FALSE(LogFilesExist()); } } // namespace
diff --git a/net/tools/transport_security_state_generator/input_file_parsers.cc b/net/tools/transport_security_state_generator/input_file_parsers.cc index 2a8d3d8..691b403 100644 --- a/net/tools/transport_security_state_generator/input_file_parsers.cc +++ b/net/tools/transport_security_state_generator/input_file_parsers.cc
@@ -167,6 +167,12 @@ } // namespace bool ParseCertificatesFile(base::StringPiece certs_input, Pinsets* pinsets) { + if (certs_input.find("\r\n") != base::StringPiece::npos) { + LOG(ERROR) << "CRLF line-endings found in the pins file. All files must " + "use LF (unix style) line-endings."; + return false; + } + std::string line; CertificateParserState current_state = CertificateParserState::PRE_NAME;
diff --git a/ppapi/proxy/audio_encoder_resource.h b/ppapi/proxy/audio_encoder_resource.h index 0290d21be..acdd774 100644 --- a/ppapi/proxy/audio_encoder_resource.h +++ b/ppapi/proxy/audio_encoder_resource.h
@@ -9,7 +9,6 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_vector.h" #include "ppapi/proxy/connection.h" #include "ppapi/proxy/plugin_resource.h" #include "ppapi/shared_impl/media_stream_buffer_manager.h"
diff --git a/ppapi/proxy/video_decoder_resource.cc b/ppapi/proxy/video_decoder_resource.cc index 26fee481..495d257 100644 --- a/ppapi/proxy/video_decoder_resource.cc +++ b/ppapi/proxy/video_decoder_resource.cc
@@ -238,14 +238,10 @@ return PP_ERROR_NOMEMORY; available_shm_buffers_.push_back(shm_buffer.get()); - if (shm_buffers_.size() < kMaximumPendingDecodes) { - shm_buffers_.push_back(shm_buffer.release()); - } else { - // Delete manually since ScopedVector won't delete the existing element if - // we just assign it. - delete shm_buffers_[shm_id]; - shm_buffers_[shm_id] = shm_buffer.release(); - } + if (shm_buffers_.size() < kMaximumPendingDecodes) + shm_buffers_.push_back(std::move(shm_buffer)); + else + shm_buffers_[shm_id] = std::move(shm_buffer); } // At this point we should have shared memory to hold the plugin's buffer. @@ -486,7 +482,7 @@ return; } // Make the shm buffer available. - available_shm_buffers_.push_back(shm_buffers_[shm_id]); + available_shm_buffers_.push_back(shm_buffers_[shm_id].get()); // If the plugin is waiting, let it call Decode again. if (decode_callback_.get()) { scoped_refptr<TrackedCallback> callback;
diff --git a/ppapi/proxy/video_decoder_resource.h b/ppapi/proxy/video_decoder_resource.h index adb3f05..0fd70400 100644 --- a/ppapi/proxy/video_decoder_resource.h +++ b/ppapi/proxy/video_decoder_resource.h
@@ -9,11 +9,11 @@ #include <memory> #include <queue> +#include <vector> #include "base/containers/hash_tables.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_vector.h" #include "ppapi/proxy/connection.h" #include "ppapi/proxy/plugin_resource.h" #include "ppapi/proxy/ppapi_proxy_export.h" @@ -143,8 +143,8 @@ void DeleteGLTexture(uint32_t texture_id); void WriteNextPicture(); - // ScopedVector to own the shared memory buffers. - ScopedVector<ShmBuffer> shm_buffers_; + // The shared memory buffers. + std::vector<std::unique_ptr<ShmBuffer>> shm_buffers_; // List of available shared memory buffers. typedef std::vector<ShmBuffer*> ShmBufferList;
diff --git a/ppapi/proxy/video_encoder_resource.cc b/ppapi/proxy/video_encoder_resource.cc index 0f7c890..10aa8fa 100644 --- a/ppapi/proxy/video_encoder_resource.cc +++ b/ppapi/proxy/video_encoder_resource.cc
@@ -401,10 +401,10 @@ new base::SharedMemory(shm_handles[i], true)); CHECK(shm->Map(buffer_length)); - ShmBuffer* buffer = new ShmBuffer(i, std::move(shm)); - shm_buffers_.push_back(buffer); + auto buffer = base::MakeUnique<ShmBuffer>(i, std::move(shm)); bitstream_buffer_map_.insert( std::make_pair(buffer->shm->memory(), buffer->id)); + shm_buffers_.push_back(std::move(buffer)); } }
diff --git a/ppapi/proxy/video_encoder_resource.h b/ppapi/proxy/video_encoder_resource.h index 59877d3..e04c513 100644 --- a/ppapi/proxy/video_encoder_resource.h +++ b/ppapi/proxy/video_encoder_resource.h
@@ -9,10 +9,10 @@ #include <deque> #include <memory> +#include <vector> #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_vector.h" #include "ppapi/proxy/connection.h" #include "ppapi/proxy/plugin_resource.h" #include "ppapi/shared_impl/media_stream_buffer_manager.h" @@ -46,7 +46,7 @@ ShmBuffer(uint32_t id, std::unique_ptr<base::SharedMemory> shm); ~ShmBuffer(); - // Index of the buffer in the ScopedVector. Buffers have the same id in + // Index of the buffer in the vector. Buffers have the same id in // the plugin and the host. uint32_t id; std::unique_ptr<base::SharedMemory> shm; @@ -56,7 +56,7 @@ BitstreamBuffer(uint32_t id, uint32_t size, bool key_frame); ~BitstreamBuffer(); - // Index of the buffer in the ScopedVector. Same as ShmBuffer::id. + // Index of the buffer in the vector. Same as ShmBuffer::id. uint32_t id; uint32_t size; bool key_frame; @@ -141,7 +141,7 @@ VideoFrameMap; VideoFrameMap video_frames_; - ScopedVector<ShmBuffer> shm_buffers_; + std::vector<std::unique_ptr<ShmBuffer>> shm_buffers_; std::deque<BitstreamBuffer> available_bitstream_buffers_; typedef std::map<void*, uint32_t> BitstreamBufferMap;
diff --git a/ppapi/proxy/video_encoder_resource_unittest.cc b/ppapi/proxy/video_encoder_resource_unittest.cc index 5dc29c2..447643cf 100644 --- a/ppapi/proxy/video_encoder_resource_unittest.cc +++ b/ppapi/proxy/video_encoder_resource_unittest.cc
@@ -6,7 +6,9 @@ #include <stdint.h> +#include <memory> #include <utility> +#include <vector> #include "base/memory/shared_memory.h" #include "base/process/process.h" @@ -290,7 +292,7 @@ void SendBitstreamBuffers(const ResourceMessageCallParams& params, uint32_t buffer_length) { std::vector<SerializedHandle> handles; - for (base::SharedMemory* mem : shared_memory_bitstreams_) { + for (const auto& mem : shared_memory_bitstreams_) { ASSERT_EQ(mem->requested_size(), buffer_length); base::SharedMemoryHandle handle = mem->handle().Duplicate(); ASSERT_TRUE(handle.IsValid()); @@ -423,7 +425,7 @@ const PPB_VideoEncoder_0_2* encoder_iface_; const PPB_VideoEncoder_0_1* encoder_iface_0_1_; - ScopedVector<base::SharedMemory> shared_memory_bitstreams_; + std::vector<std::unique_ptr<base::SharedMemory>> shared_memory_bitstreams_; MediaStreamBufferManager video_frames_manager_; };
diff --git a/services/metrics/public/cpp/ukm_recorder.h b/services/metrics/public/cpp/ukm_recorder.h index fcefa5b..ef1802f 100644 --- a/services/metrics/public/cpp/ukm_recorder.h +++ b/services/metrics/public/cpp/ukm_recorder.h
@@ -20,6 +20,7 @@ class ContextualSearchRankerLoggerImpl; class PluginInfoMessageFilter; +class ProcessMemoryMetricsEmitter; class UkmPageLoadMetricsObserver; class LocalNetworkRequestsPageLoadMetricsObserver; @@ -89,6 +90,7 @@ friend autofill::AutofillMetrics; friend payments::JourneyLogger; friend ContextualSearchRankerLoggerImpl; + friend ProcessMemoryMetricsEmitter; friend PluginInfoMessageFilter; friend UkmPageLoadMetricsObserver; friend LocalNetworkRequestsPageLoadMetricsObserver;
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index df6a60f..d9d6dbc 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -2781,6 +2781,524 @@ } ] }, + "Chromium Win 10 GCE Tests": { + "gtest_tests": [ + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "accessibility_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "app_shell_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "aura_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "base_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "battor_agent_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "boringssl_crypto_tests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "boringssl_ssl_tests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true, + "shards": 10 + }, + "test": "browser_tests" + }, + { + "args": [ + "--enable-browser-side-navigation" + ], + "name": "browser_side_navigation_browser_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "shards": 10 + }, + "test": "browser_tests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "cacheinvalidation_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "capture_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "cast_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "cc_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "chrome_app_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "chrome_elf_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "chromedriver_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "components_browsertests" + }, + { + "args": [ + "--enable-browser-side-navigation" + ], + "name": "browser_side_navigation_components_browsertests", + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "components_browsertests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "components_unittests" + }, + { + "args": [ + "--enable-browser-side-navigation" + ], + "name": "browser_side_navigation_components_unittests", + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "components_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "compositor_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "content_browsertests" + }, + { + "args": [ + "--enable-browser-side-navigation" + ], + "name": "browser_side_navigation_content_browsertests", + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "content_browsertests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "content_unittests" + }, + { + "args": [ + "--enable-browser-side-navigation" + ], + "name": "browser_side_navigation_content_unittests", + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "content_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "courgette_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "crypto_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "device_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "display_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "events_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "extensions_browsertests" + }, + { + "args": [ + "--enable-browser-side-navigation" + ], + "name": "browser_side_navigation_extensions_browsertests", + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "extensions_browsertests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "extensions_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "gcm_unit_tests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "gfx_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "gn_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "google_apis_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "gpu_ipc_service_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "gpu_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "headless_browsertests" + }, + { + "args": [ + "--enable-browser-side-navigation" + ], + "name": "browser_side_navigation_headless_browsertests", + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "headless_browsertests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "headless_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "install_static_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "installer_util_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "ipc_tests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "jingle_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "keyboard_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "latency_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "libjingle_xmpp_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "media_blink_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "media_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "message_center_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "midi_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "mojo_common_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "mojo_public_bindings_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "mojo_public_system_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "mojo_system_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "nacl_loader_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "native_theme_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "net_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "pdf_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "ppapi_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "printing_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "remoting_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "sbox_integration_tests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "sbox_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "sbox_validation_tests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "services_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "setup_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "skia_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "sql_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "storage_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "sync_integration_tests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "ui_base_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "ui_touch_selection_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "unit_tests" + }, + { + "args": [ + "--enable-browser-side-navigation" + ], + "name": "browser_side_navigation_unit_tests", + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "unit_tests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "url_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "views_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "wm_unittests" + } + ] + }, "ClangToTAndroid x64": { "gtest_tests": [ {
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG index 928eb277..d9455d02 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -9,15 +9,15 @@ crbug.com/591099 accessibility/adjacent-continuations-cause-assertion-failure.html [ Failure ] crbug.com/591099 accessibility/adopt-node-causes-crash.html [ Failure ] crbug.com/591099 accessibility/anonymous-render-block-in-continuation-causes-crash.html [ Crash Failure ] -crbug.com/591099 accessibility/aom-relation-properties.html [ Crash ] -crbug.com/591099 accessibility/aom-string-properties.html [ Crash ] -crbug.com/591099 accessibility/aom.html [ Crash ] -crbug.com/591099 accessibility/aria-activedescendant-events.html [ Crash ] -crbug.com/591099 accessibility/aria-activedescendant.html [ Crash ] +crbug.com/591099 accessibility/aom-relation-properties.html [ Crash Pass ] +crbug.com/591099 accessibility/aom-string-properties.html [ Crash Pass ] +crbug.com/591099 accessibility/aom.html [ Crash Pass ] +crbug.com/591099 accessibility/aria-activedescendant-events.html [ Crash Pass ] +crbug.com/591099 accessibility/aria-activedescendant.html [ Crash Failure ] crbug.com/591099 accessibility/aria-checkbox-checked-mixed.html [ Failure ] crbug.com/591099 accessibility/aria-checkbox-checked.html [ Failure ] crbug.com/591099 accessibility/aria-checkbox-sends-notification.html [ Failure ] -crbug.com/591099 accessibility/aria-combobox-activedescendant.html [ Crash ] +crbug.com/591099 accessibility/aria-combobox-activedescendant.html [ Crash Pass ] crbug.com/591099 accessibility/aria-controls-with-tabs.html [ Crash Failure ] crbug.com/591099 accessibility/aria-controls.html [ Crash Failure ] crbug.com/591099 accessibility/aria-describedby-on-input.html [ Crash Failure ] @@ -25,7 +25,7 @@ crbug.com/591099 accessibility/aria-fallback-roles.html [ Failure ] crbug.com/591099 accessibility/aria-flowto.html [ Failure ] crbug.com/591099 accessibility/aria-hidden-children-not-in-text-from-content.html [ Failure ] -crbug.com/591099 accessibility/aria-hidden-hides-all-elements.html [ Crash ] +crbug.com/591099 accessibility/aria-hidden-hides-all-elements.html [ Crash Failure ] crbug.com/591099 accessibility/aria-hidden-update.html [ Failure ] crbug.com/591099 accessibility/aria-hidden-updates-alldescendants.html [ Failure ] crbug.com/591099 accessibility/aria-hidden-with-elements.html [ Crash Failure ] @@ -51,18 +51,18 @@ crbug.com/591099 accessibility/aria-text-role.html [ Failure ] crbug.com/591099 accessibility/aria-toggle-button-with-title.html [ Failure ] crbug.com/591099 accessibility/aria-used-on-image-maps.html [ Failure ] -crbug.com/591099 accessibility/bounds-calc.html [ Crash ] +crbug.com/591099 accessibility/bounds-calc.html [ Crash Failure ] crbug.com/591099 accessibility/br-element-has-correct-title.html [ Failure ] crbug.com/591099 accessibility/button-title-uses-inner-img-alt.html [ Failure ] crbug.com/591099 accessibility/calling-accessibility-methods-with-pending-layout-causes-crash.html [ Failure ] crbug.com/591099 accessibility/canvas-accessibilitynodeobject.html [ Failure ] crbug.com/591099 accessibility/canvas-description-and-role.html [ Failure ] crbug.com/591099 accessibility/canvas-fallback-content-2.html [ Crash Timeout ] -crbug.com/591099 accessibility/canvas-fallback-content-labels.html [ Crash ] +crbug.com/591099 accessibility/canvas-fallback-content-labels.html [ Crash Failure ] crbug.com/591099 accessibility/canvas-fallback-content.html [ Failure ] crbug.com/591099 accessibility/chromium-only-roles.html [ Failure ] -crbug.com/591099 accessibility/click-event.html [ Crash ] -crbug.com/591099 accessibility/clickable.html [ Crash ] +crbug.com/591099 accessibility/click-event.html [ Crash Pass ] +crbug.com/591099 accessibility/clickable.html [ Crash Failure ] crbug.com/591099 accessibility/color-well.html [ Failure ] crbug.com/591099 accessibility/computed-name.html [ Crash Timeout ] crbug.com/591099 accessibility/computed-role.html [ Crash Timeout ] @@ -80,13 +80,13 @@ crbug.com/591099 accessibility/crashing-a-tag-in-map.html [ Failure ] crbug.com/591099 accessibility/css-generated-content.html [ Failure ] crbug.com/591099 accessibility/css-styles.html [ Crash Failure ] -crbug.com/591099 accessibility/description-calc-aria-describedby.html [ Crash ] -crbug.com/591099 accessibility/description-calc-inputs.html [ Crash ] -crbug.com/591099 accessibility/description-calc-native-markup-input-buttons.html [ Crash ] +crbug.com/591099 accessibility/description-calc-aria-describedby.html [ Crash Pass ] +crbug.com/591099 accessibility/description-calc-inputs.html [ Crash Pass ] +crbug.com/591099 accessibility/description-calc-native-markup-input-buttons.html [ Crash Pass ] crbug.com/591099 accessibility/dimensions-include-descendants.html [ Failure ] -crbug.com/591099 accessibility/disabled-controls-not-focusable.html [ Crash ] +crbug.com/591099 accessibility/disabled-controls-not-focusable.html [ Crash Failure ] crbug.com/591099 accessibility/display-inline-block-crash.html [ Failure ] -crbug.com/591099 accessibility/display-none-change.html [ Crash ] +crbug.com/591099 accessibility/display-none-change.html [ Crash Pass ] crbug.com/591099 accessibility/display-table-cell-causes-crash.html [ Failure ] crbug.com/591099 accessibility/div-within-anchors-causes-crash.html [ Failure ] crbug.com/591099 accessibility/dl-role.html [ Failure ] @@ -99,11 +99,11 @@ crbug.com/591099 accessibility/focusable-div.html [ Crash Failure ] crbug.com/591099 accessibility/hang-in-isignored.html [ Failure ] crbug.com/591099 accessibility/heading-level.html [ Failure ] -crbug.com/591099 accessibility/image-inside-link.html [ Crash ] +crbug.com/591099 accessibility/image-inside-link.html [ Crash Pass ] crbug.com/591099 accessibility/image-link-inline-cont.html [ Failure ] crbug.com/591099 accessibility/image-link.html [ Failure ] crbug.com/591099 accessibility/image-map-title-causes-crash.html [ Failure ] -crbug.com/591099 accessibility/image-map-update-parent-crash.html [ Crash ] +crbug.com/591099 accessibility/image-map-update-parent-crash.html [ Crash Failure ] crbug.com/591099 accessibility/image-map-with-indirect-area-crash.html [ Failure Pass ] crbug.com/591099 accessibility/image-map1.html [ Failure ] crbug.com/591099 accessibility/img-alt-tag-only-whitespace.html [ Failure ] @@ -119,63 +119,63 @@ crbug.com/591099 accessibility/inline-text-textarea.html [ Crash Failure ] crbug.com/591099 accessibility/inline-text-word-boundaries.html [ Failure ] crbug.com/591099 accessibility/inline-text-word-boundary-causes-crash.html [ Failure ] -crbug.com/591099 accessibility/input-aria-required.html [ Crash ] +crbug.com/591099 accessibility/input-aria-required.html [ Crash Failure ] crbug.com/591099 accessibility/input-file-causes-crash.html [ Crash Failure ] crbug.com/591099 accessibility/input-image-alt.html [ Failure ] -crbug.com/591099 accessibility/input-mixed.html [ Crash ] +crbug.com/591099 accessibility/input-mixed.html [ Crash Pass ] crbug.com/591099 accessibility/input-type-password-value-and-selection.html [ Crash Timeout ] crbug.com/591099 accessibility/input-type-range-aria-value.html [ Failure ] -crbug.com/591099 accessibility/input-type-range-value-change-event.html [ Crash ] +crbug.com/591099 accessibility/input-type-range-value-change-event.html [ Crash Pass ] crbug.com/591099 accessibility/input-type-range-value-change.html [ Failure ] crbug.com/591099 accessibility/input-type-text-caret-position.html [ Crash Failure ] crbug.com/591099 accessibility/input-type-text-selection.html [ Crash Failure Timeout ] -crbug.com/591099 accessibility/input-type-text-value-change-event.html [ Crash ] +crbug.com/591099 accessibility/input-type-text-value-change-event.html [ Crash Pass ] crbug.com/591099 accessibility/insert-selected-option-into-select-causes-crash.html [ Failure ] crbug.com/591099 accessibility/is-richly-editable.html [ Crash Failure ] crbug.com/591099 accessibility/label-element-press.html [ Failure ] crbug.com/591099 accessibility/label-for-control-hittest.html [ Failure ] crbug.com/591099 accessibility/language-attribute.html [ Failure ] crbug.com/591099 accessibility/legend.html [ Failure ] -crbug.com/591099 accessibility/line-for-index-endless-loop.html [ Crash ] +crbug.com/591099 accessibility/line-for-index-endless-loop.html [ Crash Pass ] crbug.com/591099 accessibility/link-inside-button-accessible-text.html [ Failure ] crbug.com/591099 accessibility/link-inside-label.html [ Failure ] crbug.com/591099 accessibility/listbox-enabled-states.html [ Failure ] -crbug.com/591099 accessibility/listbox-focus.html [ Crash ] +crbug.com/591099 accessibility/listbox-focus.html [ Crash Pass ] crbug.com/591099 accessibility/listitem-presentation-inherited.html [ Crash Failure ] crbug.com/591099 accessibility/main-element.html [ Failure ] crbug.com/591099 accessibility/media-controls.html [ Failure ] crbug.com/591099 accessibility/menu-item-crash.html [ Failure ] -crbug.com/591099 accessibility/menu-list-open.html [ Crash ] -crbug.com/591099 accessibility/menu-list-optgroup.html [ Crash ] +crbug.com/591099 accessibility/menu-list-open.html [ Crash Pass ] +crbug.com/591099 accessibility/menu-list-optgroup.html [ Crash Pass ] crbug.com/591099 accessibility/menu-list-popup-reuses-objects.html [ Failure ] crbug.com/591099 accessibility/menu-list-selection-changed.html [ Failure ] crbug.com/591099 accessibility/menu-list-sends-change-notification.html [ Failure ] crbug.com/591099 accessibility/meter-value.html [ Failure ] crbug.com/591099 accessibility/misspellings.html [ Timeout ] crbug.com/591099 accessibility/multiselect-list-reports-active-option.html [ Failure ] -crbug.com/591099 accessibility/name-calc-aria-label.html [ Crash ] -crbug.com/591099 accessibility/name-calc-aria-labelledby.html [ Crash ] -crbug.com/591099 accessibility/name-calc-aria-owns.html [ Crash ] -crbug.com/591099 accessibility/name-calc-figure.html [ Crash ] -crbug.com/591099 accessibility/name-calc-img.html [ Crash ] -crbug.com/591099 accessibility/name-calc-inputs.html [ Crash ] -crbug.com/591099 accessibility/name-calc-native-markup-buttons.html [ Crash ] -crbug.com/591099 accessibility/name-calc-native-markup-input-buttons.html [ Crash ] -crbug.com/591099 accessibility/name-calc-presentational.html [ Crash ] -crbug.com/591099 accessibility/name-calc-svg.html [ Crash ] -crbug.com/591099 accessibility/name-calc-visibility.html [ Crash ] +crbug.com/591099 accessibility/name-calc-aria-label.html [ Crash Pass ] +crbug.com/591099 accessibility/name-calc-aria-labelledby.html [ Crash Pass ] +crbug.com/591099 accessibility/name-calc-aria-owns.html [ Crash Pass ] +crbug.com/591099 accessibility/name-calc-figure.html [ Crash Pass ] +crbug.com/591099 accessibility/name-calc-img.html [ Crash Failure ] +crbug.com/591099 accessibility/name-calc-inputs.html [ Crash Pass ] +crbug.com/591099 accessibility/name-calc-native-markup-buttons.html [ Crash Pass ] +crbug.com/591099 accessibility/name-calc-native-markup-input-buttons.html [ Crash Pass ] +crbug.com/591099 accessibility/name-calc-presentational.html [ Crash Pass ] +crbug.com/591099 accessibility/name-calc-svg.html [ Crash Pass ] +crbug.com/591099 accessibility/name-calc-visibility.html [ Crash Pass ] crbug.com/591099 accessibility/nested-layout-crash.html [ Crash Failure ] crbug.com/591099 accessibility/non-native-image-crash.html [ Failure ] crbug.com/591099 accessibility/not-ignore-landmark-roles.html [ Failure ] crbug.com/591099 accessibility/notification-listeners.html [ Failure ] -crbug.com/591099 accessibility/option-aria-checked.html [ Crash ] -crbug.com/591099 accessibility/other-aria-attribute-change-sends-notification.html [ Crash ] +crbug.com/591099 accessibility/option-aria-checked.html [ Crash Pass ] +crbug.com/591099 accessibility/other-aria-attribute-change-sends-notification.html [ Crash Failure ] crbug.com/591099 accessibility/platform-name.html [ Failure ] crbug.com/591099 accessibility/presentation-owned-elements.html [ Crash Failure ] crbug.com/591099 accessibility/presentational-elements-with-focus.html [ Crash Failure ] -crbug.com/591099 accessibility/presentational-leaf.html [ Crash ] +crbug.com/591099 accessibility/presentational-leaf.html [ Crash Pass ] crbug.com/591099 accessibility/press-works-on-control-types.html [ Failure ] -crbug.com/591099 accessibility/press-works-on-text-fields.html [ Crash ] +crbug.com/591099 accessibility/press-works-on-text-fields.html [ Crash Pass ] crbug.com/591099 accessibility/radio-button-title-label.html [ Failure ] crbug.com/591099 accessibility/readonly.html [ Crash Failure ] crbug.com/591099 accessibility/removed-anonymous-block-child-causes-crash.html [ Failure ] @@ -200,7 +200,7 @@ crbug.com/591099 accessibility/selection-change-notification-textarea.html [ Crash Failure ] crbug.com/591099 accessibility/selection-states.html [ Failure ] crbug.com/591099 accessibility/set-selection-whitespace.html [ Failure ] -crbug.com/591099 accessibility/spin-button-detach.html [ Crash ] +crbug.com/591099 accessibility/spin-button-detach.html [ Crash Failure ] crbug.com/591099 accessibility/spinbutton-value.html [ Failure ] crbug.com/591099 accessibility/svg-bounds.html [ Failure ] crbug.com/591099 accessibility/svg-image.html [ Crash Failure ] @@ -218,12 +218,12 @@ crbug.com/591099 accessibility/table-row-with-aria-role.html [ Failure ] crbug.com/591099 accessibility/table-with-empty-thead-causes-crash.html [ Failure ] crbug.com/591099 accessibility/table-with-hidden-head-section.html [ Failure ] -crbug.com/591099 accessibility/text-change-notification.html [ Crash ] +crbug.com/591099 accessibility/text-change-notification.html [ Crash Failure ] crbug.com/591099 accessibility/textarea-caret-position.html [ Crash Timeout ] crbug.com/591099 accessibility/textarea-line-for-index.html [ Crash Failure ] crbug.com/591099 accessibility/textarea-selection.html [ Crash Failure ] crbug.com/591099 accessibility/textbox-role-on-contenteditable-crash.html [ Failure ] -crbug.com/591099 accessibility/title-ui-element-correctness.html [ Crash ] +crbug.com/591099 accessibility/title-ui-element-correctness.html [ Crash Failure ] crbug.com/591099 accessibility/updating-attribute-in-table-causes-crash.html [ Failure ] crbug.com/591099 accessibility/whitespace-in-name-calc.html [ Crash Failure Pass ] crbug.com/591099 animations/3d/change-transform-in-end-event.html [ Failure Pass ] @@ -231,103 +231,103 @@ crbug.com/591099 animations/animation-css-rule-types.html [ Failure ] crbug.com/591099 animations/animation-events-create.html [ Failure ] crbug.com/591099 animations/animations-parsing.html [ Timeout ] -crbug.com/591099 animations/animations-responsive-to-color-change.html [ Crash ] -crbug.com/591099 animations/clear-svg-animation-effects.html [ Crash ] -crbug.com/591099 animations/composition/background-position-composition.html [ Crash ] -crbug.com/591099 animations/composition/caret-color-composition.html [ Crash ] -crbug.com/591099 animations/composition/stroke-dasharray-composition.html [ Crash ] +crbug.com/591099 animations/animations-responsive-to-color-change.html [ Crash Pass ] +crbug.com/591099 animations/clear-svg-animation-effects.html [ Crash Pass ] +crbug.com/591099 animations/composition/background-position-composition.html [ Crash Pass ] +crbug.com/591099 animations/composition/caret-color-composition.html [ Crash Pass ] +crbug.com/591099 animations/composition/stroke-dasharray-composition.html [ Crash Pass ] crbug.com/591099 animations/computed-style.html [ Failure ] -crbug.com/591099 animations/css-animation-overrides-svg-presentation-attribute-animation.html [ Crash ] +crbug.com/591099 animations/css-animation-overrides-svg-presentation-attribute-animation.html [ Crash Pass ] crbug.com/591099 animations/delay-start-event.html [ Failure ] -crbug.com/591099 animations/display-change-does-not-terminate-animation.html [ Crash ] +crbug.com/591099 animations/display-change-does-not-terminate-animation.html [ Crash Failure ] crbug.com/591099 animations/display-inline-style-adjust.html [ Failure ] crbug.com/591099 animations/display-none-cancel-computedstyle.html [ Failure ] crbug.com/591099 animations/display-none-terminates-animation.html [ Failure ] crbug.com/591099 animations/inline-element-animation-end-hit-test.html [ Failure ] -crbug.com/591099 animations/interpolation/backdrop-filter-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/background-color-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/background-image-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/background-position-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/background-position-origin-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/background-size-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/border-color-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/border-image-outset-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/border-image-slice-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/border-image-source-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/border-image-width-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/border-radius-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/border-spacing-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/border-width-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/bottom-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/box-shadow-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/calc-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/caret-color-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/clip-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/color-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/filter-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/font-size-adjust-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/font-size-interpolation-unset.html [ Crash ] -crbug.com/591099 animations/interpolation/font-size-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/font-size-zoom-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/font-weight-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/height-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/line-height-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/margin-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/max-height-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/min-height-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/object-position-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/offset-rotate-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/opacity-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/outline-color-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/outline-offset-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/outline-width-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/padding-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/perspective-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/perspective-origin-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/position-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/sample-interpolation-test.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-baseline-shift-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-cx-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-cy-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-d-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-fill-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-fill-opacity-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-flood-color-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-flood-opacity-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-lighting-color-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-r-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-rx-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-ry-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-stop-color-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-stop-opacity-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-stroke-dasharray-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-stroke-dashoffset-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-stroke-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-stroke-miterlimit-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-stroke-opacity-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/svg-stroke-width-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/text-decoration-color-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/text-shadow-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/top-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/transform-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/transform-origin-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/vertical-align-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/viewport-unit-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-background-size-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-clip-path-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-column-rule-color-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-mask-box-image-outset-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-mask-box-image-slice-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-mask-box-image-source-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-mask-box-image-width-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-mask-image-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-mask-position-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-mask-size-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-perspective-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-perspective-origin-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-text-stroke-color-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-transform-interpolation.html [ Crash ] -crbug.com/591099 animations/interpolation/webkit-transform-origin-interpolation.html [ Crash ] +crbug.com/591099 animations/interpolation/backdrop-filter-interpolation.html [ Crash Timeout ] +crbug.com/591099 animations/interpolation/background-color-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/background-image-interpolation.html [ Crash Timeout ] +crbug.com/591099 animations/interpolation/background-position-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/background-position-origin-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/background-size-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/border-color-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/border-image-outset-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/border-image-slice-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/border-image-source-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/border-image-width-interpolation.html [ Crash Timeout ] +crbug.com/591099 animations/interpolation/border-radius-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/border-spacing-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/border-width-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/bottom-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/box-shadow-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/calc-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/caret-color-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/clip-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/color-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/filter-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/font-size-adjust-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/font-size-interpolation-unset.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/font-size-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/font-size-zoom-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/font-weight-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/height-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/line-height-interpolation.html [ Crash Timeout ] +crbug.com/591099 animations/interpolation/margin-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/max-height-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/min-height-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/object-position-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/offset-rotate-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/opacity-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/outline-color-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/outline-offset-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/outline-width-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/padding-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/perspective-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/perspective-origin-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/position-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/sample-interpolation-test.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-baseline-shift-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-cx-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-cy-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-d-interpolation.html [ Crash Timeout ] +crbug.com/591099 animations/interpolation/svg-fill-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-fill-opacity-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-flood-color-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-flood-opacity-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-lighting-color-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-r-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-rx-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-ry-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-stop-color-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-stop-opacity-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-stroke-dasharray-interpolation.html [ Crash Timeout ] +crbug.com/591099 animations/interpolation/svg-stroke-dashoffset-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-stroke-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-stroke-miterlimit-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-stroke-opacity-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/svg-stroke-width-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/text-decoration-color-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/text-shadow-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/top-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/transform-interpolation.html [ Crash Timeout ] +crbug.com/591099 animations/interpolation/transform-origin-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/vertical-align-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/viewport-unit-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/webkit-background-size-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/webkit-clip-path-interpolation.html [ Crash Timeout ] +crbug.com/591099 animations/interpolation/webkit-column-rule-color-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/webkit-mask-box-image-outset-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/webkit-mask-box-image-slice-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/webkit-mask-box-image-source-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/webkit-mask-box-image-width-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/webkit-mask-image-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/webkit-mask-position-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/webkit-mask-size-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/webkit-perspective-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/webkit-perspective-origin-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/webkit-text-stroke-color-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/interpolation/webkit-transform-interpolation.html [ Crash Timeout ] +crbug.com/591099 animations/interpolation/webkit-transform-origin-interpolation.html [ Crash Pass ] crbug.com/591099 animations/keyframes-rule.html [ Failure ] crbug.com/591099 animations/lazy-detached-animation-stop.html [ Failure ] crbug.com/591099 animations/negative-delay-events.html [ Failure ] @@ -336,7 +336,7 @@ crbug.com/591099 animations/prefixed/animation-inherit-initial-unprefixed.html [ Failure ] crbug.com/591099 animations/prefixed/keyframes-cssom-prefixed-02.html [ Failure ] crbug.com/591099 animations/prefixed/keyframes-cssom-unprefixed-02.html [ Failure ] -crbug.com/591099 animations/responsive/d-responsive.html [ Crash ] +crbug.com/591099 animations/responsive/d-responsive.html [ Crash Pass ] crbug.com/591099 animations/responsive/line-height-responsive.html [ Pass Timeout ] crbug.com/591099 animations/rotate-transform-equivalent.html [ Failure ] crbug.com/591099 animations/skew-notsequential-compositor.html [ Failure ] @@ -344,171 +344,171 @@ crbug.com/591099 animations/stability/animation-iteration-event-destroy-renderer.html [ Failure ] crbug.com/591099 animations/stability/animation-on-inline-crash.html [ Failure ] crbug.com/591099 animations/stability/animation-start-event-destroy-renderer.html [ Failure ] -crbug.com/591099 animations/stability/base-render-style-crash.html [ Crash ] -crbug.com/591099 animations/stability/checkbox-padding-animation-crash.html [ Crash ] +crbug.com/591099 animations/stability/base-render-style-crash.html [ Crash Pass ] +crbug.com/591099 animations/stability/checkbox-padding-animation-crash.html [ Crash Pass ] crbug.com/591099 animations/stability/element-animate-float-crash.html [ Failure Pass ] crbug.com/591099 animations/stability/empty-keyframe-animation-composited.html [ Failure ] crbug.com/591099 animations/stability/empty-keyframes-composited.html [ Failure ] crbug.com/591099 animations/stability/empty-keyframes.html [ Failure ] crbug.com/591099 animations/stability/import-crash.html [ Failure ] crbug.com/591099 animations/stability/length-zero-percent-crash.html [ Failure Pass ] -crbug.com/591099 animations/stability/option-element-crash.html [ Crash ] -crbug.com/591099 animations/stability/option-opacity-inherit-crash.html [ Crash ] +crbug.com/591099 animations/stability/option-element-crash.html [ Crash Pass ] +crbug.com/591099 animations/stability/option-opacity-inherit-crash.html [ Crash Pass ] crbug.com/591099 animations/stability/pause-crash.html [ Failure ] -crbug.com/591099 animations/stability/svg-element-css-animation-crash.html [ Crash ] -crbug.com/591099 animations/stability/svg-length-unittype-crash.html [ Crash ] +crbug.com/591099 animations/stability/svg-element-css-animation-crash.html [ Crash Pass ] +crbug.com/591099 animations/stability/svg-length-unittype-crash.html [ Crash Pass ] crbug.com/591099 animations/stability/zero-duration-infinite-iterations.html [ Failure ] crbug.com/591099 animations/stability/zero-duration-large-start-delay.html [ Failure ] crbug.com/591099 animations/state-at-end-event.html [ Failure Pass ] -crbug.com/591099 animations/svg-attribute-composition/svg-amplitude-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-azimuth-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-baseFrequency-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-bias-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-cx-cy-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-d-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-diffuseConstant-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-divisor-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-dx-dy-length-list-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-dx-dy-number-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-elevation-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-exponent-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-fx-fy-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-gradientTransform-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-height-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-intercept-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-k1-k2-k3-k4-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-kernelMatrix-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-kernelUnitLength-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-limitingConeAngle-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-markerHeight-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-markerWidth-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-mode-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-numOctaves-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-offset-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-order-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-orient-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-pathLength-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-patternTransform-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-points-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-pointsAtX-pointsAtY-pointsAtZ-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-r-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-radius-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-refX-refY-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-rotate-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-rx-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-scale-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-seed-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-slope-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-specularConstant-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-specularExponent-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-startOffset-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-stdDeviation-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-surfaceScale-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-tableValues-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-targetX-targetY-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-textLength-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-transform-composition-distinct.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-transform-composition-list.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-transform-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-transform-matrix.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-values-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-viewBox-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-width-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-x-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-x-list-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-x1-x2-y1-y2-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-y-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-y-list-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-composition/svg-z-composition.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-amplitude-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-azimuth-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-baseFrequency-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-bias-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-calc-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-class-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-clipPathUnits-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-cx-cy-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-d-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-diffuseConstant-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-divisor-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-dx-dy-length-list-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-dx-dy-number-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-edgeMode-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-elevation-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-exponent-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-filterUnits-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-fx-fy-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-gradientTransform-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-gradientUnits-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-height-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-href-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-in-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-intercept-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-k1-k2-k3-k4-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-kernelMatrix-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-kernelUnitLength-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-lengthAdjust-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-limitingConeAngle-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-markerHeight-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-markerUnits-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-markerWidth-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-maskContentUnits-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-maskUnits-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-method-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-mode-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-numOctaves-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-offset-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-operator-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-order-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-orient-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-pathLength-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-patternContentUnits-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-patternTransform-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-patternUnits-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-points-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-pointsAtX-pointsAtY-pointsAtZ-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-preserveAlpha-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-preserveAspectRatio-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-primitiveUnits-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-r-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-radius-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-refX-refY-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-result-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-rotate-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-rx-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-scale-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-seed-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-slope-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-spacing-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-specularConstant-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-specularExponent-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-spreadMethod-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-startOffset-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-stdDeviation-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-stitchTiles-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-surfaceScale-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-tableValues-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-target-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-targetX-targetY-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-textLength-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-transform-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-type-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-values-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-viewBox-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-width-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-x-list-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-x-y-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-x1-x2-y1-y2-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-xChannelSelector-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-y-list-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-interpolation/svg-z-interpolation.html [ Crash ] -crbug.com/591099 animations/svg-attribute-responsive/svg-d-responsive.html [ Crash ] -crbug.com/591099 animations/svg-attribute-responsive/svg-points-responsive.html [ Crash ] -crbug.com/591099 animations/svg-attribute-responsive/svg-tableValues-responsive.html [ Crash ] -crbug.com/591099 animations/svg-attribute-responsive/svg-transform-responsive.html [ Crash ] -crbug.com/591099 animations/svg-attribute-responsive/svg-x-list-responsive.html [ Crash ] -crbug.com/591099 animations/svg-presentation-attribute-animation.html [ Crash ] -crbug.com/591099 animations/svg-responsive-to-timing-updates.html [ Crash ] +crbug.com/591099 animations/svg-attribute-composition/svg-amplitude-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-azimuth-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-baseFrequency-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-bias-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-cx-cy-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-d-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-diffuseConstant-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-divisor-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-dx-dy-length-list-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-dx-dy-number-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-elevation-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-exponent-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-fx-fy-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-gradientTransform-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-height-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-intercept-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-k1-k2-k3-k4-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-kernelMatrix-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-kernelUnitLength-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-limitingConeAngle-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-markerHeight-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-markerWidth-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-mode-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-numOctaves-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-offset-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-order-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-orient-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-pathLength-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-patternTransform-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-points-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-pointsAtX-pointsAtY-pointsAtZ-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-r-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-radius-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-refX-refY-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-rotate-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-rx-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-scale-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-seed-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-slope-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-specularConstant-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-specularExponent-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-startOffset-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-stdDeviation-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-surfaceScale-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-tableValues-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-targetX-targetY-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-textLength-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-transform-composition-distinct.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-transform-composition-list.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-transform-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-transform-matrix.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-values-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-viewBox-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-width-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-x-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-x-list-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-x1-x2-y1-y2-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-y-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-y-list-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-composition/svg-z-composition.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-amplitude-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-azimuth-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-baseFrequency-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-bias-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-calc-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-class-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-clipPathUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-cx-cy-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-d-interpolation.html [ Crash Timeout ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-diffuseConstant-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-divisor-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-dx-dy-length-list-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-dx-dy-number-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-edgeMode-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-elevation-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-exponent-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-filterUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-fx-fy-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-gradientTransform-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-gradientUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-height-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-href-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-in-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-intercept-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-k1-k2-k3-k4-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-kernelMatrix-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-kernelUnitLength-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-lengthAdjust-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-limitingConeAngle-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-markerHeight-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-markerUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-markerWidth-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-maskContentUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-maskUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-method-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-mode-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-numOctaves-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-offset-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-operator-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-order-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-orient-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-pathLength-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-patternContentUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-patternTransform-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-patternUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-points-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-pointsAtX-pointsAtY-pointsAtZ-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-preserveAlpha-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-preserveAspectRatio-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-primitiveUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-r-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-radius-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-refX-refY-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-result-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-rotate-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-rx-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-scale-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-seed-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-slope-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-spacing-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-specularConstant-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-specularExponent-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-spreadMethod-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-startOffset-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-stdDeviation-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-stitchTiles-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-surfaceScale-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-tableValues-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-target-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-targetX-targetY-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-textLength-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-transform-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-type-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-values-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-viewBox-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-width-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-x-list-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-x-y-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-x1-x2-y1-y2-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-xChannelSelector-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-y-list-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-interpolation/svg-z-interpolation.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-responsive/svg-d-responsive.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-responsive/svg-points-responsive.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-responsive/svg-tableValues-responsive.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-responsive/svg-transform-responsive.html [ Crash Pass ] +crbug.com/591099 animations/svg-attribute-responsive/svg-x-list-responsive.html [ Crash Pass ] +crbug.com/591099 animations/svg-presentation-attribute-animation.html [ Crash Pass ] +crbug.com/591099 animations/svg-responsive-to-timing-updates.html [ Crash Pass ] crbug.com/591099 animations/timing-model.html [ Pass Timeout ] crbug.com/591099 battery-status/api-defined.html [ Failure ] crbug.com/591099 battery-status/detached-no-crash.html [ Failure ] @@ -517,14 +517,14 @@ crbug.com/591099 battery-status/multiple-windows-page-visibility.html [ Failure ] crbug.com/591099 battery-status/multiple-windows.html [ Failure ] crbug.com/591099 battery-status/no-gc-with-eventlisteners.html [ Failure ] -crbug.com/591099 battery-status/no-leak-on-detached-use.html [ Crash ] +crbug.com/591099 battery-status/no-leak-on-detached-use.html [ Crash Failure ] crbug.com/591099 battery-status/page-visibility.html [ Failure ] crbug.com/591099 battery-status/promise-with-eventlisteners.html [ Failure ] crbug.com/591099 battery-status/restricted-level-precision.html [ Failure ] crbug.com/591099 bindings/blink-in-js-asan-crash.html [ Failure ] -crbug.com/591099 bindings/location-lifetime.html [ Crash ] -crbug.com/591099 bluetooth/requestDevice/request-from-iframe.html [ Crash ] -crbug.com/591099 bluetooth/server/getPrimaryService/two-iframes-from-same-origin.html [ Crash ] +crbug.com/591099 bindings/location-lifetime.html [ Crash Pass ] +crbug.com/591099 bluetooth/requestDevice/request-from-iframe.html [ Crash Pass ] +crbug.com/591099 bluetooth/server/getPrimaryService/two-iframes-from-same-origin.html [ Crash Pass ] crbug.com/591099 compositing/absolute-inside-out-of-view-fixed.html [ Failure Pass ] crbug.com/591099 compositing/animation/busy-indicator.html [ Failure ] crbug.com/591099 compositing/animation/hidden-composited.html [ Failure ] @@ -562,7 +562,7 @@ crbug.com/591099 compositing/generated-content.html [ Failure Pass ] crbug.com/591099 compositing/geometry/abs-position-inside-opacity.html [ Failure ] crbug.com/591099 compositing/geometry/ancestor-overflow-change.html [ Failure ] -crbug.com/591099 compositing/geometry/assert-marquee-timer.html [ Crash ] +crbug.com/591099 compositing/geometry/assert-marquee-timer.html [ Crash Pass ] crbug.com/591099 compositing/geometry/bounds-clipped-composited-child.html [ Failure ] crbug.com/591099 compositing/geometry/bounds-ignores-hidden-composited-descendant.html [ Failure ] crbug.com/591099 compositing/geometry/bounds-ignores-hidden-dynamic-negzindex.html [ Failure ] @@ -614,10 +614,10 @@ crbug.com/591099 compositing/gestures/gesture-tapHighlight-2-iframe.html [ Failure ] crbug.com/591099 compositing/gestures/gesture-tapHighlight-img-and-text-2.html [ Failure ] crbug.com/591099 compositing/gestures/gesture-tapHighlight-img-transformed.html [ Failure ] -crbug.com/591099 compositing/gestures/gesture-tapHighlight-img.html [ Failure ] +crbug.com/591099 compositing/gestures/gesture-tapHighlight-img.html [ Failure Pass ] crbug.com/591099 compositing/gestures/gesture-tapHighlight-overflowing-text-crash.html [ Failure ] crbug.com/591099 compositing/gestures/gesture-tapHighlight-pixel-rotated-link.html [ Failure ] -crbug.com/591099 compositing/gestures/gesture-tapHighlight-shadow-tree.html [ Failure ] +crbug.com/591099 compositing/gestures/gesture-tapHighlight-shadow-tree.html [ Failure Pass ] crbug.com/591099 compositing/gestures/gesture-tapHighlight-with-box-shadow.html [ Failure ] crbug.com/591099 compositing/iframes/become-composited-nested-iframes.html [ Failure ] crbug.com/591099 compositing/iframes/become-overlapped-iframe.html [ Failure ] @@ -631,14 +631,14 @@ crbug.com/591099 compositing/iframes/enter-compositing-iframe.html [ Failure ] crbug.com/591099 compositing/iframes/floating-self-painting-frame-complex.html [ Failure ] crbug.com/591099 compositing/iframes/floating-self-painting-frame.html [ Failure ] -crbug.com/591099 compositing/iframes/iframe-composited-scrolling-hide-and-show.html [ Crash ] +crbug.com/591099 compositing/iframes/iframe-composited-scrolling-hide-and-show.html [ Crash Failure ] crbug.com/591099 compositing/iframes/iframe-content-flipping.html [ Failure ] crbug.com/591099 compositing/iframes/iframe-copy-on-scroll.html [ Failure ] crbug.com/591099 compositing/iframes/iframe-in-composited-layer.html [ Failure ] crbug.com/591099 compositing/iframes/iframe-resize.html [ Failure ] crbug.com/591099 compositing/iframes/iframe-size-from-zero.html [ Failure ] crbug.com/591099 compositing/iframes/invisible-iframe.html [ Failure ] -crbug.com/591099 compositing/iframes/invisible-nested-iframe-hide.html [ Crash ] +crbug.com/591099 compositing/iframes/invisible-nested-iframe-hide.html [ Crash Failure ] crbug.com/591099 compositing/iframes/invisible-nested-iframe-show.html [ Failure ] crbug.com/591099 compositing/iframes/invisible-nested-iframe.html [ Failure ] crbug.com/591099 compositing/iframes/layout-on-compositing-change.html [ Failure ] @@ -646,7 +646,7 @@ crbug.com/591099 compositing/iframes/overlapped-iframe-iframe.html [ Failure ] crbug.com/591099 compositing/iframes/overlapped-iframe.html [ Failure ] crbug.com/591099 compositing/iframes/overlapped-nested-iframes.html [ Failure ] -crbug.com/591099 compositing/iframes/remove-iframe-crash.html [ Crash ] +crbug.com/591099 compositing/iframes/remove-iframe-crash.html [ Crash Pass ] crbug.com/591099 compositing/iframes/resizer.html [ Failure ] crbug.com/591099 compositing/iframes/scrolling-iframe.html [ Failure ] crbug.com/591099 compositing/images/content-image.html [ Failure ] @@ -1678,16 +1678,16 @@ crbug.com/591099 css3/blending/effect-background-blend-mode-stacking.html [ Failure ] crbug.com/591099 css3/blending/effect-background-blend-mode-tiled.html [ Failure ] crbug.com/591099 css3/blending/effect-background-blend-mode.html [ Failure ] -crbug.com/591099 css3/blending/mix-blend-mode-2nd-stacking-context-composited.html [ Crash ] +crbug.com/591099 css3/blending/mix-blend-mode-2nd-stacking-context-composited.html [ Crash Failure ] crbug.com/591099 css3/blending/mix-blend-mode-composited-layers.html [ Failure Pass ] -crbug.com/591099 css3/blending/mix-blend-mode-composited-reason-children.html [ Crash ] +crbug.com/591099 css3/blending/mix-blend-mode-composited-reason-children.html [ Crash Failure ] crbug.com/591099 css3/blending/mix-blend-mode-has-ancestor-clipping-layer.html [ Failure ] crbug.com/591099 css3/blending/mix-blend-mode-isolated-group-1.html [ Failure ] crbug.com/591099 css3/blending/mix-blend-mode-isolated-group-2.html [ Failure ] crbug.com/591099 css3/blending/mix-blend-mode-isolated-group-3.html [ Failure ] -crbug.com/591099 css3/blending/mix-blend-mode-isolation-2-stacking-contexts.html [ Crash ] -crbug.com/591099 css3/blending/mix-blend-mode-isolation-layer.html [ Crash ] -crbug.com/591099 css3/blending/mix-blend-mode-isolation-remove.html [ Crash ] +crbug.com/591099 css3/blending/mix-blend-mode-isolation-2-stacking-contexts.html [ Crash Failure ] +crbug.com/591099 css3/blending/mix-blend-mode-isolation-layer.html [ Crash Failure ] +crbug.com/591099 css3/blending/mix-blend-mode-isolation-remove.html [ Crash Failure ] crbug.com/591099 css3/blending/mix-blend-mode-simple-text.html [ Failure ] crbug.com/591099 css3/blending/mix-blend-mode-simple.html [ Failure ] crbug.com/591099 css3/blending/mix-blend-mode-with-masking.html [ Failure Pass ] @@ -1709,7 +1709,7 @@ crbug.com/591099 css3/calc/lexer-regression-57581-3.html [ Failure ] crbug.com/591099 css3/calc/lexer-regression-57581.html [ Failure ] crbug.com/591099 css3/calc/line-height.html [ Failure ] -crbug.com/591099 css3/calc/margin.html [ Crash ] +crbug.com/591099 css3/calc/margin.html [ Crash Failure ] crbug.com/591099 css3/calc/padding.html [ Failure ] crbug.com/591099 css3/calc/reflection-computed-style.html [ Failure ] crbug.com/591099 css3/calc/regression-62276.html [ Failure ] @@ -1725,11 +1725,11 @@ crbug.com/591099 css3/css3-modsel-37.html [ Failure Pass ] crbug.com/591099 css3/escape-dom-api.html [ Failure ] crbug.com/591099 css3/filters/add-filter-rendering.html [ Failure ] -crbug.com/591099 css3/filters/adopt-inline-style.html [ Crash ] +crbug.com/591099 css3/filters/adopt-inline-style.html [ Crash Pass ] crbug.com/591099 css3/filters/blur-filter-page-scroll-parents.html [ Failure Pass ] crbug.com/591099 css3/filters/blur-filter-page-scroll-self.html [ Failure Pass ] crbug.com/591099 css3/filters/blur-filter-page-scroll.html [ Failure Pass ] -crbug.com/591099 css3/filters/composited-during-animation.html [ Crash ] +crbug.com/591099 css3/filters/composited-during-animation.html [ Crash Pass ] crbug.com/591099 css3/filters/composited-during-transition-layertree.html [ Failure ] crbug.com/591099 css3/filters/composited-layer-bounds-after-sw-blur-animation.html [ Failure Pass ] crbug.com/591099 css3/filters/composited-layer-bounds-with-composited-blur.html [ Failure Pass ] @@ -1759,7 +1759,7 @@ crbug.com/591099 css3/filters/effect-opacity.html [ Failure ] crbug.com/591099 css3/filters/effect-reference-add-hw.html [ Failure ] crbug.com/591099 css3/filters/effect-reference-delete-crash.html [ Failure ] -crbug.com/591099 css3/filters/effect-reference-delete.html [ Crash ] +crbug.com/591099 css3/filters/effect-reference-delete.html [ Crash Pass ] crbug.com/591099 css3/filters/effect-reference-reset-style-delete-crash.html [ Failure ] crbug.com/591099 css3/filters/effect-reference-source-alpha-hw.html [ Failure ] crbug.com/591099 css3/filters/effect-reference-subregion-hidpi-hw.html [ Failure ] @@ -1771,14 +1771,14 @@ crbug.com/591099 css3/filters/effect-saturate.html [ Failure ] crbug.com/591099 css3/filters/effect-sepia-hw.html [ Failure ] crbug.com/591099 css3/filters/effect-sepia.html [ Failure ] -crbug.com/591099 css3/filters/filter-animation-from-none-hw.html [ Crash ] -crbug.com/591099 css3/filters/filter-animation-from-none-multi-hw.html [ Crash ] -crbug.com/591099 css3/filters/filter-animation-from-none-multi.html [ Crash ] -crbug.com/591099 css3/filters/filter-animation-from-none.html [ Crash ] -crbug.com/591099 css3/filters/filter-animation-hw.html [ Crash ] -crbug.com/591099 css3/filters/filter-animation-multi-hw.html [ Crash ] -crbug.com/591099 css3/filters/filter-animation-multi.html [ Crash ] -crbug.com/591099 css3/filters/filter-animation.html [ Crash ] +crbug.com/591099 css3/filters/filter-animation-from-none-hw.html [ Crash Pass ] +crbug.com/591099 css3/filters/filter-animation-from-none-multi-hw.html [ Crash Pass ] +crbug.com/591099 css3/filters/filter-animation-from-none-multi.html [ Crash Pass ] +crbug.com/591099 css3/filters/filter-animation-from-none.html [ Crash Pass ] +crbug.com/591099 css3/filters/filter-animation-hw.html [ Crash Pass ] +crbug.com/591099 css3/filters/filter-animation-multi-hw.html [ Crash Pass ] +crbug.com/591099 css3/filters/filter-animation-multi.html [ Crash Pass ] +crbug.com/591099 css3/filters/filter-animation.html [ Crash Pass ] crbug.com/591099 css3/filters/filter-change-repaint-composited.html [ Failure ] crbug.com/591099 css3/filters/filter-repaint-shadow-clipped.html [ Failure ] crbug.com/591099 css3/filters/filter-repaint-shadow-rotated.html [ Failure ] @@ -1787,7 +1787,7 @@ crbug.com/591099 css3/filters/filtered-inline.html [ Failure ] crbug.com/591099 css3/filters/huge-region-composited.html [ Failure ] crbug.com/591099 css3/filters/huge-region.html [ Failure ] -crbug.com/591099 css3/filters/multiple-references-id-mutate-crash-2.html [ Crash ] +crbug.com/591099 css3/filters/multiple-references-id-mutate-crash-2.html [ Crash Pass ] crbug.com/591099 css3/filters/nested-filter.html [ Crash Failure ] crbug.com/591099 css3/filters/offscreen-filters-memory-usage.html [ Failure ] crbug.com/591099 css3/filters/regions-expanding.html [ Crash Failure ] @@ -1795,14 +1795,14 @@ crbug.com/591099 css3/filters/simple-filter-rendering.html [ Failure ] crbug.com/591099 css3/flexbox/alignContent-applies-with-flexWrap-wrap-with-single-line.html [ Failure ] crbug.com/591099 css3/flexbox/assert-generated-new-flexbox.html [ Failure ] -crbug.com/591099 css3/flexbox/box-orient-button.html [ Crash ] +crbug.com/591099 css3/flexbox/box-orient-button.html [ Crash Pass ] crbug.com/591099 css3/flexbox/bug527039.html [ Failure ] -crbug.com/591099 css3/flexbox/bug633212.html [ Crash ] +crbug.com/591099 css3/flexbox/bug633212.html [ Crash Pass ] crbug.com/591099 css3/flexbox/button.html [ Failure ] crbug.com/591099 css3/flexbox/child-overflow.html [ Failure Pass ] crbug.com/591099 css3/flexbox/crash-removing-out-of-flow-child.html [ Failure ] crbug.com/591099 css3/flexbox/css-properties.html [ Failure ] -crbug.com/591099 css3/flexbox/display-flexbox-set-get.html [ Crash ] +crbug.com/591099 css3/flexbox/display-flexbox-set-get.html [ Crash Pass ] crbug.com/591099 css3/flexbox/flex-algorithm-with-margins.html [ Failure ] crbug.com/591099 css3/flexbox/flex-algorithm.html [ Failure ] crbug.com/591099 css3/flexbox/flex-align-baseline.html [ Failure ] @@ -1816,7 +1816,7 @@ crbug.com/591099 css3/flexbox/flex-flow-margins.html [ Failure ] crbug.com/591099 css3/flexbox/flex-flow-padding.html [ Failure ] crbug.com/591099 css3/flexbox/flex-flow.html [ Failure ] -crbug.com/591099 css3/flexbox/flex-item-contains-strict.html [ Crash ] +crbug.com/591099 css3/flexbox/flex-item-contains-strict.html [ Crash Failure ] crbug.com/591099 css3/flexbox/flex-longhand-parsing.html [ Failure ] crbug.com/591099 css3/flexbox/flex-one-sets-flex-basis-to-zero-px.html [ Failure ] crbug.com/591099 css3/flexbox/flex-percentage-height-in-table-standards-mode.html [ Failure ] @@ -1827,25 +1827,25 @@ crbug.com/591099 css3/flexbox/flexbox-wordwrap.html [ Failure ] crbug.com/591099 css3/flexbox/floated-flexbox.html [ Failure ] crbug.com/591099 css3/flexbox/floated-flexitem.html [ Failure ] -crbug.com/591099 css3/flexbox/inline-flex-crash.html [ Crash ] -crbug.com/591099 css3/flexbox/inline-flex-crash2.html [ Crash ] -crbug.com/591099 css3/flexbox/inline-flex.html [ Crash ] -crbug.com/591099 css3/flexbox/intrinsic-min-width-applies-with-fixed-width.html [ Crash ] +crbug.com/591099 css3/flexbox/inline-flex-crash.html [ Crash Pass ] +crbug.com/591099 css3/flexbox/inline-flex-crash2.html [ Crash Pass ] +crbug.com/591099 css3/flexbox/inline-flex.html [ Crash Pass ] +crbug.com/591099 css3/flexbox/intrinsic-min-width-applies-with-fixed-width.html [ Crash Pass ] crbug.com/591099 css3/flexbox/intrinsic-width-orthogonal-writing-mode.html [ Failure ] crbug.com/591099 css3/flexbox/large-flex-shrink-assert.html [ Failure ] crbug.com/591099 css3/flexbox/line-wrapping.html [ Failure ] -crbug.com/591099 css3/flexbox/min-size-auto.html [ Crash ] +crbug.com/591099 css3/flexbox/min-size-auto.html [ Crash Pass ] crbug.com/591099 css3/flexbox/multiline-align-self.html [ Failure ] crbug.com/591099 css3/flexbox/multiline-reverse-wrap-baseline.html [ Failure ] crbug.com/591099 css3/flexbox/multiline-shrink-to-fit.html [ Failure ] crbug.com/591099 css3/flexbox/negative-flex-rounding-assert.html [ Failure ] crbug.com/591099 css3/flexbox/nested-stretch.html [ Failure ] crbug.com/591099 css3/flexbox/overflow-auto-dynamic-changes.html [ Failure ] -crbug.com/591099 css3/flexbox/overflow-auto-resizes-correctly.html [ Crash ] +crbug.com/591099 css3/flexbox/overflow-auto-resizes-correctly.html [ Crash Pass ] crbug.com/591099 css3/flexbox/percent-margins.html [ Failure ] -crbug.com/591099 css3/flexbox/percentage-height-replaced-element.html [ Crash ] +crbug.com/591099 css3/flexbox/percentage-height-replaced-element.html [ Crash Pass ] crbug.com/591099 css3/flexbox/percentage-heights.html [ Failure ] -crbug.com/591099 css3/flexbox/perpendicular-writing-modes-inside-flex-item.html [ Crash ] +crbug.com/591099 css3/flexbox/perpendicular-writing-modes-inside-flex-item.html [ Crash Pass ] crbug.com/591099 css3/flexbox/position-absolute-child-with-contenteditable.html [ Failure ] crbug.com/591099 css3/flexbox/preferred-widths.html [ Failure ] crbug.com/591099 css3/flexbox/relpos-with-scrollable-with-abspos-crash.html [ Failure ] @@ -1859,7 +1859,7 @@ crbug.com/591099 css3/font-weight-multiple-selectors.html [ Failure ] crbug.com/591099 css3/font-weight.html [ Failure ] crbug.com/591099 css3/khtml-background-size-0x0-bmp.html [ Failure ] -crbug.com/591099 css3/masking/clip-path-animation.html [ Crash ] +crbug.com/591099 css3/masking/clip-path-animation.html [ Crash Pass ] crbug.com/591099 css3/masking/clip-path-circle-filter.html [ Failure Pass ] crbug.com/591099 css3/masking/clip-path-circle-overflow-hidden.html [ Failure ] crbug.com/591099 css3/masking/clip-path-circle-overflow.html [ Failure Pass ] @@ -2652,32 +2652,32 @@ crbug.com/591099 css3/zoom-coords.xhtml [ Failure ] crbug.com/591099 cssom/ahem-ex-units.html [ Failure ] crbug.com/591099 cssom/cssvalue-comparison.html [ Failure ] -crbug.com/591099 custom-elements/constructor-context-dies-before-super.html [ Crash ] -crbug.com/591099 custom-elements/constructor-context-dies-cross-context-call.html [ Crash ] -crbug.com/591099 custom-elements/constructor-context-dies-retrieving-prototype.html [ Crash ] -crbug.com/591099 custom-elements/constructor-may-poach-upgrading-element.html [ Crash ] -crbug.com/591099 custom-elements/define-context-dies-retrieving-prototype.html [ Crash ] -crbug.com/591099 custom-elements/isolated-worlds.html [ Crash ] -crbug.com/591099 custom-elements/spec/adopt-node.html [ Crash ] -crbug.com/591099 custom-elements/spec/callback.html [ Crash ] -crbug.com/591099 custom-elements/spec/construct.html [ Crash ] -crbug.com/591099 custom-elements/spec/create-element-defined-asynchronous.html [ Crash ] -crbug.com/591099 custom-elements/spec/create-element-defined-synchronous.html [ Crash ] -crbug.com/591099 custom-elements/spec/create-element-inside-template.html [ Crash ] -crbug.com/591099 custom-elements/spec/create-element.html [ Crash ] -crbug.com/591099 custom-elements/spec/custom-elements-registry/when_defined.html [ Crash ] -crbug.com/591099 custom-elements/spec/define-builtin-element.html [ Crash ] -crbug.com/591099 custom-elements/spec/define-element.html [ Crash ] -crbug.com/591099 custom-elements/spec/doc-without-browsing-context.html [ Crash ] -crbug.com/591099 custom-elements/spec/insert-a-node-try-to-upgrade.html [ Crash ] -crbug.com/591099 custom-elements/spec/parsing.html [ Crash ] -crbug.com/591099 custom-elements/spec/remove-element.html [ Crash ] -crbug.com/591099 custom-elements/spec/report-the-exception.html [ Crash ] -crbug.com/591099 custom-elements/spec/selectors/pseudo-class-defined.html [ Crash ] -crbug.com/591099 custom-elements/spec/state-failed-create.html [ Crash ] -crbug.com/591099 custom-elements/spec/state-failed-upgrade.html [ Crash ] -crbug.com/591099 custom-elements/spec/upgrade-element.html [ Crash ] -crbug.com/591099 custom-elements/v0-v1-interop.html [ Crash ] +crbug.com/591099 custom-elements/constructor-context-dies-before-super.html [ Crash Pass ] +crbug.com/591099 custom-elements/constructor-context-dies-cross-context-call.html [ Crash Pass ] +crbug.com/591099 custom-elements/constructor-context-dies-retrieving-prototype.html [ Crash Pass ] +crbug.com/591099 custom-elements/constructor-may-poach-upgrading-element.html [ Crash Pass ] +crbug.com/591099 custom-elements/define-context-dies-retrieving-prototype.html [ Crash Pass ] +crbug.com/591099 custom-elements/isolated-worlds.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/adopt-node.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/callback.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/construct.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/create-element-defined-asynchronous.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/create-element-defined-synchronous.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/create-element-inside-template.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/create-element.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/custom-elements-registry/when_defined.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/define-builtin-element.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/define-element.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/doc-without-browsing-context.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/insert-a-node-try-to-upgrade.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/parsing.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/remove-element.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/report-the-exception.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/selectors/pseudo-class-defined.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/state-failed-create.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/state-failed-upgrade.html [ Crash Pass ] +crbug.com/591099 custom-elements/spec/upgrade-element.html [ Crash Pass ] +crbug.com/591099 custom-elements/v0-v1-interop.html [ Crash Pass ] crbug.com/591099 device_orientation/motion/add-during-dispatch.html [ Failure ] crbug.com/591099 device_orientation/motion/add-listener-from-callback.html [ Failure ] crbug.com/591099 device_orientation/motion/create-event.html [ Failure ] @@ -2705,7 +2705,7 @@ crbug.com/591099 dom/attr/set-attr-value-no-DOMSubtreeModified.html [ Failure ] crbug.com/591099 dom/attr/set-attribute-node-from-iframe.html [ Failure ] crbug.com/591099 dom/attr/update-attribute-node-no-crash.html [ Failure ] -crbug.com/591099 dom/document/adoptNode-reparenting-crash.html [ Crash ] +crbug.com/591099 dom/document/adoptNode-reparenting-crash.html [ Crash Pass ] crbug.com/591099 dom/domparsing/dom-parse-serialize-display.html [ Failure ] crbug.com/591099 dom/domparsing/dom-parse-serialize-xmldecl.html [ Failure ] crbug.com/591099 dom/domparsing/dom-parse-serialize.html [ Failure ] @@ -2719,7 +2719,7 @@ crbug.com/591099 dom/domparsing/xmlserializer-attribute-special-namespaces.html [ Failure ] crbug.com/591099 dom/domparsing/xmlserializer-doctype2.html [ Failure ] crbug.com/591099 dom/domparsing/xmlserializer-double-xmlns.html [ Failure ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/AppletsCollection.html [ Crash ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/AppletsCollection.html [ Crash Failure ] crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLDocument01.html [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLDocument02.html [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLDocument03.html [ Crash Pass ] @@ -2740,152 +2740,152 @@ crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLDocument19.html [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLDocument20.html [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLDocument21.html [ Crash Pass ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement01.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement02.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement03.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement04.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement05.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement06.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement07.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement08.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement09.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement10.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement100.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement101.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement102.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement103.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement104.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement105.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement106.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement107.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement108.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement109.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement11.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement110.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement111.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement112.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement113.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement114.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement115.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement116.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement117.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement118.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement119.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement12.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement120.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement121.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement122.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement123.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement124.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement125.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement126.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement127.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement128.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement129.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement13.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement130.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement131.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement132.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement133.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement134.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement135.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement136.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement137.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement138.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement139.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement14.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement140.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement141.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement142.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement143.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement144.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement145.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement15.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement16.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement17.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement18.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement19.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement20.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement21.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement22.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement23.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement24.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement25.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement26.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement27.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement28.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement29.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement30.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement31.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement32.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement33.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement34.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement35.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement36.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement37.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement38.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement39.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement40.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement41.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement42.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement43.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement44.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement45.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement46.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement47.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement48.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement49.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement50.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement51.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement52.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement53.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement54.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement55.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement56.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement57.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement58.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement59.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement60.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement61.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement62.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement63.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement64.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement65.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement66.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement67.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement68.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement69.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement70.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement71.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement72.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement73.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement74.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement75.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement76.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement77.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement78.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement79.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement80.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement81.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement82.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement83.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement84.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement85.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement86.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement87.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement88.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement89.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement90.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement91.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement92.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement93.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement94.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement95.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement96.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement97.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement98.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement99.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLFormElement10.html [ Crash ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement01.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement02.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement03.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement04.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement05.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement06.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement07.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement08.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement09.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement10.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement100.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement101.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement102.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement103.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement104.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement105.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement106.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement107.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement108.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement109.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement11.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement110.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement111.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement112.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement113.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement114.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement115.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement116.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement117.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement118.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement119.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement12.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement120.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement121.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement122.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement123.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement124.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement125.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement126.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement127.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement128.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement129.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement13.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement130.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement131.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement132.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement133.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement134.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement135.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement136.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement137.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement138.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement139.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement14.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement140.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement141.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement142.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement143.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement144.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement145.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement15.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement16.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement17.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement18.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement19.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement20.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement21.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement22.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement23.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement24.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement25.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement26.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement27.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement28.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement29.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement30.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement31.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement32.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement33.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement34.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement35.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement36.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement37.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement38.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement39.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement40.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement41.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement42.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement43.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement44.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement45.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement46.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement47.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement48.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement49.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement50.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement51.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement52.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement53.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement54.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement55.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement56.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement57.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement58.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement59.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement60.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement61.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement62.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement63.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement64.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement65.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement66.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement67.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement68.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement69.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement70.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement71.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement72.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement73.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement74.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement75.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement76.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement77.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement78.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement79.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement80.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement81.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement82.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement83.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement84.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement85.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement86.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement87.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement88.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement89.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement90.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement91.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement92.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement93.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement94.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement95.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement96.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement97.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement98.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement99.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLFormElement10.html [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement01.html [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement02.html [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement03.html [ Crash Pass ] @@ -2895,50 +2895,50 @@ crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement07.html [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement09.html [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement10.html [ Crash Pass ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement11.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLImageElement05.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLImageElement12.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement01.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement02.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement03.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement04.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement05.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement06.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement07.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement08.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement09.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement10.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement11.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement12.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement13.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement14.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement15.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement16.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement17.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement18.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement19.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement20.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement01.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement02.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement03.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement04.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLSelectElement14.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLTextAreaElement14.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLTextAreaElement15.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object01.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object02.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object03.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object04.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object05.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object07.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object08.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object09.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object10.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object11.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object12.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object13.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object14.html [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object15.html [ Crash ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement11.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLImageElement05.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLImageElement12.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement01.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement02.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement03.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement04.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement05.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement06.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement07.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement08.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement09.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement10.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement11.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement12.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement13.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement14.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement15.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement16.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement17.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement18.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement19.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement20.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement01.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement02.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement03.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement04.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLSelectElement14.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLTextAreaElement14.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLTextAreaElement15.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object01.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object02.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object03.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object04.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object05.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object07.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object08.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object09.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object10.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object11.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object12.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object13.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object14.html [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object15.html [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLDocument01.xhtml [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLDocument02.xhtml [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLDocument03.xhtml [ Crash Pass ] @@ -2954,151 +2954,151 @@ crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLDocument14.xhtml [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLDocument15.xhtml [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLDocument16.xhtml [ Crash Pass ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement01.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement02.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement03.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement04.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement05.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement06.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement07.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement08.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement09.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement10.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement100.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement101.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement102.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement103.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement104.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement105.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement106.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement107.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement108.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement109.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement11.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement110.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement111.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement112.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement113.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement114.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement115.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement116.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement117.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement118.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement119.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement12.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement120.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement121.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement122.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement123.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement124.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement125.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement126.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement127.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement128.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement129.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement13.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement130.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement131.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement132.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement133.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement134.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement135.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement136.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement137.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement138.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement139.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement14.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement140.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement141.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement142.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement143.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement144.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement145.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement15.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement16.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement17.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement18.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement19.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement20.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement21.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement22.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement23.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement24.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement25.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement26.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement27.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement28.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement29.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement30.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement31.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement32.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement33.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement34.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement35.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement36.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement37.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement38.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement39.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement40.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement41.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement42.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement43.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement44.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement45.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement46.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement47.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement48.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement49.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement50.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement51.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement52.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement53.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement54.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement55.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement56.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement57.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement58.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement59.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement60.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement61.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement62.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement63.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement64.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement65.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement66.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement67.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement68.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement69.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement70.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement71.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement72.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement73.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement74.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement75.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement76.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement77.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement78.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement79.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement80.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement81.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement82.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement83.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement84.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement85.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement86.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement87.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement88.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement89.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement90.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement91.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement92.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement93.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement94.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement95.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement96.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement97.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement98.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement99.xhtml [ Crash ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement01.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement02.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement03.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement04.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement05.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement06.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement07.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement08.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement09.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement10.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement100.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement101.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement102.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement103.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement104.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement105.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement106.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement107.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement108.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement109.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement11.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement110.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement111.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement112.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement113.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement114.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement115.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement116.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement117.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement118.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement119.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement12.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement120.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement121.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement122.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement123.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement124.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement125.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement126.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement127.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement128.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement129.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement13.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement130.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement131.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement132.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement133.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement134.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement135.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement136.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement137.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement138.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement139.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement14.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement140.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement141.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement142.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement143.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement144.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement145.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement15.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement16.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement17.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement18.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement19.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement20.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement21.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement22.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement23.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement24.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement25.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement26.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement27.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement28.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement29.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement30.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement31.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement32.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement33.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement34.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement35.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement36.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement37.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement38.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement39.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement40.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement41.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement42.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement43.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement44.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement45.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement46.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement47.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement48.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement49.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement50.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement51.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement52.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement53.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement54.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement55.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement56.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement57.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement58.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement59.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement60.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement61.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement62.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement63.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement64.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement65.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement66.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement67.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement68.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement69.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement70.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement71.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement72.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement73.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement74.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement75.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement76.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement77.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement78.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement79.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement80.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement81.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement82.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement83.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement84.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement85.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement86.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement87.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement88.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement89.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement90.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement91.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement92.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement93.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement94.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement95.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement96.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement97.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement98.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement99.xhtml [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement01.xhtml [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement02.xhtml [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement03.xhtml [ Crash Pass ] @@ -3109,57 +3109,57 @@ crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement08.xhtml [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement09.xhtml [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement10.xhtml [ Crash Pass ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement11.xhtml [ Crash ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement11.xhtml [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement03.xhtml [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement04.xhtml [ Crash Pass ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement05.xhtml [ Crash ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement05.xhtml [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement07.xhtml [ Crash Pass ] crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement09.xhtml [ Crash Pass ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement12.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement01.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement02.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement03.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement04.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement05.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement06.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement07.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement08.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement09.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement10.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement11.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement12.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement13.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement14.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement15.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement16.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement17.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement18.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement19.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement20.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement01.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement02.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement03.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement04.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLSelectElement14.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLTextAreaElement14.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLTextAreaElement15.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object01.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object02.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object03.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object04.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object05.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object07.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object08.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object09.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object10.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object11.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object12.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object13.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object14.xhtml [ Crash ] -crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object15.xhtml [ Crash ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement12.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement01.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement02.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement03.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement04.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement05.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement06.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement07.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement08.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement09.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement10.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement11.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement12.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement13.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement14.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement15.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement16.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement17.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement18.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement19.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement20.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement01.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement02.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement03.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement04.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLSelectElement14.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLTextAreaElement14.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLTextAreaElement15.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object01.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object02.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object03.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object04.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object05.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object07.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object08.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object09.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object10.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object11.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object12.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object13.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object14.xhtml [ Crash Pass ] +crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object15.xhtml [ Crash Pass ] crbug.com/591099 editing/active-suggestion-marker-basic.html [ Failure ] crbug.com/591099 editing/active-suggestion-marker-split.html [ Failure ] -crbug.com/591099 editing/assert_selection.html [ Crash ] +crbug.com/591099 editing/assert_selection.html [ Crash Failure ] crbug.com/591099 editing/caret/caret-color-001.html [ Failure ] crbug.com/591099 editing/caret/caret-color-002.html [ Failure ] crbug.com/591099 editing/caret/caret-color-003.html [ Failure ] @@ -3178,7 +3178,7 @@ crbug.com/591099 editing/caret/selection-with-caret-type-progress.html [ Failure ] crbug.com/591099 editing/composition-marker-basic.html [ Failure ] crbug.com/591099 editing/composition-marker-split.html [ Failure ] -crbug.com/591099 editing/deleting/4866671.html [ Crash ] +crbug.com/591099 editing/deleting/4866671.html [ Crash Failure ] crbug.com/591099 editing/deleting/4875189.html [ Crash Failure ] crbug.com/591099 editing/deleting/4916235-1.html [ Failure ] crbug.com/591099 editing/deleting/4922367.html [ Failure ] @@ -3195,24 +3195,24 @@ crbug.com/591099 editing/deleting/5433862-2.html [ Failure ] crbug.com/591099 editing/deleting/5483370.html [ Failure ] crbug.com/591099 editing/deleting/5729680.html [ Failure ] -crbug.com/591099 editing/deleting/delete-3608430-fix.html [ Crash ] +crbug.com/591099 editing/deleting/delete-3608430-fix.html [ Crash Failure ] crbug.com/591099 editing/deleting/delete-3865854-fix.html [ Failure ] -crbug.com/591099 editing/deleting/delete-all-text-in-text-field-assertion.html [ Crash ] +crbug.com/591099 editing/deleting/delete-all-text-in-text-field-assertion.html [ Crash Pass ] crbug.com/591099 editing/deleting/delete-and-cleanup.html [ Failure ] crbug.com/591099 editing/deleting/delete-at-paragraph-boundaries-011.html [ Failure ] crbug.com/591099 editing/deleting/delete-block-merge-contents-025.html [ Failure ] crbug.com/591099 editing/deleting/delete-block-table.html [ Crash Failure ] crbug.com/591099 editing/deleting/delete-blockquote-large-offsets.html [ Failure ] crbug.com/591099 editing/deleting/delete-br-013.html [ Failure ] -crbug.com/591099 editing/deleting/delete-br-after-image.html [ Crash ] +crbug.com/591099 editing/deleting/delete-br-after-image.html [ Crash Pass ] crbug.com/591099 editing/deleting/delete-button-background-image-none.html [ Failure ] -crbug.com/591099 editing/deleting/delete-character-002.html [ Crash ] +crbug.com/591099 editing/deleting/delete-character-002.html [ Crash Pass ] crbug.com/591099 editing/deleting/delete-contiguous-ws-001.html [ Crash Failure ] crbug.com/591099 editing/deleting/delete-empty-table.html [ Failure ] -crbug.com/591099 editing/deleting/delete-inline-br.html [ Crash ] +crbug.com/591099 editing/deleting/delete-inline-br.html [ Crash Pass ] crbug.com/591099 editing/deleting/delete-last-char-in-table.html [ Crash Failure ] crbug.com/591099 editing/deleting/delete-leading-ws-001.html [ Failure ] -crbug.com/591099 editing/deleting/delete-ligature-001.html [ Crash ] +crbug.com/591099 editing/deleting/delete-ligature-001.html [ Crash Pass ] crbug.com/591099 editing/deleting/delete-line-001.html [ Failure ] crbug.com/591099 editing/deleting/delete-line-002.html [ Failure ] crbug.com/591099 editing/deleting/delete-line-004.html [ Failure ] @@ -3230,15 +3230,15 @@ crbug.com/591099 editing/deleting/delete-node-after-DOMNodeRemoved.html [ Failure ] crbug.com/591099 editing/deleting/delete-selection-001.html [ Failure ] crbug.com/591099 editing/deleting/delete-surrogatepair.html [ Failure ] -crbug.com/591099 editing/deleting/delete-svg-001.html [ Crash ] +crbug.com/591099 editing/deleting/delete-svg-001.html [ Crash Pass ] crbug.com/591099 editing/deleting/delete_after_span_ws.html [ Failure ] -crbug.com/591099 editing/deleting/delete_block_merge_contents_1.html [ Crash ] -crbug.com/591099 editing/deleting/delete_block_merge_whitespace.html [ Crash ] -crbug.com/591099 editing/deleting/delete_image.html [ Crash ] +crbug.com/591099 editing/deleting/delete_block_merge_contents_1.html [ Crash Failure ] +crbug.com/591099 editing/deleting/delete_block_merge_whitespace.html [ Crash Failure ] +crbug.com/591099 editing/deleting/delete_image.html [ Crash Pass ] crbug.com/591099 editing/deleting/delete_line_end_ws.html [ Failure ] crbug.com/591099 editing/deleting/delete_map_area.html [ Failure ] -crbug.com/591099 editing/deleting/delete_trailing_ws.html [ Crash ] -crbug.com/591099 editing/deleting/delete_ws_fixup.html [ Crash ] +crbug.com/591099 editing/deleting/delete_trailing_ws.html [ Crash Failure ] +crbug.com/591099 editing/deleting/delete_ws_fixup.html [ Crash Failure ] crbug.com/591099 editing/deleting/forward-delete-key.html [ Failure ] crbug.com/591099 editing/deleting/merge-at-end-of-document.html [ Failure ] crbug.com/591099 editing/deleting/merge-different-styles.html [ Failure ] @@ -3249,10 +3249,10 @@ crbug.com/591099 editing/deleting/merge-paragraph-into-blockquote.html [ Failure ] crbug.com/591099 editing/deleting/merge-paragraph-into-pre.html [ Failure ] crbug.com/591099 editing/deleting/merge-whitespace-pre.html [ Failure ] -crbug.com/591099 editing/deleting/merge_paragraph_into_h1.html [ Crash ] +crbug.com/591099 editing/deleting/merge_paragraph_into_h1.html [ Crash Failure ] crbug.com/591099 editing/deleting/move-nodes-001.html [ Failure ] crbug.com/591099 editing/deleting/non-smart-delete.html [ Failure ] -crbug.com/591099 editing/deleting/password-delete-contents.html [ Crash ] +crbug.com/591099 editing/deleting/password-delete-contents.html [ Crash Failure ] crbug.com/591099 editing/deleting/paste-with-transparent-background-color.html [ Failure ] crbug.com/591099 editing/deleting/removeNodeCommand-assert.html [ Failure ] crbug.com/591099 editing/deleting/table-cells.html [ Failure ] @@ -3275,8 +3275,8 @@ crbug.com/591099 editing/execCommand/4920742-2.html [ Crash Failure ] crbug.com/591099 editing/execCommand/4928635.html [ Crash Failure ] crbug.com/591099 editing/execCommand/4976800.html [ Failure ] -crbug.com/591099 editing/execCommand/5080333-1.html [ Crash ] -crbug.com/591099 editing/execCommand/5080333-2.html [ Crash ] +crbug.com/591099 editing/execCommand/5080333-1.html [ Crash Pass ] +crbug.com/591099 editing/execCommand/5080333-2.html [ Crash Pass ] crbug.com/591099 editing/execCommand/5119244.html [ Failure ] crbug.com/591099 editing/execCommand/5120591.html [ Failure ] crbug.com/591099 editing/execCommand/5136770.html [ Crash Failure ] @@ -3301,11 +3301,11 @@ crbug.com/591099 editing/execCommand/5700414-1.html [ Failure ] crbug.com/591099 editing/execCommand/5700414-2.html [ Failure ] crbug.com/591099 editing/execCommand/align-in-span.html [ Failure ] -crbug.com/591099 editing/execCommand/apply-inline-style-to-element-with-no-renderer-crash.html [ Crash ] -crbug.com/591099 editing/execCommand/apply-style-command-crash.html [ Crash ] -crbug.com/591099 editing/execCommand/apply-style-empty-paragraph-start-crash.html [ Crash ] +crbug.com/591099 editing/execCommand/apply-inline-style-to-element-with-no-renderer-crash.html [ Crash Pass ] +crbug.com/591099 editing/execCommand/apply-style-command-crash.html [ Crash Pass ] +crbug.com/591099 editing/execCommand/apply-style-empty-paragraph-start-crash.html [ Crash Pass ] crbug.com/591099 editing/execCommand/apply-style-text-decoration-crash.html [ Failure ] -crbug.com/591099 editing/execCommand/applyblockelement-visiblepositionforindex-crash.html [ Crash ] +crbug.com/591099 editing/execCommand/applyblockelement-visiblepositionforindex-crash.html [ Crash Pass ] crbug.com/591099 editing/execCommand/arguments-combinations.html [ Failure ] crbug.com/591099 editing/execCommand/backcolor-crash.html [ Crash Failure ] crbug.com/591099 editing/execCommand/boldSelection.html [ Failure ] @@ -3313,12 +3313,12 @@ crbug.com/591099 editing/execCommand/clipboard-access-with-userGesture.html [ Failure ] crbug.com/591099 editing/execCommand/clipboard-access.html [ Failure ] crbug.com/591099 editing/execCommand/convert-style-elements-to-spans.html [ Failure ] -crbug.com/591099 editing/execCommand/crash-line-break-after-outdent.html [ Crash ] -crbug.com/591099 editing/execCommand/crash-object-cloning.html [ Crash ] +crbug.com/591099 editing/execCommand/crash-line-break-after-outdent.html [ Crash Failure ] +crbug.com/591099 editing/execCommand/crash-object-cloning.html [ Crash Pass ] crbug.com/591099 editing/execCommand/default-paragraph-separator.html [ Failure ] crbug.com/591099 editing/execCommand/default-parameters.html [ Failure ] crbug.com/591099 editing/execCommand/delete-selection-has-style.html [ Failure ] -crbug.com/591099 editing/execCommand/editing-nontext-node-crash.xhtml [ Crash ] +crbug.com/591099 editing/execCommand/editing-nontext-node-crash.xhtml [ Crash Failure ] crbug.com/591099 editing/execCommand/empty-span-removal.html [ Failure ] crbug.com/591099 editing/execCommand/enabling-and-selection-2.html [ Failure Timeout ] crbug.com/591099 editing/execCommand/enabling-and-selection.html [ Failure ] @@ -3327,53 +3327,53 @@ crbug.com/591099 editing/execCommand/findString-diacriticals.html [ Failure ] crbug.com/591099 editing/execCommand/findString.html [ Failure ] crbug.com/591099 editing/execCommand/format-block-contenteditable-false.html [ Failure ] -crbug.com/591099 editing/execCommand/format-block-crash.html [ Crash ] +crbug.com/591099 editing/execCommand/format-block-crash.html [ Crash Failure ] crbug.com/591099 editing/execCommand/format-block-from-range-selection.html [ Failure ] -crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs-in-pre.html [ Crash ] -crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs.html [ Crash ] +crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs-in-pre.html [ Crash Failure ] +crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs.html [ Crash Failure ] crbug.com/591099 editing/execCommand/format-block-with-trailing-br.html [ Failure ] crbug.com/591099 editing/execCommand/format_block/no-visible-content.html [ Failure ] -crbug.com/591099 editing/execCommand/format_block/unrooted-selection-start-crash.html [ Crash ] +crbug.com/591099 editing/execCommand/format_block/unrooted-selection-start-crash.html [ Crash Pass ] crbug.com/591099 editing/execCommand/forward-delete-no-scroll.html [ Failure ] -crbug.com/591099 editing/execCommand/indent-crash-by-top-load-event.html [ Crash ] +crbug.com/591099 editing/execCommand/indent-crash-by-top-load-event.html [ Crash Pass ] crbug.com/591099 editing/execCommand/indent-div-inside-list.html [ Failure ] crbug.com/591099 editing/execCommand/indent-empty-root.html [ Failure ] crbug.com/591099 editing/execCommand/indent-empty-table-cell.html [ Failure ] -crbug.com/591099 editing/execCommand/indent-images-2.html [ Crash ] -crbug.com/591099 editing/execCommand/indent-images-3.html [ Crash ] -crbug.com/591099 editing/execCommand/indent-images.html [ Crash ] +crbug.com/591099 editing/execCommand/indent-images-2.html [ Crash Pass ] +crbug.com/591099 editing/execCommand/indent-images-3.html [ Crash Pass ] +crbug.com/591099 editing/execCommand/indent-images.html [ Crash Pass ] crbug.com/591099 editing/execCommand/indent-inline-box-crash.html [ Crash Pass ] crbug.com/591099 editing/execCommand/indent-nested-blockquotes-crash.html [ Crash Pass ] crbug.com/591099 editing/execCommand/indent-nested-blockquotes.html [ Failure ] crbug.com/591099 editing/execCommand/indent-nested-div.html [ Failure ] -crbug.com/591099 editing/execCommand/indent-paragraphs.html [ Crash ] +crbug.com/591099 editing/execCommand/indent-paragraphs.html [ Crash Pass ] crbug.com/591099 editing/execCommand/indent-partial-table.html [ Failure ] crbug.com/591099 editing/execCommand/indent-right-after-table.html [ Failure ] crbug.com/591099 editing/execCommand/indent-second-paragraph-in-blockquote.html [ Failure ] -crbug.com/591099 editing/execCommand/infinite-recursion-computeRectForRepaint.html [ Crash ] +crbug.com/591099 editing/execCommand/infinite-recursion-computeRectForRepaint.html [ Crash Failure ] crbug.com/591099 editing/execCommand/inline-style-after-indentoutdent.html [ Crash Failure ] -crbug.com/591099 editing/execCommand/insert-image-changing-visibility-crash.html [ Crash ] +crbug.com/591099 editing/execCommand/insert-image-changing-visibility-crash.html [ Crash Failure ] crbug.com/591099 editing/execCommand/insert-image-on-top-of-directional-text.html [ Failure ] -crbug.com/591099 editing/execCommand/insert-image-with-selecting-document.html [ Crash ] +crbug.com/591099 editing/execCommand/insert-image-with-selecting-document.html [ Crash Pass ] crbug.com/591099 editing/execCommand/insert-line-break-no-scroll.html [ Failure ] -crbug.com/591099 editing/execCommand/insert-list-br-with-child-crash.html [ Crash ] +crbug.com/591099 editing/execCommand/insert-list-br-with-child-crash.html [ Crash Failure ] crbug.com/591099 editing/execCommand/insert-list-empty-div.html [ Failure ] crbug.com/591099 editing/execCommand/insert-list-in-noneditable-list-parent.html [ Failure ] -crbug.com/591099 editing/execCommand/insert-list-with-progress-crash.html [ Crash ] +crbug.com/591099 editing/execCommand/insert-list-with-progress-crash.html [ Crash Pass ] crbug.com/591099 editing/execCommand/insert-lists-inside-another-list.html [ Crash Failure ] -crbug.com/591099 editing/execCommand/insert-ordered-list-crash.html [ Crash ] -crbug.com/591099 editing/execCommand/insert-ordered-list.html [ Crash ] -crbug.com/591099 editing/execCommand/insert-paragraph-into-table.html [ Crash ] +crbug.com/591099 editing/execCommand/insert-ordered-list-crash.html [ Crash Failure ] +crbug.com/591099 editing/execCommand/insert-ordered-list.html [ Crash Pass ] +crbug.com/591099 editing/execCommand/insert-paragraph-into-table.html [ Crash Pass ] crbug.com/591099 editing/execCommand/insert-remove-block-list-inside-presentational-inline.html [ Crash Failure ] crbug.com/591099 editing/execCommand/insert-text-not-inheriting-block-properties.html [ Failure ] -crbug.com/591099 editing/execCommand/insertHTML-aborted.html [ Crash ] +crbug.com/591099 editing/execCommand/insertHTML-aborted.html [ Crash Pass ] crbug.com/591099 editing/execCommand/insertHTML.html [ Failure ] crbug.com/591099 editing/execCommand/insertImage-src.html [ Failure ] crbug.com/591099 editing/execCommand/insertImage.html [ Failure ] -crbug.com/591099 editing/execCommand/inserting-ordered-list-crash.html [ Crash ] -crbug.com/591099 editing/execCommand/italic-crash-by-iframe-load.html [ Crash ] +crbug.com/591099 editing/execCommand/inserting-ordered-list-crash.html [ Crash Failure ] +crbug.com/591099 editing/execCommand/italic-crash-by-iframe-load.html [ Crash Pass ] crbug.com/591099 editing/execCommand/italicizeByCharacter.html [ Crash Failure ] -crbug.com/591099 editing/execCommand/justify-right-crash.html [ Crash ] +crbug.com/591099 editing/execCommand/justify-right-crash.html [ Crash Pass ] crbug.com/591099 editing/execCommand/justify.html [ Failure Timeout ] crbug.com/591099 editing/execCommand/merge-text-decoration-with-typing-style.html [ Failure ] crbug.com/591099 editing/execCommand/modifyForeColorByCharacter.html [ Crash Failure ] @@ -3381,42 +3381,42 @@ crbug.com/591099 editing/execCommand/move-selection-back-line-strict.html [ Failure ] crbug.com/591099 editing/execCommand/move-selection-back-line.html [ Failure ] crbug.com/591099 editing/execCommand/non-html-document.html [ Failure ] -crbug.com/591099 editing/execCommand/outdent-break-with-style.html [ Crash ] -crbug.com/591099 editing/execCommand/outdent-collapse-table-crash.html [ Crash ] +crbug.com/591099 editing/execCommand/outdent-break-with-style.html [ Crash Pass ] +crbug.com/591099 editing/execCommand/outdent-collapse-table-crash.html [ Crash Pass ] crbug.com/591099 editing/execCommand/outdent-inline-list.html [ Crash Failure ] crbug.com/591099 editing/execCommand/outdent-multiparagraph-list.html [ Crash Failure ] crbug.com/591099 editing/execCommand/outdent-regular-blockquote.html [ Crash Failure ] crbug.com/591099 editing/execCommand/outdent-selection.html [ Crash Failure ] crbug.com/591099 editing/execCommand/overtype-support.html [ Failure ] -crbug.com/591099 editing/execCommand/paste-1.html [ Crash ] -crbug.com/591099 editing/execCommand/paste-2.html [ Crash ] +crbug.com/591099 editing/execCommand/paste-1.html [ Crash Pass ] +crbug.com/591099 editing/execCommand/paste-2.html [ Crash Pass ] crbug.com/591099 editing/execCommand/query-command-state.html [ Timeout ] crbug.com/591099 editing/execCommand/query-command-value-background-color.html [ Failure ] crbug.com/591099 editing/execCommand/query-font-size-with-typing-style.html [ Failure ] -crbug.com/591099 editing/execCommand/query-format-block.html [ Crash ] +crbug.com/591099 editing/execCommand/query-format-block.html [ Crash Timeout ] crbug.com/591099 editing/execCommand/query-text-alignment.html [ Failure Timeout ] crbug.com/591099 editing/execCommand/query-text-decoration-with-typing-style.html [ Failure ] crbug.com/591099 editing/execCommand/queryCommandState-02.html [ Crash Failure ] -crbug.com/591099 editing/execCommand/queryCommandState-03.html [ Crash ] +crbug.com/591099 editing/execCommand/queryCommandState-03.html [ Crash Pass ] crbug.com/591099 editing/execCommand/queryCommandValue-unsupported-commands.html [ Failure ] crbug.com/591099 editing/execCommand/remove-format-background-color.html [ Failure ] -crbug.com/591099 editing/execCommand/remove-format-elements.html [ Crash ] -crbug.com/591099 editing/execCommand/remove-format-iframe-in-button.html [ Crash ] -crbug.com/591099 editing/execCommand/remove-format-image.html [ Crash ] +crbug.com/591099 editing/execCommand/remove-format-elements.html [ Crash Pass ] +crbug.com/591099 editing/execCommand/remove-format-iframe-in-button.html [ Crash Pass ] +crbug.com/591099 editing/execCommand/remove-format-image.html [ Crash Pass ] crbug.com/591099 editing/execCommand/remove-format-multiple-elements-mac.html [ Failure ] crbug.com/591099 editing/execCommand/remove-format-multiple-elements-win.html [ Failure Timeout ] -crbug.com/591099 editing/execCommand/remove-format-textdecoration-in-iframe.html [ Crash ] +crbug.com/591099 editing/execCommand/remove-format-textdecoration-in-iframe.html [ Crash Pass ] crbug.com/591099 editing/execCommand/remove-list-from-range-selection.html [ Crash Failure ] crbug.com/591099 editing/execCommand/remove_format_and_extract_contents.html [ Failure ] -crbug.com/591099 editing/execCommand/replace-crossing-mailblockquote-crash.html [ Crash ] -crbug.com/591099 editing/execCommand/replaceSelectorCommand-crash.html [ Crash ] -crbug.com/591099 editing/execCommand/selectAll-including-marquee-crash.html [ Crash ] +crbug.com/591099 editing/execCommand/replace-crossing-mailblockquote-crash.html [ Crash Pass ] +crbug.com/591099 editing/execCommand/replaceSelectorCommand-crash.html [ Crash Failure ] +crbug.com/591099 editing/execCommand/selectAll-including-marquee-crash.html [ Crash Pass ] crbug.com/591099 editing/execCommand/selection-after-insert-list.html [ Crash Failure ] crbug.com/591099 editing/execCommand/strikethrough-uses-strike-tag.html [ Failure ] crbug.com/591099 editing/execCommand/strikethroughSelection.html [ Crash Failure ] crbug.com/591099 editing/execCommand/style-with-css.html [ Failure ] -crbug.com/591099 editing/execCommand/switch-multiple-list-items-crash.html [ Crash ] -crbug.com/591099 editing/execCommand/toggle-compound-styles.html [ Crash ] +crbug.com/591099 editing/execCommand/switch-multiple-list-items-crash.html [ Crash Pass ] +crbug.com/591099 editing/execCommand/toggle-compound-styles.html [ Crash Timeout ] crbug.com/591099 editing/execCommand/toggle-link-mac.html [ Failure ] crbug.com/591099 editing/execCommand/toggle-link-win.html [ Failure ] crbug.com/591099 editing/execCommand/toggle-style-2.html [ Failure ] @@ -3425,20 +3425,20 @@ crbug.com/591099 editing/execCommand/toggle-text-decorations.html [ Failure ] crbug.com/591099 editing/execCommand/toggle-unlink-mac.html [ Failure ] crbug.com/591099 editing/execCommand/toggle-unlink-win.html [ Failure ] -crbug.com/591099 editing/execCommand/unlink.html [ Crash ] +crbug.com/591099 editing/execCommand/unlink.html [ Crash Pass ] crbug.com/591099 editing/execCommand/use-css.html [ Failure ] -crbug.com/591099 editing/execCommand/window-open-insert-list-crash.html [ Crash ] +crbug.com/591099 editing/execCommand/window-open-insert-list-crash.html [ Crash Failure ] crbug.com/591099 editing/input/caret-at-the-edge-of-contenteditable.html [ Failure ] crbug.com/591099 editing/input/caret-at-the-edge-of-input.html [ Crash Failure ] crbug.com/591099 editing/input/caret-read-only-after-editable.html [ Failure ] crbug.com/591099 editing/input/change-style-with-key-binding.html [ Failure ] -crbug.com/591099 editing/input/div-first-child-rule-input.html [ Crash ] -crbug.com/591099 editing/input/div-first-child-rule-textarea.html [ Crash ] -crbug.com/591099 editing/input/drag_in_unselectable.html [ Crash ] +crbug.com/591099 editing/input/div-first-child-rule-input.html [ Crash Failure ] +crbug.com/591099 editing/input/div-first-child-rule-textarea.html [ Crash Failure ] +crbug.com/591099 editing/input/drag_in_unselectable.html [ Crash Pass ] crbug.com/591099 editing/input/editable-container-with-word-wrap-normal.html [ Failure ] crbug.com/591099 editing/input/ime-composition-clearpreedit.html [ Crash Failure ] -crbug.com/591099 editing/input/insert-wrapping-space-in-textarea.html [ Crash ] -crbug.com/591099 editing/input/keyboard-ctrl-enter-no-newline.html [ Crash ] +crbug.com/591099 editing/input/insert-wrapping-space-in-textarea.html [ Crash Failure ] +crbug.com/591099 editing/input/keyboard-ctrl-enter-no-newline.html [ Crash Pass ] crbug.com/591099 editing/input/linux_ltr_composition_underline.html [ Crash Failure ] crbug.com/591099 editing/input/linux_rtl_composition_underline.html [ Crash Failure ] crbug.com/591099 editing/input/option-page-up-down.html [ Failure ] @@ -3447,10 +3447,10 @@ crbug.com/591099 editing/input/password-echo-passnode3.html [ Crash Failure ] crbug.com/591099 editing/input/password-echo-textnode.html [ Crash Failure ] crbug.com/591099 editing/input/paste-linebreak-into-initially-hidden-textarea.html [ Crash Failure ] -crbug.com/591099 editing/input/paste-text-ending-with-interchange-newline.html [ Crash ] +crbug.com/591099 editing/input/paste-text-ending-with-interchange-newline.html [ Crash Pass ] crbug.com/591099 editing/input/reveal-caret-of-multiline-contenteditable.html [ Failure ] crbug.com/591099 editing/input/reveal-caret-of-multiline-input.html [ Crash Failure ] -crbug.com/591099 editing/input/reveal-caret-of-transformed-input-scrollable-parent.html [ Crash ] +crbug.com/591099 editing/input/reveal-caret-of-transformed-input-scrollable-parent.html [ Crash Pass ] crbug.com/591099 editing/input/reveal-password.html [ Crash Failure ] crbug.com/591099 editing/input/scroll-viewport-page-up-down.html [ Failure ] crbug.com/591099 editing/input/search-field-crash-in-designmode.html [ Failure ] @@ -3458,8 +3458,8 @@ crbug.com/591099 editing/input/set-value-on-input-and-forward-delete.html [ Crash Failure ] crbug.com/591099 editing/input/set-value-on-input-and-type-input.html [ Crash Failure ] crbug.com/591099 editing/input/set-value-on-input-and-type-textarea.html [ Crash Failure ] -crbug.com/591099 editing/input/setting-input-value-cancel-ime-composition.html [ Crash ] -crbug.com/591099 editing/input/textcontrol-doubleclick-at-end.html [ Crash Failure ] +crbug.com/591099 editing/input/setting-input-value-cancel-ime-composition.html [ Crash Failure ] +crbug.com/591099 editing/input/textcontrol-doubleclick-at-end.html [ Crash Failure Pass ] crbug.com/591099 editing/inserting/4278698.html [ Failure ] crbug.com/591099 editing/inserting/4840662.html [ Failure ] crbug.com/591099 editing/inserting/4875189-1.html [ Crash Failure ] @@ -3478,10 +3478,10 @@ crbug.com/591099 editing/inserting/5549929-2.html [ Failure ] crbug.com/591099 editing/inserting/5549929-3.html [ Failure ] crbug.com/591099 editing/inserting/5607069-1.html [ Failure ] -crbug.com/591099 editing/inserting/5607069-2.html [ Crash ] -crbug.com/591099 editing/inserting/5607069-3.html [ Crash ] +crbug.com/591099 editing/inserting/5607069-2.html [ Crash Pass ] +crbug.com/591099 editing/inserting/5607069-3.html [ Crash Pass ] crbug.com/591099 editing/inserting/5685601-3.html [ Failure ] -crbug.com/591099 editing/inserting/5994480-2.html [ Crash ] +crbug.com/591099 editing/inserting/5994480-2.html [ Crash Pass ] crbug.com/591099 editing/inserting/6609479-1.html [ Failure ] crbug.com/591099 editing/inserting/6609479.html [ Failure ] crbug.com/591099 editing/inserting/6703873.html [ Failure ] @@ -3490,7 +3490,7 @@ crbug.com/591099 editing/inserting/delete-insignificant-text-crash.html [ Failure ] crbug.com/591099 editing/inserting/editable-inline-element.html [ Failure ] crbug.com/591099 editing/inserting/edited-whitespace-1.html [ Failure ] -crbug.com/591099 editing/inserting/editing-empty-divs.html [ Crash ] +crbug.com/591099 editing/inserting/editing-empty-divs.html [ Crash Failure ] crbug.com/591099 editing/inserting/insert-3659587-fix.html [ Crash Failure ] crbug.com/591099 editing/inserting/insert-3800346-fix.html [ Failure ] crbug.com/591099 editing/inserting/insert-after-delete-001.html [ Failure ] @@ -3502,47 +3502,47 @@ crbug.com/591099 editing/inserting/insert-br-quoted-006.html [ Failure ] crbug.com/591099 editing/inserting/insert-composition-whitespace.html [ Failure ] crbug.com/591099 editing/inserting/insert-empty-html.html [ Failure ] -crbug.com/591099 editing/inserting/insert-html-to-textarea-crash.html [ Crash ] -crbug.com/591099 editing/inserting/insert-images-in-pre-x-crash.html [ Crash Failure ] -crbug.com/591099 editing/inserting/insert-paragraph-after-non-editable-node-before-text.html [ Crash ] -crbug.com/591099 editing/inserting/insert-paragraph-empty-textarea.html [ Crash ] -crbug.com/591099 editing/inserting/insert-paragraph-selection-outside-contenteditable.html [ Crash ] -crbug.com/591099 editing/inserting/insert-paragraph-separator-crash2.html [ Crash ] +crbug.com/591099 editing/inserting/insert-html-to-textarea-crash.html [ Crash Pass ] +crbug.com/591099 editing/inserting/insert-images-in-pre-x-crash.html [ Crash Failure Pass ] +crbug.com/591099 editing/inserting/insert-paragraph-after-non-editable-node-before-text.html [ Crash Pass ] +crbug.com/591099 editing/inserting/insert-paragraph-empty-textarea.html [ Crash Pass ] +crbug.com/591099 editing/inserting/insert-paragraph-selection-outside-contenteditable.html [ Crash Pass ] +crbug.com/591099 editing/inserting/insert-paragraph-separator-crash2.html [ Crash Pass ] crbug.com/591099 editing/inserting/insert-paragraph-separator-tab-span.html [ Failure ] crbug.com/591099 editing/inserting/insert-paste-bidi-control.html [ Crash Failure ] -crbug.com/591099 editing/inserting/insert-space-at-start-of-wrapped-line.html [ Crash ] +crbug.com/591099 editing/inserting/insert-space-at-start-of-wrapped-line.html [ Crash Failure ] crbug.com/591099 editing/inserting/insert-space-in-empty-doc.html [ Failure ] crbug.com/591099 editing/inserting/insert-table-in-paragraph-crash.html [ Failure ] crbug.com/591099 editing/inserting/insert-text-at-tabspan-001.html [ Failure ] crbug.com/591099 editing/inserting/insert-text-at-tabspan-003.html [ Failure ] crbug.com/591099 editing/inserting/insert-text-into-font.html [ Failure ] -crbug.com/591099 editing/inserting/insert-text-with-newlines.html [ Crash ] +crbug.com/591099 editing/inserting/insert-text-with-newlines.html [ Crash Failure ] crbug.com/591099 editing/inserting/insert-thai-characters-001.html [ Failure ] -crbug.com/591099 editing/inserting/insert-without-inheriting-style.html [ Crash ] +crbug.com/591099 editing/inserting/insert-without-inheriting-style.html [ Crash Pass ] crbug.com/591099 editing/inserting/insert_after_delete.html [ Failure ] crbug.com/591099 editing/inserting/insert_div_with_style.html [ Failure ] -crbug.com/591099 editing/inserting/insert_html_as_plain_text.html [ Crash ] +crbug.com/591099 editing/inserting/insert_html_as_plain_text.html [ Crash Failure ] crbug.com/591099 editing/inserting/insert_interchange_newline.html [ Failure ] crbug.com/591099 editing/inserting/line-break.html [ Failure ] crbug.com/591099 editing/inserting/page-zoom-font-size.html [ Failure ] crbug.com/591099 editing/inserting/paragraph-outside-nested-divs.html [ Failure ] crbug.com/591099 editing/inserting/paragraph-separator-in-table-1.html [ Failure ] crbug.com/591099 editing/inserting/paragraph-separator-in-table-2.html [ Failure ] -crbug.com/591099 editing/inserting/redo_insert_text.html [ Crash ] -crbug.com/591099 editing/inserting/replace-at-visible-boundary.html [ Crash ] +crbug.com/591099 editing/inserting/redo_insert_text.html [ Crash Failure ] +crbug.com/591099 editing/inserting/replace-at-visible-boundary.html [ Crash Pass ] crbug.com/591099 editing/inserting/replace-in-heading-001.html [ Failure ] crbug.com/591099 editing/inserting/replace-in-paragraph-001.html [ Failure ] -crbug.com/591099 editing/inserting/replace_text_with_br.html [ Crash ] -crbug.com/591099 editing/inserting/return-key-in-hidden-field.html [ Crash ] +crbug.com/591099 editing/inserting/replace_text_with_br.html [ Crash Failure ] +crbug.com/591099 editing/inserting/return-key-in-hidden-field.html [ Crash Pass ] crbug.com/591099 editing/inserting/return-key-middle-of-span.html [ Failure ] crbug.com/591099 editing/inserting/return-with-object-element.html [ Failure Pass ] -crbug.com/591099 editing/inserting/typing.html [ Crash ] +crbug.com/591099 editing/inserting/typing.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/4242293.html [ Failure ] crbug.com/591099 editing/pasteboard/4631972.html [ Failure ] crbug.com/591099 editing/pasteboard/4744008.html [ Failure ] -crbug.com/591099 editing/pasteboard/4806874.html [ Crash ] +crbug.com/591099 editing/pasteboard/4806874.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/4944770-1.html [ Failure ] -crbug.com/591099 editing/pasteboard/4944770-2.html [ Crash ] +crbug.com/591099 editing/pasteboard/4944770-2.html [ Crash Pass ] crbug.com/591099 editing/pasteboard/4947130.html [ Failure ] crbug.com/591099 editing/pasteboard/5006779.html [ Failure ] crbug.com/591099 editing/pasteboard/5032095.html [ Failure ] @@ -3554,7 +3554,7 @@ crbug.com/591099 editing/pasteboard/5478250.html [ Failure ] crbug.com/591099 editing/pasteboard/5521237.html [ Failure ] crbug.com/591099 editing/pasteboard/5601583-1.html [ Failure ] -crbug.com/591099 editing/pasteboard/5665299.html [ Crash ] +crbug.com/591099 editing/pasteboard/5665299.html [ Crash Pass ] crbug.com/591099 editing/pasteboard/5761530-1.html [ Failure ] crbug.com/591099 editing/pasteboard/5780697-2.html [ Failure ] crbug.com/591099 editing/pasteboard/6018653.html [ Failure ] @@ -3566,27 +3566,27 @@ crbug.com/591099 editing/pasteboard/clipboard-customData.html [ Failure ] crbug.com/591099 editing/pasteboard/copy-backslash-with-euc.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/copy-crash.html [ Crash Timeout ] -crbug.com/591099 editing/pasteboard/copy-cut-paste-keyevent.html [ Crash ] +crbug.com/591099 editing/pasteboard/copy-cut-paste-keyevent.html [ Crash Pass ] crbug.com/591099 editing/pasteboard/copy-display-none.html [ Failure ] crbug.com/591099 editing/pasteboard/copy-element-with-conflicting-background-color-from-rule.html [ Failure ] -crbug.com/591099 editing/pasteboard/copy-image-with-alt-text.html [ Crash ] +crbug.com/591099 editing/pasteboard/copy-image-with-alt-text.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/copy-in-password-field.html [ Crash Failure ] -crbug.com/591099 editing/pasteboard/copy-null-characters.html [ Crash ] +crbug.com/591099 editing/pasteboard/copy-null-characters.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/copy-paste-bidi.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/copy-paste-float.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/copy-paste-pre-line-content.html [ Failure ] -crbug.com/591099 editing/pasteboard/copy-paste-ruby-text-with-block.html [ Crash ] -crbug.com/591099 editing/pasteboard/copy-paste-ruby-text.html [ Crash ] +crbug.com/591099 editing/pasteboard/copy-paste-ruby-text-with-block.html [ Crash Failure ] +crbug.com/591099 editing/pasteboard/copy-paste-ruby-text.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/copy-paste-white-space.html [ Failure ] crbug.com/591099 editing/pasteboard/copy-resolves-urls.html [ Crash Failure ] -crbug.com/591099 editing/pasteboard/copy-standalone-image-crash.html [ Crash ] +crbug.com/591099 editing/pasteboard/copy-standalone-image-crash.html [ Crash Pass ] crbug.com/591099 editing/pasteboard/copy-standalone-image-escaping.html [ Timeout ] crbug.com/591099 editing/pasteboard/copy-standalone-image.html [ Failure ] crbug.com/591099 editing/pasteboard/copy-without-common-block-crash.html [ Failure ] crbug.com/591099 editing/pasteboard/copy_image_and_select.html [ Failure ] crbug.com/591099 editing/pasteboard/crash-accessing-clipboardData-types.html [ Failure ] crbug.com/591099 editing/pasteboard/data-transfer-items-drag-drop-string.html [ Crash Failure ] -crbug.com/591099 editing/pasteboard/data-transfer-items-image-png-details.html [ Crash ] +crbug.com/591099 editing/pasteboard/data-transfer-items-image-png-details.html [ Crash Pass ] crbug.com/591099 editing/pasteboard/data-transfer-items.html [ Failure ] crbug.com/591099 editing/pasteboard/dataTransfer-setData-getData.html [ Failure ] crbug.com/591099 editing/pasteboard/drag-and-drop-image-contenteditable.html [ Timeout ] @@ -3594,15 +3594,15 @@ crbug.com/591099 editing/pasteboard/drag-and-drop-objectimage-contenteditable.html [ Timeout ] crbug.com/591099 editing/pasteboard/drag-drop-copy-text.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/drag-drop-dead-frame.html [ Timeout ] -crbug.com/591099 editing/pasteboard/drag-drop-iframe-refresh-crash.html [ Crash ] -crbug.com/591099 editing/pasteboard/drag-drop-input-in-svg.svg [ Crash ] +crbug.com/591099 editing/pasteboard/drag-drop-iframe-refresh-crash.html [ Crash Failure ] +crbug.com/591099 editing/pasteboard/drag-drop-input-in-svg.svg [ Crash Pass ] crbug.com/591099 editing/pasteboard/drag-drop-input-textarea.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/drag-drop-list.html [ Failure ] crbug.com/591099 editing/pasteboard/drag-drop-modifies-page.html [ Failure ] crbug.com/591099 editing/pasteboard/drag-drop-url-text.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/drag-drop-url-with-style.html [ Failure ] crbug.com/591099 editing/pasteboard/drag-files-to-editable-element.html [ Failure ] -crbug.com/591099 editing/pasteboard/drag-image-in-about-blank-frame.html [ Crash ] +crbug.com/591099 editing/pasteboard/drag-image-in-about-blank-frame.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/drag-image-to-contenteditable-in-iframe.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/drag-list-item.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/drag-prioritizes-draggable-container-over-image.html [ Failure ] @@ -3615,7 +3615,7 @@ crbug.com/591099 editing/pasteboard/drop-text-events.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/drop-text-without-selection.html [ Failure ] crbug.com/591099 editing/pasteboard/file-drag-to-editable.html [ Failure ] -crbug.com/591099 editing/pasteboard/file-input-files-access.html [ Crash ] +crbug.com/591099 editing/pasteboard/file-input-files-access.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/files-during-page-drags.html [ Failure ] crbug.com/591099 editing/pasteboard/get-data-text-plain-drop.html [ Failure ] crbug.com/591099 editing/pasteboard/get-data-text-plain-paste.html [ Failure ] @@ -3626,7 +3626,7 @@ crbug.com/591099 editing/pasteboard/insert-font-weight.html [ Failure ] crbug.com/591099 editing/pasteboard/merge-start-blockquote.html [ Failure ] crbug.com/591099 editing/pasteboard/merge-start-list.html [ Failure ] -crbug.com/591099 editing/pasteboard/mixed_editability.html [ Crash ] +crbug.com/591099 editing/pasteboard/mixed_editability.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/onpaste-text-html.html [ Failure ] crbug.com/591099 editing/pasteboard/paste-after-inline-style-element.html [ Failure ] crbug.com/591099 editing/pasteboard/paste-and-sanitize.html [ Failure ] @@ -3664,12 +3664,12 @@ crbug.com/591099 editing/pasteboard/paste-wrapped-blockquote-into-nonblockquote.html [ Failure ] crbug.com/591099 editing/pasteboard/paste_match_style.html [ Failure ] crbug.com/591099 editing/pasteboard/paste_with_spaces.html [ Failure ] -crbug.com/591099 editing/pasteboard/pasteboard_with_unfocused_selection.html [ Crash ] +crbug.com/591099 editing/pasteboard/pasteboard_with_unfocused_selection.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/pasting-empty-html-falls-back-to-text.html [ Failure ] crbug.com/591099 editing/pasteboard/pasting-tabs.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/quirks-mode-br-1.html [ Crash Failure ] -crbug.com/591099 editing/pasteboard/restore-collapsed-space-for-copy.html [ Crash ] -crbug.com/591099 editing/pasteboard/select-element-1.html [ Crash ] +crbug.com/591099 editing/pasteboard/restore-collapsed-space-for-copy.html [ Crash Failure ] +crbug.com/591099 editing/pasteboard/select-element-1.html [ Crash Failure ] crbug.com/591099 editing/pasteboard/selection-paste-crash.html [ Failure ] crbug.com/591099 editing/pasteboard/set_data_typeof_return.html [ Failure ] crbug.com/591099 editing/pasteboard/smart-drag-drop.html [ Failure ] @@ -3678,7 +3678,7 @@ crbug.com/591099 editing/pasteboard/smart-paste-in-text-control.html [ Failure ] crbug.com/591099 editing/pasteboard/smart_paste.html [ Failure ] crbug.com/591099 editing/pasteboard/styled-element-markup.html [ Failure ] -crbug.com/591099 editing/pasteboard/subframe-dragndrop-1.html [ Crash ] +crbug.com/591099 editing/pasteboard/subframe-dragndrop-1.html [ Crash Failure ] crbug.com/591099 editing/selection/4402375.html [ Failure ] crbug.com/591099 editing/selection/4776665.html [ Failure ] crbug.com/591099 editing/selection/4960116.html [ Failure ] @@ -3696,7 +3696,7 @@ crbug.com/591099 editing/selection/5232159.html [ Failure ] crbug.com/591099 editing/selection/5241148.html [ Failure ] crbug.com/591099 editing/selection/5354455-2.html [ Failure ] -crbug.com/591099 editing/selection/5794920-1.html [ Crash ] +crbug.com/591099 editing/selection/5794920-1.html [ Crash Pass ] crbug.com/591099 editing/selection/6476.html [ Failure ] crbug.com/591099 editing/selection/DOMSelection-DocumentType.html [ Failure ] crbug.com/591099 editing/selection/DOMSelection-crossing-document.html [ Failure ] @@ -3729,9 +3729,9 @@ crbug.com/591099 editing/selection/caret-rtl-right.html [ Failure ] crbug.com/591099 editing/selection/caret-rtl.html [ Failure ] crbug.com/591099 editing/selection/character-data-mutation-crash.html [ Failure ] -crbug.com/591099 editing/selection/clear-selection-crash.html [ Crash ] +crbug.com/591099 editing/selection/clear-selection-crash.html [ Crash Pass ] crbug.com/591099 editing/selection/clear-selection.html [ Failure ] -crbug.com/591099 editing/selection/cleared-by-relayout.html [ Crash ] +crbug.com/591099 editing/selection/cleared-by-relayout.html [ Crash Failure ] crbug.com/591099 editing/selection/click-after-nested-block.html [ Failure ] crbug.com/591099 editing/selection/click-in-focusable-link-should-not-clear-selection.html [ Failure ] crbug.com/591099 editing/selection/click-in-margins-inside-editable-div.html [ Failure ] @@ -3741,10 +3741,10 @@ crbug.com/591099 editing/selection/click-start-of-line.html [ Failure ] crbug.com/591099 editing/selection/collapse-null.html [ Failure ] crbug.com/591099 editing/selection/collapse-selection-in-bidi.html [ Failure ] -crbug.com/591099 editing/selection/collapse/collapse_before_select.html [ Crash ] -crbug.com/591099 editing/selection/collapse/table-caret-3.html [ Crash ] -crbug.com/591099 editing/selection/collapseto_in_text_fields.html [ Crash ] -crbug.com/591099 editing/selection/commit-pending-selection-crash.html [ Crash ] +crbug.com/591099 editing/selection/collapse/collapse_before_select.html [ Crash Pass ] +crbug.com/591099 editing/selection/collapse/table-caret-3.html [ Crash Pass ] +crbug.com/591099 editing/selection/collapseto_in_text_fields.html [ Crash Pass ] +crbug.com/591099 editing/selection/commit-pending-selection-crash.html [ Crash Pass ] crbug.com/591099 editing/selection/contains-boundaries.html [ Failure ] crbug.com/591099 editing/selection/contenteditable-click-inside.html [ Failure ] crbug.com/591099 editing/selection/context-menu-on-text.html [ Failure ] @@ -3754,8 +3754,8 @@ crbug.com/591099 editing/selection/css-pseudo-element-hang.html [ Failure ] crbug.com/591099 editing/selection/css-pseudo-element.html [ Failure ] crbug.com/591099 editing/selection/delete-word-granularity-text-control.html [ Crash Failure ] -crbug.com/591099 editing/selection/deleteFromDocument-scoped-dispatch-event-crash.html [ Crash ] -crbug.com/591099 editing/selection/deletefromdocument-shadow-leak.html [ Crash ] +crbug.com/591099 editing/selection/deleteFromDocument-scoped-dispatch-event-crash.html [ Crash Failure ] +crbug.com/591099 editing/selection/deletefromdocument-shadow-leak.html [ Crash Pass ] crbug.com/591099 editing/selection/designmode-no-caret.html [ Failure ] crbug.com/591099 editing/selection/directionality-after-undo-replace.html [ Crash Failure ] crbug.com/591099 editing/selection/display-table-text.html [ Failure ] @@ -3766,7 +3766,7 @@ crbug.com/591099 editing/selection/double_click_and_modify.html [ Failure ] crbug.com/591099 editing/selection/doubleclick-beside-cr-span.html [ Failure Timeout ] crbug.com/591099 editing/selection/doubleclick-inline-first-last-contenteditable.html [ Failure ] -crbug.com/591099 editing/selection/doubleclick-whitespace-img-crash.html [ Crash ] +crbug.com/591099 editing/selection/doubleclick-whitespace-img-crash.html [ Crash Pass ] crbug.com/591099 editing/selection/doubleclick-whitespace.html [ Crash Failure ] crbug.com/591099 editing/selection/doubleclick-with-split-text.html [ Crash Failure ] crbug.com/591099 editing/selection/drag-drop-events.html [ Crash Failure ] @@ -3779,9 +3779,9 @@ crbug.com/591099 editing/selection/drag-start-event-client-x-y.html [ Failure ] crbug.com/591099 editing/selection/drag-text-delay.html [ Crash Failure ] crbug.com/591099 editing/selection/drag-to-contenteditable-iframe.html [ Crash Failure ] -crbug.com/591099 editing/selection/drag_with_unfocused_selection.html [ Crash ] -crbug.com/591099 editing/selection/dump-as-markup-form-text.html [ Crash ] -crbug.com/591099 editing/selection/dump-as-markup.html [ Crash ] +crbug.com/591099 editing/selection/drag_with_unfocused_selection.html [ Crash Failure ] +crbug.com/591099 editing/selection/dump-as-markup-form-text.html [ Crash Pass ] +crbug.com/591099 editing/selection/dump-as-markup.html [ Crash Pass ] crbug.com/591099 editing/selection/editable-div-clear-on-keydown.html [ Failure ] crbug.com/591099 editing/selection/editable-links.html [ Failure ] crbug.com/591099 editing/selection/expanding-selections.html [ Failure ] @@ -3793,7 +3793,7 @@ crbug.com/591099 editing/selection/extend-forward-after-set-base-and-extent.html [ Failure ] crbug.com/591099 editing/selection/extend-inside-transforms-backward.html [ Failure ] crbug.com/591099 editing/selection/extend-inside-transforms-forward.html [ Failure ] -crbug.com/591099 editing/selection/extend-over-file-input-by-drag-crash.html [ Crash ] +crbug.com/591099 editing/selection/extend-over-file-input-by-drag-crash.html [ Crash Failure ] crbug.com/591099 editing/selection/extend-selection-after-double-click.html [ Failure ] crbug.com/591099 editing/selection/extend-selection-bidi.html [ Failure ] crbug.com/591099 editing/selection/extend-selection-character.html [ Timeout ] @@ -3801,24 +3801,24 @@ crbug.com/591099 editing/selection/extend-selection-word.html [ Timeout ] crbug.com/591099 editing/selection/extend-to-trailing-spaces.html [ Failure ] crbug.com/591099 editing/selection/find-in-text-control.html [ Crash Failure ] -crbug.com/591099 editing/selection/first-letter-selection-crash.html [ Crash ] +crbug.com/591099 editing/selection/first-letter-selection-crash.html [ Crash Pass ] crbug.com/591099 editing/selection/firstRect-crash.html [ Failure ] -crbug.com/591099 editing/selection/focus-and-display-none-and-redisplay.html [ Crash ] -crbug.com/591099 editing/selection/focus-and-display-none.html [ Crash ] +crbug.com/591099 editing/selection/focus-and-display-none-and-redisplay.html [ Crash Failure ] +crbug.com/591099 editing/selection/focus-and-display-none.html [ Crash Pass ] crbug.com/591099 editing/selection/focus-body.html [ Failure ] -crbug.com/591099 editing/selection/focus-contenteditable-iframe.html [ Crash ] -crbug.com/591099 editing/selection/focus-crash.html [ Crash ] +crbug.com/591099 editing/selection/focus-contenteditable-iframe.html [ Crash Pass ] +crbug.com/591099 editing/selection/focus-crash.html [ Crash Pass ] crbug.com/591099 editing/selection/focus-iframe-removal-crash.html [ Failure ] crbug.com/591099 editing/selection/focus_editable_html_element.html [ Timeout ] crbug.com/591099 editing/selection/hit-test-anonymous.html [ Failure ] crbug.com/591099 editing/selection/hit-test-on-text-with-line-height.html [ Failure ] crbug.com/591099 editing/selection/home-end.html [ Timeout ] -crbug.com/591099 editing/selection/iframe-select-animation.html [ Crash ] +crbug.com/591099 editing/selection/iframe-select-animation.html [ Crash Pass ] crbug.com/591099 editing/selection/inactive-selection.html [ Crash Failure ] crbug.com/591099 editing/selection/inline-closest-leaf-child.html [ Failure ] crbug.com/591099 editing/selection/internal-caret-rect.html [ Failure ] crbug.com/591099 editing/selection/keep-selection-after-set-focus.html [ Failure ] -crbug.com/591099 editing/selection/keydown-without-selection-crash.html [ Crash ] +crbug.com/591099 editing/selection/keydown-without-selection-crash.html [ Crash Pass ] crbug.com/591099 editing/selection/leave-requested-block.html [ Failure ] crbug.com/591099 editing/selection/legal-positions.html [ Crash Failure ] crbug.com/591099 editing/selection/line-wrap-1.html [ Failure ] @@ -3838,34 +3838,34 @@ crbug.com/591099 editing/selection/mixed-editability-inline-height.html [ Failure ] crbug.com/591099 editing/selection/modify-by-lineboundary-in-inline-editable-contexts.html [ Failure ] crbug.com/591099 editing/selection/modify-up-on-rtl-wrapping-text.html [ Failure ] -crbug.com/591099 editing/selection/modify_extend/extend_by_character.html [ Crash ] -crbug.com/591099 editing/selection/modify_extend/extend_selection_enclosing_block.html [ Crash ] +crbug.com/591099 editing/selection/modify_extend/extend_by_character.html [ Crash Failure ] +crbug.com/591099 editing/selection/modify_extend/extend_selection_enclosing_block.html [ Crash Failure ] crbug.com/591099 editing/selection/modify_move/move-by-character-001.html [ Failure ] -crbug.com/591099 editing/selection/modify_move/move-by-character-002.html [ Crash ] +crbug.com/591099 editing/selection/modify_move/move-by-character-002.html [ Crash Failure ] crbug.com/591099 editing/selection/modify_move/move-by-character-003.html [ Failure Pass ] -crbug.com/591099 editing/selection/modify_move/move-by-character-004.html [ Crash ] -crbug.com/591099 editing/selection/modify_move/move-by-character-crash-test-textarea.html [ Crash ] -crbug.com/591099 editing/selection/modify_move/move-by-word-visually-crash-test-1.html [ Crash ] -crbug.com/591099 editing/selection/modify_move/move-by-word-visually-crash-test-3.html [ Crash ] -crbug.com/591099 editing/selection/modify_move/move-by-word-visually-crash-test-css-generated-content.html [ Crash ] -crbug.com/591099 editing/selection/modify_move/move-by-word-visually-inline-block-positioned-element.html [ Crash ] +crbug.com/591099 editing/selection/modify_move/move-by-character-004.html [ Crash Failure ] +crbug.com/591099 editing/selection/modify_move/move-by-character-crash-test-textarea.html [ Crash Pass ] +crbug.com/591099 editing/selection/modify_move/move-by-word-visually-crash-test-1.html [ Crash Pass ] +crbug.com/591099 editing/selection/modify_move/move-by-word-visually-crash-test-3.html [ Crash Pass ] +crbug.com/591099 editing/selection/modify_move/move-by-word-visually-crash-test-css-generated-content.html [ Crash Pass ] +crbug.com/591099 editing/selection/modify_move/move-by-word-visually-inline-block-positioned-element.html [ Crash Pass ] crbug.com/591099 editing/selection/modify_move/move-by-word-visually-multi-line.html [ Crash Failure ] crbug.com/591099 editing/selection/modify_move/move-by-word-visually-multi-space.html [ Failure ] -crbug.com/591099 editing/selection/modify_move/move-by-word-visually-single-space-one-element.html [ Crash ] -crbug.com/591099 editing/selection/modify_move/move-by-word-visually-textarea.html [ Crash ] +crbug.com/591099 editing/selection/modify_move/move-by-word-visually-single-space-one-element.html [ Crash Pass ] +crbug.com/591099 editing/selection/modify_move/move-by-word-visually-textarea.html [ Crash Pass ] crbug.com/591099 editing/selection/modify_move/move-by-word-visually-wrong-left-right.html [ Failure ] -crbug.com/591099 editing/selection/modify_move/move_by_sentence_boundary.html [ Crash ] -crbug.com/591099 editing/selection/modify_move/move_character_across_iframe.html [ Crash ] -crbug.com/591099 editing/selection/modify_move/move_character_inline_table.html [ Crash ] -crbug.com/591099 editing/selection/modify_move/move_forward_character_button.html [ Crash ] +crbug.com/591099 editing/selection/modify_move/move_by_sentence_boundary.html [ Crash Failure ] +crbug.com/591099 editing/selection/modify_move/move_character_across_iframe.html [ Crash Failure ] +crbug.com/591099 editing/selection/modify_move/move_character_inline_table.html [ Crash Pass ] +crbug.com/591099 editing/selection/modify_move/move_forward_character_button.html [ Crash Pass ] crbug.com/591099 editing/selection/modify_move/move_forward_line_br.html [ Failure ] crbug.com/591099 editing/selection/modify_move/move_forward_line_range.html [ Failure Pass ] crbug.com/591099 editing/selection/modify_move/move_left_right_character_in_mixed_bidi.html [ Failure ] crbug.com/591099 editing/selection/mouse/click-left-of-rtl-wrapping-text.html [ Failure ] crbug.com/591099 editing/selection/mouse/click-user-select-all-contenteditable.html [ Failure ] -crbug.com/591099 editing/selection/mouse/click-user-select-all-textarea.html [ Crash ] +crbug.com/591099 editing/selection/mouse/click-user-select-all-textarea.html [ Crash Failure ] crbug.com/591099 editing/selection/mouse/drag-user-select-all-contenteditable.html [ Failure ] -crbug.com/591099 editing/selection/mouse/drag-user-select-all-textarea.html [ Crash ] +crbug.com/591099 editing/selection/mouse/drag-user-select-all-textarea.html [ Crash Failure ] crbug.com/591099 editing/selection/move-3875618-fix.html [ Failure ] crbug.com/591099 editing/selection/move-3875641-fix.html [ Failure ] crbug.com/591099 editing/selection/move-backwords-by-word-001.html [ Failure ] @@ -3908,7 +3908,7 @@ crbug.com/591099 editing/selection/select-bidi-run.html [ Failure Timeout ] crbug.com/591099 editing/selection/select-box.html [ Failure ] crbug.com/591099 editing/selection/select-element-paragraph-boundary.html [ Failure ] -crbug.com/591099 editing/selection/select-from-textfield-outwards.html [ Crash ] +crbug.com/591099 editing/selection/select-from-textfield-outwards.html [ Crash Pass ] crbug.com/591099 editing/selection/select-line-break-with-opposite-directionality.html [ Crash Failure ] crbug.com/591099 editing/selection/select-line.html [ Failure ] crbug.com/591099 editing/selection/select-missing-image.html [ Crash Failure ] @@ -3923,26 +3923,26 @@ crbug.com/591099 editing/selection/selectNode.html [ Crash Failure ] crbug.com/591099 editing/selection/selectNodeContents.html [ Crash Failure ] crbug.com/591099 editing/selection/select_all/select_all_contenteditable.html [ Failure ] -crbug.com/591099 editing/selection/select_all/select_all_iframe.html [ Crash ] -crbug.com/591099 editing/selection/select_all/select_all_iframe_crash.html [ Crash ] -crbug.com/591099 editing/selection/select_all/select_all_input.html [ Crash ] +crbug.com/591099 editing/selection/select_all/select_all_iframe.html [ Crash Pass ] +crbug.com/591099 editing/selection/select_all/select_all_iframe_crash.html [ Crash Pass ] +crbug.com/591099 editing/selection/select_all/select_all_input.html [ Crash Pass ] crbug.com/591099 editing/selection/select_all/select_all_overflow_hidden.html [ Failure ] crbug.com/591099 editing/selection/select_all/select_all_overflow_hidden_br.html [ Failure ] crbug.com/591099 editing/selection/select_all/select_all_overflow_hidden_table.html [ Failure ] -crbug.com/591099 editing/selection/select_all/select_all_readonly_textarea.html [ Crash ] -crbug.com/591099 editing/selection/select_all/select_all_textarea.html [ Crash ] +crbug.com/591099 editing/selection/select_all/select_all_readonly_textarea.html [ Crash Pass ] +crbug.com/591099 editing/selection/select_all/select_all_textarea.html [ Crash Pass ] crbug.com/591099 editing/selection/select_all/select_all_user_select_none.html [ Failure ] crbug.com/591099 editing/selection/selection-3748164-fix.html [ Failure ] crbug.com/591099 editing/selection/selection-background.html [ Failure ] crbug.com/591099 editing/selection/selection-button-text.html [ Failure ] -crbug.com/591099 editing/selection/selection-crash.html [ Crash ] +crbug.com/591099 editing/selection/selection-crash.html [ Crash Pass ] crbug.com/591099 editing/selection/selection-empty-documentElement.html [ Failure ] crbug.com/591099 editing/selection/selection-exceptions.html [ Failure ] crbug.com/591099 editing/selection/selection-extend-should-not-move-across-caret-on-mac.html [ Failure ] -crbug.com/591099 editing/selection/selection-forces-unrooted-repaint.html [ Crash ] +crbug.com/591099 editing/selection/selection-forces-unrooted-repaint.html [ Crash Pass ] crbug.com/591099 editing/selection/selection-invalid-offset.html [ Failure Pass ] -crbug.com/591099 editing/selection/selection-plugin-clear-crash.html [ Crash ] -crbug.com/591099 editing/selection/selectstart_detaches_frame.html [ Crash ] +crbug.com/591099 editing/selection/selection-plugin-clear-crash.html [ Crash Pass ] +crbug.com/591099 editing/selection/selectstart_detaches_frame.html [ Crash Pass ] crbug.com/591099 editing/selection/shift-click.html [ Crash Failure ] crbug.com/591099 editing/selection/shrink-selection-after-shift-pagedown.html [ Crash Failure ] crbug.com/591099 editing/selection/skip-non-editable-1.html [ Crash Failure ] @@ -3957,16 +3957,16 @@ crbug.com/591099 editing/selection/toString.html [ Crash Failure ] crbug.com/591099 editing/selection/transformed-selection-rects.html [ Failure ] crbug.com/591099 editing/selection/triple-click-in-pre.html [ Failure ] -crbug.com/591099 editing/selection/undo-crash.html [ Crash ] +crbug.com/591099 editing/selection/undo-crash.html [ Crash Pass ] crbug.com/591099 editing/selection/user-select-all-parsing.html [ Failure ] -crbug.com/591099 editing/selection/user-select-all-with-shift.html [ Crash ] -crbug.com/591099 editing/selection/user-select/user-select-all.html [ Crash ] +crbug.com/591099 editing/selection/user-select-all-with-shift.html [ Crash Failure ] +crbug.com/591099 editing/selection/user-select/user-select-all.html [ Crash Failure ] crbug.com/591099 editing/selection/vertical-lr-ltr-extend-line-backward-br.html [ Failure Pass ] crbug.com/591099 editing/selection/vertical-lr-ltr-extend-line-forward-br.html [ Failure Pass ] crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-backward-br.html [ Failure Pass ] -crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-backward-wrap.html [ Crash ] +crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-backward-wrap.html [ Crash Failure ] crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-forward-br.html [ Failure Pass ] -crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-forward-wrap.html [ Crash ] +crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-forward-wrap.html [ Crash Failure ] crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-backward-br.html [ Failure Pass ] crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-backward-p.html [ Failure ] crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-forward-br.html [ Failure Pass ] @@ -3998,17 +3998,17 @@ crbug.com/591099 editing/spelling/context_click_select_misspelling.html [ Crash Failure ] crbug.com/591099 editing/spelling/grammar-paste.html [ Failure ] crbug.com/591099 editing/spelling/mixed_paste.html [ Failure ] -crbug.com/591099 editing/spelling/no_marker_in_blurred_input.html [ Crash ] +crbug.com/591099 editing/spelling/no_marker_in_blurred_input.html [ Crash Pass ] crbug.com/591099 editing/spelling/spellcheck-async-mutation.html [ Failure ] -crbug.com/591099 editing/spelling/spellcheck-async-remove-frame.html [ Crash ] +crbug.com/591099 editing/spelling/spellcheck-async-remove-frame.html [ Crash Pass ] crbug.com/591099 editing/spelling/spellcheck-disable-enable.html [ Failure ] -crbug.com/591099 editing/spelling/spellcheck-editable-on-focus.html [ Crash ] +crbug.com/591099 editing/spelling/spellcheck-editable-on-focus.html [ Crash Pass ] crbug.com/591099 editing/spelling/spellcheck-input-search-crash.html [ Failure ] crbug.com/591099 editing/spelling/spellcheck-paste-disabled.html [ Failure ] crbug.com/591099 editing/spelling/spellcheck-paste.html [ Failure ] crbug.com/591099 editing/spelling/spellcheck-queue.html [ Failure ] -crbug.com/591099 editing/spelling/spellcheck-remove-markers.html [ Crash ] -crbug.com/591099 editing/spelling/spellcheck-sequencenum.html [ Crash ] +crbug.com/591099 editing/spelling/spellcheck-remove-markers.html [ Crash Pass ] +crbug.com/591099 editing/spelling/spellcheck-sequencenum.html [ Crash Failure ] crbug.com/591099 editing/spelling/spellcheck_test.html [ Crash Failure ] crbug.com/591099 editing/spelling/spelling-backward.html [ Failure ] crbug.com/591099 editing/spelling/spelling-changed-text.html [ Failure ] @@ -4018,12 +4018,12 @@ crbug.com/591099 editing/style/5065910.html [ Failure ] crbug.com/591099 editing/style/5084241.html [ Failure ] crbug.com/591099 editing/style/5228141.html [ Failure ] -crbug.com/591099 editing/style/5279521.html [ Crash ] +crbug.com/591099 editing/style/5279521.html [ Crash Failure ] crbug.com/591099 editing/style/apply-font-size-to-multiple-nodes.html [ Failure ] -crbug.com/591099 editing/style/apply-style-atomic.html [ Crash ] -crbug.com/591099 editing/style/apply-style-crash.html [ Crash ] -crbug.com/591099 editing/style/apply-style-crash2.html [ Crash ] -crbug.com/591099 editing/style/apply-style-crash3.html [ Crash ] +crbug.com/591099 editing/style/apply-style-atomic.html [ Crash Pass ] +crbug.com/591099 editing/style/apply-style-crash.html [ Crash Pass ] +crbug.com/591099 editing/style/apply-style-crash2.html [ Crash Pass ] +crbug.com/591099 editing/style/apply-style-crash3.html [ Crash Failure ] crbug.com/591099 editing/style/apply-through-end-of-document.html [ Failure ] crbug.com/591099 editing/style/background-color-retained.html [ Failure ] crbug.com/591099 editing/style/block-style-001.html [ Failure ] @@ -4031,7 +4031,7 @@ crbug.com/591099 editing/style/block-style-003.html [ Failure ] crbug.com/591099 editing/style/block-styles-007.html [ Failure ] crbug.com/591099 editing/style/designmode.html [ Failure ] -crbug.com/591099 editing/style/fix-range-from-root-editable-crash.html [ Crash ] +crbug.com/591099 editing/style/fix-range-from-root-editable-crash.html [ Crash Pass ] crbug.com/591099 editing/style/font-face-unquote.html [ Failure ] crbug.com/591099 editing/style/font-family-with-space.html [ Failure ] crbug.com/591099 editing/style/fontsize-1.html [ Crash Failure ] @@ -4060,32 +4060,32 @@ crbug.com/591099 editing/style/text-decoration-state.html [ Failure ] crbug.com/591099 editing/style/textdecoration-outside-of-rooteditable.html [ Crash Failure ] crbug.com/591099 editing/style/textdecoration-outside-of-unsplittable-element.html [ Crash Failure ] -crbug.com/591099 editing/style/typing_style.html [ Crash ] -crbug.com/591099 editing/style/unbold-in-bold.html [ Crash ] +crbug.com/591099 editing/style/typing_style.html [ Crash Failure ] +crbug.com/591099 editing/style/unbold-in-bold.html [ Crash Failure ] crbug.com/591099 editing/surrounding-text/surrounding-text-detached-no-crash.html [ Failure ] -crbug.com/591099 editing/surrounding-text/surrounding-text.html [ Crash ] +crbug.com/591099 editing/surrounding-text/surrounding-text.html [ Crash Failure ] crbug.com/591099 editing/text-iterator/basic-iteration-shadowdom.html [ Failure ] crbug.com/591099 editing/text-iterator/basic-iteration.html [ Crash Failure ] crbug.com/591099 editing/text-iterator/findString-shadow-roots.html [ Failure ] crbug.com/591099 editing/text-iterator/findString-start-search-after-selection.html [ Failure Pass ] crbug.com/591099 editing/text-iterator/findString.html [ Crash Timeout ] crbug.com/591099 editing/text-iterator/first-letter-rtl-crash.html [ Failure Pass ] -crbug.com/591099 editing/text-iterator/first-letter-word-boundary.html [ Crash ] +crbug.com/591099 editing/text-iterator/first-letter-word-boundary.html [ Crash Failure ] crbug.com/591099 editing/text-iterator/range-to-from-location-and-length.html [ Failure ] -crbug.com/591099 editing/text-iterator/selection-to-string-with-auto-fill.html [ Crash ] +crbug.com/591099 editing/text-iterator/selection-to-string-with-auto-fill.html [ Crash Pass ] crbug.com/591099 editing/text-iterator/thai-cursor-movement.html [ Crash Failure ] crbug.com/591099 editing/undo/5658727.html [ Failure ] crbug.com/591099 editing/undo/5738768.html [ Failure ] -crbug.com/591099 editing/undo/audio-in-undo-stack-crash.html [ Crash ] +crbug.com/591099 editing/undo/audio-in-undo-stack-crash.html [ Crash Pass ] crbug.com/591099 editing/undo/crash-redo-with-iframes.html [ Failure ] -crbug.com/591099 editing/undo/orphaned-selection-crash-bug32823-2.html [ Crash ] -crbug.com/591099 editing/undo/orphaned-selection-crash-bug32823-4.html [ Crash ] +crbug.com/591099 editing/undo/orphaned-selection-crash-bug32823-2.html [ Crash Pass ] +crbug.com/591099 editing/undo/orphaned-selection-crash-bug32823-4.html [ Crash Pass ] crbug.com/591099 editing/undo/paste_with_mutation_event_undo_order.html [ Failure ] -crbug.com/591099 editing/undo/redo_correct_selection.html [ Crash ] -crbug.com/591099 editing/undo/undo-after-removing-iframe.html [ Crash ] +crbug.com/591099 editing/undo/redo_correct_selection.html [ Crash Pass ] +crbug.com/591099 editing/undo/undo-after-removing-iframe.html [ Crash Pass ] crbug.com/591099 editing/undo/undo-after-setting-value.html [ Crash Failure ] crbug.com/591099 editing/undo/undo-deleteWord.html [ Failure Pass ] -crbug.com/591099 editing/undo/undo-iframe-location-change.html [ Crash ] +crbug.com/591099 editing/undo/undo-iframe-location-change.html [ Crash Pass ] crbug.com/591099 editing/undo/undo-set-selection-crash.html [ Failure ] crbug.com/591099 editing/undo/undo-smart-delete-reversed-selection.html [ Failure Pass ] crbug.com/591099 editing/unsupported-content/list-delete-001.html [ Crash Failure ] @@ -4097,23 +4097,23 @@ crbug.com/591099 editing/unsupported-content/table-delete-003.html [ Failure ] crbug.com/591099 editing/unsupported-content/table-type-after.html [ Failure ] crbug.com/591099 editing/unsupported-content/table-type-before.html [ Failure ] -crbug.com/591099 external/wpt/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.emptysrc.html [ Crash ] +crbug.com/591099 external/wpt/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.emptysrc.html [ Crash Pass ] crbug.com/591099 external/wpt/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.removedsrc.html [ Crash Pass ] crbug.com/591099 external/wpt/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.html [ Crash Pass ] -crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/canvas_focus_drawCustomFocusRing_001.html [ Crash ] -crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_001.html [ Crash ] -crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_002.html [ Crash ] -crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_003.html [ Crash ] -crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_004.html [ Crash ] -crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_005.html [ Crash ] +crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/canvas_focus_drawCustomFocusRing_001.html [ Crash Pass ] +crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_001.html [ Crash Pass ] +crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_002.html [ Crash Pass ] +crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_003.html [ Crash Pass ] +crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_004.html [ Crash Pass ] +crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_005.html [ Crash Pass ] crbug.com/591099 external/wpt/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.emptysrc.html [ Crash Pass ] -crbug.com/591099 external/wpt/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.removedsrc.html [ Crash ] -crbug.com/591099 external/wpt/2dcontext/hit-regions/hitregions-members-exist.html [ Crash ] -crbug.com/591099 external/wpt/2dcontext/line-styles/setLineDash.html [ Crash ] -crbug.com/591099 external/wpt/FileAPI/idlharness.html [ Crash ] -crbug.com/591099 external/wpt/FileAPI/url/blob-url-in-sandboxed-iframe.html [ Crash ] -crbug.com/591099 external/wpt/FileAPI/url/multi-global-origin-serialization.sub.html [ Crash ] -crbug.com/591099 external/wpt/FileAPI/url/origin.sub.html [ Crash ] +crbug.com/591099 external/wpt/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.removedsrc.html [ Crash Pass ] +crbug.com/591099 external/wpt/2dcontext/hit-regions/hitregions-members-exist.html [ Crash Pass ] +crbug.com/591099 external/wpt/2dcontext/line-styles/setLineDash.html [ Crash Pass ] +crbug.com/591099 external/wpt/FileAPI/idlharness.html [ Crash Pass ] +crbug.com/591099 external/wpt/FileAPI/url/blob-url-in-sandboxed-iframe.html [ Crash Pass ] +crbug.com/591099 external/wpt/FileAPI/url/multi-global-origin-serialization.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/FileAPI/url/origin.sub.html [ Crash Pass ] crbug.com/591099 external/wpt/WebCryptoAPI/derive_bits_keys/test_hkdf.https.html [ Pass Timeout ] crbug.com/591099 external/wpt/WebCryptoAPI/derive_bits_keys/test_pbkdf2_empty_empty.https.html [ Pass Timeout ] crbug.com/591099 external/wpt/WebCryptoAPI/derive_bits_keys/test_pbkdf2_empty_long.https.html [ Pass Timeout ] @@ -4131,61 +4131,61 @@ crbug.com/591099 external/wpt/WebCryptoAPI/import_export/test_rsa_importKey.https.html [ Pass Timeout ] crbug.com/591099 external/wpt/WebCryptoAPI/import_export/test_symmetric_importKey.https.html [ Pass Timeout ] crbug.com/591099 external/wpt/WebIDL/ecmascript-binding/has-instance.html [ Crash Pass ] -crbug.com/591099 external/wpt/WebIDL/ecmascript-binding/sequence-conversion.html [ Crash ] -crbug.com/591099 external/wpt/XMLHttpRequest/open-url-multi-window-2.htm [ Crash ] -crbug.com/591099 external/wpt/XMLHttpRequest/open-url-multi-window-3.htm [ Crash ] -crbug.com/591099 external/wpt/XMLHttpRequest/open-url-multi-window-4.htm [ Crash ] +crbug.com/591099 external/wpt/WebIDL/ecmascript-binding/sequence-conversion.html [ Crash Pass ] +crbug.com/591099 external/wpt/XMLHttpRequest/open-url-multi-window-2.htm [ Crash Pass ] +crbug.com/591099 external/wpt/XMLHttpRequest/open-url-multi-window-3.htm [ Crash Pass ] +crbug.com/591099 external/wpt/XMLHttpRequest/open-url-multi-window-4.htm [ Crash Pass ] crbug.com/591099 external/wpt/XMLHttpRequest/send-authentication-prompt-2-manual.htm [ Crash Failure ] -crbug.com/591099 external/wpt/XMLHttpRequest/xmlhttprequest-sync-block-defer-scripts.html [ Crash ] -crbug.com/591099 external/wpt/XMLHttpRequest/xmlhttprequest-sync-not-hang-scriptloader.html [ Crash ] -crbug.com/591099 external/wpt/clear-site-data/navigation-insecure.html [ Crash ] -crbug.com/591099 external/wpt/clear-site-data/navigation.https.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-about-blank-allowed-by-default.sub.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-about-blank-allowed-by-scheme.sub.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-allowed.sub.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-blocked.sub.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-conflicting-frame-src.sub.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-cross-origin-load.sub.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-redirect-blocked.sub.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/allow_csp_from-header.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/required_csp-header.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-general.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-hashes.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-hosts.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-paths.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-ports.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-protocols.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-nonces.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-none.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-self.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-strict_dynamic.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_eval.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_hashed_attributes.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_inline.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/frame-ancestors/frame-ancestors-overrides-xfo.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/frame-src/frame-src-redirect.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/generic/no-default-src.sub.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-full-host-wildcard-blocked.sub.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-host-partial-wildcard-allowed.sub.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-none-blocks.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-port-wildcard-allowed.sub.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-wildcard-allowed.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/meta/meta-img-src.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/meta/meta-modified.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/navigation/to-javascript-url-frame-src.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/navigation/to-javascript-url-script-src.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/nonce-hiding/svgscript-nonces-hidden-meta.tentative.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/nonce-hiding/svgscript-nonces-hidden.tentative.html [ Crash ] +crbug.com/591099 external/wpt/XMLHttpRequest/xmlhttprequest-sync-block-defer-scripts.html [ Crash Pass ] +crbug.com/591099 external/wpt/XMLHttpRequest/xmlhttprequest-sync-not-hang-scriptloader.html [ Crash Pass ] +crbug.com/591099 external/wpt/clear-site-data/navigation-insecure.html [ Crash Pass ] +crbug.com/591099 external/wpt/clear-site-data/navigation.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-about-blank-allowed-by-default.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-about-blank-allowed-by-scheme.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-allowed.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-blocked.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-conflicting-frame-src.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-cross-origin-load.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-redirect-blocked.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/allow_csp_from-header.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/required_csp-header.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-general.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-hashes.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-hosts.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-paths.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-ports.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-protocols.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-nonces.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-none.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-self.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-strict_dynamic.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_eval.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_hashed_attributes.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_inline.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/frame-ancestors/frame-ancestors-overrides-xfo.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/frame-src/frame-src-redirect.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/generic/no-default-src.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-full-host-wildcard-blocked.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-host-partial-wildcard-allowed.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-none-blocks.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-port-wildcard-allowed.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-wildcard-allowed.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/meta/meta-img-src.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/meta/meta-modified.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/navigation/to-javascript-url-frame-src.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/navigation/to-javascript-url-script-src.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/nonce-hiding/svgscript-nonces-hidden-meta.tentative.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/nonce-hiding/svgscript-nonces-hidden.tentative.html [ Crash Pass ] crbug.com/591099 external/wpt/content-security-policy/script-src/script-src-1_2.html [ Crash Pass ] -crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/img-src-redirect-upgrade-reporting.https.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/script-sample-no-opt-in.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/script-sample.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/upgrade-insecure-requests-reporting.https.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/svg/object-in-svg-foreignobject.sub.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/svg/svg-from-guid.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/svg/svg-policy-resource-doc-includes.html [ Crash ] -crbug.com/591099 external/wpt/content-security-policy/svg/svg-policy-with-resource.html [ Crash ] -crbug.com/591099 external/wpt/cors/remote-origin.htm [ Crash ] +crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/img-src-redirect-upgrade-reporting.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/script-sample-no-opt-in.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/script-sample.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/upgrade-insecure-requests-reporting.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/svg/object-in-svg-foreignobject.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/svg/svg-from-guid.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/svg/svg-policy-resource-doc-includes.html [ Crash Pass ] +crbug.com/591099 external/wpt/content-security-policy/svg/svg-policy-with-resource.html [ Crash Pass ] +crbug.com/591099 external/wpt/cors/remote-origin.htm [ Crash Pass ] crbug.com/591099 external/wpt/css-paint-api/geometry-background-image-001.html [ Failure Pass ] crbug.com/591099 external/wpt/css-paint-api/geometry-background-image-002.html [ Failure Pass ] crbug.com/591099 external/wpt/css-paint-api/geometry-background-image-003.html [ Failure Pass ] @@ -4392,7 +4392,7 @@ crbug.com/591099 external/wpt/css/css-display-3/display-contents-dynamic-list-001-none.html [ Failure ] crbug.com/591099 external/wpt/css/css-display-3/display-contents-dynamic-multicol-001-inline.html [ Failure ] crbug.com/591099 external/wpt/css/css-display-3/display-contents-dynamic-multicol-001-none.html [ Failure ] -crbug.com/591099 external/wpt/css/css-display-3/display-contents-dynamic-table-001-inline.html [ Crash ] +crbug.com/591099 external/wpt/css/css-display-3/display-contents-dynamic-table-001-inline.html [ Crash Failure ] crbug.com/591099 external/wpt/css/css-display-3/display-contents-list-001.html [ Failure ] crbug.com/591099 external/wpt/css/css-display-3/display-contents-multicol-001.html [ Failure ] crbug.com/591099 external/wpt/css/css-display-3/display-flow-root-001.html [ Failure ] @@ -4601,54 +4601,54 @@ crbug.com/591099 external/wpt/css/css-grid-1/abspos/positioned-grid-items-015.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid-1/abspos/positioned-grid-items-016.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid-1/abspos/positioned-grid-items-017.html [ Failure ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-001.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-002.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-003.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-004.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-005.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-006.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-007.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-008.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-009.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-010.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-011.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-012.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-013.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-014.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-015.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-016.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-001.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-002.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-003.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-004.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-005.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-006.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-007.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-008.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-009.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-010.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-011.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-012.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-013.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-014.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-015.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-016.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-001.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-002.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-003.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-004.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-005.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-006.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-007.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-008.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-009.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-010.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-011.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-012.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-013.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-014.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-015.html [ Crash ] -crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-016.html [ Crash ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-001.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-002.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-003.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-004.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-005.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-006.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-007.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-008.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-009.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-010.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-011.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-012.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-013.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-014.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-015.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-016.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-001.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-002.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-003.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-004.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-005.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-006.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-007.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-008.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-009.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-010.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-011.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-012.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-013.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-014.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-015.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-016.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-001.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-002.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-003.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-004.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-005.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-006.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-007.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-008.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-009.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-010.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-011.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-012.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-013.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-014.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-015.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-016.html [ Crash Pass ] crbug.com/591099 external/wpt/css/css-grid-1/grid-definition/fr-unit-with-percentage.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid-1/grid-definition/fr-unit.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid-1/grid-items/grid-inline-z-axis-ordering-overlapped-items-006.html [ Failure ] @@ -4659,7 +4659,7 @@ crbug.com/591099 external/wpt/css/css-grid-1/grid-items/grid-z-axis-ordering-overlapped-items-006.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid-1/grid-model/grid-inline-margins-no-collapse-001.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid-1/grid-model/grid-margins-no-collapse-001.html [ Failure ] -crbug.com/591099 external/wpt/css/css-grid-1/grid-model/grid-support-display-001.html [ Crash ] +crbug.com/591099 external/wpt/css/css-grid-1/grid-model/grid-support-display-001.html [ Crash Pass ] crbug.com/591099 external/wpt/css/css-position-3/position-sticky-table-th-left.html [ Failure Pass ] crbug.com/591099 external/wpt/css/css-position-3/position-sticky-table-th-right.html [ Failure Pass ] crbug.com/591099 external/wpt/css/css-rhythm-1/line-height-step-basic-001.html [ Failure ] @@ -4790,11 +4790,11 @@ crbug.com/591099 external/wpt/css/css-ui-3/box-sizing-009.html [ Failure ] crbug.com/591099 external/wpt/css/css-ui-3/box-sizing-010.html [ Failure Pass ] crbug.com/591099 external/wpt/css/css-ui-3/box-sizing-020.html [ Failure Pass ] -crbug.com/591099 external/wpt/css/css-ui-3/caret-color-013.html [ Crash ] -crbug.com/591099 external/wpt/css/css-ui-3/caret-color-018.html [ Crash ] -crbug.com/591099 external/wpt/css/css-ui-3/caret-color-019.html [ Crash ] -crbug.com/591099 external/wpt/css/css-ui-3/caret-color-020.html [ Crash ] -crbug.com/591099 external/wpt/css/css-ui-3/caret-color-021.html [ Crash ] +crbug.com/591099 external/wpt/css/css-ui-3/caret-color-013.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-ui-3/caret-color-018.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-ui-3/caret-color-019.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-ui-3/caret-color-020.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-ui-3/caret-color-021.html [ Crash Pass ] crbug.com/591099 external/wpt/css/css-ui-3/outline-004.html [ Failure Pass ] crbug.com/591099 external/wpt/css/css-ui-3/outline-011.html [ Failure ] crbug.com/591099 external/wpt/css/css-ui-3/outline-019.html [ Failure ] @@ -5077,14 +5077,14 @@ crbug.com/591099 external/wpt/css/css-writing-modes-3/normal-flow-overconstrained-vrl-004.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/ortho-htb-alongside-vrl-floats-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/ortho-htb-alongside-vrl-floats-010.xht [ Failure ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001a.html [ Crash ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001b.html [ Crash ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001c.html [ Crash ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001d.html [ Crash ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001e.html [ Crash ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001f.html [ Crash ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001g.html [ Crash ] -crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001h.html [ Crash ] +crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001a.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001b.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001c.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001d.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001e.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001f.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001g.html [ Crash Failure ] +crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001h.html [ Crash Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001i.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001k.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001l.html [ Crash Failure ] @@ -5199,9 +5199,9 @@ crbug.com/591099 external/wpt/css/css-writing-modes-3/writing-mode-vertical-rl-002.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes-3/writing-mode-vertical-rl-003.htm [ Failure ] crbug.com/591099 external/wpt/css/geometry-1/interfaces.html [ Timeout ] -crbug.com/591099 external/wpt/css/selectors4/focus-display-none-001.html [ Crash ] -crbug.com/591099 external/wpt/css/selectors4/focus-within-009.html [ Crash ] -crbug.com/591099 external/wpt/css/selectors4/focus-within-display-none-001.html [ Crash ] +crbug.com/591099 external/wpt/css/selectors4/focus-display-none-001.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/selectors4/focus-within-009.html [ Crash Pass ] +crbug.com/591099 external/wpt/css/selectors4/focus-within-display-none-001.html [ Crash Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001a.xhtml [ Crash Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-baseline-horiz-002.xhtml [ Failure Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-baseline-horiz-003.xhtml [ Failure Pass ] @@ -5253,49 +5253,49 @@ crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-006.html [ Crash Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-007.html [ Crash Failure Pass ] crbug.com/591099 external/wpt/cssom-view/cssom-getClientRects-002.html [ Failure ] -crbug.com/591099 external/wpt/cssom-view/elementFromPoint.html [ Crash ] -crbug.com/591099 external/wpt/cssom-view/elementsFromPoint.html [ Crash ] -crbug.com/591099 external/wpt/cssom-view/scrolling-quirks-vs-nonquirks.html [ Crash ] -crbug.com/591099 external/wpt/cssom-view/scrollingElement.html [ Crash ] -crbug.com/591099 external/wpt/cssom-view/ttwf-js-cssomview-getclientrects-length.html [ Crash ] +crbug.com/591099 external/wpt/cssom-view/elementFromPoint.html [ Crash Failure ] +crbug.com/591099 external/wpt/cssom-view/elementsFromPoint.html [ Crash Failure ] +crbug.com/591099 external/wpt/cssom-view/scrolling-quirks-vs-nonquirks.html [ Crash Pass ] +crbug.com/591099 external/wpt/cssom-view/scrollingElement.html [ Crash Pass ] +crbug.com/591099 external/wpt/cssom-view/ttwf-js-cssomview-getclientrects-length.html [ Crash Pass ] crbug.com/591099 external/wpt/cssom/serialize-values.html [ Pass Timeout ] -crbug.com/591099 external/wpt/custom-elements/custom-element-reaction-queue.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/custom-element-registry/per-global.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/htmlconstructor/newtarget.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/reactions/Document.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/reactions/HTMLAnchorElement.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/reactions/HTMLOptionElement.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/reactions/HTMLOptionsCollection.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/reactions/HTMLOutputElement.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/reactions/HTMLSelectElement.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTableElement.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTableRowElement.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTableSectionElement.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTitleElement.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/reactions/ShadowRoot.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/upgrading/Node-cloneNode.html [ Crash ] -crbug.com/591099 external/wpt/custom-elements/upgrading/upgrading-enqueue-reactions.html [ Crash ] -crbug.com/591099 external/wpt/dom/events/EventListener-incumbent-global-1.sub.html [ Crash ] -crbug.com/591099 external/wpt/dom/events/EventListener-incumbent-global-2.sub.html [ Crash ] +crbug.com/591099 external/wpt/custom-elements/custom-element-reaction-queue.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/custom-element-registry/per-global.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/htmlconstructor/newtarget.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/reactions/Document.html [ Crash Failure ] +crbug.com/591099 external/wpt/custom-elements/reactions/HTMLAnchorElement.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/reactions/HTMLOptionElement.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/reactions/HTMLOptionsCollection.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/reactions/HTMLOutputElement.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/reactions/HTMLSelectElement.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTableElement.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTableRowElement.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTableSectionElement.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTitleElement.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/reactions/ShadowRoot.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/upgrading/Node-cloneNode.html [ Crash Pass ] +crbug.com/591099 external/wpt/custom-elements/upgrading/upgrading-enqueue-reactions.html [ Crash Pass ] +crbug.com/591099 external/wpt/dom/events/EventListener-incumbent-global-1.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/dom/events/EventListener-incumbent-global-2.sub.html [ Crash Pass ] crbug.com/591099 external/wpt/dom/interfaces.html [ Pass Timeout ] crbug.com/591099 external/wpt/dom/nodes/DOMImplementation-createDocument.html [ Pass Timeout ] -crbug.com/591099 external/wpt/dom/nodes/Document-URL.sub.html [ Crash ] -crbug.com/591099 external/wpt/dom/nodes/Document-createElement-namespace.html [ Crash ] +crbug.com/591099 external/wpt/dom/nodes/Document-URL.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/dom/nodes/Document-createElement-namespace.html [ Crash Pass ] crbug.com/591099 external/wpt/dom/nodes/Document-createElementNS.html [ Pass Timeout ] -crbug.com/591099 external/wpt/dom/nodes/Element-children.html [ Crash ] +crbug.com/591099 external/wpt/dom/nodes/Element-children.html [ Crash Pass ] crbug.com/591099 external/wpt/dom/nodes/Element-classlist.html [ Pass Timeout ] -crbug.com/591099 external/wpt/dom/nodes/Element-getElementsByTagName-change-document-HTMLNess.html [ Crash ] -crbug.com/591099 external/wpt/dom/nodes/Element-hasAttributes.html [ Crash ] +crbug.com/591099 external/wpt/dom/nodes/Element-getElementsByTagName-change-document-HTMLNess.html [ Crash Pass ] +crbug.com/591099 external/wpt/dom/nodes/Element-hasAttributes.html [ Crash Pass ] crbug.com/591099 external/wpt/dom/nodes/Element-matches.html [ Crash Failure Pass Timeout ] crbug.com/591099 external/wpt/dom/nodes/Element-webkitMatchesSelector.html [ Crash Failure Pass Timeout ] crbug.com/591099 external/wpt/dom/nodes/Node-compareDocumentPosition.html [ Pass Timeout ] -crbug.com/591099 external/wpt/dom/nodes/Node-contains-xml.xml [ Crash ] +crbug.com/591099 external/wpt/dom/nodes/Node-contains-xml.xml [ Crash Pass ] crbug.com/591099 external/wpt/dom/nodes/Node-contains.html [ Pass Timeout ] -crbug.com/591099 external/wpt/dom/nodes/Node-parentNode.html [ Crash ] +crbug.com/591099 external/wpt/dom/nodes/Node-parentNode.html [ Crash Pass ] crbug.com/591099 external/wpt/dom/nodes/Node-properties.html [ Pass Timeout ] crbug.com/591099 external/wpt/dom/nodes/ParentNode-querySelector-All-xht.xht [ Crash Pass Timeout ] crbug.com/591099 external/wpt/dom/nodes/ParentNode-querySelector-All.html [ Crash Pass Timeout ] -crbug.com/591099 external/wpt/dom/nodes/getElementsByClassName-30.htm [ Crash ] +crbug.com/591099 external/wpt/dom/nodes/getElementsByClassName-30.htm [ Crash Pass ] crbug.com/591099 external/wpt/dom/ranges/Range-compareBoundaryPoints.html [ Timeout ] crbug.com/591099 external/wpt/dom/ranges/Range-comparePoint.html [ Pass Timeout ] crbug.com/591099 external/wpt/dom/ranges/Range-insertNode.html [ Pass Timeout ] @@ -5308,21 +5308,21 @@ crbug.com/591099 external/wpt/dom/traversal/NodeIterator.html [ Pass Timeout ] crbug.com/591099 external/wpt/dom/traversal/TreeWalker.html [ Pass Timeout ] crbug.com/591099 external/wpt/domxpath/xml_xpath_runner.html [ Pass Timeout ] -crbug.com/591099 external/wpt/editing/event.html [ Crash ] -crbug.com/591099 external/wpt/editing/other/extra-text-nodes.html [ Crash ] -crbug.com/591099 external/wpt/editing/other/restoration.html [ Crash ] +crbug.com/591099 external/wpt/editing/event.html [ Crash Pass ] +crbug.com/591099 external/wpt/editing/other/extra-text-nodes.html [ Crash Pass ] +crbug.com/591099 external/wpt/editing/other/restoration.html [ Crash Pass ] crbug.com/591099 external/wpt/editing/run/backcolor.html [ Pass Timeout ] crbug.com/591099 external/wpt/editing/run/bold.html [ Pass Timeout ] crbug.com/591099 external/wpt/editing/run/fontname.html [ Pass Timeout ] crbug.com/591099 external/wpt/editing/run/fontsize.html [ Pass Timeout ] crbug.com/591099 external/wpt/editing/run/forecolor.html [ Pass Timeout ] crbug.com/591099 external/wpt/editing/run/formatblock.html [ Crash Failure Timeout ] -crbug.com/591099 external/wpt/editing/run/forwarddelete.html [ Crash ] +crbug.com/591099 external/wpt/editing/run/forwarddelete.html [ Crash Timeout ] crbug.com/591099 external/wpt/editing/run/hilitecolor.html [ Pass Timeout ] crbug.com/591099 external/wpt/editing/run/indent.html [ Crash Timeout ] -crbug.com/591099 external/wpt/editing/run/inserthorizontalrule.html [ Crash ] +crbug.com/591099 external/wpt/editing/run/inserthorizontalrule.html [ Crash Timeout ] crbug.com/591099 external/wpt/editing/run/inserthtml.html [ Crash Failure Timeout ] -crbug.com/591099 external/wpt/editing/run/insertimage.html [ Crash ] +crbug.com/591099 external/wpt/editing/run/insertimage.html [ Crash Timeout ] crbug.com/591099 external/wpt/editing/run/insertlinebreak.html [ Crash Failure Timeout ] crbug.com/591099 external/wpt/editing/run/insertorderedlist.html [ Crash Timeout ] crbug.com/591099 external/wpt/editing/run/insertparagraph.html [ Crash Failure Timeout ] @@ -5332,9 +5332,9 @@ crbug.com/591099 external/wpt/editing/run/justifyfull.html [ Pass Timeout ] crbug.com/591099 external/wpt/editing/run/justifyleft.html [ Pass Timeout ] crbug.com/591099 external/wpt/editing/run/justifyright.html [ Pass Timeout ] -crbug.com/591099 external/wpt/editing/run/multitest.html [ Crash ] +crbug.com/591099 external/wpt/editing/run/multitest.html [ Crash Timeout ] crbug.com/591099 external/wpt/editing/run/outdent.html [ Crash Timeout ] -crbug.com/591099 external/wpt/editing/run/removeformat.html [ Crash ] +crbug.com/591099 external/wpt/editing/run/removeformat.html [ Crash Timeout ] crbug.com/591099 external/wpt/editing/run/strikethrough.html [ Pass Timeout ] crbug.com/591099 external/wpt/editing/run/subscript.html [ Pass Timeout ] crbug.com/591099 external/wpt/editing/run/superscript.html [ Pass Timeout ] @@ -5410,90 +5410,90 @@ crbug.com/591099 external/wpt/encoding/legacy-mb-tchinese/big5/big5-encode-href-errors-misc.html [ Timeout ] crbug.com/591099 external/wpt/encoding/legacy-mb-tchinese/big5/big5-encode-href.html [ Timeout ] crbug.com/591099 external/wpt/encoding/textdecoder-fatal-single-byte.html [ Timeout ] -crbug.com/591099 external/wpt/eventsource/eventsource-onmessage-realm.htm [ Crash ] -crbug.com/591099 external/wpt/fetch/api/request/multi-globals/url-parsing.html [ Crash ] -crbug.com/591099 external/wpt/fetch/api/response/multi-globals/url-parsing.html [ Crash ] -crbug.com/591099 external/wpt/fetch/security/dangling-markup-mitigation.tentative.html [ Crash ] -crbug.com/591099 external/wpt/fetch/security/embedded-credentials.tentative.sub.html [ Crash ] -crbug.com/591099 external/wpt/fullscreen/api/element-request-fullscreen-and-remove-iframe-manual.html [ Crash ] -crbug.com/591099 external/wpt/fullscreen/model/move-to-iframe-manual.html [ Crash ] +crbug.com/591099 external/wpt/eventsource/eventsource-onmessage-realm.htm [ Crash Pass ] +crbug.com/591099 external/wpt/fetch/api/request/multi-globals/url-parsing.html [ Crash Pass ] +crbug.com/591099 external/wpt/fetch/api/response/multi-globals/url-parsing.html [ Crash Pass ] +crbug.com/591099 external/wpt/fetch/security/dangling-markup-mitigation.tentative.html [ Crash Pass ] +crbug.com/591099 external/wpt/fetch/security/embedded-credentials.tentative.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/fullscreen/api/element-request-fullscreen-and-remove-iframe-manual.html [ Crash Pass ] +crbug.com/591099 external/wpt/fullscreen/model/move-to-iframe-manual.html [ Crash Pass ] crbug.com/591099 external/wpt/html-media-capture/capture_audio_cancel-manual.html [ Crash Failure ] crbug.com/591099 external/wpt/html-media-capture/capture_image_cancel-manual.html [ Crash Failure ] crbug.com/591099 external/wpt/html-media-capture/capture_video_cancel-manual.html [ Crash Failure ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-cross-origin.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/003.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/004.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/006.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/014.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/empty_fragment.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-query-fragment-components.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-form-submit.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin-fragment.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/002.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/003.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/004.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/005.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/history/joint-session-history/joint-session-history-only-fully-active.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-cross-origin-domain.sub.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-cross-origin.sub.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-goes-cross-origin-domain.sub.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-same-origin-domain.sub.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/origin/origin-of-data-document.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter_null.tentative.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter_srcdoc.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/the-window-object/garbage-collection-and-browsing-contexts/discard_iframe_history_3.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/the-window-object/garbage-collection-and-browsing-contexts/discard_iframe_history_4.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-cross-origin-domain.sub.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-cross-origin.sub.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-goes-cross-origin-domain.sub.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-same-origin-domain.sub.html [ Crash ] -crbug.com/591099 external/wpt/html/browsers/windows/noreferrer-window-name.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.forms.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-namespace.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-newelements-xhtml.xhtml [ Crash ] -crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-newelements.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-param-xhtml.xhtml [ Crash ] -crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-param.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.images.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-01.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-02.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-06.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-07.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-08.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/034.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/035.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/036.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/044.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/045.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/046.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_001.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_002.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_003.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_004.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_005.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_006.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_007.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_008.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_009.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_010.html [ Crash ] -crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/script_013.html [ Crash ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-cross-origin.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/003.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/004.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/006.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/014.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/empty_fragment.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-query-fragment-components.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-form-submit.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin-fragment.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/002.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/003.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/004.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/005.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/history/joint-session-history/joint-session-history-only-fully-active.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-cross-origin-domain.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-cross-origin.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-goes-cross-origin-domain.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-same-origin-domain.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/origin/origin-of-data-document.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter_null.tentative.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter_srcdoc.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/the-window-object/garbage-collection-and-browsing-contexts/discard_iframe_history_3.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/the-window-object/garbage-collection-and-browsing-contexts/discard_iframe_history_4.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-cross-origin-domain.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-cross-origin.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-goes-cross-origin-domain.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-same-origin-domain.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/browsers/windows/noreferrer-window-name.html [ Crash Timeout ] +crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.forms.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-namespace.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-newelements-xhtml.xhtml [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-newelements.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-param-xhtml.xhtml [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-param.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.images.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-01.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-02.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-06.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-07.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-08.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/034.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/035.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/036.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/044.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/045.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/046.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_001.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_002.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_003.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_004.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_005.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_006.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_007.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_008.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_009.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_010.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/script_013.html [ Crash Pass ] crbug.com/591099 external/wpt/html/dom/interfaces.html [ Timeout ] -crbug.com/591099 external/wpt/html/editing/focus/focus-management/focus-event-targets-simple.html [ Crash ] -crbug.com/591099 external/wpt/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html [ Crash ] -crbug.com/591099 external/wpt/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-default-value.html [ Crash ] -crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html [ Crash ] -crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/htmlformcontrolscollection.html [ Crash ] -crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html [ Crash ] -crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/radionodelist.html [ Crash ] -crbug.com/591099 external/wpt/html/infrastructure/terminology/plugins/text-plain.html [ Crash ] -crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-16be.html [ Crash ] -crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-16le.html [ Crash ] -crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-8.html [ Crash ] -crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1251.html [ Crash ] -crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1252.html [ Crash ] +crbug.com/591099 external/wpt/html/editing/focus/focus-management/focus-event-targets-simple.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-default-value.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/htmlformcontrolscollection.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/radionodelist.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/infrastructure/terminology/plugins/text-plain.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-16be.html [ Crash Timeout ] +crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-16le.html [ Crash Timeout ] +crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-8.html [ Crash Timeout ] +crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1251.html [ Crash Timeout ] +crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1252.html [ Crash Timeout ] crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/flow-content-0/dialog.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/flow-content-0/div-align.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/tables/table-cell-width-s.html [ Failure ] @@ -5501,85 +5501,85 @@ crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-fieldset-element-0/legend-block-formatting-context.html [ Crash Failure ] crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/align.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/setting-overflow-visible.html [ Failure ] -crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-page/iframe-body-margin-attributes.html [ Crash ] -crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-page/iframe-marginwidth-marginheight.html [ Crash ] +crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-page/iframe-body-margin-attributes.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-page/iframe-marginwidth-marginheight.html [ Crash Pass ] crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-auto.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-percentage.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-inline-sizing/svg-inline.html [ Failure Timeout ] -crbug.com/591099 external/wpt/html/semantics/disabled-elements/disabledElement.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/document-metadata/the-base-element/base_about_blank.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/document-metadata/the-base-element/base_srcdoc.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-remove-from-document-networkState.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/networkState_initial.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/preload_reflects_none_autoplay.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/readyState_initial.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/src_reflects_attribute_not_source_elements.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-coords.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-download-click.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-processing.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-shape.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-embed-element/embed-document.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-embed-element/embed-ignored-in-media-element.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-embed-element/embed-in-object-fallback.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/change_parentage.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/content_document_changes_only_after_load_matures.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-load-event.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-synchronously-discard.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-1.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-2.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/same_origin_parentage.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/current-pixel-density/error.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/delay-load-event.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/img.complete.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/nonexistent-image.html [ Crash ] +crbug.com/591099 external/wpt/html/semantics/disabled-elements/disabledElement.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/document-metadata/the-base-element/base_about_blank.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/document-metadata/the-base-element/base_srcdoc.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-remove-from-document-networkState.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/networkState_initial.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/preload_reflects_none_autoplay.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/readyState_initial.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/src_reflects_attribute_not_source_elements.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-coords.html [ Crash Failure ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-download-click.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-processing.html [ Crash Failure ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-shape.html [ Crash Failure ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-embed-element/embed-document.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-embed-element/embed-ignored-in-media-element.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-embed-element/embed-in-object-fallback.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/change_parentage.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/content_document_changes_only_after_load_matures.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-load-event.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-synchronously-discard.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-1.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-2.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/same_origin_parentage.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/current-pixel-density/error.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/delay-load-event.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/img.complete.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/nonexistent-image.html [ Crash Pass ] crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/srcset/parse-a-srcset-attribute.html [ Crash Pass ] crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/srcset/select-an-image-source.html [ Crash Pass ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/update-the-source-set.html [ Crash ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/update-the-source-set.html [ Crash Pass ] crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/usemap-casing.html [ Failure ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-object-element/object-attributes.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-object-element/object-ignored-in-media-element.html [ Crash ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-object-element/object-attributes.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-object-element/object-ignored-in-media-element.html [ Crash Pass ] crbug.com/591099 external/wpt/html/semantics/embedded-content/the-object-element/usemap-casing.html [ Failure ] -crbug.com/591099 external/wpt/html/semantics/embedded-content/the-video-element/video-tabindex.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/constraints/form-validation-willValidate.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/form-control-infrastructure/form.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/form-control-infrastructure/form_attribute.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/form-submission-0/form-data-set-usv.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/form-submission-0/getactionurl.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/form-submission-0/submit-entity-body.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/resetting-a-form/reset-form-event-realm.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/textfieldselection/selection-after-content-change.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/textfieldselection/selection-start-end.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-button-element/button-activate.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-button-element/button-menu-historical.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-fieldset-element/disabled-001.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-action-submission-with-base-url.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-action-submission.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-autocomplete.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-filter.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-matches.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-nameditem-01.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-sameobject.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-indexed-element.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-nameditem.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/button.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/checkbox-click-events.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/email.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/input-type-button.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/radio-input-cancel.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/reset.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/telephone.html [ Crash ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-video-element/video-tabindex.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/constraints/form-validation-willValidate.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/form-control-infrastructure/form.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/form-control-infrastructure/form_attribute.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/form-submission-0/form-data-set-usv.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/form-submission-0/getactionurl.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/form-submission-0/submit-entity-body.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/resetting-a-form/reset-form-event-realm.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/textfieldselection/selection-after-content-change.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/textfieldselection/selection-start-end.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-button-element/button-activate.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-button-element/button-menu-historical.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-fieldset-element/disabled-001.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-action-submission-with-base-url.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-action-submission.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-autocomplete.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-filter.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-matches.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-nameditem-01.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-sameobject.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-indexed-element.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-nameditem.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/button.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/checkbox-click-events.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/email.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/input-type-button.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/radio-input-cancel.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/reset.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/telephone.html [ Crash Pass ] crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/type-change-state.html [ Pass Timeout ] -crbug.com/591099 external/wpt/html/semantics/forms/the-label-element/proxy-click-to-associated-element.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-option-element/option-form.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-option-element/option-index.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-select-element/select-multiple.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-select-element/selected-index.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/forms/the-textarea-element/textarea-type.html [ Crash ] +crbug.com/591099 external/wpt/html/semantics/forms/the-label-element/proxy-click-to-associated-element.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-option-element/option-form.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-option-element/option-index.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-select-element/select-multiple.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-select-element/selected-index.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/forms/the-textarea-element/textarea-type.html [ Crash Pass ] crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002.html [ Failure ] crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html [ Crash Failure ] crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed.html [ Crash Failure Pass ] @@ -5588,857 +5588,865 @@ crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent.html [ Crash Failure Pass ] crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html [ Crash Failure ] crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul.html [ Crash Failure Pass ] -crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li.html [ Crash ] +crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li.html [ Crash Pass ] crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001.html [ Failure ] crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-001.html [ Failure ] crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-002.html [ Failure ] crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-001.html [ Failure ] crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-002.html [ Failure ] crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003.html [ Failure ] -crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol.html [ Crash ] +crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol.html [ Crash Pass ] crbug.com/591099 external/wpt/html/semantics/interactive-elements/the-dialog-element/centering.html [ Failure ] -crbug.com/591099 external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-noembed-noframes-iframe.xhtml [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-not-executed-after-shutdown.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/additions-to-parsing-xhtml-documents/node-document.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/additions-to-parsing-xhtml-documents/template-child-nodes.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/definitions/template-contents-owner-document-type.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/definitions/template-contents-owner-test-002.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/definitions/template-contents.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/innerhtml-on-templates/innerhtml.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/content-attribute.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/node-document-changes.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-content-node-document.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-descendant-body.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-descendant-frameset.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-descendant-head.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/checked.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/default.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/disabled.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/enabled.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/focus-autofocus.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/focus.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/indeterminate-radio.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/readwrite-readonly.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/valid-invalid.html [ Crash ] -crbug.com/591099 external/wpt/html/semantics/text-level-semantics/the-a-element/a-download-click-404.html [ Crash ] +crbug.com/591099 external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-noembed-noframes-iframe.xhtml [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-not-executed-after-shutdown.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/additions-to-parsing-xhtml-documents/node-document.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/additions-to-parsing-xhtml-documents/template-child-nodes.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/definitions/template-contents-owner-document-type.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/definitions/template-contents-owner-test-002.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/definitions/template-contents.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/innerhtml-on-templates/innerhtml.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/content-attribute.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/node-document-changes.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-content-node-document.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-descendant-body.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-descendant-frameset.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-descendant-head.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/checked.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/default.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/disabled.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/enabled.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/focus-autofocus.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/focus.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/indeterminate-radio.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/readwrite-readonly.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/valid-invalid.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/semantics/text-level-semantics/the-a-element/a-download-click-404.html [ Crash Pass ] crbug.com/591099 external/wpt/html/semantics/text-level-semantics/the-br-element/br-bidi-in-inline-ancestors.html [ Failure ] crbug.com/591099 external/wpt/html/semantics/text-level-semantics/the-wbr-element/wbr-element.html [ Failure ] -crbug.com/591099 external/wpt/html/syntax/parsing/Document.getElementsByTagName-foreign-01.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/Document.getElementsByTagName-foreign-02.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/Element.getElementsByTagName-foreign-01.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/Element.getElementsByTagName-foreign-02.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/math-parse03.html [ Crash ] +crbug.com/591099 external/wpt/html/syntax/parsing/Document.getElementsByTagName-foreign-01.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/Document.getElementsByTagName-foreign-02.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/Element.getElementsByTagName-foreign-01.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/Element.getElementsByTagName-foreign-02.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/math-parse03.html [ Crash Pass ] crbug.com/591099 external/wpt/html/syntax/parsing/named-character-references.html [ Pass Timeout ] -crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-body-token.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-frameset-token.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-head-token.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-html-token.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/start-tag-html.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/template-end-tag-without-start-one.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-frameset-insertion-mode/end-tag-frameset.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/template/appending-to-a-template/template-child-nodes.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/parsing/template/creating-an-element-for-the-token/template-owner-document.html [ Crash ] -crbug.com/591099 external/wpt/html/syntax/serializing-html-fragments/initial-linefeed-pre.html [ Crash ] -crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-10.htm [ Crash ] -crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-8.htm [ Crash ] -crbug.com/591099 external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/origin-check-in-document-open-same-origin-domain.sub.html [ Crash ] -crbug.com/591099 external/wpt/html/webappapis/scripting/events/onerroreventhandler.html [ Crash ] -crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-1.html [ Crash ] -crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-2.html [ Crash ] -crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-3.html [ Crash ] -crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-4.html [ Crash ] +crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-body-token.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-frameset-token.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-head-token.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-html-token.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/start-tag-html.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/template-end-tag-without-start-one.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-frameset-insertion-mode/end-tag-frameset.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/template/appending-to-a-template/template-child-nodes.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/parsing/template/creating-an-element-for-the-token/template-owner-document.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/syntax/serializing-html-fragments/initial-linefeed-pre.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-1.htm [ Timeout ] +crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-10.htm [ Crash Timeout ] +crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-2.htm [ Timeout ] +crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-3.htm [ Timeout ] +crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-4.htm [ Timeout ] +crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-5.htm [ Timeout ] +crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-6.htm [ Timeout ] +crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-7.htm [ Timeout ] +crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-8.htm [ Crash Timeout ] +crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-9.htm [ Timeout ] +crbug.com/591099 external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/origin-check-in-document-open-same-origin-domain.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/webappapis/scripting/events/onerroreventhandler.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-1.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-2.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-3.html [ Crash Pass ] +crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-4.html [ Crash Pass ] crbug.com/591099 external/wpt/http/basic-auth-cache-test.html [ Crash Timeout ] -crbug.com/591099 external/wpt/innerText/getter.html [ Crash ] -crbug.com/591099 external/wpt/input-events/input-events-typing-data-manual.html [ Crash ] -crbug.com/591099 external/wpt/intersection-observer/client-rect.html [ Crash ] -crbug.com/591099 external/wpt/intersection-observer/cross-origin-iframe.html [ Crash ] +crbug.com/591099 external/wpt/innerText/getter.html [ Crash Failure ] +crbug.com/591099 external/wpt/input-events/input-events-typing-data-manual.html [ Crash Pass ] +crbug.com/591099 external/wpt/intersection-observer/client-rect.html [ Crash Pass ] +crbug.com/591099 external/wpt/intersection-observer/cross-origin-iframe.html [ Crash Pass ] crbug.com/591099 external/wpt/intersection-observer/edge-inclusive-intersection.html [ Failure ] -crbug.com/591099 external/wpt/intersection-observer/iframe-no-root.html [ Crash ] +crbug.com/591099 external/wpt/intersection-observer/iframe-no-root.html [ Crash Pass ] crbug.com/591099 external/wpt/intersection-observer/remove-element.html [ Failure ] -crbug.com/591099 external/wpt/intersection-observer/root-margin.html [ Crash ] -crbug.com/591099 external/wpt/intersection-observer/same-document-root.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-activesourcebuffers.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-addsourcebuffer-mode.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-addsourcebuffer.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-append-buffer.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-appendwindow.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-buffered.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-closed.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-a-bitrate.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-audio-bitrate.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-framesize.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-video-bitrate.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-bitrate.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-framerate.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-framesize.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-a-bitrate.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-av-audio-bitrate.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-av-framesize.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-av-video-bitrate.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-v-bitrate.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-v-framerate.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-v-framesize.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-detach.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-duration-boundaryconditions.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-duration.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-endofstream-invaliderror.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-endofstream.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-errors.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-getvideoplaybackquality.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-liveseekable.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-multiple-attach.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-play-then-seek-back.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-play.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-preload.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-redundant-seek.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-remove.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-removesourcebuffer.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-seek-beyond-duration.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-seek-during-pending-seek.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-seekable.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-sequencemode-append-buffer.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-sourcebuffer-mode.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-sourcebuffer-trackdefaults.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-sourcebufferlist.html [ Crash ] -crbug.com/591099 external/wpt/media-source/mediasource-timestamp-offset.html [ Crash ] -crbug.com/591099 external/wpt/mediacapture-fromelement/idlharness.html [ Crash ] -crbug.com/591099 external/wpt/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html [ Crash ] -crbug.com/591099 external/wpt/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-video-is-black.https.html [ Crash ] -crbug.com/591099 external/wpt/mixed-content/imageset.https.sub.html [ Crash ] -crbug.com/591099 external/wpt/navigation-timing/nav2_test_frame_removed.html [ Crash ] -crbug.com/591099 external/wpt/navigation-timing/test_performance_attributes_exist_in_object.html [ Crash ] -crbug.com/591099 external/wpt/page-visibility/test_child_document.html [ Crash ] -crbug.com/591099 external/wpt/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html [ Crash ] -crbug.com/591099 external/wpt/payment-request/allowpaymentrequest/active-document-same-origin.https.html [ Crash ] -crbug.com/591099 external/wpt/payment-request/allowpaymentrequest/basic.https.html [ Crash ] -crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html [ Crash ] -crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy-attribute.https.sub.html [ Crash ] -crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy.https.sub.html [ Crash ] -crbug.com/591099 external/wpt/payment-request/payment-default-feature-policy.https.sub.html [ Crash ] -crbug.com/591099 external/wpt/payment-request/payment-disabled-by-feature-policy.https.sub.html [ Crash ] -crbug.com/591099 external/wpt/payment-request/payment-request-id.https.html [ Crash ] -crbug.com/591099 external/wpt/payment-request/payment-request-in-iframe.html [ Crash ] +crbug.com/591099 external/wpt/intersection-observer/root-margin.html [ Crash Pass ] +crbug.com/591099 external/wpt/intersection-observer/same-document-root.html [ Crash Failure ] +crbug.com/591099 external/wpt/media-source/mediasource-activesourcebuffers.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-addsourcebuffer-mode.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-addsourcebuffer.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-append-buffer.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-appendwindow.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-buffered.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-closed.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-a-bitrate.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-audio-bitrate.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-framesize.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-video-bitrate.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-bitrate.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-framerate.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-framesize.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-a-bitrate.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-av-audio-bitrate.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-av-framesize.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-av-video-bitrate.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-v-bitrate.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-v-framerate.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-v-framesize.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-detach.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-duration-boundaryconditions.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-duration.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-endofstream-invaliderror.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-endofstream.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-errors.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-getvideoplaybackquality.html [ Crash Timeout ] +crbug.com/591099 external/wpt/media-source/mediasource-liveseekable.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-multiple-attach.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-play-then-seek-back.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-play.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-preload.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-redundant-seek.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-remove.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-removesourcebuffer.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-seek-beyond-duration.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-seek-during-pending-seek.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-seekable.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-sequencemode-append-buffer.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-sourcebuffer-mode.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-sourcebuffer-trackdefaults.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-sourcebufferlist.html [ Crash Pass ] +crbug.com/591099 external/wpt/media-source/mediasource-timestamp-offset.html [ Crash Pass ] +crbug.com/591099 external/wpt/mediacapture-fromelement/idlharness.html [ Crash Pass ] +crbug.com/591099 external/wpt/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-video-is-black.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/mixed-content/imageset.https.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/navigation-timing/nav2_test_frame_removed.html [ Crash Pass ] +crbug.com/591099 external/wpt/navigation-timing/test_performance_attributes_exist_in_object.html [ Crash Pass ] +crbug.com/591099 external/wpt/page-visibility/test_child_document.html [ Crash Pass ] +crbug.com/591099 external/wpt/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/payment-request/allowpaymentrequest/active-document-same-origin.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/payment-request/allowpaymentrequest/basic.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy-attribute.https.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy.https.sub.html [ Crash Failure ] +crbug.com/591099 external/wpt/payment-request/payment-default-feature-policy.https.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/payment-request/payment-disabled-by-feature-policy.https.sub.html [ Crash Failure ] +crbug.com/591099 external/wpt/payment-request/payment-request-id.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/payment-request/payment-request-in-iframe.html [ Crash Pass ] crbug.com/591099 external/wpt/pointerevents/pointerevent_attributes_hoverable_pointers-manual.html [ Crash Pass Timeout ] crbug.com/591099 external/wpt/pointerevents/pointerevent_attributes_nohover_pointers-manual.html [ Crash Pass Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_capture_mouse-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_capture_suppressing_mouse-manual.html [ Crash Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_capture_mouse-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_capture_suppressing_mouse-manual.html [ Crash Pass Timeout ] crbug.com/591099 external/wpt/pointerevents/pointerevent_click_during_capture-manual.html [ Crash Timeout ] crbug.com/591099 external/wpt/pointerevents/pointerevent_disabled_form_control-manual.html [ Timeout ] crbug.com/591099 external/wpt/pointerevents/pointerevent_lostpointercapture_for_disconnected_node-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_lostpointercapture_is_first-manual.html [ Crash Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_lostpointercapture_is_first-manual.html [ Crash Pass Timeout ] crbug.com/591099 external/wpt/pointerevents/pointerevent_pointerleave_pen-manual.html [ Failure Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_releasepointercapture_onpointerup_mouse-manual.html [ Crash ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-button-test_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-auto-child-none_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-none_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-x_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-y_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_parent-none_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-none-css_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-down-css_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-left-css_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-right-css_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-up-css_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-x-css_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-x-pan-y-pan-y_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-y-css_touch-manual.html [ Crash Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_releasepointercapture_onpointerup_mouse-manual.html [ Crash Pass ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-button-test_touch-manual.html [ Crash Failure Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-auto-child-none_touch-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-none_touch-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-x_touch-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-y_touch-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_parent-none_touch-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-none-css_touch-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-down-css_touch-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-left-css_touch-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-right-css_touch-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-up-css_touch-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-x-css_touch-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-x-pan-y-pan-y_touch-manual.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-y-css_touch-manual.html [ Crash Pass Timeout ] crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-span-test_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-svg-test_touch-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-table-test_touch-manual.html [ Crash Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-svg-test_touch-manual.html [ Crash Failure Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-table-test_touch-manual.html [ Crash Pass Timeout ] crbug.com/591099 external/wpt/quirks-mode/blocks-ignore-line-height.html [ Failure ] -crbug.com/591099 external/wpt/quirks-mode/classname-query-after-sibling-adoption.html [ Crash ] +crbug.com/591099 external/wpt/quirks-mode/classname-query-after-sibling-adoption.html [ Crash Pass ] crbug.com/591099 external/wpt/quirks-mode/hashless-hex-color.html [ Pass Timeout ] -crbug.com/591099 external/wpt/quirks-mode/line-height-calculation.html [ Crash ] -crbug.com/591099 external/wpt/quirks-mode/table-cell-width-calculation.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/css-integration/external-import-stylesheet.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/css-integration/external-stylesheet.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/css-integration/internal-import-stylesheet.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/css-integration/internal-stylesheet.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/css-integration/processing-instruction.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/generic/sandboxed-iframe-with-opaque-origin.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/area-navigate.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/iframe-messaging.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/image-decoding.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/link-navigate.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/generic/unsupported-csp-referrer-directive.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-downgrade.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-upgrade.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ] -crbug.com/591099 external/wpt/remote-playback/idlharness.html [ Crash ] +crbug.com/591099 external/wpt/quirks-mode/line-height-calculation.html [ Crash Failure ] +crbug.com/591099 external/wpt/quirks-mode/table-cell-width-calculation.html [ Crash Failure ] +crbug.com/591099 external/wpt/referrer-policy/css-integration/external-import-stylesheet.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/css-integration/external-stylesheet.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/css-integration/internal-import-stylesheet.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/css-integration/internal-stylesheet.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/css-integration/processing-instruction.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/generic/sandboxed-iframe-with-opaque-origin.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/area-navigate.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/iframe-messaging.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/image-decoding.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/link-navigate.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/generic/unsupported-csp-referrer-directive.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-downgrade.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-upgrade.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ] +crbug.com/591099 external/wpt/remote-playback/idlharness.html [ Crash Pass ] crbug.com/591099 external/wpt/scroll-anchoring/anchoring-with-bounds-clamping.html [ Failure ] crbug.com/591099 external/wpt/scroll-anchoring/clipped-scrollers-skipped.html [ Failure ] crbug.com/591099 external/wpt/scroll-anchoring/descend-into-container-with-float.html [ Failure ] -crbug.com/591099 external/wpt/scroll-anchoring/inline-block.html [ Crash ] +crbug.com/591099 external/wpt/scroll-anchoring/inline-block.html [ Crash Pass ] crbug.com/591099 external/wpt/scroll-anchoring/opt-out.html [ Failure ] crbug.com/591099 external/wpt/scroll-anchoring/position-change-heuristic.html [ Failure ] -crbug.com/591099 external/wpt/scroll-anchoring/start-edge-in-block-layout-direction.html [ Crash ] +crbug.com/591099 external/wpt/scroll-anchoring/start-edge-in-block-layout-direction.html [ Crash Failure ] crbug.com/591099 external/wpt/selection/addRange-00.html [ Pass Timeout ] crbug.com/591099 external/wpt/selection/addRange-04.html [ Pass Timeout ] crbug.com/591099 external/wpt/selection/addRange-12.html [ Pass Timeout ] @@ -6452,101 +6460,101 @@ crbug.com/591099 external/wpt/selection/collapse-15.html [ Pass Timeout ] crbug.com/591099 external/wpt/selection/collapse-30.html [ Pass Timeout ] crbug.com/591099 external/wpt/selection/collapse-45.html [ Pass Timeout ] -crbug.com/591099 external/wpt/selection/deleteFromDocument.html [ Crash ] +crbug.com/591099 external/wpt/selection/deleteFromDocument.html [ Crash Pass ] crbug.com/591099 external/wpt/selection/extend-00.html [ Pass Timeout ] crbug.com/591099 external/wpt/selection/extend-20.html [ Pass Timeout ] crbug.com/591099 external/wpt/selection/selectAllChildren.html [ Pass Timeout ] -crbug.com/591099 external/wpt/selectors/attribute-selectors/attribute-case/semantics.html [ Crash ] -crbug.com/591099 external/wpt/server-timing/test_server_timing.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html [ Crash Timeout ] +crbug.com/591099 external/wpt/selectors/attribute-selectors/attribute-case/semantics.html [ Crash Pass ] +crbug.com/591099 external/wpt/server-timing/test_server_timing.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html [ Crash Pass Timeout ] crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/registration-attribute.https.html [ Failure Pass ] -crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/activation.https.html [ Crash ] +crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/activation.https.html [ Crash Pass ] crbug.com/591099 external/wpt/service-workers/service-worker/claim-fetch.https.html [ Crash Pass ] -crbug.com/591099 external/wpt/service-workers/service-worker/claim-not-using-registration.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/client-id.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/clients-get-cross-origin.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/clients-get.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall-exact-controller.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall-include-uncontrolled.https.html [ Crash Timeout ] -crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall-order.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/extendable-event-async-waituntil.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/fetch-canvas-tainting-cache.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/fetch-canvas-tainting.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/fetch-cors-xhr.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/fetch-event.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/fetch-mixed-content-to-inscope.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/fetch-request-css-images.https.html [ Crash ] +crbug.com/591099 external/wpt/service-workers/service-worker/claim-not-using-registration.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/client-id.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/clients-get-cross-origin.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/clients-get.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall-exact-controller.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall-include-uncontrolled.https.html [ Crash Pass Timeout ] +crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall-order.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/extendable-event-async-waituntil.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/fetch-canvas-tainting-cache.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/fetch-canvas-tainting.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/fetch-cors-xhr.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/fetch-event.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Crash Timeout ] +crbug.com/591099 external/wpt/service-workers/service-worker/fetch-mixed-content-to-inscope.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/fetch-request-css-images.https.html [ Crash Pass ] crbug.com/591099 external/wpt/service-workers/service-worker/fetch-request-fallback.https.html [ Crash Pass ] -crbug.com/591099 external/wpt/service-workers/service-worker/fetch-request-redirect.https.html [ Crash ] +crbug.com/591099 external/wpt/service-workers/service-worker/fetch-request-redirect.https.html [ Crash Pass ] crbug.com/591099 external/wpt/service-workers/service-worker/fetch-response-taint.https.html [ Crash Pass ] -crbug.com/591099 external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/foreign-fetch-cors.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/multi-globals/url-parsing.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/navigation-preload/redirect.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/navigation-preload/resource-timing.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/navigation-redirect-to-http.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/navigation-redirect.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/ready.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/register-closed-window.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/register-link-header.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/register-same-scope-different-script-url.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/registration-iframe.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/unregister-controller.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/unregister-then-register.https.html [ Crash ] -crbug.com/591099 external/wpt/service-workers/service-worker/windowclient-navigate.https.html [ Crash ] -crbug.com/591099 external/wpt/shadow-dom/leaktests/html-collection.html [ Crash ] -crbug.com/591099 external/wpt/shadow-dom/leaktests/window-frames.html [ Crash ] -crbug.com/591099 external/wpt/shadow-dom/untriaged/events/event-retargeting/test-001.html [ Crash ] -crbug.com/591099 external/wpt/shadow-dom/untriaged/events/test-001.html [ Crash ] -crbug.com/591099 external/wpt/shadow-dom/untriaged/html-elements-in-shadow-trees/html-forms/test-003.html [ Crash ] -crbug.com/591099 external/wpt/shadow-dom/untriaged/html-elements-in-shadow-trees/inert-html-elements/test-001.html [ Crash ] +crbug.com/591099 external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/foreign-fetch-cors.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/multi-globals/url-parsing.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/navigation-preload/redirect.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/navigation-preload/resource-timing.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/navigation-redirect-to-http.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/navigation-redirect.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/ready.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/register-closed-window.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/register-link-header.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/register-same-scope-different-script-url.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/registration-iframe.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/unregister-controller.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/unregister-then-register.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/service-workers/service-worker/windowclient-navigate.https.html [ Crash Pass ] +crbug.com/591099 external/wpt/shadow-dom/leaktests/html-collection.html [ Crash Pass ] +crbug.com/591099 external/wpt/shadow-dom/leaktests/window-frames.html [ Crash Pass ] +crbug.com/591099 external/wpt/shadow-dom/untriaged/events/event-retargeting/test-001.html [ Crash Pass ] +crbug.com/591099 external/wpt/shadow-dom/untriaged/events/test-001.html [ Crash Pass ] +crbug.com/591099 external/wpt/shadow-dom/untriaged/html-elements-in-shadow-trees/html-forms/test-003.html [ Crash Pass ] +crbug.com/591099 external/wpt/shadow-dom/untriaged/html-elements-in-shadow-trees/inert-html-elements/test-001.html [ Crash Pass ] crbug.com/591099 external/wpt/svg/interfaces.html [ Pass Timeout ] crbug.com/591099 external/wpt/svg/linking/reftests/href-filter-element.html [ Crash Failure ] crbug.com/591099 external/wpt/uievents/mouse/mouseevent_move_button-manual.html [ Crash Timeout ] -crbug.com/591099 external/wpt/uievents/order-of-events/focus-events/focus-automated-blink-webkit.html [ Crash ] +crbug.com/591099 external/wpt/uievents/order-of-events/focus-events/focus-automated-blink-webkit.html [ Crash Pass ] crbug.com/591099 external/wpt/uievents/order-of-events/focus-events/focus-manual.html [ Crash Failure Timeout ] crbug.com/591099 external/wpt/url/a-element-xhtml.xhtml [ Pass Timeout ] crbug.com/591099 external/wpt/url/a-element.html [ Pass Timeout ] crbug.com/591099 external/wpt/url/url-constructor.html [ Pass Timeout ] crbug.com/591099 external/wpt/url/url-setters.html [ Pass Timeout ] -crbug.com/591099 external/wpt/viewport/viewport-unscaled-scale-iframe.html [ Crash ] -crbug.com/591099 external/wpt/viewport/viewport-unscaled-scroll-iframe.html [ Crash ] -crbug.com/591099 external/wpt/viewport/viewport-unscaled-size-iframe.html [ Crash ] -crbug.com/591099 external/wpt/wasm/wasm_local_iframe_test.html [ Crash ] -crbug.com/591099 external/wpt/web-animations/interfaces/AnimationTimeline/document-timeline.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/broadcastchannel/sandbox.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/message-channels/004.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/with-ports/016.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/with-ports/017.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/with-ports/018.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/with-ports/019.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/with-ports/020.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/with-ports/021.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/without-ports/016.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/without-ports/017.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/without-ports/018.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/without-ports/019.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/without-ports/020.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/without-ports/021.html [ Crash ] -crbug.com/591099 external/wpt/webmessaging/without-ports/028.html [ Crash ] +crbug.com/591099 external/wpt/viewport/viewport-unscaled-scale-iframe.html [ Crash Pass ] +crbug.com/591099 external/wpt/viewport/viewport-unscaled-scroll-iframe.html [ Crash Pass ] +crbug.com/591099 external/wpt/viewport/viewport-unscaled-size-iframe.html [ Crash Pass ] +crbug.com/591099 external/wpt/wasm/wasm_local_iframe_test.html [ Crash Failure ] +crbug.com/591099 external/wpt/web-animations/interfaces/AnimationTimeline/document-timeline.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/broadcastchannel/sandbox.html [ Crash Failure ] +crbug.com/591099 external/wpt/webmessaging/message-channels/004.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/with-ports/016.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/with-ports/017.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/with-ports/018.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/with-ports/019.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/with-ports/020.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/with-ports/021.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/without-ports/016.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/without-ports/017.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/without-ports/018.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/without-ports/019.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/without-ports/020.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/without-ports/021.html [ Crash Pass ] +crbug.com/591099 external/wpt/webmessaging/without-ports/028.html [ Crash Pass ] crbug.com/591099 external/wpt/webrtc/interfaces.html [ Pass Timeout ] -crbug.com/591099 external/wpt/webrtc/simplecall.html [ Crash ] -crbug.com/591099 external/wpt/websockets/multi-globals/message-received.html [ Crash ] -crbug.com/591099 external/wpt/webstorage/event_no_duplicates.html [ Crash ] +crbug.com/591099 external/wpt/webrtc/simplecall.html [ Crash Pass ] +crbug.com/591099 external/wpt/websockets/multi-globals/message-received.html [ Crash Pass ] +crbug.com/591099 external/wpt/webstorage/event_no_duplicates.html [ Crash Pass ] crbug.com/591099 external/wpt/webstorage/storage_setitem.html [ Pass Timeout ] -crbug.com/591099 external/wpt/webusb/usb-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html [ Crash ] -crbug.com/591099 external/wpt/webusb/usb-allowed-by-feature-policy-attribute.https.sub.html [ Crash ] -crbug.com/591099 external/wpt/webusb/usb-allowed-by-feature-policy.https.sub.html [ Crash ] -crbug.com/591099 external/wpt/webusb/usb-default-feature-policy.https.sub.html [ Crash ] -crbug.com/591099 external/wpt/webusb/usb-disabled-by-feature-policy.https.sub.html [ Crash ] +crbug.com/591099 external/wpt/webusb/usb-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/webusb/usb-allowed-by-feature-policy-attribute.https.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/webusb/usb-allowed-by-feature-policy.https.sub.html [ Crash Failure ] +crbug.com/591099 external/wpt/webusb/usb-default-feature-policy.https.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/webusb/usb-disabled-by-feature-policy.https.sub.html [ Crash Failure ] crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html [ Crash Failure ] crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_partially_move_up.html [ Crash Failure ] crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/bidi_ruby.html [ Crash Failure ] @@ -6566,17 +6574,17 @@ crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_font_shorthand.html [ Crash Failure ] crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_properties.html [ Crash Failure ] crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_shorthand.html [ Crash Failure ] -crbug.com/591099 external/wpt/x-frame-options/deny.sub.html [ Crash ] -crbug.com/591099 external/wpt/x-frame-options/invalid.sub.html [ Crash ] -crbug.com/591099 external/wpt/x-frame-options/multiple.sub.html [ Crash ] -crbug.com/591099 external/wpt/x-frame-options/sameorigin.sub.html [ Crash ] +crbug.com/591099 external/wpt/x-frame-options/deny.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/x-frame-options/invalid.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/x-frame-options/multiple.sub.html [ Crash Pass ] +crbug.com/591099 external/wpt/x-frame-options/sameorigin.sub.html [ Crash Pass ] crbug.com/591099 fast/alignment/ensure-flexbox-compatibility-with-initial-values.html [ Failure ] crbug.com/591099 fast/alignment/overwrite-content-alignment.html [ Failure ] crbug.com/591099 fast/alignment/overwrite-self-alignment.html [ Failure ] crbug.com/591099 fast/animation/request-animation-frame-cancel.html [ Failure ] crbug.com/591099 fast/animation/request-animation-frame-cancel2.html [ Failure ] -crbug.com/591099 fast/animation/request-animation-frame-detach-element.html [ Crash ] -crbug.com/591099 fast/animation/request-animation-frame-detach-element2.html [ Crash ] +crbug.com/591099 fast/animation/request-animation-frame-detach-element.html [ Crash Pass ] +crbug.com/591099 fast/animation/request-animation-frame-detach-element2.html [ Crash Pass ] crbug.com/591099 fast/animation/request-animation-frame-iframe.html [ Failure ] crbug.com/591099 fast/animation/request-animation-frame-iframe2.html [ Failure ] crbug.com/591099 fast/animation/request-animation-frame-missing-arguments.html [ Failure ] @@ -6679,13 +6687,13 @@ crbug.com/591099 fast/block/basic/quirk-percent-height-grandchild.html [ Failure ] crbug.com/591099 fast/block/basic/text-indent-rtl.html [ Failure ] crbug.com/591099 fast/block/basic/white-space-pre-wraps.html [ Failure ] -crbug.com/591099 fast/block/block-not-removed-from-parent-lineboxes-crash.html [ Crash ] +crbug.com/591099 fast/block/block-not-removed-from-parent-lineboxes-crash.html [ Crash Pass ] crbug.com/591099 fast/block/block-parent-with-zero-width-child.html [ Failure ] crbug.com/591099 fast/block/block-remove-child-delete-line-box-crash.html [ Failure ] -crbug.com/591099 fast/block/block-width-recalc-with-relative-height.html [ Crash ] -crbug.com/591099 fast/block/block-with-inline-replaced-child-following-text.html [ Crash ] +crbug.com/591099 fast/block/block-width-recalc-with-relative-height.html [ Crash Failure ] +crbug.com/591099 fast/block/block-with-inline-replaced-child-following-text.html [ Crash Failure ] crbug.com/591099 fast/block/borderbox-percent-padding.html [ Failure ] -crbug.com/591099 fast/block/child-not-removed-from-parent-lineboxes-crash.html [ Crash ] +crbug.com/591099 fast/block/child-not-removed-from-parent-lineboxes-crash.html [ Crash Pass ] crbug.com/591099 fast/block/dynamic-padding-border.html [ Failure ] crbug.com/591099 fast/block/float/002.html [ Crash Failure ] crbug.com/591099 fast/block/float/003.html [ Failure ] @@ -6712,7 +6720,7 @@ crbug.com/591099 fast/block/float/034.html [ Failure ] crbug.com/591099 fast/block/float/035.html [ Failure ] crbug.com/591099 fast/block/float/add-float-back-to-anonymous-block.html [ Failure ] -crbug.com/591099 fast/block/float/assert-when-moving-float.html [ Crash ] +crbug.com/591099 fast/block/float/assert-when-moving-float.html [ Crash Failure ] crbug.com/591099 fast/block/float/avoid-floats-when-negative-margin-top-2.html [ Failure ] crbug.com/591099 fast/block/float/avoid-floats-when-negative-margin-top-3.html [ Failure ] crbug.com/591099 fast/block/float/avoid-floats-when-negative-margin-top-4.html [ Failure ] @@ -6738,15 +6746,15 @@ crbug.com/591099 fast/block/float/float-in-float-hit-testing.html [ Failure ] crbug.com/591099 fast/block/float/float-in-float-painting.html [ Failure ] crbug.com/591099 fast/block/float/float-inserted-into-clean-line.html [ Failure ] -crbug.com/591099 fast/block/float/float-list-changed-before-layout-crash.html [ Crash ] +crbug.com/591099 fast/block/float/float-list-changed-before-layout-crash.html [ Crash Pass ] crbug.com/591099 fast/block/float/float-not-removed-from-next-sibling-crash.html [ Failure ] crbug.com/591099 fast/block/float/float-not-removed-from-next-sibling5.html [ Crash Failure ] crbug.com/591099 fast/block/float/float-on-empty-line.html [ Failure ] -crbug.com/591099 fast/block/float/float-on-line-large-and-small-float-below.html [ Crash ] +crbug.com/591099 fast/block/float/float-on-line-large-and-small-float-below.html [ Crash Pass ] crbug.com/591099 fast/block/float/float-on-line-obeys-container-padding.html [ Failure ] crbug.com/591099 fast/block/float/float-on-zero-height-line.html [ Failure ] crbug.com/591099 fast/block/float/float-overflow-hidden-containing-block-width.html [ Failure ] -crbug.com/591099 fast/block/float/float-reparent-during-detach-crash.html [ Crash ] +crbug.com/591099 fast/block/float/float-reparent-during-detach-crash.html [ Crash Pass ] crbug.com/591099 fast/block/float/floats-and-text-indent-rl.html [ Failure ] crbug.com/591099 fast/block/float/floats-and-text-indent.html [ Failure ] crbug.com/591099 fast/block/float/floats-do-not-overhang-from-block-formatting-context.html [ Failure ] @@ -6768,7 +6776,7 @@ crbug.com/591099 fast/block/float/intruding-float-add-in-sibling-block-on-static-position2.html [ Crash Failure Pass ] crbug.com/591099 fast/block/float/intruding-painted-twice.html [ Failure ] crbug.com/591099 fast/block/float/logical-bottom-exceeds-layoutunit-max.html [ Failure ] -crbug.com/591099 fast/block/float/margin-top-changes.html [ Crash ] +crbug.com/591099 fast/block/float/margin-top-changes.html [ Crash Pass ] crbug.com/591099 fast/block/float/marquee-shrink-to-avoid-floats.html [ Failure ] crbug.com/591099 fast/block/float/max-width-clear-float-with-overflow-hidden.html [ Failure Pass ] crbug.com/591099 fast/block/float/multiple-float-positioning.html [ Failure ] @@ -6794,10 +6802,10 @@ crbug.com/591099 fast/block/float/selection-gap-clip-out-tiger-crash.html [ Failure Pass ] crbug.com/591099 fast/block/float/shrink-to-avoid-float-complexity.html [ Failure ] crbug.com/591099 fast/block/float/shrink-to-fit-width.html [ Failure ] -crbug.com/591099 fast/block/float/split-inline-sibling-of-float-crash.html [ Crash ] +crbug.com/591099 fast/block/float/split-inline-sibling-of-float-crash.html [ Crash Pass ] crbug.com/591099 fast/block/float/table-relayout.html [ Failure ] -crbug.com/591099 fast/block/float/trailing-float-layout-2.html [ Crash ] -crbug.com/591099 fast/block/float/trailing-float-layout.html [ Crash ] +crbug.com/591099 fast/block/float/trailing-float-layout-2.html [ Crash Pass ] +crbug.com/591099 fast/block/float/trailing-float-layout.html [ Crash Pass ] crbug.com/591099 fast/block/float/trailing-float-with-columns.html [ Failure ] crbug.com/591099 fast/block/float/vertical-move-relayout.html [ Failure ] crbug.com/591099 fast/block/float/width-update-after-clear.html [ Failure ] @@ -6913,7 +6921,7 @@ crbug.com/591099 fast/block/positioning/padding-percent.html [ Crash Failure ] crbug.com/591099 fast/block/positioning/positioned-child-inside-relative-positioned-anonymous-block.html [ Failure ] crbug.com/591099 fast/block/positioning/positioned-container-changes-block-direction-border-with-positioned-descendant.html [ Failure ] -crbug.com/591099 fast/block/positioning/positioned-layout-in-line.html [ Crash ] +crbug.com/591099 fast/block/positioning/positioned-layout-in-line.html [ Crash Pass ] crbug.com/591099 fast/block/positioning/rel-positioned-inline-changes-width.html [ Crash Failure ] crbug.com/591099 fast/block/positioning/relative-overflow-block.html [ Failure ] crbug.com/591099 fast/block/positioning/relative-overflow-replaced-float.html [ Crash Failure ] @@ -6921,7 +6929,7 @@ crbug.com/591099 fast/block/positioning/relative-positioned-inline-container.html [ Crash Failure ] crbug.com/591099 fast/block/positioning/relative-with-implicit-height-containing-block.html [ Failure ] crbug.com/591099 fast/block/positioning/relayout-nested-positioned-elements-crash-2.html [ Crash Failure Pass ] -crbug.com/591099 fast/block/positioning/relayout-nested-positioned-elements-crash.html [ Crash ] +crbug.com/591099 fast/block/positioning/relayout-nested-positioned-elements-crash.html [ Crash Failure ] crbug.com/591099 fast/block/positioning/relayout-on-position-change.html [ Failure ] crbug.com/591099 fast/block/positioning/replaced-inside-fixed-top-bottom.html [ Failure ] crbug.com/591099 fast/block/positioning/rtl-static-positioning-inline-block.html [ Crash Failure ] @@ -6940,7 +6948,7 @@ crbug.com/591099 fast/block/positioning/vertical-rl/fixed-positioning.html [ Failure ] crbug.com/591099 fast/block/positioning/window-height-change.html [ Failure ] crbug.com/591099 fast/block/scrollbar-wider-than-border-box.html [ Failure ] -crbug.com/591099 fast/block/skip-cleaning-up-anonymous-wrappers-when-subtree-being-destroyed.html [ Crash ] +crbug.com/591099 fast/block/skip-cleaning-up-anonymous-wrappers-when-subtree-being-destroyed.html [ Crash Pass ] crbug.com/591099 fast/block/strip-anonymous-blocks-when-block-child-becomes-float.html [ Failure ] crbug.com/591099 fast/body-propagation/background-color/001-xhtml.xhtml [ Failure Pass ] crbug.com/591099 fast/body-propagation/background-color/001.html [ Failure Pass ] @@ -7096,36 +7104,36 @@ crbug.com/591099 fast/box-shadow/spread.html [ Failure ] crbug.com/591099 fast/box-shadow/transform-fringing.html [ Failure ] crbug.com/591099 fast/box-sizing/box-sizing.html [ Failure ] -crbug.com/591099 fast/box-sizing/css-table-with-box-sizing.html [ Crash ] +crbug.com/591099 fast/box-sizing/css-table-with-box-sizing.html [ Crash Failure ] crbug.com/591099 fast/box-sizing/table-cell.html [ Failure ] -crbug.com/591099 fast/canvas/2d.composite.globalAlpha.fillPath.html [ Crash ] -crbug.com/591099 fast/canvas/2d.fillText.gradient.html [ Crash ] -crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.gradient.html [ Crash ] -crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.negative.html [ Crash ] -crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.veryLarge.html [ Crash ] -crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.verySmall.html [ Crash ] +crbug.com/591099 fast/canvas/2d.composite.globalAlpha.fillPath.html [ Crash Pass ] +crbug.com/591099 fast/canvas/2d.fillText.gradient.html [ Crash Pass ] +crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.gradient.html [ Crash Pass ] +crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.negative.html [ Crash Pass ] +crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.veryLarge.html [ Crash Pass ] +crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.verySmall.html [ Crash Pass ] crbug.com/591099 fast/canvas/OffscreenCanvas-constructor-in-worker.html [ Failure ] crbug.com/591099 fast/canvas/OffscreenCanvas-invalid-args-in-worker.html [ Failure ] crbug.com/591099 fast/canvas/OffscreenCanvas-transferable-exceptions.html [ Failure ] crbug.com/591099 fast/canvas/OffscreenCanvas-transferable.html [ Failure ] -crbug.com/591099 fast/canvas/access-zero-sized-canvas.html [ Crash ] -crbug.com/591099 fast/canvas/alpha.html [ Crash ] -crbug.com/591099 fast/canvas/arc-crash.html [ Crash ] -crbug.com/591099 fast/canvas/arc360.html [ Crash ] -crbug.com/591099 fast/canvas/bug544329.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-2d-clip-anti-aliasing.html [ Crash ] +crbug.com/591099 fast/canvas/access-zero-sized-canvas.html [ Crash Pass ] +crbug.com/591099 fast/canvas/alpha.html [ Crash Pass ] +crbug.com/591099 fast/canvas/arc-crash.html [ Crash Pass ] +crbug.com/591099 fast/canvas/arc360.html [ Crash Pass ] +crbug.com/591099 fast/canvas/bug544329.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-2d-clip-anti-aliasing.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-ImageBitmap-close.html [ Failure ] crbug.com/591099 fast/canvas/canvas-ImageBitmap-structured-clone.html [ Failure ] crbug.com/591099 fast/canvas/canvas-ImageBitmap-transferable.html [ Failure ] crbug.com/591099 fast/canvas/canvas-ImageData-neutered-source.html [ Failure ] crbug.com/591099 fast/canvas/canvas-ImageData-workers.html [ Failure ] -crbug.com/591099 fast/canvas/canvas-after-destroy-iframe.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-alphaImageData-behavior.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-arc-zero-lineto.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-bezier-same-endpoint.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-after-destroy-iframe.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-alphaImageData-behavior.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-arc-zero-lineto.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-bezier-same-endpoint.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-blending-image-over-image.html [ Failure ] crbug.com/591099 fast/canvas/canvas-blending-text.html [ Failure ] -crbug.com/591099 fast/canvas/canvas-closePath-single-point.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-closePath-single-point.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-composite-alpha.html [ Crash Failure ] crbug.com/591099 fast/canvas/canvas-composite-canvas.html [ Failure ] crbug.com/591099 fast/canvas/canvas-composite-image.html [ Failure ] @@ -7144,25 +7152,25 @@ crbug.com/591099 fast/canvas/canvas-createImageBitmap-recursive.html [ Failure Timeout ] crbug.com/591099 fast/canvas/canvas-createImageBitmap-svg-no-intrinsic-size.html [ Failure ] crbug.com/591099 fast/canvas/canvas-createImageBitmap-svg.html [ Failure ] -crbug.com/591099 fast/canvas/canvas-createPattern-fillRect-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-currentColor.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-direction.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-draw-canvas-on-canvas-shadow.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-createPattern-fillRect-shadow.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-currentColor.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-direction.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-draw-canvas-on-canvas-shadow.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-drawImage-animated-images.html [ Failure ] -crbug.com/591099 fast/canvas/canvas-drawImage-animated.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-drawImage-live-video.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-drawImage-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-ellipse-360-winding.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-drawImage-animated.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-drawImage-live-video.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-drawImage-shadow.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-ellipse-360-winding.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-ellipse-connecting-line.html [ Failure Pass ] -crbug.com/591099 fast/canvas/canvas-ellipse-zero-lineto.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-ellipse.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-empty-image-pattern.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-fillPath-alpha-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-fillPath-gradient-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-fillPath-pattern-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-fillPath-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-fillRect-gradient-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-fillRect-shadow.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-ellipse-zero-lineto.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-ellipse.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-empty-image-pattern.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-fillPath-alpha-shadow.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-fillPath-gradient-shadow.html [ Crash Failure ] +crbug.com/591099 fast/canvas/canvas-fillPath-pattern-shadow.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-fillPath-shadow.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-fillRect-gradient-shadow.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-fillRect-shadow.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-filter-fill-liveness.html [ Failure ] crbug.com/591099 fast/canvas/canvas-filter-fill-paint-color.html [ Failure ] crbug.com/591099 fast/canvas/canvas-filter-fill-paint-gradient.html [ Failure ] @@ -7179,99 +7187,99 @@ crbug.com/591099 fast/canvas/canvas-filter-width-height-hidpi.html [ Failure ] crbug.com/591099 fast/canvas/canvas-filter-width-height-scale.html [ Failure ] crbug.com/591099 fast/canvas/canvas-filter-width-height.html [ Failure ] -crbug.com/591099 fast/canvas/canvas-font-cache.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-font-cache.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-hides-fallback.html [ Failure ] -crbug.com/591099 fast/canvas/canvas-hit-regions-accessibility-test.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-basic-test.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-clear-test.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-clip-test.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-css-transform-test.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-device-pixel-ratio-test.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-event-test.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-exception-test.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-fallback-element-test-1.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-fallback-element-test-2.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-fallback-element-test-3.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-fill-rule-test.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-path2d-test.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-path2d-transform-test.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-scale-factor.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-hit-regions-transform-test.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-imageSmoothingQuality.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-invalid-fillstyle.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-invalid-strokestyle.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-hit-regions-accessibility-test.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-basic-test.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-clear-test.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-clip-test.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-css-transform-test.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-device-pixel-ratio-test.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-event-test.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-exception-test.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-fallback-element-test-1.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-fallback-element-test-2.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-fallback-element-test-3.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-fill-rule-test.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-path2d-test.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-path2d-transform-test.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-scale-factor.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-hit-regions-transform-test.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-imageSmoothingQuality.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-invalid-fillstyle.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-invalid-strokestyle.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-invalid-video.html [ Failure ] -crbug.com/591099 fast/canvas/canvas-isPointInStroke-with-path.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-isPointInStroke.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-large-dimensions.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-lineDash-input-sequence.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-lineDash-invalid.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-lineDash.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-lineWidth-intact-after-strokeRect.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-isPointInStroke-with-path.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-isPointInStroke.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-large-dimensions.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-lineDash-input-sequence.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-lineDash-invalid.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-lineDash.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-lineWidth-intact-after-strokeRect.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-measure-bidi-text.html [ Failure Pass ] crbug.com/591099 fast/canvas/canvas-negative-size.html [ Failure ] crbug.com/591099 fast/canvas/canvas-normalize-string.html [ Failure ] -crbug.com/591099 fast/canvas/canvas-path-context-clip.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-path-context-fill.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-path-context-stroke.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-path-object.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-path-with-inf-nan-dimensions.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-pattern-set-transform.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-putImageData.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-quadratic-same-endpoint.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-path-context-clip.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-path-context-fill.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-path-context-stroke.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-path-object.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-path-with-inf-nan-dimensions.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-pattern-set-transform.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-putImageData.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-quadratic-same-endpoint.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-render-layer.html [ Failure Pass ] -crbug.com/591099 fast/canvas/canvas-resetTransform.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-resize-after-paint.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-scale-drawImage-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-scale-fillPath-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-scale-fillRect-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-scale-shadowBlur.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-scale-strokePath-shadow.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-resetTransform.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-resize-after-paint.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-scale-drawImage-shadow.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-scale-fillPath-shadow.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-scale-fillRect-shadow.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-scale-shadowBlur.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-scale-strokePath-shadow.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-scroll-path-into-view.html [ Failure Timeout ] -crbug.com/591099 fast/canvas/canvas-set-properties-with-non-invertible-ctm.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-set-properties-with-non-invertible-ctm.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-shadow-source-in.html [ Failure Pass ] -crbug.com/591099 fast/canvas/canvas-skia-excessive-size.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-strokePath-alpha-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-strokePath-cap-join.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-strokePath-gradient-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-strokePath-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash ] -crbug.com/591099 fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-skia-excessive-size.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-strokePath-alpha-shadow.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-strokePath-cap-join.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-strokePath-gradient-shadow.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-strokePath-shadow.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash Pass ] +crbug.com/591099 fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-text-baseline-tiny-fonts.html [ Failure Pass ] -crbug.com/591099 fast/canvas/canvas-text-space-characters.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-text-space-characters.html [ Crash Pass ] crbug.com/591099 fast/canvas/canvas-textMetrics-width.html [ Failure ] crbug.com/591099 fast/canvas/canvas-transforms-during-path.html [ Failure ] -crbug.com/591099 fast/canvas/canvas-transforms-fillRect-shadow.html [ Crash ] +crbug.com/591099 fast/canvas/canvas-transforms-fillRect-shadow.html [ Crash Pass ] crbug.com/591099 fast/canvas/currentTransform-null.html [ Failure ] -crbug.com/591099 fast/canvas/draw-focus-if-needed-invisible-crash.html [ Crash ] -crbug.com/591099 fast/canvas/draw-focus-if-needed-on-event.html [ Crash ] -crbug.com/591099 fast/canvas/draw-focus-if-needed-with-path2d.html [ Crash ] -crbug.com/591099 fast/canvas/draw-focus-if-needed.html [ Crash ] -crbug.com/591099 fast/canvas/drawImage-with-negative-source-destination.html [ Crash ] -crbug.com/591099 fast/canvas/fallback-content.html [ Crash ] -crbug.com/591099 fast/canvas/feimage-with-foreignobject-taint-canvas-2.html [ Crash ] -crbug.com/591099 fast/canvas/feimage-with-foreignobject-taint-canvas.html [ Crash ] +crbug.com/591099 fast/canvas/draw-focus-if-needed-invisible-crash.html [ Crash Pass ] +crbug.com/591099 fast/canvas/draw-focus-if-needed-on-event.html [ Crash Pass ] +crbug.com/591099 fast/canvas/draw-focus-if-needed-with-path2d.html [ Crash Pass ] +crbug.com/591099 fast/canvas/draw-focus-if-needed.html [ Crash Pass ] +crbug.com/591099 fast/canvas/drawImage-with-negative-source-destination.html [ Crash Pass ] +crbug.com/591099 fast/canvas/fallback-content.html [ Crash Pass ] +crbug.com/591099 fast/canvas/feimage-with-foreignobject-taint-canvas-2.html [ Crash Pass ] +crbug.com/591099 fast/canvas/feimage-with-foreignobject-taint-canvas.html [ Crash Pass ] crbug.com/591099 fast/canvas/fill-stroke-clip-reset-path.html [ Failure ] -crbug.com/591099 fast/canvas/fillText-shadow.html [ Crash ] +crbug.com/591099 fast/canvas/fillText-shadow.html [ Crash Pass ] crbug.com/591099 fast/canvas/fillrect_gradient.html [ Failure ] -crbug.com/591099 fast/canvas/font-no-zoom.html [ Crash ] -crbug.com/591099 fast/canvas/gradient-with-clip.html [ Crash ] +crbug.com/591099 fast/canvas/font-no-zoom.html [ Crash Pass ] +crbug.com/591099 fast/canvas/gradient-with-clip.html [ Crash Pass ] crbug.com/591099 fast/canvas/image-object-in-canvas.html [ Failure ] -crbug.com/591099 fast/canvas/image-with-foreignobject-taint-canvas-2.html [ Crash ] -crbug.com/591099 fast/canvas/image-with-foreignobject-taint-canvas.html [ Crash ] -crbug.com/591099 fast/canvas/painting-on-bad-canvas.html [ Crash ] -crbug.com/591099 fast/canvas/pattern-with-transform.html [ Crash ] +crbug.com/591099 fast/canvas/image-with-foreignobject-taint-canvas-2.html [ Crash Pass ] +crbug.com/591099 fast/canvas/image-with-foreignobject-taint-canvas.html [ Crash Pass ] +crbug.com/591099 fast/canvas/painting-on-bad-canvas.html [ Crash Pass ] +crbug.com/591099 fast/canvas/pattern-with-transform.html [ Crash Pass ] crbug.com/591099 fast/canvas/quadraticCurveTo.xml [ Failure ] -crbug.com/591099 fast/canvas/resize-while-save-active.html [ Crash ] -crbug.com/591099 fast/canvas/set-empty-font-crash.html [ Crash ] +crbug.com/591099 fast/canvas/resize-while-save-active.html [ Crash Pass ] +crbug.com/591099 fast/canvas/set-empty-font-crash.html [ Crash Pass ] crbug.com/591099 fast/canvas/setWidthResetAfterForcedRender.html [ Failure ] -crbug.com/591099 fast/canvas/shadow-huge-blur.html [ Crash ] +crbug.com/591099 fast/canvas/shadow-huge-blur.html [ Crash Pass ] crbug.com/591099 fast/canvas/shadow-offset-1.html [ Failure ] crbug.com/591099 fast/canvas/toDataURL-alpha.html [ Failure ] -crbug.com/591099 fast/canvas/toDataURL-noData.html [ Crash ] +crbug.com/591099 fast/canvas/toDataURL-noData.html [ Crash Pass ] crbug.com/591099 fast/canvas/toDataURL-supportedTypes.html [ Failure ] -crbug.com/591099 fast/canvas/transformed-canvas-reset.html [ Crash ] +crbug.com/591099 fast/canvas/transformed-canvas-reset.html [ Crash Pass ] crbug.com/591099 fast/canvas/unclosed-canvas-1.html [ Failure ] crbug.com/591099 fast/canvas/unclosed-canvas-3.html [ Failure ] crbug.com/591099 fast/canvas/unclosed-canvas-4.html [ Failure ] @@ -7282,11 +7290,11 @@ crbug.com/591099 fast/canvas/webgl/renderer-and-vendor-strings.html [ Failure ] crbug.com/591099 fast/canvas/webgl/shader-deleted-by-accessor.html [ Failure ] crbug.com/591099 fast/canvas/webgl/tex-sub-image-cube-maps.html [ Failure ] -crbug.com/591099 fast/canvas/webgl/texImage-imageBitmap-from-canvas-resize.html [ Crash ] +crbug.com/591099 fast/canvas/webgl/texImage-imageBitmap-from-canvas-resize.html [ Crash Pass ] crbug.com/591099 fast/canvas/webgl/texture-color-profile.html [ Failure ] crbug.com/591099 fast/canvas/webgl/webgl-texture-binding-preserved.html [ Failure ] crbug.com/591099 fast/canvas/webgl/webgl-viewport-parameters-preserved.html [ Failure ] -crbug.com/591099 fast/canvas/zero-size-fill-rect.html [ Crash ] +crbug.com/591099 fast/canvas/zero-size-fill-rect.html [ Crash Pass ] crbug.com/591099 fast/clip/001.html [ Failure ] crbug.com/591099 fast/clip/004.html [ Failure ] crbug.com/591099 fast/clip/008.html [ Failure ] @@ -7332,7 +7340,7 @@ crbug.com/591099 fast/css-generated-content/beforeAfter-interdocument.html [ Failure ] crbug.com/591099 fast/css-generated-content/block-after.html [ Failure ] crbug.com/591099 fast/css-generated-content/bug-106384.html [ Failure ] -crbug.com/591099 fast/css-generated-content/crash-selection-editing-removes-pseudo.html [ Crash ] +crbug.com/591099 fast/css-generated-content/crash-selection-editing-removes-pseudo.html [ Crash Failure ] crbug.com/591099 fast/css-generated-content/details-before-after-content.html [ Crash Failure ] crbug.com/591099 fast/css-generated-content/drag-state.html [ Failure ] crbug.com/591099 fast/css-generated-content/empty-content-with-float-crash.html [ Failure ] @@ -7415,7 +7423,7 @@ crbug.com/591099 fast/css-grid-layout/grid-auto-flow-update.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-auto-repeat-inherit-initial-crash.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-automatic-minimum-for-auto-rows.html [ Failure ] -crbug.com/591099 fast/css-grid-layout/grid-baseline-must-respect-grid-order.html [ Crash ] +crbug.com/591099 fast/css-grid-layout/grid-baseline-must-respect-grid-order.html [ Crash Failure ] crbug.com/591099 fast/css-grid-layout/grid-change-fit-content-argument.html [ Failure ] crbug.com/591099 fast/css-grid-layout/grid-columns-rows-get-set-multiple.html [ Timeout ] crbug.com/591099 fast/css-grid-layout/grid-columns-rows-get-set.html [ Timeout ] @@ -7639,7 +7647,7 @@ crbug.com/591099 fast/css-intrinsic-dimensions/fit-content-container-with-replaced-child.html [ Crash Failure Pass ] crbug.com/591099 fast/css-intrinsic-dimensions/fitcontent-minmax-content-inlinesize-contribution-nonreplaced-blocks.html [ Crash Failure ] crbug.com/591099 fast/css-intrinsic-dimensions/fixed-height-stf-img-block-child-percent-height.html [ Failure ] -crbug.com/591099 fast/css-intrinsic-dimensions/fixed-height-stf-img-inline-child-percent-height.html [ Crash ] +crbug.com/591099 fast/css-intrinsic-dimensions/fixed-height-stf-img-inline-child-percent-height.html [ Crash Failure ] crbug.com/591099 fast/css-intrinsic-dimensions/height-css-tables.html [ Failure ] crbug.com/591099 fast/css-intrinsic-dimensions/height-flexbox.html [ Failure Pass ] crbug.com/591099 fast/css-intrinsic-dimensions/height-positioned.html [ Crash Failure ] @@ -7672,9 +7680,9 @@ crbug.com/591099 fast/css/absolute-child-with-percent-height-inside-relative-parent.html [ Failure ] crbug.com/591099 fast/css/absolute-child-with-percent-padding-inside-relative-parent.html [ Failure Pass ] crbug.com/591099 fast/css/absolute-poition-in-rtl-parent.html [ Failure ] -crbug.com/591099 fast/css/acid2-pixel.html [ Crash ] -crbug.com/591099 fast/css/acid2.html [ Crash ] -crbug.com/591099 fast/css/active-pseudo-and-focus-move.html [ Crash ] +crbug.com/591099 fast/css/acid2-pixel.html [ Crash Failure ] +crbug.com/591099 fast/css/acid2.html [ Crash Failure ] +crbug.com/591099 fast/css/active-pseudo-and-focus-move.html [ Crash Pass ] crbug.com/591099 fast/css/all-shorthand-css-text.html [ Failure ] crbug.com/591099 fast/css/all-shorthand-first-letter.html [ Failure ] crbug.com/591099 fast/css/annotated-regions.html [ Failure ] @@ -7723,7 +7731,7 @@ crbug.com/591099 fast/css/box-sizing-backwards-compat-prefix.html [ Failure ] crbug.com/591099 fast/css/box-sizing-border-box-dynamic-padding-border-update.html [ Failure ] crbug.com/591099 fast/css/bug4860-absolute-block-child-does-not-inherit-alignment.html [ Failure ] -crbug.com/591099 fast/css/button-height.html [ Crash ] +crbug.com/591099 fast/css/button-height.html [ Crash Failure ] crbug.com/591099 fast/css/button-inner-child-crash.html [ Crash Pass ] crbug.com/591099 fast/css/calc-rounding.html [ Failure ] crbug.com/591099 fast/css/caption-width-absolute-position-offset-top.htm [ Failure ] @@ -7761,9 +7769,9 @@ crbug.com/591099 fast/css/computed-image-width-with-percent-height-quirksmode.html [ Failure ] crbug.com/591099 fast/css/computed-offset-with-zoom.html [ Failure ] crbug.com/591099 fast/css/containment/size-and-layout-containment.html [ Crash Failure ] -crbug.com/591099 fast/css/content-disallowed-url-crash.html [ Crash ] +crbug.com/591099 fast/css/content-disallowed-url-crash.html [ Crash Pass ] crbug.com/591099 fast/css/content-distributed-nodes.html [ Failure ] -crbug.com/591099 fast/css/content-image-set-disallowed-url-crash.html [ Crash ] +crbug.com/591099 fast/css/content-image-set-disallowed-url-crash.html [ Crash Pass ] crbug.com/591099 fast/css/content-language-case-insensitivity.html [ Failure ] crbug.com/591099 fast/css/content-language-comma-separated-list.html [ Failure ] crbug.com/591099 fast/css/content-language-dynamically-added.html [ Failure ] @@ -7800,14 +7808,14 @@ crbug.com/591099 fast/css/counters/counter-reset-000.html [ Failure ] crbug.com/591099 fast/css/counters/counter-reset-001.html [ Failure ] crbug.com/591099 fast/css/counters/counter-reset-002.html [ Failure ] -crbug.com/591099 fast/css/counters/counter-traverse-object-crash.html [ Crash ] +crbug.com/591099 fast/css/counters/counter-traverse-object-crash.html [ Crash Pass ] crbug.com/591099 fast/css/counters/counter-traverse-table-cell.html [ Failure ] crbug.com/591099 fast/css/counters/invalidate-cached-counter-node.html [ Failure ] crbug.com/591099 fast/css/counters/nesting.html [ Failure ] crbug.com/591099 fast/css/counters/remove-anonymous-block-wrapper-crash.html [ Crash Failure ] crbug.com/591099 fast/css/crash-corner-present.html [ Failure ] -crbug.com/591099 fast/css/crash-in-attachFirstLetterTextLayoutObjects.html [ Crash ] -crbug.com/591099 fast/css/crash-layout-detached-document.html [ Crash ] +crbug.com/591099 fast/css/crash-in-attachFirstLetterTextLayoutObjects.html [ Crash Pass ] +crbug.com/591099 fast/css/crash-layout-detached-document.html [ Crash Failure ] crbug.com/591099 fast/css/create_element_align.xhtml [ Failure ] crbug.com/591099 fast/css/css-imports.html [ Failure ] crbug.com/591099 fast/css/css-keyframe-style-parentRule.html [ Failure ] @@ -7869,7 +7877,7 @@ crbug.com/591099 fast/css/first-letter-float-after-float.html [ Failure ] crbug.com/591099 fast/css/first-letter-float.html [ Failure ] crbug.com/591099 fast/css/first-letter-hover.html [ Failure ] -crbug.com/591099 fast/css/first-letter-inline-flow-split-table-crash.html [ Crash ] +crbug.com/591099 fast/css/first-letter-inline-flow-split-table-crash.html [ Crash Pass ] crbug.com/591099 fast/css/first-letter-nested.html [ Failure ] crbug.com/591099 fast/css/first-letter-recalculation.html [ Failure Pass ] crbug.com/591099 fast/css/first-letter-removed-added.html [ Failure ] @@ -7892,7 +7900,7 @@ crbug.com/591099 fast/css/focus-ring-recursive-inlines.html [ Failure ] crbug.com/591099 fast/css/font-face-add-same-family-later.html [ Failure ] crbug.com/591099 fast/css/font-face-cache-bug.html [ Crash Failure ] -crbug.com/591099 fast/css/font-face-cache-version.html [ Crash ] +crbug.com/591099 fast/css/font-face-cache-version.html [ Crash Pass ] crbug.com/591099 fast/css/font-face-data-uri-invalid.html [ Failure ] crbug.com/591099 fast/css/font-face-data-uri.html [ Failure ] crbug.com/591099 fast/css/font-face-descending-unicode-range.html [ Failure ] @@ -7932,7 +7940,7 @@ crbug.com/591099 fast/css/fontface-methods.html [ Failure ] crbug.com/591099 fast/css/fontface-properties.html [ Failure ] crbug.com/591099 fast/css/fontface-single-font-family.html [ Failure ] -crbug.com/591099 fast/css/fontfaceset-cross-frame.html [ Crash ] +crbug.com/591099 fast/css/fontfaceset-cross-frame.html [ Crash Pass ] crbug.com/591099 fast/css/fontfaceset-download-error.html [ Failure ] crbug.com/591099 fast/css/fontfaceset-events.html [ Failure ] crbug.com/591099 fast/css/fontfaceset-in-detached-frame.html [ Failure ] @@ -7991,7 +7999,7 @@ crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-outline-offset.html [ Failure ] crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-outline-shorthand.html [ Failure ] crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-padding-shorthand.html [ Failure ] -crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-resolved-values.html [ Crash ] +crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-resolved-values.html [ Crash Timeout ] crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-text-decoration.html [ Failure ] crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-text-overflow.html [ Failure ] crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-webkit-columns-shorthand.html [ Failure ] @@ -8051,7 +8059,7 @@ crbug.com/591099 fast/css/input-search-padding.html [ Crash Failure ] crbug.com/591099 fast/css/insertRule-font-face.html [ Failure ] crbug.com/591099 fast/css/insertRule-media.html [ Failure ] -crbug.com/591099 fast/css/intruding-floats-crash.html [ Crash ] +crbug.com/591099 fast/css/intruding-floats-crash.html [ Crash Failure ] crbug.com/591099 fast/css/invalid-appearance-progress-bar-meter.html [ Failure ] crbug.com/591099 fast/css/invalid-not-with-pseudo-element.html [ Failure ] crbug.com/591099 fast/css/invalid-not-with-simple-selector-sequence.html [ Failure ] @@ -8083,8 +8091,8 @@ crbug.com/591099 fast/css/invalidation/full-page-media.html [ Failure ] crbug.com/591099 fast/css/invalidation/fullscreen.html [ Failure ] crbug.com/591099 fast/css/invalidation/hover-first-letter-sibling.html [ Failure ] -crbug.com/591099 fast/css/invalidation/in-and-out-of-range-pseudo.html [ Crash ] -crbug.com/591099 fast/css/invalidation/in-range-pseudo.html [ Crash ] +crbug.com/591099 fast/css/invalidation/in-and-out-of-range-pseudo.html [ Crash Pass ] +crbug.com/591099 fast/css/invalidation/in-range-pseudo.html [ Crash Pass ] crbug.com/591099 fast/css/invalidation/indeterminate-pseudo.html [ Failure ] crbug.com/591099 fast/css/invalidation/input-search-incremental.html [ Failure ] crbug.com/591099 fast/css/invalidation/invalidation-set-with-adjacent-combinators.html [ Failure ] @@ -8094,7 +8102,7 @@ crbug.com/591099 fast/css/invalidation/no-invalidation-set-local-style.html [ Failure ] crbug.com/591099 fast/css/invalidation/range-pseudo.html [ Crash Failure ] crbug.com/591099 fast/css/invalidation/read-only-write-pseudo.html [ Failure ] -crbug.com/591099 fast/css/invalidation/reattach-with-sibling-invalidation.html [ Crash ] +crbug.com/591099 fast/css/invalidation/reattach-with-sibling-invalidation.html [ Crash Failure ] crbug.com/591099 fast/css/invalidation/recalc-direct-adjacent-001.html [ Failure ] crbug.com/591099 fast/css/invalidation/recalc-direct-adjacent-002.html [ Failure ] crbug.com/591099 fast/css/invalidation/removed-hover-shadow-rule.html [ Failure ] @@ -8103,7 +8111,7 @@ crbug.com/591099 fast/css/invalidation/selection-pseudo.html [ Failure ] crbug.com/591099 fast/css/invalidation/shadow-add-sheet-content.html [ Failure ] crbug.com/591099 fast/css/invalidation/shadow-add-sheet-host.html [ Failure ] -crbug.com/591099 fast/css/invalidation/sheet-ruleset-invalidation.html [ Crash ] +crbug.com/591099 fast/css/invalidation/sheet-ruleset-invalidation.html [ Crash Pass ] crbug.com/591099 fast/css/invalidation/slotted.html [ Failure ] crbug.com/591099 fast/css/invalidation/style-update-with-added-stylesheet.html [ Failure ] crbug.com/591099 fast/css/invalidation/sub-selector-adjacent-cancellation.html [ Failure ] @@ -8164,15 +8172,15 @@ crbug.com/591099 fast/css/margin-start-end.html [ Failure ] crbug.com/591099 fast/css/margin-top-bottom-dynamic.html [ Failure ] crbug.com/591099 fast/css/marquee-in-template.html [ Crash Failure ] -crbug.com/591099 fast/css/mask-missing-image-crash.html [ Crash ] +crbug.com/591099 fast/css/mask-missing-image-crash.html [ Crash Failure ] crbug.com/591099 fast/css/matrix-as-function-crash.html [ Failure ] crbug.com/591099 fast/css/max-device-aspect-ratio.html [ Failure ] crbug.com/591099 fast/css/max-height-and-max-width.html [ Failure ] crbug.com/591099 fast/css/max-height-none.html [ Failure ] crbug.com/591099 fast/css/max-width-none.html [ Failure ] -crbug.com/591099 fast/css/media-attr-non-matching-dynamic.html [ Crash ] -crbug.com/591099 fast/css/media-query-in-supports-dynamic.html [ Crash ] -crbug.com/591099 fast/css/media-query-zero-viewport-crash.html [ Crash ] +crbug.com/591099 fast/css/media-attr-non-matching-dynamic.html [ Crash Pass ] +crbug.com/591099 fast/css/media-query-in-supports-dynamic.html [ Crash Pass ] +crbug.com/591099 fast/css/media-query-zero-viewport-crash.html [ Crash Pass ] crbug.com/591099 fast/css/media-rule-screenDepthPerComponent.html [ Failure ] crbug.com/591099 fast/css/min-device-aspect-ratio.html [ Failure ] crbug.com/591099 fast/css/min-max-width.html [ Failure ] @@ -8270,16 +8278,16 @@ crbug.com/591099 fast/css/pseudo-default-002.html [ Failure ] crbug.com/591099 fast/css/pseudo-default-003.html [ Failure ] crbug.com/591099 fast/css/pseudo-default-004.html [ Failure ] -crbug.com/591099 fast/css/pseudo-default-checkbox-radio.html [ Crash ] -crbug.com/591099 fast/css/pseudo-default-dynamic.html [ Crash ] -crbug.com/591099 fast/css/pseudo-default-option.html [ Crash ] +crbug.com/591099 fast/css/pseudo-default-checkbox-radio.html [ Crash Pass ] +crbug.com/591099 fast/css/pseudo-default-dynamic.html [ Crash Pass ] +crbug.com/591099 fast/css/pseudo-default-option.html [ Crash Pass ] crbug.com/591099 fast/css/pseudo-element-backdrop-hit-test.html [ Failure ] crbug.com/591099 fast/css/pseudo-element-line-break.html [ Failure ] crbug.com/591099 fast/css/pseudo-element-opagedxy-crash.html [ Failure ] crbug.com/591099 fast/css/pseudo-empty-adjacent-dynamic.html [ Failure ] crbug.com/591099 fast/css/pseudo-empty-display-none.html [ Failure ] crbug.com/591099 fast/css/pseudo-first-line-border-width.html [ Crash Failure ] -crbug.com/591099 fast/css/pseudo-hover-active-display-none.html [ Crash ] +crbug.com/591099 fast/css/pseudo-hover-active-display-none.html [ Crash Pass ] crbug.com/591099 fast/css/pseudo-in-range-invalid-value.html [ Crash Failure ] crbug.com/591099 fast/css/pseudo-in-range.html [ Crash Failure ] crbug.com/591099 fast/css/pseudo-invalid-001.html [ Crash Failure ] @@ -8312,7 +8320,7 @@ crbug.com/591099 fast/css/readonly-pseudoclass-opera-005.html [ Crash Failure ] crbug.com/591099 fast/css/recalc-inherit-001.html [ Failure ] crbug.com/591099 fast/css/recursive-delay-update-scroll.html [ Failure ] -crbug.com/591099 fast/css/relative-positioned-block-crash.html [ Crash ] +crbug.com/591099 fast/css/relative-positioned-block-crash.html [ Crash Pass ] crbug.com/591099 fast/css/relative-positioned-block-nested-with-inline-parent-dynamic-removed.html [ Failure ] crbug.com/591099 fast/css/relative-positioned-block-nested-with-inline-parent-dynamic.html [ Failure ] crbug.com/591099 fast/css/relative-positioned-block-nested-with-inline-parent-multiple-descendant-blocks-dynamic.html [ Failure ] @@ -8334,8 +8342,8 @@ crbug.com/591099 fast/css/remove-shorthand.html [ Crash Failure ] crbug.com/591099 fast/css/remove-style-after-insert-import-rule-crash.html [ Failure ] crbug.com/591099 fast/css/remove-stylesheet-from-shadow-form-crash.html [ Failure ] -crbug.com/591099 fast/css/render-quote-crash.html [ Crash ] -crbug.com/591099 fast/css/replaced-element-ignore-top-bottom.html [ Crash ] +crbug.com/591099 fast/css/render-quote-crash.html [ Crash Pass ] +crbug.com/591099 fast/css/replaced-element-ignore-top-bottom.html [ Crash Pass ] crbug.com/591099 fast/css/replaced-element-implicit-size.html [ Failure ] crbug.com/591099 fast/css/resize-corner-tracking-touch.html [ Crash Failure ] crbug.com/591099 fast/css/resize-corner-tracking-transformed-iframe.html [ Failure ] @@ -8354,7 +8362,7 @@ crbug.com/591099 fast/css/selector-set-attribute.html [ Failure ] crbug.com/591099 fast/css/selector-text-escape.html [ Crash Failure ] crbug.com/591099 fast/css/serialize-style-with-all-crash.html [ Failure ] -crbug.com/591099 fast/css/shadow-dom-scope.html [ Crash ] +crbug.com/591099 fast/css/shadow-dom-scope.html [ Crash Failure ] crbug.com/591099 fast/css/shadow-multiple.html [ Failure ] crbug.com/591099 fast/css/shadow-style-removed-out-of-document.html [ Failure ] crbug.com/591099 fast/css/sheet-collection-link.html [ Failure ] @@ -8374,7 +8382,7 @@ crbug.com/591099 fast/css/sticky/sticky-top-overflow-scroll-by-fragment.html [ Failure ] crbug.com/591099 fast/css/string-quote-binary.html [ Failure ] crbug.com/591099 fast/css/style-and-stylesheet-important.html [ Failure ] -crbug.com/591099 fast/css/style-element-process-crash.html [ Crash ] +crbug.com/591099 fast/css/style-element-process-crash.html [ Crash Pass ] crbug.com/591099 fast/css/style-outside-head.html [ Failure ] crbug.com/591099 fast/css/style-parsed-outside-head.html [ Failure ] crbug.com/591099 fast/css/style-sharing-inline-stylesheet.html [ Failure ] @@ -8423,11 +8431,11 @@ crbug.com/591099 fast/css/transition-shorthand-cssText.html [ Failure ] crbug.com/591099 fast/css/unicode-bidi-computed-value.html [ Failure ] crbug.com/591099 fast/css/universal-hover-quirk.html [ Failure ] -crbug.com/591099 fast/css/unknown-pseudo-element-matching.html [ Crash ] +crbug.com/591099 fast/css/unknown-pseudo-element-matching.html [ Crash Failure ] crbug.com/591099 fast/css/unused-data-url-fontface.html [ Failure ] crbug.com/591099 fast/css/uri-token-parsing.html [ Failure ] crbug.com/591099 fast/css/url-with-multi-byte-unicode-escape.html [ Failure ] -crbug.com/591099 fast/css/variables/matched-properties-cache-is-disabled.html [ Crash ] +crbug.com/591099 fast/css/variables/matched-properties-cache-is-disabled.html [ Crash Pass ] crbug.com/591099 fast/css/vertical-align-baseline-rowspan-003.htm [ Failure ] crbug.com/591099 fast/css/vertical-align-baseline-rowspan-004.htm [ Failure ] crbug.com/591099 fast/css/vertical-align-baseline-rowspan-005.htm [ Failure ] @@ -8524,13 +8532,13 @@ crbug.com/591099 fast/deprecated-flexbox/relpos-flex-item-with-percent-height-abspos-descendant.html [ Failure ] crbug.com/591099 fast/deprecated-flexbox/repaint-scrollbar.html [ Failure ] crbug.com/591099 fast/deprecated-flexbox/vertical-box-form-controls.html [ Failure ] -crbug.com/591099 fast/dnd/dropEffect-for-file.html [ Crash ] +crbug.com/591099 fast/dnd/dropEffect-for-file.html [ Crash Pass ] crbug.com/591099 fast/dnd/dropEffect-for-image.html [ Timeout ] crbug.com/591099 fast/doctypes/001.html [ Crash Failure ] crbug.com/591099 fast/doctypes/002.html [ Crash Failure ] crbug.com/591099 fast/doctypes/003.html [ Crash Failure ] crbug.com/591099 fast/doctypes/004.html [ Crash Failure ] -crbug.com/591099 fast/doctypes/doctype-parsing.html [ Crash ] +crbug.com/591099 fast/doctypes/doctype-parsing.html [ Crash Failure ] crbug.com/591099 fast/doctypes/xhtml-with-xhtmlmp-doctype.xhtml [ Failure ] crbug.com/591099 fast/doctypes/xhtml-with-xhtmlmp11-doctype.xhtml [ Failure ] crbug.com/591099 fast/doctypes/xhtml-with-xhtmlmp12-doctype.xhtml [ Failure ] @@ -8559,7 +8567,7 @@ crbug.com/591099 fast/dom/DOMImplementation/implementation-identity.html [ Crash Failure ] crbug.com/591099 fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-before-style.html [ Failure ] crbug.com/591099 fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport.html [ Failure ] -crbug.com/591099 fast/dom/Document/CaretRangeFromPoint/replace-element.html [ Crash ] +crbug.com/591099 fast/dom/Document/CaretRangeFromPoint/replace-element.html [ Crash Pass ] crbug.com/591099 fast/dom/Document/clone-node.html [ Failure ] crbug.com/591099 fast/dom/Document/createAttributeNS-namespace-err.html [ Crash Failure ] crbug.com/591099 fast/dom/Document/createElement-invalid-names.html [ Failure ] @@ -8571,7 +8579,7 @@ crbug.com/591099 fast/dom/Document/document-current-script-async.html [ Failure ] crbug.com/591099 fast/dom/Document/document-current-script.html [ Failure ] crbug.com/591099 fast/dom/Document/document-elementFromPoint-empty-document.html [ Failure ] -crbug.com/591099 fast/dom/Document/document-elementFromPoint-on-option-element.html [ Crash ] +crbug.com/591099 fast/dom/Document/document-elementFromPoint-on-option-element.html [ Crash Failure ] crbug.com/591099 fast/dom/Document/document-title-get.html [ Failure ] crbug.com/591099 fast/dom/Document/document-write-doctype.html [ Failure ] crbug.com/591099 fast/dom/Document/embeds-non-html.html [ Failure ] @@ -8647,7 +8655,7 @@ crbug.com/591099 fast/dom/HTMLButtonElement/change-type.html [ Failure ] crbug.com/591099 fast/dom/HTMLButtonElement/value/getset.html [ Failure ] crbug.com/591099 fast/dom/HTMLCollection/HTMLCollection-namedItem-invalidate-no-crash.html [ Failure ] -crbug.com/591099 fast/dom/HTMLDialogElement-crash-style-recalc-after-dialog-close.html [ Crash ] +crbug.com/591099 fast/dom/HTMLDialogElement-crash-style-recalc-after-dialog-close.html [ Crash Pass ] crbug.com/591099 fast/dom/HTMLDivElement/align/getset.html [ Failure ] crbug.com/591099 fast/dom/HTMLDocument/active-element-frames.html [ Failure ] crbug.com/591099 fast/dom/HTMLDocument/active-element-gets-unforcusable.html [ Failure ] @@ -8655,15 +8663,15 @@ crbug.com/591099 fast/dom/HTMLDocument/clone-node.html [ Failure ] crbug.com/591099 fast/dom/HTMLDocument/document-open-return-value.html [ Failure ] crbug.com/591099 fast/dom/HTMLDocument/document-plugins.html [ Failure ] -crbug.com/591099 fast/dom/HTMLDocument/document-special-properties.html [ Crash ] +crbug.com/591099 fast/dom/HTMLDocument/document-special-properties.html [ Crash Failure ] crbug.com/591099 fast/dom/HTMLDocument/document-write-variadic.html [ Failure ] crbug.com/591099 fast/dom/HTMLDocument/frameless-location-bugzilla10837.html [ Failure ] crbug.com/591099 fast/dom/HTMLDocument/named-item-multiple-match.html [ Failure ] -crbug.com/591099 fast/dom/HTMLDocument/named-item-not-found.html [ Crash ] +crbug.com/591099 fast/dom/HTMLDocument/named-item-not-found.html [ Crash Pass ] crbug.com/591099 fast/dom/HTMLDocument/named-item.html [ Failure ] crbug.com/591099 fast/dom/HTMLDocument/object-by-name-or-id.html [ Crash Failure Timeout ] -crbug.com/591099 fast/dom/HTMLDocument/object-by-name-unknown-child-element.html [ Crash ] -crbug.com/591099 fast/dom/HTMLDocument/set-focus-on-valid-element.html [ Crash ] +crbug.com/591099 fast/dom/HTMLDocument/object-by-name-unknown-child-element.html [ Crash Pass ] +crbug.com/591099 fast/dom/HTMLDocument/set-focus-on-valid-element.html [ Crash Failure ] crbug.com/591099 fast/dom/HTMLDocument/title-get.html [ Failure ] crbug.com/591099 fast/dom/HTMLDocument/title-set.html [ Failure ] crbug.com/591099 fast/dom/HTMLDocument/url-getset.html [ Failure ] @@ -8698,7 +8706,7 @@ crbug.com/591099 fast/dom/HTMLElement/insertAdjacentHTML-errors.html [ Failure ] crbug.com/591099 fast/dom/HTMLElement/iscontenteditable-designmodeon-allinherit.html [ Failure ] crbug.com/591099 fast/dom/HTMLElement/iscontenteditable-designmodeon-ancestor.html [ Failure ] -crbug.com/591099 fast/dom/HTMLElement/iscontenteditable-designmodeon-subframe.html [ Crash ] +crbug.com/591099 fast/dom/HTMLElement/iscontenteditable-designmodeon-subframe.html [ Crash Failure ] crbug.com/591099 fast/dom/HTMLElement/iscontenteditable-designmodeon.html [ Failure ] crbug.com/591099 fast/dom/HTMLElement/set-false.html [ Failure ] crbug.com/591099 fast/dom/HTMLElement/set-inherit-parent-false.html [ Failure ] @@ -8713,32 +8721,32 @@ crbug.com/591099 fast/dom/HTMLFormElement/adopt-assertion.html [ Failure ] crbug.com/591099 fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html [ Failure ] crbug.com/591099 fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail2.html [ Failure ] -crbug.com/591099 fast/dom/HTMLFormElement/document-deactivation-callback-crash.html [ Crash ] +crbug.com/591099 fast/dom/HTMLFormElement/document-deactivation-callback-crash.html [ Crash Failure ] crbug.com/591099 fast/dom/HTMLFormElement/elements-not-in-document.html [ Failure ] crbug.com/591099 fast/dom/HTMLFormElement/htmlformelement-indexed-getter.html [ Failure ] crbug.com/591099 fast/dom/HTMLHrElement/hr-color-noshade-attribute.html [ Failure ] crbug.com/591099 fast/dom/HTMLHtmlElement/set-version.html [ Failure ] crbug.com/591099 fast/dom/HTMLImageElement/constructor-mutation-event-dispatch.html [ Failure ] -crbug.com/591099 fast/dom/HTMLImageElement/fallback-image-moved-across-documents.html [ Crash ] +crbug.com/591099 fast/dom/HTMLImageElement/fallback-image-moved-across-documents.html [ Crash Pass ] crbug.com/591099 fast/dom/HTMLImageElement/image-alt-text.html [ Crash Failure ] crbug.com/591099 fast/dom/HTMLImageElement/image-crossOrigin.html [ Failure ] crbug.com/591099 fast/dom/HTMLImageElement/image-dynamic-width.html [ Failure ] crbug.com/591099 fast/dom/HTMLImageElement/image-innerHTML.html [ Failure ] -crbug.com/591099 fast/dom/HTMLImageElement/image-load-cross-document.html [ Crash ] +crbug.com/591099 fast/dom/HTMLImageElement/image-load-cross-document.html [ Crash Failure ] crbug.com/591099 fast/dom/HTMLImageElement/image-longdesc-absolute-url.html [ Failure ] crbug.com/591099 fast/dom/HTMLImageElement/image-lowsrc-getset.html [ Failure ] -crbug.com/591099 fast/dom/HTMLImageElement/image-natural-width-height-svg.html [ Crash ] -crbug.com/591099 fast/dom/HTMLImageElement/image-sizes-1x.html [ Crash ] +crbug.com/591099 fast/dom/HTMLImageElement/image-natural-width-height-svg.html [ Crash Pass ] +crbug.com/591099 fast/dom/HTMLImageElement/image-sizes-1x.html [ Crash Pass ] crbug.com/591099 fast/dom/HTMLImageElement/image-src-absolute-url.html [ Failure ] -crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-1x.html [ Crash ] -crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-duplicate-elimination.html [ Crash ] +crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-1x.html [ Crash Pass ] +crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-duplicate-elimination.html [ Crash Pass ] crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-invalid-url-no-crash.html [ Crash Failure ] -crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-react-to-media-changes-when-image-not-changed.html [ Crash ] -crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-react-to-media-changes-when-viewport-downsized.html [ Crash ] -crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-w-onerror.html [ Crash Failure ] +crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-react-to-media-changes-when-image-not-changed.html [ Crash Pass ] +crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-react-to-media-changes-when-viewport-downsized.html [ Crash Pass ] +crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-w-onerror.html [ Crash Failure Pass ] crbug.com/591099 fast/dom/HTMLImageElement/image-without-renderer-width.html [ Failure ] crbug.com/591099 fast/dom/HTMLImageElement/parse-src.html [ Failure ] -crbug.com/591099 fast/dom/HTMLImageElement/sizes-changed-intrinsic-size-update.html [ Crash ] +crbug.com/591099 fast/dom/HTMLImageElement/sizes-changed-intrinsic-size-update.html [ Crash Pass ] crbug.com/591099 fast/dom/HTMLInputElement/border-attribute-crash.html [ Crash Failure ] crbug.com/591099 fast/dom/HTMLInputElement/clone-input-checked.html [ Failure ] crbug.com/591099 fast/dom/HTMLInputElement/cloned-input-checked-state.html [ Failure ] @@ -8776,8 +8784,8 @@ crbug.com/591099 fast/dom/HTMLLinkElement/programmatically-add-link-with-onload-handler.html [ Failure ] crbug.com/591099 fast/dom/HTMLLinkElement/resolve-url-on-insertion.html [ Failure ] crbug.com/591099 fast/dom/HTMLMeterElement/meter-boundary-values.html [ Crash Failure ] -crbug.com/591099 fast/dom/HTMLMeterElement/meter-element-crash.html [ Crash ] -crbug.com/591099 fast/dom/HTMLMeterElement/meter-element-markup.html [ Crash ] +crbug.com/591099 fast/dom/HTMLMeterElement/meter-element-crash.html [ Crash Pass ] +crbug.com/591099 fast/dom/HTMLMeterElement/meter-element-markup.html [ Crash Pass ] crbug.com/591099 fast/dom/HTMLMeterElement/meter-element-repaint-on-update-value.html [ Failure ] crbug.com/591099 fast/dom/HTMLMeterElement/meter-element-with-child-crash.html [ Failure ] crbug.com/591099 fast/dom/HTMLMeterElement/meter-element.html [ Failure ] @@ -8786,10 +8794,10 @@ crbug.com/591099 fast/dom/HTMLMeterElement/meter-styles-changing-pseudo.html [ Failure ] crbug.com/591099 fast/dom/HTMLMeterElement/meter-styles.html [ Crash Failure ] crbug.com/591099 fast/dom/HTMLMeterElement/set-meter-properties.html [ Failure ] -crbug.com/591099 fast/dom/HTMLObjectElement/HTMLObject-contentWindow-query.html [ Crash ] -crbug.com/591099 fast/dom/HTMLObjectElement/children-changed.html [ Crash ] -crbug.com/591099 fast/dom/HTMLObjectElement/fallback-content-behaviour.html [ Crash ] -crbug.com/591099 fast/dom/HTMLObjectElement/form/nested-form-element.html [ Crash ] +crbug.com/591099 fast/dom/HTMLObjectElement/HTMLObject-contentWindow-query.html [ Crash Pass ] +crbug.com/591099 fast/dom/HTMLObjectElement/children-changed.html [ Crash Pass ] +crbug.com/591099 fast/dom/HTMLObjectElement/fallback-content-behaviour.html [ Crash Failure ] +crbug.com/591099 fast/dom/HTMLObjectElement/form/nested-form-element.html [ Crash Failure ] crbug.com/591099 fast/dom/HTMLObjectElement/form/test1.html [ Failure ] crbug.com/591099 fast/dom/HTMLObjectElement/update-data.html [ Failure ] crbug.com/591099 fast/dom/HTMLObjectElement/vspace-hspace-as-number.html [ Failure ] @@ -8860,7 +8868,7 @@ crbug.com/591099 fast/dom/MutationObserver/observe-attributes.html [ Failure Timeout ] crbug.com/591099 fast/dom/MutationObserver/observe-characterdata.html [ Failure ] crbug.com/591099 fast/dom/MutationObserver/observe-childList.html [ Failure ] -crbug.com/591099 fast/dom/MutationObserver/observe-element-resize.html [ Crash ] +crbug.com/591099 fast/dom/MutationObserver/observe-element-resize.html [ Crash Pass ] crbug.com/591099 fast/dom/MutationObserver/observe-exceptions.html [ Failure ] crbug.com/591099 fast/dom/MutationObserver/observe-options-character-data.html [ Failure ] crbug.com/591099 fast/dom/MutationObserver/observe-subtree.html [ Failure ] @@ -8880,7 +8888,7 @@ crbug.com/591099 fast/dom/Node/initial-values.html [ Failure ] crbug.com/591099 fast/dom/Node/isEqualNode.html [ Failure ] crbug.com/591099 fast/dom/Node/isSupported.html [ Failure ] -crbug.com/591099 fast/dom/Node/mutation-blur.html [ Crash ] +crbug.com/591099 fast/dom/Node/mutation-blur.html [ Crash Failure ] crbug.com/591099 fast/dom/Node/normalize-with-cdata.html [ Failure ] crbug.com/591099 fast/dom/NodeIterator/detach-no-op.html [ Failure ] crbug.com/591099 fast/dom/NodeList/5725058-crash-scenario-1.html [ Failure ] @@ -8893,7 +8901,7 @@ crbug.com/591099 fast/dom/NodeList/nodelist-item-call-as-function.html [ Failure ] crbug.com/591099 fast/dom/NodeList/nodelist-item-with-index.html [ Failure ] crbug.com/591099 fast/dom/NodeList/nodelist-item-with-name.html [ Failure ] -crbug.com/591099 fast/dom/NodeList/nodelist-iterable.html [ Crash ] +crbug.com/591099 fast/dom/NodeList/nodelist-iterable.html [ Crash Pass ] crbug.com/591099 fast/dom/NodeList/nodelist-namespace-invalidation.html [ Failure ] crbug.com/591099 fast/dom/Range-insertNode-crash.html [ Failure ] crbug.com/591099 fast/dom/Range/13000.html [ Failure ] @@ -8922,7 +8930,7 @@ crbug.com/591099 fast/dom/Range/deleted-range-endpoints.html [ Failure ] crbug.com/591099 fast/dom/Range/detach-no-op.html [ Failure ] crbug.com/591099 fast/dom/Range/getClientRects-leading-trailing-whitespaces.html [ Failure ] -crbug.com/591099 fast/dom/Range/getClientRects.html [ Crash ] +crbug.com/591099 fast/dom/Range/getClientRects.html [ Crash Failure ] crbug.com/591099 fast/dom/Range/insertNode-empty-fragment-crash.html [ Failure ] crbug.com/591099 fast/dom/Range/range-clone-empty.html [ Failure ] crbug.com/591099 fast/dom/Range/range-constructor.html [ Failure ] @@ -8961,8 +8969,8 @@ crbug.com/591099 fast/dom/SelectorAPI/viewless-document.html [ Failure ] crbug.com/591099 fast/dom/StyleSheet/css-medialist-item.html [ Failure ] crbug.com/591099 fast/dom/StyleSheet/detached-parent-rule-without-wrapper.html [ Failure ] -crbug.com/591099 fast/dom/StyleSheet/detached-sheet-owner-node-link.html [ Crash ] -crbug.com/591099 fast/dom/StyleSheet/detached-sheet-owner-node.html [ Crash ] +crbug.com/591099 fast/dom/StyleSheet/detached-sheet-owner-node-link.html [ Crash Failure ] +crbug.com/591099 fast/dom/StyleSheet/detached-sheet-owner-node.html [ Crash Failure ] crbug.com/591099 fast/dom/StyleSheet/detached-style-2.html [ Failure ] crbug.com/591099 fast/dom/StyleSheet/detached-style-pi-2.xhtml [ Failure ] crbug.com/591099 fast/dom/StyleSheet/detached-style-pi.xhtml [ Failure ] @@ -9010,25 +9018,25 @@ crbug.com/591099 fast/dom/Window/getMatchedCSSRules-with-pseudo-elements.html [ Failure ] crbug.com/591099 fast/dom/Window/global-opener-function.html [ Crash Failure ] crbug.com/591099 fast/dom/Window/invalid-protocol.html [ Failure ] -crbug.com/591099 fast/dom/Window/lookup-behavior.html [ Crash ] +crbug.com/591099 fast/dom/Window/lookup-behavior.html [ Crash Pass ] crbug.com/591099 fast/dom/Window/mozilla-focus-blur.html [ Failure ] crbug.com/591099 fast/dom/Window/name-and-opener-on-detached-window.html [ Failure ] crbug.com/591099 fast/dom/Window/navigated-window-properties.html [ Failure ] crbug.com/591099 fast/dom/Window/new-window-opener.html [ Failure ] crbug.com/591099 fast/dom/Window/open-after-frame-detached.html [ Failure ] -crbug.com/591099 fast/dom/Window/open-as-popup-vs-tab.html [ Crash ] +crbug.com/591099 fast/dom/Window/open-as-popup-vs-tab.html [ Crash Pass ] crbug.com/591099 fast/dom/Window/open-existing-pop-up-blocking.html [ Failure ] crbug.com/591099 fast/dom/Window/open-invalid-arguments.html [ Failure ] crbug.com/591099 fast/dom/Window/post-message-crash.html [ Failure ] -crbug.com/591099 fast/dom/Window/post-message-detach-in-handler.html [ Crash ] +crbug.com/591099 fast/dom/Window/post-message-detach-in-handler.html [ Crash Failure ] crbug.com/591099 fast/dom/Window/post-message-to-self.html [ Failure ] crbug.com/591099 fast/dom/Window/property-access-in-closure-after-navigation.html [ Failure ] crbug.com/591099 fast/dom/Window/property-access-on-cached-properties-after-frame-navigated.html [ Failure ] -crbug.com/591099 fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced.html [ Crash ] -crbug.com/591099 fast/dom/Window/property-access-on-cached-properties-after-frame-removed.html [ Crash ] +crbug.com/591099 fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced.html [ Crash Failure ] +crbug.com/591099 fast/dom/Window/property-access-on-cached-properties-after-frame-removed.html [ Crash Failure ] crbug.com/591099 fast/dom/Window/property-access-on-cached-window-after-frame-navigated.html [ Timeout ] -crbug.com/591099 fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced.html [ Crash ] -crbug.com/591099 fast/dom/Window/property-access-on-cached-window-after-frame-removed.html [ Crash ] +crbug.com/591099 fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced.html [ Crash Failure ] +crbug.com/591099 fast/dom/Window/property-access-on-cached-window-after-frame-removed.html [ Crash Failure ] crbug.com/591099 fast/dom/Window/querySelectorAll-with-pseudo-elements.html [ Failure ] crbug.com/591099 fast/dom/Window/remove-timeout-crash.html [ Failure ] crbug.com/591099 fast/dom/Window/replaceable.html [ Failure ] @@ -9053,7 +9061,7 @@ crbug.com/591099 fast/dom/Window/window-lookup-precedence.html [ Crash Timeout ] crbug.com/591099 fast/dom/Window/window-object-cross-frame-calls.html [ Failure ] crbug.com/591099 fast/dom/Window/window-onFocus.html [ Crash Failure ] -crbug.com/591099 fast/dom/Window/window-open-no-multiple-windows-from-iframe.html [ Crash ] +crbug.com/591099 fast/dom/Window/window-open-no-multiple-windows-from-iframe.html [ Crash Pass ] crbug.com/591099 fast/dom/Window/window-open-pending-url.html [ Failure ] crbug.com/591099 fast/dom/Window/window-open-with-different-active-and-opener-windows.html [ Failure ] crbug.com/591099 fast/dom/Window/window-postmessage-args.html [ Failure ] @@ -9091,13 +9099,13 @@ crbug.com/591099 fast/dom/blur-contenteditable.html [ Failure ] crbug.com/591099 fast/dom/boolean-attribute-reflection.html [ Failure ] crbug.com/591099 fast/dom/call-a-constructor-as-a-function.html [ Failure ] -crbug.com/591099 fast/dom/canvas-fallback-focus-crash.html [ Crash ] +crbug.com/591099 fast/dom/canvas-fallback-focus-crash.html [ Crash Pass ] crbug.com/591099 fast/dom/canvasContext2d-element-attribute-js-null.html [ Failure ] crbug.com/591099 fast/dom/characterdata-api-arguments.html [ Failure ] crbug.com/591099 fast/dom/children-nodes.html [ Failure ] crbug.com/591099 fast/dom/class-all-whitespace.html [ Failure ] crbug.com/591099 fast/dom/click-method-on-html-element.html [ Failure ] -crbug.com/591099 fast/dom/clientWidthAfterDocumentIsRemoved.html [ Crash ] +crbug.com/591099 fast/dom/clientWidthAfterDocumentIsRemoved.html [ Crash Failure ] crbug.com/591099 fast/dom/clone-contents-0-end-offset.html [ Failure ] crbug.com/591099 fast/dom/clone-node-dynamic-style.html [ Failure ] crbug.com/591099 fast/dom/clone-node-load-event-crash.html [ Failure Pass ] @@ -9116,7 +9124,7 @@ crbug.com/591099 fast/dom/console-log-stack-overflow.html [ Failure ] crbug.com/591099 fast/dom/constants.html [ Crash Failure ] crbug.com/591099 fast/dom/constructed-objects-prototypes.html [ Failure ] -crbug.com/591099 fast/dom/constructor-in-removed-frame.html [ Crash ] +crbug.com/591099 fast/dom/constructor-in-removed-frame.html [ Crash Pass ] crbug.com/591099 fast/dom/constructor-proto.html [ Failure ] crbug.com/591099 fast/dom/constructors-cached.html [ Failure ] crbug.com/591099 fast/dom/constructors-overriding.html [ Failure ] @@ -9126,7 +9134,7 @@ crbug.com/591099 fast/dom/createDocumentType.html [ Failure ] crbug.com/591099 fast/dom/createElementNS-empty-namespace.html [ Failure ] crbug.com/591099 fast/dom/createElementNS-namespace-errors.html [ Failure ] -crbug.com/591099 fast/dom/cross-frame-accessor-throw.html [ Crash ] +crbug.com/591099 fast/dom/cross-frame-accessor-throw.html [ Crash Pass ] crbug.com/591099 fast/dom/cross-frame-node-prototype.html [ Failure ] crbug.com/591099 fast/dom/css-cached-import-rule.html [ Failure ] crbug.com/591099 fast/dom/css-element-attribute-js-null.html [ Failure ] @@ -9143,12 +9151,12 @@ crbug.com/591099 fast/dom/css-set-property-exception.html [ Crash Failure ] crbug.com/591099 fast/dom/css-shorthand-common-value.html [ Failure ] crbug.com/591099 fast/dom/css-stylesheet-candidate-ordering.html [ Failure ] -crbug.com/591099 fast/dom/cssTarget-crash.html [ Crash ] -crbug.com/591099 fast/dom/custom/callback-context.html [ Crash ] +crbug.com/591099 fast/dom/cssTarget-crash.html [ Crash Pass ] +crbug.com/591099 fast/dom/custom/callback-context.html [ Crash Pass ] crbug.com/591099 fast/dom/custom/callback-timing.html [ Failure ] crbug.com/591099 fast/dom/custom/constructor-calls-created-synchronously.html [ Failure ] -crbug.com/591099 fast/dom/custom/crash-without-dom-wrapper.html [ Crash ] -crbug.com/591099 fast/dom/custom/created-callback.html [ Crash ] +crbug.com/591099 fast/dom/custom/crash-without-dom-wrapper.html [ Crash Pass ] +crbug.com/591099 fast/dom/custom/created-callback.html [ Crash Pass ] crbug.com/591099 fast/dom/custom/document-register-basic.html [ Failure ] crbug.com/591099 fast/dom/custom/document-register-namespace.html [ Failure ] crbug.com/591099 fast/dom/custom/document-register-reentrant-null-constructor.html [ Failure ] @@ -9161,7 +9169,7 @@ crbug.com/591099 fast/dom/custom/exception-from-constructor.html [ Failure ] crbug.com/591099 fast/dom/custom/frameElement-crash.html [ Failure ] crbug.com/591099 fast/dom/custom/html-element-type-extension-assert.html [ Failure ] -crbug.com/591099 fast/dom/custom/imports-custom-element-abort.html [ Crash ] +crbug.com/591099 fast/dom/custom/imports-custom-element-abort.html [ Crash Pass ] crbug.com/591099 fast/dom/custom/isolated-world.html [ Failure ] crbug.com/591099 fast/dom/custom/lifecycle-created-createElement-reentrancy.html [ Failure ] crbug.com/591099 fast/dom/custom/lifecycle-created-creation-api.html [ Failure ] @@ -9169,18 +9177,18 @@ crbug.com/591099 fast/dom/custom/lifecycle-created-parser-script.html [ Failure ] crbug.com/591099 fast/dom/custom/lifecycle-created-paste.html [ Failure ] crbug.com/591099 fast/dom/custom/prerender-insert-after-stop.html [ Failure ] -crbug.com/591099 fast/dom/custom/registration-context-delete-during-attribute-changed-retrieval.html [ Crash ] -crbug.com/591099 fast/dom/custom/registration-context-delete-during-attribute-changed.html [ Crash ] -crbug.com/591099 fast/dom/custom/registration-context-delete-during-callback-recursion.html [ Crash ] -crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-base-constructor-retrieval.html [ Crash ] -crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-created-retrieval.html [ Crash ] -crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-extends-retrieval-and-throw.html [ Crash ] -crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-extends-retrieval.html [ Crash ] -crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-prototype-retrieval-and-throw.html [ Crash ] -crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-prototype-retrieval.html [ Crash ] -crbug.com/591099 fast/dom/custom/registration-context-delete-during-upgrade.html [ Crash ] -crbug.com/591099 fast/dom/custom/registration-context-delete-then-register.html [ Crash ] -crbug.com/591099 fast/dom/custom/registration-context-sharing.html [ Crash ] +crbug.com/591099 fast/dom/custom/registration-context-delete-during-attribute-changed-retrieval.html [ Crash Failure ] +crbug.com/591099 fast/dom/custom/registration-context-delete-during-attribute-changed.html [ Crash Failure ] +crbug.com/591099 fast/dom/custom/registration-context-delete-during-callback-recursion.html [ Crash Failure ] +crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-base-constructor-retrieval.html [ Crash Failure ] +crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-created-retrieval.html [ Crash Failure ] +crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-extends-retrieval-and-throw.html [ Crash Failure ] +crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-extends-retrieval.html [ Crash Failure ] +crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-prototype-retrieval-and-throw.html [ Crash Failure ] +crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-prototype-retrieval.html [ Crash Failure ] +crbug.com/591099 fast/dom/custom/registration-context-delete-during-upgrade.html [ Crash Failure ] +crbug.com/591099 fast/dom/custom/registration-context-delete-then-register.html [ Crash Failure ] +crbug.com/591099 fast/dom/custom/registration-context-sharing.html [ Crash Pass ] crbug.com/591099 fast/dom/custom/reparent-unwrapped-custom-element-crash.html [ Crash Pass ] crbug.com/591099 fast/dom/custom/type-extension-undo-assert.html [ Failure ] crbug.com/591099 fast/dom/custom/unresolved-pseudoclass.html [ Failure ] @@ -9188,7 +9196,7 @@ crbug.com/591099 fast/dom/custom/upgrade-candidate-remove-crash.html [ Failure ] crbug.com/591099 fast/dom/dataset-gc.html [ Failure ] crbug.com/591099 fast/dom/dataset-xhtml.xhtml [ Crash Failure ] -crbug.com/591099 fast/dom/defaultView-on-detached-document.html [ Crash ] +crbug.com/591099 fast/dom/defaultView-on-detached-document.html [ Crash Failure ] crbug.com/591099 fast/dom/defaultView.html [ Failure ] crbug.com/591099 fast/dom/dir-auto-insert-text-invalidation.html [ Failure ] crbug.com/591099 fast/dom/dir-no-body.html [ Failure ] @@ -9212,12 +9220,12 @@ crbug.com/591099 fast/dom/dom-add-optionelement.html [ Failure ] crbug.com/591099 fast/dom/dom-constructors.html [ Failure ] crbug.com/591099 fast/dom/dom-instanceof.html [ Failure ] -crbug.com/591099 fast/dom/domListEnumeration.html [ Crash ] +crbug.com/591099 fast/dom/domListEnumeration.html [ Crash Failure ] crbug.com/591099 fast/dom/domstring-attribute-reflection.html [ Timeout ] crbug.com/591099 fast/dom/domtimestamp-is-number.html [ Failure ] crbug.com/591099 fast/dom/element-attribute-js-null.html [ Timeout ] crbug.com/591099 fast/dom/element-bounding-client-rect-relative-to-viewport.html [ Failure ] -crbug.com/591099 fast/dom/elementFromPoint-relative-to-viewport.html [ Crash ] +crbug.com/591099 fast/dom/elementFromPoint-relative-to-viewport.html [ Crash Failure ] crbug.com/591099 fast/dom/elementsFromPoint/elementsFromPoint-iframes.html [ Failure ] crbug.com/591099 fast/dom/elementsFromPoint/elementsFromPoint-svg.html [ Failure ] crbug.com/591099 fast/dom/elementsFromPoint/elementsFromPoint-table.html [ Failure ] @@ -9233,8 +9241,8 @@ crbug.com/591099 fast/dom/exception-no-frame-timeout-crash.html [ Failure ] crbug.com/591099 fast/dom/firstline-fixed-crash.html [ Failure ] crbug.com/591099 fast/dom/focus-contenteditable.html [ Failure ] -crbug.com/591099 fast/dom/focus-navigation-in-plugin.html [ Crash ] -crbug.com/591099 fast/dom/focus-on-hidden-object.html [ Crash ] +crbug.com/591099 fast/dom/focus-navigation-in-plugin.html [ Crash Pass ] +crbug.com/591099 fast/dom/focus-on-hidden-object.html [ Crash Pass ] crbug.com/591099 fast/dom/forced-layout-only-in-document.html [ Failure ] crbug.com/591099 fast/dom/fragment-activation-focuses-target.html [ Crash Failure ] crbug.com/591099 fast/dom/frameElement-accessor-context.html [ Failure ] @@ -9261,7 +9269,7 @@ crbug.com/591099 fast/dom/getElementById-consistency5.html [ Failure ] crbug.com/591099 fast/dom/getElementsByClassName/dumpNodeList.html [ Crash Failure ] crbug.com/591099 fast/dom/getElementsByClassName/non-styled-elements.html [ Failure ] -crbug.com/591099 fast/dom/getelementsbyname-invalidation-cache.html [ Crash ] +crbug.com/591099 fast/dom/getelementsbyname-invalidation-cache.html [ Crash Failure ] crbug.com/591099 fast/dom/getter-on-window-object2.html [ Failure ] crbug.com/591099 fast/dom/global-constructors.html [ Failure ] crbug.com/591099 fast/dom/global-event-handlers.html [ Pass Timeout ] @@ -9270,7 +9278,7 @@ crbug.com/591099 fast/dom/horizontal-scrollbar-in-rtl.html [ Crash Failure ] crbug.com/591099 fast/dom/hover-after-dom-delete-child-invisible-cursor.html [ Failure ] crbug.com/591099 fast/dom/hover-after-dom-delete.html [ Failure ] -crbug.com/591099 fast/dom/hover-node-refcnt-asan-crash.html [ Crash ] +crbug.com/591099 fast/dom/hover-node-refcnt-asan-crash.html [ Crash Pass ] crbug.com/591099 fast/dom/html-collections-named-getter-mandatory-arg.html [ Failure ] crbug.com/591099 fast/dom/html-collections-named-getter.html [ Failure ] crbug.com/591099 fast/dom/html-options-collection-lifetime.html [ Failure ] @@ -9284,7 +9292,7 @@ crbug.com/591099 fast/dom/htmlcollection-protects-base.html [ Failure ] crbug.com/591099 fast/dom/htmlcollection-selectedOptions-namedItem-crash.html [ Failure ] crbug.com/591099 fast/dom/htmlformcontrolscollection-enumerated-properties.html [ Failure ] -crbug.com/591099 fast/dom/htmlformcontrolscollection-no-img.html [ Crash ] +crbug.com/591099 fast/dom/htmlformcontrolscollection-no-img.html [ Crash Pass ] crbug.com/591099 fast/dom/htmloptionscollection-enumerated-properties.html [ Failure ] crbug.com/591099 fast/dom/icon-size-property.html [ Failure ] crbug.com/591099 fast/dom/idl-dictionary-unittest.html [ Failure ] @@ -9301,11 +9309,11 @@ crbug.com/591099 fast/dom/importNodeHTML.html [ Failure ] crbug.com/591099 fast/dom/importNodeXML.xhtml [ Failure Pass ] crbug.com/591099 fast/dom/incompatible-operations.html [ Failure ] -crbug.com/591099 fast/dom/inert/inert-does-not-match-disabled-selector.html [ Crash ] -crbug.com/591099 fast/dom/inert/inert-focus-in-frames.html [ Crash ] -crbug.com/591099 fast/dom/inert/inert-inlines.html [ Crash ] -crbug.com/591099 fast/dom/inert/inert-label-focus.html [ Crash ] -crbug.com/591099 fast/dom/inert/inert-node-is-unfocusable.html [ Crash ] +crbug.com/591099 fast/dom/inert/inert-does-not-match-disabled-selector.html [ Crash Pass ] +crbug.com/591099 fast/dom/inert/inert-focus-in-frames.html [ Crash Pass ] +crbug.com/591099 fast/dom/inert/inert-inlines.html [ Crash Pass ] +crbug.com/591099 fast/dom/inert/inert-label-focus.html [ Crash Pass ] +crbug.com/591099 fast/dom/inert/inert-node-is-unfocusable.html [ Crash Pass ] crbug.com/591099 fast/dom/inline-event-attributes-crash.html [ Failure ] crbug.com/591099 fast/dom/inline-event-attributes-event-param-name.html [ Failure ] crbug.com/591099 fast/dom/inline-event-attributes-lookup-removed-form.html [ Failure ] @@ -9314,12 +9322,12 @@ crbug.com/591099 fast/dom/inline-event-attributes-moved.html [ Failure ] crbug.com/591099 fast/dom/inline-event-attributes-release.html [ Failure ] crbug.com/591099 fast/dom/inner-text-001.html [ Crash Failure ] -crbug.com/591099 fast/dom/inner-text-first-letter.html [ Crash ] +crbug.com/591099 fast/dom/inner-text-first-letter.html [ Crash Failure ] crbug.com/591099 fast/dom/inner-text-rtl.html [ Failure ] crbug.com/591099 fast/dom/inner-text.html [ Crash Failure ] -crbug.com/591099 fast/dom/insertedIntoDocument-child.html [ Crash ] +crbug.com/591099 fast/dom/insertedIntoDocument-child.html [ Crash Failure ] crbug.com/591099 fast/dom/insertedIntoDocument-no-crash.html [ Failure ] -crbug.com/591099 fast/dom/insertedIntoDocument-sibling.html [ Crash ] +crbug.com/591099 fast/dom/insertedIntoDocument-sibling.html [ Crash Failure ] crbug.com/591099 fast/dom/interface-object-proto.html [ Failure ] crbug.com/591099 fast/dom/isEqualNode-after-removeAttribute.html [ Failure ] crbug.com/591099 fast/dom/javascript-backslash.html [ Crash Failure ] @@ -9337,7 +9345,7 @@ crbug.com/591099 fast/dom/navigator-maxTouchPoints.html [ Failure ] crbug.com/591099 fast/dom/navigator-userAgent.html [ Failure ] crbug.com/591099 fast/dom/navigator-vendorSub.html [ Failure ] -crbug.com/591099 fast/dom/navigator-with-content-detached-no-crash.html [ Crash ] +crbug.com/591099 fast/dom/navigator-with-content-detached-no-crash.html [ Crash Failure ] crbug.com/591099 fast/dom/no-elements.html [ Crash Failure ] crbug.com/591099 fast/dom/node-childNodes-idempotence.html [ Failure ] crbug.com/591099 fast/dom/node-filter-detached-iframe-crash.html [ Failure ] @@ -9362,10 +9370,10 @@ crbug.com/591099 fast/dom/nodesFromRect/nodesFromRect-table.html [ Failure ] crbug.com/591099 fast/dom/non-numeric-values-numeric-parameters.html [ Failure ] crbug.com/591099 fast/dom/objc-big-method-name.html [ Failure ] -crbug.com/591099 fast/dom/object-plugin-hides-properties.html [ Crash ] +crbug.com/591099 fast/dom/object-plugin-hides-properties.html [ Crash Failure ] crbug.com/591099 fast/dom/offset-parent-positioned-and-inline.html [ Failure Pass ] crbug.com/591099 fast/dom/onerror-img.html [ Failure ] -crbug.com/591099 fast/dom/onload-open.html [ Crash ] +crbug.com/591099 fast/dom/onload-open.html [ Crash Failure ] crbug.com/591099 fast/dom/open-and-close-by-DOM.html [ Failure ] crbug.com/591099 fast/dom/option-properties.html [ Failure ] crbug.com/591099 fast/dom/outerText-no-element.html [ Failure ] @@ -9398,7 +9406,7 @@ crbug.com/591099 fast/dom/script-styled-size.html [ Failure ] crbug.com/591099 fast/dom/scroll-reveal-left-overflow.html [ Failure ] crbug.com/591099 fast/dom/scroll-reveal-top-overflow.html [ Failure ] -crbug.com/591099 fast/dom/search-shadow-host-crash.html [ Crash ] +crbug.com/591099 fast/dom/search-shadow-host-crash.html [ Crash Pass ] crbug.com/591099 fast/dom/serialize-attribute.xhtml [ Failure ] crbug.com/591099 fast/dom/set-innerHTML.xhtml [ Crash Failure ] crbug.com/591099 fast/dom/setAttribute-using-initial-input-value.html [ Failure ] @@ -9441,16 +9449,16 @@ crbug.com/591099 fast/dom/shadow/drag-to-meter-in-shadow-crash.html [ Failure ] crbug.com/591099 fast/dom/shadow/elements-in-frameless-document.html [ Failure ] crbug.com/591099 fast/dom/shadow/event-path-after-deleting-tree-scope-crash.html [ Failure ] -crbug.com/591099 fast/dom/shadow/event-path-after-iframe-removed.html [ Crash ] -crbug.com/591099 fast/dom/shadow/event-path-load.html [ Crash ] -crbug.com/591099 fast/dom/shadow/event-pseudo.html [ Crash ] +crbug.com/591099 fast/dom/shadow/event-path-after-iframe-removed.html [ Crash Pass ] +crbug.com/591099 fast/dom/shadow/event-path-load.html [ Crash Pass ] +crbug.com/591099 fast/dom/shadow/event-pseudo.html [ Crash Pass ] crbug.com/591099 fast/dom/shadow/events-stopped-at-shadow-boundary.html [ Failure ] -crbug.com/591099 fast/dom/shadow/exposed-object-within-shadow.html [ Crash ] +crbug.com/591099 fast/dom/shadow/exposed-object-within-shadow.html [ Crash Pass ] crbug.com/591099 fast/dom/shadow/flat-tree-traversal-shadow-reprojection.html [ Failure ] crbug.com/591099 fast/dom/shadow/flat-tree-traversal.html [ Failure ] crbug.com/591099 fast/dom/shadow/focus-navigation-negative-tabindex.html [ Failure ] crbug.com/591099 fast/dom/shadow/focus-navigation-skips-non-focusable-shadow-in-iframe.html [ Failure ] -crbug.com/591099 fast/dom/shadow/focus-navigation-with-distributed-nodes.html [ Crash ] +crbug.com/591099 fast/dom/shadow/focus-navigation-with-distributed-nodes.html [ Crash Failure ] crbug.com/591099 fast/dom/shadow/focus-navigation-with-multiple-shadow-roots.html [ Failure ] crbug.com/591099 fast/dom/shadow/focus-navigation.html [ Failure Timeout ] crbug.com/591099 fast/dom/shadow/frameless-media-element-crash.html [ Failure ] @@ -9481,7 +9489,7 @@ crbug.com/591099 fast/dom/shadow/multiple-shadowroot-adopt.html [ Failure ] crbug.com/591099 fast/dom/shadow/multiple-shadowroot.html [ Failure ] crbug.com/591099 fast/dom/shadow/nested-reprojection-inconsistent.html [ Failure ] -crbug.com/591099 fast/dom/shadow/node-distribution-recalc-crash.html [ Crash ] +crbug.com/591099 fast/dom/shadow/node-distribution-recalc-crash.html [ Crash Pass ] crbug.com/591099 fast/dom/shadow/normalize-progress-element-crash.html [ Crash Failure ] crbug.com/591099 fast/dom/shadow/offset-parent-does-not-leak-ua-shadow.html [ Failure ] crbug.com/591099 fast/dom/shadow/offsetWidth-host-style-change.html [ Failure ] @@ -9498,13 +9506,13 @@ crbug.com/591099 fast/dom/shadow/remove-styles-in-shadow-crash-3.html [ Failure ] crbug.com/591099 fast/dom/shadow/remove-stylesheet-from-shadow-crash.html [ Failure ] crbug.com/591099 fast/dom/shadow/select-in-shadowdom.html [ Failure ] -crbug.com/591099 fast/dom/shadow/selection-in-nested-shadow.html [ Crash ] +crbug.com/591099 fast/dom/shadow/selection-in-nested-shadow.html [ Crash Failure ] crbug.com/591099 fast/dom/shadow/selections-in-shadow.html [ Timeout ] crbug.com/591099 fast/dom/shadow/set-attribute-in-shadow-crash.html [ Failure ] crbug.com/591099 fast/dom/shadow/shadow-added-display-none-host.html [ Failure ] crbug.com/591099 fast/dom/shadow/shadow-aware-create-shadow-root.html [ Failure ] crbug.com/591099 fast/dom/shadow/shadow-aware-shadow-root.html [ Failure ] -crbug.com/591099 fast/dom/shadow/shadow-boundary-crossing.html [ Crash ] +crbug.com/591099 fast/dom/shadow/shadow-boundary-crossing.html [ Crash Failure ] crbug.com/591099 fast/dom/shadow/shadow-boundary-events.html [ Failure ] crbug.com/591099 fast/dom/shadow/shadow-contents-event.html [ Crash Failure ] crbug.com/591099 fast/dom/shadow/shadow-disable.html [ Failure ] @@ -9513,7 +9521,7 @@ crbug.com/591099 fast/dom/shadow/shadow-element-distributed-nodes.html [ Failure ] crbug.com/591099 fast/dom/shadow/shadow-element.html [ Failure ] crbug.com/591099 fast/dom/shadow/shadow-hierarchy-exception.html [ Failure ] -crbug.com/591099 fast/dom/shadow/shadow-removechild-and-blur-event.html [ Crash ] +crbug.com/591099 fast/dom/shadow/shadow-removechild-and-blur-event.html [ Crash Failure ] crbug.com/591099 fast/dom/shadow/shadow-reprojection-click.html [ Failure ] crbug.com/591099 fast/dom/shadow/shadow-root-activeElement.html [ Failure ] crbug.com/591099 fast/dom/shadow/shadow-root-append.html [ Failure ] @@ -9539,11 +9547,11 @@ crbug.com/591099 fast/dom/shadow/style-sharing-styles-in-older-shadow-roots.html [ Failure ] crbug.com/591099 fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata.html [ Failure ] crbug.com/591099 fast/dom/shadow/suppress-mutation-events-in-shadow.html [ Crash Failure ] -crbug.com/591099 fast/dom/shadow/svg-style-in-shadow-tree-crash.html [ Crash ] +crbug.com/591099 fast/dom/shadow/svg-style-in-shadow-tree-crash.html [ Crash Pass ] crbug.com/591099 fast/dom/shadow/tab-order-iframe-and-shadow.html [ Failure ] crbug.com/591099 fast/dom/shadow/title-element-in-shadow.html [ Failure ] crbug.com/591099 fast/dom/shadow/touch-event-retargeting.html [ Failure ] -crbug.com/591099 fast/dom/shadow/touch-event.html [ Crash ] +crbug.com/591099 fast/dom/shadow/touch-event.html [ Crash Failure ] crbug.com/591099 fast/dom/shadow/tree-scope-crash.html [ Crash Failure ] crbug.com/591099 fast/dom/shadow/update-text-of-style-in-shadow-dom.html [ Failure ] crbug.com/591099 fast/dom/shadow/user-modify-inheritance.html [ Failure ] @@ -9553,18 +9561,18 @@ crbug.com/591099 fast/dom/style-sheet-candidate-remove-unrendered-document.html [ Failure ] crbug.com/591099 fast/dom/subtree-modified-attributes.html [ Failure ] crbug.com/591099 fast/dom/tab-in-right-alignment.html [ Crash Failure ] -crbug.com/591099 fast/dom/tabindex-behavior.html [ Crash ] +crbug.com/591099 fast/dom/tabindex-behavior.html [ Crash Pass ] crbug.com/591099 fast/dom/tabindex-clamp.html [ Failure ] crbug.com/591099 fast/dom/tabindex-defaults.html [ Failure ] crbug.com/591099 fast/dom/text-api-arguments.html [ Failure ] -crbug.com/591099 fast/dom/text-control-crash-on-select.html [ Crash ] +crbug.com/591099 fast/dom/text-control-crash-on-select.html [ Crash Pass ] crbug.com/591099 fast/dom/timer-throttling-background-page-near-alignment-interval.html [ Failure ] crbug.com/591099 fast/dom/timers-maintain-order-while-throttled.html [ Failure ] crbug.com/591099 fast/dom/title-content-set-innerText-get.xhtml [ Failure ] crbug.com/591099 fast/dom/title-content-write-set.html [ Failure ] crbug.com/591099 fast/dom/vertical-scrollbar-in-rtl-doesnt-fire-onscroll.html [ Failure ] crbug.com/591099 fast/dom/vertical-scrollbar-in-rtl.html [ Crash Failure ] -crbug.com/591099 fast/dom/viewport/viewport-dimensions-iframe.html [ Crash ] +crbug.com/591099 fast/dom/viewport/viewport-dimensions-iframe.html [ Crash Pass ] crbug.com/591099 fast/dom/webtiming-document-open.html [ Failure ] crbug.com/591099 fast/dom/webtiming-navigate-within-document.html [ Failure ] crbug.com/591099 fast/dom/webtiming.html [ Failure ] @@ -9691,7 +9699,7 @@ crbug.com/591099 fast/encoding/invalid-UTF-8-2.html [ Failure ] crbug.com/591099 fast/encoding/invalid-UTF-8.html [ Failure ] crbug.com/591099 fast/encoding/invalid-multi-byte-over-consumption.html [ Failure ] -crbug.com/591099 fast/encoding/invalid-xml.html [ Crash ] +crbug.com/591099 fast/encoding/invalid-xml.html [ Crash Pass ] crbug.com/591099 fast/encoding/japanese-encoding-mix.html [ Failure ] crbug.com/591099 fast/encoding/latin1-unencodables.html [ Crash Failure ] crbug.com/591099 fast/encoding/latin1-winlatin.html [ Failure ] @@ -9740,37 +9748,37 @@ crbug.com/591099 fast/events/anchor-image-scrolled-x-y.html [ Crash Pass Timeout ] crbug.com/591099 fast/events/arrow-keys-on-body.html [ Failure ] crbug.com/591099 fast/events/attempt-select-all-with-wrong-modifier.html [ Failure ] -crbug.com/591099 fast/events/attribute-listener-cloned-from-frameless-doc-context-2.html [ Crash ] -crbug.com/591099 fast/events/attribute-listener-cloned-from-frameless-doc-context.html [ Crash ] +crbug.com/591099 fast/events/attribute-listener-cloned-from-frameless-doc-context-2.html [ Crash Pass ] +crbug.com/591099 fast/events/attribute-listener-cloned-from-frameless-doc-context.html [ Crash Pass ] crbug.com/591099 fast/events/attribute-listener-cloned-from-frameless-doc.xhtml [ Failure ] -crbug.com/591099 fast/events/attribute-listener-extracted-from-frameless-doc-context-2.html [ Crash ] -crbug.com/591099 fast/events/attribute-listener-extracted-from-frameless-doc-context.html [ Crash ] +crbug.com/591099 fast/events/attribute-listener-extracted-from-frameless-doc-context-2.html [ Crash Pass ] +crbug.com/591099 fast/events/attribute-listener-extracted-from-frameless-doc-context.html [ Crash Pass ] crbug.com/591099 fast/events/autoscroll-in-overflow-hidden-html.html [ Failure ] crbug.com/591099 fast/events/autoscroll-in-textarea.html [ Crash Failure ] crbug.com/591099 fast/events/autoscroll-in-textfield.html [ Crash Failure ] crbug.com/591099 fast/events/autoscroll-nonscrollable-iframe-in-scrollable-div.html [ Failure ] -crbug.com/591099 fast/events/autoscroll-select-crash.html [ Crash ] +crbug.com/591099 fast/events/autoscroll-select-crash.html [ Crash Pass ] crbug.com/591099 fast/events/autoscroll-should-not-stop-on-keypress.html [ Failure ] -crbug.com/591099 fast/events/autoscroll-upwards-propagation-no-scroll-iframe.html [ Crash ] +crbug.com/591099 fast/events/autoscroll-upwards-propagation-no-scroll-iframe.html [ Crash Failure ] crbug.com/591099 fast/events/autoscroll-upwards-propagation-overflow-hidden-body.html [ Failure ] -crbug.com/591099 fast/events/autoscroll-upwards-propagation-overflow-hidden-iframe-body.html [ Crash ] +crbug.com/591099 fast/events/autoscroll-upwards-propagation-overflow-hidden-iframe-body.html [ Crash Failure ] crbug.com/591099 fast/events/autoscroll-upwards-propagation.html [ Crash Failure ] crbug.com/591099 fast/events/autoscroll-with-non-scrollable-parent.html [ Failure Pass ] crbug.com/591099 fast/events/autoscroll.html [ Crash Failure ] -crbug.com/591099 fast/events/before-unload-adopt-within-subframes.html [ Crash ] +crbug.com/591099 fast/events/before-unload-adopt-within-subframes.html [ Crash Failure ] crbug.com/591099 fast/events/before-unload-crash.html [ Failure ] crbug.com/591099 fast/events/before-unload-forbidden-navigation.html [ Failure ] crbug.com/591099 fast/events/before-unload-in-multiple-subframes.html [ Failure ] crbug.com/591099 fast/events/before-unload-in-subframe.html [ Failure ] crbug.com/591099 fast/events/before-unload-javascript-navigation.html [ Failure ] crbug.com/591099 fast/events/before-unload-remove-and-add-subframe.html [ Failure ] -crbug.com/591099 fast/events/before-unload-remove-itself.html [ Crash ] +crbug.com/591099 fast/events/before-unload-remove-itself.html [ Crash Failure ] crbug.com/591099 fast/events/before-unload-return-bad-value.html [ Failure ] crbug.com/591099 fast/events/before-unload-return-value-from-listener.html [ Failure ] crbug.com/591099 fast/events/before-unload-returnValue.html [ Failure ] crbug.com/591099 fast/events/before-unload-with-subframes.html [ Failure ] crbug.com/591099 fast/events/blur-focus-window-should-blur-focus-element.html [ Failure ] -crbug.com/591099 fast/events/blur-remove-parent-crash.html [ Crash ] +crbug.com/591099 fast/events/blur-remove-parent-crash.html [ Crash Pass ] crbug.com/591099 fast/events/bogus-dropEffect-effectAllowed.html [ Failure ] crbug.com/591099 fast/events/bogus-event-listener-invalidation.html [ Failure ] crbug.com/591099 fast/events/caller-access-from-event-listener.html [ Failure ] @@ -9783,7 +9791,7 @@ crbug.com/591099 fast/events/click-after-mousedown-cancel.html [ Failure ] crbug.com/591099 fast/events/click-focus-anchor.html [ Failure ] crbug.com/591099 fast/events/click-focus-svganchor-has-ring.html [ Failure ] -crbug.com/591099 fast/events/click-over-descendant-elements.html [ Crash ] +crbug.com/591099 fast/events/click-over-descendant-elements.html [ Crash Failure ] crbug.com/591099 fast/events/click-range-slider.html [ Failure ] crbug.com/591099 fast/events/click-svganchor-blur-refocus-window.html [ Failure ] crbug.com/591099 fast/events/click-svganchor-refocus-window.html [ Failure ] @@ -9825,7 +9833,7 @@ crbug.com/591099 fast/events/constructors/webkit-animation-event-constructor.html [ Failure ] crbug.com/591099 fast/events/constructors/webkit-transition-event-constructor.html [ Failure ] crbug.com/591099 fast/events/constructors/wheel-event-constructor.html [ Failure Timeout ] -crbug.com/591099 fast/events/content-changed-during-drop.html [ Crash ] +crbug.com/591099 fast/events/content-changed-during-drop.html [ Crash Failure ] crbug.com/591099 fast/events/context-no-deselect.html [ Crash Failure ] crbug.com/591099 fast/events/context-nodrag.html [ Failure ] crbug.com/591099 fast/events/contextmenu-scrolled-page-with-frame.html [ Failure ] @@ -9838,7 +9846,7 @@ crbug.com/591099 fast/events/dispatch-to-function-with-handle-event.html [ Failure ] crbug.com/591099 fast/events/dispatch-to-handle-event.html [ Failure ] crbug.com/591099 fast/events/document-elementFromPoint.html [ Failure Pass ] -crbug.com/591099 fast/events/domactivate-sets-underlying-click-event-as-handled.html [ Crash ] +crbug.com/591099 fast/events/domactivate-sets-underlying-click-event-as-handled.html [ Crash Failure ] crbug.com/591099 fast/events/domnodeinsertedintodocument-dispatched-post-rendering.html [ Failure ] crbug.com/591099 fast/events/dont-loose-last-event.html [ Failure ] crbug.com/591099 fast/events/drag-and-drop-autoscroll-inner-frame.html [ Timeout ] @@ -9846,8 +9854,8 @@ crbug.com/591099 fast/events/drag-and-drop-dataTransfer-types-nocrash.html [ Failure ] crbug.com/591099 fast/events/drag-and-drop-fire-drag-dragover.html [ Failure ] crbug.com/591099 fast/events/drag-and-drop-set-drag-data-arguments.html [ Failure ] -crbug.com/591099 fast/events/drag-and-drop-subframe-dataTransfer.html [ Crash ] -crbug.com/591099 fast/events/drag-and-drop.html [ Crash Timeout ] +crbug.com/591099 fast/events/drag-and-drop-subframe-dataTransfer.html [ Crash Pass ] +crbug.com/591099 fast/events/drag-and-drop.html [ Crash Failure Timeout ] crbug.com/591099 fast/events/drag-customData.html [ Failure Timeout ] crbug.com/591099 fast/events/drag-dataTransferItemList-file-handling.html [ Crash Failure ] crbug.com/591099 fast/events/drag-dataTransferItemList.html [ Failure ] @@ -9890,24 +9898,24 @@ crbug.com/591099 fast/events/event-on-culled_inline.html [ Failure ] crbug.com/591099 fast/events/event-properties-gc.html [ Failure ] crbug.com/591099 fast/events/event-sender-mouseleave.html [ Failure ] -crbug.com/591099 fast/events/event-targets.html [ Crash ] +crbug.com/591099 fast/events/event-targets.html [ Crash Failure ] crbug.com/591099 fast/events/event-trace.html [ Failure ] crbug.com/591099 fast/events/event-trusted.html [ Failure ] crbug.com/591099 fast/events/event-view-toString.html [ Failure ] -crbug.com/591099 fast/events/file-input-hidden-in-ondrop.html [ Crash ] -crbug.com/591099 fast/events/fire-mousedown-while-pressing-mouse-button.html [ Crash ] +crbug.com/591099 fast/events/file-input-hidden-in-ondrop.html [ Crash Pass ] +crbug.com/591099 fast/events/fire-mousedown-while-pressing-mouse-button.html [ Crash Failure ] crbug.com/591099 fast/events/fire-popstate-event.html [ Failure ] crbug.com/591099 fast/events/fire-scroll-event-element.html [ Failure Timeout ] crbug.com/591099 fast/events/fire-scroll-event.html [ Failure ] crbug.com/591099 fast/events/flags-unset-on-init-event.html [ Failure ] -crbug.com/591099 fast/events/focus-change-assertion.html [ Crash ] -crbug.com/591099 fast/events/focus-change-crash.html [ Crash Failure ] -crbug.com/591099 fast/events/focus-change-crash2.html [ Crash Timeout ] +crbug.com/591099 fast/events/focus-change-assertion.html [ Crash Pass ] +crbug.com/591099 fast/events/focus-change-crash.html [ Crash Failure Pass ] +crbug.com/591099 fast/events/focus-change-crash2.html [ Crash Failure Timeout ] crbug.com/591099 fast/events/focus-click-on-non-mouse-focusable-element.html [ Failure ] crbug.com/591099 fast/events/focus-event-source-device-from-keyboard.html [ Failure ] crbug.com/591099 fast/events/focus-event-source-device-from-mouse.html [ Failure ] crbug.com/591099 fast/events/focus-event-source-device-from-touch.html [ Failure ] -crbug.com/591099 fast/events/focus-iframe-crash.html [ Crash ] +crbug.com/591099 fast/events/focus-iframe-crash.html [ Crash Pass ] crbug.com/591099 fast/events/focus-remove-focuesed-node.html [ Failure ] crbug.com/591099 fast/events/form-onchange.html [ Failure ] crbug.com/591099 fast/events/frame-click-clear-focus.html [ Failure ] @@ -9934,19 +9942,19 @@ crbug.com/591099 fast/events/init-message-event-isolated-world.html [ Failure ] crbug.com/591099 fast/events/init-message-event.html [ Failure ] crbug.com/591099 fast/events/initkeyboardevent-crash.html [ Failure ] -crbug.com/591099 fast/events/input-element-display-none-in-dragleave-crash.html [ Crash ] +crbug.com/591099 fast/events/input-element-display-none-in-dragleave-crash.html [ Crash Pass ] crbug.com/591099 fast/events/input-focus-no-duplicate-events.html [ Failure ] crbug.com/591099 fast/events/input-tab-focus-no-duplicate-events.html [ Failure ] -crbug.com/591099 fast/events/inputText-never-fired-on-keydown-cancel.html [ Crash ] -crbug.com/591099 fast/events/inputevents/before-input-order-typing-command.html [ Crash ] -crbug.com/591099 fast/events/inputevents/before-input-ranges.html [ Crash ] -crbug.com/591099 fast/events/inputevents/beforeinput-remove-iframe-crash.html [ Crash ] +crbug.com/591099 fast/events/inputText-never-fired-on-keydown-cancel.html [ Crash Failure ] +crbug.com/591099 fast/events/inputevents/before-input-order-typing-command.html [ Crash Pass ] +crbug.com/591099 fast/events/inputevents/before-input-ranges.html [ Crash Pass ] +crbug.com/591099 fast/events/inputevents/beforeinput-remove-iframe-crash.html [ Crash Failure ] crbug.com/591099 fast/events/inputevents/inputevent-cut-paste.html [ Failure ] crbug.com/591099 fast/events/inputevents/inputevent-data-keyboard.html [ Failure ] -crbug.com/591099 fast/events/inputevents/inputevent-drag-drop.html [ Crash Failure ] +crbug.com/591099 fast/events/inputevents/inputevent-drag-drop.html [ Crash Failure Pass ] crbug.com/591099 fast/events/inputevents/inputevent-execcommand.html [ Failure ] -crbug.com/591099 fast/events/inputevents/inputevent-keyboard.html [ Crash ] -crbug.com/591099 fast/events/inputevents/inputevent-transpose.html [ Crash Failure ] +crbug.com/591099 fast/events/inputevents/inputevent-keyboard.html [ Crash Failure ] +crbug.com/591099 fast/events/inputevents/inputevent-transpose.html [ Crash Failure Pass ] crbug.com/591099 fast/events/invalid-001.html [ Crash Failure ] crbug.com/591099 fast/events/invalid-002.html [ Crash Failure ] crbug.com/591099 fast/events/invalid-003.html [ Crash Failure ] @@ -9969,20 +9977,20 @@ crbug.com/591099 fast/events/keydown-leftright-keys.html [ Failure ] crbug.com/591099 fast/events/keydown-numlock-standard-location.html [ Failure ] crbug.com/591099 fast/events/keydown-numpad-keys.html [ Failure ] -crbug.com/591099 fast/events/keydown-remove-frame.html [ Crash ] +crbug.com/591099 fast/events/keydown-remove-frame.html [ Crash Failure ] crbug.com/591099 fast/events/keyevent-iframe-removed-crash.html [ Failure ] crbug.com/591099 fast/events/keypress-focus-change.html [ Failure ] -crbug.com/591099 fast/events/keypress-removed-node.html [ Crash ] +crbug.com/591099 fast/events/keypress-removed-node.html [ Crash Failure ] crbug.com/591099 fast/events/main-world-does-not-override-keystate.html [ Failure ] -crbug.com/591099 fast/events/max-tabindex-focus.html [ Crash ] +crbug.com/591099 fast/events/max-tabindex-focus.html [ Crash Pass ] crbug.com/591099 fast/events/media-element-focus-tab.html [ Failure ] -crbug.com/591099 fast/events/media-focus-in-standalone-media-document.html [ Crash ] +crbug.com/591099 fast/events/media-focus-in-standalone-media-document.html [ Crash Pass ] crbug.com/591099 fast/events/menu-key-context-menu-document-pinch-zoom.html [ Failure ] crbug.com/591099 fast/events/menu-key-context-menu-document.html [ Failure ] crbug.com/591099 fast/events/menu-key-context-menu-position.html [ Failure ] -crbug.com/591099 fast/events/menu-key-context-menu-reveal-focus.html [ Crash ] +crbug.com/591099 fast/events/menu-key-context-menu-reveal-focus.html [ Crash Pass ] crbug.com/591099 fast/events/menu-key-context-menu.html [ Failure ] -crbug.com/591099 fast/events/menu-key-no-mouse-down.html [ Crash ] +crbug.com/591099 fast/events/menu-key-no-mouse-down.html [ Crash Pass ] crbug.com/591099 fast/events/message-channel-gc-2.html [ Failure ] crbug.com/591099 fast/events/message-channel-gc-3.html [ Failure ] crbug.com/591099 fast/events/message-channel-gc-4.html [ Failure ] @@ -9991,18 +9999,18 @@ crbug.com/591099 fast/events/message-event-max-ports.html [ Failure ] crbug.com/591099 fast/events/message-port-clone.html [ Failure ] crbug.com/591099 fast/events/message-port-close.html [ Failure ] -crbug.com/591099 fast/events/message-port-constructor-for-deleted-document.html [ Crash ] +crbug.com/591099 fast/events/message-port-constructor-for-deleted-document.html [ Crash Failure ] crbug.com/591099 fast/events/message-port-context-destroyed.html [ Failure ] -crbug.com/591099 fast/events/message-port-deleted-document.html [ Crash ] -crbug.com/591099 fast/events/message-port-deleted-frame.html [ Crash ] -crbug.com/591099 fast/events/message-port-gc-closed-cloned.html [ Crash ] -crbug.com/591099 fast/events/message-port-gc-closed.html [ Crash ] +crbug.com/591099 fast/events/message-port-deleted-document.html [ Crash Failure ] +crbug.com/591099 fast/events/message-port-deleted-frame.html [ Crash Failure ] +crbug.com/591099 fast/events/message-port-gc-closed-cloned.html [ Crash Failure ] +crbug.com/591099 fast/events/message-port-gc-closed.html [ Crash Failure ] crbug.com/591099 fast/events/message-port-inactive-document.html [ Failure ] crbug.com/591099 fast/events/message-port-multi.html [ Failure ] crbug.com/591099 fast/events/message-port-no-wrapper.html [ Failure ] crbug.com/591099 fast/events/message-port-start-and-close-different-microtask.html [ Failure ] crbug.com/591099 fast/events/message-port-start-and-close-same-microtask.html [ Failure ] -crbug.com/591099 fast/events/message-port-transferables.html [ Crash ] +crbug.com/591099 fast/events/message-port-transferables.html [ Crash Pass ] crbug.com/591099 fast/events/message-port.html [ Failure ] crbug.com/591099 fast/events/middleClickAutoscroll-click-hyperlink.html [ Failure ] crbug.com/591099 fast/events/middleClickAutoscroll-drag-scrollable-iframe-div.html [ Failure ] @@ -10052,18 +10060,18 @@ crbug.com/591099 fast/events/mutation-during-insert-before.html [ Failure ] crbug.com/591099 fast/events/mutation-during-replace-child-2.html [ Failure ] crbug.com/591099 fast/events/mutation-during-replace-child.html [ Failure ] -crbug.com/591099 fast/events/nested-event-remove-node-crash.html [ Crash ] +crbug.com/591099 fast/events/nested-event-remove-node-crash.html [ Crash Pass ] crbug.com/591099 fast/events/no-blur-on-enter-button.html [ Failure ] -crbug.com/591099 fast/events/offsetX-offsetY-svg.html [ Crash ] +crbug.com/591099 fast/events/offsetX-offsetY-svg.html [ Crash Pass ] crbug.com/591099 fast/events/offsetX-offsetY.html [ Failure Timeout ] crbug.com/591099 fast/events/onbeforeunload-focused-iframe.html [ Failure ] -crbug.com/591099 fast/events/onblur-remove.html [ Crash ] +crbug.com/591099 fast/events/onblur-remove.html [ Crash Failure ] crbug.com/591099 fast/events/onchange-passwordfield.html [ Failure ] crbug.com/591099 fast/events/onchange-range-slider.html [ Failure ] crbug.com/591099 fast/events/onchange-searchfield.html [ Failure ] crbug.com/591099 fast/events/onchange-select-popup.html [ Failure ] -crbug.com/591099 fast/events/onchange-setvalue.html [ Crash ] -crbug.com/591099 fast/events/onchange-text-form-field.html [ Crash ] +crbug.com/591099 fast/events/onchange-setvalue.html [ Crash Pass ] +crbug.com/591099 fast/events/onchange-text-form-field.html [ Crash Pass ] crbug.com/591099 fast/events/onchange-textfield.html [ Failure ] crbug.com/591099 fast/events/onclick-list-marker.html [ Crash Failure ] crbug.com/591099 fast/events/onload-after-document-close-no-subresource.html [ Failure ] @@ -10072,16 +10080,16 @@ crbug.com/591099 fast/events/onload-re-entry.html [ Failure ] crbug.com/591099 fast/events/onload-single-line-comment.html [ Failure ] crbug.com/591099 fast/events/onload-webkit-before-webcore.html [ Failure ] -crbug.com/591099 fast/events/onloadFrameCrash.html [ Crash ] +crbug.com/591099 fast/events/onloadFrameCrash.html [ Crash Pass ] crbug.com/591099 fast/events/only-valid-drop-targets-receive-file-drop.html [ Failure ] crbug.com/591099 fast/events/onsubmit-bubbling.html [ Failure ] crbug.com/591099 fast/events/page-scaled-mouse-click-iframe.html [ Failure ] crbug.com/591099 fast/events/page-scaled-mouse-click.html [ Failure ] crbug.com/591099 fast/events/page-visibility-bubble.html [ Failure ] -crbug.com/591099 fast/events/page-visibility-iframe-delete-test.html [ Crash ] +crbug.com/591099 fast/events/page-visibility-iframe-delete-test.html [ Crash Failure ] crbug.com/591099 fast/events/page-visibility-iframe-move-test.html [ Failure ] crbug.com/591099 fast/events/page-visibility-iframe-propagation-test.html [ Failure ] -crbug.com/591099 fast/events/page-visibility-iframe-unload.html [ Crash ] +crbug.com/591099 fast/events/page-visibility-iframe-unload.html [ Crash Failure ] crbug.com/591099 fast/events/page-visibility-null-view.html [ Failure ] crbug.com/591099 fast/events/page-visibility-prefixed.html [ Failure ] crbug.com/591099 fast/events/page-visibility-transition-test.html [ Failure ] @@ -10091,7 +10099,7 @@ crbug.com/591099 fast/events/pointer-events.html [ Failure ] crbug.com/591099 fast/events/pointerevents/fake-mouse-event-pointer-types.html [ Failure ] crbug.com/591099 fast/events/pointerevents/mouse-node-remove.html [ Failure ] -crbug.com/591099 fast/events/pointerevents/mouse-on-object.html [ Crash ] +crbug.com/591099 fast/events/pointerevents/mouse-on-object.html [ Crash Failure ] crbug.com/591099 fast/events/pointerevents/mouse-pointer-boundary-events-for-shadowdom.html [ Failure Pass ] crbug.com/591099 fast/events/pointerevents/mouse-pointer-capture-transition-events.html [ Timeout ] crbug.com/591099 fast/events/pointerevents/mouse-pointer-capture.html [ Failure Timeout ] @@ -10104,7 +10112,7 @@ crbug.com/591099 fast/events/pointerevents/multi-pointer-preventdefault.html [ Failure Timeout ] crbug.com/591099 fast/events/pointerevents/pointer-event-properties-in-iframe.html [ Failure ] crbug.com/591099 fast/events/pointerevents/pointer-use-count.html [ Failure ] -crbug.com/591099 fast/events/pointerevents/pointerevent_touch-action-pinch_zoom_touch.html [ Crash ] +crbug.com/591099 fast/events/pointerevents/pointerevent_touch-action-pinch_zoom_touch.html [ Crash Pass ] crbug.com/591099 fast/events/pointerevents/touch-capture-in-iframe.html [ Timeout ] crbug.com/591099 fast/events/pointerevents/touch-capture.html [ Failure Timeout ] crbug.com/591099 fast/events/pointerevents/touch-pointer-events.html [ Failure ] @@ -10115,30 +10123,30 @@ crbug.com/591099 fast/events/popup-allowed-from-gesture-only-once-iframes.html [ Timeout ] crbug.com/591099 fast/events/popup-allowed-from-gesture-only-once-two-events.html [ Failure ] crbug.com/591099 fast/events/popup-allowed-from-gesture-only-once.html [ Failure Timeout ] -crbug.com/591099 fast/events/popup-allowed-from-pointerup-exactly-once.html [ Crash ] +crbug.com/591099 fast/events/popup-allowed-from-pointerup-exactly-once.html [ Crash Pass ] crbug.com/591099 fast/events/popup-blocked-from-different-frames.html [ Failure ] crbug.com/591099 fast/events/popup-blocked-from-wrong-event.html [ Failure ] crbug.com/591099 fast/events/popup-blocking-click-in-iframe.html [ Timeout ] crbug.com/591099 fast/events/popup-forwarded-gesture-blocked.html [ Failure ] crbug.com/591099 fast/events/popup-forwarded-gesture.html [ Failure ] crbug.com/591099 fast/events/programmatic-check-no-change-event.html [ Failure ] -crbug.com/591099 fast/events/recorded-keydown-event.html [ Crash ] +crbug.com/591099 fast/events/recorded-keydown-event.html [ Crash Failure ] crbug.com/591099 fast/events/related-target-focusevent.html [ Failure Timeout ] crbug.com/591099 fast/events/related-target.html [ Failure ] crbug.com/591099 fast/events/relative-offset-of-simulated-click.html [ Failure ] crbug.com/591099 fast/events/remove-first-event-listener-while-firing.html [ Failure ] -crbug.com/591099 fast/events/remove-shadow-host-crash.html [ Crash ] +crbug.com/591099 fast/events/remove-shadow-host-crash.html [ Crash Failure ] crbug.com/591099 fast/events/remove-target-in-mouseup-deep.html [ Failure ] crbug.com/591099 fast/events/remove-target-in-mouseup-insertback.html [ Failure ] crbug.com/591099 fast/events/remove-target-in-mouseup-twice.html [ Failure ] crbug.com/591099 fast/events/remove-target-in-mouseup.html [ Crash Failure ] -crbug.com/591099 fast/events/remove-target-with-shadow-in-drag.html [ Crash ] +crbug.com/591099 fast/events/remove-target-with-shadow-in-drag.html [ Crash Failure ] crbug.com/591099 fast/events/remove-text-node-in-mouseup.html [ Failure ] crbug.com/591099 fast/events/resize-raf-timing.html [ Failure ] crbug.com/591099 fast/events/reveal-link-when-focused.html [ Failure ] crbug.com/591099 fast/events/right-click-focus.html [ Failure ] crbug.com/591099 fast/events/scale-and-scroll-div.html [ Failure ] -crbug.com/591099 fast/events/scoped/editing-commands.html [ Crash ] +crbug.com/591099 fast/events/scoped/editing-commands.html [ Crash Failure ] crbug.com/591099 fast/events/scroll-after-click-on-tab-index.html [ Failure ] crbug.com/591099 fast/events/scroll-div-with-prevent-default-in-subframe.html [ Failure Pass ] crbug.com/591099 fast/events/scroll-event-does-not-bubble.html [ Pass Timeout ] @@ -10148,9 +10156,9 @@ crbug.com/591099 fast/events/scroll-event-raf-timing.html [ Failure ] crbug.com/591099 fast/events/scroll-to-anchor-in-overflow-hidden.html [ Failure ] crbug.com/591099 fast/events/select-element.html [ Timeout ] -crbug.com/591099 fast/events/select-onchange-crash.html [ Crash ] -crbug.com/591099 fast/events/select-onchange-mouse-released-outside.html [ Crash ] -crbug.com/591099 fast/events/selectionchange-iframe.html [ Crash ] +crbug.com/591099 fast/events/select-onchange-crash.html [ Crash Failure ] +crbug.com/591099 fast/events/select-onchange-mouse-released-outside.html [ Crash Failure ] +crbug.com/591099 fast/events/selectionchange-iframe.html [ Crash Failure ] crbug.com/591099 fast/events/selectionchange-user-initiated.html [ Crash Failure ] crbug.com/591099 fast/events/selectstart-by-arrow-keys-prevent-default.html [ Failure ] crbug.com/591099 fast/events/selectstart-by-arrow-keys.html [ Failure ] @@ -10161,11 +10169,11 @@ crbug.com/591099 fast/events/selectstart-on-selectall.html [ Failure ] crbug.com/591099 fast/events/selectstart-prevent-selectall.html [ Crash Failure ] crbug.com/591099 fast/events/selectstart-prevent-selection-on-right-click.html [ Failure ] -crbug.com/591099 fast/events/sequential-focus-navigation-starting-point.html [ Crash ] +crbug.com/591099 fast/events/sequential-focus-navigation-starting-point.html [ Crash Failure ] crbug.com/591099 fast/events/setDragImage-with-detached-node.html [ Failure ] crbug.com/591099 fast/events/simulated-click-by-alt-enter.html [ Failure ] crbug.com/591099 fast/events/simulated-click-coords.html [ Failure ] -crbug.com/591099 fast/events/simulated-click-disabled.html [ Crash ] +crbug.com/591099 fast/events/simulated-click-disabled.html [ Crash Failure ] crbug.com/591099 fast/events/simulated-click-on-anchor-with-target-blank.html [ Failure ] crbug.com/591099 fast/events/space-scroll-event.html [ Failure ] crbug.com/591099 fast/events/space-scroll-textinput-canceled.html [ Failure ] @@ -10181,20 +10189,20 @@ crbug.com/591099 fast/events/tab-imagemap.html [ Failure ] crbug.com/591099 fast/events/tab-is-focusable-assert.html [ Failure ] crbug.com/591099 fast/events/tab-test-not-visible-imagemap.html [ Failure ] -crbug.com/591099 fast/events/tabindex-focus-chain.html [ Crash ] +crbug.com/591099 fast/events/tabindex-focus-chain.html [ Crash Pass ] crbug.com/591099 fast/events/touch/basic-multi-touch-events-limited.html [ Failure ] crbug.com/591099 fast/events/touch/basic-multi-touch-events.html [ Failure ] crbug.com/591099 fast/events/touch/basic-single-touch-events.html [ Failure ] crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-animation.html [ Failure ] crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-global.html [ Failure ] -crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-iframe-disappears.html [ Crash ] +crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-iframe-disappears.html [ Crash Pass ] crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-many.html [ Failure ] crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-non-composited-scroll.html [ Failure ] crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-scroll.html [ Failure ] crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-squashing.html [ Failure ] crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-transform-changed-nolayout.html [ Failure ] crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-trigger-commit.html [ Failure ] -crbug.com/591099 fast/events/touch/compositor-touch-hit-rects.html [ Crash ] +crbug.com/591099 fast/events/touch/compositor-touch-hit-rects.html [ Crash Failure ] crbug.com/591099 fast/events/touch/document-create-touch-list-crash.html [ Failure ] crbug.com/591099 fast/events/touch/document-create-touch-list.html [ Failure ] crbug.com/591099 fast/events/touch/document-create-touch.html [ Failure ] @@ -10224,7 +10232,7 @@ crbug.com/591099 fast/events/touch/gesture/gesture-tap-frame-scrolled.html [ Failure ] crbug.com/591099 fast/events/touch/gesture/gesture-tap-hover-clear.html [ Failure ] crbug.com/591099 fast/events/touch/gesture/gesture-tap-hover-state-iframe.html [ Failure ] -crbug.com/591099 fast/events/touch/gesture/gesture-tap-input-after-composition.html [ Crash ] +crbug.com/591099 fast/events/touch/gesture/gesture-tap-input-after-composition.html [ Crash Pass ] crbug.com/591099 fast/events/touch/gesture/gesture-tap-mouse-events-between-frames.html [ Failure ] crbug.com/591099 fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure ] crbug.com/591099 fast/events/touch/gesture/gesture-tap-near-iframe.html [ Failure ] @@ -10232,7 +10240,7 @@ crbug.com/591099 fast/events/touch/gesture/gesture-tap-paragraph-end.html [ Failure ] crbug.com/591099 fast/events/touch/gesture/gesture-tap-result.html [ Crash Failure ] crbug.com/591099 fast/events/touch/gesture/gesture-tap-scrolled.html [ Failure ] -crbug.com/591099 fast/events/touch/gesture/gesture-tap-setrangetext-with-events.html [ Crash ] +crbug.com/591099 fast/events/touch/gesture/gesture-tap-setrangetext-with-events.html [ Crash Pass ] crbug.com/591099 fast/events/touch/gesture/long-press-drag-drop-touch-editing-combined-in-iframe.html [ Failure ] crbug.com/591099 fast/events/touch/gesture/long-press-drag-drop-touch-editing-combined.html [ Failure ] crbug.com/591099 fast/events/touch/gesture/long-press-focuses-frame.html [ Failure ] @@ -10280,7 +10288,7 @@ crbug.com/591099 fast/events/touch/page-scaled-touch-gesture-click.html [ Failure ] crbug.com/591099 fast/events/touch/send-oncancel-event.html [ Failure ] crbug.com/591099 fast/events/touch/tap-highlight-color.html [ Failure ] -crbug.com/591099 fast/events/touch/touch-action-range-input-crash.html [ Crash ] +crbug.com/591099 fast/events/touch/touch-action-range-input-crash.html [ Crash Pass ] crbug.com/591099 fast/events/touch/touch-action-range-input.html [ Timeout ] crbug.com/591099 fast/events/touch/touch-action-touch-handlers.html [ Failure ] crbug.com/591099 fast/events/touch/touch-before-pressing-spin-button.html [ Crash Failure ] @@ -10288,7 +10296,7 @@ crbug.com/591099 fast/events/touch/touch-event-dispatch-no-crash.html [ Failure ] crbug.com/591099 fast/events/touch/touch-event-source-device-event-sender.html [ Failure ] crbug.com/591099 fast/events/touch/touch-fractional-coordinates.html [ Failure ] -crbug.com/591099 fast/events/touch/touch-handler-assert-input-range.html [ Crash ] +crbug.com/591099 fast/events/touch/touch-handler-assert-input-range.html [ Crash Failure ] crbug.com/591099 fast/events/touch/touch-handler-count.html [ Failure ] crbug.com/591099 fast/events/touch/touch-handler-iframe-plugin-assert.html [ Failure ] crbug.com/591099 fast/events/touch/touch-handler-iframe-unload-assert.html [ Failure ] @@ -10338,18 +10346,18 @@ crbug.com/591099 fast/events/xsl-onload.xhtml [ Failure ] crbug.com/591099 fast/eventsource/eventsource-attribute-listeners.html [ Failure ] crbug.com/591099 fast/eventsource/eventsource-constructor.html [ Failure ] -crbug.com/591099 fast/files/apply-blob-url-to-img.html [ Crash ] +crbug.com/591099 fast/files/apply-blob-url-to-img.html [ Crash Pass ] crbug.com/591099 fast/files/blob-close-read.html [ Failure ] crbug.com/591099 fast/files/blob-close-revoke.html [ Failure ] crbug.com/591099 fast/files/blob-close.html [ Failure ] crbug.com/591099 fast/files/blob-constructor.html [ Crash Failure ] crbug.com/591099 fast/files/blob-parts-slice-test.html [ Failure ] -crbug.com/591099 fast/files/blob-reading-from-form-file.html [ Crash ] +crbug.com/591099 fast/files/blob-reading-from-form-file.html [ Crash Pass ] crbug.com/591099 fast/files/blob-slice-test.html [ Crash Failure ] crbug.com/591099 fast/files/file-constructor.html [ Failure ] crbug.com/591099 fast/files/file-in-input-display.html [ Crash Failure ] crbug.com/591099 fast/files/file-list-test.html [ Crash Failure ] -crbug.com/591099 fast/files/file-reader-abort-gc-iframe.html [ Crash ] +crbug.com/591099 fast/files/file-reader-abort-gc-iframe.html [ Crash Failure ] crbug.com/591099 fast/files/file-reader-detached-no-crash.html [ Failure ] crbug.com/591099 fast/files/file-reader-fffd.html [ Failure ] crbug.com/591099 fast/files/file-reader-methods-illegal-arguments.html [ Failure ] @@ -10413,7 +10421,7 @@ crbug.com/591099 fast/forms/006.html [ Failure ] crbug.com/591099 fast/forms/007.html [ Failure ] crbug.com/591099 fast/forms/11423.html [ Crash Failure ] -crbug.com/591099 fast/forms/25153.html [ Crash ] +crbug.com/591099 fast/forms/25153.html [ Crash Pass ] crbug.com/591099 fast/forms/4628409.html [ Failure ] crbug.com/591099 fast/forms/8250.html [ Failure ] crbug.com/591099 fast/forms/ValidityState-customError.html [ Failure ] @@ -10425,7 +10433,7 @@ crbug.com/591099 fast/forms/ValidityState-stepMismatch.html [ Crash Failure ] crbug.com/591099 fast/forms/ValidityState-tooLong-input.html [ Crash Failure ] crbug.com/591099 fast/forms/ValidityState-tooLong-textarea.html [ Crash Failure ] -crbug.com/591099 fast/forms/ValidityState-tooShort-input.html [ Crash ] +crbug.com/591099 fast/forms/ValidityState-tooShort-input.html [ Crash Failure ] crbug.com/591099 fast/forms/ValidityState-tooShort-textarea.html [ Crash Failure ] crbug.com/591099 fast/forms/ValidityState-typeMismatch-email.html [ Failure ] crbug.com/591099 fast/forms/ValidityState-typeMismatch-url.html [ Failure ] @@ -10460,7 +10468,7 @@ crbug.com/591099 fast/forms/button/button-baseline-and-collapsing.html [ Failure ] crbug.com/591099 fast/forms/button/button-cannot-be-nested.html [ Failure Pass ] crbug.com/591099 fast/forms/button/button-click-DOM.html [ Failure ] -crbug.com/591099 fast/forms/button/button-disabled-blur.html [ Crash ] +crbug.com/591099 fast/forms/button/button-disabled-blur.html [ Crash Pass ] crbug.com/591099 fast/forms/button/button-first-line-first-letter.html [ Failure Pass ] crbug.com/591099 fast/forms/button/button-in-forms-collection.html [ Failure ] crbug.com/591099 fast/forms/button/button-inner-block-reuse.html [ Failure ] @@ -10471,37 +10479,37 @@ crbug.com/591099 fast/forms/calendar-picker/calendar-picker-date-types.html [ Failure Timeout ] crbug.com/591099 fast/forms/calendar-picker/calendar-picker-datetimelocal-with-step.html [ Crash Failure ] crbug.com/591099 fast/forms/calendar-picker/calendar-picker-datetimelocal.html [ Failure ] -crbug.com/591099 fast/forms/calendar-picker/calendar-picker-key-operations.html [ Crash ] -crbug.com/591099 fast/forms/calendar-picker/calendar-picker-mouse-operations.html [ Crash ] +crbug.com/591099 fast/forms/calendar-picker/calendar-picker-key-operations.html [ Crash Timeout ] +crbug.com/591099 fast/forms/calendar-picker/calendar-picker-mouse-operations.html [ Crash Failure ] crbug.com/591099 fast/forms/calendar-picker/calendar-picker-pre-100-year.html [ Crash Failure ] crbug.com/591099 fast/forms/calendar-picker/calendar-picker-should-not-change-datetimelocal-time.html [ Failure ] -crbug.com/591099 fast/forms/calendar-picker/calendar-picker-touch-operations.html [ Crash ] -crbug.com/591099 fast/forms/calendar-picker/calendar-picker-type-change-onchange.html [ Crash ] -crbug.com/591099 fast/forms/calendar-picker/calendar-picker-type-change-onclick.html [ Crash ] +crbug.com/591099 fast/forms/calendar-picker/calendar-picker-touch-operations.html [ Crash Failure ] +crbug.com/591099 fast/forms/calendar-picker/calendar-picker-type-change-onchange.html [ Crash Failure ] +crbug.com/591099 fast/forms/calendar-picker/calendar-picker-type-change-onclick.html [ Crash Failure ] crbug.com/591099 fast/forms/calendar-picker/calendar-picker-with-step.html [ Crash Failure ] crbug.com/591099 fast/forms/calendar-picker/date-open-picker-with-f4-key.html [ Failure ] -crbug.com/591099 fast/forms/calendar-picker/date-picker-ax.html [ Crash ] +crbug.com/591099 fast/forms/calendar-picker/date-picker-ax.html [ Crash Failure ] crbug.com/591099 fast/forms/calendar-picker/date-picker-choose-default-value-after-set-value.html [ Crash Failure ] crbug.com/591099 fast/forms/calendar-picker/date-picker-events.html [ Crash Failure Timeout ] crbug.com/591099 fast/forms/calendar-picker/date-picker-open-without-focus.html [ Failure ] -crbug.com/591099 fast/forms/calendar-picker/datetimelocal-change-type-on-input-crash.html [ Crash ] +crbug.com/591099 fast/forms/calendar-picker/datetimelocal-change-type-on-input-crash.html [ Crash Failure ] crbug.com/591099 fast/forms/calendar-picker/datetimelocal-open-picker-with-f4-key.html [ Failure ] crbug.com/591099 fast/forms/calendar-picker/datetimelocal-picker-choose-default-value-after-set-value.html [ Failure Timeout ] crbug.com/591099 fast/forms/calendar-picker/datetimelocal-picker-events.html [ Crash Failure ] crbug.com/591099 fast/forms/calendar-picker/month-open-picker-with-f4-key.html [ Failure ] crbug.com/591099 fast/forms/calendar-picker/month-picker-ax.html [ Crash Failure ] crbug.com/591099 fast/forms/calendar-picker/month-picker-choose-default-value-after-set-value.html [ Crash Failure ] -crbug.com/591099 fast/forms/calendar-picker/month-picker-key-operations.html [ Crash ] -crbug.com/591099 fast/forms/calendar-picker/month-picker-mouse-operations.html [ Crash Timeout ] -crbug.com/591099 fast/forms/calendar-picker/month-picker-touch-operations.html [ Crash Timeout ] +crbug.com/591099 fast/forms/calendar-picker/month-picker-key-operations.html [ Crash Timeout ] +crbug.com/591099 fast/forms/calendar-picker/month-picker-mouse-operations.html [ Crash Failure Timeout ] +crbug.com/591099 fast/forms/calendar-picker/month-picker-touch-operations.html [ Crash Failure Timeout ] crbug.com/591099 fast/forms/calendar-picker/month-picker-with-step.html [ Crash Failure ] crbug.com/591099 fast/forms/calendar-picker/week-open-picker-with-f4-key.html [ Failure ] crbug.com/591099 fast/forms/calendar-picker/week-picker-ax.html [ Crash Failure ] crbug.com/591099 fast/forms/calendar-picker/week-picker-choose-default-value-after-set-value.html [ Crash Failure ] -crbug.com/591099 fast/forms/calendar-picker/week-picker-close-no-crash.html [ Crash ] -crbug.com/591099 fast/forms/calendar-picker/week-picker-key-operations.html [ Crash ] -crbug.com/591099 fast/forms/calendar-picker/week-picker-mouse-operations.html [ Crash ] -crbug.com/591099 fast/forms/calendar-picker/week-picker-touch-operations.html [ Crash ] +crbug.com/591099 fast/forms/calendar-picker/week-picker-close-no-crash.html [ Crash Pass ] +crbug.com/591099 fast/forms/calendar-picker/week-picker-key-operations.html [ Crash Timeout ] +crbug.com/591099 fast/forms/calendar-picker/week-picker-mouse-operations.html [ Crash Failure ] +crbug.com/591099 fast/forms/calendar-picker/week-picker-touch-operations.html [ Crash Failure ] crbug.com/591099 fast/forms/caret-rtl.html [ Failure ] crbug.com/591099 fast/forms/change-form-element-document-crash.html [ Failure ] crbug.com/591099 fast/forms/checkValidity-cancel.html [ Failure ] @@ -10513,15 +10521,15 @@ crbug.com/591099 fast/forms/checkbox/checkbox-nested-click-event-on-label.html [ Failure ] crbug.com/591099 fast/forms/checkbox/checkbox-onchange.html [ Failure ] crbug.com/591099 fast/forms/clone-input-with-dirty-value.html [ Crash Failure ] -crbug.com/591099 fast/forms/color/color-no-event-during-detach.html [ Crash ] +crbug.com/591099 fast/forms/color/color-no-event-during-detach.html [ Crash Pass ] crbug.com/591099 fast/forms/color/color-setrangetext.html [ Failure ] crbug.com/591099 fast/forms/color/color-suggestion-picker-appearance-zoom125.html [ Failure ] crbug.com/591099 fast/forms/color/color-type-change-on-close.html [ Crash Failure ] crbug.com/591099 fast/forms/color/color-value-sanitization.html [ Failure ] crbug.com/591099 fast/forms/color/input-appearance-color.html [ Failure ] crbug.com/591099 fast/forms/color/input-color-choose-default-value-after-set-value.html [ Failure ] -crbug.com/591099 fast/forms/color/input-color-chooser-shown-readonly.html [ Crash ] -crbug.com/591099 fast/forms/color/input-color-chooser-shown.html [ Crash ] +crbug.com/591099 fast/forms/color/input-color-chooser-shown-readonly.html [ Crash Pass ] +crbug.com/591099 fast/forms/color/input-color-chooser-shown.html [ Crash Pass ] crbug.com/591099 fast/forms/color/input-color-onchange-event.html [ Failure ] crbug.com/591099 fast/forms/color/input-value-sanitization-color.html [ Failure ] crbug.com/591099 fast/forms/control-clip-overflow.html [ Failure ] @@ -10540,9 +10548,9 @@ crbug.com/591099 fast/forms/datalist/range-snap-to-datalist.html [ Failure ] crbug.com/591099 fast/forms/datalist/slider-appearance-with-ticks-crash.html [ Failure ] crbug.com/591099 fast/forms/date-multiple-fields/date-clearbutton-preventdefault-mousecapture-status.html [ Crash Failure ] -crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-ax-aria-attributes.html [ Crash ] -crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-ax-value-changed-notification.html [ Crash ] -crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-blur-and-focus-events.html [ Crash ] +crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-ax-aria-attributes.html [ Crash Failure ] +crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-ax-value-changed-notification.html [ Crash Failure ] +crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-blur-and-focus-events.html [ Crash Failure ] crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-change-layout-by-value.html [ Failure ] crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-choose-default-value-after-set-value.html [ Failure ] crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-clearbutton-change-and-input-events.html [ Crash Failure ] @@ -10555,19 +10563,19 @@ crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved.html [ Crash Failure ] crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-preserve-value-after-history-back.html [ Failure ] crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-readonly-subfield.html [ Failure ] -crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-reset-value-after-reloads.html [ Crash ] -crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-spinbutton-change-and-input-events.html [ Crash ] +crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-reset-value-after-reloads.html [ Crash Failure ] +crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-spinbutton-change-and-input-events.html [ Crash Failure ] crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-stepup-stepdown-from-renderer.html [ Crash Failure Timeout ] crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-validity-badinput.html [ Crash Failure ] crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-value-set-empty.html [ Failure ] -crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-wheel-event.html [ Crash ] +crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-wheel-event.html [ Crash Failure ] crbug.com/591099 fast/forms/date/ValidityState-rangeOverflow-date.html [ Failure ] crbug.com/591099 fast/forms/date/ValidityState-rangeUnderflow-date.html [ Failure ] crbug.com/591099 fast/forms/date/ValidityState-stepMismatch-date.html [ Failure ] crbug.com/591099 fast/forms/date/ValidityState-typeMismatch-date.html [ Failure ] crbug.com/591099 fast/forms/date/date-appearance-basic.html [ Crash Failure ] crbug.com/591099 fast/forms/date/date-appearance-pseudo-elements.html [ Crash Failure ] -crbug.com/591099 fast/forms/date/date-format-warning.html [ Crash ] +crbug.com/591099 fast/forms/date/date-format-warning.html [ Crash Pass ] crbug.com/591099 fast/forms/date/date-input-type.html [ Failure ] crbug.com/591099 fast/forms/date/date-interactive-validation-required.html [ Crash Failure ] crbug.com/591099 fast/forms/date/date-pseudo-classes.html [ Failure ] @@ -10578,9 +10586,9 @@ crbug.com/591099 fast/forms/date/input-valueasdate-date.html [ Failure ] crbug.com/591099 fast/forms/date/input-valueasnumber-date.html [ Failure ] crbug.com/591099 fast/forms/date/no-page-popup-controller.html [ Failure ] -crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-aria-attributes.html [ Crash ] -crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-value-changed-notification.html [ Crash ] -crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-blur-and-focus-events.html [ Crash ] +crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-aria-attributes.html [ Crash Failure ] +crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-value-changed-notification.html [ Crash Failure ] +crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-blur-and-focus-events.html [ Crash Failure ] crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-change-layout-by-value.html [ Failure ] crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-choose-default-value-after-set-value.html [ Failure ] crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-clearbutton-change-and-input-events.html [ Crash Failure ] @@ -10589,12 +10597,12 @@ crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-mouse-events.html [ Crash Failure ] crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-preserve-value-after-history-back.html [ Crash Failure ] crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-readonly-subfield.html [ Failure ] -crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-reset-value-after-reloads.html [ Crash ] -crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-spinbutton-change-and-input-events.html [ Crash ] +crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-reset-value-after-reloads.html [ Crash Failure ] +crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-spinbutton-change-and-input-events.html [ Crash Failure ] crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-stepup-stepdown-from-renderer.html [ Crash Failure ] crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-validity-badinput.html [ Crash Failure ] crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-value-set-empty.html [ Failure ] -crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-wheel-event.html [ Crash ] +crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-wheel-event.html [ Crash Failure ] crbug.com/591099 fast/forms/datetimelocal/ValidityState-rangeOverflow-datetimelocal.html [ Failure ] crbug.com/591099 fast/forms/datetimelocal/ValidityState-rangeUnderflow-datetimelocal.html [ Failure ] crbug.com/591099 fast/forms/datetimelocal/ValidityState-stepMismatch-datetimelocal.html [ Failure ] @@ -10624,11 +10632,11 @@ crbug.com/591099 fast/forms/empty-get.html [ Failure ] crbug.com/591099 fast/forms/encoding-test.html [ Failure ] crbug.com/591099 fast/forms/enctype-attribute.html [ Failure ] -crbug.com/591099 fast/forms/enter-clicks-buttons.html [ Crash ] +crbug.com/591099 fast/forms/enter-clicks-buttons.html [ Crash Failure ] crbug.com/591099 fast/forms/fieldset/fieldset-align.html [ Failure ] crbug.com/591099 fast/forms/fieldset/fieldset-crash.html [ Failure ] crbug.com/591099 fast/forms/fieldset/fieldset-disabled.html [ Crash Failure ] -crbug.com/591099 fast/forms/fieldset/fieldset-elements.html [ Crash ] +crbug.com/591099 fast/forms/fieldset/fieldset-elements.html [ Crash Failure ] crbug.com/591099 fast/forms/fieldset/fieldset-form-collection-radionode-list.html [ Crash Failure ] crbug.com/591099 fast/forms/fieldset/fieldset-legend-padding-unclipped-fieldset-border.html [ Failure ] crbug.com/591099 fast/forms/fieldset/fieldset-name.html [ Failure ] @@ -10644,7 +10652,7 @@ crbug.com/591099 fast/forms/fieldset/legend-after-margin-with-before-border-horizontal-mode.html [ Failure ] crbug.com/591099 fast/forms/fieldset/legend-display-none.html [ Failure ] crbug.com/591099 fast/forms/fieldset/legend-form.html [ Failure ] -crbug.com/591099 fast/forms/file/file-cloneNode.html [ Crash ] +crbug.com/591099 fast/forms/file/file-cloneNode.html [ Crash Pass ] crbug.com/591099 fast/forms/file/file-input-capture.html [ Failure ] crbug.com/591099 fast/forms/file/file-input-change-event.html [ Crash Failure ] crbug.com/591099 fast/forms/file/file-input-direction.html [ Failure ] @@ -10657,7 +10665,7 @@ crbug.com/591099 fast/forms/file/get-file-upload.html [ Crash Failure ] crbug.com/591099 fast/forms/file/input-file-entries.html [ Crash Failure ] crbug.com/591099 fast/forms/file/input-file-label.html [ Crash Failure ] -crbug.com/591099 fast/forms/file/input-file-re-render.html [ Crash ] +crbug.com/591099 fast/forms/file/input-file-re-render.html [ Crash Failure ] crbug.com/591099 fast/forms/file/input-file-value-with-zoom.html [ Crash Failure ] crbug.com/591099 fast/forms/file/input-file-value.html [ Crash Failure ] crbug.com/591099 fast/forms/file/input-file-write-files.html [ Crash Failure ] @@ -10672,7 +10680,7 @@ crbug.com/591099 fast/forms/focus-style-pending.html [ Failure Pass ] crbug.com/591099 fast/forms/focus-with-display-block.html [ Failure ] crbug.com/591099 fast/forms/focus.html [ Crash Failure ] -crbug.com/591099 fast/forms/focus2.html [ Crash ] +crbug.com/591099 fast/forms/focus2.html [ Crash Failure ] crbug.com/591099 fast/forms/form-added-to-table.html [ Failure Pass ] crbug.com/591099 fast/forms/form-and-frame-interaction-retains-values.html [ Crash Failure ] crbug.com/591099 fast/forms/form-associated-element-crash.html [ Crash Failure ] @@ -10686,9 +10694,9 @@ crbug.com/591099 fast/forms/form-attribute-not-in-document.html [ Failure ] crbug.com/591099 fast/forms/form-attribute.html [ Crash Failure ] crbug.com/591099 fast/forms/form-collection-elements-order.html [ Crash Failure ] -crbug.com/591099 fast/forms/form-collection-elements.html [ Crash ] +crbug.com/591099 fast/forms/form-collection-elements.html [ Crash Failure ] crbug.com/591099 fast/forms/form-collection-lookup.html [ Failure ] -crbug.com/591099 fast/forms/form-collection-radio-node-list.html [ Crash ] +crbug.com/591099 fast/forms/form-collection-radio-node-list.html [ Crash Failure ] crbug.com/591099 fast/forms/form-data-encoding-normalization-overrun.html [ Failure ] crbug.com/591099 fast/forms/form-dirname-attribute.html [ Failure ] crbug.com/591099 fast/forms/form-element-geometry.html [ Crash Failure ] @@ -10700,7 +10708,7 @@ crbug.com/591099 fast/forms/form-radio-node-list.html [ Crash Failure ] crbug.com/591099 fast/forms/form-submission-cancelable.html [ Crash Failure ] crbug.com/591099 fast/forms/form-submit-in-image-document.html [ Failure ] -crbug.com/591099 fast/forms/form-submit-in-submit-event.html [ Crash ] +crbug.com/591099 fast/forms/form-submit-in-submit-event.html [ Crash Pass ] crbug.com/591099 fast/forms/formaction-attribute.html [ Failure ] crbug.com/591099 fast/forms/formmethod-attribute-button-html.html [ Failure ] crbug.com/591099 fast/forms/formmethod-attribute-input-2.html [ Failure ] @@ -10720,14 +10728,14 @@ crbug.com/591099 fast/forms/image-disconnected-during-parse.html [ Failure ] crbug.com/591099 fast/forms/image/002.html [ Crash Failure ] crbug.com/591099 fast/forms/image/005.html [ Failure ] -crbug.com/591099 fast/forms/image/fallback-reattach-crash.html [ Crash ] +crbug.com/591099 fast/forms/image/fallback-reattach-crash.html [ Crash Pass ] crbug.com/591099 fast/forms/image/image-error-event-modifies-type-crash.html [ Crash Failure ] crbug.com/591099 fast/forms/image/image-setrangetext.html [ Crash Failure ] crbug.com/591099 fast/forms/image/input-align-image.html [ Failure ] -crbug.com/591099 fast/forms/image/input-image-submit.html [ Crash ] +crbug.com/591099 fast/forms/image/input-image-submit.html [ Crash Pass ] crbug.com/591099 fast/forms/image/input-width-height-attributes-without-renderer-loaded-image.html [ Crash Pass ] crbug.com/591099 fast/forms/image/width-and-height-of-detached-input.html [ Failure ] -crbug.com/591099 fast/forms/implicit-submission.html [ Crash ] +crbug.com/591099 fast/forms/implicit-submission.html [ Crash Failure ] crbug.com/591099 fast/forms/incremental-dom-property.html [ Failure ] crbug.com/591099 fast/forms/indeterminate-input-types.html [ Crash Failure ] crbug.com/591099 fast/forms/indeterminate.html [ Failure ] @@ -10743,14 +10751,14 @@ crbug.com/591099 fast/forms/input-multiple.html [ Crash Failure ] crbug.com/591099 fast/forms/input-named-action-overrides-action-attribute.html [ Failure ] crbug.com/591099 fast/forms/input-pattern.html [ Failure ] -crbug.com/591099 fast/forms/input-readonly-select.html [ Crash ] +crbug.com/591099 fast/forms/input-readonly-select.html [ Crash Failure ] crbug.com/591099 fast/forms/input-select-api-support.html [ Crash Failure ] crbug.com/591099 fast/forms/input-step-as-double.html [ Crash Failure ] crbug.com/591099 fast/forms/input-stepup-stepdown.html [ Failure ] -crbug.com/591099 fast/forms/input-type-change-focusout.html [ Crash ] +crbug.com/591099 fast/forms/input-type-change-focusout.html [ Crash Failure ] crbug.com/591099 fast/forms/input-type-change-in-onfocus-keyboard.html [ Failure ] crbug.com/591099 fast/forms/input-type-change-in-onfocus-mouse.html [ Failure ] -crbug.com/591099 fast/forms/input-type-change.html [ Crash ] +crbug.com/591099 fast/forms/input-type-change.html [ Crash Failure ] crbug.com/591099 fast/forms/input-type-change3.html [ Failure ] crbug.com/591099 fast/forms/input-type-text-min-width.html [ Crash Failure ] crbug.com/591099 fast/forms/input-user-modify.html [ Failure ] @@ -10758,7 +10766,7 @@ crbug.com/591099 fast/forms/input-value.html [ Failure ] crbug.com/591099 fast/forms/input-valueasnumber-unsupported.html [ Crash Failure ] crbug.com/591099 fast/forms/input-width-height-attributes.html [ Failure ] -crbug.com/591099 fast/forms/input-widths.html [ Crash ] +crbug.com/591099 fast/forms/input-widths.html [ Crash Failure ] crbug.com/591099 fast/forms/input-zero-height-focus.html [ Failure ] crbug.com/591099 fast/forms/interactive-validation-assertion-by-validate-twice.html [ Failure ] crbug.com/591099 fast/forms/interactive-validation-cancel.html [ Failure ] @@ -10771,26 +10779,26 @@ crbug.com/591099 fast/forms/interactive-validation-required-checkbox.html [ Failure ] crbug.com/591099 fast/forms/interactive-validation-select-crash.html [ Failure ] crbug.com/591099 fast/forms/label/continous-click-on-label.html [ Failure ] -crbug.com/591099 fast/forms/label/hover-on-moving-mouse-checkbox-to-parent-label.html [ Failure ] -crbug.com/591099 fast/forms/label/label-contains-other-interactive-content.html [ Crash ] -crbug.com/591099 fast/forms/label/label-event-order.html [ Crash ] +crbug.com/591099 fast/forms/label/hover-on-moving-mouse-checkbox-to-parent-label.html [ Failure Pass ] +crbug.com/591099 fast/forms/label/label-contains-other-interactive-content.html [ Crash Pass ] +crbug.com/591099 fast/forms/label/label-event-order.html [ Crash Failure ] crbug.com/591099 fast/forms/label/label-selection-by-dragging.html [ Failure ] crbug.com/591099 fast/forms/label/label-selection-by-textSelection-and-click.html [ Failure ] crbug.com/591099 fast/forms/label/label-selection.html [ Failure ] -crbug.com/591099 fast/forms/label/labelable-elements.html [ Crash ] -crbug.com/591099 fast/forms/label/labels-add-htmlFor-label.html [ Crash ] -crbug.com/591099 fast/forms/label/labels-add-parent-label.html [ Crash ] -crbug.com/591099 fast/forms/label/labels-change-htmlFor-attribute.html [ Crash ] +crbug.com/591099 fast/forms/label/labelable-elements.html [ Crash Failure ] +crbug.com/591099 fast/forms/label/labels-add-htmlFor-label.html [ Crash Failure ] +crbug.com/591099 fast/forms/label/labels-add-parent-label.html [ Crash Failure ] +crbug.com/591099 fast/forms/label/labels-change-htmlFor-attribute.html [ Crash Failure ] crbug.com/591099 fast/forms/label/labels-contenteditable.html [ Failure ] crbug.com/591099 fast/forms/label/labels-custom-property.html [ Failure ] crbug.com/591099 fast/forms/label/labels-item-index.html [ Failure ] -crbug.com/591099 fast/forms/label/labels-multiple-sibling-labels.html [ Crash ] +crbug.com/591099 fast/forms/label/labels-multiple-sibling-labels.html [ Crash Failure ] crbug.com/591099 fast/forms/label/labels-owner-node-adopted.html [ Crash Failure ] -crbug.com/591099 fast/forms/label/labels-parent-and-sibling-labels.html [ Crash ] -crbug.com/591099 fast/forms/label/labels-remove-htmlFor-attribute.html [ Crash ] -crbug.com/591099 fast/forms/label/labels-remove-htmlFor-label.html [ Crash ] -crbug.com/591099 fast/forms/label/labels-remove-parent-label.html [ Crash ] -crbug.com/591099 fast/forms/label/labels-set-htmlFor-attribute.html [ Crash ] +crbug.com/591099 fast/forms/label/labels-parent-and-sibling-labels.html [ Crash Failure ] +crbug.com/591099 fast/forms/label/labels-remove-htmlFor-attribute.html [ Crash Failure ] +crbug.com/591099 fast/forms/label/labels-remove-htmlFor-label.html [ Crash Failure ] +crbug.com/591099 fast/forms/label/labels-remove-parent-label.html [ Crash Failure ] +crbug.com/591099 fast/forms/label/labels-set-htmlFor-attribute.html [ Crash Failure ] crbug.com/591099 fast/forms/label/selection-disabled-label.html [ Failure ] crbug.com/591099 fast/forms/large-parts.html [ Failure ] crbug.com/591099 fast/forms/lazy-event-listener-scope-chain.html [ Crash Failure ] @@ -10802,9 +10810,9 @@ crbug.com/591099 fast/forms/minWidthPercent.html [ Failure ] crbug.com/591099 fast/forms/misplaced-img-form-registration.html [ Failure ] crbug.com/591099 fast/forms/missing-action.html [ Failure ] -crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-ax-aria-attributes.html [ Crash ] -crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-ax-value-changed-notification.html [ Crash ] -crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-blur-and-focus-events.html [ Crash ] +crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-ax-aria-attributes.html [ Crash Failure ] +crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-ax-value-changed-notification.html [ Crash Failure ] +crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-blur-and-focus-events.html [ Crash Failure ] crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-change-layout-by-value.html [ Failure ] crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-choose-default-value-after-set-value.html [ Failure ] crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-clearbutton-change-and-input-events.html [ Crash Failure ] @@ -10813,12 +10821,12 @@ crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-mouse-events.html [ Crash Failure ] crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-preserve-value-after-history-back.html [ Failure ] crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-readonly-subfield.html [ Failure ] -crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-reset-value-after-reloads.html [ Crash ] -crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-spinbutton-change-and-input-events.html [ Crash ] +crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-reset-value-after-reloads.html [ Crash Failure ] +crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-spinbutton-change-and-input-events.html [ Crash Failure ] crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-stepup-stepdown-from-renderer.html [ Crash Failure ] crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-validity-badinput.html [ Failure ] crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-value-set-empty.html [ Failure ] -crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-wheel-event.html [ Crash ] +crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-wheel-event.html [ Crash Failure ] crbug.com/591099 fast/forms/month/ValidityState-rangeOverflow-month.html [ Failure ] crbug.com/591099 fast/forms/month/ValidityState-rangeUnderflow-month.html [ Failure ] crbug.com/591099 fast/forms/month/ValidityState-stepMismatch-month.html [ Failure ] @@ -10833,7 +10841,7 @@ crbug.com/591099 fast/forms/month/month-pseudo-classes.html [ Failure ] crbug.com/591099 fast/forms/month/month-setrangetext.html [ Failure ] crbug.com/591099 fast/forms/month/month-stepup-stepdown.html [ Failure ] -crbug.com/591099 fast/forms/mouseevent_disabled_form_control.html [ Crash ] +crbug.com/591099 fast/forms/mouseevent_disabled_form_control.html [ Crash Pass ] crbug.com/591099 fast/forms/multiple-selected-options-innerHTML.html [ Failure ] crbug.com/591099 fast/forms/mutation-event-recalc.html [ Failure ] crbug.com/591099 fast/forms/negativeLineHeight.html [ Crash Failure ] @@ -10846,31 +10854,31 @@ crbug.com/591099 fast/forms/number/number-change-event-by-readonly.html [ Failure ] crbug.com/591099 fast/forms/number/number-change-type-on-focus.html [ Crash Failure ] crbug.com/591099 fast/forms/number/number-commit-valid-only.html [ Crash Failure ] -crbug.com/591099 fast/forms/number/number-input-changeevent.html [ Crash ] +crbug.com/591099 fast/forms/number/number-input-changeevent.html [ Crash Failure ] crbug.com/591099 fast/forms/number/number-interactive-validation-required.html [ Crash Failure ] crbug.com/591099 fast/forms/number/number-keyoperation.html [ Crash Failure ] -crbug.com/591099 fast/forms/number/number-losing-renderer-on-click.html [ Crash ] -crbug.com/591099 fast/forms/number/number-outofrange.html [ Crash ] +crbug.com/591099 fast/forms/number/number-losing-renderer-on-click.html [ Crash Pass ] +crbug.com/591099 fast/forms/number/number-outofrange.html [ Crash Failure ] crbug.com/591099 fast/forms/number/number-setrangetext.html [ Failure ] crbug.com/591099 fast/forms/number/number-size.html [ Failure Timeout ] crbug.com/591099 fast/forms/number/number-skip-spaces-in-user-input.html [ Failure ] -crbug.com/591099 fast/forms/number/number-spinbutton-capturing.html [ Crash ] -crbug.com/591099 fast/forms/number/number-spinbutton-change-and-input-events.html [ Crash ] -crbug.com/591099 fast/forms/number/number-spinbutton-click-in-iframe.html [ Crash ] -crbug.com/591099 fast/forms/number/number-spinbutton-crash-on-detach.html [ Crash ] +crbug.com/591099 fast/forms/number/number-spinbutton-capturing.html [ Crash Failure ] +crbug.com/591099 fast/forms/number/number-spinbutton-change-and-input-events.html [ Crash Failure ] +crbug.com/591099 fast/forms/number/number-spinbutton-click-in-iframe.html [ Crash Failure ] +crbug.com/591099 fast/forms/number/number-spinbutton-crash-on-detach.html [ Crash Pass ] crbug.com/591099 fast/forms/number/number-spinbutton-gets-disabled-or-readonly.html [ Crash Failure ] crbug.com/591099 fast/forms/number/number-spinbutton-in-multi-column.html [ Failure ] -crbug.com/591099 fast/forms/number/number-spinbutton-state.html [ Crash ] +crbug.com/591099 fast/forms/number/number-spinbutton-state.html [ Crash Failure ] crbug.com/591099 fast/forms/number/number-stepup-stepdown-from-renderer.html [ Crash Failure Timeout ] crbug.com/591099 fast/forms/number/number-stepup-stepdown.html [ Failure ] crbug.com/591099 fast/forms/number/number-validation-message.html [ Crash Failure ] -crbug.com/591099 fast/forms/number/number-validity-badinput.html [ Crash ] +crbug.com/591099 fast/forms/number/number-validity-badinput.html [ Crash Failure ] crbug.com/591099 fast/forms/number/number-validity-rangeoverflow.html [ Failure ] crbug.com/591099 fast/forms/number/number-validity-rangeunderflow.html [ Failure ] crbug.com/591099 fast/forms/number/number-validity-stepmismatch.html [ Crash Failure ] crbug.com/591099 fast/forms/number/number-validity-typemismatch.html [ Failure ] crbug.com/591099 fast/forms/number/number-valueasnumber.html [ Failure ] -crbug.com/591099 fast/forms/number/number-wheel-event.html [ Crash ] +crbug.com/591099 fast/forms/number/number-wheel-event.html [ Crash Failure ] crbug.com/591099 fast/forms/numeric-input-name.html [ Failure ] crbug.com/591099 fast/forms/old-names.html [ Failure ] crbug.com/591099 fast/forms/onselect-textfield.html [ Failure ] @@ -10901,7 +10909,7 @@ crbug.com/591099 fast/forms/radio/radio-group-arrow-cycle-edge.html [ Failure ] crbug.com/591099 fast/forms/radio/radio-group-document-destruction.html [ Failure ] crbug.com/591099 fast/forms/radio/radio-group-in-detached-form.html [ Failure ] -crbug.com/591099 fast/forms/radio/radio-group-keyboard-change-event.html [ Crash ] +crbug.com/591099 fast/forms/radio/radio-group-keyboard-change-event.html [ Crash Pass ] crbug.com/591099 fast/forms/radio/radio-group-remove-required.html [ Failure ] crbug.com/591099 fast/forms/radio/radio-group.html [ Failure ] crbug.com/591099 fast/forms/radio/radio-indeterminate-pseudo-class.html [ Failure ] @@ -10912,7 +10920,7 @@ crbug.com/591099 fast/forms/radio/radio-remove-form-attr.html [ Failure ] crbug.com/591099 fast/forms/radio/radio-restore-preventDefault.html [ Failure ] crbug.com/591099 fast/forms/radio/radio_checked.html [ Failure ] -crbug.com/591099 fast/forms/radio/radio_checked_dynamic.html [ Crash ] +crbug.com/591099 fast/forms/radio/radio_checked_dynamic.html [ Crash Pass ] crbug.com/591099 fast/forms/radio/radio_checked_name.html [ Failure ] crbug.com/591099 fast/forms/radio/remove-radio-button-assert.html [ Failure ] crbug.com/591099 fast/forms/radio/state-restore-radio-group.html [ Crash Failure ] @@ -10940,11 +10948,11 @@ crbug.com/591099 fast/forms/range/range-thumb-height-percentage.html [ Failure ] crbug.com/591099 fast/forms/range/range-type-change-crash.html [ Failure ] crbug.com/591099 fast/forms/range/range-type-change-onchange-2.html [ Failure ] -crbug.com/591099 fast/forms/range/range-type-change-onchange.html [ Crash ] -crbug.com/591099 fast/forms/range/range-type-change-oninput.html [ Crash ] +crbug.com/591099 fast/forms/range/range-type-change-onchange.html [ Crash Failure ] +crbug.com/591099 fast/forms/range/range-type-change-oninput.html [ Crash Pass ] crbug.com/591099 fast/forms/range/range-value-rounding.html [ Failure Timeout ] crbug.com/591099 fast/forms/range/slider-appearance-crash.html [ Failure ] -crbug.com/591099 fast/forms/range/slider-delete-while-dragging-thumb.html [ Crash ] +crbug.com/591099 fast/forms/range/slider-delete-while-dragging-thumb.html [ Crash Failure ] crbug.com/591099 fast/forms/range/slider-hit-testing.html [ Failure ] crbug.com/591099 fast/forms/range/slider-in-multi-column.html [ Failure ] crbug.com/591099 fast/forms/range/slider-inline-crash.html [ Failure ] @@ -10956,31 +10964,31 @@ crbug.com/591099 fast/forms/range/thumbslider-crash.html [ Failure ] crbug.com/591099 fast/forms/range/thumbslider-no-parent-slider.html [ Failure ] crbug.com/591099 fast/forms/removed-image-as-property.html [ Crash Failure ] -crbug.com/591099 fast/forms/render-text-crash.html [ Crash ] +crbug.com/591099 fast/forms/render-text-crash.html [ Crash Failure ] crbug.com/591099 fast/forms/reparented-image-as-property.html [ Failure ] crbug.com/591099 fast/forms/reportValidity-cancel.html [ Failure ] -crbug.com/591099 fast/forms/reportValidity-handler-updates-dom.html [ Crash ] +crbug.com/591099 fast/forms/reportValidity-handler-updates-dom.html [ Crash Failure ] crbug.com/591099 fast/forms/reportValidity-invalid.html [ Crash Failure ] crbug.com/591099 fast/forms/reportValidity-valid.html [ Crash Failure ] crbug.com/591099 fast/forms/required-attribute-001.html [ Failure ] crbug.com/591099 fast/forms/required-attribute-002.html [ Failure ] crbug.com/591099 fast/forms/reset-autofilled.html [ Failure ] -crbug.com/591099 fast/forms/restore-selection-after-layout.html [ Crash ] -crbug.com/591099 fast/forms/search/abspos-cancel-button-crash.html [ Crash ] +crbug.com/591099 fast/forms/restore-selection-after-layout.html [ Crash Failure ] +crbug.com/591099 fast/forms/search/abspos-cancel-button-crash.html [ Crash Pass ] crbug.com/591099 fast/forms/search/input-search-press-escape-key.html [ Crash Failure ] crbug.com/591099 fast/forms/search/search-abs-pos-cancel-button.html [ Crash Failure ] crbug.com/591099 fast/forms/search/search-appearance-basic.html [ Crash Failure ] -crbug.com/591099 fast/forms/search/search-cancel-button-events.html [ Crash ] +crbug.com/591099 fast/forms/search/search-cancel-button-events.html [ Crash Failure ] crbug.com/591099 fast/forms/search/search-cancel-button-mouseup.html [ Crash Failure ] crbug.com/591099 fast/forms/search/search-cancel-button-style-sharing.html [ Crash Failure ] -crbug.com/591099 fast/forms/search/search-delete-while-cancel-button-clicked.html [ Crash ] +crbug.com/591099 fast/forms/search/search-delete-while-cancel-button-clicked.html [ Crash Failure ] crbug.com/591099 fast/forms/search/search-disabled-readonly.html [ Crash Failure ] crbug.com/591099 fast/forms/search/search-display-none-cancel-button.html [ Crash Failure ] crbug.com/591099 fast/forms/search/search-hide-cancel-on-cancel.html [ Crash Failure ] crbug.com/591099 fast/forms/search/search-rtl.html [ Crash Failure ] crbug.com/591099 fast/forms/search/search-setrangetext.html [ Crash Failure ] crbug.com/591099 fast/forms/search/search-transformed.html [ Crash Failure ] -crbug.com/591099 fast/forms/search/search-type-change-crash.html [ Crash ] +crbug.com/591099 fast/forms/search/search-type-change-crash.html [ Crash Pass ] crbug.com/591099 fast/forms/search/search-vertical-alignment.html [ Crash Failure ] crbug.com/591099 fast/forms/search/search-zoomed.html [ Crash Failure ] crbug.com/591099 fast/forms/search/searchfield-heights.html [ Crash Failure ] @@ -10998,10 +11006,10 @@ crbug.com/591099 fast/forms/select-popup/popup-menu-appearance-zoom110.html [ Failure ] crbug.com/591099 fast/forms/select-popup/popup-menu-appearance.html [ Failure ] crbug.com/591099 fast/forms/select-popup/popup-menu-ax.html [ Crash Failure ] -crbug.com/591099 fast/forms/select-popup/popup-menu-crash-on-cancel.html [ Crash ] +crbug.com/591099 fast/forms/select-popup/popup-menu-crash-on-cancel.html [ Crash Failure ] crbug.com/591099 fast/forms/select-popup/popup-menu-crash-on-close.html [ Failure ] crbug.com/591099 fast/forms/select-popup/popup-menu-crash-on-select.html [ Failure ] -crbug.com/591099 fast/forms/select-popup/popup-menu-crash-on-style-update.html [ Crash ] +crbug.com/591099 fast/forms/select-popup/popup-menu-crash-on-style-update.html [ Crash Pass ] crbug.com/591099 fast/forms/select-popup/popup-menu-mouse-operations.html [ Failure ] crbug.com/591099 fast/forms/select-popup/popup-menu-nested-style.html [ Failure ] crbug.com/591099 fast/forms/select-popup/popup-menu-touch-operations.html [ Failure Timeout ] @@ -11034,13 +11042,13 @@ crbug.com/591099 fast/forms/select/listbox-clip.html [ Failure ] crbug.com/591099 fast/forms/select/listbox-deselect-scroll.html [ Failure ] crbug.com/591099 fast/forms/select/listbox-disabled-scroll-no-onchange.html [ Failure ] -crbug.com/591099 fast/forms/select/listbox-drag-in-from-outside.html [ Crash ] +crbug.com/591099 fast/forms/select/listbox-drag-in-from-outside.html [ Crash Pass ] crbug.com/591099 fast/forms/select/listbox-drag-in-non-multiple.html [ Failure ] crbug.com/591099 fast/forms/select/listbox-focusable-items.html [ Failure ] crbug.com/591099 fast/forms/select/listbox-height-with-before.html [ Failure ] crbug.com/591099 fast/forms/select/listbox-hit-test-zoomed.html [ Failure ] crbug.com/591099 fast/forms/select/listbox-in-multi-column.html [ Failure ] -crbug.com/591099 fast/forms/select/listbox-no-force-layout.html [ Crash ] +crbug.com/591099 fast/forms/select/listbox-no-force-layout.html [ Crash Pass ] crbug.com/591099 fast/forms/select/listbox-onchange.html [ Failure ] crbug.com/591099 fast/forms/select/listbox-oninput-fired.html [ Failure ] crbug.com/591099 fast/forms/select/listbox-overlay-scrollbar.html [ Failure Pass ] @@ -11049,7 +11057,7 @@ crbug.com/591099 fast/forms/select/listbox-scrollbar-incremental-load.html [ Failure ] crbug.com/591099 fast/forms/select/listbox-select-reset.html [ Failure ] crbug.com/591099 fast/forms/select/listbox-selection-2.html [ Failure ] -crbug.com/591099 fast/forms/select/listbox-selection.html [ Crash ] +crbug.com/591099 fast/forms/select/listbox-selection.html [ Crash Failure ] crbug.com/591099 fast/forms/select/listbox-tap-input-change-event.html [ Failure ] crbug.com/591099 fast/forms/select/listbox-tap.html [ Failure ] crbug.com/591099 fast/forms/select/listbox-typeahead-cyrillic.html [ Crash Failure ] @@ -11061,7 +11069,7 @@ crbug.com/591099 fast/forms/select/menulist-appearance-basic.html [ Failure ] crbug.com/591099 fast/forms/select/menulist-appearance-none.html [ Failure ] crbug.com/591099 fast/forms/select/menulist-appearance-rtl.html [ Failure ] -crbug.com/591099 fast/forms/select/menulist-change-event-with-reset-blur.html [ Crash ] +crbug.com/591099 fast/forms/select/menulist-change-event-with-reset-blur.html [ Crash Pass ] crbug.com/591099 fast/forms/select/menulist-clip.html [ Failure ] crbug.com/591099 fast/forms/select/menulist-deselect-update.html [ Failure ] crbug.com/591099 fast/forms/select/menulist-disabled-selected-option.html [ Failure ] @@ -11069,14 +11077,14 @@ crbug.com/591099 fast/forms/select/menulist-narrow-width.html [ Failure ] crbug.com/591099 fast/forms/select/menulist-no-overflow.html [ Failure ] crbug.com/591099 fast/forms/select/menulist-no-renderer-for-unexpected-children.html [ Failure ] -crbug.com/591099 fast/forms/select/menulist-no-renderer-onmousedown.html [ Crash ] +crbug.com/591099 fast/forms/select/menulist-no-renderer-onmousedown.html [ Crash Failure ] crbug.com/591099 fast/forms/select/menulist-onchange-fired-with-key-up-down.html [ Failure ] crbug.com/591099 fast/forms/select/menulist-oninput-fired.html [ Failure ] crbug.com/591099 fast/forms/select/menulist-option-wrap.html [ Failure ] crbug.com/591099 fast/forms/select/menulist-popup-crash.html [ Failure ] crbug.com/591099 fast/forms/select/menulist-popup-item-style.html [ Failure ] crbug.com/591099 fast/forms/select/menulist-popup-open-hide-using-keyboard.html [ Failure ] -crbug.com/591099 fast/forms/select/menulist-remove-option-onchange.html [ Crash ] +crbug.com/591099 fast/forms/select/menulist-remove-option-onchange.html [ Crash Pass ] crbug.com/591099 fast/forms/select/menulist-restrict-line-height.html [ Failure ] crbug.com/591099 fast/forms/select/menulist-separator-painting.html [ Failure ] crbug.com/591099 fast/forms/select/menulist-style-color.html [ Failure ] @@ -11109,8 +11117,8 @@ crbug.com/591099 fast/forms/select/options-indexed-properties.html [ Failure ] crbug.com/591099 fast/forms/select/popup-closes-on-blur.html [ Failure ] crbug.com/591099 fast/forms/select/popup-with-display-none-optgroup.html [ Failure ] -crbug.com/591099 fast/forms/select/remove-element-from-within-focus-handler-crash.html [ Crash ] -crbug.com/591099 fast/forms/select/select-add-assertion.html [ Crash ] +crbug.com/591099 fast/forms/select/remove-element-from-within-focus-handler-crash.html [ Crash Failure ] +crbug.com/591099 fast/forms/select/select-add-assertion.html [ Crash Pass ] crbug.com/591099 fast/forms/select/select-add.html [ Failure ] crbug.com/591099 fast/forms/select/select-align.html [ Failure ] crbug.com/591099 fast/forms/select/select-assign-null.html [ Failure ] @@ -11119,12 +11127,12 @@ crbug.com/591099 fast/forms/select/select-baseline.html [ Failure ] crbug.com/591099 fast/forms/select/select-block-background.html [ Failure ] crbug.com/591099 fast/forms/select/select-change-listbox-size.html [ Failure ] -crbug.com/591099 fast/forms/select/select-change-listbox-to-popup-roundtrip.html [ Crash ] +crbug.com/591099 fast/forms/select/select-change-listbox-to-popup-roundtrip.html [ Crash Pass ] crbug.com/591099 fast/forms/select/select-change-listbox-to-popup.html [ Failure ] -crbug.com/591099 fast/forms/select/select-change-popup-to-listbox-in-event-handler.html [ Crash ] -crbug.com/591099 fast/forms/select/select-change-popup-to-listbox-roundtrip.html [ Crash ] +crbug.com/591099 fast/forms/select/select-change-popup-to-listbox-in-event-handler.html [ Crash Failure ] +crbug.com/591099 fast/forms/select/select-change-popup-to-listbox-roundtrip.html [ Crash Pass ] crbug.com/591099 fast/forms/select/select-change-popup-to-listbox.html [ Failure ] -crbug.com/591099 fast/forms/select/select-change-type-on-focus.html [ Crash ] +crbug.com/591099 fast/forms/select/select-change-type-on-focus.html [ Crash Failure ] crbug.com/591099 fast/forms/select/select-change-type-on-mousedown-focus.html [ Crash Failure ] crbug.com/591099 fast/forms/select/select-clientheight-large-size.html [ Failure ] crbug.com/591099 fast/forms/select/select-clientheight-with-multiple-attr.html [ Failure ] @@ -11142,7 +11150,7 @@ crbug.com/591099 fast/forms/select/select-item-background-clip.html [ Failure ] crbug.com/591099 fast/forms/select/select-list-box-mouse-focus.html [ Failure ] crbug.com/591099 fast/forms/select/select-list-box-with-height.html [ Failure ] -crbug.com/591099 fast/forms/select/select-listbox-focus-displaynone.html [ Crash Failure ] +crbug.com/591099 fast/forms/select/select-listbox-focus-displaynone.html [ Crash Failure Pass ] crbug.com/591099 fast/forms/select/select-listbox-multiple-no-focusring.html [ Failure ] crbug.com/591099 fast/forms/select/select-live-pseudo-selectors.html [ Crash Failure ] crbug.com/591099 fast/forms/select/select-max-length.html [ Failure ] @@ -11178,7 +11186,7 @@ crbug.com/591099 fast/forms/select/select-type-ahead-non-latin.html [ Failure ] crbug.com/591099 fast/forms/select/select-typeahead-crash.html [ Failure ] crbug.com/591099 fast/forms/select/select-typeahead-with-spacekey.html [ Failure ] -crbug.com/591099 fast/forms/select/select-value-null.html [ Crash ] +crbug.com/591099 fast/forms/select/select-value-null.html [ Crash Pass ] crbug.com/591099 fast/forms/select/select-visual-hebrew.html [ Failure ] crbug.com/591099 fast/forms/select/select-width-font-change.html [ Failure ] crbug.com/591099 fast/forms/select/select-with-display-none-options.html [ Failure ] @@ -11191,15 +11199,15 @@ crbug.com/591099 fast/forms/selection-direction.html [ Crash Timeout ] crbug.com/591099 fast/forms/selection-functions.html [ Crash Failure ] crbug.com/591099 fast/forms/selection-setSelectionRange-focusing.html [ Crash Failure ] -crbug.com/591099 fast/forms/selection-setSelectionRange-frameselection.html [ Crash ] +crbug.com/591099 fast/forms/selection-setSelectionRange-frameselection.html [ Crash Pass ] crbug.com/591099 fast/forms/selection-start-end-readonly.html [ Crash Failure ] crbug.com/591099 fast/forms/selection-wrongtype.html [ Crash Timeout ] crbug.com/591099 fast/forms/setCustomValidity-arguments.html [ Failure ] crbug.com/591099 fast/forms/setCustomValidity-existence.html [ Crash Failure ] crbug.com/591099 fast/forms/setCustomValidity.html [ Failure ] -crbug.com/591099 fast/forms/setrangetext-within-events.html [ Crash Failure ] +crbug.com/591099 fast/forms/setrangetext-within-events.html [ Crash Failure Pass ] crbug.com/591099 fast/forms/setrangetext.html [ Crash Failure ] -crbug.com/591099 fast/forms/shadow-tree-exposure.html [ Crash ] +crbug.com/591099 fast/forms/shadow-tree-exposure.html [ Crash Failure ] crbug.com/591099 fast/forms/slow-click.html [ Failure Pass ] crbug.com/591099 fast/forms/state-restore-broken-state.html [ Crash Failure ] crbug.com/591099 fast/forms/state-restore-empty-state.html [ Failure ] @@ -11221,21 +11229,21 @@ crbug.com/591099 fast/forms/submit-to-url-fragment.html [ Failure ] crbug.com/591099 fast/forms/submit-with-base.html [ Crash Failure ] crbug.com/591099 fast/forms/submit/submit-appearance-basic.html [ Failure ] -crbug.com/591099 fast/forms/suggested-value-after-setvalue.html [ Crash ] -crbug.com/591099 fast/forms/suggested-value.html [ Crash ] +crbug.com/591099 fast/forms/suggested-value-after-setvalue.html [ Crash Pass ] +crbug.com/591099 fast/forms/suggested-value.html [ Crash Pass ] crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125.html [ Crash Failure Timeout ] crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200.html [ Crash Failure ] crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-key-operations.html [ Crash Failure Timeout ] crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-min-max-attribute.html [ Crash Failure Timeout ] -crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-reset-value-after-reload.html [ Crash ] +crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-reset-value-after-reload.html [ Crash Failure ] crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-step-attribute.html [ Crash Failure ] crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew.html [ Crash Failure Timeout ] crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-min-max-attribute.html [ Crash Failure ] -crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-reset-value-after-reload.html [ Crash ] +crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-reset-value-after-reload.html [ Crash Failure ] crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-step-attribute.html [ Crash Failure ] crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-key-operations.html [ Crash Failure Timeout ] crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-min-max-attribute.html [ Crash Failure ] -crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-reset-value-after-reload.html [ Crash ] +crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-reset-value-after-reload.html [ Crash Failure ] crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-step-attribute.html [ Crash Failure ] crbug.com/591099 fast/forms/suggestion-picker/time-suggestion-picker-appearance-locale-hebrew.html [ Crash Failure ] crbug.com/591099 fast/forms/suggestion-picker/time-suggestion-picker-appearance-rtl.html [ Crash Failure ] @@ -11244,14 +11252,14 @@ crbug.com/591099 fast/forms/suggestion-picker/time-suggestion-picker-step-attribute.html [ Crash Failure ] crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-key-operations.html [ Crash Failure Timeout ] crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-min-max-attribute.html [ Crash Failure ] -crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-reset-value-after-reload.html [ Crash ] +crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-reset-value-after-reload.html [ Crash Failure ] crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-step-attribute.html [ Crash Failure ] crbug.com/591099 fast/forms/tabbing-input-iframe.html [ Crash Failure ] crbug.com/591099 fast/forms/tabs-with-modifiers.html [ Failure ] crbug.com/591099 fast/forms/targeted-frame-submission.html [ Failure ] crbug.com/591099 fast/forms/text-control-intrinsic-widths.html [ Timeout ] -crbug.com/591099 fast/forms/text-control-selection-after-blur.html [ Crash ] -crbug.com/591099 fast/forms/text-set-value-crash.html [ Crash ] +crbug.com/591099 fast/forms/text-control-selection-after-blur.html [ Crash Pass ] +crbug.com/591099 fast/forms/text-set-value-crash.html [ Crash Failure ] crbug.com/591099 fast/forms/text-style-color.html [ Crash Failure ] crbug.com/591099 fast/forms/text/input-appearance-bkcolor.html [ Crash Failure ] crbug.com/591099 fast/forms/text/input-appearance-default-bkcolor.html [ Crash Failure ] @@ -11283,7 +11291,7 @@ crbug.com/591099 fast/forms/text/input-readonly-autoscroll.html [ Crash Failure ] crbug.com/591099 fast/forms/text/input-readonly-dimmed.html [ Crash Failure ] crbug.com/591099 fast/forms/text/input-readonly-empty.html [ Failure ] -crbug.com/591099 fast/forms/text/input-readonly-focus.html [ Crash ] +crbug.com/591099 fast/forms/text/input-readonly-focus.html [ Crash Pass ] crbug.com/591099 fast/forms/text/input-select-on-click.html [ Crash Failure ] crbug.com/591099 fast/forms/text/input-selection-hidden.html [ Crash Failure ] crbug.com/591099 fast/forms/text/input-set-composition-scroll.html [ Failure ] @@ -11298,18 +11306,18 @@ crbug.com/591099 fast/forms/text/input-text-drag-down.html [ Crash Failure ] crbug.com/591099 fast/forms/text/input-text-enter.html [ Crash Failure ] crbug.com/591099 fast/forms/text/input-text-option-delete.html [ Crash Failure ] -crbug.com/591099 fast/forms/text/input-text-paste-maxlength.html [ Crash Timeout ] +crbug.com/591099 fast/forms/text/input-text-paste-maxlength.html [ Crash Pass Timeout ] crbug.com/591099 fast/forms/text/input-text-scroll-left-on-blur.html [ Crash Failure ] crbug.com/591099 fast/forms/text/input-text-self-emptying-click.html [ Crash Failure ] crbug.com/591099 fast/forms/text/input-text-word-wrap.html [ Crash Failure ] crbug.com/591099 fast/forms/text/input-width.html [ Failure ] -crbug.com/591099 fast/forms/text/placeholder-crash-with-scrollbar-corner.html [ Crash ] +crbug.com/591099 fast/forms/text/placeholder-crash-with-scrollbar-corner.html [ Crash Failure ] crbug.com/591099 fast/forms/text/placeholder-dom-property.html [ Failure ] crbug.com/591099 fast/forms/text/text-appearance-basic.html [ Crash Failure ] crbug.com/591099 fast/forms/text/text-appearance-datalist.html [ Failure ] -crbug.com/591099 fast/forms/text/text-change-event-after-clear-in-submit.html [ Crash ] -crbug.com/591099 fast/forms/text/text-change-event-after-updating-default.html [ Crash ] -crbug.com/591099 fast/forms/text/text-dir-auto-with-placeholder.html [ Crash ] +crbug.com/591099 fast/forms/text/text-change-event-after-clear-in-submit.html [ Crash Pass ] +crbug.com/591099 fast/forms/text/text-change-event-after-updating-default.html [ Crash Pass ] +crbug.com/591099 fast/forms/text/text-dir-auto-with-placeholder.html [ Crash Pass ] crbug.com/591099 fast/forms/text/text-field-setvalue-crash.html [ Failure ] crbug.com/591099 fast/forms/text/text-font-height-mismatch.html [ Crash Failure ] crbug.com/591099 fast/forms/text/text-inner-overflow.html [ Failure ] @@ -11317,13 +11325,13 @@ crbug.com/591099 fast/forms/text/text-reset-click-delete-text-change-event.html [ Crash Failure ] crbug.com/591099 fast/forms/text/text-select-disabled.html [ Crash Failure ] crbug.com/591099 fast/forms/text/text-select-invisible.html [ Crash Failure ] -crbug.com/591099 fast/forms/text/text-selection-after-type-change.html [ Crash ] -crbug.com/591099 fast/forms/text/text-set-selection-crash.html [ Crash ] +crbug.com/591099 fast/forms/text/text-selection-after-type-change.html [ Crash Pass ] +crbug.com/591099 fast/forms/text/text-set-selection-crash.html [ Crash Pass ] crbug.com/591099 fast/forms/text/text-update-datalist-while-focused.html [ Failure ] crbug.com/591099 fast/forms/text/text-window-lost-focus-change-event.html [ Failure Timeout ] -crbug.com/591099 fast/forms/text/textfield-focus-out.html [ Crash ] +crbug.com/591099 fast/forms/text/textfield-focus-out.html [ Crash Failure ] crbug.com/591099 fast/forms/text/textfield-focus-ring.html [ Failure ] -crbug.com/591099 fast/forms/text/textfield-onchange-deletion.html [ Crash ] +crbug.com/591099 fast/forms/text/textfield-onchange-deletion.html [ Crash Pass ] crbug.com/591099 fast/forms/text/textfield-outline.html [ Crash Failure ] crbug.com/591099 fast/forms/text/textfield-overflow-by-value-update.html [ Crash Failure ] crbug.com/591099 fast/forms/text/textfield-overflow.html [ Failure ] @@ -11332,8 +11340,8 @@ crbug.com/591099 fast/forms/textarea/basic-textareas.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/cols-attribute.html [ Failure ] crbug.com/591099 fast/forms/textarea/drag-into-textarea.html [ Crash Failure ] -crbug.com/591099 fast/forms/textarea/drag-out-of-textarea.html [ Crash Failure ] -crbug.com/591099 fast/forms/textarea/empty-textarea-toggle-disabled.html [ Crash ] +crbug.com/591099 fast/forms/textarea/drag-out-of-textarea.html [ Crash Failure Pass ] +crbug.com/591099 fast/forms/textarea/empty-textarea-toggle-disabled.html [ Crash Pass ] crbug.com/591099 fast/forms/textarea/linebox-overflow-in-textarea-padding.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/onselect-textarea.html [ Failure ] crbug.com/591099 fast/forms/textarea/paste-into-textarea.html [ Crash Failure ] @@ -11350,7 +11358,7 @@ crbug.com/591099 fast/forms/textarea/textarea-checkValidity-crash.html [ Failure ] crbug.com/591099 fast/forms/textarea/textarea-crlf.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-default-value-leading-newline.html [ Crash Failure ] -crbug.com/591099 fast/forms/textarea/textarea-dir-auto-with-placeholder.html [ Crash ] +crbug.com/591099 fast/forms/textarea/textarea-dir-auto-with-placeholder.html [ Crash Pass ] crbug.com/591099 fast/forms/textarea/textarea-initial-caret-position.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-input-event.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-inputmode.html [ Failure ] @@ -11361,18 +11369,18 @@ crbug.com/591099 fast/forms/textarea/textarea-minlength.html [ Failure ] crbug.com/591099 fast/forms/textarea/textarea-newline.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-no-scroll-on-blur.html [ Crash Failure ] -crbug.com/591099 fast/forms/textarea/textarea-node-removed-from-document-crash.html [ Crash ] +crbug.com/591099 fast/forms/textarea/textarea-node-removed-from-document-crash.html [ Crash Pass ] crbug.com/591099 fast/forms/textarea/textarea-placeholder-dom-property.html [ Failure ] crbug.com/591099 fast/forms/textarea/textarea-placeholder-paint-order.html [ Failure ] crbug.com/591099 fast/forms/textarea/textarea-placeholder-relayout-assertion.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-placeholder-visibility-1.html [ Failure ] crbug.com/591099 fast/forms/textarea/textarea-placeholder-visibility-2.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-placeholder-wrapping.html [ Crash Failure ] -crbug.com/591099 fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html [ Crash ] -crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-intrinsic-size.html [ Crash Timeout ] -crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-size-zoomed.html [ Crash Timeout ] -crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-size.html [ Crash ] -crbug.com/591099 fast/forms/textarea/textarea-resize-orthogonal-containing-block.html [ Crash ] +crbug.com/591099 fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html [ Crash Pass ] +crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-intrinsic-size.html [ Crash Pass Timeout ] +crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-size-zoomed.html [ Crash Pass Timeout ] +crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-size.html [ Crash Pass ] +crbug.com/591099 fast/forms/textarea/textarea-resize-orthogonal-containing-block.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-rows-cols.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-scroll-height.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-scrollbar-height.html [ Crash Failure ] @@ -11382,7 +11390,7 @@ crbug.com/591099 fast/forms/textarea/textarea-scrolled-type.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-select.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-selection-preservation.html [ Crash Failure ] -crbug.com/591099 fast/forms/textarea/textarea-set-defaultvalue-after-value.html [ Crash ] +crbug.com/591099 fast/forms/textarea/textarea-set-defaultvalue-after-value.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-setinnerhtml.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-setrangetext.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-setvalue-without-renderer.html [ Crash Failure ] @@ -11390,42 +11398,42 @@ crbug.com/591099 fast/forms/textarea/textarea-textlength.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-width.html [ Crash Failure ] crbug.com/591099 fast/forms/textarea/textarea-wrap-attribute.html [ Failure ] -crbug.com/591099 fast/forms/textfield-change-event.html [ Crash ] -crbug.com/591099 fast/forms/textfield-clone.html [ Crash ] +crbug.com/591099 fast/forms/textfield-change-event.html [ Crash Pass ] +crbug.com/591099 fast/forms/textfield-clone.html [ Crash Failure ] crbug.com/591099 fast/forms/textfield-to-password-on-focus.html [ Crash Failure ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-ax-aria-attributes.html [ Crash ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-ax-value-changed-notification.html [ Crash ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-blur-and-focus-events.html [ Crash ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-ax-aria-attributes.html [ Crash Failure ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-ax-value-changed-notification.html [ Crash Failure ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-blur-and-focus-events.html [ Crash Failure ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value.html [ Failure ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-type-on-focus-2.html [ Crash ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-type-on-focus-3.html [ Crash ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-type-on-focus.html [ Crash ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-type-on-focus-2.html [ Crash Failure ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-type-on-focus-3.html [ Crash Pass ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-type-on-focus.html [ Crash Failure ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-choose-default-value-after-set-value.html [ Failure ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-clearbutton-change-and-input-events.html [ Crash Failure ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-crash-after-adoptnode.html [ Crash ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-crash-by-focus-on-unload.html [ Crash ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-crash-after-adoptnode.html [ Crash Failure ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-crash-by-focus-on-unload.html [ Crash Pass ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-fallback-format.html [ Failure ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-focus-style.html [ Crash ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-focus-style.html [ Crash Failure ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-focus.html [ Failure ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-keyboard-events.html [ Crash Failure Timeout ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-localization.html [ Failure ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-losing-renderer-on-click.html [ Crash ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-losing-renderer-on-click.html [ Crash Pass ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-mouse-events.html [ Crash Failure ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-narrow-width-scroll.html [ Failure ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-open-picker-key-bindings.html [ Failure ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-preserve-value-after-history-back.html [ Crash Failure ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-readonly-subfield.html [ Failure ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-reset-value-after-reload.html [ Crash ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-spinbutton-change-and-input-events.html [ Crash ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-spinbutton-click-in-iframe.html [ Crash ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-reset-value-after-reload.html [ Crash Failure ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-spinbutton-change-and-input-events.html [ Crash Failure ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-spinbutton-click-in-iframe.html [ Crash Failure ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-state-change-on-focus-or-blur.html [ Failure ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-static-relayout.html [ Crash ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-step-attribute.html [ Crash ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html [ Crash ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-static-relayout.html [ Crash Pass ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-step-attribute.html [ Crash Failure ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html [ Crash Pass ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer.html [ Crash Timeout ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-validity-badinput.html [ Failure ] crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-value-set-empty.html [ Crash Failure ] -crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-wheel-event.html [ Crash ] +crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-wheel-event.html [ Crash Failure ] crbug.com/591099 fast/forms/time/time-appearance-basic.html [ Crash Failure ] crbug.com/591099 fast/forms/time/time-appearance-pseudo-elements.html [ Crash Failure ] crbug.com/591099 fast/forms/time/time-input-type.html [ Failure ] @@ -11440,16 +11448,16 @@ crbug.com/591099 fast/forms/time/time-valueasdate.html [ Failure ] crbug.com/591099 fast/forms/time/time-valueasnumber.html [ Failure ] crbug.com/591099 fast/forms/type-after-focus-rule-shrink-width.html [ Crash Failure ] -crbug.com/591099 fast/forms/ua-shadow-select-all-crash.html [ Crash ] +crbug.com/591099 fast/forms/ua-shadow-select-all-crash.html [ Crash Pass ] crbug.com/591099 fast/forms/update-form-attribute-element.html [ Failure ] -crbug.com/591099 fast/forms/url/url-sanitize-user-input.html [ Crash ] -crbug.com/591099 fast/forms/validationMessage.html [ Crash ] +crbug.com/591099 fast/forms/url/url-sanitize-user-input.html [ Crash Pass ] +crbug.com/591099 fast/forms/validationMessage.html [ Crash Failure ] crbug.com/591099 fast/forms/validity-property.html [ Crash Failure ] crbug.com/591099 fast/forms/var-name-conflict-in-form-event-handler.html [ Failure ] crbug.com/591099 fast/forms/visual-hebrew-text-field.html [ Crash Failure ] -crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-ax-aria-attributes.html [ Crash ] -crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-ax-value-changed-notification.html [ Crash ] -crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-blur-and-focus-events.html [ Crash ] +crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-ax-aria-attributes.html [ Crash Failure ] +crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-ax-value-changed-notification.html [ Crash Failure ] +crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-blur-and-focus-events.html [ Crash Failure ] crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-change-layout-by-value.html [ Failure ] crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-choose-default-value-after-set-value.html [ Failure ] crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-clearbutton-change-and-input-events.html [ Crash Failure ] @@ -11458,12 +11466,12 @@ crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-mouse-events.html [ Crash Failure ] crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-preserve-value-after-history-back.html [ Failure ] crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield.html [ Failure ] -crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-reset-value-after-reloads.html [ Crash ] -crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-spinbutton-change-and-input-events.html [ Crash ] +crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-reset-value-after-reloads.html [ Crash Failure ] +crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-spinbutton-change-and-input-events.html [ Crash Failure ] crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer.html [ Crash Failure ] crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-validity-badinput.html [ Failure ] crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-value-set-empty.html [ Failure ] -crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-wheel-event.html [ Crash ] +crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-wheel-event.html [ Crash Failure ] crbug.com/591099 fast/forms/week/ValidityState-rangeOverflow-week.html [ Failure ] crbug.com/591099 fast/forms/week/ValidityState-rangeUnderflow-week.html [ Failure ] crbug.com/591099 fast/forms/week/ValidityState-stepMismatch-week.html [ Failure ] @@ -11477,10 +11485,10 @@ crbug.com/591099 fast/forms/week/week-pseudo-classes.html [ Failure ] crbug.com/591099 fast/forms/week/week-setrangetext.html [ Failure ] crbug.com/591099 fast/forms/week/week-stepup-stepdown.html [ Failure ] -crbug.com/591099 fast/forms/willvalidate.html [ Crash ] +crbug.com/591099 fast/forms/willvalidate.html [ Crash Failure ] crbug.com/591099 fast/frames/001.html [ Failure ] crbug.com/591099 fast/frames/002.html [ Failure ] -crbug.com/591099 fast/frames/cached-frame-counter.html [ Crash ] +crbug.com/591099 fast/frames/cached-frame-counter.html [ Crash Failure ] crbug.com/591099 fast/frames/calculate-fixed.html [ Failure ] crbug.com/591099 fast/frames/calculate-order.html [ Failure ] crbug.com/591099 fast/frames/calculate-percentage.html [ Failure ] @@ -11489,7 +11497,7 @@ crbug.com/591099 fast/frames/content-opacity-1.html [ Failure ] crbug.com/591099 fast/frames/content-opacity-2.html [ Failure ] crbug.com/591099 fast/frames/crash-removed-iframe.html [ Failure ] -crbug.com/591099 fast/frames/create-iframe-on-blur.html [ Crash ] +crbug.com/591099 fast/frames/create-iframe-on-blur.html [ Crash Failure ] crbug.com/591099 fast/frames/detach-during-initial-load.html [ Failure ] crbug.com/591099 fast/frames/detach-frame-from-child-detach-no-crash.html [ Failure ] crbug.com/591099 fast/frames/detach-frame-nested-no-crash.html [ Crash Failure ] @@ -11501,10 +11509,10 @@ crbug.com/591099 fast/frames/empty-cols-attribute.html [ Failure ] crbug.com/591099 fast/frames/empty-frame-document.html [ Failure ] crbug.com/591099 fast/frames/empty-frame-src.html [ Failure ] -crbug.com/591099 fast/frames/focus-controller-crash-change-event.html [ Crash Timeout ] -crbug.com/591099 fast/frames/form-submission-early-return-for-sandboxed-iframes.html [ Crash ] +crbug.com/591099 fast/frames/focus-controller-crash-change-event.html [ Crash Pass Timeout ] +crbug.com/591099 fast/frames/form-submission-early-return-for-sandboxed-iframes.html [ Crash Pass ] crbug.com/591099 fast/frames/frame-dimensions-before-parent-layout.html [ Failure ] -crbug.com/591099 fast/frames/frame-focus-no-focusout-event.html [ Crash ] +crbug.com/591099 fast/frames/frame-focus-no-focusout-event.html [ Crash Pass ] crbug.com/591099 fast/frames/frame-focus-send-blur.html [ Failure ] crbug.com/591099 fast/frames/frame-inherit-noresize-from-frameset.html [ Failure ] crbug.com/591099 fast/frames/frame-length-fractional.html [ Failure ] @@ -11529,13 +11537,13 @@ crbug.com/591099 fast/frames/frameElement-frame.html [ Failure ] crbug.com/591099 fast/frames/frameElement-iframe.html [ Failure ] crbug.com/591099 fast/frames/frames-with-frameborder-zero-can-be-resized.html [ Failure ] -crbug.com/591099 fast/frames/frameset-dynamic-resize.html [ Crash ] +crbug.com/591099 fast/frames/frameset-dynamic-resize.html [ Crash Pass ] crbug.com/591099 fast/frames/frameset-frameborder-boolean-values.html [ Failure ] crbug.com/591099 fast/frames/frameset-frameborder-inheritance.html [ Failure ] crbug.com/591099 fast/frames/frameset-frameborder-overrides-border.html [ Failure ] crbug.com/591099 fast/frames/frameset-style-recalc.html [ Failure ] -crbug.com/591099 fast/frames/hover-timer-crash.html [ Crash ] -crbug.com/591099 fast/frames/iframe-access-screen-of-deleted.html [ Crash ] +crbug.com/591099 fast/frames/hover-timer-crash.html [ Crash Failure ] +crbug.com/591099 fast/frames/iframe-access-screen-of-deleted.html [ Crash Pass ] crbug.com/591099 fast/frames/iframe-js-url-clientWidth.html [ Failure ] crbug.com/591099 fast/frames/iframe-name-and-id.html [ Failure ] crbug.com/591099 fast/frames/iframe-no-name.html [ Failure ] @@ -11544,9 +11552,9 @@ crbug.com/591099 fast/frames/iframe-onload-and-domnodeinserted.html [ Failure ] crbug.com/591099 fast/frames/iframe-onload-remove-self-no-crash.html [ Failure ] crbug.com/591099 fast/frames/iframe-option-crash.xhtml [ Failure ] -crbug.com/591099 fast/frames/iframe-plugin-load-remove-document-crash.html [ Crash ] +crbug.com/591099 fast/frames/iframe-plugin-load-remove-document-crash.html [ Crash Pass ] crbug.com/591099 fast/frames/iframe-remove-after-id-change.html [ Failure ] -crbug.com/591099 fast/frames/iframe-reparenting-unique-name.html [ Crash ] +crbug.com/591099 fast/frames/iframe-reparenting-unique-name.html [ Crash Failure ] crbug.com/591099 fast/frames/iframe-scale-applied-twice.html [ Failure ] crbug.com/591099 fast/frames/iframe-scaling-with-scroll.html [ Failure ] crbug.com/591099 fast/frames/iframe-scrolling-attribute-overflowscroll.html [ Failure ] @@ -11570,10 +11578,10 @@ crbug.com/591099 fast/frames/parser-append-subframe-count.html [ Failure ] crbug.com/591099 fast/frames/reattach-in-unload.html [ Failure ] crbug.com/591099 fast/frames/removal-before-attach-crash.html [ Failure ] -crbug.com/591099 fast/frames/remove-frame-during-load-event.html [ Crash ] -crbug.com/591099 fast/frames/remove-frame-with-scrollbars-crash.html [ Crash ] -crbug.com/591099 fast/frames/repaint-display-none-crash.html [ Crash ] -crbug.com/591099 fast/frames/reparented-iframe-cleared-contentWindow.html [ Crash ] +crbug.com/591099 fast/frames/remove-frame-during-load-event.html [ Crash Pass ] +crbug.com/591099 fast/frames/remove-frame-with-scrollbars-crash.html [ Crash Failure ] +crbug.com/591099 fast/frames/repaint-display-none-crash.html [ Crash Failure ] +crbug.com/591099 fast/frames/reparented-iframe-cleared-contentWindow.html [ Crash Pass ] crbug.com/591099 fast/frames/sandboxed-iframe-about-blank.html [ Failure ] crbug.com/591099 fast/frames/sandboxed-iframe-attribute-parsing-01.html [ Failure ] crbug.com/591099 fast/frames/sandboxed-iframe-attribute-parsing-02.html [ Failure ] @@ -11611,17 +11619,17 @@ crbug.com/591099 fast/frames/set-iframe-src-in-pagehide-crash.html [ Failure ] crbug.com/591099 fast/frames/set-parent-src-synchronously-html.html [ Failure Pass ] crbug.com/591099 fast/frames/set-parent-src-synchronously-xhtml.xhtml [ Failure Pass ] -crbug.com/591099 fast/frames/srcdoc/removing-srcdoc-loads-src.html [ Crash ] +crbug.com/591099 fast/frames/srcdoc/removing-srcdoc-loads-src.html [ Crash Pass ] crbug.com/591099 fast/frames/srcdoc/setting-src-does-nothing.html [ Failure ] crbug.com/591099 fast/frames/srcdoc/setting-srcdoc-reloads-document.html [ Failure ] -crbug.com/591099 fast/frames/srcdoc/srcdoc-deep-nested-frames.html [ Crash ] -crbug.com/591099 fast/frames/subframe-load-crash-main.html [ Crash ] -crbug.com/591099 fast/frames/take-focus-from-iframe.html [ Crash ] +crbug.com/591099 fast/frames/srcdoc/srcdoc-deep-nested-frames.html [ Crash Pass ] +crbug.com/591099 fast/frames/subframe-load-crash-main.html [ Crash Pass ] +crbug.com/591099 fast/frames/take-focus-from-iframe.html [ Crash Failure ] crbug.com/591099 fast/frames/unique-name-all-subframes-have-same-name.html [ Failure ] crbug.com/591099 fast/frames/unique-name-ancestor-concatenation-conflict.html [ Failure ] crbug.com/591099 fast/frames/unique-name-remove-add-child.html [ Failure ] -crbug.com/591099 fast/frames/unload-reparent-sibling-frame.html [ Crash ] -crbug.com/591099 fast/frames/url-selected-crash.html [ Crash ] +crbug.com/591099 fast/frames/unload-reparent-sibling-frame.html [ Crash Failure ] +crbug.com/591099 fast/frames/url-selected-crash.html [ Crash Pass ] crbug.com/591099 fast/frames/valid.html [ Failure ] crbug.com/591099 fast/gradients/background-clipped.html [ Failure ] crbug.com/591099 fast/gradients/border-image-gradient-sides-and-corners.html [ Failure ] @@ -11679,10 +11687,10 @@ crbug.com/591099 fast/harness/perftests/perf-runner-compute-statistics.html [ Failure ] crbug.com/591099 fast/harness/perftests/runs-per-second-iterations.html [ Failure ] crbug.com/591099 fast/harness/perftests/runs-per-second-log.html [ Failure ] -crbug.com/591099 fast/harness/results.html [ Crash ] +crbug.com/591099 fast/harness/results.html [ Crash Pass ] crbug.com/591099 fast/harness/should-be-now.html [ Failure ] crbug.com/591099 fast/harness/user-preferred-language.html [ Crash Failure ] -crbug.com/591099 fast/hidpi/broken-image-icon-hidpi.html [ Crash Failure ] +crbug.com/591099 fast/hidpi/broken-image-icon-hidpi.html [ Crash Failure Pass ] crbug.com/591099 fast/hidpi/image-set-list-style-image.html [ Failure ] crbug.com/591099 fast/hidpi/image-set-shape-outside.html [ Failure ] crbug.com/591099 fast/hidpi/image-srcset-intrinsic-size.html [ Failure Pass ] @@ -11702,11 +11710,11 @@ crbug.com/591099 fast/history/multiple-classes-visited.html [ Failure ] crbug.com/591099 fast/history/nested-visited-test.html [ Failure ] crbug.com/591099 fast/history/redirect-via-iframe.html [ Failure ] -crbug.com/591099 fast/history/same-document-iframes-changing-fragment.html [ Crash ] -crbug.com/591099 fast/history/same-document-iframes-changing-pushstate.html [ Crash ] +crbug.com/591099 fast/history/same-document-iframes-changing-fragment.html [ Crash Failure ] +crbug.com/591099 fast/history/same-document-iframes-changing-pushstate.html [ Crash Failure ] crbug.com/591099 fast/history/saves-state-after-frame-nav.html [ Failure ] -crbug.com/591099 fast/history/scroll-restoration/scroll-restoration-fragment-navigation-crossdoc.html [ Crash ] -crbug.com/591099 fast/history/scroll-restoration/scroll-restoration-navigation.html [ Crash ] +crbug.com/591099 fast/history/scroll-restoration/scroll-restoration-fragment-navigation-crossdoc.html [ Crash Pass ] +crbug.com/591099 fast/history/scroll-restoration/scroll-restoration-navigation.html [ Crash Pass ] crbug.com/591099 fast/history/self-is-visited.html [ Failure ] crbug.com/591099 fast/history/sibling-visited-test.html [ Failure ] crbug.com/591099 fast/history/state-object-few-arguements-exception.html [ Failure ] @@ -11745,13 +11753,13 @@ crbug.com/591099 fast/html/input-type-change-crash.html [ Failure ] crbug.com/591099 fast/html/meter-user-modify.html [ Failure ] crbug.com/591099 fast/html/object-border.html [ Failure ] -crbug.com/591099 fast/html/object-image-nested-fallback.html [ Crash ] +crbug.com/591099 fast/html/object-image-nested-fallback.html [ Crash Pass ] crbug.com/591099 fast/html/progress-user-modify.html [ Failure ] crbug.com/591099 fast/html/script-allowed-types-languages.html [ Failure ] crbug.com/591099 fast/html/select-dropdown-consistent-background-color.html [ Failure Pass ] crbug.com/591099 fast/html/set-text-direction.html [ Crash Failure ] crbug.com/591099 fast/html/tab-order.html [ Crash Failure ] -crbug.com/591099 fast/html/tabindex-nonfocusable.html [ Crash ] +crbug.com/591099 fast/html/tabindex-nonfocusable.html [ Crash Pass ] crbug.com/591099 fast/html/unknown-tag.html [ Crash Failure ] crbug.com/591099 fast/inline-block/001.html [ Failure ] crbug.com/591099 fast/inline-block/002.html [ Failure ] @@ -11782,13 +11790,13 @@ crbug.com/591099 fast/inline/drawStyledEmptyInlinesWithWS.html [ Failure ] crbug.com/591099 fast/inline/empty-inline-before-collapsed-space.html [ Failure ] crbug.com/591099 fast/inline/emptyInlinesWithinLists.html [ Crash Failure ] -crbug.com/591099 fast/inline/fixed-pos-moves-with-abspos-inline-parent.html [ Crash ] +crbug.com/591099 fast/inline/fixed-pos-moves-with-abspos-inline-parent.html [ Crash Failure ] crbug.com/591099 fast/inline/fixed-pos-moves-with-abspos-parent-relative-ancestor.html [ Failure ] crbug.com/591099 fast/inline/fixed-pos-moves-with-abspos-parent.html [ Failure ] crbug.com/591099 fast/inline/fixed-pos-with-transform-container-moves-with-abspos-parent.html [ Failure ] crbug.com/591099 fast/inline/inline-body-with-inline-child.html [ Failure ] crbug.com/591099 fast/inline/inline-borders-with-bidi-override.html [ Failure ] -crbug.com/591099 fast/inline/inline-box-adjust-position-crash.html [ Crash ] +crbug.com/591099 fast/inline/inline-box-adjust-position-crash.html [ Crash Failure ] crbug.com/591099 fast/inline/inline-box-background-long-image.html [ Failure ] crbug.com/591099 fast/inline/inline-box-background-repeat-x.html [ Failure ] crbug.com/591099 fast/inline/inline-box-background-repeat-y.html [ Failure ] @@ -11817,7 +11825,7 @@ crbug.com/591099 fast/inline/positionedLifetime.html [ Failure Pass ] crbug.com/591099 fast/inline/reattach-inlines-in-anonymous-blocks-with-out-of-flow-siblings.html [ Failure ] crbug.com/591099 fast/inline/relative-positioned-overflow.html [ Failure ] -crbug.com/591099 fast/inline/reparent-inline-box.html [ Crash ] +crbug.com/591099 fast/inline/reparent-inline-box.html [ Crash Pass ] crbug.com/591099 fast/inline/styledEmptyInlinesWithBRs.html [ Failure ] crbug.com/591099 fast/innerHTML/004.xhtml [ Failure ] crbug.com/591099 fast/innerHTML/005.html [ Failure ] @@ -11859,7 +11867,7 @@ crbug.com/591099 fast/invalid/missing-font-end-tag.html [ Failure ] crbug.com/591099 fast/invalid/nestedh3s-rapidweaver.html [ Failure ] crbug.com/591099 fast/invalid/nestedh3s.html [ Failure ] -crbug.com/591099 fast/invalid/residual-style.html [ Crash ] +crbug.com/591099 fast/invalid/residual-style.html [ Crash Pass ] crbug.com/591099 fast/invalid/table-inside-stray-table-content.html [ Failure ] crbug.com/591099 fast/invalid/table-residual-style-crash.html [ Failure ] crbug.com/591099 fast/invalid/td-inside-object.html [ Failure ] @@ -11872,10 +11880,10 @@ crbug.com/591099 fast/js/activation-object-function-lifetime.html [ Failure ] crbug.com/591099 fast/js/activation-proto.html [ Failure ] crbug.com/591099 fast/js/add-to-primitive.html [ Failure ] -crbug.com/591099 fast/js/array-foreach.html [ Crash ] +crbug.com/591099 fast/js/array-foreach.html [ Crash Pass ] crbug.com/591099 fast/js/array-indexof.html [ Failure ] crbug.com/591099 fast/js/array-join-bug-11524.html [ Failure ] -crbug.com/591099 fast/js/array-some.html [ Crash ] +crbug.com/591099 fast/js/array-some.html [ Crash Pass ] crbug.com/591099 fast/js/array-sort-exception.html [ Failure ] crbug.com/591099 fast/js/assign.html [ Failure ] crbug.com/591099 fast/js/bom-in-file-retains-correct-offset.html [ Failure ] @@ -12136,7 +12144,7 @@ crbug.com/591099 fast/layers/self-painting-outline.html [ Failure ] crbug.com/591099 fast/layers/zindex-inherit.html [ Failure ] crbug.com/591099 fast/layers/zindex-ridonkulous.html [ Failure ] -crbug.com/591099 fast/layout/scroll-anchoring/anchor-inside-iframe.html [ Crash ] +crbug.com/591099 fast/layout/scroll-anchoring/anchor-inside-iframe.html [ Crash Pass ] crbug.com/591099 fast/leaks/001.html [ Failure ] crbug.com/591099 fast/leaks/002.html [ Crash Failure ] crbug.com/591099 fast/lists/001-vertical.html [ Crash Failure ] @@ -12210,7 +12218,7 @@ crbug.com/591099 fast/lists/list-marker-remove-crash.html [ Crash Pass ] crbug.com/591099 fast/lists/list-marker-with-line-height.html [ Crash Failure ] crbug.com/591099 fast/lists/list-style-none-crash.html [ Failure ] -crbug.com/591099 fast/lists/list-style-position-inside.html [ Crash ] +crbug.com/591099 fast/lists/list-style-position-inside.html [ Crash Pass ] crbug.com/591099 fast/lists/list-style-type-dynamic-change.html [ Crash Failure ] crbug.com/591099 fast/lists/marker-before-empty-inline.html [ Crash Failure ] crbug.com/591099 fast/lists/marker-image-error.html [ Crash Failure ] @@ -12233,7 +12241,7 @@ crbug.com/591099 fast/lists/ol-start-parsing.html [ Failure ] crbug.com/591099 fast/lists/olstart.html [ Failure ] crbug.com/591099 fast/lists/ordered-list-with-no-ol-tag.html [ Crash Failure ] -crbug.com/591099 fast/lists/remove-listmarker-and-make-anonblock-empty-2.html [ Crash ] +crbug.com/591099 fast/lists/remove-listmarker-and-make-anonblock-empty-2.html [ Crash Pass ] crbug.com/591099 fast/lists/w3-css3-list-styles-alphabetic.html [ Crash Failure Timeout ] crbug.com/591099 fast/lists/w3-css3-list-styles-deprecated.html [ Failure ] crbug.com/591099 fast/lists/w3-css3-list-styles-fallback-style.html [ Crash Failure ] @@ -12245,11 +12253,11 @@ crbug.com/591099 fast/loader/about-blank-hash-kept.html [ Failure ] crbug.com/591099 fast/loader/charset-parse.html [ Failure ] crbug.com/591099 fast/loader/child-frame-add-after-back-forward.html [ Failure Timeout ] -crbug.com/591099 fast/loader/crash-focus-in-unload.html [ Crash ] -crbug.com/591099 fast/loader/data-url-encoding-html-2.html [ Crash ] +crbug.com/591099 fast/loader/crash-focus-in-unload.html [ Crash Pass ] +crbug.com/591099 fast/loader/data-url-encoding-html-2.html [ Crash Pass ] crbug.com/591099 fast/loader/data-url-encoding-html.html [ Failure ] crbug.com/591099 fast/loader/data-url-encoding-svg.html [ Failure ] -crbug.com/591099 fast/loader/document-destruction-within-unload.html [ Crash ] +crbug.com/591099 fast/loader/document-destruction-within-unload.html [ Crash Pass ] crbug.com/591099 fast/loader/empty-embed-src-attribute.html [ Failure ] crbug.com/591099 fast/loader/font-face-empty.html [ Failure ] crbug.com/591099 fast/loader/fragment-anchor-cleared-after-load-when-hidden.html [ Failure ] @@ -12277,9 +12285,9 @@ crbug.com/591099 fast/loader/onload-bad-scheme-for-frame.html [ Failure Timeout ] crbug.com/591099 fast/loader/onload-policy-ignore-for-frame.html [ Failure ] crbug.com/591099 fast/loader/opaque-base-url.html [ Crash Failure ] -crbug.com/591099 fast/loader/open-in-srcdoc-unload.html [ Crash ] -crbug.com/591099 fast/loader/remove-iframe-during-history-navigation-different.html [ Crash ] -crbug.com/591099 fast/loader/remove-iframe-during-history-navigation-same.html [ Crash ] +crbug.com/591099 fast/loader/open-in-srcdoc-unload.html [ Crash Pass ] +crbug.com/591099 fast/loader/remove-iframe-during-history-navigation-different.html [ Crash Pass ] +crbug.com/591099 fast/loader/remove-iframe-during-history-navigation-same.html [ Crash Pass ] crbug.com/591099 fast/loader/scroll-position-restoration-for-history-api.html [ Failure ] crbug.com/591099 fast/loader/scroll-position-restoration-without-premature-clamping.html [ Failure ] crbug.com/591099 fast/loader/scroll-position-restored-on-back-at-load-event.html [ Failure ] @@ -12326,7 +12334,7 @@ crbug.com/591099 fast/media/viewport-media-query-synchronous.html [ Failure ] crbug.com/591099 fast/mediacapturefromelement/CanvasCaptureMediaStream-2d-events.html [ Failure ] crbug.com/591099 fast/mediacapturefromelement/CanvasCaptureMediaStream-framerate-0.html [ Failure ] -crbug.com/591099 fast/mediacapturefromelement/CanvasCaptureMediaStream-imagebitmaprenderingcontext.html [ Crash ] +crbug.com/591099 fast/mediacapturefromelement/CanvasCaptureMediaStream-imagebitmaprenderingcontext.html [ Crash Pass ] crbug.com/591099 fast/mediacapturefromelement/CanvasCaptureMediaStream-request-frame-events.html [ Failure ] crbug.com/591099 fast/mediacapturefromelement/CanvasCaptureMediaStream-webgl-events.html [ Failure ] crbug.com/591099 fast/mediastream/MediaStream-add-remove-tracks.html [ Failure ] @@ -12334,7 +12342,7 @@ crbug.com/591099 fast/mediastream/MediaStream-onactive-oninactive.html [ Failure ] crbug.com/591099 fast/mediastream/MediaStream-stop.html [ Failure ] crbug.com/591099 fast/mediastream/MediaStreamConstructor.html [ Failure ] -crbug.com/591099 fast/mediastream/MediaStreamTrack-contentHint.html [ Crash ] +crbug.com/591099 fast/mediastream/MediaStreamTrack-contentHint.html [ Crash Pass ] crbug.com/591099 fast/mediastream/MediaStreamTrack-gc-no-crash.html [ Failure ] crbug.com/591099 fast/mediastream/MediaStreamTrack-observer-iterate-no-crash.html [ Failure ] crbug.com/591099 fast/mediastream/MediaStreamTrack.html [ Failure ] @@ -12738,7 +12746,7 @@ crbug.com/591099 fast/overflow/overflow-with-local-background-attachment.html [ Crash Failure ] crbug.com/591099 fast/overflow/overflow-x-y.html [ Crash Failure ] crbug.com/591099 fast/overflow/overflow-y-scroll.html [ Failure ] -crbug.com/591099 fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto.html [ Crash ] +crbug.com/591099 fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto.html [ Crash Failure ] crbug.com/591099 fast/overflow/resize-inherit.html [ Failure ] crbug.com/591099 fast/overflow/scroll-div-hide-show.html [ Failure ] crbug.com/591099 fast/overflow/scroll-html-hidden-body.html [ Failure Pass ] @@ -12805,10 +12813,10 @@ crbug.com/591099 fast/parser/comment-in-textarea.html [ Crash Failure ] crbug.com/591099 fast/parser/comments.html [ Failure ] crbug.com/591099 fast/parser/crash-HTMLParser-createHead.html [ Failure ] -crbug.com/591099 fast/parser/disable-frameset-ok-flag-inside-template.html [ Crash ] +crbug.com/591099 fast/parser/disable-frameset-ok-flag-inside-template.html [ Crash Pass ] crbug.com/591099 fast/parser/document-open-in-unload.html [ Crash Failure ] crbug.com/591099 fast/parser/document-reload-with-failed-deferred-scripts.html [ Failure ] -crbug.com/591099 fast/parser/document-write-into-initial-document.html [ Crash ] +crbug.com/591099 fast/parser/document-write-into-initial-document.html [ Crash Pass ] crbug.com/591099 fast/parser/document-write-onload-nesting.html [ Failure ] crbug.com/591099 fast/parser/document-write-onload-ordering.html [ Failure ] crbug.com/591099 fast/parser/document-write-option.html [ Failure ] @@ -12844,13 +12852,13 @@ crbug.com/591099 fast/parser/inline-script-order.html [ Failure ] crbug.com/591099 fast/parser/innerhtml-with-prefixed-elements.xhtml [ Failure Pass ] crbug.com/591099 fast/parser/input-textarea-inside-select-element.html [ Failure ] -crbug.com/591099 fast/parser/inselect-tokenization.html [ Crash ] +crbug.com/591099 fast/parser/inselect-tokenization.html [ Crash Pass ] crbug.com/591099 fast/parser/invalid-entity-document-write.html [ Failure ] crbug.com/591099 fast/parser/move-during-parsing.html [ Failure ] crbug.com/591099 fast/parser/nofoo-tags-inside-paragraph.html [ Failure ] crbug.com/591099 fast/parser/non-script-endtag-in-textmode.html [ Failure ] crbug.com/591099 fast/parser/noscript-with-javascript-disabled.html [ Failure ] -crbug.com/591099 fast/parser/object-with-textarea-fallback.html [ Crash ] +crbug.com/591099 fast/parser/object-with-textarea-fallback.html [ Crash Pass ] crbug.com/591099 fast/parser/open-comment-in-style.html [ Failure ] crbug.com/591099 fast/parser/open-comment-in-textarea.html [ Crash Failure ] crbug.com/591099 fast/parser/p-in-scope-strict.html [ Failure ] @@ -12870,19 +12878,19 @@ crbug.com/591099 fast/parser/stray-end-tags-with-attributes-002-alt-quirks.html [ Failure ] crbug.com/591099 fast/parser/stray-end-tags-with-attributes-002-alt.html [ Failure ] crbug.com/591099 fast/parser/strict-img-in-map.html [ Crash Failure ] -crbug.com/591099 fast/parser/strip-script-attrs-on-input.html [ Crash ] +crbug.com/591099 fast/parser/strip-script-attrs-on-input.html [ Crash Pass ] crbug.com/591099 fast/parser/style-script-head-test.html [ Failure ] crbug.com/591099 fast/parser/tabindex-parsing.html [ Failure ] crbug.com/591099 fast/parser/tabs-in-scripts.html [ Failure ] crbug.com/591099 fast/parser/tag-with-exclamation-point.html [ Failure ] crbug.com/591099 fast/parser/title-error-test.html [ Failure ] crbug.com/591099 fast/parser/tokenizer-close-during-document-write.html [ Failure ] -crbug.com/591099 fast/parser/write-script-waiting-for-style-crash.html [ Crash ] +crbug.com/591099 fast/parser/write-script-waiting-for-style-crash.html [ Crash Pass ] crbug.com/591099 fast/parser/xhtml-alternate-entities.xml [ Crash Failure ] crbug.com/591099 fast/parser/xhtml-document-with-html-object.xhtml [ Failure ] -crbug.com/591099 fast/parser/xhtml-dom-character-data-modified-crash.html [ Crash ] +crbug.com/591099 fast/parser/xhtml-dom-character-data-modified-crash.html [ Crash Pass ] crbug.com/591099 fast/parser/xhtml-html-comment-in-style-block.xhtml [ Failure ] -crbug.com/591099 fast/parser/xhtml-synchronous-detach-crash.html [ Crash ] +crbug.com/591099 fast/parser/xhtml-synchronous-detach-crash.html [ Crash Pass ] crbug.com/591099 fast/parser/xml-colon-entity.html [ Failure ] crbug.com/591099 fast/parser/xml-declaration-missing-ending-mark.html [ Failure ] crbug.com/591099 fast/peerconnection/RTCPeerConnection-createAnswer.html [ Failure ] @@ -12905,9 +12913,9 @@ crbug.com/591099 fast/performance/performance-mark-exceptions.html [ Failure ] crbug.com/591099 fast/performance/performance-measure-exceptions.html [ Failure ] crbug.com/591099 fast/performance/performance-observer.html [ Failure ] -crbug.com/591099 fast/plugins/update-plugin-after-detachment-crash.html [ Crash ] -crbug.com/591099 fast/plugins/webview-plugin-updates-without-layout.html [ Crash ] -crbug.com/591099 fast/preloader/document-write-noscript.html [ Crash ] +crbug.com/591099 fast/plugins/update-plugin-after-detachment-crash.html [ Crash Pass ] +crbug.com/591099 fast/plugins/webview-plugin-updates-without-layout.html [ Crash Pass ] +crbug.com/591099 fast/preloader/document-write-noscript.html [ Crash Pass ] crbug.com/591099 fast/preloader/iframe-srcdoc.html [ Failure Pass ] crbug.com/591099 fast/reflections/abs-position-in-reflection.html [ Failure ] crbug.com/591099 fast/reflections/inline-crash.html [ Failure ] @@ -12947,8 +12955,8 @@ crbug.com/591099 fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor-vertical-lr.html [ Failure ] crbug.com/591099 fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor.html [ Failure ] crbug.com/591099 fast/replaced/container-width-zero.html [ Failure ] -crbug.com/591099 fast/replaced/frame-removed-during-resize-smaller.html [ Crash ] -crbug.com/591099 fast/replaced/frame-removed-during-resize.html [ Crash ] +crbug.com/591099 fast/replaced/frame-removed-during-resize-smaller.html [ Crash Failure ] +crbug.com/591099 fast/replaced/frame-removed-during-resize.html [ Crash Failure ] crbug.com/591099 fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell.html [ Failure ] crbug.com/591099 fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height.html [ Failure ] crbug.com/591099 fast/replaced/image-map-2.html [ Failure ] @@ -12962,7 +12970,7 @@ crbug.com/591099 fast/replaced/image-resize-width.html [ Failure ] crbug.com/591099 fast/replaced/image-solid-color-with-alpha.html [ Failure ] crbug.com/591099 fast/replaced/inline-box-wrapper-handover.html [ Failure ] -crbug.com/591099 fast/replaced/invalid-object-with-fallback.html [ Crash ] +crbug.com/591099 fast/replaced/invalid-object-with-fallback.html [ Crash Failure ] crbug.com/591099 fast/replaced/max-width-percent.html [ Failure ] crbug.com/591099 fast/replaced/maxheight-percent.html [ Failure ] crbug.com/591099 fast/replaced/maxheight-pxs.html [ Failure ] @@ -12977,10 +12985,10 @@ crbug.com/591099 fast/replaced/no-focus-ring-object.html [ Failure Pass Timeout ] crbug.com/591099 fast/replaced/object-align-hspace-vspace.html [ Failure ] crbug.com/591099 fast/replaced/object-param-no-name.html [ Failure ] -crbug.com/591099 fast/replaced/object-with-non-empty-classid-triggers-fallback.html [ Crash ] +crbug.com/591099 fast/replaced/object-with-non-empty-classid-triggers-fallback.html [ Crash Failure ] crbug.com/591099 fast/replaced/outline-replaced-elements.html [ Failure Pass ] crbug.com/591099 fast/replaced/percent-height-in-anonymous-block-in-table.html [ Failure ] -crbug.com/591099 fast/replaced/percent-height-in-anonymous-block-widget.html [ Crash ] +crbug.com/591099 fast/replaced/percent-height-in-anonymous-block-widget.html [ Crash Failure ] crbug.com/591099 fast/replaced/percent-height-in-anonymous-block.html [ Failure ] crbug.com/591099 fast/replaced/percentage-height-with-dynamic-container-height.html [ Failure ] crbug.com/591099 fast/replaced/preferred-widths.html [ Failure ] @@ -13009,7 +13017,7 @@ crbug.com/591099 fast/ruby/base-shorter-than-text.html [ Crash Failure ] crbug.com/591099 fast/ruby/float-overhang-from-ruby-text.html [ Crash Failure ] crbug.com/591099 fast/ruby/floating-ruby-text.html [ Crash Failure ] -crbug.com/591099 fast/ruby/line-break-ruby.html [ Crash ] +crbug.com/591099 fast/ruby/line-break-ruby.html [ Crash Failure ] crbug.com/591099 fast/ruby/list-item-marker-in-block-ruby.html [ Crash Failure ] crbug.com/591099 fast/ruby/merge-adjacent-anonymous-blocks-inside-ruby-run.html [ Crash Failure ] crbug.com/591099 fast/ruby/nested-ruby.html [ Crash Failure ] @@ -13024,20 +13032,20 @@ crbug.com/591099 fast/ruby/percentage-height-child.html [ Crash Failure ] crbug.com/591099 fast/ruby/position-after.html [ Crash Failure ] crbug.com/591099 fast/ruby/positioned-ruby-text.html [ Crash Failure ] -crbug.com/591099 fast/ruby/ruby-base-merge-block-children-crash.html [ Crash ] +crbug.com/591099 fast/ruby/ruby-base-merge-block-children-crash.html [ Crash Failure ] crbug.com/591099 fast/ruby/ruby-block-style-not-updated.html [ Crash Failure ] crbug.com/591099 fast/ruby/ruby-empty-rt.html [ Crash Failure ] crbug.com/591099 fast/ruby/ruby-inline-style-not-updated.html [ Crash Failure ] crbug.com/591099 fast/ruby/ruby-inline-table.html [ Failure ] crbug.com/591099 fast/ruby/ruby-length.html [ Crash Failure ] crbug.com/591099 fast/ruby/ruby-line-height.html [ Crash Failure ] -crbug.com/591099 fast/ruby/ruby-overhang-crash.html [ Crash ] +crbug.com/591099 fast/ruby/ruby-overhang-crash.html [ Crash Pass ] crbug.com/591099 fast/ruby/ruby-run-break.html [ Crash Failure ] crbug.com/591099 fast/ruby/ruby-runs-spans.html [ Crash Failure ] crbug.com/591099 fast/ruby/ruby-runs.html [ Crash Failure ] crbug.com/591099 fast/ruby/ruby-simple-rp.html [ Crash Failure ] crbug.com/591099 fast/ruby/ruby-simple.html [ Crash Failure ] -crbug.com/591099 fast/ruby/ruby-svg-crash.html [ Crash ] +crbug.com/591099 fast/ruby/ruby-svg-crash.html [ Crash Pass ] crbug.com/591099 fast/ruby/ruby-text-before-after-content.html [ Crash Failure ] crbug.com/591099 fast/ruby/ruby-text-before-child-split.html [ Failure ] crbug.com/591099 fast/ruby/ruby-text-indent.html [ Crash Failure ] @@ -13065,14 +13073,14 @@ crbug.com/591099 fast/scroll-behavior/overflow-scroll-triggers-layout.html [ Failure ] crbug.com/591099 fast/scroll-behavior/parse-scroll-behavior.html [ Failure ] crbug.com/591099 fast/scroll-behavior/scroll-into-view-scrolls-layout-viewport.html [ Failure ] -crbug.com/591099 fast/scroll-behavior/scroll-over-resizer.html [ Crash ] +crbug.com/591099 fast/scroll-behavior/scroll-over-resizer.html [ Crash Pass ] crbug.com/591099 fast/scroll-behavior/smooth-scroll/keyboard-scroll.html [ Failure ] crbug.com/591099 fast/scroll-behavior/smooth-scroll/mousewheel-scroll.html [ Failure ] crbug.com/591099 fast/scroll-behavior/smooth-scroll/scroll-during-selection.html [ Failure ] crbug.com/591099 fast/scroll-behavior/smooth-scroll/track-scroll.html [ Failure ] crbug.com/591099 fast/scroll-behavior/subframe-interrupted-scroll.html [ Failure Pass ] crbug.com/591099 fast/scrolling/abspos-relayout-overflow-style-change.html [ Failure ] -crbug.com/591099 fast/scrolling/content-box-smaller-than-scrollbar.html [ Crash ] +crbug.com/591099 fast/scrolling/content-box-smaller-than-scrollbar.html [ Crash Failure ] crbug.com/591099 fast/scrolling/custom-scrollbar-style-applied.html [ Failure ] crbug.com/591099 fast/scrolling/editor-command-scroll-page-scale.html [ Failure ] crbug.com/591099 fast/scrolling/fractional-scroll-height-chaining.html [ Failure ] @@ -13086,7 +13094,7 @@ crbug.com/591099 fast/scrolling/scroll-clears-fragment-anchor.html [ Failure ] crbug.com/591099 fast/scrolling/scroll-element-into-view.html [ Failure ] crbug.com/591099 fast/scrolling/scroll-into-view-collapsed-div.html [ Failure ] -crbug.com/591099 fast/scrolling/scroll-into-view-small-size-ancestor.html [ Crash ] +crbug.com/591099 fast/scrolling/scroll-into-view-small-size-ancestor.html [ Crash Pass ] crbug.com/591099 fast/scrolling/scroll-max-value.html [ Crash Failure ] crbug.com/591099 fast/scrolling/scrollable-area-frame-overflow-hidden.html [ Crash Failure ] crbug.com/591099 fast/scrolling/scrollbar-mousedown-mouseup.html [ Failure ] @@ -13174,8 +13182,8 @@ crbug.com/591099 fast/selectors/adjacent-selectors-with-subselector.html [ Failure ] crbug.com/591099 fast/selectors/element-closest-general.html [ Failure ] crbug.com/591099 fast/selectors/element-closest-scope.html [ Failure ] -crbug.com/591099 fast/selectors/focus-within-iframe.html [ Crash ] -crbug.com/591099 fast/selectors/focus-within-window-inactive.html [ Crash ] +crbug.com/591099 fast/selectors/focus-within-iframe.html [ Crash Pass ] +crbug.com/591099 fast/selectors/focus-within-window-inactive.html [ Crash Pass ] crbug.com/591099 fast/selectors/lang-inheritance.html [ Failure Pass ] crbug.com/591099 fast/selectors/lang-inheritance2.html [ Failure Pass ] crbug.com/591099 fast/selectors/lang-vs-xml-lang-xhtml.xhtml [ Failure Pass ] @@ -13270,16 +13278,16 @@ crbug.com/591099 fast/spatial-navigation/snav-clipped-overflowed-content.html [ Failure ] crbug.com/591099 fast/spatial-navigation/snav-container-white-space.html [ Failure ] crbug.com/591099 fast/spatial-navigation/snav-date.html [ Failure ] -crbug.com/591099 fast/spatial-navigation/snav-div-scrollable-but-without-focusable-content.html [ Failure ] +crbug.com/591099 fast/spatial-navigation/snav-div-scrollable-but-without-focusable-content.html [ Failure Pass ] crbug.com/591099 fast/spatial-navigation/snav-fully-aligned-vertically.html [ Failure ] crbug.com/591099 fast/spatial-navigation/snav-hidden-focusable-element.html [ Failure ] crbug.com/591099 fast/spatial-navigation/snav-hidden-iframe-zero-size.html [ Failure ] crbug.com/591099 fast/spatial-navigation/snav-hidden-iframe.html [ Failure ] -crbug.com/591099 fast/spatial-navigation/snav-iframe-with-offscreen-focusable-element.html [ Failure ] -crbug.com/591099 fast/spatial-navigation/snav-imagemap-area-not-focusable.html [ Failure ] -crbug.com/591099 fast/spatial-navigation/snav-imagemap-area-without-image.html [ Failure ] -crbug.com/591099 fast/spatial-navigation/snav-imagemap-overlapped-areas.html [ Failure ] -crbug.com/591099 fast/spatial-navigation/snav-imagemap-simple.html [ Failure ] +crbug.com/591099 fast/spatial-navigation/snav-iframe-with-offscreen-focusable-element.html [ Failure Pass ] +crbug.com/591099 fast/spatial-navigation/snav-imagemap-area-not-focusable.html [ Failure Pass ] +crbug.com/591099 fast/spatial-navigation/snav-imagemap-area-without-image.html [ Failure Pass ] +crbug.com/591099 fast/spatial-navigation/snav-imagemap-overlapped-areas.html [ Failure Pass ] +crbug.com/591099 fast/spatial-navigation/snav-imagemap-simple.html [ Failure Pass ] crbug.com/591099 fast/spatial-navigation/snav-input.html [ Failure ] crbug.com/591099 fast/spatial-navigation/snav-media-elements.html [ Failure ] crbug.com/591099 fast/spatial-navigation/snav-multiple-select-focusring.html [ Failure ] @@ -13330,7 +13338,7 @@ crbug.com/591099 fast/sub-pixel/size-of-box-with-zoom.html [ Failure ] crbug.com/591099 fast/sub-pixel/size-of-span-with-different-positions.html [ Failure ] crbug.com/591099 fast/sub-pixel/sub-pixel-border-2.html [ Failure ] -crbug.com/591099 fast/sub-pixel/sub-pixel-border.html [ Crash ] +crbug.com/591099 fast/sub-pixel/sub-pixel-border.html [ Crash Pass ] crbug.com/591099 fast/sub-pixel/sub-pixel-precision-on-height-of-replaced-element.html [ Failure ] crbug.com/591099 fast/sub-pixel/table-rows-have-stable-height.html [ Failure ] crbug.com/591099 fast/table/003.html [ Failure ] @@ -13407,7 +13415,7 @@ crbug.com/591099 fast/table/crash-output-element-as-column-group.html [ Failure ] crbug.com/591099 fast/table/crash-section-logical-height-changed-needsCellRecalc.html [ Failure ] crbug.com/591099 fast/table/crash-split-table-section-no-cell-recalc.html [ Crash Pass ] -crbug.com/591099 fast/table/crash-splitColumn-2.html [ Crash ] +crbug.com/591099 fast/table/crash-splitColumn-2.html [ Crash Failure ] crbug.com/591099 fast/table/crash-splitColumn-3.html [ Failure ] crbug.com/591099 fast/table/crash-splitColumn.html [ Failure ] crbug.com/591099 fast/table/css-table-max-width.html [ Failure ] @@ -13454,7 +13462,7 @@ crbug.com/591099 fast/table/min-width-css-inline-table.html [ Failure Timeout ] crbug.com/591099 fast/table/min-width-html-block-table.html [ Failure Timeout ] crbug.com/591099 fast/table/min-width-html-inline-table.html [ Failure Timeout ] -crbug.com/591099 fast/table/multiple-captions-crash3.html [ Crash ] +crbug.com/591099 fast/table/multiple-captions-crash3.html [ Crash Pass ] crbug.com/591099 fast/table/nested-percent-height-table.html [ Failure ] crbug.com/591099 fast/table/overallocating-auto-cells.html [ Failure ] crbug.com/591099 fast/table/percent-height-border-box-content-in-cell-2.html [ Failure ] @@ -13478,7 +13486,7 @@ crbug.com/591099 fast/table/percent-widths-stretch-vertical.html [ Failure ] crbug.com/591099 fast/table/percent-widths-total-less-than-one.html [ Failure ] crbug.com/591099 fast/table/prepend-in-anonymous-table.html [ Failure ] -crbug.com/591099 fast/table/quirks-mode-ignore-display-inline-table.html [ Crash ] +crbug.com/591099 fast/table/quirks-mode-ignore-display-inline-table.html [ Crash Pass ] crbug.com/591099 fast/table/recalc-section-first-body-crash-main.html [ Failure ] crbug.com/591099 fast/table/remove-anonymous-cell.html [ Failure ] crbug.com/591099 fast/table/remove-cell-with-large-border-width.html [ Failure ] @@ -13500,7 +13508,7 @@ crbug.com/591099 fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped.html [ Failure ] crbug.com/591099 fast/table/table-all-rowspans-height-distribution-in-rows.html [ Failure ] crbug.com/591099 fast/table/table-before-child-in-table.html [ Failure Pass ] -crbug.com/591099 fast/table/table-caption-moved-crash.html [ Crash ] +crbug.com/591099 fast/table/table-caption-moved-crash.html [ Crash Pass ] crbug.com/591099 fast/table/table-cell-negative-start-margin-align-center.html [ Failure ] crbug.com/591099 fast/table/table-colgroup-present-after-table-row.html [ Failure ] crbug.com/591099 fast/table/table-different-overflow-values-2.html [ Failure ] @@ -13569,7 +13577,7 @@ crbug.com/591099 fast/text-autosizing/header-links-autosizing-different-fontsize.html [ Failure ] crbug.com/591099 fast/text-autosizing/header-links-autosizing.html [ Failure ] crbug.com/591099 fast/text-autosizing/inherited-multiplier.html [ Failure ] -crbug.com/591099 fast/text-autosizing/inline-block-em-width-hover.html [ Crash ] +crbug.com/591099 fast/text-autosizing/inline-block-em-width-hover.html [ Crash Pass ] crbug.com/591099 fast/text-autosizing/inline-float.html [ Failure ] crbug.com/591099 fast/text-autosizing/layout-after-append.html [ Failure ] crbug.com/591099 fast/text-autosizing/list-item-above-dbcat.html [ Failure ] @@ -13645,7 +13653,7 @@ crbug.com/591099 fast/text/decorations-with-text-combine.html [ Failure ] crbug.com/591099 fast/text/delete-hard-break-character.html [ Failure ] crbug.com/591099 fast/text/drawBidiText.html [ Failure ] -crbug.com/591099 fast/text/editing-text-crash.html [ Crash ] +crbug.com/591099 fast/text/editing-text-crash.html [ Crash Pass ] crbug.com/591099 fast/text/ellipsis-at-edge-of-ltr-text-in-rtl-flow.html [ Failure ] crbug.com/591099 fast/text/ellipsis-at-edge-of-rtl-text-in-ltr-flow.html [ Failure ] crbug.com/591099 fast/text/ellipsis-ltr-text-in-ltr-flow-underline-composition.html [ Failure ] @@ -13678,11 +13686,11 @@ crbug.com/591099 fast/text/find-kana.html [ Timeout ] crbug.com/591099 fast/text/find-russian.html [ Failure ] crbug.com/591099 fast/text/find-soft-hyphen.html [ Failure ] -crbug.com/591099 fast/text/first-letter-bad-line-boxes-crash.html [ Crash ] +crbug.com/591099 fast/text/first-letter-bad-line-boxes-crash.html [ Crash Pass ] crbug.com/591099 fast/text/firstline/001.html [ Failure ] crbug.com/591099 fast/text/firstline/002.html [ Failure ] crbug.com/591099 fast/text/firstline/003.html [ Failure ] -crbug.com/591099 fast/text/fit-content-with-element-boundaries.html [ Crash ] +crbug.com/591099 fast/text/fit-content-with-element-boundaries.html [ Crash Pass ] crbug.com/591099 fast/text/font-ascent-mac.html [ Failure ] crbug.com/591099 fast/text/font-fallback-synthetic-italics.html [ Failure ] crbug.com/591099 fast/text/font-initial.html [ Failure ] @@ -13696,7 +13704,7 @@ crbug.com/591099 fast/text/hyphenate-character.html [ Failure ] crbug.com/591099 fast/text/hyphens/hyphens-none.html [ Failure ] crbug.com/591099 fast/text/in-rendered-text-rtl.html [ Failure ] -crbug.com/591099 fast/text/insert-text-crash.html [ Crash ] +crbug.com/591099 fast/text/insert-text-crash.html [ Crash Pass ] crbug.com/591099 fast/text/international/arabic-justify.html [ Failure ] crbug.com/591099 fast/text/international/arabic-vertical-offset.html [ Failure ] crbug.com/591099 fast/text/international/bidi-AN-after-empty-run.html [ Failure ] @@ -13727,7 +13735,7 @@ crbug.com/591099 fast/text/international/hebrew-vowels.html [ Failure ] crbug.com/591099 fast/text/international/hindi-whitespace.html [ Failure ] crbug.com/591099 fast/text/international/iso-8859-8.html [ Failure ] -crbug.com/591099 fast/text/international/listbox-width-rtl.html [ Crash ] +crbug.com/591099 fast/text/international/listbox-width-rtl.html [ Crash Failure ] crbug.com/591099 fast/text/international/plane2.html [ Failure ] crbug.com/591099 fast/text/international/rtl-caret.html [ Failure ] crbug.com/591099 fast/text/international/rtl-negative-letter-spacing.html [ Failure ] @@ -13739,8 +13747,8 @@ crbug.com/591099 fast/text/international/text-spliced-font.html [ Failure ] crbug.com/591099 fast/text/international/thai-cursor-position.html [ Crash Failure ] crbug.com/591099 fast/text/international/thai-offsetForPosition-inside-character.html [ Failure ] -crbug.com/591099 fast/text/international/unicode-bidi-isolate-nested-with-removes-not-adjacent.html [ Crash ] -crbug.com/591099 fast/text/international/unicode-bidi-isolate-nested-with-removes.html [ Crash ] +crbug.com/591099 fast/text/international/unicode-bidi-isolate-nested-with-removes-not-adjacent.html [ Crash Pass ] +crbug.com/591099 fast/text/international/unicode-bidi-isolate-nested-with-removes.html [ Crash Pass ] crbug.com/591099 fast/text/international/unicode-bidi-plaintext.html [ Failure ] crbug.com/591099 fast/text/international/vertical-text-glyph-test.html [ Failure ] crbug.com/591099 fast/text/international/vertical-text-metrics-test.html [ Crash Failure ] @@ -13820,16 +13828,16 @@ crbug.com/591099 fast/text/soft-hyphen-min-preferred-width.html [ Failure ] crbug.com/591099 fast/text/soft-hyphen-overflow.html [ Failure ] crbug.com/591099 fast/text/stale-TextLayout-from-first-line.html [ Failure ] -crbug.com/591099 fast/text/sub-pixel/text-scaling-ltr.html [ Crash ] +crbug.com/591099 fast/text/sub-pixel/text-scaling-ltr.html [ Crash Pass ] crbug.com/591099 fast/text/sub-pixel/text-scaling-pixel.html [ Failure Timeout ] -crbug.com/591099 fast/text/sub-pixel/text-scaling-rtl.html [ Crash Failure Timeout ] -crbug.com/591099 fast/text/sub-pixel/text-scaling-vertical.html [ Crash Failure Timeout ] -crbug.com/591099 fast/text/sub-pixel/text-scaling-webfont.html [ Crash Failure Timeout ] +crbug.com/591099 fast/text/sub-pixel/text-scaling-rtl.html [ Crash Failure Pass Timeout ] +crbug.com/591099 fast/text/sub-pixel/text-scaling-vertical.html [ Crash Failure Pass Timeout ] +crbug.com/591099 fast/text/sub-pixel/text-scaling-webfont.html [ Crash Failure Pass Timeout ] crbug.com/591099 fast/text/tab-min-size.html [ Failure ] crbug.com/591099 fast/text/text-between-two-brs-in-nowrap-overflow.html [ Failure ] crbug.com/591099 fast/text/text-combine-shrink-to-fit.html [ Failure ] crbug.com/591099 fast/text/text-container-bounding-rect.html [ Crash Failure ] -crbug.com/591099 fast/text/text-iterator-crash.html [ Crash ] +crbug.com/591099 fast/text/text-iterator-crash.html [ Crash Failure ] crbug.com/591099 fast/text/text-large-negative-letter-spacing-with-opacity.html [ Failure ] crbug.com/591099 fast/text/text-letter-spacing.html [ Failure ] crbug.com/591099 fast/text/text-shadow-no-default-color.html [ Failure ] @@ -13936,7 +13944,7 @@ crbug.com/591099 fast/url/standard-url.html [ Failure ] crbug.com/591099 fast/url/trivial-segments.html [ Failure ] crbug.com/591099 fast/url/trivial.html [ Failure ] -crbug.com/591099 fast/workers/close-context-messageport-crash.html [ Crash ] +crbug.com/591099 fast/workers/close-context-messageport-crash.html [ Crash Pass ] crbug.com/591099 fast/workers/constructor-proto.html [ Failure ] crbug.com/591099 fast/workers/dedicated-worker-lifecycle.html [ Failure ] crbug.com/591099 fast/workers/shared-worker-console-log.html [ Failure ] @@ -13946,7 +13954,7 @@ crbug.com/591099 fast/workers/shared-worker-exception.html [ Failure ] crbug.com/591099 fast/workers/shared-worker-gc.html [ Failure ] crbug.com/591099 fast/workers/shared-worker-in-iframe.html [ Failure ] -crbug.com/591099 fast/workers/shared-worker-lifecycle.html [ Crash ] +crbug.com/591099 fast/workers/shared-worker-lifecycle.html [ Crash Failure ] crbug.com/591099 fast/workers/shared-worker-load-error.html [ Failure ] crbug.com/591099 fast/workers/shared-worker-location.html [ Failure ] crbug.com/591099 fast/workers/shared-worker-messageevent-source.html [ Failure ] @@ -14046,7 +14054,7 @@ crbug.com/591099 fast/writing-mode/margin-collapse.html [ Failure ] crbug.com/591099 fast/writing-mode/margins.html [ Failure ] crbug.com/591099 fast/writing-mode/orthogonal-writing-modes-available-width-absolute-crash.html [ Failure ] -crbug.com/591099 fast/writing-mode/orthogonal-writing-modes-floats-crash-3.html [ Crash ] +crbug.com/591099 fast/writing-mode/orthogonal-writing-modes-floats-crash-3.html [ Crash Pass ] crbug.com/591099 fast/writing-mode/orthogonal-writing-modes-scrollbarpart-crash.html [ Failure ] crbug.com/591099 fast/writing-mode/percentage-height-orthogonal-writing-modes-quirks.html [ Failure ] crbug.com/591099 fast/writing-mode/percentage-height-orthogonal-writing-modes.html [ Failure ] @@ -14055,14 +14063,14 @@ crbug.com/591099 fast/writing-mode/table-hit-test.html [ Failure ] crbug.com/591099 fast/writing-mode/table-percent-width-quirk.html [ Crash Failure ] crbug.com/591099 fast/writing-mode/table-vertical-child-width.html [ Failure ] -crbug.com/591099 fast/writing-mode/text-combine-compress.html [ Crash ] +crbug.com/591099 fast/writing-mode/text-combine-compress.html [ Crash Failure ] crbug.com/591099 fast/writing-mode/text-combine-justify.html [ Failure ] crbug.com/591099 fast/writing-mode/text-combine-line-break.html [ Failure ] crbug.com/591099 fast/writing-mode/text-combine-various-fonts.html [ Failure ] crbug.com/591099 fast/writing-mode/text-orientation-basic.html [ Failure ] crbug.com/591099 fast/writing-mode/vertical-baseline-alignment.html [ Failure ] crbug.com/591099 fast/writing-mode/vertical-font-fallback.html [ Failure ] -crbug.com/591099 fast/writing-mode/vertical-inline-block-hittest.html [ Crash ] +crbug.com/591099 fast/writing-mode/vertical-inline-block-hittest.html [ Crash Failure ] crbug.com/591099 fast/writing-mode/vertical-lr-replaced-selection.html [ Failure ] crbug.com/591099 fast/writing-mode/vorg-glyph-zero-crash.html [ Failure ] crbug.com/591099 fast/xmlhttprequest/instanceof-XMLHttpRequest.html [ Failure ] @@ -14074,7 +14082,7 @@ crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-html-response-encoding.html [ Crash Failure ] crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-missing-file-exception.html [ Failure ] crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-nonexistent-file.html [ Failure ] -crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-open-after-iframe-onload-remove-self.html [ Crash ] +crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-open-after-iframe-onload-remove-self.html [ Crash Failure ] crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-open-exceptions.html [ Failure ] crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-recursive-sync-event.html [ Failure ] crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-responseXML-html-document-responsetype-quirks.html [ Failure ] @@ -14214,7 +14222,7 @@ crbug.com/591099 fragmentation/tbody-before-thead.html [ Failure ] crbug.com/591099 fragmentation/unbreakable-tall-float-before-block.html [ Failure ] crbug.com/591099 fragmentation/unbreakable-tall-float-before-line.html [ Failure Pass ] -crbug.com/591099 fullscreen/anonymous-block-merge-crash.html [ Crash ] +crbug.com/591099 fullscreen/anonymous-block-merge-crash.html [ Crash Pass ] crbug.com/591099 fullscreen/compositor-touch-hit-rects-fullscreen-video-controls.html [ Failure ] crbug.com/591099 fullscreen/exit-full-screen-iframe.html [ Crash Failure ] crbug.com/591099 fullscreen/full-screen-cancel-nested.html [ Crash Failure ] @@ -14223,7 +14231,7 @@ crbug.com/591099 fullscreen/full-screen-element-stack.html [ Failure ] crbug.com/591099 fullscreen/full-screen-frameset.html [ Failure ] crbug.com/591099 fullscreen/full-screen-iframe-allowed-nested.html [ Timeout ] -crbug.com/591099 fullscreen/full-screen-iframe-allowed.html [ Crash ] +crbug.com/591099 fullscreen/full-screen-iframe-allowed.html [ Crash Failure ] crbug.com/591099 fullscreen/full-screen-iframe-legacy.html [ Failure ] crbug.com/591099 fullscreen/full-screen-iframe-not-allowed.html [ Failure ] crbug.com/591099 fullscreen/full-screen-iframe-without-allow-attribute-allowed-from-parent.html [ Failure ] @@ -14231,8 +14239,8 @@ crbug.com/591099 fullscreen/full-screen-request-removed.html [ Failure ] crbug.com/591099 fullscreen/full-screen-table-section.html [ Failure ] crbug.com/591099 fullscreen/full-screen-with-css-reference-filter.html [ Failure ] -crbug.com/591099 fullscreen/full-screen-with-flex-item.html [ Crash ] -crbug.com/591099 fullscreen/model/fully-exit-fullscreen-nested-iframe.html [ Crash ] +crbug.com/591099 fullscreen/full-screen-with-flex-item.html [ Crash Failure ] +crbug.com/591099 fullscreen/model/fully-exit-fullscreen-nested-iframe.html [ Crash Pass ] crbug.com/591099 fullscreen/video-controls-override.html [ Failure ] crbug.com/591099 fullscreen/video-controls-timeline.html [ Failure ] crbug.com/591099 fullscreen/video-fail-to-enter-full-screen.html [ Failure ] @@ -14272,7 +14280,7 @@ crbug.com/591099 geolocation-api/reentrant-error.html [ Failure ] crbug.com/591099 geolocation-api/reentrant-permission-denied.html [ Failure ] crbug.com/591099 geolocation-api/reentrant-success.html [ Failure ] -crbug.com/591099 geolocation-api/remove-remote-context-in-error-callback-crash.html [ Crash ] +crbug.com/591099 geolocation-api/remove-remote-context-in-error-callback-crash.html [ Crash Failure ] crbug.com/591099 geolocation-api/success-clear-watch.html [ Failure ] crbug.com/591099 geolocation-api/success.html [ Failure ] crbug.com/591099 geolocation-api/timeout-clear-watch.html [ Failure ] @@ -14286,19 +14294,19 @@ crbug.com/591099 geolocation-api/watchPosition-unique.html [ Failure ] crbug.com/591099 geolocation-api/window-close-crash.html [ Failure ] crbug.com/591099 hittesting/border-hittest-inlineFlowBox.html [ Failure ] -crbug.com/591099 hittesting/border-hittest-with-image-fallback.html [ Crash ] +crbug.com/591099 hittesting/border-hittest-with-image-fallback.html [ Crash Failure ] crbug.com/591099 hittesting/border-hittest.html [ Failure ] crbug.com/591099 hittesting/border-radius-hittest.html [ Failure ] crbug.com/591099 hittesting/culled-inline-crash.html [ Failure ] crbug.com/591099 hittesting/culled-inline.html [ Failure ] -crbug.com/591099 hittesting/hittest-child-of-inlineblock.html [ Crash ] +crbug.com/591099 hittesting/hittest-child-of-inlineblock.html [ Crash Failure ] crbug.com/591099 hittesting/hittest-overlapping-floats.html [ Failure ] crbug.com/591099 hittesting/image-with-border-radius.html [ Failure ] crbug.com/591099 hittesting/image-with-clip-path.html [ Failure ] crbug.com/591099 hittesting/inline-with-clip-path.html [ Failure ] crbug.com/591099 hittesting/inner-border-radius-hittest.html [ Failure ] crbug.com/591099 hittesting/paint-containment-hittest.html [ Failure ] -crbug.com/591099 hittesting/subframe_active_crash.html [ Crash ] +crbug.com/591099 hittesting/subframe_active_crash.html [ Crash Pass ] crbug.com/591099 hittesting/text-overflow-inline-image.html [ Timeout ] crbug.com/591099 html/details_summary/details-add-child-1.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-add-child-2.html [ Crash Failure ] @@ -14326,7 +14334,7 @@ crbug.com/591099 html/details_summary/details-add-summary-9.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-add-summary-child-1.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-add-summary-child-2.html [ Crash Failure ] -crbug.com/591099 html/details_summary/details-click-controls.html [ Crash ] +crbug.com/591099 html/details_summary/details-click-controls.html [ Crash Pass ] crbug.com/591099 html/details_summary/details-clone.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-keyboard-show-hide.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-marker-style.html [ Crash Failure ] @@ -14338,7 +14346,7 @@ crbug.com/591099 html/details_summary/details-no-summary3.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-no-summary4.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-open-javascript.html [ Crash Failure ] -crbug.com/591099 html/details_summary/details-open-toggle-event.html [ Crash ] +crbug.com/591099 html/details_summary/details-open-toggle-event.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-open1.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-open2.html [ Crash Failure ] crbug.com/591099 html/details_summary/details-open3.html [ Crash Failure ] @@ -14372,8 +14380,8 @@ crbug.com/591099 html/details_summary/summary-display-inline-flex.html [ Failure ] crbug.com/591099 html/dialog/abspos-dialog-layout.html [ Failure ] crbug.com/591099 html/dialog/closed-dialog-does-not-block-mouse-events.html [ Failure ] -crbug.com/591099 html/dialog/dialog-autofocus-multiple-times.html [ Crash ] -crbug.com/591099 html/dialog/dialog-autofocus.html [ Crash ] +crbug.com/591099 html/dialog/dialog-autofocus-multiple-times.html [ Crash Failure ] +crbug.com/591099 html/dialog/dialog-autofocus.html [ Crash Failure ] crbug.com/591099 html/dialog/dialog-canceling.html [ Failure ] crbug.com/591099 html/dialog/dialog-close-event.html [ Failure ] crbug.com/591099 html/dialog/dialog-enabled.html [ Failure ] @@ -14381,9 +14389,9 @@ crbug.com/591099 html/dialog/dialog-return-value.html [ Failure ] crbug.com/591099 html/dialog/dialog-show-modal.html [ Failure ] crbug.com/591099 html/dialog/fixpos-dialog-layout.html [ Failure ] -crbug.com/591099 html/dialog/form-method-dialog.html [ Crash ] +crbug.com/591099 html/dialog/form-method-dialog.html [ Crash Failure ] crbug.com/591099 html/dialog/inert-does-not-match-disabled-selector.html [ Failure ] -crbug.com/591099 html/dialog/inert-focus-in-frames.html [ Crash ] +crbug.com/591099 html/dialog/inert-focus-in-frames.html [ Crash Failure ] crbug.com/591099 html/dialog/inert-inlines.html [ Failure ] crbug.com/591099 html/dialog/inert-label-focus.html [ Failure ] crbug.com/591099 html/dialog/inert-node-is-uneditable.html [ Crash Failure ] @@ -14398,15 +14406,15 @@ crbug.com/591099 html/dialog/non-modal-dialog-does-not-block-mouse-events.html [ Failure ] crbug.com/591099 html/dialog/non-modal-dialog-layout.html [ Failure ] crbug.com/591099 html/dialog/scrollable-after-close.html [ Failure ] -crbug.com/591099 html/dialog/shadowdom-in-dialog.html [ Crash ] -crbug.com/591099 html/dialog/show-modal-focusing-steps.html [ Crash ] +crbug.com/591099 html/dialog/shadowdom-in-dialog.html [ Crash Pass ] +crbug.com/591099 html/dialog/show-modal-focusing-steps.html [ Crash Failure ] crbug.com/591099 html/dialog/simulated-click-inert.html [ Failure ] -crbug.com/591099 html/dialog/submit-dialog-close-event.html [ Crash ] +crbug.com/591099 html/dialog/submit-dialog-close-event.html [ Crash Failure ] crbug.com/591099 html/dialog/synthetic-click-inert.html [ Failure ] crbug.com/591099 html/dialog/top-layer-position-relative.html [ Failure ] crbug.com/591099 html/dialog/top-layer-position-static.html [ Failure ] crbug.com/591099 html/document_metadata/base-multiple.html [ Failure ] -crbug.com/591099 html/document_metadata/head-check.html [ Crash ] +crbug.com/591099 html/document_metadata/head-check.html [ Crash Failure ] crbug.com/591099 html/document_metadata/head-has-text-1.html [ Failure ] crbug.com/591099 html/document_metadata/head-has-text-2.html [ Failure ] crbug.com/591099 html/document_metadata/head-has-text-3.html [ Failure ] @@ -14423,7 +14431,7 @@ crbug.com/591099 html/marquee/marquee-element.html [ Crash Failure ] crbug.com/591099 html/marquee/marquee-scroll.html [ Crash Failure ] crbug.com/591099 html/marquee/marquee-scrollamount.html [ Crash Failure ] -crbug.com/591099 html/marquee/marquee-shadow-root-no-access.html [ Crash ] +crbug.com/591099 html/marquee/marquee-shadow-root-no-access.html [ Crash Pass ] crbug.com/591099 html/sections/article-element.html [ Failure ] crbug.com/591099 html/sections/aside-element.html [ Failure ] crbug.com/591099 html/sections/body-quirk-client-size.html [ Failure ] @@ -14476,9 +14484,9 @@ crbug.com/591099 http/tests/appcache/access-via-redirect.php [ Failure ] crbug.com/591099 http/tests/appcache/credential-url.html [ Failure Timeout ] crbug.com/591099 http/tests/appcache/cyrillic-uri.html [ Crash Failure ] -crbug.com/591099 http/tests/appcache/deferred-events-delete-while-raising-timer.html [ Crash ] -crbug.com/591099 http/tests/appcache/deferred-events-delete-while-raising.html [ Crash ] -crbug.com/591099 http/tests/appcache/destroyed-frame.html [ Crash ] +crbug.com/591099 http/tests/appcache/deferred-events-delete-while-raising-timer.html [ Crash Failure ] +crbug.com/591099 http/tests/appcache/deferred-events-delete-while-raising.html [ Crash Failure ] +crbug.com/591099 http/tests/appcache/destroyed-frame.html [ Crash Failure ] crbug.com/591099 http/tests/appcache/detached-iframe.html [ Crash Failure ] crbug.com/591099 http/tests/appcache/different-https-origin-resource-main.html [ Failure ] crbug.com/591099 http/tests/appcache/different-origin-manifest.html [ Failure ] @@ -14509,7 +14517,7 @@ crbug.com/591099 http/tests/appcache/top-frame-3.html [ Failure ] crbug.com/591099 http/tests/appcache/top-frame-4.html [ Failure ] crbug.com/591099 http/tests/appcache/update-cache.html [ Failure ] -crbug.com/591099 http/tests/appcache/video.html [ Crash ] +crbug.com/591099 http/tests/appcache/video.html [ Crash Pass ] crbug.com/591099 http/tests/appcache/whitelist-wildcard.html [ Failure ] crbug.com/591099 http/tests/appcache/wrong-content-type.html [ Failure ] crbug.com/591099 http/tests/appcache/wrong-signature-2.html [ Failure ] @@ -14519,7 +14527,7 @@ crbug.com/591099 http/tests/cache/history-only-cached-subresource-loads-max-age-https.html [ Failure ] crbug.com/591099 http/tests/cache/history-only-cached-subresource-loads.html [ Failure ] crbug.com/591099 http/tests/cache/network-error-during-revalidation.html [ Failure ] -crbug.com/591099 http/tests/cache/subresource-fragment-identifier.html [ Crash ] +crbug.com/591099 http/tests/cache/subresource-fragment-identifier.html [ Crash Failure ] crbug.com/591099 http/tests/cache/subresource-multiple-instances.html [ Failure ] crbug.com/591099 http/tests/cache/subresource-revalidation-referrer.html [ Failure ] crbug.com/591099 http/tests/cache/x-frame-options-304.html [ Failure ] @@ -14537,13 +14545,13 @@ crbug.com/591099 http/tests/cookies/simple-cookies-expired.html [ Failure ] crbug.com/591099 http/tests/cookies/simple-cookies-max-age.html [ Failure ] crbug.com/591099 http/tests/cookies/single-quoted-value.html [ Failure ] -crbug.com/591099 http/tests/credentialmanager/credentialscontainer-frame-errors.html [ Crash ] +crbug.com/591099 http/tests/credentialmanager/credentialscontainer-frame-errors.html [ Crash Pass ] crbug.com/591099 http/tests/css/border-image-loading.html [ Failure ] crbug.com/591099 http/tests/css/css-image-loading.html [ Crash Failure ] crbug.com/591099 http/tests/css/css-image-valued-shape.html [ Failure ] crbug.com/591099 http/tests/css/css-non-blocking.html [ Failure ] crbug.com/591099 http/tests/css/font-face-src-loading.html [ Failure ] -crbug.com/591099 http/tests/css/image-value-cached.html [ Crash ] +crbug.com/591099 http/tests/css/image-value-cached.html [ Crash Pass ] crbug.com/591099 http/tests/css/mask-image-loading.html [ Failure ] crbug.com/591099 http/tests/css/pending-stylesheet-offset-width.html [ Failure ] crbug.com/591099 http/tests/css/performance-info-with-cached-sheet.html [ Failure ] @@ -14555,8 +14563,8 @@ crbug.com/591099 http/tests/csspaint/invalidation-background-image.html [ Timeout ] crbug.com/591099 http/tests/csspaint/invalidation-border-image.html [ Timeout ] crbug.com/591099 http/tests/csspaint/invalidation-content-image.html [ Timeout ] -crbug.com/591099 http/tests/dom/EventListener-incumbent-global-1.html [ Crash ] -crbug.com/591099 http/tests/dom/EventListener-incumbent-global-2.html [ Crash ] +crbug.com/591099 http/tests/dom/EventListener-incumbent-global-1.html [ Crash Pass ] +crbug.com/591099 http/tests/dom/EventListener-incumbent-global-2.html [ Crash Pass ] crbug.com/591099 http/tests/dom/create-contextual-fragment-from-bodyless-svg-document-range.html [ Failure ] crbug.com/591099 http/tests/dom/create-contextual-fragment-from-svg-document-range.html [ Failure ] crbug.com/591099 http/tests/dom/location-stringify.html [ Crash Failure ] @@ -14581,8 +14589,8 @@ crbug.com/591099 http/tests/eventsource/eventsource-retry-precision.html [ Failure ] crbug.com/591099 http/tests/eventsource/eventsource-status-code-states.html [ Failure ] crbug.com/591099 http/tests/eventsource/eventsource-url-attribute.html [ Failure ] -crbug.com/591099 http/tests/eventsource/existent-eventsource-status-error-iframe-crash.html [ Crash ] -crbug.com/591099 http/tests/eventsource/non-existent-eventsource-status-error-iframe-crash.html [ Crash ] +crbug.com/591099 http/tests/eventsource/existent-eventsource-status-error-iframe-crash.html [ Crash Pass ] +crbug.com/591099 http/tests/eventsource/non-existent-eventsource-status-error-iframe-crash.html [ Crash Pass ] crbug.com/591099 http/tests/eventsource/workers/eventsource-bad-mime-type.html [ Failure ] crbug.com/591099 http/tests/eventsource/workers/eventsource-content-type-charset.html [ Failure ] crbug.com/591099 http/tests/eventsource/workers/eventsource-cors-basic.html [ Failure ] @@ -14605,16 +14613,16 @@ crbug.com/591099 http/tests/feature-policy-experimental-features/vibrate-disabled.php [ Timeout ] crbug.com/591099 http/tests/feature-policy-experimental-features/vibrate-enabledforall.php [ Timeout ] crbug.com/591099 http/tests/feature-policy-experimental-features/vibrate-enabledforself.php [ Timeout ] -crbug.com/591099 http/tests/feature-policy/fullscreen-allowed-by-container-policy-relocate.html [ Crash ] -crbug.com/591099 http/tests/feature-policy/fullscreen-allowed-by-container-policy.html [ Crash ] -crbug.com/591099 http/tests/feature-policy/fullscreen-disabled.php [ Crash ] -crbug.com/591099 http/tests/feature-policy/fullscreen-enabledforall.php [ Crash ] -crbug.com/591099 http/tests/feature-policy/fullscreen-enabledforself.php [ Crash ] -crbug.com/591099 http/tests/feature-policy/payment-allowed-by-container-policy-relocate.html [ Crash ] -crbug.com/591099 http/tests/feature-policy/payment-allowed-by-container-policy.html [ Crash ] -crbug.com/591099 http/tests/feature-policy/payment-disabled.php [ Crash ] -crbug.com/591099 http/tests/feature-policy/payment-enabledforall.php [ Crash ] -crbug.com/591099 http/tests/feature-policy/payment-enabledforself.php [ Crash ] +crbug.com/591099 http/tests/feature-policy/fullscreen-allowed-by-container-policy-relocate.html [ Crash Pass ] +crbug.com/591099 http/tests/feature-policy/fullscreen-allowed-by-container-policy.html [ Crash Pass ] +crbug.com/591099 http/tests/feature-policy/fullscreen-disabled.php [ Crash Pass ] +crbug.com/591099 http/tests/feature-policy/fullscreen-enabledforall.php [ Crash Pass ] +crbug.com/591099 http/tests/feature-policy/fullscreen-enabledforself.php [ Crash Pass ] +crbug.com/591099 http/tests/feature-policy/payment-allowed-by-container-policy-relocate.html [ Crash Pass ] +crbug.com/591099 http/tests/feature-policy/payment-allowed-by-container-policy.html [ Crash Pass ] +crbug.com/591099 http/tests/feature-policy/payment-disabled.php [ Crash Failure ] +crbug.com/591099 http/tests/feature-policy/payment-enabledforall.php [ Crash Failure ] +crbug.com/591099 http/tests/feature-policy/payment-enabledforself.php [ Crash Pass ] crbug.com/591099 http/tests/fetch/chromium/discarded-window.html [ Crash Pass ] crbug.com/591099 http/tests/fetch/window/pageimportancesignals.html [ Failure ] crbug.com/591099 http/tests/fileapi/blob-url-in-subframe.html [ Failure ] @@ -14659,13 +14667,13 @@ crbug.com/591099 http/tests/htmlimports/encoding.html [ Failure ] crbug.com/591099 http/tests/htmlimports/import-script-block-crossorigin-dynamic.html [ Failure ] crbug.com/591099 http/tests/images/drag-image-to-desktop.html [ Timeout ] -crbug.com/591099 http/tests/images/force-reload-image-document.html [ Crash ] -crbug.com/591099 http/tests/images/force-reload.html [ Crash ] -crbug.com/591099 http/tests/images/image-currentsrc-broken.html [ Crash ] -crbug.com/591099 http/tests/images/image-currentsrc-error.html [ Crash ] -crbug.com/591099 http/tests/images/image-currentsrc-invalid.html [ Crash ] -crbug.com/591099 http/tests/images/image-error-event-not-firing.html [ Crash ] -crbug.com/591099 http/tests/images/image-with-dpr-natural-dimensions.html [ Crash ] +crbug.com/591099 http/tests/images/force-reload-image-document.html [ Crash Pass ] +crbug.com/591099 http/tests/images/force-reload.html [ Crash Pass ] +crbug.com/591099 http/tests/images/image-currentsrc-broken.html [ Crash Pass ] +crbug.com/591099 http/tests/images/image-currentsrc-error.html [ Crash Pass ] +crbug.com/591099 http/tests/images/image-currentsrc-invalid.html [ Crash Pass ] +crbug.com/591099 http/tests/images/image-error-event-not-firing.html [ Crash Pass ] +crbug.com/591099 http/tests/images/image-with-dpr-natural-dimensions.html [ Crash Pass ] crbug.com/591099 http/tests/images/image-with-origin-header.html [ Failure ] crbug.com/591099 http/tests/images/png-partial-load-as-document.html [ Failure Pass ] crbug.com/591099 http/tests/images/restyle-decode-error.html [ Failure Pass ] @@ -14687,11 +14695,11 @@ crbug.com/591099 http/tests/inspector-enabled/dom-storage-open.html [ Failure ] crbug.com/591099 http/tests/inspector-enabled/dynamic-scripts.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector-enabled/injected-script-discard.html [ Failure ] -crbug.com/591099 http/tests/inspector-enabled/reattach-after-editing-styles.html [ Crash ] +crbug.com/591099 http/tests/inspector-enabled/reattach-after-editing-styles.html [ Crash Failure ] crbug.com/591099 http/tests/inspector-enabled/resource-tree/main-resource-content.html [ Failure ] crbug.com/591099 http/tests/inspector-enabled/resource-tree/resource-tree-mimetype.html [ Failure ] -crbug.com/591099 http/tests/inspector-enabled/shadow-dom-rules-restart.html [ Crash ] -crbug.com/591099 http/tests/inspector-enabled/shadow-dom-rules.html [ Crash ] +crbug.com/591099 http/tests/inspector-enabled/shadow-dom-rules-restart.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector-enabled/shadow-dom-rules.html [ Crash Failure ] crbug.com/591099 http/tests/inspector-protocol/access-inspected-object.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector-protocol/cookies-protocol-test.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector-protocol/network-data-length.html [ Failure Timeout ] @@ -14720,7 +14728,7 @@ crbug.com/591099 http/tests/inspector-protocol/websocket/websocket-user-agent-override.html [ Failure ] crbug.com/591099 http/tests/inspector-unit/viewport-datagrid-items-attached-to-dom.js [ Failure ] crbug.com/591099 http/tests/inspector-unit/viewport-datagrid-items-expandable-attached-to-dom.js [ Failure ] -crbug.com/591099 http/tests/inspector/appcache/appcache-iframe-manifests.html [ Crash Timeout ] +crbug.com/591099 http/tests/inspector/appcache/appcache-iframe-manifests.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/appcache/appcache-manifest-with-non-existing-file.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/appcache/appcache-swap.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/application-panel/resources-panel-on-navigation.html [ Failure Timeout ] @@ -14730,27 +14738,27 @@ crbug.com/591099 http/tests/inspector/bindings/bindings-frame-attach-detach.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/bindings-frame-navigate.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/bindings-main-frame-navigated.html [ Failure ] -crbug.com/591099 http/tests/inspector/bindings/bindings-multiple-frames.html [ Crash ] -crbug.com/591099 http/tests/inspector/bindings/contentscripts-bindings-multiple-frames.html [ Crash ] -crbug.com/591099 http/tests/inspector/bindings/contentscripts-navigator-multiple-frames.html [ Crash ] +crbug.com/591099 http/tests/inspector/bindings/bindings-multiple-frames.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/bindings/contentscripts-bindings-multiple-frames.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/bindings/contentscripts-navigator-multiple-frames.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/dynamic-bindings-frame-attach-detach.html [ Failure ] crbug.com/591099 http/tests/inspector/bindings/dynamic-navigator-frame-attach-detach.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/livelocation-main-frame-navigated.html [ Failure ] crbug.com/591099 http/tests/inspector/bindings/navigator-frame-attach-detach.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/navigator-frame-navigate.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/navigator-main-frame-navigated.html [ Failure Timeout ] -crbug.com/591099 http/tests/inspector/bindings/navigator-multiple-frames.html [ Crash Timeout ] +crbug.com/591099 http/tests/inspector/bindings/navigator-multiple-frames.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/shadowdom-bindings.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/bindings/shadowdom-navigator.html [ Failure Timeout ] -crbug.com/591099 http/tests/inspector/bindings/sourcemap-bindings-multiple-frames.html [ Crash Timeout ] -crbug.com/591099 http/tests/inspector/bindings/sourcemap-navigator-multiple-frames.html [ Crash Timeout ] -crbug.com/591099 http/tests/inspector/bindings/suspendtarget-bindings.html [ Crash Timeout ] -crbug.com/591099 http/tests/inspector/bindings/suspendtarget-navigator.html [ Crash ] +crbug.com/591099 http/tests/inspector/bindings/sourcemap-bindings-multiple-frames.html [ Crash Failure Timeout ] +crbug.com/591099 http/tests/inspector/bindings/sourcemap-navigator-multiple-frames.html [ Crash Failure Timeout ] +crbug.com/591099 http/tests/inspector/bindings/suspendtarget-bindings.html [ Crash Failure Timeout ] +crbug.com/591099 http/tests/inspector/bindings/suspendtarget-navigator.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/cache-storage/cache-data.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/cache-storage/cache-deletion.html [ Failure ] crbug.com/591099 http/tests/inspector/cache-storage/cache-entry-deletion.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/cache-storage/cache-names.html [ Failure ] -crbug.com/591099 http/tests/inspector/change-iframe-src.html [ Crash ] +crbug.com/591099 http/tests/inspector/change-iframe-src.html [ Crash Pass ] crbug.com/591099 http/tests/inspector/command-line-api-inspect.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/compiler-script-mapping.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/compiler-source-mapping-debug.html [ Crash Failure ] @@ -14766,52 +14774,52 @@ crbug.com/591099 http/tests/inspector/console/console-links-on-messages-before-inspection.html [ Failure ] crbug.com/591099 http/tests/inspector/console/console-on-paint-worklet.html [ Failure ] crbug.com/591099 http/tests/inspector/debugger/fetch-breakpoints.html [ Crash Failure Timeout ] -crbug.com/591099 http/tests/inspector/elements/elements-linkify-attributes.html [ Crash ] -crbug.com/591099 http/tests/inspector/elements/event-listeners-framework-with-service-worker.html [ Crash ] -crbug.com/591099 http/tests/inspector/elements/html-link-import.html [ Crash ] -crbug.com/591099 http/tests/inspector/elements/styles/edit-css-with-source-url.html [ Crash ] -crbug.com/591099 http/tests/inspector/elements/styles/import-added-through-js-crash.html [ Crash ] +crbug.com/591099 http/tests/inspector/elements/elements-linkify-attributes.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/elements/event-listeners-framework-with-service-worker.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/elements/html-link-import.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/elements/styles/edit-css-with-source-url.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/elements/styles/import-added-through-js-crash.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/elements/styles/inline-stylesheet-sourceurl-and-sourcemapurl.html [ Crash Failure ] -crbug.com/591099 http/tests/inspector/elements/styles/selector-line-deprecated.html [ Crash ] +crbug.com/591099 http/tests/inspector/elements/styles/selector-line-deprecated.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/elements/styles/selector-line-sourcemap-header-deprecated.html [ Crash Failure ] -crbug.com/591099 http/tests/inspector/elements/styles/selector-line-sourcemap-header.html [ Crash ] -crbug.com/591099 http/tests/inspector/elements/styles/selector-line.html [ Crash ] +crbug.com/591099 http/tests/inspector/elements/styles/selector-line-sourcemap-header.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/elements/styles/selector-line.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/elements/styles/styles-do-not-add-inline-stylesheets-in-navigator.html [ Failure Timeout ] -crbug.com/591099 http/tests/inspector/elements/styles/styles-redirected-css.html [ Crash ] +crbug.com/591099 http/tests/inspector/elements/styles/styles-redirected-css.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/elements/styles/stylesheet-tracking.html [ Crash Failure Timeout ] -crbug.com/591099 http/tests/inspector/elements/styles/xsl-transformed.xml [ Crash ] +crbug.com/591099 http/tests/inspector/elements/styles/xsl-transformed.xml [ Crash Failure ] crbug.com/591099 http/tests/inspector/extensions-headers.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/extensions-iframe-eval.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/extensions-ignore-cache.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/extensions-network-redirect.html [ Crash Failure ] -crbug.com/591099 http/tests/inspector/extensions-useragent.html [ Crash ] +crbug.com/591099 http/tests/inspector/extensions-useragent.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/extensions/extensions-api.html [ Failure ] crbug.com/591099 http/tests/inspector/extensions/extensions-audits-api.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/extensions/extensions-audits-content-script.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/extensions/extensions-audits.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/extensions/extensions-eval-content-script.html [ Failure ] crbug.com/591099 http/tests/inspector/extensions/extensions-eval.html [ Crash Failure ] -crbug.com/591099 http/tests/inspector/extensions/extensions-events.html [ Crash ] +crbug.com/591099 http/tests/inspector/extensions/extensions-events.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/extensions/extensions-network.html [ Crash Failure ] -crbug.com/591099 http/tests/inspector/extensions/extensions-panel.html [ Crash ] +crbug.com/591099 http/tests/inspector/extensions/extensions-panel.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/extensions/extensions-reload.html [ Failure ] crbug.com/591099 http/tests/inspector/extensions/extensions-resources.html [ Crash Failure ] -crbug.com/591099 http/tests/inspector/extensions/extensions-sidebar.html [ Crash ] -crbug.com/591099 http/tests/inspector/extensions/extensions-timeline-api.html [ Crash ] +crbug.com/591099 http/tests/inspector/extensions/extensions-sidebar.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/extensions/extensions-timeline-api.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/extensions/multiple-extensions.html [ Failure ] -crbug.com/591099 http/tests/inspector/forced-layout-in-microtask.html [ Crash ] +crbug.com/591099 http/tests/inspector/forced-layout-in-microtask.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/fragment.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/indexeddb/database-data.html [ Failure ] crbug.com/591099 http/tests/inspector/indexeddb/database-names.html [ Failure ] -crbug.com/591099 http/tests/inspector/indexeddb/database-refresh-view.html [ Crash ] +crbug.com/591099 http/tests/inspector/indexeddb/database-refresh-view.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/indexeddb/database-structure.html [ Failure ] crbug.com/591099 http/tests/inspector/indexeddb/resources-panel.html [ Failure ] crbug.com/591099 http/tests/inspector/indexeddb/transaction-promise-console.html [ Failure ] crbug.com/591099 http/tests/inspector/indexeddb/upgrade-events.html [ Failure ] crbug.com/591099 http/tests/inspector/inline-source-map-loading.html [ Crash Failure ] -crbug.com/591099 http/tests/inspector/inspect-element.html [ Crash ] -crbug.com/591099 http/tests/inspector/inspect-iframe-from-different-domain.html [ Crash ] -crbug.com/591099 http/tests/inspector/modify-cross-domain-rule.html [ Crash ] +crbug.com/591099 http/tests/inspector/inspect-element.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/inspect-iframe-from-different-domain.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/modify-cross-domain-rule.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/network-preflight-options.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/network/async-xhr-json-mime-type.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/inspector/network/cached-resource-destroyed-moved-to-storage.html [ Crash Failure ] @@ -14865,7 +14873,7 @@ crbug.com/591099 http/tests/inspector/network/network-xsl-content.html [ Failure ] crbug.com/591099 http/tests/inspector/network/ping-response.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/network/ping.html [ Failure ] -crbug.com/591099 http/tests/inspector/network/preview-searchable.html [ Crash ] +crbug.com/591099 http/tests/inspector/network/preview-searchable.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/network/request-name-path.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/network/request-parameters-decoding.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/network/resource-priority.html [ Crash Failure ] @@ -14924,10 +14932,10 @@ crbug.com/591099 http/tests/inspector/search/search-in-resource.html [ Failure ] crbug.com/591099 http/tests/inspector/search/search-in-script.html [ Failure ] crbug.com/591099 http/tests/inspector/search/search-in-static.html [ Failure ] -crbug.com/591099 http/tests/inspector/search/source-frame-replace-1.html [ Crash ] -crbug.com/591099 http/tests/inspector/search/source-frame-replace-2.html [ Crash ] -crbug.com/591099 http/tests/inspector/search/source-frame-replace-3.html [ Crash ] -crbug.com/591099 http/tests/inspector/search/source-frame-replace-4.html [ Crash ] +crbug.com/591099 http/tests/inspector/search/source-frame-replace-1.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/search/source-frame-replace-2.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/search/source-frame-replace-3.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/search/source-frame-replace-4.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/search/source-frame-search.html [ Failure ] crbug.com/591099 http/tests/inspector/search/sources-search-scope-in-files.html [ Failure ] crbug.com/591099 http/tests/inspector/search/sources-search-scope-many-projects.html [ Failure ] @@ -14960,19 +14968,19 @@ crbug.com/591099 http/tests/inspector/service-workers/service-workers-bypass-for-network-redirect.html [ Failure ] crbug.com/591099 http/tests/inspector/service-workers/service-workers-force-update-on-page-load.html [ Failure ] crbug.com/591099 http/tests/inspector/service-workers/service-workers-navigation-preload.html [ Failure ] -crbug.com/591099 http/tests/inspector/service-workers/service-workers-redundant.html [ Crash ] -crbug.com/591099 http/tests/inspector/service-workers/service-workers-view.html [ Crash ] +crbug.com/591099 http/tests/inspector/service-workers/service-workers-redundant.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/service-workers/service-workers-view.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/service-workers/user-agent-override.html [ Failure Timeout ] crbug.com/591099 http/tests/inspector/sources/css-sourcemaps-toggle-enabled.html [ Failure ] crbug.com/591099 http/tests/inspector/sources/debugger/async-callstack-fetch.html [ Failure ] crbug.com/591099 http/tests/inspector/sources/debugger/async-callstack-network-initiator-image.html [ Failure ] crbug.com/591099 http/tests/inspector/sources/debugger/async-callstack-network-initiator.html [ Failure Timeout ] -crbug.com/591099 http/tests/inspector/sources/debugger/pause-in-removed-frame.html [ Crash ] +crbug.com/591099 http/tests/inspector/sources/debugger/pause-in-removed-frame.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/sources/debugger/source-map-http-header.html [ Failure ] crbug.com/591099 http/tests/inspector/sources/debugger/worker-debugging-script-mapping.html [ Failure ] crbug.com/591099 http/tests/inspector/sources/debugger/worker-debugging.html [ Failure ] crbug.com/591099 http/tests/inspector/sources/event-listener-breakpoints-script-fst-stmt-for-module.html [ Failure Timeout ] -crbug.com/591099 http/tests/inspector/sources/inline-module-export-error.html [ Crash ] +crbug.com/591099 http/tests/inspector/sources/inline-module-export-error.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/sources/js-sourcemaps-toggle-enabled.html [ Failure ] crbug.com/591099 http/tests/inspector/sources/navigator-view-content-scripts.html [ Failure ] crbug.com/591099 http/tests/inspector/sources/ui-source-code-highlight.php [ Failure ] @@ -14983,28 +14991,28 @@ crbug.com/591099 http/tests/inspector/stylesheet-source-mapping.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/template-content-inspect-crash.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/text-source-map.html [ Crash Failure ] -crbug.com/591099 http/tests/inspector/tracing/timeline-network-received-data.html [ Crash ] -crbug.com/591099 http/tests/inspector/tracing/timeline-receive-response-event.html [ Crash ] -crbug.com/591099 http/tests/inspector/tracing/timeline-script-parse.html [ Crash ] -crbug.com/591099 http/tests/inspector/tracing/timeline-xhr-event.html [ Crash ] -crbug.com/591099 http/tests/inspector/tracing/timeline-xhr-response-type-blob-event.html [ Crash Timeout ] -crbug.com/591099 http/tests/inspector/tracing/websocket/timeline-websocket-event.html [ Crash ] +crbug.com/591099 http/tests/inspector/tracing/timeline-network-received-data.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/tracing/timeline-receive-response-event.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/tracing/timeline-script-parse.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/tracing/timeline-xhr-event.html [ Crash Failure ] +crbug.com/591099 http/tests/inspector/tracing/timeline-xhr-response-type-blob-event.html [ Crash Failure Timeout ] +crbug.com/591099 http/tests/inspector/tracing/websocket/timeline-websocket-event.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/websocket/network-preserve-selection-on-frame-receive.html [ Failure ] crbug.com/591099 http/tests/inspector/websocket/websocket-frame-error.html [ Failure ] crbug.com/591099 http/tests/inspector/websocket/websocket-frame.html [ Crash Failure ] crbug.com/591099 http/tests/inspector/websocket/websocket-handshake.html [ Failure ] crbug.com/591099 http/tests/inspector/workers-on-navigation.html [ Failure ] -crbug.com/591099 http/tests/intersection-observer/cross-origin-iframe-with-nesting.html [ Crash ] -crbug.com/591099 http/tests/intersection-observer/root-bounds.html [ Crash ] -crbug.com/591099 http/tests/linkHeader/link-preload-in-iframe.html [ Crash ] -crbug.com/591099 http/tests/loading/empty-content-disposition-type.html [ Crash ] +crbug.com/591099 http/tests/intersection-observer/cross-origin-iframe-with-nesting.html [ Crash Pass ] +crbug.com/591099 http/tests/intersection-observer/root-bounds.html [ Crash Pass ] +crbug.com/591099 http/tests/linkHeader/link-preload-in-iframe.html [ Crash Pass ] +crbug.com/591099 http/tests/loading/empty-content-disposition-type.html [ Crash Pass ] crbug.com/591099 http/tests/loading/fire-error-event-empty-404-script.html [ Failure ] crbug.com/591099 http/tests/loading/fire-error-event-script-no-content-type.html [ Failure ] -crbug.com/591099 http/tests/loading/image-picture-download-after-shrink.html [ Crash ] -crbug.com/591099 http/tests/loading/image-picture-no-download-after-picture-removal.html [ Crash ] -crbug.com/591099 http/tests/loading/image-picture-no-download-after-removal.html [ Crash ] -crbug.com/591099 http/tests/loading/image-picture-no-download-after-source-removal.html [ Crash ] -crbug.com/591099 http/tests/loading/nested_bad_objects.php [ Crash ] +crbug.com/591099 http/tests/loading/image-picture-download-after-shrink.html [ Crash Pass ] +crbug.com/591099 http/tests/loading/image-picture-no-download-after-picture-removal.html [ Crash Pass ] +crbug.com/591099 http/tests/loading/image-picture-no-download-after-removal.html [ Crash Pass ] +crbug.com/591099 http/tests/loading/image-picture-no-download-after-source-removal.html [ Crash Pass ] +crbug.com/591099 http/tests/loading/nested_bad_objects.php [ Crash Pass ] crbug.com/591099 http/tests/loading/preload-css-test.html [ Failure ] crbug.com/591099 http/tests/loading/preload-img-test.html [ Crash Failure ] crbug.com/591099 http/tests/loading/preload-picture-invalid.html [ Crash Failure ] @@ -15023,109 +15031,109 @@ crbug.com/591099 http/tests/local/fileapi/send-sliced-dragged-file.html [ Crash Failure ] crbug.com/591099 http/tests/local/formdata/send-form-data-with-bad-string.html [ Failure ] crbug.com/591099 http/tests/local/formdata/send-form-data-with-empty-blob-filename.html [ Failure ] -crbug.com/591099 http/tests/local/formdata/send-form-data-with-empty-file-filename.html [ Crash ] +crbug.com/591099 http/tests/local/formdata/send-form-data-with-empty-file-filename.html [ Crash Failure ] crbug.com/591099 http/tests/local/formdata/send-form-data-with-empty-name.html [ Failure ] -crbug.com/591099 http/tests/local/formdata/send-form-data-with-filename.html [ Crash Timeout ] +crbug.com/591099 http/tests/local/formdata/send-form-data-with-filename.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/local/formdata/send-form-data-with-null-string.html [ Failure ] -crbug.com/591099 http/tests/local/formdata/send-form-data-with-sliced-file.html [ Crash ] +crbug.com/591099 http/tests/local/formdata/send-form-data-with-sliced-file.html [ Crash Failure ] crbug.com/591099 http/tests/local/formdata/send-form-data-with-string-containing-null.html [ Failure ] crbug.com/591099 http/tests/local/formdata/send-form-data.html [ Crash Failure ] -crbug.com/591099 http/tests/local/formdata/upload-events.html [ Crash ] +crbug.com/591099 http/tests/local/formdata/upload-events.html [ Crash Failure ] crbug.com/591099 http/tests/local/link-stylesheet-preferred.html [ Failure ] -crbug.com/591099 http/tests/local/serviceworker/fetch-request-body-file.html [ Crash ] +crbug.com/591099 http/tests/local/serviceworker/fetch-request-body-file.html [ Crash Pass ] crbug.com/591099 http/tests/local/stylesheet-and-script-load-order-http.html [ Failure ] crbug.com/591099 http/tests/local/stylesheet-and-script-load-order-media-print.html [ Failure ] crbug.com/591099 http/tests/local/stylesheet-and-script-load-order.html [ Failure ] -crbug.com/591099 http/tests/media/autoplay-crossorigin.html [ Crash ] -crbug.com/591099 http/tests/media/controls/controls-list-add-hide.html [ Crash ] -crbug.com/591099 http/tests/media/controls/controls-list-remove-show.html [ Crash ] -crbug.com/591099 http/tests/media/controls/video-controls-overflow-menu-correct-ordering.html [ Crash ] -crbug.com/591099 http/tests/media/controls/video-controls-overflow-menu-updates-appropriately.html [ Crash ] -crbug.com/591099 http/tests/media/encrypted-media/encrypted-media-encrypted-event-different-origin.html [ Crash ] -crbug.com/591099 http/tests/media/encrypted-media/encrypted-media-encrypted-event-same-origin.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-addsourcebuffer.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-append-buffer.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-appendwindow.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-avtracks.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-buffered.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-closed.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-a-bitrate.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-av-audio-bitrate.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-av-framesize.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-av-video-bitrate.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-v-bitrate.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-v-framerate.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-v-framesize.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-a-bitrate.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-av-audio-bitrate.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-av-framesize.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-av-video-bitrate.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-v-bitrate.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-v-framerate.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-v-framesize.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-detach.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-duration-boundaryconditions.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-duration.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-endofstream-invaliderror.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-errors.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-garbage-collection-before-sourceopen.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-gc-after-decode-error-crash.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-getvideoplaybackquality.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-initsegmentreceived-alg.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-multiple-attach.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-play-then-seek-back.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-play.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-precise-duration.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-preload.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-redundant-seek.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-remove.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-removesourcebuffer.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-seek-beyond-duration.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-seek-during-pending-seek.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-seekable.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-sequencemode-append-buffer.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-sequencemode-crbug-616565.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-sourcebuffer-mode.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-sourcebuffer-trackdefaults.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-sourcebufferlist-crash.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-sourcebufferlist.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/mediasource-timestamp-offset.html [ Crash ] -crbug.com/591099 http/tests/media/media-source/stream_memory_tests/mediasource-appendbuffer-quota-exceeded-default-buffers.html [ Crash ] -crbug.com/591099 http/tests/media/pdf-served-as-pdf.html [ Crash ] -crbug.com/591099 http/tests/media/progress-events-generated-correctly.html [ Crash ] -crbug.com/591099 http/tests/media/reload-after-dialog.html [ Crash ] -crbug.com/591099 http/tests/media/remove-while-loading.html [ Crash ] -crbug.com/591099 http/tests/media/text-served-as-text.html [ Crash ] +crbug.com/591099 http/tests/media/autoplay-crossorigin.html [ Crash Pass ] +crbug.com/591099 http/tests/media/controls/controls-list-add-hide.html [ Crash Pass ] +crbug.com/591099 http/tests/media/controls/controls-list-remove-show.html [ Crash Pass ] +crbug.com/591099 http/tests/media/controls/video-controls-overflow-menu-correct-ordering.html [ Crash Pass ] +crbug.com/591099 http/tests/media/controls/video-controls-overflow-menu-updates-appropriately.html [ Crash Pass ] +crbug.com/591099 http/tests/media/encrypted-media/encrypted-media-encrypted-event-different-origin.html [ Crash Pass ] +crbug.com/591099 http/tests/media/encrypted-media/encrypted-media-encrypted-event-same-origin.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-addsourcebuffer.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-append-buffer.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-appendwindow.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-avtracks.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-buffered.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-closed.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-a-bitrate.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-av-audio-bitrate.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-av-framesize.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-av-video-bitrate.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-v-bitrate.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-v-framerate.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-v-framesize.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-a-bitrate.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-av-audio-bitrate.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-av-framesize.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-av-video-bitrate.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-v-bitrate.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-v-framerate.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-v-framesize.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-detach.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-duration-boundaryconditions.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-duration.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-endofstream-invaliderror.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-errors.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-garbage-collection-before-sourceopen.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-gc-after-decode-error-crash.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-getvideoplaybackquality.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-initsegmentreceived-alg.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-multiple-attach.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-play-then-seek-back.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-play.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-precise-duration.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-preload.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-redundant-seek.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-remove.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-removesourcebuffer.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-seek-beyond-duration.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-seek-during-pending-seek.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-seekable.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-sequencemode-append-buffer.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-sequencemode-crbug-616565.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-sourcebuffer-mode.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-sourcebuffer-trackdefaults.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-sourcebufferlist-crash.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-sourcebufferlist.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/mediasource-timestamp-offset.html [ Crash Pass ] +crbug.com/591099 http/tests/media/media-source/stream_memory_tests/mediasource-appendbuffer-quota-exceeded-default-buffers.html [ Crash Pass ] +crbug.com/591099 http/tests/media/pdf-served-as-pdf.html [ Crash Pass ] +crbug.com/591099 http/tests/media/progress-events-generated-correctly.html [ Crash Pass ] +crbug.com/591099 http/tests/media/reload-after-dialog.html [ Crash Pass ] +crbug.com/591099 http/tests/media/remove-while-loading.html [ Crash Pass ] +crbug.com/591099 http/tests/media/text-served-as-text.html [ Crash Pass ] crbug.com/591099 http/tests/media/video-buffered-range-contains-currentTime.html [ Failure Pass ] -crbug.com/591099 http/tests/media/video-buffered.html [ Crash ] -crbug.com/591099 http/tests/media/video-controls-download-button-displayed.html [ Crash ] -crbug.com/591099 http/tests/media/video-controls-download-button-not-displayed-hide-download-ui.html [ Crash ] -crbug.com/591099 http/tests/media/video-controls-download-button-not-displayed-mediastream.html [ Crash ] -crbug.com/591099 http/tests/media/video-controls-download-button-not-displayed-mse.html [ Crash ] -crbug.com/591099 http/tests/media/video-cookie.html [ Crash ] -crbug.com/591099 http/tests/media/video-error-abort.html [ Crash ] +crbug.com/591099 http/tests/media/video-buffered.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-controls-download-button-displayed.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-controls-download-button-not-displayed-hide-download-ui.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-controls-download-button-not-displayed-mediastream.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-controls-download-button-not-displayed-mse.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-cookie.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-error-abort.html [ Crash Pass ] crbug.com/591099 http/tests/media/video-in-iframe-crash.html [ Crash Pass ] -crbug.com/591099 http/tests/media/video-load-metadata-decode-error.html [ Crash ] -crbug.com/591099 http/tests/media/video-load-suspend.html [ Crash ] -crbug.com/591099 http/tests/media/video-load-with-userpass.html [ Crash ] -crbug.com/591099 http/tests/media/video-play-progress.html [ Crash ] -crbug.com/591099 http/tests/media/video-play-stall-before-meta-data.html [ Crash ] +crbug.com/591099 http/tests/media/video-load-metadata-decode-error.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-load-suspend.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-load-with-userpass.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-play-progress.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-play-stall-before-meta-data.html [ Crash Pass ] crbug.com/591099 http/tests/media/video-play-stall.html [ Crash Timeout ] -crbug.com/591099 http/tests/media/video-query-url.html [ Crash ] -crbug.com/591099 http/tests/media/video-referer.html [ Crash ] -crbug.com/591099 http/tests/media/video-seek-to-duration.html [ Crash ] -crbug.com/591099 http/tests/media/video-seek-to-middle.html [ Crash ] -crbug.com/591099 http/tests/media/video-served-as-text.html [ Crash ] -crbug.com/591099 http/tests/media/video-throttled-load-metadata.html [ Crash ] -crbug.com/591099 http/tests/media/video-useragent.html [ Crash ] +crbug.com/591099 http/tests/media/video-query-url.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-referer.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-seek-to-duration.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-seek-to-middle.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-served-as-text.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-throttled-load-metadata.html [ Crash Pass ] +crbug.com/591099 http/tests/media/video-useragent.html [ Crash Pass ] crbug.com/591099 http/tests/mime/quoted-charset.php [ Failure ] -crbug.com/591099 http/tests/mime/reload-subresource-when-type-changes.html [ Crash ] +crbug.com/591099 http/tests/mime/reload-subresource-when-type-changes.html [ Crash Pass ] crbug.com/591099 http/tests/misc/BOM-override-script.html [ Failure ] crbug.com/591099 http/tests/misc/DOMContentLoaded-event.html [ Crash Failure ] -crbug.com/591099 http/tests/misc/acid2-pixel.html [ Crash ] -crbug.com/591099 http/tests/misc/acid2.html [ Crash ] +crbug.com/591099 http/tests/misc/acid2-pixel.html [ Crash Failure ] +crbug.com/591099 http/tests/misc/acid2.html [ Crash Failure ] crbug.com/591099 http/tests/misc/acid3.html [ Crash Failure ] -crbug.com/591099 http/tests/misc/adopt-iframe-src-attr-after-remove.html [ Crash ] +crbug.com/591099 http/tests/misc/adopt-iframe-src-attr-after-remove.html [ Crash Pass ] crbug.com/591099 http/tests/misc/async-script-removed.html [ Failure ] crbug.com/591099 http/tests/misc/async-script.html [ Failure ] crbug.com/591099 http/tests/misc/bad-charset-alias.html [ Failure ] @@ -15140,23 +15148,23 @@ crbug.com/591099 http/tests/misc/char-encoding-in-hidden-charset-field-with-one-field.html [ Failure ] crbug.com/591099 http/tests/misc/char-encoding-in-text-charset-field-with-value.html [ Crash Failure ] crbug.com/591099 http/tests/misc/char-encoding-without-charset-field.html [ Crash Failure ] -crbug.com/591099 http/tests/misc/client-hint-accept-on-subresource.html [ Crash ] -crbug.com/591099 http/tests/misc/client-hints-accept-iframe.html [ Crash ] -crbug.com/591099 http/tests/misc/client-hints-accept-meta.html [ Crash ] -crbug.com/591099 http/tests/misc/client-hints-accept-parent.php [ Crash ] -crbug.com/591099 http/tests/misc/client-hints-accept.php [ Crash ] -crbug.com/591099 http/tests/misc/client-hints-dynamic-rw-sizes.html [ Crash ] -crbug.com/591099 http/tests/misc/client-hints-invalid-accept.php [ Crash ] -crbug.com/591099 http/tests/misc/client-hints-no-accept.html [ Crash ] -crbug.com/591099 http/tests/misc/client-hints-picture-source-removal.html [ Crash ] -crbug.com/591099 http/tests/misc/client-hints-picture.html [ Crash ] -crbug.com/591099 http/tests/misc/client-hints-preload-rw-sizes.html [ Crash ] +crbug.com/591099 http/tests/misc/client-hint-accept-on-subresource.html [ Crash Pass ] +crbug.com/591099 http/tests/misc/client-hints-accept-iframe.html [ Crash Pass ] +crbug.com/591099 http/tests/misc/client-hints-accept-meta.html [ Crash Pass ] +crbug.com/591099 http/tests/misc/client-hints-accept-parent.php [ Crash Pass ] +crbug.com/591099 http/tests/misc/client-hints-accept.php [ Crash Pass ] +crbug.com/591099 http/tests/misc/client-hints-dynamic-rw-sizes.html [ Crash Pass ] +crbug.com/591099 http/tests/misc/client-hints-invalid-accept.php [ Crash Pass ] +crbug.com/591099 http/tests/misc/client-hints-no-accept.html [ Crash Pass ] +crbug.com/591099 http/tests/misc/client-hints-picture-source-removal.html [ Crash Pass ] +crbug.com/591099 http/tests/misc/client-hints-picture.html [ Crash Pass ] +crbug.com/591099 http/tests/misc/client-hints-preload-rw-sizes.html [ Crash Pass ] crbug.com/591099 http/tests/misc/copy-resolves-urls.html [ Failure ] crbug.com/591099 http/tests/misc/crash-multiple-family-fontface.html [ Failure ] crbug.com/591099 http/tests/misc/css-reject-any-type-in-strict-mode.html [ Failure ] -crbug.com/591099 http/tests/misc/delete-frame-during-readystatechange-with-gc-after-video-removal.html [ Crash ] -crbug.com/591099 http/tests/misc/delete-frame-during-readystatechange.html [ Crash ] -crbug.com/591099 http/tests/misc/detach-during-notifyDone.html [ Crash ] +crbug.com/591099 http/tests/misc/delete-frame-during-readystatechange-with-gc-after-video-removal.html [ Crash Pass ] +crbug.com/591099 http/tests/misc/delete-frame-during-readystatechange.html [ Crash Pass ] +crbug.com/591099 http/tests/misc/detach-during-notifyDone.html [ Crash Pass ] crbug.com/591099 http/tests/misc/dns-prefetch-control.html [ Crash Failure ] crbug.com/591099 http/tests/misc/drag-over-iframe-invalid-source-crash.html [ Crash Failure ] crbug.com/591099 http/tests/misc/embed-image-load-outlives-gc-without-crashing.html [ Crash Pass ] @@ -15170,13 +15178,13 @@ crbug.com/591099 http/tests/misc/extract-http-content-language.php [ Failure ] crbug.com/591099 http/tests/misc/favicon-as-image.html [ Failure ] crbug.com/591099 http/tests/misc/font-face-in-multiple-segmented-faces.html [ Crash Failure ] -crbug.com/591099 http/tests/misc/form-action-using-replaceChild.html [ Crash ] +crbug.com/591099 http/tests/misc/form-action-using-replaceChild.html [ Crash Pass ] crbug.com/591099 http/tests/misc/form-post-textplain.html [ Failure ] crbug.com/591099 http/tests/misc/frame-access-during-load.html [ Failure ] crbug.com/591099 http/tests/misc/generated-content-inside-table.html [ Failure ] crbug.com/591099 http/tests/misc/gmail-assert-on-load.html [ Failure ] crbug.com/591099 http/tests/misc/iframe-reparenting-id-collision.html [ Failure ] -crbug.com/591099 http/tests/misc/iframe404.html [ Crash ] +crbug.com/591099 http/tests/misc/iframe404.html [ Crash Failure ] crbug.com/591099 http/tests/misc/image-blocked-src-change.html [ Crash Failure ] crbug.com/591099 http/tests/misc/image-blocked-src-no-change.html [ Crash Failure ] crbug.com/591099 http/tests/misc/image-input-type-outlives-gc-without-crashing.html [ Crash Pass ] @@ -15190,13 +15198,13 @@ crbug.com/591099 http/tests/misc/object-image-error-with-onload.html [ Crash Failure ] crbug.com/591099 http/tests/misc/object-image-error.html [ Crash Failure ] crbug.com/591099 http/tests/misc/object-image-load-outlives-gc-without-crashing.html [ Crash Pass ] -crbug.com/591099 http/tests/misc/onload-remove-iframe-crash-2.html [ Crash ] +crbug.com/591099 http/tests/misc/onload-remove-iframe-crash-2.html [ Crash Pass ] crbug.com/591099 http/tests/misc/percent-sign-in-form-field-name.html [ Crash Failure ] -crbug.com/591099 http/tests/misc/plugin-array-detach.html [ Crash ] +crbug.com/591099 http/tests/misc/plugin-array-detach.html [ Crash Pass ] crbug.com/591099 http/tests/misc/refresh-headers.php [ Failure ] crbug.com/591099 http/tests/misc/resource-timing-iframe-restored-from-history.html [ Failure ] -crbug.com/591099 http/tests/misc/resource-timing-sizes-multipart.html [ Crash ] -crbug.com/591099 http/tests/misc/resource-timing-sizes-tags.html [ Crash ] +crbug.com/591099 http/tests/misc/resource-timing-sizes-multipart.html [ Crash Pass ] +crbug.com/591099 http/tests/misc/resource-timing-sizes-tags.html [ Crash Pass ] crbug.com/591099 http/tests/misc/script-after-slow-stylesheet-removed.html [ Crash Failure ] crbug.com/591099 http/tests/misc/script-defer-after-slow-stylesheet.html [ Failure ] crbug.com/591099 http/tests/misc/script-sync-slow-scripts-onerror.html [ Failure ] @@ -15223,11 +15231,11 @@ crbug.com/591099 http/tests/misc/webtiming-resolution.html [ Failure ] crbug.com/591099 http/tests/misc/webtiming-slow-load.php [ Failure ] crbug.com/591099 http/tests/misc/webtiming-two-redirects.php [ Failure ] -crbug.com/591099 http/tests/misc/xslt-bad-import.html [ Crash ] +crbug.com/591099 http/tests/misc/xslt-bad-import.html [ Crash Pass ] crbug.com/591099 http/tests/multipart/stop-crash.html [ Failure ] -crbug.com/591099 http/tests/multipart/stop-loading-after-onload1.html [ Crash ] -crbug.com/591099 http/tests/multipart/stop-loading-after-onload2.html [ Crash ] -crbug.com/591099 http/tests/multipart/stop-loading.html [ Crash ] +crbug.com/591099 http/tests/multipart/stop-loading-after-onload1.html [ Crash Pass ] +crbug.com/591099 http/tests/multipart/stop-loading-after-onload2.html [ Crash Pass ] +crbug.com/591099 http/tests/multipart/stop-loading.html [ Crash Pass ] crbug.com/591099 http/tests/navigation/anchor-basic.html [ Crash Failure ] crbug.com/591099 http/tests/navigation/anchor-frames-cross-origin.html [ Failure ] crbug.com/591099 http/tests/navigation/anchor-frames-gbk.html [ Failure ] @@ -15236,20 +15244,20 @@ crbug.com/591099 http/tests/navigation/anchor-goback.html [ Crash Failure ] crbug.com/591099 http/tests/navigation/back-to-slow-frame.html [ Failure ] crbug.com/591099 http/tests/navigation/cross-origin-fragment-navigation-is-async.html [ Failure ] -crbug.com/591099 http/tests/navigation/fallback-anchor-reload.html [ Crash ] +crbug.com/591099 http/tests/navigation/fallback-anchor-reload.html [ Crash Pass ] crbug.com/591099 http/tests/navigation/form-targets-cross-site-frame-get.html [ Crash Failure ] crbug.com/591099 http/tests/navigation/form-targets-cross-site-frame-no-referrer.html [ Crash Failure ] crbug.com/591099 http/tests/navigation/form-targets-cross-site-frame-post.html [ Crash Failure ] crbug.com/591099 http/tests/navigation/form-with-enctype-targets-cross-site-frame.html [ Crash Failure ] crbug.com/591099 http/tests/navigation/forward-to-fragment-fires-onload.html [ Crash Failure ] crbug.com/591099 http/tests/navigation/history-back-across-form-submission-to-fragment.html [ Failure ] -crbug.com/591099 http/tests/navigation/image-load-in-subframe-unload-handler.html [ Crash ] +crbug.com/591099 http/tests/navigation/image-load-in-subframe-unload-handler.html [ Crash Pass ] crbug.com/591099 http/tests/navigation/javascriptlink-basic.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/navigation/javascriptlink-goback.html [ Crash Failure Timeout ] crbug.com/591099 http/tests/navigation/lockedhistory-iframe.html [ Failure ] crbug.com/591099 http/tests/navigation/metaredirect-basic.html [ Crash Failure ] crbug.com/591099 http/tests/navigation/metaredirect-goback.html [ Crash Failure ] -crbug.com/591099 http/tests/navigation/navigate-during-commit.html [ Crash ] +crbug.com/591099 http/tests/navigation/navigate-during-commit.html [ Crash Pass ] crbug.com/591099 http/tests/navigation/navigation-with-detached-origin-document.html [ Crash Pass ] crbug.com/591099 http/tests/navigation/no-referrer-reset.html [ Failure Timeout ] crbug.com/591099 http/tests/navigation/onload-navigation-iframe-2.html [ Failure ] @@ -15282,7 +15290,7 @@ crbug.com/591099 http/tests/navigation/success200-goback.html [ Crash Failure ] crbug.com/591099 http/tests/navigation/success200-loadsame.html [ Crash Failure ] crbug.com/591099 http/tests/navigation/success200-reload.html [ Crash Failure ] -crbug.com/591099 http/tests/navigation/targeted-navigation-in-unload-handler.html [ Crash ] +crbug.com/591099 http/tests/navigation/targeted-navigation-in-unload-handler.html [ Crash Pass ] crbug.com/591099 http/tests/navigation/timerredirect-basic.html [ Crash Failure ] crbug.com/591099 http/tests/navigation/timerredirect-goback.html [ Crash Failure ] crbug.com/591099 http/tests/navigation/useragent.php [ Failure ] @@ -15290,7 +15298,7 @@ crbug.com/591099 http/tests/navigatorcontentutils/register-protocol-handler.html [ Failure ] crbug.com/591099 http/tests/navigatorcontentutils/unregister-protocol-handler.html [ Failure ] crbug.com/591099 http/tests/notifications/notification-sandbox-permission.html [ Failure ] -crbug.com/591099 http/tests/performance-timing/paint-timing/first-contentful-canvas.html [ Crash ] +crbug.com/591099 http/tests/performance-timing/paint-timing/first-contentful-canvas.html [ Crash Pass ] crbug.com/591099 http/tests/permissionclient/image-permissions.html [ Failure ] crbug.com/591099 http/tests/plugins/navigator-plugins-in-cross-origin-frame.html [ Failure Pass ] crbug.com/591099 http/tests/pointer-lock/iframe-sandboxed-allow-pointer-lock.html [ Failure ] @@ -15301,14 +15309,14 @@ crbug.com/591099 http/tests/pointer-lock/pointerlockelement-same-origin.html [ Failure ] crbug.com/591099 http/tests/pointer-lock/requestPointerLock-can-not-transfer-between-documents.html [ Failure ] crbug.com/591099 http/tests/preload/dynamic_remove_preload_href.html [ Failure Pass ] -crbug.com/591099 http/tests/preload/multiple-meta-csp.html [ Crash ] -crbug.com/591099 http/tests/preload/preload-video-cors.html [ Crash ] +crbug.com/591099 http/tests/preload/multiple-meta-csp.html [ Crash Pass ] +crbug.com/591099 http/tests/preload/preload-video-cors.html [ Crash Pass ] crbug.com/591099 http/tests/previews/client-lofi-sprite.html [ Failure ] crbug.com/591099 http/tests/security/MessagePort/event-listener-context.html [ Failure ] crbug.com/591099 http/tests/security/XFrameOptions/x-frame-options-cached.html [ Failure ] -crbug.com/591099 http/tests/security/XFrameOptions/x-frame-options-deny-delete-frame-in-load-event.html [ Crash ] -crbug.com/591099 http/tests/security/aboutBlank/security-context-alias.html [ Crash ] -crbug.com/591099 http/tests/security/aboutBlank/security-context-grandchildren-alias.html [ Crash ] +crbug.com/591099 http/tests/security/XFrameOptions/x-frame-options-deny-delete-frame-in-load-event.html [ Crash Pass ] +crbug.com/591099 http/tests/security/aboutBlank/security-context-alias.html [ Crash Pass ] +crbug.com/591099 http/tests/security/aboutBlank/security-context-grandchildren-alias.html [ Crash Pass ] crbug.com/591099 http/tests/security/anchor-download-allow-blob.html [ Failure ] crbug.com/591099 http/tests/security/anchor-download-allow-data.html [ Failure ] crbug.com/591099 http/tests/security/anchor-download-allow-sameorigin.html [ Failure ] @@ -15316,13 +15324,13 @@ crbug.com/591099 http/tests/security/cannot-read-cssrules-redirect.html [ Failure ] crbug.com/591099 http/tests/security/cannot-read-cssrules.html [ Failure ] crbug.com/591099 http/tests/security/canvas-remote-read-redirect-to-remote-image.html [ Failure ] -crbug.com/591099 http/tests/security/canvas-remote-read-remote-svg-image.html [ Crash ] +crbug.com/591099 http/tests/security/canvas-remote-read-remote-svg-image.html [ Crash Pass ] crbug.com/591099 http/tests/security/clipboard/clipboard-file-access.html [ Failure Timeout ] crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-blocked-when-target-blank.html [ Crash Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-blocked-when-target-cross-site-window.html [ Crash Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-leak-path-on-redirect.html [ Crash Failure ] -crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-resubmission-iframe-reload-from-child.html [ Crash ] -crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-resubmission-iframe-reload-from-parent.html [ Crash ] +crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-resubmission-iframe-reload-from-child.html [ Crash Pass ] +crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-resubmission-iframe-reload-from-parent.html [ Crash Pass ] crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-allowed-with-redirect.html [ Crash Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-allowed.html [ Crash Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-blocked.html [ Crash Failure ] @@ -15333,7 +15341,7 @@ crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-blocked-with-redirect.html [ Crash Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-blocked.html [ Crash Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-javascript-blocked.html [ Crash Failure ] -crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-redirect-blocked-in-new-window.html [ Crash ] +crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-redirect-blocked-in-new-window.html [ Crash Pass ] crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-redirect-blocked.html [ Crash Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/plugintypes-affects-child.html [ Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/plugintypes-affects-cross-site-child-allowed.html [ Failure ] @@ -15346,13 +15354,13 @@ crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/plugintypes-nourl-allowed.html [ Failure Pass ] crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/plugintypes-url-01.html [ Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/plugintypes-url-02.html [ Failure ] -crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-allowed.html [ Crash ] -crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-blocked.html [ Crash ] +crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-allowed.html [ Crash Pass ] +crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-blocked.html [ Crash Pass ] crbug.com/591099 http/tests/security/contentSecurityPolicy/cached-frame-csp.html [ Crash Failure ] -crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/cross-origin-with-own-policy.html [ Crash ] -crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/cross-origin.html [ Crash ] -crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/same-origin-with-own-policy.html [ Crash ] -crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/same-origin.html [ Crash ] +crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/cross-origin-with-own-policy.html [ Crash Pass ] +crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/cross-origin.html [ Crash Pass ] +crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/same-origin-with-own-policy.html [ Crash Pass ] +crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/same-origin.html [ Crash Pass ] crbug.com/591099 http/tests/security/contentSecurityPolicy/directive-parsing-01.html [ Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/directive-parsing-02.html [ Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/directive-parsing-03.html [ Failure ] @@ -15374,11 +15382,11 @@ crbug.com/591099 http/tests/security/contentSecurityPolicy/object-src-param-url-blocked.html [ Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/object-src-url-allowed.html [ Failure Pass ] crbug.com/591099 http/tests/security/contentSecurityPolicy/plugin-in-iframe-with-csp.html [ Failure ] -crbug.com/591099 http/tests/security/contentSecurityPolicy/redirect-does-not-match-paths.html [ Crash ] -crbug.com/591099 http/tests/security/contentSecurityPolicy/redirect-with-delay.html [ Crash ] +crbug.com/591099 http/tests/security/contentSecurityPolicy/redirect-does-not-match-paths.html [ Crash Pass ] +crbug.com/591099 http/tests/security/contentSecurityPolicy/redirect-with-delay.html [ Crash Pass ] crbug.com/591099 http/tests/security/contentSecurityPolicy/register-bypassing-scheme-partial.html [ Crash Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/report-multiple-violations-01.php [ Crash Failure ] -crbug.com/591099 http/tests/security/contentSecurityPolicy/require-sri-for/require-sri-for-svg-script-blocked.php [ Crash ] +crbug.com/591099 http/tests/security/contentSecurityPolicy/require-sri-for/require-sri-for-svg-script-blocked.php [ Crash Pass ] crbug.com/591099 http/tests/security/contentSecurityPolicy/script-src-in-iframe.html [ Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/script-src-none-inline-event.html [ Failure ] crbug.com/591099 http/tests/security/contentSecurityPolicy/script-src-none.html [ Failure ] @@ -15405,16 +15413,16 @@ crbug.com/591099 http/tests/security/contentTypeOptions/nosniff-script-allowed.html [ Failure ] crbug.com/591099 http/tests/security/contentTypeOptions/nosniff-script-blocked.html [ Failure ] crbug.com/591099 http/tests/security/contentTypeOptions/nosniff-script-without-content-type-blocked.html [ Failure ] -crbug.com/591099 http/tests/security/cookies/third-party-cookie-blocking-worker.html [ Crash ] -crbug.com/591099 http/tests/security/cookies/websocket/third-party-cookie-blocked-on-cross-origin-websocket.html [ Crash ] -crbug.com/591099 http/tests/security/cookies/websocket/third-party-cookie-blocked-on-same-origin-websocket.html [ Crash ] -crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-appcache.html [ Crash ] -crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-basic.html [ Crash ] -crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.html [ Crash ] -crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-csp.html [ Crash ] -crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-serviceworker-basic.html [ Crash ] -crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-sharedworker-basic.html [ Crash ] -crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-worker-basic.html [ Crash ] +crbug.com/591099 http/tests/security/cookies/third-party-cookie-blocking-worker.html [ Crash Pass ] +crbug.com/591099 http/tests/security/cookies/websocket/third-party-cookie-blocked-on-cross-origin-websocket.html [ Crash Pass ] +crbug.com/591099 http/tests/security/cookies/websocket/third-party-cookie-blocked-on-same-origin-websocket.html [ Crash Pass ] +crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-appcache.html [ Crash Failure ] +crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-basic.html [ Crash Pass ] +crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.html [ Crash Pass ] +crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-csp.html [ Crash Pass ] +crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-serviceworker-basic.html [ Crash Pass ] +crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-sharedworker-basic.html [ Crash Pass ] +crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-worker-basic.html [ Crash Pass ] crbug.com/591099 http/tests/security/cross-frame-access-call.html [ Crash Failure ] crbug.com/591099 http/tests/security/cross-frame-access-callback-explicit-domain-ALLOW.html [ Failure ] crbug.com/591099 http/tests/security/cross-frame-access-callback-explicit-domain-DENY.html [ Failure ] @@ -15431,12 +15439,12 @@ crbug.com/591099 http/tests/security/cross-frame-access-protocol-explicit-domain.html [ Failure ] crbug.com/591099 http/tests/security/cross-frame-access-put.html [ Failure Timeout ] crbug.com/591099 http/tests/security/cross-frame-access-set-window-properties.html [ Failure ] -crbug.com/591099 http/tests/security/cross-frame-mouse-source-capabilities.html [ Crash Timeout ] +crbug.com/591099 http/tests/security/cross-frame-mouse-source-capabilities.html [ Crash Pass Timeout ] crbug.com/591099 http/tests/security/cross-origin-OffscreenCanvas2D-createPattern.html [ Failure ] crbug.com/591099 http/tests/security/cross-origin-OffscreenCanvas2D-transferToImageBitmap.html [ Failure ] -crbug.com/591099 http/tests/security/cross-origin-OffscreenCanvasWebGL-texImage2D.html [ Crash ] +crbug.com/591099 http/tests/security/cross-origin-OffscreenCanvasWebGL-texImage2D.html [ Crash Pass ] crbug.com/591099 http/tests/security/cross-origin-access-over-property-descriptor.html [ Failure ] -crbug.com/591099 http/tests/security/cross-origin-appcache-allowed.html [ Crash ] +crbug.com/591099 http/tests/security/cross-origin-appcache-allowed.html [ Crash Failure ] crbug.com/591099 http/tests/security/cross-origin-createImageBitmap.html [ Failure ] crbug.com/591099 http/tests/security/cross-origin-getMatchedCSSRules.html [ Failure ] crbug.com/591099 http/tests/security/cross-origin-indexeddb-allowed.html [ Failure ] @@ -15449,8 +15457,8 @@ crbug.com/591099 http/tests/security/cross-origin-window-event-exception.html [ Failure ] crbug.com/591099 http/tests/security/cross-origin-window-open-exception.html [ Failure ] crbug.com/591099 http/tests/security/cross-origin-worker-indexeddb-allowed.html [ Failure ] -crbug.com/591099 http/tests/security/dangling-markup/option.html [ Crash ] -crbug.com/591099 http/tests/security/dangling-markup/textarea.html [ Crash ] +crbug.com/591099 http/tests/security/dangling-markup/option.html [ Crash Pass ] +crbug.com/591099 http/tests/security/dangling-markup/textarea.html [ Crash Pass ] crbug.com/591099 http/tests/security/data-url-inline.css.html [ Failure ] crbug.com/591099 http/tests/security/dataTransfer-set-data-file-url.html [ Timeout ] crbug.com/591099 http/tests/security/dataURL/xss-DENIED-from-data-url-in-foreign-domain-subframe.html [ Failure ] @@ -15465,9 +15473,9 @@ crbug.com/591099 http/tests/security/dataURL/xss-DENIED-to-data-url-sub-frame-2-level.html [ Failure ] crbug.com/591099 http/tests/security/dataURL/xss-DENIED-to-data-url-sub-frame-uppercase.html [ Failure ] crbug.com/591099 http/tests/security/dataURL/xss-DENIED-to-data-url-sub-frame.html [ Failure ] -crbug.com/591099 http/tests/security/deprecated-subresource-requests.html [ Crash ] -crbug.com/591099 http/tests/security/detached-sandboxed-frame-access.html [ Crash ] -crbug.com/591099 http/tests/security/document-origin.html [ Crash ] +crbug.com/591099 http/tests/security/deprecated-subresource-requests.html [ Crash Pass ] +crbug.com/591099 http/tests/security/detached-sandboxed-frame-access.html [ Crash Pass ] +crbug.com/591099 http/tests/security/document-origin.html [ Crash Pass ] crbug.com/591099 http/tests/security/drag-drop-same-unique-origin.html [ Failure ] crbug.com/591099 http/tests/security/drag-over-remote-content-iframe.html [ Failure ] crbug.com/591099 http/tests/security/escape-form-data-field-names.html [ Crash Failure ] @@ -15482,15 +15490,15 @@ crbug.com/591099 http/tests/security/frameNavigation/xss-DENIED-top-navigation-user-gesture-in-parent.html [ Failure ] crbug.com/591099 http/tests/security/frameNavigation/xss-DENIED-top-navigation-without-user-gesture.html [ Failure ] crbug.com/591099 http/tests/security/host-compare-case-insensitive.html [ Failure ] -crbug.com/591099 http/tests/security/img-crossorigin-cookies.html [ Crash ] +crbug.com/591099 http/tests/security/img-crossorigin-cookies.html [ Crash Pass ] crbug.com/591099 http/tests/security/img-crossorigin-no-credentials-prompt.html [ Crash Failure ] crbug.com/591099 http/tests/security/img-crossorigin-redirect-anonymous.html [ Crash Failure ] -crbug.com/591099 http/tests/security/img-crossorigin-redirect-credentials.html [ Crash ] +crbug.com/591099 http/tests/security/img-crossorigin-redirect-credentials.html [ Crash Pass ] crbug.com/591099 http/tests/security/img-crossorigin-redirect-no-cors.html [ Crash Failure ] -crbug.com/591099 http/tests/security/img-redirect-to-crossorigin-credentials.html [ Crash ] +crbug.com/591099 http/tests/security/img-redirect-to-crossorigin-credentials.html [ Crash Pass ] crbug.com/591099 http/tests/security/img-with-failed-cors-check-fails-to-load.html [ Crash Pass ] crbug.com/591099 http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-script.html [ Failure ] -crbug.com/591099 http/tests/security/isolatedWorld/bypass-main-world-csp.html [ Crash ] +crbug.com/591099 http/tests/security/isolatedWorld/bypass-main-world-csp.html [ Crash Pass ] crbug.com/591099 http/tests/security/isolatedWorld/cross-origin-xhr.html [ Failure ] crbug.com/591099 http/tests/security/isolatedWorld/no-bypass-main-world-csp-for-delayed-execution.html [ Failure ] crbug.com/591099 http/tests/security/isolatedWorld/sandboxed-iframe.html [ Failure ] @@ -15512,7 +15520,7 @@ crbug.com/591099 http/tests/security/javascriptURL/xss-DENIED-from-javascript-url-in-foreign-domain-subframe.html [ Failure ] crbug.com/591099 http/tests/security/javascriptURL/xss-DENIED-from-javascript-url-in-foreign-domain-window-open.html [ Failure ] crbug.com/591099 http/tests/security/javascriptURL/xss-DENIED-to-javascript-url-in-foreign-domain-subframe.html [ Failure ] -crbug.com/591099 http/tests/security/lenient-this-issue569043.html [ Crash ] +crbug.com/591099 http/tests/security/lenient-this-issue569043.html [ Crash Pass ] crbug.com/591099 http/tests/security/link-crossorigin-stylesheet-anonymous.html [ Failure ] crbug.com/591099 http/tests/security/link-crossorigin-stylesheet-import-anonymous.html [ Failure ] crbug.com/591099 http/tests/security/link-crossorigin-stylesheet-import-credentials.html [ Failure ] @@ -15554,16 +15562,16 @@ crbug.com/591099 http/tests/security/mime-type-execute-as-html-15.html [ Failure ] crbug.com/591099 http/tests/security/mime-type-execute-as-html-16.html [ Failure ] crbug.com/591099 http/tests/security/mixedContent/active-subresource-in-iframe-blocked.https.html [ Failure ] -crbug.com/591099 http/tests/security/mixedContent/blob-url-script-in-data-iframe.https.html [ Crash ] -crbug.com/591099 http/tests/security/mixedContent/blob-url-script-in-sandboxed-iframe.https.html [ Crash ] -crbug.com/591099 http/tests/security/mixedContent/blocked-blob-url-script-in-data-iframe.https.html [ Crash ] -crbug.com/591099 http/tests/security/mixedContent/data-url-script-in-data-iframe.https.html [ Crash ] +crbug.com/591099 http/tests/security/mixedContent/blob-url-script-in-data-iframe.https.html [ Crash Pass ] +crbug.com/591099 http/tests/security/mixedContent/blob-url-script-in-sandboxed-iframe.https.html [ Crash Pass ] +crbug.com/591099 http/tests/security/mixedContent/blocked-blob-url-script-in-data-iframe.https.html [ Crash Pass ] +crbug.com/591099 http/tests/security/mixedContent/data-url-script-in-data-iframe.https.html [ Crash Pass ] crbug.com/591099 http/tests/security/mixedContent/data-url-script-in-iframe.html [ Failure ] crbug.com/591099 http/tests/security/mixedContent/empty-url-plugin-in-frame.html [ Failure ] crbug.com/591099 http/tests/security/mixedContent/insecure-css-in-iframe.html [ Failure ] crbug.com/591099 http/tests/security/mixedContent/insecure-iframe-in-iframe.html [ Failure ] crbug.com/591099 http/tests/security/mixedContent/insecure-image-in-iframe.html [ Failure ] -crbug.com/591099 http/tests/security/mixedContent/insecure-picture-in-main-frame-blocked.https.html [ Crash ] +crbug.com/591099 http/tests/security/mixedContent/insecure-picture-in-main-frame-blocked.https.html [ Crash Pass ] crbug.com/591099 http/tests/security/mixedContent/insecure-plugin-in-iframe.html [ Failure ] crbug.com/591099 http/tests/security/mixedContent/insecure-script-in-iframe.html [ Failure ] crbug.com/591099 http/tests/security/mixedContent/nonwebby-scheme-in-iframe-allowed.https.html [ Failure ] @@ -15577,14 +15585,14 @@ crbug.com/591099 http/tests/security/popup-allowed-by-sandbox-is-sandboxed-control.html [ Failure ] crbug.com/591099 http/tests/security/popup-allowed-by-sandbox-is-sandboxed.html [ Failure ] crbug.com/591099 http/tests/security/popup-allowed-by-sandbox-when-allowed.html [ Failure ] -crbug.com/591099 http/tests/security/postMessage/origin-unaffected-by-document-domain.html [ Crash ] -crbug.com/591099 http/tests/security/powerfulFeatureRestrictions/geolocation-on-sandboxed-insecure-origin.html [ Crash ] -crbug.com/591099 http/tests/security/powerfulFeatureRestrictions/geolocation-on-secure-origin-in-insecure-origin.html [ Crash ] -crbug.com/591099 http/tests/security/powerfulFeatureRestrictions/geolocation-on-secure-origin-in-secure-origin.html [ Crash ] +crbug.com/591099 http/tests/security/postMessage/origin-unaffected-by-document-domain.html [ Crash Pass ] +crbug.com/591099 http/tests/security/powerfulFeatureRestrictions/geolocation-on-sandboxed-insecure-origin.html [ Crash Pass ] +crbug.com/591099 http/tests/security/powerfulFeatureRestrictions/geolocation-on-secure-origin-in-insecure-origin.html [ Crash Pass ] +crbug.com/591099 http/tests/security/powerfulFeatureRestrictions/geolocation-on-secure-origin-in-secure-origin.html [ Crash Pass ] crbug.com/591099 http/tests/security/preload-script-crossorigin-fails-cross-origin.html [ Failure ] -crbug.com/591099 http/tests/security/promise-realm.html [ Crash ] +crbug.com/591099 http/tests/security/promise-realm.html [ Crash Pass ] crbug.com/591099 http/tests/security/protocol-compare-case-insensitive.html [ Failure ] -crbug.com/591099 http/tests/security/referrer-on-client-reload.html [ Crash ] +crbug.com/591099 http/tests/security/referrer-on-client-reload.html [ Crash Pass ] crbug.com/591099 http/tests/security/referrer-policy-always.html [ Failure ] crbug.com/591099 http/tests/security/referrer-policy-default.html [ Failure ] crbug.com/591099 http/tests/security/referrer-policy-https-always.html [ Failure ] @@ -15605,32 +15613,32 @@ crbug.com/591099 http/tests/security/referrer-policy-redirect-link.html [ Timeout ] crbug.com/591099 http/tests/security/referrer-policy-redirect.html [ Failure ] crbug.com/591099 http/tests/security/referrer-policy-rel-noreferrer.html [ Timeout ] -crbug.com/591099 http/tests/security/referrer-policy-srcdoc-dynamic-policy.html [ Crash ] -crbug.com/591099 http/tests/security/referrer-policy-srcdoc.html [ Crash ] +crbug.com/591099 http/tests/security/referrer-policy-srcdoc-dynamic-policy.html [ Crash Pass ] +crbug.com/591099 http/tests/security/referrer-policy-srcdoc.html [ Crash Pass ] crbug.com/591099 http/tests/security/referrer-policy-window-open.html [ Failure ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-cross-origin-with-origin-when-cross-origin.php [ Crash ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-cross-origin-with-origin.php [ Crash ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-downgrade-with-no-referrer-when-downgrade.https.php [ Crash ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-no-downgrade-with-no-referrer-when-downgrade.https.php [ Crash ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-no-referrer.php [ Crash ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-same-origin-with-origin-when-cross-origin.php [ Crash ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-same-origin-with-origin.php [ Crash ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-unsafe-url.https.php [ Crash ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-always.php [ Crash ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-default.php [ Crash ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-never.php [ Crash ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-origin-when-crossorigin.php [ Crash ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/referrer-policy-header-then-meta.php [ Crash ] -crbug.com/591099 http/tests/security/referrerPolicyHeader/referrer-policy-redirect.php [ Crash ] -crbug.com/591099 http/tests/security/sandbox-iframe-blocks-top-navigation-to-javascript.html [ Crash ] -crbug.com/591099 http/tests/security/sandbox-iframe-blocks-top-navigation.html [ Crash ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-cross-origin-with-origin-when-cross-origin.php [ Crash Pass ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-cross-origin-with-origin.php [ Crash Pass ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-downgrade-with-no-referrer-when-downgrade.https.php [ Crash Pass ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-no-downgrade-with-no-referrer-when-downgrade.https.php [ Crash Pass ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-no-referrer.php [ Crash Pass ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-same-origin-with-origin-when-cross-origin.php [ Crash Pass ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-same-origin-with-origin.php [ Crash Pass ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-unsafe-url.https.php [ Crash Pass ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-always.php [ Crash Pass ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-default.php [ Crash Pass ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-never.php [ Crash Pass ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-origin-when-crossorigin.php [ Crash Pass ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/referrer-policy-header-then-meta.php [ Crash Pass ] +crbug.com/591099 http/tests/security/referrerPolicyHeader/referrer-policy-redirect.php [ Crash Pass ] +crbug.com/591099 http/tests/security/sandbox-iframe-blocks-top-navigation-to-javascript.html [ Crash Pass ] +crbug.com/591099 http/tests/security/sandbox-iframe-blocks-top-navigation.html [ Crash Pass ] crbug.com/591099 http/tests/security/sandbox-inherit-to-initial-document-2.html [ Failure ] crbug.com/591099 http/tests/security/sandbox-inherit-to-initial-document.html [ Failure ] crbug.com/591099 http/tests/security/sandboxed-iframe-blocks-access-from-parent.html [ Failure ] crbug.com/591099 http/tests/security/sandboxed-iframe-document-cookie.html [ Failure ] crbug.com/591099 http/tests/security/sandboxed-iframe-form-top.html [ Failure ] crbug.com/591099 http/tests/security/sandboxed-iframe-invalid.html [ Failure ] -crbug.com/591099 http/tests/security/sandboxed-iframe-javascript-url.html [ Crash ] +crbug.com/591099 http/tests/security/sandboxed-iframe-javascript-url.html [ Crash Pass ] crbug.com/591099 http/tests/security/sandboxed-iframe-meta-refresh.html [ Failure ] crbug.com/591099 http/tests/security/sandboxed-iframe-modify-self.html [ Crash Failure ] crbug.com/591099 http/tests/security/sandboxed-iframe-origin-add.html [ Failure ] @@ -15656,51 +15664,51 @@ crbug.com/591099 http/tests/security/script-onerror-no-crossorigin-cors.html [ Failure ] crbug.com/591099 http/tests/security/script-onerror-no-crossorigin-no-cors.html [ Failure ] crbug.com/591099 http/tests/security/script-with-failed-cors-check-fails-to-load.html [ Failure ] -crbug.com/591099 http/tests/security/secureContexts/authenticated.html [ Crash ] -crbug.com/591099 http/tests/security/secureContexts/authenticated_sandbox.html [ Crash ] -crbug.com/591099 http/tests/security/secureContexts/authenticated_srcdoc.html [ Crash ] -crbug.com/591099 http/tests/security/secureContexts/unauthenticated.html [ Crash ] -crbug.com/591099 http/tests/security/secureContexts/unauthenticated_sandbox.html [ Crash ] -crbug.com/591099 http/tests/security/secureContexts/unauthenticated_srcdoc.html [ Crash ] +crbug.com/591099 http/tests/security/secureContexts/authenticated.html [ Crash Pass ] +crbug.com/591099 http/tests/security/secureContexts/authenticated_sandbox.html [ Crash Pass ] +crbug.com/591099 http/tests/security/secureContexts/authenticated_srcdoc.html [ Crash Pass ] +crbug.com/591099 http/tests/security/secureContexts/unauthenticated.html [ Crash Pass ] +crbug.com/591099 http/tests/security/secureContexts/unauthenticated_sandbox.html [ Crash Pass ] +crbug.com/591099 http/tests/security/secureContexts/unauthenticated_srcdoc.html [ Crash Pass ] crbug.com/591099 http/tests/security/shape-image-cors-allow-origin.html [ Failure ] crbug.com/591099 http/tests/security/shape-image-cors-data-url.html [ Failure ] crbug.com/591099 http/tests/security/shape-image-cors-same-origin.html [ Failure ] -crbug.com/591099 http/tests/security/suborigins/crossorigin/suborigin-cross-origin-window-event-exception.php [ Crash ] -crbug.com/591099 http/tests/security/suborigins/crossorigin/suborigin-cross-origin-window-open-exception.php [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-allow-same-suborigin-access.html [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-blocked-different-suborigins.html [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-blocked-not-in-suborigin-to-suborigin.php [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-change-document-domain.html [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-cookies.php [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-in-meta-disallowed.html [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-invalid-names.html [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-invalid-options.html [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-meta-set-cookie-disabled.php [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-multiple-suborigins-disallowed.php [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-postmessage.html [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-service-worker-fetch-event.html [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-service-worker-no-xorigin-caching.html [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-storage-dom-access.php [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-unsafe-cookies.php [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-unsafe-postmessage-receive.php [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-unsafe-postmessage-send.html [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-valid-names.html [ Crash ] -crbug.com/591099 http/tests/security/suborigins/suborigin-valid-options.html [ Crash ] +crbug.com/591099 http/tests/security/suborigins/crossorigin/suborigin-cross-origin-window-event-exception.php [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/crossorigin/suborigin-cross-origin-window-open-exception.php [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-allow-same-suborigin-access.html [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-blocked-different-suborigins.html [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-blocked-not-in-suborigin-to-suborigin.php [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-change-document-domain.html [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-cookies.php [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-in-meta-disallowed.html [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-invalid-names.html [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-invalid-options.html [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-meta-set-cookie-disabled.php [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-multiple-suborigins-disallowed.php [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-postmessage.html [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-service-worker-fetch-event.html [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-service-worker-no-xorigin-caching.html [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-storage-dom-access.php [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-unsafe-cookies.php [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-unsafe-postmessage-receive.php [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-unsafe-postmessage-send.html [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-valid-names.html [ Crash Pass ] +crbug.com/591099 http/tests/security/suborigins/suborigin-valid-options.html [ Crash Pass ] crbug.com/591099 http/tests/security/subresourceIntegrity/integrity-attribute.html [ Failure ] -crbug.com/591099 http/tests/security/subresourceIntegrity/subresource-integrity-not-enforced.html [ Crash ] +crbug.com/591099 http/tests/security/subresourceIntegrity/subresource-integrity-not-enforced.html [ Crash Pass ] crbug.com/591099 http/tests/security/subresourceIntegrity/subresource-integrity-style-allowed.html [ Failure ] crbug.com/591099 http/tests/security/subresourceIntegrity/subresource-integrity-style-blocked.html [ Failure ] -crbug.com/591099 http/tests/security/svg-image-with-cached-remote-image.html [ Crash ] +crbug.com/591099 http/tests/security/svg-image-with-cached-remote-image.html [ Crash Pass ] crbug.com/591099 http/tests/security/synchronous-frame-load-in-javascript-url-inherits-correct-origin.html [ Failure ] crbug.com/591099 http/tests/security/text-track-crossorigin.html [ Failure ] -crbug.com/591099 http/tests/security/upgrade-insecure-requests/form-upgrade.html [ Crash ] -crbug.com/591099 http/tests/security/upgrade-insecure-requests/https-header-nested.html [ Crash ] -crbug.com/591099 http/tests/security/upgrade-insecure-requests/iframe-upgrade.https.html [ Crash ] +crbug.com/591099 http/tests/security/upgrade-insecure-requests/form-upgrade.html [ Crash Pass ] +crbug.com/591099 http/tests/security/upgrade-insecure-requests/https-header-nested.html [ Crash Pass ] +crbug.com/591099 http/tests/security/upgrade-insecure-requests/iframe-upgrade.https.html [ Crash Pass ] crbug.com/591099 http/tests/security/vibration/vibrate-in-cross-origin-iframe-with-user-gesture-allowed.html [ Failure ] crbug.com/591099 http/tests/security/vibration/vibrate-in-same-origin-iframe-with-user-gesture-allowed.html [ Failure ] -crbug.com/591099 http/tests/security/vibration/vibrate-on-top-page-before-during-after-user-gesture.html [ Crash ] -crbug.com/591099 http/tests/security/video-cross-origin-readback.html [ Crash ] -crbug.com/591099 http/tests/security/video-cross-origin-via-dom.html [ Crash ] +crbug.com/591099 http/tests/security/vibration/vibrate-on-top-page-before-during-after-user-gesture.html [ Crash Pass ] +crbug.com/591099 http/tests/security/video-cross-origin-readback.html [ Crash Pass ] +crbug.com/591099 http/tests/security/video-cross-origin-via-dom.html [ Crash Pass ] crbug.com/591099 http/tests/security/video-poster-cross-origin-crash2.html [ Crash Failure ] crbug.com/591099 http/tests/security/webgl-cross-origin-ImageBitmap-blocked.html [ Failure ] crbug.com/591099 http/tests/security/window-onerror-exception-in-iframe.html [ Failure ] @@ -15773,34 +15781,34 @@ crbug.com/591099 http/tests/sendbeacon/beacon-detached-no-crash.html [ Failure ] crbug.com/591099 http/tests/sendbeacon/beacon-same-origin.html [ Failure ] crbug.com/591099 http/tests/serviceworker/ServiceWorkerGlobalScope/registration-attribute.html [ Failure Pass ] -crbug.com/591099 http/tests/serviceworker/chromium/frame-detached-by-navigation.html [ Crash ] +crbug.com/591099 http/tests/serviceworker/chromium/frame-detached-by-navigation.html [ Crash Failure ] crbug.com/591099 http/tests/serviceworker/chromium/resolve-after-window-close.html [ Crash Failure ] crbug.com/591099 http/tests/serviceworker/chromium/service-worker-gc.html [ Failure ] crbug.com/591099 http/tests/serviceworker/chromium/window-close-during-registration.html [ Failure ] crbug.com/591099 http/tests/serviceworker/webexposed/global-interface-listing-service-worker.html [ Pass Timeout ] crbug.com/591099 http/tests/shapes/shape-outside-image-shape-margin.html [ Failure ] crbug.com/591099 http/tests/shapes/shape-outside-svg-image-shape-margin.html [ Failure ] -crbug.com/591099 http/tests/subresource_filter/image-disallowed-after-redirect.html [ Crash ] -crbug.com/591099 http/tests/subresource_filter/image-disallowed.html [ Crash ] -crbug.com/591099 http/tests/subresource_filter/picture-disallowed.html [ Crash ] -crbug.com/591099 http/tests/svg/svg-in-object-in-sandboxed-iframe.html [ Crash ] -crbug.com/591099 http/tests/svg/use-contenttype-blocked.html [ Crash ] -crbug.com/591099 http/tests/svg/use-no-contenttype-blocked.html [ Crash ] +crbug.com/591099 http/tests/subresource_filter/image-disallowed-after-redirect.html [ Crash Pass ] +crbug.com/591099 http/tests/subresource_filter/image-disallowed.html [ Crash Pass ] +crbug.com/591099 http/tests/subresource_filter/picture-disallowed.html [ Crash Pass ] +crbug.com/591099 http/tests/svg/svg-in-object-in-sandboxed-iframe.html [ Crash Pass ] +crbug.com/591099 http/tests/svg/use-contenttype-blocked.html [ Crash Pass ] +crbug.com/591099 http/tests/svg/use-no-contenttype-blocked.html [ Crash Pass ] crbug.com/591099 http/tests/text-autosizing/narrow-iframe.html [ Failure ] crbug.com/591099 http/tests/text-autosizing/wide-iframe.html [ Failure ] crbug.com/591099 http/tests/uri/css-href.php [ Failure ] crbug.com/591099 http/tests/uri/escaped-entity.html [ Failure ] crbug.com/591099 http/tests/uri/resolve-encoding-relative.html [ Failure ] crbug.com/591099 http/tests/uri/utf8-path.html [ Failure ] -crbug.com/591099 http/tests/w3c/webperf/approved/navigation-timing/html/test_performance_attributes_exist_in_object.html [ Crash ] +crbug.com/591099 http/tests/w3c/webperf/approved/navigation-timing/html/test_performance_attributes_exist_in_object.html [ Crash Pass ] crbug.com/591099 http/tests/w3c/webperf/submission/Google/resource-timing/html/test_resource_ignore_failures.html [ Crash Pass ] -crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect.html [ Crash ] -crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain.html [ Crash ] -crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain_allow_timing.html [ Crash ] -crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_with_timing_allow_origin.html [ Crash ] -crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_resource_request.html [ Crash ] -crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_same_origin_redirect.html [ Crash ] -crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_timing_allow_cross_origin_resource_request.html [ Crash ] +crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect.html [ Crash Pass ] +crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain.html [ Crash Pass ] +crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain_allow_timing.html [ Crash Pass ] +crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_with_timing_allow_origin.html [ Crash Pass ] +crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_resource_request.html [ Crash Pass ] +crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_same_origin_redirect.html [ Crash Pass ] +crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_timing_allow_cross_origin_resource_request.html [ Crash Pass ] crbug.com/591099 http/tests/webaudio/autoplay-crossorigin.html [ Timeout ] crbug.com/591099 http/tests/webfont/fallback-font-while-loading.html [ Failure ] crbug.com/591099 http/tests/webfont/popup-menu-load-webfont-after-open.html [ Failure ] @@ -15835,7 +15843,7 @@ crbug.com/591099 http/tests/websocket/connect-error-by-no-websocket-server-closeonerror.html [ Failure ] crbug.com/591099 http/tests/websocket/connect-error-by-no-websocket-server-noclose.html [ Failure ] crbug.com/591099 http/tests/websocket/connection-throttling.html [ Failure ] -crbug.com/591099 http/tests/websocket/construct-in-detached-frame.html [ Crash ] +crbug.com/591099 http/tests/websocket/construct-in-detached-frame.html [ Crash Failure ] crbug.com/591099 http/tests/websocket/cookie-http-to-ws.pl [ Failure ] crbug.com/591099 http/tests/websocket/cookie-ws-to-ws.html [ Failure ] crbug.com/591099 http/tests/websocket/cross-origin.html [ Failure ] @@ -15956,7 +15964,7 @@ crbug.com/591099 http/tests/workers/worker-invalid-url.html [ Failure ] crbug.com/591099 http/tests/workers/worker-redirect.html [ Failure ] crbug.com/591099 http/tests/workers/worker-workerScriptNotThere.html [ Failure ] -crbug.com/591099 http/tests/worklet/chromium/import-on-detached-iframe.html [ Crash ] +crbug.com/591099 http/tests/worklet/chromium/import-on-detached-iframe.html [ Crash Pass ] crbug.com/591099 http/tests/xmlhttprequest/XMLHttpRequestException.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/abort-should-destroy-responseText.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/access-control-allow-lists-starting-with-comma.html [ Failure ] @@ -15976,7 +15984,7 @@ crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-301.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-400.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-501.html [ Failure ] -crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-must-not-contain-cookie.html [ Crash ] +crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-must-not-contain-cookie.html [ Crash Pass ] crbug.com/591099 http/tests/xmlhttprequest/access-control-response-with-body-sync.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/access-control-response-with-body.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/access-control-response-with-expose-headers.html [ Failure ] @@ -15998,9 +16006,9 @@ crbug.com/591099 http/tests/xmlhttprequest/cross-origin-preflight-get-response-type-blob.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/cross-origin-preflight-get.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/cross-origin-unsupported-url.html [ Failure ] -crbug.com/591099 http/tests/xmlhttprequest/destroy-context-in-onloadstart.html [ Crash ] +crbug.com/591099 http/tests/xmlhttprequest/destroy-context-in-onloadstart.html [ Crash Pass ] crbug.com/591099 http/tests/xmlhttprequest/detaching-frame-2.html [ Failure ] -crbug.com/591099 http/tests/xmlhttprequest/detaching-frame.html [ Crash ] +crbug.com/591099 http/tests/xmlhttprequest/detaching-frame.html [ Crash Failure ] crbug.com/591099 http/tests/xmlhttprequest/docLoaderFrame.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/duplicate-revalidation-reload.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/encode-request-url-2.html [ Crash Failure ] @@ -16013,7 +16021,7 @@ crbug.com/591099 http/tests/xmlhttprequest/failed-auth.html [ Crash Failure ] crbug.com/591099 http/tests/xmlhttprequest/filename-encoding.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/frame-load-cancelled-abort.html [ Crash Failure ] -crbug.com/591099 http/tests/xmlhttprequest/frame-unload-abort-crash.html [ Crash ] +crbug.com/591099 http/tests/xmlhttprequest/frame-unload-abort-crash.html [ Crash Failure ] crbug.com/591099 http/tests/xmlhttprequest/get-dangerous-headers.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/getAllResponseHeaders.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/getResponseHeader.html [ Failure ] @@ -16025,7 +16033,7 @@ crbug.com/591099 http/tests/xmlhttprequest/methods-async.html [ Crash Failure ] crbug.com/591099 http/tests/xmlhttprequest/methods-lower-case.html [ Crash Failure ] crbug.com/591099 http/tests/xmlhttprequest/methods.html [ Crash Failure ] -crbug.com/591099 http/tests/xmlhttprequest/navigation-abort-detaches-frame.html [ Crash Timeout ] +crbug.com/591099 http/tests/xmlhttprequest/navigation-abort-detaches-frame.html [ Crash Pass Timeout ] crbug.com/591099 http/tests/xmlhttprequest/newline-in-request-uri.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/null-auth.php [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/onabort-event.html [ Failure ] @@ -16115,7 +16123,7 @@ crbug.com/591099 http/tests/xmlhttprequest/request-encoding.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/request-encoding2.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/request-encoding3.html [ Failure ] -crbug.com/591099 http/tests/xmlhttprequest/request-encoding4.html [ Crash ] +crbug.com/591099 http/tests/xmlhttprequest/request-encoding4.html [ Crash Failure ] crbug.com/591099 http/tests/xmlhttprequest/request-from-popup.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/response-array-buffer-abort-in-loading-state.html [ Failure ] crbug.com/591099 http/tests/xmlhttprequest/response-blob-abort-in-loading-state.html [ Failure ] @@ -16321,7 +16329,7 @@ crbug.com/591099 images/cross-fade-svg-size-diff.html [ Failure Pass ] crbug.com/591099 images/cross-fade-svg-size.html [ Failure Pass ] crbug.com/591099 images/cross-fade-tiled.html [ Failure ] -crbug.com/591099 images/destroyed-image-load-event.html [ Crash ] +crbug.com/591099 images/destroyed-image-load-event.html [ Crash Failure ] crbug.com/591099 images/drag-svg-image.html [ Failure ] crbug.com/591099 images/embed-does-not-propagate-dimensions-to-object-ancestor.html [ Failure Pass ] crbug.com/591099 images/exif-orientation-css.html [ Crash Failure ] @@ -16337,7 +16345,7 @@ crbug.com/591099 images/icon-0colors.html [ Failure ] crbug.com/591099 images/icon-decoding.html [ Failure ] crbug.com/591099 images/image-change-src.html [ Crash Pass ] -crbug.com/591099 images/image-change-without-resize-shouldnt-layout.html [ Crash ] +crbug.com/591099 images/image-change-without-resize-shouldnt-layout.html [ Crash Pass ] crbug.com/591099 images/image-click-scale-restore-zoomed-image.html [ Failure ] crbug.com/591099 images/image-css3-content-data.html [ Failure ] crbug.com/591099 images/image-document-write-assert.html [ Failure ] @@ -16352,7 +16360,7 @@ crbug.com/591099 images/image-map-zoom-alt-content.html [ Crash Failure ] crbug.com/591099 images/image-map-zoom.html [ Failure ] crbug.com/591099 images/image-page-injected-script-crash.html [ Crash Failure ] -crbug.com/591099 images/image-use-counters.html [ Crash ] +crbug.com/591099 images/image-use-counters.html [ Crash Pass ] crbug.com/591099 images/image-zoom-to-25.html [ Failure ] crbug.com/591099 images/image-zoom-to-500.html [ Failure ] crbug.com/591099 images/imagemap-circle-focus-ring.html [ Failure ] @@ -16368,17 +16376,17 @@ crbug.com/591099 images/imagemap-overflowing-circle-focus-ring.html [ Failure ] crbug.com/591099 images/imagemap-overflowing-polygon-focus-ring.html [ Failure ] crbug.com/591099 images/imagemap-polygon-focus-ring.html [ Failure ] -crbug.com/591099 images/imagemap-scroll.html [ Crash ] -crbug.com/591099 images/img-dimensions-styled.html [ Crash ] -crbug.com/591099 images/invalid-image-url-crash.html [ Crash ] +crbug.com/591099 images/imagemap-scroll.html [ Crash Failure ] +crbug.com/591099 images/img-dimensions-styled.html [ Crash Pass ] +crbug.com/591099 images/invalid-image-url-crash.html [ Crash Pass ] crbug.com/591099 images/jpeg-yuv-image-decoding.html [ Failure Pass ] crbug.com/591099 images/jpeg-yuv-progressive-canvas.html [ Failure Pass ] crbug.com/591099 images/jpeg-yuv-progressive-image.html [ Failure Pass ] crbug.com/591099 images/link-body-content-imageDimensionChanged-crash.html [ Failure ] crbug.com/591099 images/load-img-with-empty-src.html [ Failure ] crbug.com/591099 images/motion-jpeg-single-frame.html [ Failure ] -crbug.com/591099 images/move-image-to-new-document.html [ Crash ] -crbug.com/591099 images/multiple-inflight-error-event-crash.html [ Crash ] +crbug.com/591099 images/move-image-to-new-document.html [ Crash Pass ] +crbug.com/591099 images/multiple-inflight-error-event-crash.html [ Crash Pass ] crbug.com/591099 images/pdf-as-background.html [ Failure ] crbug.com/591099 images/pdf-as-tiled-background.html [ Failure ] crbug.com/591099 images/percent-height-image.html [ Failure ] @@ -16397,15 +16405,15 @@ crbug.com/591099 images/script-counter-imageDimensionChanged-crash.html [ Failure ] crbug.com/591099 images/sprite-no-bleed.html [ Failure ] crbug.com/591099 images/style-access-during-imageChanged-crash.html [ Crash Failure ] -crbug.com/591099 images/style-access-during-imageChanged-style-freeze.html [ Crash ] +crbug.com/591099 images/style-access-during-imageChanged-style-freeze.html [ Crash Pass ] crbug.com/591099 images/text-content-crash-2.html [ Failure ] crbug.com/591099 images/text-content-crash.html [ Failure ] -crbug.com/591099 images/update-alt-text.html [ Crash ] +crbug.com/591099 images/update-alt-text.html [ Crash Pass ] crbug.com/591099 images/viewport-in-standalone-image-document.html [ Failure ] -crbug.com/591099 images/webgl-teximage2d.html [ Crash ] +crbug.com/591099 images/webgl-teximage2d.html [ Crash Pass ] crbug.com/591099 images/webp-flip.html [ Failure ] crbug.com/591099 images/zoomed-img-size.html [ Failure ] -crbug.com/591099 images/zoomed-offset-size.html [ Crash ] +crbug.com/591099 images/zoomed-offset-size.html [ Crash Pass ] crbug.com/591099 inspector-enabled/console/console-uncaught-promise-no-inspector.html [ Failure ] crbug.com/591099 inspector-enabled/sources/debugger/linkifier.html [ Failure ] crbug.com/591099 inspector-enabled/sources/debugger/script-formatter-breakpoints-1.html [ Failure ] @@ -16447,14 +16455,14 @@ crbug.com/591099 inspector-protocol/layers/paint-profiler.js [ Failure ] crbug.com/591099 inspector-protocol/layout-fonts/languages-emoji-rare-glyphs.html [ Failure ] crbug.com/591099 inspector/agents-enable-disable.html [ Failure ] -crbug.com/591099 inspector/animation/animation-KeyframeEffectReadOnly-crash.html [ Crash ] +crbug.com/591099 inspector/animation/animation-KeyframeEffectReadOnly-crash.html [ Crash Failure ] crbug.com/591099 inspector/animation/animation-empty-web-animations.html [ Crash Failure ] -crbug.com/591099 inspector/animation/animation-group-matching-animations.html [ Crash ] -crbug.com/591099 inspector/animation/animation-group-matching-transitions.html [ Crash ] -crbug.com/591099 inspector/animation/animation-group-matching.html [ Crash ] -crbug.com/591099 inspector/animation/animation-timeline.html [ Crash ] +crbug.com/591099 inspector/animation/animation-group-matching-animations.html [ Crash Failure ] +crbug.com/591099 inspector/animation/animation-group-matching-transitions.html [ Crash Failure ] +crbug.com/591099 inspector/animation/animation-group-matching.html [ Crash Failure ] +crbug.com/591099 inspector/animation/animation-timeline.html [ Crash Failure ] crbug.com/591099 inspector/animation/animation-transition-setTiming-crash.html [ Crash Failure ] -crbug.com/591099 inspector/animation/animation-web-anim-negative-start-time.html [ Crash ] +crbug.com/591099 inspector/animation/animation-web-anim-negative-start-time.html [ Crash Failure ] crbug.com/591099 inspector/audits/audits-empty-stylesheet.html [ Crash Failure ] crbug.com/591099 inspector/audits/audits-panel-functional.html [ Crash Failure ] crbug.com/591099 inspector/changes/changes-highlighter.html [ Crash Failure Timeout ] @@ -16484,9 +16492,9 @@ crbug.com/591099 inspector/components/widget-events.html [ Failure ] crbug.com/591099 inspector/components/widget-focus.html [ Failure ] crbug.com/591099 inspector/console-document-write-from-external-script-logging.html [ Failure ] -crbug.com/591099 inspector/console/alert-toString-exception.html [ Crash ] +crbug.com/591099 inspector/console/alert-toString-exception.html [ Crash Failure ] crbug.com/591099 inspector/console/command-line-api-getEventListeners.html [ Crash Failure ] -crbug.com/591099 inspector/console/command-line-api.html [ Crash ] +crbug.com/591099 inspector/console/command-line-api.html [ Crash Failure ] crbug.com/591099 inspector/console/console-Object-overwritten.html [ Failure ] crbug.com/591099 inspector/console/console-api-on-call-frame.html [ Crash Failure ] crbug.com/591099 inspector/console/console-assert.html [ Failure ] @@ -16500,7 +16508,7 @@ crbug.com/591099 inspector/console/console-context-selector.html [ Crash Failure ] crbug.com/591099 inspector/console/console-control-characters.html [ Failure ] crbug.com/591099 inspector/console/console-copy-treeoutline.html [ Failure ] -crbug.com/591099 inspector/console/console-copy-truncated-text.html [ Crash ] +crbug.com/591099 inspector/console/console-copy-truncated-text.html [ Crash Failure ] crbug.com/591099 inspector/console/console-correct-suggestions.html [ Failure ] crbug.com/591099 inspector/console/console-custom-formatters.html [ Failure ] crbug.com/591099 inspector/console/console-dir-deprecated.html [ Failure ] @@ -16516,14 +16524,14 @@ crbug.com/591099 inspector/console/console-eval-fake.html [ Crash Failure ] crbug.com/591099 inspector/console/console-eval-global.html [ Failure ] crbug.com/591099 inspector/console/console-eval-object-literal.html [ Failure ] -crbug.com/591099 inspector/console/console-eval-scoped.html [ Crash ] +crbug.com/591099 inspector/console/console-eval-scoped.html [ Crash Failure ] crbug.com/591099 inspector/console/console-eval-syntax-error.html [ Failure ] -crbug.com/591099 inspector/console/console-eval-throw.html [ Crash ] +crbug.com/591099 inspector/console/console-eval-throw.html [ Crash Failure ] crbug.com/591099 inspector/console/console-eval-undefined-override.html [ Failure ] crbug.com/591099 inspector/console/console-eval.html [ Failure ] crbug.com/591099 inspector/console/console-export.html [ Failure ] crbug.com/591099 inspector/console/console-external-array.html [ Failure ] -crbug.com/591099 inspector/console/console-filter-level-test.html [ Crash ] +crbug.com/591099 inspector/console/console-filter-level-test.html [ Crash Failure ] crbug.com/591099 inspector/console/console-filter-test.html [ Failure ] crbug.com/591099 inspector/console/console-focus.html [ Failure ] crbug.com/591099 inspector/console/console-format-array-prototype.html [ Crash Failure ] @@ -16540,7 +16548,7 @@ crbug.com/591099 inspector/console/console-functions.html [ Failure ] crbug.com/591099 inspector/console/console-history-contains-requested-text.html [ Failure ] crbug.com/591099 inspector/console/console-last-result.html [ Failure ] -crbug.com/591099 inspector/console/console-link-to-snippet.html [ Crash ] +crbug.com/591099 inspector/console/console-link-to-snippet.html [ Crash Failure ] crbug.com/591099 inspector/console/console-linkify-message-location.html [ Failure ] crbug.com/591099 inspector/console/console-log-before-inspector-open.html [ Failure ] crbug.com/591099 inspector/console/console-log-custom-elements.html [ Failure ] @@ -16568,11 +16576,11 @@ crbug.com/591099 inspector/console/console-proxy.html [ Failure ] crbug.com/591099 inspector/console/console-repeat-count.html [ Failure ] crbug.com/591099 inspector/console/console-retain-autocomplete-on-typing.html [ Crash Failure ] -crbug.com/591099 inspector/console/console-revoke-error-in-worker.html [ Crash ] -crbug.com/591099 inspector/console/console-revoke-error.html [ Crash ] +crbug.com/591099 inspector/console/console-revoke-error-in-worker.html [ Crash Failure ] +crbug.com/591099 inspector/console/console-revoke-error.html [ Crash Failure ] crbug.com/591099 inspector/console/console-save-to-temp-var.html [ Failure ] crbug.com/591099 inspector/console/console-search-reveals-messages.html [ Failure ] -crbug.com/591099 inspector/console/console-search.html [ Crash ] +crbug.com/591099 inspector/console/console-search.html [ Crash Failure ] crbug.com/591099 inspector/console/console-smart-enter.html [ Failure ] crbug.com/591099 inspector/console/console-stack-overflow.html [ Failure ] crbug.com/591099 inspector/console/console-string-format.html [ Failure ] @@ -16600,18 +16608,18 @@ crbug.com/591099 inspector/console/function-name-in-console-message-stack.html [ Failure ] crbug.com/591099 inspector/console/inspect-html-all-collection.html [ Failure ] crbug.com/591099 inspector/console/paintworklet-console-selector.html [ Failure ] -crbug.com/591099 inspector/console/shadow-element.html [ Crash ] +crbug.com/591099 inspector/console/shadow-element.html [ Crash Failure ] crbug.com/591099 inspector/console/worker-eval-contains-stack.html [ Failure ] crbug.com/591099 inspector/cookie-resource-match.html [ Failure ] -crbug.com/591099 inspector/coverage/coverage-repeated.html [ Crash ] -crbug.com/591099 inspector/coverage/coverage-view-filter.html [ Crash ] -crbug.com/591099 inspector/coverage/coverage-view.html [ Crash ] -crbug.com/591099 inspector/coverage/decorations-after-script-formatter.html [ Crash ] +crbug.com/591099 inspector/coverage/coverage-repeated.html [ Crash Failure ] +crbug.com/591099 inspector/coverage/coverage-view-filter.html [ Crash Failure ] +crbug.com/591099 inspector/coverage/coverage-view.html [ Crash Failure ] +crbug.com/591099 inspector/coverage/decorations-after-script-formatter.html [ Crash Failure ] crbug.com/591099 inspector/coverage/gutter-css.html [ Crash Failure ] -crbug.com/591099 inspector/coverage/gutter-html.html [ Crash ] +crbug.com/591099 inspector/coverage/gutter-html.html [ Crash Failure ] crbug.com/591099 inspector/coverage/gutter-js.html [ Crash Failure ] -crbug.com/591099 inspector/coverage/multiple-instances-merge.html [ Crash ] -crbug.com/591099 inspector/coverage/reveal-autoformat.html [ Crash ] +crbug.com/591099 inspector/coverage/multiple-instances-merge.html [ Crash Failure ] +crbug.com/591099 inspector/coverage/reveal-autoformat.html [ Crash Failure ] crbug.com/591099 inspector/coverage/segments-merge.html [ Crash Failure ] crbug.com/591099 inspector/curl-command.html [ Failure ] crbug.com/591099 inspector/database-table-name-excaping.html [ Failure ] @@ -16639,224 +16647,224 @@ crbug.com/591099 inspector/editor/text-editor-smart-braces.html [ Crash Failure ] crbug.com/591099 inspector/editor/text-editor-token-at-position.html [ Crash Failure ] crbug.com/591099 inspector/editor/text-editor-word-jumps.html [ Crash Failure Timeout ] -crbug.com/591099 inspector/elements/accessibility/autocomplete-attribute.html [ Crash Timeout ] -crbug.com/591099 inspector/elements/accessibility/edit-aria-attributes.html [ Crash Timeout ] -crbug.com/591099 inspector/elements/attribute-modified-ns.html [ Crash ] -crbug.com/591099 inspector/elements/bidi-dom-tree.html [ Crash ] -crbug.com/591099 inspector/elements/breadcrumb-updates.html [ Crash ] -crbug.com/591099 inspector/elements/css-rule-hover-highlights-selectors.html [ Crash ] -crbug.com/591099 inspector/elements/dom-agent-query-selector.html [ Crash ] +crbug.com/591099 inspector/elements/accessibility/autocomplete-attribute.html [ Crash Failure Timeout ] +crbug.com/591099 inspector/elements/accessibility/edit-aria-attributes.html [ Crash Failure Timeout ] +crbug.com/591099 inspector/elements/attribute-modified-ns.html [ Crash Failure ] +crbug.com/591099 inspector/elements/bidi-dom-tree.html [ Crash Failure ] +crbug.com/591099 inspector/elements/breadcrumb-updates.html [ Crash Failure ] +crbug.com/591099 inspector/elements/css-rule-hover-highlights-selectors.html [ Crash Pass ] +crbug.com/591099 inspector/elements/dom-agent-query-selector.html [ Crash Failure ] crbug.com/591099 inspector/elements/dom-search-crash.html [ Crash Failure ] -crbug.com/591099 inspector/elements/edit/delete-from-document.html [ Crash ] -crbug.com/591099 inspector/elements/edit/edit-dom-actions-1.html [ Crash ] +crbug.com/591099 inspector/elements/edit/delete-from-document.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/edit-dom-actions-1.html [ Crash Timeout ] crbug.com/591099 inspector/elements/edit/edit-dom-actions-2.html [ Crash Timeout ] -crbug.com/591099 inspector/elements/edit/edit-dom-actions-3.html [ Crash ] -crbug.com/591099 inspector/elements/edit/edit-dom-actions-4.html [ Crash ] -crbug.com/591099 inspector/elements/edit/edit-dom-actions-shadow-1.html [ Crash ] -crbug.com/591099 inspector/elements/edit/edit-dom-actions-shadow-2.html [ Crash ] -crbug.com/591099 inspector/elements/edit/edit-style-attribute.html [ Crash ] -crbug.com/591099 inspector/elements/edit/edit-trimmed-attribute-value.html [ Crash ] -crbug.com/591099 inspector/elements/edit/insert-node-collapsed.html [ Crash ] -crbug.com/591099 inspector/elements/edit/perform-undo-undo.html [ Crash ] -crbug.com/591099 inspector/elements/edit/remove-node.html [ Crash ] +crbug.com/591099 inspector/elements/edit/edit-dom-actions-3.html [ Crash Timeout ] +crbug.com/591099 inspector/elements/edit/edit-dom-actions-4.html [ Crash Timeout ] +crbug.com/591099 inspector/elements/edit/edit-dom-actions-shadow-1.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/edit-dom-actions-shadow-2.html [ Crash Timeout ] +crbug.com/591099 inspector/elements/edit/edit-style-attribute.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/edit-trimmed-attribute-value.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/insert-node-collapsed.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/perform-undo-undo.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/remove-node.html [ Crash Failure Timeout ] crbug.com/591099 inspector/elements/edit/set-attribute-non-html.svg [ Crash Failure ] -crbug.com/591099 inspector/elements/edit/set-attribute.html [ Crash ] -crbug.com/591099 inspector/elements/edit/set-outer-html-2.html [ Crash ] -crbug.com/591099 inspector/elements/edit/set-outer-html-body.html [ Crash ] -crbug.com/591099 inspector/elements/edit/set-outer-html-for-xhtml.xhtml [ Crash ] -crbug.com/591099 inspector/elements/edit/set-outer-html.html [ Crash ] -crbug.com/591099 inspector/elements/edit/shadow-dom-modify-chardata.html [ Crash ] -crbug.com/591099 inspector/elements/edit/switch-panels-while-editing-as-html.html [ Crash ] -crbug.com/591099 inspector/elements/edit/undo-dom-edits-2.html [ Crash ] -crbug.com/591099 inspector/elements/edit/undo-dom-edits.html [ Crash ] -crbug.com/591099 inspector/elements/edit/undo-set-outer-html-2.html [ Crash ] -crbug.com/591099 inspector/elements/edit/undo-set-outer-html.html [ Crash ] -crbug.com/591099 inspector/elements/elements-css-path.html [ Crash ] -crbug.com/591099 inspector/elements/elements-delete-inline-style.html [ Crash ] -crbug.com/591099 inspector/elements/elements-hide-html-comments.html [ Crash ] -crbug.com/591099 inspector/elements/elements-img-tooltip.html [ Crash ] -crbug.com/591099 inspector/elements/elements-inspect-iframe-from-different-domain.html [ Crash ] -crbug.com/591099 inspector/elements/elements-panel-correct-case.html [ Crash ] -crbug.com/591099 inspector/elements/elements-panel-limited-children.html [ Crash ] -crbug.com/591099 inspector/elements/elements-panel-reload-assert.html [ Crash Timeout ] -crbug.com/591099 inspector/elements/elements-panel-restore-selection-when-node-comes-later.html [ Crash ] -crbug.com/591099 inspector/elements/elements-panel-rewrite-href.html [ Crash ] -crbug.com/591099 inspector/elements/elements-panel-search.html [ Crash ] -crbug.com/591099 inspector/elements/elements-panel-selection-after-delete.html [ Crash ] -crbug.com/591099 inspector/elements/elements-panel-selection-on-refresh.html [ Crash ] -crbug.com/591099 inspector/elements/elements-panel-structure.html [ Crash ] -crbug.com/591099 inspector/elements/elements-panel-styles.html [ Crash ] +crbug.com/591099 inspector/elements/edit/set-attribute.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/set-outer-html-2.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/set-outer-html-body.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/set-outer-html-for-xhtml.xhtml [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/set-outer-html.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/shadow-dom-modify-chardata.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/switch-panels-while-editing-as-html.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/undo-dom-edits-2.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/undo-dom-edits.html [ Crash Failure Timeout ] +crbug.com/591099 inspector/elements/edit/undo-set-outer-html-2.html [ Crash Failure ] +crbug.com/591099 inspector/elements/edit/undo-set-outer-html.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-css-path.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-delete-inline-style.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-hide-html-comments.html [ Crash Pass ] +crbug.com/591099 inspector/elements/elements-img-tooltip.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-inspect-iframe-from-different-domain.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-panel-correct-case.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-panel-limited-children.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-panel-reload-assert.html [ Crash Failure Timeout ] +crbug.com/591099 inspector/elements/elements-panel-restore-selection-when-node-comes-later.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-panel-rewrite-href.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-panel-search.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-panel-selection-after-delete.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-panel-selection-on-refresh.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-panel-structure.html [ Crash Failure ] +crbug.com/591099 inspector/elements/elements-panel-styles.html [ Crash Failure ] crbug.com/591099 inspector/elements/elements-tab-stops.html [ Crash Failure ] -crbug.com/591099 inspector/elements/elements-treeoutline-copy.html [ Crash ] -crbug.com/591099 inspector/elements/event-listener-sidebar-custom-framework.html [ Crash ] -crbug.com/591099 inspector/elements/event-listener-sidebar-jquery1.html [ Crash ] -crbug.com/591099 inspector/elements/event-listener-sidebar-jquery2.html [ Crash ] -crbug.com/591099 inspector/elements/event-listener-sidebar-remove.html [ Crash ] -crbug.com/591099 inspector/elements/event-listener-sidebar.html [ Crash ] -crbug.com/591099 inspector/elements/event-listeners-about-blank.html [ Crash ] -crbug.com/591099 inspector/elements/expand-recursively.html [ Crash ] -crbug.com/591099 inspector/elements/hide-shortcut.html [ Crash ] -crbug.com/591099 inspector/elements/highlight/highlight-css-shapes-outside-scroll.html [ Crash ] -crbug.com/591099 inspector/elements/highlight/highlight-css-shapes-outside.html [ Crash ] -crbug.com/591099 inspector/elements/highlight/highlight-dom-updates.html [ Crash ] -crbug.com/591099 inspector/elements/highlight/highlight-node-scaled-and-scrolled.html [ Crash ] -crbug.com/591099 inspector/elements/highlight/highlight-node-scaled.html [ Crash ] -crbug.com/591099 inspector/elements/highlight/highlight-node-scroll.html [ Crash ] -crbug.com/591099 inspector/elements/highlight/highlight-node-transformed.html [ Crash ] -crbug.com/591099 inspector/elements/highlight/highlight-node.html [ Crash ] -crbug.com/591099 inspector/elements/highlight/highlight-svg-content-inside-iframe.html [ Crash ] -crbug.com/591099 inspector/elements/highlight/highlight-svg-root-zoomed.html [ Crash ] -crbug.com/591099 inspector/elements/highlight/highlight-svg-root.html [ Crash ] -crbug.com/591099 inspector/elements/iframe-load-event.html [ Crash ] -crbug.com/591099 inspector/elements/inline-style-title.html [ Crash ] -crbug.com/591099 inspector/elements/insert-node.html [ Crash ] -crbug.com/591099 inspector/elements/inspect-mode-after-profiling.html [ Crash ] -crbug.com/591099 inspector/elements/inspect-mode-shadow-text.html [ Crash ] -crbug.com/591099 inspector/elements/inspect-pointer-events-none.html [ Crash ] -crbug.com/591099 inspector/elements/inspect-pseudo-element.html [ Crash Timeout ] -crbug.com/591099 inspector/elements/modify-chardata.html [ Crash ] -crbug.com/591099 inspector/elements/move-node.html [ Crash ] -crbug.com/591099 inspector/elements/node-reselect-on-append-child.html [ Crash ] +crbug.com/591099 inspector/elements/elements-treeoutline-copy.html [ Crash Failure ] +crbug.com/591099 inspector/elements/event-listener-sidebar-custom-framework.html [ Crash Failure ] +crbug.com/591099 inspector/elements/event-listener-sidebar-jquery1.html [ Crash Failure ] +crbug.com/591099 inspector/elements/event-listener-sidebar-jquery2.html [ Crash Failure ] +crbug.com/591099 inspector/elements/event-listener-sidebar-remove.html [ Crash Failure ] +crbug.com/591099 inspector/elements/event-listener-sidebar.html [ Crash Failure ] +crbug.com/591099 inspector/elements/event-listeners-about-blank.html [ Crash Failure ] +crbug.com/591099 inspector/elements/expand-recursively.html [ Crash Failure ] +crbug.com/591099 inspector/elements/hide-shortcut.html [ Crash Failure ] +crbug.com/591099 inspector/elements/highlight/highlight-css-shapes-outside-scroll.html [ Crash Failure ] +crbug.com/591099 inspector/elements/highlight/highlight-css-shapes-outside.html [ Crash Failure ] +crbug.com/591099 inspector/elements/highlight/highlight-dom-updates.html [ Crash Timeout ] +crbug.com/591099 inspector/elements/highlight/highlight-node-scaled-and-scrolled.html [ Crash Failure ] +crbug.com/591099 inspector/elements/highlight/highlight-node-scaled.html [ Crash Failure ] +crbug.com/591099 inspector/elements/highlight/highlight-node-scroll.html [ Crash Failure ] +crbug.com/591099 inspector/elements/highlight/highlight-node-transformed.html [ Crash Pass ] +crbug.com/591099 inspector/elements/highlight/highlight-node.html [ Crash Failure ] +crbug.com/591099 inspector/elements/highlight/highlight-svg-content-inside-iframe.html [ Crash Pass ] +crbug.com/591099 inspector/elements/highlight/highlight-svg-root-zoomed.html [ Crash Failure ] +crbug.com/591099 inspector/elements/highlight/highlight-svg-root.html [ Crash Failure ] +crbug.com/591099 inspector/elements/iframe-load-event.html [ Crash Failure ] +crbug.com/591099 inspector/elements/inline-style-title.html [ Crash Failure ] +crbug.com/591099 inspector/elements/insert-node.html [ Crash Failure ] +crbug.com/591099 inspector/elements/inspect-mode-after-profiling.html [ Crash Failure ] +crbug.com/591099 inspector/elements/inspect-mode-shadow-text.html [ Crash Failure ] +crbug.com/591099 inspector/elements/inspect-pointer-events-none.html [ Crash Timeout ] +crbug.com/591099 inspector/elements/inspect-pseudo-element.html [ Crash Pass Timeout ] +crbug.com/591099 inspector/elements/modify-chardata.html [ Crash Failure ] +crbug.com/591099 inspector/elements/move-node.html [ Crash Failure ] +crbug.com/591099 inspector/elements/node-reselect-on-append-child.html [ Crash Failure ] crbug.com/591099 inspector/elements/node-xpath.xhtml [ Crash Failure ] -crbug.com/591099 inspector/elements/resolve-alien-node.html [ Crash ] -crbug.com/591099 inspector/elements/resolve-node-blocked.html [ Crash ] -crbug.com/591099 inspector/elements/reveal-whitespace-text-node.html [ Crash ] -crbug.com/591099 inspector/elements/selected-element-changes-execution-context.html [ Crash ] -crbug.com/591099 inspector/elements/shadow/breadcrumb-shadow-roots.html [ Crash ] -crbug.com/591099 inspector/elements/shadow/create-shadow-root.html [ Crash Timeout ] -crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-1.html [ Crash ] -crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-2.html [ Crash ] -crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-3.html [ Crash ] -crbug.com/591099 inspector/elements/shadow/inspect-deep-shadow-element.html [ Crash ] -crbug.com/591099 inspector/elements/shadow/reveal-shadow-dom-node.html [ Crash ] -crbug.com/591099 inspector/elements/shadow/shadow-distribution.html [ Crash ] -crbug.com/591099 inspector/elements/shadow/shadow-host-display-modes.html [ Crash ] -crbug.com/591099 inspector/elements/shadow/shadow-root.html [ Crash ] -crbug.com/591099 inspector/elements/shadow/update-shadowdom.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/add-new-rule-inline-style-csp.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/add-new-rule-invalid-selector.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/add-new-rule-with-style-after-body.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/cached-sync-computed-styles.html [ Crash ] +crbug.com/591099 inspector/elements/resolve-alien-node.html [ Crash Failure ] +crbug.com/591099 inspector/elements/resolve-node-blocked.html [ Crash Failure ] +crbug.com/591099 inspector/elements/reveal-whitespace-text-node.html [ Crash Failure ] +crbug.com/591099 inspector/elements/selected-element-changes-execution-context.html [ Crash Failure ] +crbug.com/591099 inspector/elements/shadow/breadcrumb-shadow-roots.html [ Crash Failure ] +crbug.com/591099 inspector/elements/shadow/create-shadow-root.html [ Crash Failure Timeout ] +crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-1.html [ Crash Failure ] +crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-2.html [ Crash Failure ] +crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-3.html [ Crash Failure ] +crbug.com/591099 inspector/elements/shadow/inspect-deep-shadow-element.html [ Crash Failure ] +crbug.com/591099 inspector/elements/shadow/reveal-shadow-dom-node.html [ Crash Failure ] +crbug.com/591099 inspector/elements/shadow/shadow-distribution.html [ Crash Timeout ] +crbug.com/591099 inspector/elements/shadow/shadow-host-display-modes.html [ Crash Failure ] +crbug.com/591099 inspector/elements/shadow/shadow-root.html [ Crash Failure ] +crbug.com/591099 inspector/elements/shadow/update-shadowdom.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/add-new-rule-inline-style-csp.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/add-new-rule-invalid-selector.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/add-new-rule-with-style-after-body.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/cached-sync-computed-styles.html [ Crash Failure ] crbug.com/591099 inspector/elements/styles-1/case-sensitive-suggestions.html [ Crash Failure Timeout ] -crbug.com/591099 inspector/elements/styles-1/color-aware-property-value-edit.html [ Crash ] +crbug.com/591099 inspector/elements/styles-1/color-aware-property-value-edit.html [ Crash Failure ] crbug.com/591099 inspector/elements/styles-1/color-nicknames-lowercase.html [ Crash Failure ] -crbug.com/591099 inspector/elements/styles-1/color-swatch.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/commit-selector-mark-matching.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/commit-selector.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/css-live-edit.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/css-outline.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/cssom-media-insert-crash.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/disable-property-workingcopy-update.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/dynamic-style-tag.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/edit-inspector-stylesheet.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/edit-media-text.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/edit-name-with-trimmed-value.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/edit-resource-referred-by-multiple-styletags.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/edit-value-inside-property.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/edit-value-url-with-color.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/edit-value-with-trimmed-url.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/empty-background-url.html [ Crash ] -crbug.com/591099 inspector/elements/styles-1/filter-matched-styles.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/add-import-rule.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/cssom-shorthand-important.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/filter-matched-styles-hides-separators.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/force-pseudo-state.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/get-set-stylesheet-text.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/import-pseudoclass-crash.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/inactive-properties.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/inherited-mixed-case-properties.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/inject-stylesheet.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/keyframes-rules.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/lazy-computed-style.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/media-emulation.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/media-queries.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/media-using-same-url.html [ Crash ] +crbug.com/591099 inspector/elements/styles-1/color-swatch.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/commit-selector-mark-matching.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/commit-selector.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/css-live-edit.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/css-outline.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/cssom-media-insert-crash.html [ Crash Pass ] +crbug.com/591099 inspector/elements/styles-1/disable-property-workingcopy-update.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/dynamic-style-tag.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/edit-inspector-stylesheet.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/edit-media-text.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/edit-name-with-trimmed-value.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/edit-resource-referred-by-multiple-styletags.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/edit-value-inside-property.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/edit-value-url-with-color.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/edit-value-with-trimmed-url.html [ Crash Failure Timeout ] +crbug.com/591099 inspector/elements/styles-1/empty-background-url.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-1/filter-matched-styles.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/add-import-rule.html [ Crash Pass ] +crbug.com/591099 inspector/elements/styles-2/cssom-shorthand-important.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/filter-matched-styles-hides-separators.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/force-pseudo-state.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/get-set-stylesheet-text.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/import-pseudoclass-crash.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/inactive-properties.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/inherited-mixed-case-properties.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/inject-stylesheet.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/keyframes-rules.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/lazy-computed-style.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/media-emulation.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/media-queries.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/media-using-same-url.html [ Crash Failure ] crbug.com/591099 inspector/elements/styles-2/mixed-case-color-aware-properties.html [ Failure ] -crbug.com/591099 inspector/elements/styles-2/multiple-imports-edit-crash.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/page-reload-update-sidebar.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/parse-comments.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/parse-declaration-unterminated-comment.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/parse-declaration-with-quote.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/parse-utf8-bom.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/paste-property.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/perform-undo-perform-of-mergable-action.html [ Crash ] -crbug.com/591099 inspector/elements/styles-2/property-ui-location.html [ Crash ] +crbug.com/591099 inspector/elements/styles-2/multiple-imports-edit-crash.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/page-reload-update-sidebar.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/parse-comments.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/parse-declaration-unterminated-comment.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/parse-declaration-with-quote.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/parse-utf8-bom.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/paste-property.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/perform-undo-perform-of-mergable-action.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-2/property-ui-location.html [ Crash Failure ] crbug.com/591099 inspector/elements/styles-2/pseudo-elements.html [ Crash Timeout ] -crbug.com/591099 inspector/elements/styles-2/region-style-crash.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/computed-properties-retain-expanded.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/remove-shadow-host.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/selector-list.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/selector-source-data.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/shadow-dom-rules.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/simple-selector.html [ Crash ] +crbug.com/591099 inspector/elements/styles-2/region-style-crash.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/computed-properties-retain-expanded.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/remove-shadow-host.html [ Crash Pass ] +crbug.com/591099 inspector/elements/styles-3/selector-list.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/selector-source-data.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/shadow-dom-rules.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/simple-selector.html [ Crash Failure ] crbug.com/591099 inspector/elements/styles-3/spectrum.html [ Failure ] -crbug.com/591099 inspector/elements/styles-3/style-autocomplete.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/style-rule-from-imported-stylesheet.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-add-blank-property.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-add-invalid-property.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule-colon.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule-tab.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule-to-stylesheet.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-cancel-editing.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-change-node-while-editing.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-commit-editing.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-computed-trace.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-disable-inherited.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-disable-property-after-selector-edit.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-disable-then-change.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-disable-then-delete.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-disable-then-enable-overriden-ua.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-disable-then-enable.html [ Crash ] -crbug.com/591099 inspector/elements/styles-3/styles-variables.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/disable-last-property-without-semicolon.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/do-not-rebuild-styles-on-every-change.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/inline-style-sourcemap.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/keyframes-source-offsets.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/style-update-during-selector-edit.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-do-not-detach-sourcemap-on-edits.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-edit-property-after-invalid-rule.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-formatting.html [ Crash ] +crbug.com/591099 inspector/elements/styles-3/style-autocomplete.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/style-rule-from-imported-stylesheet.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-add-blank-property.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-add-invalid-property.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule-colon.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule-tab.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule-to-stylesheet.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-cancel-editing.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-change-node-while-editing.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-commit-editing.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-computed-trace.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-disable-inherited.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-disable-property-after-selector-edit.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-disable-then-change.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-disable-then-delete.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-disable-then-enable-overriden-ua.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-disable-then-enable.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-3/styles-variables.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/disable-last-property-without-semicolon.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/do-not-rebuild-styles-on-every-change.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/inline-style-sourcemap.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/keyframes-source-offsets.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/style-update-during-selector-edit.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-do-not-detach-sourcemap-on-edits.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-edit-property-after-invalid-rule.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-formatting.html [ Crash Failure ] crbug.com/591099 inspector/elements/styles-4/styles-history.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-iframe.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.html [ Crash ] +crbug.com/591099 inspector/elements/styles-4/styles-iframe.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.html [ Crash Failure ] crbug.com/591099 inspector/elements/styles-4/styles-invalid-color-values.html [ Crash Failure ] -crbug.com/591099 inspector/elements/styles-4/styles-keyframes-cssom-injected.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-keyframes.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-live-locations-leak.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-new-API.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-overriden-properties.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-properties-overload.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-rerequest-sourcemap-on-watchdog.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-should-not-force-sync-style-recalc.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-source-lines-inline.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-source-lines-recovery.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-source-lines.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-source-offsets.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-update-from-js.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-update-links-1.html [ Crash Timeout ] -crbug.com/591099 inspector/elements/styles-4/styles-update-links-2.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-update-links-3.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-update-links-4.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-url-linkify.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/styles-with-spaces-in-sourceURL.html [ Crash ] +crbug.com/591099 inspector/elements/styles-4/styles-keyframes-cssom-injected.html [ Crash Pass ] +crbug.com/591099 inspector/elements/styles-4/styles-keyframes.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-live-locations-leak.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-new-API.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-overriden-properties.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-properties-overload.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-rerequest-sourcemap-on-watchdog.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-should-not-force-sync-style-recalc.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-source-lines-inline.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-source-lines-recovery.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-source-lines.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-source-offsets.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-update-from-js.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-update-links-1.html [ Crash Failure Timeout ] +crbug.com/591099 inspector/elements/styles-4/styles-update-links-2.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-update-links-3.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-update-links-4.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-url-linkify.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/styles-with-spaces-in-sourceURL.html [ Crash Failure ] crbug.com/591099 inspector/elements/styles-4/stylesheet-source-url-comment.html [ Crash Failure ] -crbug.com/591099 inspector/elements/styles-4/svg-style.xhtml [ Crash ] -crbug.com/591099 inspector/elements/styles-4/undo-add-new-rule.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/undo-add-property.html [ Crash ] -crbug.com/591099 inspector/elements/styles-4/undo-add-rule-crash.html [ Crash ] -crbug.com/591099 inspector/elements/styles/cancel-upon-invalid-property.html [ Crash ] -crbug.com/591099 inspector/elements/styles/original-content-provider.html [ Crash ] -crbug.com/591099 inspector/elements/styles/undo-after-cancelled-editing.html [ Crash ] -crbug.com/591099 inspector/elements/styles/undo-change-property.html [ Crash ] -crbug.com/591099 inspector/elements/styles/undo-property-toggle.html [ Crash ] -crbug.com/591099 inspector/elements/styles/undo-set-selector-text.html [ Crash Timeout ] -crbug.com/591099 inspector/elements/styles/up-down-numerics-and-colors.html [ Crash ] -crbug.com/591099 inspector/elements/styles/updates-during-dom-traversal.html [ Crash ] -crbug.com/591099 inspector/elements/styles/updates-throttled.html [ Crash ] -crbug.com/591099 inspector/elements/styles/url-color-swatch.html [ Crash ] -crbug.com/591099 inspector/elements/styles/url-multiple-collapsing.html [ Crash ] -crbug.com/591099 inspector/elements/user-properties.html [ Crash ] +crbug.com/591099 inspector/elements/styles-4/svg-style.xhtml [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/undo-add-new-rule.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/undo-add-property.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles-4/undo-add-rule-crash.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles/cancel-upon-invalid-property.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles/original-content-provider.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles/undo-after-cancelled-editing.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles/undo-change-property.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles/undo-property-toggle.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles/undo-set-selector-text.html [ Crash Failure Timeout ] +crbug.com/591099 inspector/elements/styles/up-down-numerics-and-colors.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles/updates-during-dom-traversal.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles/updates-throttled.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles/url-color-swatch.html [ Crash Failure ] +crbug.com/591099 inspector/elements/styles/url-multiple-collapsing.html [ Crash Failure ] +crbug.com/591099 inspector/elements/user-properties.html [ Crash Failure ] crbug.com/591099 inspector/evaluate-in-page.html [ Failure ] crbug.com/591099 inspector/file-reader-with-network-panel.html [ Failure ] crbug.com/591099 inspector/file-system-mapping.html [ Failure ] @@ -16864,7 +16872,7 @@ crbug.com/591099 inspector/filtered-item-selection-dialog-rendering.html [ Failure ] crbug.com/591099 inspector/geolocation-emulation-tests.html [ Failure ] crbug.com/591099 inspector/help/release-note-unit.html [ Crash Failure ] -crbug.com/591099 inspector/help/release-note.html [ Crash ] +crbug.com/591099 inspector/help/release-note.html [ Crash Failure ] crbug.com/591099 inspector/import-open-inspector.html [ Failure ] crbug.com/591099 inspector/initial-modules-load.html [ Failure ] crbug.com/591099 inspector/input-event-warning.html [ Failure ] @@ -16898,40 +16906,40 @@ crbug.com/591099 inspector/profiler/cpu-profiler-save-load.html [ Crash Failure ] crbug.com/591099 inspector/profiler/cpu-profiler-stopped-removed-race.html [ Crash Failure ] crbug.com/591099 inspector/profiler/heap-profiler-profiling.html [ Crash Failure ] -crbug.com/591099 inspector/profiler/heap-snapshot-comparison-dom-groups-change.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-comparison-expansion-preserved-when-sorting.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-comparison-show-all.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-comparison-show-next.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-comparison-shown-node-count-preserved-when-sorting.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-comparison-sorting.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-containment-expansion-preserved-when-sorting.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-containment-show-all.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-containment-show-next.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-containment-shown-node-count-preserved-when-sorting.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-containment-sorting.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-inspect-dom-wrapper.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-loader.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-orphan-nodes.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-statistics.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-summary-expansion-preserved-when-sorting.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-summary-retainers.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-summary-search-by-id.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-summary-search.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-summary-show-all.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-summary-show-next.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-summary-show-ranges.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-summary-shown-node-count-preserved-when-sorting.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-summary-sorting-fields.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-summary-sorting-instances.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-summary-sorting.html [ Crash ] -crbug.com/591099 inspector/profiler/heap-snapshot-weak-dominator.html [ Crash ] +crbug.com/591099 inspector/profiler/heap-snapshot-comparison-dom-groups-change.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-comparison-expansion-preserved-when-sorting.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-comparison-show-all.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-comparison-show-next.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-comparison-shown-node-count-preserved-when-sorting.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-comparison-sorting.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-containment-expansion-preserved-when-sorting.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-containment-show-all.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-containment-show-next.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-containment-shown-node-count-preserved-when-sorting.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-containment-sorting.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-inspect-dom-wrapper.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-loader.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-orphan-nodes.html [ Crash Pass ] +crbug.com/591099 inspector/profiler/heap-snapshot-statistics.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-summary-expansion-preserved-when-sorting.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-summary-retainers.html [ Crash Pass ] +crbug.com/591099 inspector/profiler/heap-snapshot-summary-search-by-id.html [ Crash Timeout ] +crbug.com/591099 inspector/profiler/heap-snapshot-summary-search.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-summary-show-all.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-summary-show-next.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-summary-show-ranges.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-summary-shown-node-count-preserved-when-sorting.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-summary-sorting-fields.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-summary-sorting-instances.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-summary-sorting.html [ Crash Failure ] +crbug.com/591099 inspector/profiler/heap-snapshot-weak-dominator.html [ Crash Pass ] crbug.com/591099 inspector/profiler/heap-snapshot.html [ Crash Failure ] crbug.com/591099 inspector/profiler/temp-storage-cleaner.html [ Crash Failure ] crbug.com/591099 inspector/quick-open/command-menu.html [ Crash Failure ] crbug.com/591099 inspector/remote-object.html [ Failure ] crbug.com/591099 inspector/report-API-errors.html [ Failure ] crbug.com/591099 inspector/report-protocol-errors.html [ Failure ] -crbug.com/591099 inspector/reveal-objects.html [ Crash ] +crbug.com/591099 inspector/reveal-objects.html [ Crash Failure ] crbug.com/591099 inspector/runtime.html [ Failure ] crbug.com/591099 inspector/runtime/runtime-callFunctionOn.html [ Crash Failure ] crbug.com/591099 inspector/runtime/runtime-es6-setSymbolPropertyValue.html [ Failure ] @@ -16939,32 +16947,32 @@ crbug.com/591099 inspector/runtime/runtime-getProperties.html [ Failure ] crbug.com/591099 inspector/runtime/runtime-localStorage-getProperties.html [ Crash Failure ] crbug.com/591099 inspector/runtime/runtime-setPropertyValue.html [ Crash Failure ] -crbug.com/591099 inspector/sass/test-ast-css-1.html [ Crash ] -crbug.com/591099 inspector/sass/test-ast-css-2.html [ Crash ] -crbug.com/591099 inspector/sass/test-ast-css-3.html [ Crash ] -crbug.com/591099 inspector/sass/test-ast-diff-1.html [ Crash ] -crbug.com/591099 inspector/sass/test-ast-editing-1.html [ Crash ] -crbug.com/591099 inspector/sass/test-ast-editing-2.html [ Crash ] -crbug.com/591099 inspector/sass/test-ast-scss-1.html [ Crash ] -crbug.com/591099 inspector/sass/test-ast-scss-2.html [ Crash ] -crbug.com/591099 inspector/sass/test-ast-scss-3.html [ Crash ] -crbug.com/591099 inspector/sass/test-ast-scss-4.html [ Crash ] -crbug.com/591099 inspector/sass/test-ast-scss-5.html [ Crash ] -crbug.com/591099 inspector/sass/test-ast-scss-6.html [ Crash ] -crbug.com/591099 inspector/sass/test-ast-scss-7.html [ Crash ] +crbug.com/591099 inspector/sass/test-ast-css-1.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ast-css-2.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ast-css-3.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ast-diff-1.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ast-editing-1.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ast-editing-2.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ast-scss-1.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ast-scss-2.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ast-scss-3.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ast-scss-4.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ast-scss-5.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ast-scss-6.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ast-scss-7.html [ Crash Failure ] crbug.com/591099 inspector/sass/test-edit-insert-property-empty-rule.html [ Failure ] crbug.com/591099 inspector/sass/test-edit-insert-property.html [ Failure ] crbug.com/591099 inspector/sass/test-edit-remove-property.html [ Failure ] crbug.com/591099 inspector/sass/test-edit-set-property-text.html [ Failure ] crbug.com/591099 inspector/sass/test-edit-toggle-property.html [ Crash Failure ] -crbug.com/591099 inspector/sass/test-find-node-for-position.html [ Crash ] +crbug.com/591099 inspector/sass/test-find-node-for-position.html [ Crash Failure ] crbug.com/591099 inspector/sass/test-mapping-bad.html [ Crash Failure ] crbug.com/591099 inspector/sass/test-mapping-good.html [ Failure ] crbug.com/591099 inspector/sass/test-mapping-many-scss.html [ Failure ] crbug.com/591099 inspector/sass/test-mapping-with-cache-busting-url.html [ Crash Failure ] -crbug.com/591099 inspector/sass/test-ssp-breaking-edits.html [ Crash ] -crbug.com/591099 inspector/sass/test-ssp-editing.html [ Crash ] -crbug.com/591099 inspector/sass/test-ssp-incremental-edit-invalid-value.html [ Crash ] +crbug.com/591099 inspector/sass/test-ssp-breaking-edits.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ssp-editing.html [ Crash Failure ] +crbug.com/591099 inspector/sass/test-ssp-incremental-edit-invalid-value.html [ Crash Failure ] crbug.com/591099 inspector/schema-get-domains-matches-agents.html [ Failure ] crbug.com/591099 inspector/sources/autocomplete-css.html [ Crash Failure ] crbug.com/591099 inspector/sources/autocomplete-general.html [ Crash Failure ] @@ -17194,98 +17202,98 @@ crbug.com/591099 inspector/tracing-model-ids.html [ Failure ] crbug.com/591099 inspector/tracing-model-storage.html [ Failure ] crbug.com/591099 inspector/tracing-model.html [ Failure ] -crbug.com/591099 inspector/tracing-session-id.html [ Crash ] -crbug.com/591099 inspector/tracing/anonymous-image-object.html [ Crash ] +crbug.com/591099 inspector/tracing-session-id.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/anonymous-image-object.html [ Crash Failure ] crbug.com/591099 inspector/tracing/buffer-usage.html [ Failure ] crbug.com/591099 inspector/tracing/category-filter.html [ Failure ] -crbug.com/591099 inspector/tracing/console-timeline.html [ Crash ] -crbug.com/591099 inspector/tracing/decode-resize.html [ Crash Timeout ] -crbug.com/591099 inspector/tracing/frame-model-instrumentation.html [ Crash ] +crbug.com/591099 inspector/tracing/console-timeline.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/decode-resize.html [ Crash Failure Timeout ] +crbug.com/591099 inspector/tracing/frame-model-instrumentation.html [ Crash Pass ] crbug.com/591099 inspector/tracing/frame-model.html [ Crash Failure ] -crbug.com/591099 inspector/tracing/hit-test.html [ Crash ] -crbug.com/591099 inspector/tracing/scroll-invalidations.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-js/compile-script.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-js/timeline-gc-event.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-js/timeline-injected-script-eval.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-js/timeline-js-line-level-profile.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-js/timeline-microtasks.html [ Crash ] +crbug.com/591099 inspector/tracing/hit-test.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/scroll-invalidations.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-js/compile-script.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-js/timeline-gc-event.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-js/timeline-injected-script-eval.html [ Crash Pass ] +crbug.com/591099 inspector/tracing/timeline-js/timeline-js-line-level-profile.html [ Crash Pass ] +crbug.com/591099 inspector/tracing/timeline-js/timeline-microtasks.html [ Crash Failure ] crbug.com/591099 inspector/tracing/timeline-js/timeline-open-function-call.html [ Failure ] -crbug.com/591099 inspector/tracing/timeline-js/timeline-runtime-stats.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-js/timeline-script-id.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-js/timeline-script-tag-1.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-js/timeline-script-tag-2.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-layout/timeline-layout-reason.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-layout/timeline-layout-with-invalidations.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-layout/timeline-layout.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-aggregated-details.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-animation-frame.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-bound-function.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-event-causes.html [ Crash ] +crbug.com/591099 inspector/tracing/timeline-js/timeline-runtime-stats.html [ Crash Pass ] +crbug.com/591099 inspector/tracing/timeline-js/timeline-script-id.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-js/timeline-script-tag-1.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-js/timeline-script-tag-2.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-layout/timeline-layout-reason.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-layout/timeline-layout-with-invalidations.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-layout/timeline-layout.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-aggregated-details.html [ Crash Pass ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-animation-frame.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-bound-function.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-event-causes.html [ Crash Failure ] crbug.com/591099 inspector/tracing/timeline-misc/timeline-event-details.html [ Crash Failure ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-event-dispatch.html [ Crash ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-event-dispatch.html [ Crash Failure ] crbug.com/591099 inspector/tracing/timeline-misc/timeline-filtering.html [ Crash Failure ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-grouped-invalidations.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-load-event.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-mark-timeline.html [ Crash ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-grouped-invalidations.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-load-event.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-mark-timeline.html [ Crash Failure ] crbug.com/591099 inspector/tracing/timeline-misc/timeline-model.html [ Crash Failure ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-node-reference.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-parse-html.html [ Crash ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-node-reference.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-parse-html.html [ Crash Failure ] crbug.com/591099 inspector/tracing/timeline-misc/timeline-range-stats.html [ Failure ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-record-reload.html [ Crash ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-record-reload.html [ Crash Failure ] crbug.com/591099 inspector/tracing/timeline-misc/timeline-search.html [ Failure ] crbug.com/591099 inspector/tracing/timeline-misc/timeline-tree-search.html [ Crash Failure ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-trivial.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-misc/timeline-window-filter.html [ Crash ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-trivial.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-misc/timeline-window-filter.html [ Crash Failure ] crbug.com/591099 inspector/tracing/timeline-network/timeline-network-resource-details.html [ Failure ] crbug.com/591099 inspector/tracing/timeline-network/timeline-network-resource.html [ Failure ] -crbug.com/591099 inspector/tracing/timeline-paint/layer-tree.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-paint/paint-profiler-update.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-and-multiple-style-invalidations.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations-on-deleted-node.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-with-style-recalc-invalidations.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-paint/update-layer-tree.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-style/parse-author-style-sheet.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-style/timeline-recalculate-styles.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-style/timeline-style-recalc-all-invalidator-types.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-style/timeline-style-recalc-with-invalidations.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-style/timeline-style-recalc-with-invalidator-invalidations.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-time/timeline-time-stamp.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-time/timeline-time.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-time/timeline-timer-fired-from-eval-call-site.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-time/timeline-timer.html [ Crash ] -crbug.com/591099 inspector/tracing/timeline-time/timeline-usertiming.html [ Crash ] +crbug.com/591099 inspector/tracing/timeline-paint/layer-tree.html [ Crash Pass ] +crbug.com/591099 inspector/tracing/timeline-paint/paint-profiler-update.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-and-multiple-style-invalidations.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations-on-deleted-node.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-with-style-recalc-invalidations.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-paint/update-layer-tree.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-style/parse-author-style-sheet.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-style/timeline-recalculate-styles.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-style/timeline-style-recalc-all-invalidator-types.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-style/timeline-style-recalc-with-invalidations.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-style/timeline-style-recalc-with-invalidator-invalidations.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-time/timeline-time-stamp.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-time/timeline-time.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-time/timeline-timer-fired-from-eval-call-site.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-time/timeline-timer.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/timeline-time/timeline-usertiming.html [ Crash Failure ] crbug.com/591099 inspector/tracing/tracing-timeline-load.html [ Failure ] -crbug.com/591099 inspector/tracing/worker-events.html [ Crash ] -crbug.com/591099 inspector/tracing/worker-js-frames.html [ Crash ] +crbug.com/591099 inspector/tracing/worker-events.html [ Crash Failure ] +crbug.com/591099 inspector/tracing/worker-js-frames.html [ Crash Failure ] crbug.com/591099 inspector/uisourcecode-revisions.html [ Failure ] crbug.com/591099 inspector/user-metrics.html [ Failure ] crbug.com/591099 inspector/version-controller.html [ Failure ] crbug.com/591099 inspector/workspace-mapping.html [ Failure ] -crbug.com/591099 installedapp/getinstalledrelatedapps-iframe.html [ Crash ] -crbug.com/591099 intersection-observer/client-rect.html [ Crash ] -crbug.com/591099 intersection-observer/cross-origin-iframe.html [ Crash ] +crbug.com/591099 installedapp/getinstalledrelatedapps-iframe.html [ Crash Pass ] +crbug.com/591099 intersection-observer/client-rect.html [ Crash Pass ] +crbug.com/591099 intersection-observer/cross-origin-iframe.html [ Crash Pass ] crbug.com/591099 intersection-observer/edge-inclusive-intersection.html [ Failure ] -crbug.com/591099 intersection-observer/iframe-no-root.html [ Crash ] -crbug.com/591099 intersection-observer/observer-in-iframe.html [ Crash ] +crbug.com/591099 intersection-observer/iframe-no-root.html [ Crash Pass ] +crbug.com/591099 intersection-observer/observer-in-iframe.html [ Crash Pass ] crbug.com/591099 intersection-observer/remove-element.html [ Failure ] -crbug.com/591099 intersection-observer/root-margin.html [ Crash ] -crbug.com/591099 intersection-observer/same-document-root.html [ Crash ] -crbug.com/591099 jquery/attributes.html [ Crash ] -crbug.com/591099 jquery/core.html [ Crash ] -crbug.com/591099 jquery/css.html [ Crash ] -crbug.com/591099 jquery/data.html [ Crash ] -crbug.com/591099 jquery/deferred.html [ Crash ] -crbug.com/591099 jquery/dimensions.html [ Crash ] -crbug.com/591099 jquery/event.html [ Crash ] -crbug.com/591099 jquery/manipulation.html [ Crash ] -crbug.com/591099 jquery/offset.html [ Crash ] -crbug.com/591099 jquery/traversing.html [ Crash ] +crbug.com/591099 intersection-observer/root-margin.html [ Crash Pass ] +crbug.com/591099 intersection-observer/same-document-root.html [ Crash Failure ] +crbug.com/591099 jquery/attributes.html [ Crash Pass ] +crbug.com/591099 jquery/core.html [ Crash Pass ] +crbug.com/591099 jquery/css.html [ Crash Pass ] +crbug.com/591099 jquery/data.html [ Crash Pass ] +crbug.com/591099 jquery/deferred.html [ Crash Pass ] +crbug.com/591099 jquery/dimensions.html [ Crash Pass ] +crbug.com/591099 jquery/event.html [ Crash Pass ] +crbug.com/591099 jquery/manipulation.html [ Crash Pass ] +crbug.com/591099 jquery/offset.html [ Crash Failure ] +crbug.com/591099 jquery/traversing.html [ Crash Pass ] crbug.com/591099 loader/iframe-src-change-onload-crash.html [ Failure ] -crbug.com/591099 loader/iframe-sync-loads.html [ Crash ] -crbug.com/591099 loader/image-loader-base.html [ Crash ] +crbug.com/591099 loader/iframe-sync-loads.html [ Crash Pass ] +crbug.com/591099 loader/image-loader-base.html [ Crash Pass ] crbug.com/591099 media/W3C/audio/canPlayType/canPlayType_application_octet_stream.html [ Failure ] crbug.com/591099 media/W3C/audio/canPlayType/canPlayType_application_octet_stream_with_codecs_1.html [ Failure ] crbug.com/591099 media/W3C/audio/canPlayType/canPlayType_application_octet_stream_with_codecs_2.html [ Failure ] @@ -17418,327 +17426,327 @@ crbug.com/591099 media/W3C/video/src/src_reflects_attribute_not_source_elements.html [ Failure ] crbug.com/591099 media/W3C/video/src/src_reflects_no_value.html [ Failure ] crbug.com/591099 media/W3C/video/src/src_removal_does_not_trigger_loadstart.html [ Failure ] -crbug.com/591099 media/audio-controls-captions.html [ Crash ] -crbug.com/591099 media/audio-controls-do-not-fade-out.html [ Crash ] -crbug.com/591099 media/audio-delete-while-slider-thumb-clicked.html [ Crash ] +crbug.com/591099 media/audio-controls-captions.html [ Crash Pass ] +crbug.com/591099 media/audio-controls-do-not-fade-out.html [ Crash Pass ] +crbug.com/591099 media/audio-delete-while-slider-thumb-clicked.html [ Crash Pass ] crbug.com/591099 media/audio-only-video-intrinsic-size.html [ Failure ] -crbug.com/591099 media/auto-play-in-sandbox-with-allow-scripts.html [ Crash ] -crbug.com/591099 media/autoplay-document-move.html [ Crash ] -crbug.com/591099 media/autoplay-muted-conditions.html [ Crash ] -crbug.com/591099 media/autoplay-muted.html [ Crash Timeout ] -crbug.com/591099 media/autoplay-non-whitelisted-scope.html [ Crash ] -crbug.com/591099 media/autoplay-whitelisted-scope.html [ Crash ] +crbug.com/591099 media/auto-play-in-sandbox-with-allow-scripts.html [ Crash Pass ] +crbug.com/591099 media/autoplay-document-move.html [ Crash Pass ] +crbug.com/591099 media/autoplay-muted-conditions.html [ Crash Pass ] +crbug.com/591099 media/autoplay-muted.html [ Crash Pass Timeout ] +crbug.com/591099 media/autoplay-non-whitelisted-scope.html [ Crash Pass ] +crbug.com/591099 media/autoplay-whitelisted-scope.html [ Crash Pass ] crbug.com/591099 media/autoplay/document-user-activation.html [ Failure ] -crbug.com/591099 media/before-load-member-access.html [ Crash ] -crbug.com/591099 media/broken-video.html [ Crash ] +crbug.com/591099 media/before-load-member-access.html [ Crash Pass ] +crbug.com/591099 media/broken-video.html [ Crash Pass ] crbug.com/591099 media/color-profile-video-poster-image.html [ Failure Pass ] crbug.com/591099 media/color-profile-video-seek-filter.html [ Failure Pass ] crbug.com/591099 media/color-profile-video-seek-object-fit.html [ Failure Pass ] crbug.com/591099 media/color-profile-video-seek.html [ Failure Pass ] crbug.com/591099 media/color-profile-video.html [ Failure Pass ] -crbug.com/591099 media/constructors.html [ Crash ] -crbug.com/591099 media/controls-css-overload.html [ Crash ] -crbug.com/591099 media/controls-drag-timebar.html [ Crash ] -crbug.com/591099 media/controls-right-click-on-timebar.html [ Crash ] +crbug.com/591099 media/constructors.html [ Crash Pass ] +crbug.com/591099 media/controls-css-overload.html [ Crash Pass ] +crbug.com/591099 media/controls-drag-timebar.html [ Crash Pass ] +crbug.com/591099 media/controls-right-click-on-timebar.html [ Crash Pass ] crbug.com/591099 media/controls-slider-appearance-crash.html [ Failure ] -crbug.com/591099 media/controls-timeline.html [ Crash ] -crbug.com/591099 media/controls-volume-slider-keynav.html [ Crash ] -crbug.com/591099 media/controls-volume-slider.html [ Crash ] -crbug.com/591099 media/controls/closed-captions-dynamic-update.html [ Crash ] -crbug.com/591099 media/controls/closed-captions-on-off.html [ Crash ] -crbug.com/591099 media/controls/closed-captions-single-track.html [ Crash ] -crbug.com/591099 media/controls/closed-captions-switch-track.html [ Crash ] -crbug.com/591099 media/controls/controls-cast-button-narrow.html [ Crash ] -crbug.com/591099 media/controls/controls-cast-button.html [ Crash ] -crbug.com/591099 media/controls/controls-cast-do-not-fade-out.html [ Crash ] -crbug.com/591099 media/controls/controls-cast-overlay-slow-fade.html [ Crash ] -crbug.com/591099 media/controls/controls-overlay-cast-button.html [ Crash ] -crbug.com/591099 media/controls/controls-video-keynav-no-controls.html [ Crash ] -crbug.com/591099 media/controls/controls-video-keynav.html [ Crash ] -crbug.com/591099 media/controls/download-button-displays-with-preload-none.html [ Crash ] -crbug.com/591099 media/controls/overflow-fully-hidden.html [ Crash ] -crbug.com/591099 media/controls/overlay-play-button-document-move.html [ Crash ] -crbug.com/591099 media/controls/overlay-play-button-narrow.html [ Crash ] -crbug.com/591099 media/controls/settings-disable-controls.html [ Crash ] -crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-click-outside.html [ Crash ] -crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-click-panel.html [ Crash ] -crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-click.html [ Crash ] -crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-resize.html [ Crash ] -crbug.com/591099 media/controls/video-controls-overflow-menu-text.html [ Crash ] -crbug.com/591099 media/controls/video-controls-overflow-menu-visibility.html [ Crash ] +crbug.com/591099 media/controls-timeline.html [ Crash Pass ] +crbug.com/591099 media/controls-volume-slider-keynav.html [ Crash Pass ] +crbug.com/591099 media/controls-volume-slider.html [ Crash Pass ] +crbug.com/591099 media/controls/closed-captions-dynamic-update.html [ Crash Pass ] +crbug.com/591099 media/controls/closed-captions-on-off.html [ Crash Pass ] +crbug.com/591099 media/controls/closed-captions-single-track.html [ Crash Pass ] +crbug.com/591099 media/controls/closed-captions-switch-track.html [ Crash Pass ] +crbug.com/591099 media/controls/controls-cast-button-narrow.html [ Crash Pass ] +crbug.com/591099 media/controls/controls-cast-button.html [ Crash Pass ] +crbug.com/591099 media/controls/controls-cast-do-not-fade-out.html [ Crash Pass ] +crbug.com/591099 media/controls/controls-cast-overlay-slow-fade.html [ Crash Pass ] +crbug.com/591099 media/controls/controls-overlay-cast-button.html [ Crash Pass ] +crbug.com/591099 media/controls/controls-video-keynav-no-controls.html [ Crash Pass ] +crbug.com/591099 media/controls/controls-video-keynav.html [ Crash Pass ] +crbug.com/591099 media/controls/download-button-displays-with-preload-none.html [ Crash Pass ] +crbug.com/591099 media/controls/overflow-fully-hidden.html [ Crash Pass ] +crbug.com/591099 media/controls/overlay-play-button-document-move.html [ Crash Pass ] +crbug.com/591099 media/controls/overlay-play-button-narrow.html [ Crash Pass ] +crbug.com/591099 media/controls/settings-disable-controls.html [ Crash Pass ] +crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-click-outside.html [ Crash Pass ] +crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-click-panel.html [ Crash Pass ] +crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-click.html [ Crash Pass ] +crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-resize.html [ Crash Pass ] +crbug.com/591099 media/controls/video-controls-overflow-menu-text.html [ Crash Pass ] +crbug.com/591099 media/controls/video-controls-overflow-menu-visibility.html [ Crash Pass ] crbug.com/591099 media/controls/video-controls-with-cast-rendering.html [ Failure ] -crbug.com/591099 media/controls/video-enter-exit-fullscreen-while-hovering-shows-controls.html [ Crash ] -crbug.com/591099 media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Crash ] +crbug.com/591099 media/controls/video-enter-exit-fullscreen-while-hovering-shows-controls.html [ Crash Pass ] +crbug.com/591099 media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Crash Pass ] crbug.com/591099 media/controls/video-overlay-cast-dark-rendering.html [ Failure ] crbug.com/591099 media/controls/video-overlay-cast-light-rendering.html [ Failure ] -crbug.com/591099 media/controls/video-overlay-play-button.html [ Crash ] -crbug.com/591099 media/crash-in-media-moved-to-newdocument.html [ Crash ] -crbug.com/591099 media/csp-blocks-video.html [ Crash ] -crbug.com/591099 media/deprecated-css-selectors.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-lifetime-reload.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-onencrypted.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-playback-encrypted-and-clear-sources.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-playback-multiple-sessions.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-playback-setmediakeys-after-src.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-playback-setmediakeys-before-src.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-playback-two-videos.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-reset-src-after-setmediakeys.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-reset-src-during-setmediakeys.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-again-after-playback.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-again-after-resetting-src.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-at-same-time.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-to-multiple-video-elements.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys.html [ Crash ] -crbug.com/591099 media/encrypted-media/encrypted-media-waiting-for-a-key.html [ Crash ] -crbug.com/591099 media/event-attributes.html [ Crash ] +crbug.com/591099 media/controls/video-overlay-play-button.html [ Crash Pass ] +crbug.com/591099 media/crash-in-media-moved-to-newdocument.html [ Crash Pass ] +crbug.com/591099 media/csp-blocks-video.html [ Crash Pass ] +crbug.com/591099 media/deprecated-css-selectors.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-lifetime-reload.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-onencrypted.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-playback-encrypted-and-clear-sources.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-playback-multiple-sessions.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-playback-setmediakeys-after-src.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-playback-setmediakeys-before-src.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-playback-two-videos.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-reset-src-after-setmediakeys.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-reset-src-during-setmediakeys.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-again-after-playback.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-again-after-resetting-src.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-at-same-time.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-to-multiple-video-elements.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys.html [ Crash Pass ] +crbug.com/591099 media/encrypted-media/encrypted-media-waiting-for-a-key.html [ Crash Pass ] +crbug.com/591099 media/event-attributes.html [ Crash Pass ] crbug.com/591099 media/fallback.html [ Failure ] -crbug.com/591099 media/fullscreen-controls-visible-last.html [ Crash ] -crbug.com/591099 media/media-can-play-mpeg4-video.html [ Crash ] -crbug.com/591099 media/media-can-play-ogg.html [ Crash ] -crbug.com/591099 media/media-can-play-type.html [ Crash ] -crbug.com/591099 media/media-can-play-webm.html [ Crash ] -crbug.com/591099 media/media-captions-no-controls.html [ Crash ] -crbug.com/591099 media/media-controls-fit-properly-while-zoomed.html [ Crash ] -crbug.com/591099 media/media-controls-hide-menu-stoppropagation-iframe.html [ Crash ] -crbug.com/591099 media/media-controls-hide-menu-stoppropagation.html [ Crash ] -crbug.com/591099 media/media-controls-invalid-url.html [ Crash ] -crbug.com/591099 media/media-controls-overflow-hidden.html [ Crash ] -crbug.com/591099 media/media-controls-overflow-visible.html [ Crash ] -crbug.com/591099 media/media-controls-tap-show-controls-without-activating.html [ Crash ] +crbug.com/591099 media/fullscreen-controls-visible-last.html [ Crash Pass ] +crbug.com/591099 media/media-can-play-mpeg4-video.html [ Crash Pass ] +crbug.com/591099 media/media-can-play-ogg.html [ Crash Pass ] +crbug.com/591099 media/media-can-play-type.html [ Crash Pass ] +crbug.com/591099 media/media-can-play-webm.html [ Crash Pass ] +crbug.com/591099 media/media-captions-no-controls.html [ Crash Pass ] +crbug.com/591099 media/media-controls-fit-properly-while-zoomed.html [ Crash Pass ] +crbug.com/591099 media/media-controls-hide-menu-stoppropagation-iframe.html [ Crash Pass ] +crbug.com/591099 media/media-controls-hide-menu-stoppropagation.html [ Crash Pass ] +crbug.com/591099 media/media-controls-invalid-url.html [ Crash Pass ] +crbug.com/591099 media/media-controls-overflow-hidden.html [ Crash Pass ] +crbug.com/591099 media/media-controls-overflow-visible.html [ Crash Pass ] +crbug.com/591099 media/media-controls-tap-show-controls-without-activating.html [ Crash Pass ] crbug.com/591099 media/media-document-audio-size.html [ Failure ] -crbug.com/591099 media/media-extension-with-fragment.html [ Crash ] +crbug.com/591099 media/media-extension-with-fragment.html [ Crash Pass ] crbug.com/591099 media/network-no-source-const-shadow.html [ Failure ] -crbug.com/591099 media/no-autoplay-with-user-gesture-requirement.html [ Crash ] -crbug.com/591099 media/remoteplayback/availability-callback-gc.html [ Crash ] -crbug.com/591099 media/remoteplayback/prompt-twice-throws.html [ Crash ] -crbug.com/591099 media/remoteplayback/watch-availability-throws-low-end-device.html [ Crash ] -crbug.com/591099 media/remove-from-document-before-load.html [ Crash ] +crbug.com/591099 media/no-autoplay-with-user-gesture-requirement.html [ Crash Pass ] +crbug.com/591099 media/remoteplayback/availability-callback-gc.html [ Crash Pass ] +crbug.com/591099 media/remoteplayback/prompt-twice-throws.html [ Crash Pass ] +crbug.com/591099 media/remoteplayback/watch-availability-throws-low-end-device.html [ Crash Pass ] +crbug.com/591099 media/remove-from-document-before-load.html [ Crash Pass ] crbug.com/591099 media/remove-from-document-config-controls-no-crash.html [ Crash Failure ] -crbug.com/591099 media/remove-from-document.html [ Crash ] +crbug.com/591099 media/remove-from-document.html [ Crash Pass ] crbug.com/591099 media/svg-as-image-with-media-blocked.html [ Failure ] -crbug.com/591099 media/track/cue-style-invalidation.html [ Crash ] -crbug.com/591099 media/track/media-element-enqueue-event-crash.html [ Crash ] +crbug.com/591099 media/track/cue-style-invalidation.html [ Crash Pass ] +crbug.com/591099 media/track/media-element-enqueue-event-crash.html [ Crash Pass ] crbug.com/591099 media/track/media-element-move-to-new-document-assert.html [ Failure ] -crbug.com/591099 media/track/opera/track/webvtt/parsing/001.html [ Crash ] -crbug.com/591099 media/track/regions-webvtt/vtt-region-display.html [ Crash ] +crbug.com/591099 media/track/opera/track/webvtt/parsing/001.html [ Crash Pass ] +crbug.com/591099 media/track/regions-webvtt/vtt-region-display.html [ Crash Pass ] crbug.com/591099 media/track/text-track-cue-exceptions.html [ Failure ] -crbug.com/591099 media/track/text-track-selection-menu-add-track.html [ Crash ] -crbug.com/591099 media/track/track-css-all-cues.html [ Crash ] -crbug.com/591099 media/track/track-css-cue-lifetime.html [ Crash ] -crbug.com/591099 media/track/track-css-matching-default.html [ Crash ] -crbug.com/591099 media/track/track-css-matching-lang.html [ Crash ] -crbug.com/591099 media/track/track-css-matching-timestamps.html [ Crash ] -crbug.com/591099 media/track/track-css-matching.html [ Crash ] -crbug.com/591099 media/track/track-css-property-whitelist.html [ Crash ] -crbug.com/591099 media/track/track-css-user-settings-override-author-settings.html [ Crash ] -crbug.com/591099 media/track/track-css-user-settings-override-internal-settings.html [ Crash ] -crbug.com/591099 media/track/track-cue-container-rendering-position.html [ Crash ] -crbug.com/591099 media/track/track-cue-gc-wrapper.html [ Crash ] -crbug.com/591099 media/track/track-cue-inline-assertion-crash.html [ Crash ] -crbug.com/591099 media/track/track-cue-mutable-fragment.html [ Crash ] -crbug.com/591099 media/track/track-cue-mutable-text.html [ Crash ] -crbug.com/591099 media/track/track-cue-mutable.html [ Crash ] -crbug.com/591099 media/track/track-cue-negative-timestamp.html [ Crash ] -crbug.com/591099 media/track/track-cue-nothing-to-render.html [ Crash ] +crbug.com/591099 media/track/text-track-selection-menu-add-track.html [ Crash Pass ] +crbug.com/591099 media/track/track-css-all-cues.html [ Crash Pass ] +crbug.com/591099 media/track/track-css-cue-lifetime.html [ Crash Pass ] +crbug.com/591099 media/track/track-css-matching-default.html [ Crash Pass ] +crbug.com/591099 media/track/track-css-matching-lang.html [ Crash Pass ] +crbug.com/591099 media/track/track-css-matching-timestamps.html [ Crash Pass ] +crbug.com/591099 media/track/track-css-matching.html [ Crash Pass ] +crbug.com/591099 media/track/track-css-property-whitelist.html [ Crash Pass ] +crbug.com/591099 media/track/track-css-user-settings-override-author-settings.html [ Crash Pass ] +crbug.com/591099 media/track/track-css-user-settings-override-internal-settings.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-container-rendering-position.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-gc-wrapper.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-inline-assertion-crash.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-mutable-fragment.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-mutable-text.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-mutable.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-negative-timestamp.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-nothing-to-render.html [ Crash Pass ] crbug.com/591099 media/track/track-cue-rendering-horizontal.html [ Failure Pass ] -crbug.com/591099 media/track/track-cue-rendering-on-resize.html [ Crash ] -crbug.com/591099 media/track/track-cue-rendering-overscan.html [ Crash ] -crbug.com/591099 media/track/track-cue-rendering-rtl.html [ Crash ] -crbug.com/591099 media/track/track-cue-rendering-snap-to-lines-not-set.html [ Crash ] -crbug.com/591099 media/track/track-cue-rendering-tree-is-removed-properly.html [ Crash ] +crbug.com/591099 media/track/track-cue-rendering-on-resize.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-rendering-overscan.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-rendering-rtl.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-rendering-snap-to-lines-not-set.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-rendering-tree-is-removed-properly.html [ Crash Failure ] crbug.com/591099 media/track/track-cue-rendering-vertical.html [ Failure Pass ] -crbug.com/591099 media/track/track-cue-rendering-wider-than-controls.html [ Crash ] -crbug.com/591099 media/track/track-cue-rendering-with-padding.html [ Crash ] -crbug.com/591099 media/track/track-cue-rendering.html [ Crash ] -crbug.com/591099 media/track/track-cues-cuechange.html [ Crash ] -crbug.com/591099 media/track/track-cues-enter-exit.html [ Crash ] -crbug.com/591099 media/track/track-cues-missed.html [ Crash ] -crbug.com/591099 media/track/track-cues-pause-on-exit.html [ Crash ] -crbug.com/591099 media/track/track-cues-seeking.html [ Crash ] -crbug.com/591099 media/track/track-cues-sorted-before-dispatch.html [ Crash ] -crbug.com/591099 media/track/track-default-attribute.html [ Crash Timeout ] -crbug.com/591099 media/track/track-delete-during-setup.html [ Crash ] -crbug.com/591099 media/track/track-disabled.html [ Crash ] -crbug.com/591099 media/track/track-element-load-event.html [ Crash ] -crbug.com/591099 media/track/track-id.html [ Crash ] -crbug.com/591099 media/track/track-kind-user-preference.html [ Crash ] -crbug.com/591099 media/track/track-kind.html [ Crash Timeout ] -crbug.com/591099 media/track/track-language-preference.html [ Crash ] -crbug.com/591099 media/track/track-large-timestamp.html [ Crash ] -crbug.com/591099 media/track/track-load-error-readyState.html [ Crash Timeout ] -crbug.com/591099 media/track/track-load-from-element-readyState.html [ Crash Timeout ] -crbug.com/591099 media/track/track-load-from-src-readyState.html [ Crash ] -crbug.com/591099 media/track/track-mode-disabled-crash.html [ Crash ] -crbug.com/591099 media/track/track-mode-not-changed-by-new-track.html [ Crash ] -crbug.com/591099 media/track/track-mode-triggers-loading.html [ Crash ] -crbug.com/591099 media/track/track-mode.html [ Crash ] -crbug.com/591099 media/track/track-removal-crash.html [ Crash ] -crbug.com/591099 media/track/track-remove-active-cue-crash.html [ Crash ] -crbug.com/591099 media/track/track-remove-by-setting-innerHTML.html [ Crash ] -crbug.com/591099 media/track/track-selection-metadata.html [ Crash ] -crbug.com/591099 media/track/track-text-track-cue-list.html [ Crash ] -crbug.com/591099 media/track/track-texttracks.html [ Crash ] -crbug.com/591099 media/track/track-webvtt-tc000-empty.html [ Crash Timeout ] -crbug.com/591099 media/track/track-webvtt-tc001-utf8.html [ Crash ] -crbug.com/591099 media/track/track-webvtt-tc002-bom.html [ Crash ] -crbug.com/591099 media/track/track-webvtt-tc003-newlines.html [ Crash ] -crbug.com/591099 media/track/track-webvtt-tc004-magic-header.html [ Crash ] -crbug.com/591099 media/track/track-webvtt-tc005-header-comment.html [ Crash ] -crbug.com/591099 media/track/track-webvtt-tc008-timings-no-hours.html [ Crash ] -crbug.com/591099 media/track/track-webvtt-tc009-timings-hour.html [ Crash ] -crbug.com/591099 media/track/track-webvtt-tc010-no-timings.html [ Crash ] -crbug.com/591099 media/track/track-webvtt-tc016-align-positioning.html [ Crash ] -crbug.com/591099 media/track/track-webvtt-tc017-line-position.html [ Crash ] -crbug.com/591099 media/track/track-webvtt-tc018-align-text-line-position.html [ Crash ] -crbug.com/591099 media/track/track-word-breaking.html [ Crash ] +crbug.com/591099 media/track/track-cue-rendering-wider-than-controls.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-rendering-with-padding.html [ Crash Pass ] +crbug.com/591099 media/track/track-cue-rendering.html [ Crash Pass ] +crbug.com/591099 media/track/track-cues-cuechange.html [ Crash Pass ] +crbug.com/591099 media/track/track-cues-enter-exit.html [ Crash Pass ] +crbug.com/591099 media/track/track-cues-missed.html [ Crash Pass ] +crbug.com/591099 media/track/track-cues-pause-on-exit.html [ Crash Pass ] +crbug.com/591099 media/track/track-cues-seeking.html [ Crash Pass ] +crbug.com/591099 media/track/track-cues-sorted-before-dispatch.html [ Crash Pass ] +crbug.com/591099 media/track/track-default-attribute.html [ Crash Failure Timeout ] +crbug.com/591099 media/track/track-delete-during-setup.html [ Crash Pass ] +crbug.com/591099 media/track/track-disabled.html [ Crash Pass ] +crbug.com/591099 media/track/track-element-load-event.html [ Crash Pass ] +crbug.com/591099 media/track/track-id.html [ Crash Pass ] +crbug.com/591099 media/track/track-kind-user-preference.html [ Crash Pass ] +crbug.com/591099 media/track/track-kind.html [ Crash Pass Timeout ] +crbug.com/591099 media/track/track-language-preference.html [ Crash Pass ] +crbug.com/591099 media/track/track-large-timestamp.html [ Crash Pass ] +crbug.com/591099 media/track/track-load-error-readyState.html [ Crash Pass Timeout ] +crbug.com/591099 media/track/track-load-from-element-readyState.html [ Crash Pass Timeout ] +crbug.com/591099 media/track/track-load-from-src-readyState.html [ Crash Pass ] +crbug.com/591099 media/track/track-mode-disabled-crash.html [ Crash Pass ] +crbug.com/591099 media/track/track-mode-not-changed-by-new-track.html [ Crash Pass ] +crbug.com/591099 media/track/track-mode-triggers-loading.html [ Crash Pass ] +crbug.com/591099 media/track/track-mode.html [ Crash Pass ] +crbug.com/591099 media/track/track-removal-crash.html [ Crash Pass ] +crbug.com/591099 media/track/track-remove-active-cue-crash.html [ Crash Pass ] +crbug.com/591099 media/track/track-remove-by-setting-innerHTML.html [ Crash Pass ] +crbug.com/591099 media/track/track-selection-metadata.html [ Crash Pass ] +crbug.com/591099 media/track/track-text-track-cue-list.html [ Crash Pass ] +crbug.com/591099 media/track/track-texttracks.html [ Crash Pass ] +crbug.com/591099 media/track/track-webvtt-tc000-empty.html [ Crash Pass Timeout ] +crbug.com/591099 media/track/track-webvtt-tc001-utf8.html [ Crash Pass ] +crbug.com/591099 media/track/track-webvtt-tc002-bom.html [ Crash Pass ] +crbug.com/591099 media/track/track-webvtt-tc003-newlines.html [ Crash Pass ] +crbug.com/591099 media/track/track-webvtt-tc004-magic-header.html [ Crash Pass ] +crbug.com/591099 media/track/track-webvtt-tc005-header-comment.html [ Crash Pass ] +crbug.com/591099 media/track/track-webvtt-tc008-timings-no-hours.html [ Crash Pass ] +crbug.com/591099 media/track/track-webvtt-tc009-timings-hour.html [ Crash Pass ] +crbug.com/591099 media/track/track-webvtt-tc010-no-timings.html [ Crash Pass ] +crbug.com/591099 media/track/track-webvtt-tc016-align-positioning.html [ Crash Pass ] +crbug.com/591099 media/track/track-webvtt-tc017-line-position.html [ Crash Pass ] +crbug.com/591099 media/track/track-webvtt-tc018-align-text-line-position.html [ Crash Pass ] +crbug.com/591099 media/track/track-word-breaking.html [ Crash Pass ] crbug.com/591099 media/track/vtt-cue-exceptions.html [ Failure ] -crbug.com/591099 media/unsupported-rtsp.html [ Crash ] -crbug.com/591099 media/unsupported-tracks.html [ Crash ] -crbug.com/591099 media/video-append-source.html [ Crash ] +crbug.com/591099 media/unsupported-rtsp.html [ Crash Pass ] +crbug.com/591099 media/unsupported-tracks.html [ Crash Pass ] +crbug.com/591099 media/video-append-source.html [ Crash Pass ] crbug.com/591099 media/video-aspect-ratio.html [ Failure ] -crbug.com/591099 media/video-autoplay.html [ Crash ] -crbug.com/591099 media/video-black-bg-in-media-document.html [ Crash ] +crbug.com/591099 media/video-autoplay.html [ Crash Pass ] +crbug.com/591099 media/video-black-bg-in-media-document.html [ Crash Pass ] crbug.com/591099 media/video-buffered-too-few-arguments.html [ Failure ] -crbug.com/591099 media/video-buffered-unknown-duration.html [ Crash ] -crbug.com/591099 media/video-buffered.html [ Crash ] +crbug.com/591099 media/video-buffered-unknown-duration.html [ Crash Pass ] +crbug.com/591099 media/video-buffered.html [ Crash Pass ] crbug.com/591099 media/video-canvas-alpha.html [ Failure ] -crbug.com/591099 media/video-canvas-source.html [ Crash ] -crbug.com/591099 media/video-canvas.html [ Crash ] -crbug.com/591099 media/video-capture-canvas.html [ Crash ] -crbug.com/591099 media/video-capture-preview.html [ Crash ] +crbug.com/591099 media/video-canvas-source.html [ Crash Pass ] +crbug.com/591099 media/video-canvas.html [ Crash Pass ] +crbug.com/591099 media/video-capture-canvas.html [ Crash Pass ] +crbug.com/591099 media/video-capture-preview.html [ Crash Pass ] crbug.com/591099 media/video-colorspace-yuv420.html [ Failure ] crbug.com/591099 media/video-colorspace-yuv422.html [ Failure ] -crbug.com/591099 media/video-controls-always-visible-when-control-hovered.html [ Crash ] -crbug.com/591099 media/video-controls-auto-hide-after-play-by-touch.html [ Crash ] -crbug.com/591099 media/video-controls-dont-show-on-focus-when-disabled.html [ Crash ] -crbug.com/591099 media/video-controls-download-button-not-displayed-local.html [ Crash ] -crbug.com/591099 media/video-controls-focus-movement-on-hide.html [ Crash ] -crbug.com/591099 media/video-controls-fullscreen-iframe-allowed.html [ Crash ] -crbug.com/591099 media/video-controls-fullscreen-iframe-not-allowed.html [ Crash ] -crbug.com/591099 media/video-controls-fullscreen-not-supported.html [ Crash ] -crbug.com/591099 media/video-controls-fullscreen.html [ Crash ] -crbug.com/591099 media/video-controls-hidden-audio.html [ Crash ] -crbug.com/591099 media/video-controls-hide-after-touch-on-control.html [ Crash ] -crbug.com/591099 media/video-controls-hide-on-move-outside-controls.html [ Crash ] -crbug.com/591099 media/video-controls-in-media-document.html [ Crash ] -crbug.com/591099 media/video-controls-labels.html [ Crash ] -crbug.com/591099 media/video-controls-mouse-events-captured.html [ Crash ] -crbug.com/591099 media/video-controls-muted-video-can-unmute.html [ Crash ] -crbug.com/591099 media/video-controls-no-scripting.html [ Crash ] -crbug.com/591099 media/video-controls-overflow-menu-closed-captions-button.html [ Crash ] -crbug.com/591099 media/video-controls-overflow-menu-closed-captions-list-hide-on-click-outside.html [ Crash ] -crbug.com/591099 media/video-controls-overflow-menu-last-button-visible.html [ Crash ] -crbug.com/591099 media/video-controls-overflow-menu-mute-button.html [ Crash ] -crbug.com/591099 media/video-controls-overflow-menu-play-button.html [ Crash ] -crbug.com/591099 media/video-controls-show-on-focus.html [ Crash ] +crbug.com/591099 media/video-controls-always-visible-when-control-hovered.html [ Crash Pass ] +crbug.com/591099 media/video-controls-auto-hide-after-play-by-touch.html [ Crash Pass ] +crbug.com/591099 media/video-controls-dont-show-on-focus-when-disabled.html [ Crash Pass ] +crbug.com/591099 media/video-controls-download-button-not-displayed-local.html [ Crash Pass ] +crbug.com/591099 media/video-controls-focus-movement-on-hide.html [ Crash Pass ] +crbug.com/591099 media/video-controls-fullscreen-iframe-allowed.html [ Crash Pass ] +crbug.com/591099 media/video-controls-fullscreen-iframe-not-allowed.html [ Crash Pass ] +crbug.com/591099 media/video-controls-fullscreen-not-supported.html [ Crash Pass ] +crbug.com/591099 media/video-controls-fullscreen.html [ Crash Pass ] +crbug.com/591099 media/video-controls-hidden-audio.html [ Crash Pass ] +crbug.com/591099 media/video-controls-hide-after-touch-on-control.html [ Crash Pass ] +crbug.com/591099 media/video-controls-hide-on-move-outside-controls.html [ Crash Pass ] +crbug.com/591099 media/video-controls-in-media-document.html [ Crash Pass ] +crbug.com/591099 media/video-controls-labels.html [ Crash Pass ] +crbug.com/591099 media/video-controls-mouse-events-captured.html [ Crash Pass ] +crbug.com/591099 media/video-controls-muted-video-can-unmute.html [ Crash Pass ] +crbug.com/591099 media/video-controls-no-scripting.html [ Crash Pass ] +crbug.com/591099 media/video-controls-overflow-menu-closed-captions-button.html [ Crash Pass ] +crbug.com/591099 media/video-controls-overflow-menu-closed-captions-list-hide-on-click-outside.html [ Crash Pass ] +crbug.com/591099 media/video-controls-overflow-menu-last-button-visible.html [ Crash Pass ] +crbug.com/591099 media/video-controls-overflow-menu-mute-button.html [ Crash Pass ] +crbug.com/591099 media/video-controls-overflow-menu-play-button.html [ Crash Pass ] +crbug.com/591099 media/video-controls-show-on-focus.html [ Crash Pass ] crbug.com/591099 media/video-controls-start-selection.html [ Failure ] -crbug.com/591099 media/video-controls-toggling.html [ Crash ] -crbug.com/591099 media/video-controls-touch-events-captured.html [ Crash ] -crbug.com/591099 media/video-controls-track-selection-menu.html [ Crash ] -crbug.com/591099 media/video-controls-transformed.html [ Crash ] -crbug.com/591099 media/video-controls-visibility-multimodal-mouse-after-touch.html [ Crash ] -crbug.com/591099 media/video-controls-visibility-multimodal-touch-after-mouse.html [ Crash ] +crbug.com/591099 media/video-controls-toggling.html [ Crash Pass ] +crbug.com/591099 media/video-controls-touch-events-captured.html [ Crash Pass ] +crbug.com/591099 media/video-controls-track-selection-menu.html [ Crash Pass ] +crbug.com/591099 media/video-controls-transformed.html [ Crash Pass ] +crbug.com/591099 media/video-controls-visibility-multimodal-mouse-after-touch.html [ Crash Pass ] +crbug.com/591099 media/video-controls-visibility-multimodal-touch-after-mouse.html [ Crash Pass ] crbug.com/591099 media/video-controls-visible-audio-only.html [ Failure ] crbug.com/591099 media/video-controls-with-mutation-event-handler.html [ Failure ] -crbug.com/591099 media/video-controls-zoomed.html [ Crash ] -crbug.com/591099 media/video-controls.html [ Crash ] -crbug.com/591099 media/video-currentTime-before-have-metadata-media-fragment-uri.html [ Crash ] -crbug.com/591099 media/video-currentTime-before-have-metadata.html [ Crash ] -crbug.com/591099 media/video-currentTime-delay.html [ Crash ] -crbug.com/591099 media/video-currentTime-set.html [ Crash ] -crbug.com/591099 media/video-currentTime-set2.html [ Crash ] -crbug.com/591099 media/video-currentTime.html [ Crash ] -crbug.com/591099 media/video-delay-load-event.html [ Crash ] -crbug.com/591099 media/video-display-aspect-ratio.html [ Crash ] -crbug.com/591099 media/video-dom-autoplay.html [ Crash ] -crbug.com/591099 media/video-dom-src.html [ Crash ] -crbug.com/591099 media/video-double-seek-currentTime.html [ Crash ] -crbug.com/591099 media/video-duration-known-after-eos.html [ Crash ] -crbug.com/591099 media/video-enter-fullscreen-without-user-gesture.html [ Crash ] -crbug.com/591099 media/video-error-does-not-exist.html [ Crash ] -crbug.com/591099 media/video-force-preload-none-to-metadata-on-load.html [ Crash ] -crbug.com/591099 media/video-force-preload-none-to-metadata-on-play.html [ Crash ] -crbug.com/591099 media/video-intrinsic-width-height.html [ Crash ] +crbug.com/591099 media/video-controls-zoomed.html [ Crash Pass ] +crbug.com/591099 media/video-controls.html [ Crash Pass ] +crbug.com/591099 media/video-currentTime-before-have-metadata-media-fragment-uri.html [ Crash Pass ] +crbug.com/591099 media/video-currentTime-before-have-metadata.html [ Crash Pass ] +crbug.com/591099 media/video-currentTime-delay.html [ Crash Pass ] +crbug.com/591099 media/video-currentTime-set.html [ Crash Pass ] +crbug.com/591099 media/video-currentTime-set2.html [ Crash Pass ] +crbug.com/591099 media/video-currentTime.html [ Crash Pass ] +crbug.com/591099 media/video-delay-load-event.html [ Crash Pass ] +crbug.com/591099 media/video-display-aspect-ratio.html [ Crash Pass ] +crbug.com/591099 media/video-dom-autoplay.html [ Crash Pass ] +crbug.com/591099 media/video-dom-src.html [ Crash Pass ] +crbug.com/591099 media/video-double-seek-currentTime.html [ Crash Pass ] +crbug.com/591099 media/video-duration-known-after-eos.html [ Crash Pass ] +crbug.com/591099 media/video-enter-fullscreen-without-user-gesture.html [ Crash Pass ] +crbug.com/591099 media/video-error-does-not-exist.html [ Crash Pass ] +crbug.com/591099 media/video-force-preload-none-to-metadata-on-load.html [ Crash Pass ] +crbug.com/591099 media/video-force-preload-none-to-metadata-on-play.html [ Crash Pass ] +crbug.com/591099 media/video-intrinsic-width-height.html [ Crash Pass ] crbug.com/591099 media/video-layer-crash.html [ Failure ] -crbug.com/591099 media/video-load-networkState.html [ Crash ] -crbug.com/591099 media/video-load-preload-none.html [ Crash ] -crbug.com/591099 media/video-load-readyState.html [ Crash ] -crbug.com/591099 media/video-loop-from-ended.html [ Crash ] -crbug.com/591099 media/video-loop.html [ Crash ] -crbug.com/591099 media/video-mouse-focus.html [ Crash ] -crbug.com/591099 media/video-move-to-new-document-srcobject.html [ Crash ] -crbug.com/591099 media/video-move-to-new-document.html [ Crash ] -crbug.com/591099 media/video-muted.html [ Crash ] -crbug.com/591099 media/video-no-autoplay.html [ Crash ] -crbug.com/591099 media/video-no-controls-events-not-absorbed.html [ Crash ] -crbug.com/591099 media/video-no-timeupdate-before-playback.html [ Crash ] -crbug.com/591099 media/video-not-paused-while-looping.html [ Crash ] -crbug.com/591099 media/video-pause-empty-events.html [ Crash ] -crbug.com/591099 media/video-pause-immediately.html [ Crash ] -crbug.com/591099 media/video-persistence.html [ Crash ] -crbug.com/591099 media/video-play-empty-events.html [ Crash ] -crbug.com/591099 media/video-play-pause-events.html [ Crash ] -crbug.com/591099 media/video-play-pause-exception.html [ Crash ] -crbug.com/591099 media/video-play-require-user-gesture.html [ Crash ] -crbug.com/591099 media/video-playbackrate.html [ Crash ] -crbug.com/591099 media/video-played-collapse.html [ Crash ] -crbug.com/591099 media/video-played-ranges-1.html [ Crash ] -crbug.com/591099 media/video-played-reset.html [ Crash ] -crbug.com/591099 media/video-playing-and-pause.html [ Crash ] +crbug.com/591099 media/video-load-networkState.html [ Crash Pass ] +crbug.com/591099 media/video-load-preload-none.html [ Crash Pass ] +crbug.com/591099 media/video-load-readyState.html [ Crash Pass ] +crbug.com/591099 media/video-loop-from-ended.html [ Crash Pass ] +crbug.com/591099 media/video-loop.html [ Crash Pass ] +crbug.com/591099 media/video-mouse-focus.html [ Crash Pass ] +crbug.com/591099 media/video-move-to-new-document-srcobject.html [ Crash Pass ] +crbug.com/591099 media/video-move-to-new-document.html [ Crash Pass ] +crbug.com/591099 media/video-muted.html [ Crash Pass ] +crbug.com/591099 media/video-no-autoplay.html [ Crash Pass ] +crbug.com/591099 media/video-no-controls-events-not-absorbed.html [ Crash Pass ] +crbug.com/591099 media/video-no-timeupdate-before-playback.html [ Crash Pass ] +crbug.com/591099 media/video-not-paused-while-looping.html [ Crash Pass ] +crbug.com/591099 media/video-pause-empty-events.html [ Crash Pass ] +crbug.com/591099 media/video-pause-immediately.html [ Crash Pass ] +crbug.com/591099 media/video-persistence.html [ Crash Pass ] +crbug.com/591099 media/video-play-empty-events.html [ Crash Pass ] +crbug.com/591099 media/video-play-pause-events.html [ Crash Pass ] +crbug.com/591099 media/video-play-pause-exception.html [ Crash Pass ] +crbug.com/591099 media/video-play-require-user-gesture.html [ Crash Pass ] +crbug.com/591099 media/video-playbackrate.html [ Crash Pass ] +crbug.com/591099 media/video-played-collapse.html [ Crash Pass ] +crbug.com/591099 media/video-played-ranges-1.html [ Crash Pass ] +crbug.com/591099 media/video-played-reset.html [ Crash Pass ] +crbug.com/591099 media/video-playing-and-pause.html [ Crash Pass ] crbug.com/591099 media/video-plays-past-end-of-test.html [ Failure ] -crbug.com/591099 media/video-positive-start-time-seek-after-start-time.html [ Crash ] -crbug.com/591099 media/video-positive-start-time-seek-before-start-time.html [ Crash ] -crbug.com/591099 media/video-positive-start-time.html [ Crash ] -crbug.com/591099 media/video-poster-delayed.html [ Crash ] +crbug.com/591099 media/video-positive-start-time-seek-after-start-time.html [ Crash Pass ] +crbug.com/591099 media/video-positive-start-time-seek-before-start-time.html [ Crash Pass ] +crbug.com/591099 media/video-positive-start-time.html [ Crash Pass ] +crbug.com/591099 media/video-poster-delayed.html [ Crash Pass ] crbug.com/591099 media/video-poster-scale.html [ Failure ] -crbug.com/591099 media/video-poster.html [ Crash ] -crbug.com/591099 media/video-prefixed-fullscreen.html [ Crash ] -crbug.com/591099 media/video-preload-none-no-stalled-event.html [ Crash ] -crbug.com/591099 media/video-remove-insert-repaints.html [ Crash ] +crbug.com/591099 media/video-poster.html [ Crash Pass ] +crbug.com/591099 media/video-prefixed-fullscreen.html [ Crash Pass ] +crbug.com/591099 media/video-preload-none-no-stalled-event.html [ Crash Pass ] +crbug.com/591099 media/video-remove-insert-repaints.html [ Crash Failure ] crbug.com/591099 media/video-replaces-poster.html [ Failure ] -crbug.com/591099 media/video-scales-in-media-document.html [ Crash ] -crbug.com/591099 media/video-seek-by-small-increment.html [ Crash ] -crbug.com/591099 media/video-seek-no-src.html [ Crash ] -crbug.com/591099 media/video-seek-past-end-paused.html [ Crash ] -crbug.com/591099 media/video-seek-past-end-playing.html [ Crash ] -crbug.com/591099 media/video-seek-to-duration-with-playbackrate-zero.html [ Crash ] -crbug.com/591099 media/video-seekable.html [ Crash ] -crbug.com/591099 media/video-seeking.html [ Crash ] -crbug.com/591099 media/video-set-rate-from-pause.html [ Crash ] -crbug.com/591099 media/video-single-valid-source.html [ Crash ] -crbug.com/591099 media/video-size.html [ Crash ] -crbug.com/591099 media/video-source-add-after-remove.html [ Crash ] -crbug.com/591099 media/video-source-error-no-candidate.html [ Crash ] -crbug.com/591099 media/video-source-error.html [ Crash ] -crbug.com/591099 media/video-source-inserted.html [ Crash ] -crbug.com/591099 media/video-source-load.html [ Crash ] -crbug.com/591099 media/video-source-media.html [ Crash ] -crbug.com/591099 media/video-source-none-supported.html [ Crash ] -crbug.com/591099 media/video-source-type-params.html [ Crash ] -crbug.com/591099 media/video-source-type.html [ Crash ] -crbug.com/591099 media/video-source.html [ Crash ] -crbug.com/591099 media/video-src-blob.html [ Crash ] -crbug.com/591099 media/video-src-change.html [ Crash ] -crbug.com/591099 media/video-src-empty.html [ Crash ] -crbug.com/591099 media/video-src-invalid-poster.html [ Crash ] -crbug.com/591099 media/video-src-invalid-remove.html [ Crash ] -crbug.com/591099 media/video-src-none.html [ Crash ] -crbug.com/591099 media/video-src-plus-source.html [ Crash ] -crbug.com/591099 media/video-src-remove.html [ Crash ] -crbug.com/591099 media/video-src-set.html [ Crash ] -crbug.com/591099 media/video-src-source.html [ Crash ] -crbug.com/591099 media/video-src.html [ Crash ] -crbug.com/591099 media/video-srcobject-mediastream-src-file.html [ Crash ] -crbug.com/591099 media/video-srcobject-mediastream.html [ Crash ] -crbug.com/591099 media/video-timeupdate-during-playback.html [ Crash ] +crbug.com/591099 media/video-scales-in-media-document.html [ Crash Failure ] +crbug.com/591099 media/video-seek-by-small-increment.html [ Crash Pass ] +crbug.com/591099 media/video-seek-no-src.html [ Crash Pass ] +crbug.com/591099 media/video-seek-past-end-paused.html [ Crash Pass ] +crbug.com/591099 media/video-seek-past-end-playing.html [ Crash Pass ] +crbug.com/591099 media/video-seek-to-duration-with-playbackrate-zero.html [ Crash Pass ] +crbug.com/591099 media/video-seekable.html [ Crash Pass ] +crbug.com/591099 media/video-seeking.html [ Crash Pass ] +crbug.com/591099 media/video-set-rate-from-pause.html [ Crash Pass ] +crbug.com/591099 media/video-single-valid-source.html [ Crash Pass ] +crbug.com/591099 media/video-size.html [ Crash Pass ] +crbug.com/591099 media/video-source-add-after-remove.html [ Crash Pass ] +crbug.com/591099 media/video-source-error-no-candidate.html [ Crash Pass ] +crbug.com/591099 media/video-source-error.html [ Crash Pass ] +crbug.com/591099 media/video-source-inserted.html [ Crash Pass ] +crbug.com/591099 media/video-source-load.html [ Crash Pass ] +crbug.com/591099 media/video-source-media.html [ Crash Pass ] +crbug.com/591099 media/video-source-none-supported.html [ Crash Pass ] +crbug.com/591099 media/video-source-type-params.html [ Crash Pass ] +crbug.com/591099 media/video-source-type.html [ Crash Pass ] +crbug.com/591099 media/video-source.html [ Crash Pass ] +crbug.com/591099 media/video-src-blob.html [ Crash Pass ] +crbug.com/591099 media/video-src-change.html [ Crash Pass ] +crbug.com/591099 media/video-src-empty.html [ Crash Pass ] +crbug.com/591099 media/video-src-invalid-poster.html [ Crash Pass ] +crbug.com/591099 media/video-src-invalid-remove.html [ Crash Pass ] +crbug.com/591099 media/video-src-none.html [ Crash Pass ] +crbug.com/591099 media/video-src-plus-source.html [ Crash Pass ] +crbug.com/591099 media/video-src-remove.html [ Crash Pass ] +crbug.com/591099 media/video-src-set.html [ Crash Pass ] +crbug.com/591099 media/video-src-source.html [ Crash Pass ] +crbug.com/591099 media/video-src.html [ Crash Pass ] +crbug.com/591099 media/video-srcobject-mediastream-src-file.html [ Crash Pass ] +crbug.com/591099 media/video-srcobject-mediastream.html [ Crash Pass ] +crbug.com/591099 media/video-timeupdate-during-playback.html [ Crash Pass ] crbug.com/591099 media/video-transformed.html [ Failure ] -crbug.com/591099 media/video-volume.html [ Crash ] -crbug.com/591099 media/video-width-height.html [ Crash ] +crbug.com/591099 media/video-volume.html [ Crash Pass ] +crbug.com/591099 media/video-width-height.html [ Crash Pass ] crbug.com/591099 media/video-zoom-controls.html [ Failure ] crbug.com/591099 media/video-zoom.html [ Failure ] -crbug.com/591099 media/viewport-in-standalone-media-document.html [ Crash ] +crbug.com/591099 media/viewport-in-standalone-media-document.html [ Crash Pass ] crbug.com/591099 mhtml/data-uri-font.mht [ Failure ] crbug.com/591099 mhtml/image_document.mht [ Failure ] crbug.com/591099 mhtml/invalid-bad-boundary2.mht [ Failure ] @@ -17769,7 +17777,7 @@ crbug.com/591099 paint/frames/frameset-with-stacking-context-and-not-stacking-context-children.html [ Failure ] crbug.com/591099 paint/frames/frameset-with-stacking-contexts.html [ Failure ] crbug.com/591099 paint/high-contrast-mode/image-filter-all/text-on-backgrounds.html [ Failure ] -crbug.com/591099 paint/images/animated-gif-last-frame-crash.html [ Crash ] +crbug.com/591099 paint/images/animated-gif-last-frame-crash.html [ Crash Pass ] crbug.com/591099 paint/inline/focus-ring-under-absolute-with-relative-continuation.html [ Failure ] crbug.com/591099 paint/inline/outline-offset.html [ Failure ] crbug.com/591099 paint/invalidation/4774354.html [ Failure ] @@ -17889,7 +17897,7 @@ crbug.com/591099 paint/invalidation/compositing/overflow-into-content.html [ Failure ] crbug.com/591099 paint/invalidation/compositing/overlap-test-with-filter.html [ Failure ] crbug.com/591099 paint/invalidation/compositing/page-scale-repaint.html [ Failure ] -crbug.com/591099 paint/invalidation/compositing/remove-squashed-layer-plus-move.html [ Crash ] +crbug.com/591099 paint/invalidation/compositing/remove-squashed-layer-plus-move.html [ Crash Failure ] crbug.com/591099 paint/invalidation/compositing/repaint-overflow-scrolled-squashed-content.html [ Failure ] crbug.com/591099 paint/invalidation/compositing/repaint-squashed-layer-in-rect.html [ Failure ] crbug.com/591099 paint/invalidation/compositing/repaint-via-layout-offset.html [ Failure Pass ] @@ -17992,7 +18000,7 @@ crbug.com/591099 paint/invalidation/fixed.html [ Failure ] crbug.com/591099 paint/invalidation/flexbox/repaint-column-reverse.html [ Failure ] crbug.com/591099 paint/invalidation/flexbox/repaint-during-resize-no-flex.html [ Failure ] -crbug.com/591099 paint/invalidation/flexbox/repaint-on-layout.html [ Crash ] +crbug.com/591099 paint/invalidation/flexbox/repaint-on-layout.html [ Crash Failure ] crbug.com/591099 paint/invalidation/flexbox/repaint-on-margin-change.html [ Failure ] crbug.com/591099 paint/invalidation/flexbox/repaint-opacity-change.html [ Failure ] crbug.com/591099 paint/invalidation/flexbox/repaint-rtl-column.html [ Failure ] @@ -18029,6 +18037,7 @@ crbug.com/591099 paint/invalidation/inline-block-overflow-repaint.html [ Failure Pass ] crbug.com/591099 paint/invalidation/inline-block-overflow.html [ Failure ] crbug.com/591099 paint/invalidation/inline-block-resize.html [ Failure ] +crbug.com/591099 paint/invalidation/inline-box-overflow-repaint.html [ Failure ] crbug.com/591099 paint/invalidation/inline-focus.html [ Failure ] crbug.com/591099 paint/invalidation/inline-outline-repaint-2.html [ Failure ] crbug.com/591099 paint/invalidation/inline-outline-repaint.html [ Failure ] @@ -18097,7 +18106,7 @@ crbug.com/591099 paint/invalidation/make-children-non-inline.html [ Failure ] crbug.com/591099 paint/invalidation/margin.html [ Failure Pass ] crbug.com/591099 paint/invalidation/mask-clip-change-stacking-child.html [ Failure ] -crbug.com/591099 paint/invalidation/media-audio-no-spurious-repaints.html [ Crash ] +crbug.com/591099 paint/invalidation/media-audio-no-spurious-repaints.html [ Crash Pass ] crbug.com/591099 paint/invalidation/mix-blend-mode-separate-stacking-context.html [ Failure ] crbug.com/591099 paint/invalidation/multi-subsequence-composited.html [ Failure ] crbug.com/591099 paint/invalidation/multi-subsequence-scrolled.html [ Failure ] @@ -18179,7 +18188,7 @@ crbug.com/591099 paint/invalidation/relayout-fixed-position-after-scale.html [ Failure ] crbug.com/591099 paint/invalidation/remove-block-after-layout.html [ Failure ] crbug.com/591099 paint/invalidation/remove-inline-after-layout.html [ Failure ] -crbug.com/591099 paint/invalidation/remove-inline-block-descendant-of-flex.html [ Crash ] +crbug.com/591099 paint/invalidation/remove-inline-block-descendant-of-flex.html [ Crash Failure ] crbug.com/591099 paint/invalidation/remove-inline-layer-after-layout.html [ Failure ] crbug.com/591099 paint/invalidation/renderer-destruction-by-invalidateSelection-crash.html [ Failure ] crbug.com/591099 paint/invalidation/repaint-across-writing-mode-boundary.html [ Failure ] @@ -18229,6 +18238,7 @@ crbug.com/591099 paint/invalidation/selection-after-delete.html [ Failure ] crbug.com/591099 paint/invalidation/selection-after-remove.html [ Failure ] crbug.com/591099 paint/invalidation/selection-change-in-iframe-with-relative-parent.html [ Failure ] +crbug.com/591099 paint/invalidation/selection-clear-after-move.html [ Failure ] crbug.com/591099 paint/invalidation/selection-clear.html [ Failure ] crbug.com/591099 paint/invalidation/selection-partial-invalidation-between-blocks.html [ Failure Pass ] crbug.com/591099 paint/invalidation/selection-rl.html [ Failure ] @@ -18245,7 +18255,7 @@ crbug.com/591099 paint/invalidation/shadow-box-resize.html [ Failure ] crbug.com/591099 paint/invalidation/shadow-multiple.html [ Failure ] crbug.com/591099 paint/invalidation/shift-relative-positioned-container-with-image-addition.html [ Failure ] -crbug.com/591099 paint/invalidation/shift-relative-positioned-container-with-image-removal.html [ Crash ] +crbug.com/591099 paint/invalidation/shift-relative-positioned-container-with-image-removal.html [ Crash Failure ] crbug.com/591099 paint/invalidation/slider-thumb-drag-release.html [ Failure ] crbug.com/591099 paint/invalidation/slider-thumb-float.html [ Failure ] crbug.com/591099 paint/invalidation/stacked-diacritics.html [ Failure ] @@ -18290,7 +18300,7 @@ crbug.com/591099 paint/invalidation/svg/remove-background-property-on-root.html [ Failure Pass ] crbug.com/591099 paint/invalidation/svg/remove-outline-property-on-root.html [ Failure Pass ] crbug.com/591099 paint/invalidation/svg/repaint-moving-svg-and-div.xhtml [ Failure Pass ] -crbug.com/591099 paint/invalidation/svg/resize-svg-invalidate-children.html [ Crash ] +crbug.com/591099 paint/invalidation/svg/resize-svg-invalidate-children.html [ Crash Failure ] crbug.com/591099 paint/invalidation/svg/scroll-hit-test.xhtml [ Failure ] crbug.com/591099 paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem.html [ Failure ] crbug.com/591099 paint/invalidation/svg/svg-background-partial-redraw.html [ Failure ] @@ -18372,7 +18382,7 @@ crbug.com/591099 paint/printing/print-box-shadow.html [ Failure ] crbug.com/591099 paint/roundedrects/circle-with-shadow.html [ Failure Pass ] crbug.com/591099 paint/roundedrects/input-with-rounded-rect-and-shadow.html [ Failure ] -crbug.com/591099 paint/selection/drag-caret.html [ Crash Timeout ] +crbug.com/591099 paint/selection/drag-caret.html [ Crash Pass Timeout ] crbug.com/591099 paint/selection/text-selection-editing-crash.html [ Failure ] crbug.com/591099 paint/selection/text-selection-inline-block-rtl.html [ Failure ] crbug.com/591099 paint/selection/text-selection-inline-block.html [ Failure ] @@ -18406,22 +18416,22 @@ crbug.com/591099 paint/theme/adjust-progress-bar-size.html [ Failure Pass ] crbug.com/591099 paint/transforms/percentage-transform-fractional-box-size.html [ Failure ] crbug.com/591099 paint/transparency/compositing-alpha-fold-crash.html [ Failure ] -crbug.com/591099 payments/payment-request-in-iframe-allowed.html [ Crash ] -crbug.com/591099 payments/payment-request-in-iframe-nested-allowed.html [ Crash ] -crbug.com/591099 payments/payment-request-in-iframe-nested-not-allowed.html [ Crash ] -crbug.com/591099 payments/payment-request-in-iframe.html [ Crash ] +crbug.com/591099 payments/payment-request-in-iframe-allowed.html [ Crash Pass ] +crbug.com/591099 payments/payment-request-in-iframe-nested-allowed.html [ Crash Pass ] +crbug.com/591099 payments/payment-request-in-iframe-nested-not-allowed.html [ Crash Failure ] +crbug.com/591099 payments/payment-request-in-iframe.html [ Crash Failure ] crbug.com/591099 permissionclient/image-permissions.html [ Crash Failure ] crbug.com/591099 permissionclient/storage-permission-detached.html [ Crash Failure ] -crbug.com/591099 plugins/change-widget-and-click-crash.html [ Crash ] +crbug.com/591099 plugins/change-widget-and-click-crash.html [ Crash Failure ] crbug.com/591099 plugins/createScriptableObject-before-start.html [ Failure ] -crbug.com/591099 plugins/embed-attributes-active.html [ Crash ] +crbug.com/591099 plugins/embed-attributes-active.html [ Crash Pass ] crbug.com/591099 plugins/embed-attributes-style.html [ Failure ] -crbug.com/591099 plugins/empty-per-context-data.html [ Crash ] +crbug.com/591099 plugins/empty-per-context-data.html [ Crash Failure ] crbug.com/591099 plugins/focus-change-1-no-change.html [ Failure ] crbug.com/591099 plugins/focus-change-2-change-focus.html [ Failure ] crbug.com/591099 plugins/focus-change-3-change-blur.html [ Failure ] crbug.com/591099 plugins/focus-change-4-change-focus-and-blur.html [ Failure ] -crbug.com/591099 plugins/focus.html [ Crash ] +crbug.com/591099 plugins/focus.html [ Crash Failure ] crbug.com/591099 plugins/fullscreen-plugins-dont-reload.html [ Failure ] crbug.com/591099 plugins/hidden-iframe-with-swf-plugin.html [ Failure ] crbug.com/591099 plugins/iframe-plugin-bgcolor.html [ Failure ] @@ -18431,32 +18441,32 @@ crbug.com/591099 plugins/mouse-click-plugin-clears-selection.html [ Crash Failure ] crbug.com/591099 plugins/mouse-events-fixedpos.html [ Failure ] crbug.com/591099 plugins/mouse-events.html [ Failure ] -crbug.com/591099 plugins/multiple-plugins.html [ Crash ] +crbug.com/591099 plugins/multiple-plugins.html [ Crash Failure ] crbug.com/591099 plugins/navigator-mimeTypes-length.html [ Failure ] crbug.com/591099 plugins/navigator-plugins.html [ Failure ] -crbug.com/591099 plugins/nested-plugin-objects.html [ Crash ] -crbug.com/591099 plugins/object-onerror-placeholder.html [ Crash ] -crbug.com/591099 plugins/object-onfocus-mutation-crash.html [ Crash ] -crbug.com/591099 plugins/object-onload-placeholder.html [ Crash ] +crbug.com/591099 plugins/nested-plugin-objects.html [ Crash Pass ] +crbug.com/591099 plugins/object-onerror-placeholder.html [ Crash Pass ] +crbug.com/591099 plugins/object-onfocus-mutation-crash.html [ Crash Pass ] +crbug.com/591099 plugins/object-onload-placeholder.html [ Crash Pass ] crbug.com/591099 plugins/overlay-scrollbar-mouse-capture.html [ Failure ] crbug.com/591099 plugins/override-node-method.html [ Failure ] -crbug.com/591099 plugins/page-scale-does-not-affect-plugin-height.html [ Crash ] -crbug.com/591099 plugins/plugin-destroyed-enumerate.html [ Crash ] +crbug.com/591099 plugins/page-scale-does-not-affect-plugin-height.html [ Crash Pass ] +crbug.com/591099 plugins/plugin-destroyed-enumerate.html [ Crash Failure ] crbug.com/591099 plugins/plugin-initiate-popup-window.html [ Timeout ] crbug.com/591099 plugins/plugin-javascript-access.html [ Failure ] crbug.com/591099 plugins/plugin-paint-test.html [ Failure ] -crbug.com/591099 plugins/plugin-remove-readystatechange.html [ Crash ] -crbug.com/591099 plugins/plugin-remove-subframe.html [ Crash ] +crbug.com/591099 plugins/plugin-remove-readystatechange.html [ Crash Pass ] +crbug.com/591099 plugins/plugin-remove-subframe.html [ Crash Failure ] crbug.com/591099 plugins/plugin-scriptable.html [ Failure ] crbug.com/591099 plugins/plugin-synthetic-event-crash.html [ Failure ] -crbug.com/591099 plugins/re-request-touch-events-crash.html [ Crash ] +crbug.com/591099 plugins/re-request-touch-events-crash.html [ Crash Failure ] crbug.com/591099 plugins/refcount-leaks.html [ Failure ] crbug.com/591099 plugins/release-frame-content-window.html [ Failure ] -crbug.com/591099 plugins/request-low-latency-touch.html [ Crash ] +crbug.com/591099 plugins/request-low-latency-touch.html [ Crash Pass ] crbug.com/591099 plugins/sequential-focus.html [ Failure ] -crbug.com/591099 plugins/simple-expando.html [ Crash ] -crbug.com/591099 plugins/tabindex.html [ Crash ] -crbug.com/591099 plugins/type-case.html [ Crash ] +crbug.com/591099 plugins/simple-expando.html [ Crash Pass ] +crbug.com/591099 plugins/tabindex.html [ Crash Failure ] +crbug.com/591099 plugins/type-case.html [ Crash Pass ] crbug.com/591099 plugins/webview-plugin-lifecycle.html [ Failure Pass ] crbug.com/591099 plugins/webview-plugin-nested-iframe-scroll.html [ Failure ] crbug.com/591099 plugins/webview-plugin-scroll.html [ Failure Pass ] @@ -18464,7 +18474,7 @@ crbug.com/591099 pointer-lock/bug90391-move-then-window-open-crash.html [ Failure ] crbug.com/591099 pointer-lock/lock-already-locked.html [ Failure ] crbug.com/591099 pointer-lock/lock-element-not-in-dom.html [ Failure ] -crbug.com/591099 pointer-lock/locked-element-iframe-removed-from-dom.html [ Crash ] +crbug.com/591099 pointer-lock/locked-element-iframe-removed-from-dom.html [ Crash Failure ] crbug.com/591099 pointer-lock/locked-element-removed-from-dom.html [ Failure ] crbug.com/591099 pointer-lock/mouse-event-delivery.html [ Failure ] crbug.com/591099 pointer-lock/pointer-lock-api.html [ Failure ] @@ -18473,18 +18483,18 @@ crbug.com/591099 pointer-lock/pointerlockchange-pointerlockerror-events.html [ Failure ] crbug.com/591099 pointer-lock/pointerlockelement-null-when-pending.html [ Failure ] crbug.com/591099 presentation/presentation-controller-close-connection.html [ Crash Timeout ] -crbug.com/591099 presentation/presentation-controller-connection-closed-by-receiver.html [ Crash Timeout ] -crbug.com/591099 presentation/presentation-controller-terminate-connection.html [ Crash Timeout ] -crbug.com/591099 presentation/presentation-navigation-multipleurls.html [ Crash ] -crbug.com/591099 presentation/presentation-navigation.html [ Crash ] -crbug.com/591099 presentation/presentation-receiver-terminate-connection.html [ Crash Timeout ] +crbug.com/591099 presentation/presentation-controller-connection-closed-by-receiver.html [ Crash Pass Timeout ] +crbug.com/591099 presentation/presentation-controller-terminate-connection.html [ Crash Pass Timeout ] +crbug.com/591099 presentation/presentation-navigation-multipleurls.html [ Crash Pass ] +crbug.com/591099 presentation/presentation-navigation.html [ Crash Pass ] +crbug.com/591099 presentation/presentation-receiver-terminate-connection.html [ Crash Pass Timeout ] crbug.com/591099 presentation/presentation-reconnect.html [ Crash Timeout ] -crbug.com/591099 presentation/presentation-request-iframe-default-success.html [ Crash ] -crbug.com/591099 presentation/presentation-request-iframe-sandbox-error.html [ Crash ] -crbug.com/591099 presentation/presentation-request-iframe-sandbox-success.html [ Crash ] -crbug.com/591099 presentation/presentation-start-error.html [ Crash Timeout ] +crbug.com/591099 presentation/presentation-request-iframe-default-success.html [ Crash Pass ] +crbug.com/591099 presentation/presentation-request-iframe-sandbox-error.html [ Crash Pass ] +crbug.com/591099 presentation/presentation-request-iframe-sandbox-success.html [ Crash Pass ] +crbug.com/591099 presentation/presentation-start-error.html [ Crash Pass Timeout ] crbug.com/591099 presentation/presentation-start.html [ Crash Timeout ] -crbug.com/591099 presentation/presentationconnectionavailableevent-ctor-mock.html [ Crash Timeout ] +crbug.com/591099 presentation/presentationconnectionavailableevent-ctor-mock.html [ Crash Pass Timeout ] crbug.com/591099 printing/absolute-position-headers-and-footers.html [ Failure ] crbug.com/591099 printing/absolute-positioned.html [ Failure ] crbug.com/591099 printing/allowed-page-breaks.html [ Failure ] @@ -18540,28 +18550,28 @@ crbug.com/591099 printing/thead-repeats-at-top-of-each-page-multiple-tables.html [ Failure ] crbug.com/591099 printing/thead-repeats-at-top-of-each-page.html [ Failure ] crbug.com/591099 printing/viewport-size-dependant-iframe-with-multicol-crash.html [ Failure ] -crbug.com/591099 resize-observer/observe.html [ Crash ] -crbug.com/591099 screen_orientation/page-visibility.html [ Crash ] -crbug.com/591099 screen_orientation/screenorientation-detached-notify-no-crash.html [ Crash ] -crbug.com/591099 screen_orientation/screenorientation-unsupported-no-crash.html [ Crash ] +crbug.com/591099 resize-observer/observe.html [ Crash Pass ] +crbug.com/591099 screen_orientation/page-visibility.html [ Crash Pass ] +crbug.com/591099 screen_orientation/screenorientation-detached-notify-no-crash.html [ Crash Pass ] +crbug.com/591099 screen_orientation/screenorientation-unsupported-no-crash.html [ Crash Pass ] crbug.com/591099 scrollbars/auto-scrollbar-fit-content.html [ Failure ] crbug.com/591099 scrollbars/basic-scrollbar.html [ Failure ] crbug.com/591099 scrollbars/border-box-rect-clips-scrollbars.html [ Failure Pass ] crbug.com/591099 scrollbars/custom-scrollbar-changing-style-relayout-body-scrollablearea.html [ Crash Pass Timeout ] crbug.com/591099 scrollbars/custom-scrollbar-enable-changes-thickness-with-iframe.html [ Failure Pass ] -crbug.com/591099 scrollbars/custom-scrollbar-not-inherited-by-iframe.html [ Crash ] -crbug.com/591099 scrollbars/custom-scrollbar-reconstruction-document-write.html [ Crash ] +crbug.com/591099 scrollbars/custom-scrollbar-not-inherited-by-iframe.html [ Crash Pass ] +crbug.com/591099 scrollbars/custom-scrollbar-reconstruction-document-write.html [ Crash Pass ] crbug.com/591099 scrollbars/custom-scrollbar-with-incomplete-style.html [ Failure ] crbug.com/591099 scrollbars/disabled-scrollbar.html [ Failure ] crbug.com/591099 scrollbars/hidden-iframe-scrollbar-crash.html [ Crash Failure ] crbug.com/591099 scrollbars/hidden-scrollbar-prevents-layout.html [ Failure ] -crbug.com/591099 scrollbars/iframe-scrollbar-becomes-custom.html [ Crash ] +crbug.com/591099 scrollbars/iframe-scrollbar-becomes-custom.html [ Crash Pass ] crbug.com/591099 scrollbars/listbox-scrollbar-combinations.html [ Failure ] -crbug.com/591099 scrollbars/scrollable-iframe-click-gets-focus.html [ Crash ] -crbug.com/591099 scrollbars/scrollable-iframe-remove-crash.html [ Crash ] +crbug.com/591099 scrollbars/scrollable-iframe-click-gets-focus.html [ Crash Pass ] +crbug.com/591099 scrollbars/scrollable-iframe-remove-crash.html [ Crash Pass ] crbug.com/591099 scrollbars/scrollbar-added-during-drag.html [ Timeout ] crbug.com/591099 scrollbars/scrollbar-buttons.html [ Failure ] -crbug.com/591099 scrollbars/scrollbar-click-does-not-blur-content.html [ Crash ] +crbug.com/591099 scrollbars/scrollbar-click-does-not-blur-content.html [ Crash Failure ] crbug.com/591099 scrollbars/scrollbar-content-crash.html [ Failure ] crbug.com/591099 scrollbars/scrollbar-crash-on-refresh.html [ Failure ] crbug.com/591099 scrollbars/scrollbar-miss-mousemove-disabled.html [ Failure ] @@ -18573,7 +18583,7 @@ crbug.com/591099 scrollbars/scrollbar-visibility-hidden.html [ Failure ] crbug.com/591099 scrollbars/scrollbars-on-positioned-content.html [ Failure ] crbug.com/591099 scrollbars/viewport-scrollbar-corner-with-percent-padding-crash.html [ Failure ] -crbug.com/591099 scrollingcoordinator/donot-compute-non-fast-scrollable-region-for-hidden-frames.html [ Crash Timeout ] +crbug.com/591099 scrollingcoordinator/donot-compute-non-fast-scrollable-region-for-hidden-frames.html [ Crash Pass Timeout ] crbug.com/591099 scrollingcoordinator/non-fast-scrollable-region-nested.html [ Failure ] crbug.com/591099 scrollingcoordinator/non-fast-scrollable-region-scaled-iframe.html [ Failure ] crbug.com/591099 scrollingcoordinator/non-fast-scrollable-region-transformed-iframe.html [ Failure ] @@ -18583,41 +18593,41 @@ crbug.com/591099 security/autocomplete-cleared-on-back.html [ Crash Failure ] crbug.com/591099 security/block-test-no-port.html [ Crash Failure ] crbug.com/591099 security/block-test.html [ Crash Failure ] -crbug.com/591099 security/cannot-read-self-from-file.html [ Crash ] -crbug.com/591099 sensor/accelerometer.html [ Crash ] -crbug.com/591099 sensor/orientation-sensor.html [ Crash ] -crbug.com/591099 shadow-dom/crashes/focus-navigation-infinite-loop.html [ Crash ] +crbug.com/591099 security/cannot-read-self-from-file.html [ Crash Pass ] +crbug.com/591099 sensor/accelerometer.html [ Crash Pass ] +crbug.com/591099 sensor/orientation-sensor.html [ Crash Pass ] +crbug.com/591099 shadow-dom/crashes/focus-navigation-infinite-loop.html [ Crash Pass ] crbug.com/591099 shadow-dom/css-cascade-inner-scope-important.html [ Failure ] crbug.com/591099 shadow-dom/css-cascade-outer-scope.html [ Failure ] crbug.com/591099 shadow-dom/css-cascade-slot-distributed.html [ Failure ] -crbug.com/591099 shadow-dom/css-focus-pseudo-match-shadow-host2.html [ Crash ] -crbug.com/591099 shadow-dom/css-focus-pseudo-match-shadow-host5.html [ Crash ] -crbug.com/591099 shadow-dom/delegatesFocus-highlight-sibling.html [ Crash ] +crbug.com/591099 shadow-dom/css-focus-pseudo-match-shadow-host2.html [ Crash Pass ] +crbug.com/591099 shadow-dom/css-focus-pseudo-match-shadow-host5.html [ Crash Pass ] +crbug.com/591099 shadow-dom/delegatesFocus-highlight-sibling.html [ Crash Pass ] crbug.com/591099 shadow-dom/event-composed-ua.html [ Timeout ] -crbug.com/591099 shadow-dom/focus-method-with-delegatesFocus.html [ Crash ] -crbug.com/591099 shadow-dom/focus-navigation-slot-fallback.html [ Crash ] -crbug.com/591099 shadow-dom/focus-navigation-slot-nested-2levels.html [ Crash ] -crbug.com/591099 shadow-dom/focus-navigation-slot-nested-delegatesFocus.html [ Crash ] -crbug.com/591099 shadow-dom/focus-navigation-slot-nested.html [ Crash ] -crbug.com/591099 shadow-dom/focus-navigation-slot-with-tabindex.html [ Crash ] -crbug.com/591099 shadow-dom/focus-navigation-slots.html [ Crash ] +crbug.com/591099 shadow-dom/focus-method-with-delegatesFocus.html [ Crash Pass ] +crbug.com/591099 shadow-dom/focus-navigation-slot-fallback.html [ Crash Pass ] +crbug.com/591099 shadow-dom/focus-navigation-slot-nested-2levels.html [ Crash Pass ] +crbug.com/591099 shadow-dom/focus-navigation-slot-nested-delegatesFocus.html [ Crash Pass ] +crbug.com/591099 shadow-dom/focus-navigation-slot-nested.html [ Crash Pass ] +crbug.com/591099 shadow-dom/focus-navigation-slot-with-tabindex.html [ Crash Pass ] +crbug.com/591099 shadow-dom/focus-navigation-slots.html [ Crash Pass ] crbug.com/591099 shadow-dom/focus-navigation-with-delegatesFocus.html [ Failure Timeout ] -crbug.com/591099 shadow-dom/focus-navigation.html [ Crash ] -crbug.com/591099 shadow-dom/focus-slide-on-shadow-host.html [ Crash ] -crbug.com/591099 shadow-dom/focus-with-negative-index.html [ Crash ] -crbug.com/591099 shadow-dom/nodetree-labels-node-list.html [ Crash ] -crbug.com/591099 shadow-dom/nodetree-radio-node-list.html [ Crash ] -crbug.com/591099 shadow-dom/pointer-lock-in-shadow.html [ Crash ] +crbug.com/591099 shadow-dom/focus-navigation.html [ Crash Pass ] +crbug.com/591099 shadow-dom/focus-slide-on-shadow-host.html [ Crash Pass ] +crbug.com/591099 shadow-dom/focus-with-negative-index.html [ Crash Pass ] +crbug.com/591099 shadow-dom/nodetree-labels-node-list.html [ Crash Pass ] +crbug.com/591099 shadow-dom/nodetree-radio-node-list.html [ Crash Pass ] +crbug.com/591099 shadow-dom/pointer-lock-in-shadow.html [ Crash Pass ] crbug.com/591099 shadow-dom/slotted-pseudo-element-in-v0-tree-crash.html [ Failure ] -crbug.com/591099 shadow-dom/v0/event-composed-path.html [ Crash ] +crbug.com/591099 shadow-dom/v0/event-composed-path.html [ Crash Pass ] crbug.com/591099 shadow-dom/v0/get-destination-insertion-points-re-distribution.html [ Failure ] crbug.com/591099 shadow-dom/v0/get-destination-insertion-points.html [ Failure ] crbug.com/591099 shadow-dom/v0/multiple-shadowroot-with-params.html [ Failure ] -crbug.com/591099 shadow-dom/v0/pointer-lock-in-shadow.html [ Crash ] -crbug.com/591099 shadow-dom/v0/pointer-lock-in-shadow2.html [ Crash ] -crbug.com/591099 shadow-dom/v0/pointer-lock-in-shadow3.html [ Crash ] -crbug.com/591099 shapedetection/detection-HTMLImageElement.html [ Crash ] -crbug.com/591099 shapedetection/detection-options.html [ Crash ] +crbug.com/591099 shadow-dom/v0/pointer-lock-in-shadow.html [ Crash Pass ] +crbug.com/591099 shadow-dom/v0/pointer-lock-in-shadow2.html [ Crash Pass ] +crbug.com/591099 shadow-dom/v0/pointer-lock-in-shadow3.html [ Crash Pass ] +crbug.com/591099 shapedetection/detection-HTMLImageElement.html [ Crash Pass ] +crbug.com/591099 shapedetection/detection-options.html [ Crash Pass ] crbug.com/591099 storage/domstorage/clear.html [ Failure ] crbug.com/591099 storage/domstorage/complex-keys.html [ Failure ] crbug.com/591099 storage/domstorage/complex-values.html [ Failure ] @@ -18867,20 +18877,20 @@ crbug.com/591099 storage/quota/storagequota-query-usage.html [ Failure ] crbug.com/591099 storage/quota/storagequota-request-quota.html [ Failure ] crbug.com/591099 storage/websql/close-during-stress-test.html [ Failure ] -crbug.com/591099 storage/websql/database-removed-context-crash.html [ Crash ] +crbug.com/591099 storage/websql/database-removed-context-crash.html [ Crash Pass ] crbug.com/591099 storage/websql/execute-sql-rowsAffected.html [ Failure ] crbug.com/591099 storage/websql/null-characters.html [ Failure ] -crbug.com/591099 storage/websql/transaction-removed-context-crash.html [ Crash ] -crbug.com/591099 svg/animations/accumulate-use-count.html [ Crash ] +crbug.com/591099 storage/websql/transaction-removed-context-crash.html [ Crash Pass ] +crbug.com/591099 svg/animations/accumulate-use-count.html [ Crash Pass ] crbug.com/591099 svg/animations/accumulate-values-width-animation.html [ Failure ] -crbug.com/591099 svg/animations/add-after-load-use-counter.html [ Crash ] +crbug.com/591099 svg/animations/add-after-load-use-counter.html [ Crash Pass ] crbug.com/591099 svg/animations/additive-from-to-width-animation.html [ Failure ] crbug.com/591099 svg/animations/additive-type-by-animation.html [ Failure Timeout ] -crbug.com/591099 svg/animations/additive-use-count.html [ Crash ] +crbug.com/591099 svg/animations/additive-use-count.html [ Crash Pass ] crbug.com/591099 svg/animations/additive-values-width-animation.html [ Failure ] crbug.com/591099 svg/animations/animVal-basics.html [ Timeout ] crbug.com/591099 svg/animations/animate-calcMode-spline-by.html [ Timeout ] -crbug.com/591099 svg/animations/animate-calcMode-spline-crash-bad-array-length.xhtml [ Crash ] +crbug.com/591099 svg/animations/animate-calcMode-spline-crash-bad-array-length.xhtml [ Crash Pass ] crbug.com/591099 svg/animations/animate-calcMode-spline-from-by.html [ Timeout ] crbug.com/591099 svg/animations/animate-calcMode-spline-from-to.html [ Timeout ] crbug.com/591099 svg/animations/animate-calcMode-spline-to.html [ Timeout ] @@ -18922,7 +18932,7 @@ crbug.com/591099 svg/animations/animate-insert-begin.html [ Failure ] crbug.com/591099 svg/animations/animate-insert-no-begin.html [ Failure ] crbug.com/591099 svg/animations/animate-keySplines.html [ Timeout ] -crbug.com/591099 svg/animations/animate-keysplines-crash.html [ Crash ] +crbug.com/591099 svg/animations/animate-keysplines-crash.html [ Crash Pass ] crbug.com/591099 svg/animations/animate-marker-orient-from-angle-to-angle.html [ Timeout ] crbug.com/591099 svg/animations/animate-marker-orient-from-angle-to-auto.html [ Timeout ] crbug.com/591099 svg/animations/animate-marker-orient-from-auto-to-angle.html [ Timeout ] @@ -18944,7 +18954,7 @@ crbug.com/591099 svg/animations/animate-path-to-animation.html [ Timeout ] crbug.com/591099 svg/animations/animate-setcurrenttime.html [ Failure ] crbug.com/591099 svg/animations/animate-text-nested-transforms.html [ Timeout ] -crbug.com/591099 svg/animations/animate-values-whitespace.html [ Crash ] +crbug.com/591099 svg/animations/animate-values-whitespace.html [ Crash Pass ] crbug.com/591099 svg/animations/animateMotion-fill-freeze.html [ Failure ] crbug.com/591099 svg/animations/animateMotion-fill-remove.html [ Failure ] crbug.com/591099 svg/animations/animateMotion-multiple.html [ Failure ] @@ -18953,13 +18963,13 @@ crbug.com/591099 svg/animations/animateTransform-translate-attributetype-auto.html [ Timeout ] crbug.com/591099 svg/animations/animateTransform-translate-invalid-attributetype.html [ Timeout ] crbug.com/591099 svg/animations/animation-begin-change-js.html [ Timeout ] -crbug.com/591099 svg/animations/animation-dependency-crash.html [ Crash ] -crbug.com/591099 svg/animations/animation-started-use-counter.html [ Crash ] -crbug.com/591099 svg/animations/animationElementTiming-use-counter.html [ Crash ] +crbug.com/591099 svg/animations/animation-dependency-crash.html [ Crash Pass ] +crbug.com/591099 svg/animations/animation-started-use-counter.html [ Crash Pass ] +crbug.com/591099 svg/animations/animationElementTiming-use-counter.html [ Crash Pass ] crbug.com/591099 svg/animations/attributeTypes.html [ Failure ] -crbug.com/591099 svg/animations/begin-use-counters.html [ Crash ] -crbug.com/591099 svg/animations/beginEndAnimationElement-use-counter.html [ Crash ] -crbug.com/591099 svg/animations/calcMode-use-counters.html [ Crash ] +crbug.com/591099 svg/animations/begin-use-counters.html [ Crash Pass ] +crbug.com/591099 svg/animations/beginEndAnimationElement-use-counter.html [ Crash Pass ] +crbug.com/591099 svg/animations/calcMode-use-counters.html [ Crash Pass ] crbug.com/591099 svg/animations/change-baseVal-while-animating-fill-freeze-2.html [ Failure ] crbug.com/591099 svg/animations/change-baseVal-while-animating-fill-freeze.html [ Failure ] crbug.com/591099 svg/animations/change-baseVal-while-animating-fill-remove-2.html [ Failure ] @@ -18967,32 +18977,32 @@ crbug.com/591099 svg/animations/change-css-property-while-animating-fill-freeze.html [ Failure ] crbug.com/591099 svg/animations/change-css-property-while-animating-fill-remove.html [ Failure ] crbug.com/591099 svg/animations/change-target-while-animating-SVG-property.html [ Failure ] -crbug.com/591099 svg/animations/cssanimation-inactivedocument-crash.html [ Crash ] -crbug.com/591099 svg/animations/currentTime-use-counter.html [ Crash ] +crbug.com/591099 svg/animations/cssanimation-inactivedocument-crash.html [ Crash Pass ] +crbug.com/591099 svg/animations/currentTime-use-counter.html [ Crash Pass ] crbug.com/591099 svg/animations/cyclic-syncbase.html [ Failure ] crbug.com/591099 svg/animations/deferred-insertion.html [ Timeout ] crbug.com/591099 svg/animations/discard-on-discard.html [ Failure ] -crbug.com/591099 svg/animations/discard-on-svg-crash-2.html [ Crash ] -crbug.com/591099 svg/animations/discard-on-svg-crash.html [ Crash ] -crbug.com/591099 svg/animations/dynamic-modify-transform-without-baseval.html [ Crash ] -crbug.com/591099 svg/animations/end-use-counters.html [ Crash ] +crbug.com/591099 svg/animations/discard-on-svg-crash-2.html [ Crash Failure ] +crbug.com/591099 svg/animations/discard-on-svg-crash.html [ Crash Pass ] +crbug.com/591099 svg/animations/dynamic-modify-transform-without-baseval.html [ Crash Pass ] +crbug.com/591099 svg/animations/end-use-counters.html [ Crash Pass ] crbug.com/591099 svg/animations/force-use-shadow-tree-recreation-while-animating.html [ Failure ] -crbug.com/591099 svg/animations/img-tag-css-length-animation-crash.html [ Crash ] +crbug.com/591099 svg/animations/img-tag-css-length-animation-crash.html [ Crash Pass ] crbug.com/591099 svg/animations/multiple-animations-ending.html [ Failure Timeout ] crbug.com/591099 svg/animations/multiple-animations-fill-freeze.html [ Failure ] crbug.com/591099 svg/animations/multiple-begin-additive-animation.html [ Failure ] crbug.com/591099 svg/animations/non-additive-type-by-animation.html [ Failure ] crbug.com/591099 svg/animations/non-additive-type-from-by-animation.html [ Failure ] -crbug.com/591099 svg/animations/pause-setcurrenttime-unpause-before-timeline-start.html [ Crash ] -crbug.com/591099 svg/animations/pausing-use-counter.html [ Crash ] +crbug.com/591099 svg/animations/pause-setcurrenttime-unpause-before-timeline-start.html [ Crash Pass ] +crbug.com/591099 svg/animations/pausing-use-counter.html [ Crash Pass ] crbug.com/591099 svg/animations/reinserting-svg-into-document.html [ Failure ] crbug.com/591099 svg/animations/remove-animation-element-while-animation-is-running.html [ Failure ] crbug.com/591099 svg/animations/repeatn-remove-add-animation.html [ Failure ] -crbug.com/591099 svg/animations/script-href-no-animate.html [ Crash ] +crbug.com/591099 svg/animations/script-href-no-animate.html [ Crash Pass ] crbug.com/591099 svg/animations/single-values-animation.html [ Failure ] -crbug.com/591099 svg/animations/smil-element-target-crash-main.html [ Crash ] +crbug.com/591099 svg/animations/smil-element-target-crash-main.html [ Crash Pass ] crbug.com/591099 svg/animations/smil-scheduled-in-inactive-document-crash.html [ Failure ] -crbug.com/591099 svg/animations/svg-animation-parseValues.html [ Crash ] +crbug.com/591099 svg/animations/svg-animation-parseValues.html [ Crash Pass ] crbug.com/591099 svg/animations/svg-animation-policy-none.html [ Failure ] crbug.com/591099 svg/animations/svg-animation-policy-once.html [ Failure ] crbug.com/591099 svg/animations/svgPreserveAspectRatio-animation-1.html [ Timeout ] @@ -19071,12 +19081,12 @@ crbug.com/591099 svg/animations/svgstring-animation-fallback-to-discrete.html [ Timeout ] crbug.com/591099 svg/animations/svgtransform-animation-1.html [ Timeout ] crbug.com/591099 svg/animations/svgtransform-animation-discrete.html [ Timeout ] -crbug.com/591099 svg/animations/target-condition-crash.html [ Crash ] -crbug.com/591099 svg/animations/target-move-crash.html [ Crash ] -crbug.com/591099 svg/animations/target-move-relative-length-invalidation-crash.html [ Crash ] +crbug.com/591099 svg/animations/target-condition-crash.html [ Crash Pass ] +crbug.com/591099 svg/animations/target-move-crash.html [ Crash Pass ] +crbug.com/591099 svg/animations/target-move-relative-length-invalidation-crash.html [ Crash Pass ] crbug.com/591099 svg/animations/use-animate-transform-and-position.html [ Timeout ] crbug.com/591099 svg/animations/use-animate-width-and-height.html [ Timeout ] -crbug.com/591099 svg/animations/use-while-animating-crash.html [ Crash ] +crbug.com/591099 svg/animations/use-while-animating-crash.html [ Crash Pass ] crbug.com/591099 svg/as-background-image/animated-svg-as-background.html [ Failure Pass ] crbug.com/591099 svg/as-background-image/background-image-preserveaspectRatio-support.html [ Failure Pass ] crbug.com/591099 svg/as-background-image/background-image-tiled.html [ Failure Pass ] @@ -19094,18 +19104,18 @@ crbug.com/591099 svg/as-background-image/svg-width-100p-as-background.html [ Failure Pass ] crbug.com/591099 svg/as-border-image/svg-as-border-image-2.html [ Failure ] crbug.com/591099 svg/as-border-image/svg-as-border-image.html [ Failure ] -crbug.com/591099 svg/as-iframe/svg-in-iframe.html [ Crash ] +crbug.com/591099 svg/as-iframe/svg-in-iframe.html [ Crash Pass ] crbug.com/591099 svg/as-image/animated-use-as-image-crash.html [ Failure ] -crbug.com/591099 svg/as-image/data-font-in-css-crash.html [ Crash ] -crbug.com/591099 svg/as-image/data-font-in-css-invalid-data-url-crash.html [ Crash ] -crbug.com/591099 svg/as-image/data-font-in-css-invalid-font-crash.html [ Crash ] +crbug.com/591099 svg/as-image/data-font-in-css-crash.html [ Crash Pass ] +crbug.com/591099 svg/as-image/data-font-in-css-invalid-data-url-crash.html [ Crash Pass ] +crbug.com/591099 svg/as-image/data-font-in-css-invalid-font-crash.html [ Crash Pass ] crbug.com/591099 svg/as-image/image-respects-deviceScaleFactor.html [ Failure ] crbug.com/591099 svg/as-image/image-respects-pageScaleFactor-change.html [ Failure ] crbug.com/591099 svg/as-image/image-respects-pageScaleFactor.html [ Failure ] crbug.com/591099 svg/as-image/img-preserveAspectRatio-support-1.html [ Failure Pass ] crbug.com/591099 svg/as-image/img-preserveAspectRatio-support-2.html [ Failure Pass ] crbug.com/591099 svg/as-image/same-image-two-instances.html [ Failure Pass ] -crbug.com/591099 svg/as-image/svg-as-image-intrinsic-size.html [ Crash ] +crbug.com/591099 svg/as-image/svg-as-image-intrinsic-size.html [ Crash Pass ] crbug.com/591099 svg/as-image/svg-as-image.html [ Failure ] crbug.com/591099 svg/as-image/svg-as-relative-image-with-explicit-size.html [ Failure ] crbug.com/591099 svg/as-image/svg-as-relative-image.html [ Failure ] @@ -19121,27 +19131,27 @@ crbug.com/591099 svg/as-object/svg-embedded-in-html-in-iframe.html [ Failure Pass Timeout ] crbug.com/591099 svg/canvas/canvas-default-object-sizing.html [ Failure Pass ] crbug.com/591099 svg/canvas/canvas-draw-image-globalalpha.html [ Failure Pass ] -crbug.com/591099 svg/canvas/canvas-draw-image-size.html [ Crash ] +crbug.com/591099 svg/canvas/canvas-draw-image-size.html [ Crash Pass ] crbug.com/591099 svg/canvas/canvas-draw-image-svg-fragment.html [ Crash Pass ] -crbug.com/591099 svg/canvas/canvas-draw-pattern-size.html [ Crash ] +crbug.com/591099 svg/canvas/canvas-draw-pattern-size.html [ Crash Pass ] crbug.com/591099 svg/canvas/canvas-draw-pattern-svg-fragment.html [ Crash Pass ] crbug.com/591099 svg/canvas/canvas-pattern-svg.html [ Failure ] -crbug.com/591099 svg/canvas/image-svg-intrinsic-size.html [ Crash ] +crbug.com/591099 svg/canvas/image-svg-intrinsic-size.html [ Crash Pass ] crbug.com/591099 svg/carto.net/frameless-svg-parse-error.html [ Failure ] -crbug.com/591099 svg/clip-path/clip-path-foreign-object-crash.html [ Crash ] +crbug.com/591099 svg/clip-path/clip-path-foreign-object-crash.html [ Crash Pass ] crbug.com/591099 svg/css/background-image-svg.html [ Crash Failure Pass ] -crbug.com/591099 svg/css/baseline-shift-inherit.html [ Crash ] +crbug.com/591099 svg/css/baseline-shift-inherit.html [ Crash Pass ] crbug.com/591099 svg/css/buffered-rendering.html [ Failure ] crbug.com/591099 svg/css/css-box-min-width.html [ Failure ] -crbug.com/591099 svg/css/display-computed.html [ Crash ] +crbug.com/591099 svg/css/display-computed.html [ Crash Pass ] crbug.com/591099 svg/css/getComputedStyle-listing.xhtml [ Failure ] -crbug.com/591099 svg/css/getComputedStyle-svg-text-width-height.html [ Crash ] +crbug.com/591099 svg/css/getComputedStyle-svg-text-width-height.html [ Crash Pass ] crbug.com/591099 svg/css/mask-type.html [ Failure ] crbug.com/591099 svg/css/max-height.html [ Failure ] crbug.com/591099 svg/css/max-width.html [ Failure ] crbug.com/591099 svg/css/opacity-not-supporting-percentage.html [ Failure ] crbug.com/591099 svg/css/parse-length.html [ Failure ] -crbug.com/591099 svg/css/path-element.html [ Crash ] +crbug.com/591099 svg/css/path-element.html [ Crash Pass ] crbug.com/591099 svg/css/rect-system-color.xhtml [ Failure ] crbug.com/591099 svg/css/scientific-numbers.html [ Failure ] crbug.com/591099 svg/css/svg-attribute-length-parsing.html [ Failure ] @@ -19154,9 +19164,9 @@ crbug.com/591099 svg/custom/absolute-sized-svg-in-xhtml.xhtml [ Failure ] crbug.com/591099 svg/custom/acid3-test-77.html [ Failure ] crbug.com/591099 svg/custom/anchor-on-use.svg [ Failure ] -crbug.com/591099 svg/custom/animate-initial-pause-unpause.html [ Crash ] -crbug.com/591099 svg/custom/animate-pause-resume.html [ Crash ] -crbug.com/591099 svg/custom/animate-svgsvgelement.html [ Crash ] +crbug.com/591099 svg/custom/animate-initial-pause-unpause.html [ Crash Pass ] +crbug.com/591099 svg/custom/animate-pause-resume.html [ Crash Pass ] +crbug.com/591099 svg/custom/animate-svgsvgelement.html [ Crash Pass ] crbug.com/591099 svg/custom/animation-values-parsing-error.html [ Failure ] crbug.com/591099 svg/custom/bad-attributeName-crash.html [ Failure ] crbug.com/591099 svg/custom/boundingBox.html [ Failure ] @@ -19168,13 +19178,13 @@ crbug.com/591099 svg/custom/crash-textPath-attributes.html [ Failure ] crbug.com/591099 svg/custom/createImageElement2.xhtml [ Failure ] crbug.com/591099 svg/custom/currentColor-on-color.html [ Failure ] -crbug.com/591099 svg/custom/disallow-non-lengths-in-attrs.html [ Crash ] -crbug.com/591099 svg/custom/display-none-a-does-not-stop-focus-navigation.html [ Crash ] +crbug.com/591099 svg/custom/disallow-non-lengths-in-attrs.html [ Crash Pass ] +crbug.com/591099 svg/custom/display-none-a-does-not-stop-focus-navigation.html [ Crash Pass ] crbug.com/591099 svg/custom/dominant-baseline-hanging.svg [ Failure ] crbug.com/591099 svg/custom/elementTimeControl-nan-crash.html [ Failure ] crbug.com/591099 svg/custom/embedded-svg-allowed-in-dashboard.xml [ Failure ] crbug.com/591099 svg/custom/embedding-external-svgs.xhtml [ Failure Pass ] -crbug.com/591099 svg/custom/events-in-shadow-tree.html [ Crash ] +crbug.com/591099 svg/custom/events-in-shadow-tree.html [ Crash Pass ] crbug.com/591099 svg/custom/external-paintserver-reference.svg [ Failure Pass ] crbug.com/591099 svg/custom/filter-css-transform-resolution.html [ Failure Pass ] crbug.com/591099 svg/custom/focus-event-handling-keyboard.xhtml [ Failure ] @@ -19183,13 +19193,13 @@ crbug.com/591099 svg/custom/fragment-navigation-01.html [ Failure ] crbug.com/591099 svg/custom/fragment-navigation-02.html [ Failure ] crbug.com/591099 svg/custom/frame-getSVGDocument.html [ Failure ] -crbug.com/591099 svg/custom/getBBox-circle-has-one-zero-value.html [ Crash ] -crbug.com/591099 svg/custom/getBBox-ellipse-has-one-zero-value.html [ Crash ] -crbug.com/591099 svg/custom/getBBox-empty-container.html [ Crash ] -crbug.com/591099 svg/custom/getBBox-rect-has-one-zero-value.html [ Crash ] -crbug.com/591099 svg/custom/getBBox-use.html [ Crash ] +crbug.com/591099 svg/custom/getBBox-circle-has-one-zero-value.html [ Crash Pass ] +crbug.com/591099 svg/custom/getBBox-ellipse-has-one-zero-value.html [ Crash Pass ] +crbug.com/591099 svg/custom/getBBox-empty-container.html [ Crash Pass ] +crbug.com/591099 svg/custom/getBBox-rect-has-one-zero-value.html [ Crash Pass ] +crbug.com/591099 svg/custom/getBBox-use.html [ Crash Pass ] crbug.com/591099 svg/custom/getBoundingClientRect.xhtml [ Failure ] -crbug.com/591099 svg/custom/getClientRects.html [ Crash ] +crbug.com/591099 svg/custom/getClientRects.html [ Crash Pass ] crbug.com/591099 svg/custom/getscreenctm-in-mixed-content.xhtml [ Failure ] crbug.com/591099 svg/custom/getscreenctm-in-mixed-content2.xhtml [ Failure ] crbug.com/591099 svg/custom/getscreenctm-in-scrollable-div-area-nested.xhtml [ Failure ] @@ -19203,7 +19213,7 @@ crbug.com/591099 svg/custom/image-parent-translation.xhtml [ Failure ] crbug.com/591099 svg/custom/image-rescale-clip.html [ Failure ] crbug.com/591099 svg/custom/image-rescale-scroll.html [ Failure ] -crbug.com/591099 svg/custom/image-svgload-after-docload.html [ Crash ] +crbug.com/591099 svg/custom/image-svgload-after-docload.html [ Crash Pass ] crbug.com/591099 svg/custom/image-with-attr-change-after-delete-crash.html [ Crash Pass ] crbug.com/591099 svg/custom/inline-svg-in-xhtml.xml [ Failure ] crbug.com/591099 svg/custom/inline-svg-use-available-width-in-stf.html [ Failure ] @@ -19213,10 +19223,10 @@ crbug.com/591099 svg/custom/junk-data.svg [ Failure ] crbug.com/591099 svg/custom/keySplines-parsing-error.html [ Failure ] crbug.com/591099 svg/custom/keyTimes-parsing-error.html [ Failure ] -crbug.com/591099 svg/custom/load-image-removed-in-onload.html [ Crash ] -crbug.com/591099 svg/custom/load-image-reparented-in-onload.html [ Crash ] +crbug.com/591099 svg/custom/load-image-removed-in-onload.html [ Crash Pass ] +crbug.com/591099 svg/custom/load-image-reparented-in-onload.html [ Crash Pass ] crbug.com/591099 svg/custom/load-non-wellformed.svg [ Failure ] -crbug.com/591099 svg/custom/load-svgfragments-inserted-after-docload.html [ Crash ] +crbug.com/591099 svg/custom/load-svgfragments-inserted-after-docload.html [ Crash Pass ] crbug.com/591099 svg/custom/manually-parsed-embedded-svg-allowed-in-dashboard.html [ Failure ] crbug.com/591099 svg/custom/manually-parsed-svg-allowed-in-dashboard.html [ Failure ] crbug.com/591099 svg/custom/marker-orient-auto.html [ Failure ] @@ -19230,7 +19240,7 @@ crbug.com/591099 svg/custom/object-sizing-explicit-width-height.xhtml [ Failure Pass ] crbug.com/591099 svg/custom/object-sizing-explicit-width.xhtml [ Failure ] crbug.com/591099 svg/custom/object-sizing-no-width-height.xhtml [ Failure ] -crbug.com/591099 svg/custom/object-sizing-zero-intrinsic-width-height.html [ Crash ] +crbug.com/591099 svg/custom/object-sizing-zero-intrinsic-width-height.html [ Crash Pass ] crbug.com/591099 svg/custom/object-sizing.xhtml [ Crash Failure ] crbug.com/591099 svg/custom/path-bad-data.svg [ Failure ] crbug.com/591099 svg/custom/pattern-3-step-cycle-dynamic-1.html [ Failure ] @@ -19245,13 +19255,13 @@ crbug.com/591099 svg/custom/pointer-events-on-svg-with-pointer.xhtml [ Failure ] crbug.com/591099 svg/custom/pointer-events-on-svg-without-pointer.xhtml [ Failure ] crbug.com/591099 svg/custom/poly-parsing-error.html [ Failure ] -crbug.com/591099 svg/custom/removed-from-animation-crash.html [ Crash ] +crbug.com/591099 svg/custom/removed-from-animation-crash.html [ Crash Pass ] crbug.com/591099 svg/custom/rootmost-svg-xy-attrs.xhtml [ Failure ] crbug.com/591099 svg/custom/scroll-to-svg-element-assertion.html [ Failure ] crbug.com/591099 svg/custom/second-inline-text.xhtml [ Failure Pass ] crbug.com/591099 svg/custom/simpleCDF.xml [ Failure Pass ] -crbug.com/591099 svg/custom/size-follows-container-size.html [ Crash ] -crbug.com/591099 svg/custom/stf-container-with-intrinsic-ratio-svg.html [ Crash ] +crbug.com/591099 svg/custom/size-follows-container-size.html [ Crash Failure ] +crbug.com/591099 svg/custom/stf-container-with-intrinsic-ratio-svg.html [ Crash Pass ] crbug.com/591099 svg/custom/svg-allowed-in-dashboard-object.html [ Failure ] crbug.com/591099 svg/custom/svg-createsvgtransform-type.html [ Failure ] crbug.com/591099 svg/custom/svg-float-border-padding.xml [ Failure ] @@ -19260,8 +19270,8 @@ crbug.com/591099 svg/custom/svg-fonts-no-latin-glyph.html [ Failure ] crbug.com/591099 svg/custom/svg-fonts-with-no-element-reference.html [ Failure Pass ] crbug.com/591099 svg/custom/svg-fonts-word-spacing.html [ Failure ] -crbug.com/591099 svg/custom/svg-image-intrinsic-size-with-cssstyle-auto-dynamic-image-change.html [ Crash ] -crbug.com/591099 svg/custom/svg-image-intrinsic-size-with-cssstyle-auto.html [ Crash ] +crbug.com/591099 svg/custom/svg-image-intrinsic-size-with-cssstyle-auto-dynamic-image-change.html [ Crash Pass ] +crbug.com/591099 svg/custom/svg-image-intrinsic-size-with-cssstyle-auto.html [ Crash Pass ] crbug.com/591099 svg/custom/svg-modify-currentTranslate.html [ Failure ] crbug.com/591099 svg/custom/svg-root-padding-border-margin.html [ Failure Pass ] crbug.com/591099 svg/custom/svg-viewBox-dynamic.html [ Failure ] @@ -19269,7 +19279,7 @@ crbug.com/591099 svg/custom/tabindex-order.html [ Failure ] crbug.com/591099 svg/custom/tearoffs-with-tearoffs.html [ Failure ] crbug.com/591099 svg/custom/text-match-highlight.html [ Failure ] -crbug.com/591099 svg/custom/text-use-click-crash.xhtml [ Crash ] +crbug.com/591099 svg/custom/text-use-click-crash.xhtml [ Crash Pass ] crbug.com/591099 svg/custom/text-zoom.xhtml [ Failure Pass ] crbug.com/591099 svg/custom/title-assertion.html [ Failure ] crbug.com/591099 svg/custom/touch-events.html [ Failure ] @@ -19282,7 +19292,7 @@ crbug.com/591099 svg/custom/use-invalid-html.xhtml [ Failure ] crbug.com/591099 svg/custom/use-invalid-pattern.svg [ Failure ] crbug.com/591099 svg/custom/use-invalid-style.svg [ Failure ] -crbug.com/591099 svg/custom/use-invalidate-click-crash.xhtml [ Crash ] +crbug.com/591099 svg/custom/use-invalidate-click-crash.xhtml [ Crash Pass ] crbug.com/591099 svg/custom/use-on-disallowed-foreign-object-1.svg [ Failure Pass ] crbug.com/591099 svg/custom/use-on-disallowed-foreign-object-2.svg [ Failure Pass ] crbug.com/591099 svg/custom/use-on-disallowed-foreign-object-3.svg [ Failure Pass ] @@ -19293,28 +19303,28 @@ crbug.com/591099 svg/custom/use-referencing-style-crash.svg [ Failure ] crbug.com/591099 svg/custom/viewport-em.svg [ Failure Pass ] crbug.com/591099 svg/custom/xhtml-no-svg-renderer.xhtml [ Crash Failure Pass ] -crbug.com/591099 svg/custom/zoomed-alignment-baseline.html [ Crash ] -crbug.com/591099 svg/custom/zoomed-baseline-shift.html [ Crash ] -crbug.com/591099 svg/custom/zoomed-ex-em-font-sizes.html [ Crash ] -crbug.com/591099 svg/custom/zoomed-mixed-scripts.html [ Crash ] +crbug.com/591099 svg/custom/zoomed-alignment-baseline.html [ Crash Pass ] +crbug.com/591099 svg/custom/zoomed-baseline-shift.html [ Crash Pass ] +crbug.com/591099 svg/custom/zoomed-ex-em-font-sizes.html [ Crash Pass ] +crbug.com/591099 svg/custom/zoomed-mixed-scripts.html [ Crash Pass ] crbug.com/591099 svg/dispatch-event-crash-on-destruct.html [ Failure ] crbug.com/591099 svg/dom/SVGAnimatedListPropertyTearOff-crash-2.html [ Failure ] crbug.com/591099 svg/dom/SVGAnimatedListPropertyTearOff-crash.html [ Failure ] -crbug.com/591099 svg/dom/SVGAnimationElement-exceptions.html [ Crash ] -crbug.com/591099 svg/dom/SVGGeometryElement-getPointAtLength-attached.html [ Crash ] -crbug.com/591099 svg/dom/SVGGeometryElement-getTotalLength-attached.html [ Crash ] -crbug.com/591099 svg/dom/SVGLength-calc-in-attr.html [ Crash ] -crbug.com/591099 svg/dom/SVGLength-viewport-units.html [ Crash ] -crbug.com/591099 svg/dom/SVGLengthList-appendItem.html [ Crash ] -crbug.com/591099 svg/dom/SVGLengthList-appendItemFromClearedList.html [ Crash ] -crbug.com/591099 svg/dom/SVGLengthList-basics.html [ Crash ] -crbug.com/591099 svg/dom/SVGLengthList-dom-modifications.html [ Crash ] -crbug.com/591099 svg/dom/SVGLengthList-getItem.html [ Crash ] -crbug.com/591099 svg/dom/SVGLengthList-initialize.html [ Crash ] -crbug.com/591099 svg/dom/SVGLengthList-insertItemBefore.html [ Crash ] -crbug.com/591099 svg/dom/SVGLengthList-removeItem.html [ Crash ] -crbug.com/591099 svg/dom/SVGLengthList-replaceItem.html [ Crash ] -crbug.com/591099 svg/dom/SVGLengthList-setEmptyString.html [ Crash ] +crbug.com/591099 svg/dom/SVGAnimationElement-exceptions.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGGeometryElement-getPointAtLength-attached.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGGeometryElement-getTotalLength-attached.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGLength-calc-in-attr.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGLength-viewport-units.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGLengthList-appendItem.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGLengthList-appendItemFromClearedList.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGLengthList-basics.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGLengthList-dom-modifications.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGLengthList-getItem.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGLengthList-initialize.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGLengthList-insertItemBefore.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGLengthList-removeItem.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGLengthList-replaceItem.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGLengthList-setEmptyString.html [ Crash Pass ] crbug.com/591099 svg/dom/SVGLocatable-getCTM-svg-root.html [ Failure ] crbug.com/591099 svg/dom/SVGMatrix-interface.xhtml [ Failure ] crbug.com/591099 svg/dom/SVGNumberList-basics.xhtml [ Failure ] @@ -19326,25 +19336,25 @@ crbug.com/591099 svg/dom/SVGSVGElement-intersection-enclosure.html [ Failure ] crbug.com/591099 svg/dom/SVGStringList-basics.xhtml [ Failure ] crbug.com/591099 svg/dom/SVGStringList.html [ Failure ] -crbug.com/591099 svg/dom/SVGStyleElement.html [ Crash ] +crbug.com/591099 svg/dom/SVGStyleElement.html [ Crash Pass ] crbug.com/591099 svg/dom/SVGStyleElement/disable-svg-style-element.html [ Failure ] crbug.com/591099 svg/dom/SVGStyleElement/style-langspace.html [ Failure ] -crbug.com/591099 svg/dom/SVGStyledElement-pendingResource-crash.html [ Crash ] -crbug.com/591099 svg/dom/SVGTransformList-basics.html [ Crash ] -crbug.com/591099 svg/dom/SVGTransformList-with-existing-item.html [ Crash ] +crbug.com/591099 svg/dom/SVGStyledElement-pendingResource-crash.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGTransformList-basics.html [ Crash Pass ] +crbug.com/591099 svg/dom/SVGTransformList-with-existing-item.html [ Crash Pass ] crbug.com/591099 svg/dom/content-model.html [ Failure ] crbug.com/591099 svg/dom/css-transforms.xhtml [ Failure ] crbug.com/591099 svg/dom/document-createEvent-mandatory-arg.html [ Failure ] crbug.com/591099 svg/dom/feFlood-no-in1.html [ Failure ] crbug.com/591099 svg/dom/frame-related-api-during-load.html [ Failure ] crbug.com/591099 svg/dom/getElementsByTagName-localName-matching.html [ Failure ] -crbug.com/591099 svg/dom/getScreenCTM-ancestor-transform.html [ Crash ] -crbug.com/591099 svg/dom/getbbox.html [ Crash ] -crbug.com/591099 svg/dom/getscreenctm-use-with-additional-translation.html [ Crash ] -crbug.com/591099 svg/dom/href-baseval-animval.html [ Crash ] +crbug.com/591099 svg/dom/getScreenCTM-ancestor-transform.html [ Crash Pass ] +crbug.com/591099 svg/dom/getbbox.html [ Crash Pass ] +crbug.com/591099 svg/dom/getscreenctm-use-with-additional-translation.html [ Crash Pass ] +crbug.com/591099 svg/dom/href-baseval-animval.html [ Crash Pass ] crbug.com/591099 svg/dom/id-reflect.html [ Failure ] crbug.com/591099 svg/dom/length-list-parser.html [ Failure Timeout ] -crbug.com/591099 svg/dom/linear-gradient-default-length.html [ Crash ] +crbug.com/591099 svg/dom/linear-gradient-default-length.html [ Crash Pass ] crbug.com/591099 svg/dom/method-argument-aritychecks.html [ Failure ] crbug.com/591099 svg/dom/method-argument-typechecks.html [ Failure ] crbug.com/591099 svg/dom/move-animating-svg-to-other-frame.html [ Failure ] @@ -19360,12 +19370,12 @@ crbug.com/591099 svg/dom/svg-element-attribute-js-null.xhtml [ Failure ] crbug.com/591099 svg/dom/svg-root-lengths.html [ Failure ] crbug.com/591099 svg/dom/svg2-inheritance.html [ Failure ] -crbug.com/591099 svg/dom/svgangle-units.html [ Crash ] -crbug.com/591099 svg/dom/svglength-units.html [ Crash ] +crbug.com/591099 svg/dom/svgangle-units.html [ Crash Timeout ] +crbug.com/591099 svg/dom/svglength-units.html [ Crash Pass ] crbug.com/591099 svg/dom/svgpath-getPathSegAtLength.html [ Failure ] crbug.com/591099 svg/dom/text-rotate-live.html [ Failure ] -crbug.com/591099 svg/dom/title-in-shadow-tree.html [ Crash ] -crbug.com/591099 svg/dom/tooltip-title-with-use.html [ Crash ] +crbug.com/591099 svg/dom/title-in-shadow-tree.html [ Crash Failure ] +crbug.com/591099 svg/dom/tooltip-title-with-use.html [ Crash Failure ] crbug.com/591099 svg/dom/undefined-null.html [ Failure ] crbug.com/591099 svg/dynamic-updates/SVG-dynamic-css-transform.html [ Failure ] crbug.com/591099 svg/dynamic-updates/SVGAElement-dom-href-attr.html [ Failure ] @@ -19701,11 +19711,11 @@ crbug.com/591099 svg/dynamic-updates/SVGUseElement-svgdom-href1-prop.html [ Failure ] crbug.com/591099 svg/dynamic-updates/SVGUseElement-svgdom-href2-prop.html [ Failure ] crbug.com/591099 svg/filters/feBlend-all-modes.html [ Failure Pass ] -crbug.com/591099 svg/filters/feComponentTransfer-style-crash.xhtml [ Crash ] -crbug.com/591099 svg/filters/feDisplacementMap-crash-test.xhtml [ Crash ] +crbug.com/591099 svg/filters/feComponentTransfer-style-crash.xhtml [ Crash Pass ] +crbug.com/591099 svg/filters/feDisplacementMap-crash-test.xhtml [ Crash Pass ] crbug.com/591099 svg/filters/feLight-non-lighting-parent-crash.html [ Failure ] crbug.com/591099 svg/filters/feTurbulence-bad-seeds.html [ Failure ] -crbug.com/591099 svg/filters/filter-detach-crash.html [ Crash ] +crbug.com/591099 svg/filters/filter-detach-crash.html [ Crash Pass ] crbug.com/591099 svg/filters/reparent-animated-filter-target.html [ Failure ] crbug.com/591099 svg/foreignObject/background-render-phase.html [ Failure ] crbug.com/591099 svg/foreignObject/body-background.svg [ Failure Pass ] @@ -19718,10 +19728,10 @@ crbug.com/591099 svg/foreignObject/no-crash-with-svg-content-in-html-document.svg [ Failure Pass ] crbug.com/591099 svg/foreignObject/svg-document-in-html-document.svg [ Failure Pass ] crbug.com/591099 svg/foreignObject/vertical-foreignObject.html [ Failure ] -crbug.com/591099 svg/foreignObject/viewport-foreignobject-crash.html [ Crash ] -crbug.com/591099 svg/hittest/clip-path-shape.html [ Crash ] +crbug.com/591099 svg/foreignObject/viewport-foreignobject-crash.html [ Crash Pass ] +crbug.com/591099 svg/hittest/clip-path-shape.html [ Crash Failure ] crbug.com/591099 svg/hittest/ellipse-hittest.html [ Failure ] -crbug.com/591099 svg/hittest/empty-container.html [ Crash ] +crbug.com/591099 svg/hittest/empty-container.html [ Crash Failure ] crbug.com/591099 svg/hittest/pointer-events-all.html [ Failure ] crbug.com/591099 svg/hittest/pointer-events-all2.html [ Failure ] crbug.com/591099 svg/hittest/rect-hittest.html [ Failure ] @@ -19738,13 +19748,13 @@ crbug.com/591099 svg/hittest/svg-small-path.xhtml [ Failure ] crbug.com/591099 svg/hittest/svg-small-viewbox.xhtml [ Failure ] crbug.com/591099 svg/hittest/svg-use-element-from-point.html [ Failure ] -crbug.com/591099 svg/hittest/text-small-font-size.html [ Crash ] -crbug.com/591099 svg/hittest/text-vertical.html [ Crash ] +crbug.com/591099 svg/hittest/text-small-font-size.html [ Crash Failure ] +crbug.com/591099 svg/hittest/text-vertical.html [ Crash Failure ] crbug.com/591099 svg/hittest/update-ellipse.html [ Failure ] crbug.com/591099 svg/hittest/update-rect.html [ Failure ] -crbug.com/591099 svg/hittest/zero-length-butt-cap-path.xhtml [ Crash ] -crbug.com/591099 svg/hittest/zero-length-round-cap-path.xhtml [ Crash ] -crbug.com/591099 svg/hittest/zero-length-square-cap-path.xhtml [ Crash ] +crbug.com/591099 svg/hittest/zero-length-butt-cap-path.xhtml [ Crash Failure ] +crbug.com/591099 svg/hittest/zero-length-round-cap-path.xhtml [ Crash Failure ] +crbug.com/591099 svg/hittest/zero-length-square-cap-path.xhtml [ Crash Failure ] crbug.com/591099 svg/hixie/data-types/002.xhtml [ Failure Pass ] crbug.com/591099 svg/hixie/error/012.xml [ Failure ] crbug.com/591099 svg/hixie/error/013.xml [ Failure ] @@ -19764,7 +19774,7 @@ crbug.com/591099 svg/hixie/rendering-model/004.xhtml [ Failure Pass ] crbug.com/591099 svg/in-html/by-reference.html [ Failure Pass ] crbug.com/591099 svg/in-html/circle.html [ Failure Pass ] -crbug.com/591099 svg/in-html/sizing/svg-inline-vertical.html [ Crash ] +crbug.com/591099 svg/in-html/sizing/svg-inline-vertical.html [ Crash Pass ] crbug.com/591099 svg/in-html/sizing/svg-inline.html [ Failure Timeout ] crbug.com/591099 svg/overflow/overflow-on-foreignObject.svg [ Crash Failure Pass ] crbug.com/591099 svg/overflow/overflow-on-outermost-svg-element-in-xhtml-auto.xhtml [ Failure ] @@ -19773,53 +19783,53 @@ crbug.com/591099 svg/overflow/overflow-on-outermost-svg-element-in-xhtml-scroll.xhtml [ Failure ] crbug.com/591099 svg/overflow/overflow-on-outermost-svg-element-in-xhtml-visible.xhtml [ Failure ] crbug.com/591099 svg/parser/foreign-object-case-sensitivity.html [ Failure ] -crbug.com/591099 svg/parser/whitespace-angle-1.html [ Crash ] -crbug.com/591099 svg/parser/whitespace-angle-2.html [ Crash ] -crbug.com/591099 svg/parser/whitespace-angle-invalid-1.html [ Crash ] -crbug.com/591099 svg/parser/whitespace-angle-invalid-2.html [ Crash ] -crbug.com/591099 svg/parser/whitespace-integer.html [ Crash ] -crbug.com/591099 svg/parser/whitespace-length-invalid-1.html [ Crash ] -crbug.com/591099 svg/parser/whitespace-length-invalid-2.html [ Crash ] -crbug.com/591099 svg/parser/whitespace-length-invalid-3.html [ Crash ] -crbug.com/591099 svg/parser/whitespace-length-invalid-4.html [ Crash ] -crbug.com/591099 svg/parser/whitespace-length.html [ Crash ] -crbug.com/591099 svg/parser/whitespace-number.html [ Crash ] +crbug.com/591099 svg/parser/whitespace-angle-1.html [ Crash Pass Timeout ] +crbug.com/591099 svg/parser/whitespace-angle-2.html [ Crash Pass ] +crbug.com/591099 svg/parser/whitespace-angle-invalid-1.html [ Crash Timeout ] +crbug.com/591099 svg/parser/whitespace-angle-invalid-2.html [ Crash Timeout ] +crbug.com/591099 svg/parser/whitespace-integer.html [ Crash Pass Timeout ] +crbug.com/591099 svg/parser/whitespace-length-invalid-1.html [ Crash Timeout ] +crbug.com/591099 svg/parser/whitespace-length-invalid-2.html [ Crash Timeout ] +crbug.com/591099 svg/parser/whitespace-length-invalid-3.html [ Crash Timeout ] +crbug.com/591099 svg/parser/whitespace-length-invalid-4.html [ Crash Timeout ] +crbug.com/591099 svg/parser/whitespace-length.html [ Crash Pass Timeout ] +crbug.com/591099 svg/parser/whitespace-number.html [ Crash Timeout ] crbug.com/591099 svg/stroke/empty-path.html [ Failure Pass ] crbug.com/591099 svg/text/bbox-with-glyph-overflow-on-path.html [ Failure ] crbug.com/591099 svg/text/bbox-with-glyph-overflow-zoomed.html [ Failure ] crbug.com/591099 svg/text/bbox-with-glyph-overflow.html [ Failure ] -crbug.com/591099 svg/text/bidi-getcharnumatpos.html [ Crash ] -crbug.com/591099 svg/text/bidi-getcomputedtextlength.html [ Crash ] -crbug.com/591099 svg/text/bidi-getsubstringlength.html [ Crash ] +crbug.com/591099 svg/text/bidi-getcharnumatpos.html [ Crash Pass ] +crbug.com/591099 svg/text/bidi-getcomputedtextlength.html [ Crash Pass ] +crbug.com/591099 svg/text/bidi-getsubstringlength.html [ Crash Pass ] crbug.com/591099 svg/text/combining-character-queries.html [ Failure Pass ] -crbug.com/591099 svg/text/empty-text-node-crash.html [ Crash ] +crbug.com/591099 svg/text/empty-text-node-crash.html [ Crash Pass ] crbug.com/591099 svg/text/foreignObject-repaint.xml [ Failure ] crbug.com/591099 svg/text/foreignObject-text-clipping-bug.xml [ Failure Pass ] -crbug.com/591099 svg/text/getcharnumatposition-multiple-fragments.html [ Crash ] -crbug.com/591099 svg/text/getextentofchar-nonbmp.html [ Crash ] +crbug.com/591099 svg/text/getcharnumatposition-multiple-fragments.html [ Crash Pass ] +crbug.com/591099 svg/text/getextentofchar-nonbmp.html [ Crash Pass ] crbug.com/591099 svg/text/invalid-glyph-crash.html [ Failure ] -crbug.com/591099 svg/text/invalid-non-bmp-characters.html [ Crash ] +crbug.com/591099 svg/text/invalid-non-bmp-characters.html [ Crash Pass ] crbug.com/591099 svg/text/lengthAdjust-text-metrics.html [ Failure ] crbug.com/591099 svg/text/ligature-queries.html [ Failure Pass ] crbug.com/591099 svg/text/scaling-font-with-geometric-precision.html [ Failure ] -crbug.com/591099 svg/text/select-svg-text-with-collapsed-whitespace.html [ Crash ] +crbug.com/591099 svg/text/select-svg-text-with-collapsed-whitespace.html [ Crash Failure ] crbug.com/591099 svg/text/select-text-inside-non-static-position.html [ Failure ] crbug.com/591099 svg/text/selection-background-color.xhtml [ Failure Pass ] -crbug.com/591099 svg/text/selection-dragging-outside-1.html [ Crash ] -crbug.com/591099 svg/text/selection-dragging-outside-2.html [ Crash ] -crbug.com/591099 svg/text/selection-dragging-outside-3.html [ Crash ] -crbug.com/591099 svg/text/selection-pseudo-resource-invalidation-crash.html [ Crash ] +crbug.com/591099 svg/text/selection-dragging-outside-1.html [ Crash Failure ] +crbug.com/591099 svg/text/selection-dragging-outside-2.html [ Crash Failure ] +crbug.com/591099 svg/text/selection-dragging-outside-3.html [ Crash Failure ] +crbug.com/591099 svg/text/selection-pseudo-resource-invalidation-crash.html [ Crash Pass ] crbug.com/591099 svg/text/selection-styles.xhtml [ Failure Pass ] crbug.com/591099 svg/text/small-fonts-in-html5.html [ Failure Pass ] crbug.com/591099 svg/text/surrogate-pair-queries.html [ Failure Pass ] -crbug.com/591099 svg/text/svgtextcontentelement-glyphqueries-rtl.html [ Crash ] -crbug.com/591099 svg/text/text-bbox-empty.html [ Crash ] -crbug.com/591099 svg/text/text-bbox-of-empty-after-change.html [ Crash ] -crbug.com/591099 svg/text/text-getSubStringLength.html [ Crash ] +crbug.com/591099 svg/text/svgtextcontentelement-glyphqueries-rtl.html [ Crash Pass ] +crbug.com/591099 svg/text/text-bbox-empty.html [ Crash Pass ] +crbug.com/591099 svg/text/text-bbox-of-empty-after-change.html [ Crash Pass ] +crbug.com/591099 svg/text/text-getSubStringLength.html [ Crash Pass ] crbug.com/591099 svg/text/text-repaint-rects.xhtml [ Failure ] crbug.com/591099 svg/text/text-style-recalc-crash.html [ Failure Pass ] -crbug.com/591099 svg/text/textpath-reference-crash.html [ Crash ] -crbug.com/591099 svg/text/textquery-collapsed-whitespace.html [ Crash ] +crbug.com/591099 svg/text/textpath-reference-crash.html [ Crash Pass ] +crbug.com/591099 svg/text/textquery-collapsed-whitespace.html [ Crash Pass ] crbug.com/591099 svg/text/unpaired-surrogate-with-trailing-char-crash.html [ Failure ] crbug.com/591099 svg/text/white-space-pre-wrap-whitespace-only-crash.html [ Failure ] crbug.com/591099 svg/transforms/negative-scale-value.html [ Failure ] @@ -19827,12 +19837,12 @@ crbug.com/591099 svg/transforms/svg-css-transforms-clip-path.xhtml [ Failure ] crbug.com/591099 svg/transforms/svg-css-transforms.xhtml [ Failure ] crbug.com/591099 svg/transforms/text-with-pattern-inside-transformed-html.xhtml [ Failure ] -crbug.com/591099 svg/transforms/transform-boxsize-usecounter-1.html [ Crash ] -crbug.com/591099 svg/transforms/transform-boxsize-usecounter-2.html [ Crash ] -crbug.com/591099 svg/transforms/transform-boxsize-usecounter-3.html [ Crash ] -crbug.com/591099 svg/transforms/transform-boxsize-usecounter-4.html [ Crash ] -crbug.com/591099 svg/transforms/transform-boxsize-usecounter-no-trigger-1.html [ Crash ] -crbug.com/591099 svg/transforms/transform-boxsize-usecounter-no-trigger-2.html [ Crash ] +crbug.com/591099 svg/transforms/transform-boxsize-usecounter-1.html [ Crash Pass ] +crbug.com/591099 svg/transforms/transform-boxsize-usecounter-2.html [ Crash Pass ] +crbug.com/591099 svg/transforms/transform-boxsize-usecounter-3.html [ Crash Pass ] +crbug.com/591099 svg/transforms/transform-boxsize-usecounter-4.html [ Crash Pass ] +crbug.com/591099 svg/transforms/transform-boxsize-usecounter-no-trigger-1.html [ Crash Pass ] +crbug.com/591099 svg/transforms/transform-boxsize-usecounter-no-trigger-2.html [ Crash Pass ] crbug.com/591099 svg/transforms/transform-origin-presentation-attribute.xhtml [ Failure ] crbug.com/591099 svg/wicd/test-rightsizing-a.xhtml [ Failure ] crbug.com/591099 svg/wicd/test-rightsizing-b.xhtml [ Failure ] @@ -19866,7 +19876,7 @@ crbug.com/591099 svg/zoom/text/zoom-hixie-mixed-009.xml [ Failure Pass ] crbug.com/591099 svg/zoom/text/zoom-hixie-rendering-model-004.xhtml [ Failure Pass ] crbug.com/591099 svg/zoom/text/zoom-svg-float-border-padding.xml [ Failure ] -crbug.com/591099 svg/zoom/xy-getcomputedstyle.html [ Crash ] +crbug.com/591099 svg/zoom/xy-getcomputedstyle.html [ Crash Pass ] crbug.com/591099 tables/hittesting/filltable-stress.html [ Pass Timeout ] crbug.com/591099 tables/layering/paint-test-layering-1.html [ Failure ] crbug.com/591099 tables/layering/paint-test-layering-2.html [ Failure ] @@ -20178,21 +20188,21 @@ crbug.com/591099 touchadjustment/context-menu-select-text.html [ Failure ] crbug.com/591099 touchadjustment/context-menu-shadow-node.html [ Failure ] crbug.com/591099 touchadjustment/context-menu-text-subtargets.html [ Failure ] -crbug.com/591099 touchadjustment/context-menu.html [ Crash ] -crbug.com/591099 touchadjustment/disabled-formelements.html [ Crash ] +crbug.com/591099 touchadjustment/context-menu.html [ Crash Failure ] +crbug.com/591099 touchadjustment/disabled-formelements.html [ Crash Failure ] crbug.com/591099 touchadjustment/editable-content.html [ Crash Failure ] -crbug.com/591099 touchadjustment/event-triggered-widgets.html [ Crash ] -crbug.com/591099 touchadjustment/html-label.html [ Crash ] +crbug.com/591099 touchadjustment/event-triggered-widgets.html [ Crash Failure ] +crbug.com/591099 touchadjustment/html-label.html [ Crash Failure ] crbug.com/591099 touchadjustment/iframe.html [ Failure ] crbug.com/591099 touchadjustment/nested-shadow-node.html [ Failure ] crbug.com/591099 touchadjustment/nested-touch.html [ Failure ] -crbug.com/591099 touchadjustment/plugin.html [ Crash ] +crbug.com/591099 touchadjustment/plugin.html [ Crash Failure ] crbug.com/591099 touchadjustment/pseudo-element.html [ Failure ] crbug.com/591099 touchadjustment/rotated-node.html [ Failure ] crbug.com/591099 touchadjustment/scroll-offset.html [ Failure ] crbug.com/591099 touchadjustment/search-cancel.html [ Crash Failure ] crbug.com/591099 touchadjustment/simple-shadow-dom.html [ Failure ] -crbug.com/591099 touchadjustment/small-target-test.html [ Crash ] +crbug.com/591099 touchadjustment/small-target-test.html [ Crash Failure ] crbug.com/591099 touchadjustment/touch-inlines.html [ Failure ] crbug.com/591099 touchadjustment/touch-links-active.html [ Failure ] crbug.com/591099 touchadjustment/touch-links-longpress.html [ Failure ] @@ -20240,11 +20250,11 @@ crbug.com/591099 transforms/mirror-transform-tiled-scaled-background.html [ Failure ] crbug.com/591099 transforms/no_transform_hit_testing.html [ Failure ] crbug.com/591099 transforms/overflow-with-transform.html [ Failure ] -crbug.com/591099 transforms/perspective-origin-parsing.html [ Crash ] -crbug.com/591099 transforms/rotate-parsing.html [ Crash ] +crbug.com/591099 transforms/perspective-origin-parsing.html [ Crash Pass ] +crbug.com/591099 transforms/rotate-parsing.html [ Crash Pass ] crbug.com/591099 transforms/rotated-transform-affects-scrolling-1.html [ Failure ] crbug.com/591099 transforms/rotated-transform-affects-scrolling-2.html [ Failure ] -crbug.com/591099 transforms/scale-parsing.html [ Crash ] +crbug.com/591099 transforms/scale-parsing.html [ Crash Pass ] crbug.com/591099 transforms/scrollIntoView-transformed.html [ Failure ] crbug.com/591099 transforms/shadows.html [ Failure ] crbug.com/591099 transforms/skew-with-unitless-zero.html [ Failure ] @@ -20253,9 +20263,9 @@ crbug.com/591099 transforms/transform-inherit-initial-unprefixed.html [ Failure ] crbug.com/591099 transforms/transform-inside-overflow-scroll.html [ Failure ] crbug.com/591099 transforms/transform-on-inline.html [ Failure ] -crbug.com/591099 transforms/transform-origin-parsing.html [ Crash ] +crbug.com/591099 transforms/transform-origin-parsing.html [ Crash Pass ] crbug.com/591099 transforms/transform-overflow.html [ Failure ] -crbug.com/591099 transforms/transform-parsing.html [ Crash ] +crbug.com/591099 transforms/transform-parsing.html [ Crash Pass ] crbug.com/591099 transforms/transform-positioned-ancestor.html [ Failure Pass ] crbug.com/591099 transforms/transform-table-row.html [ Failure Pass ] crbug.com/591099 transforms/transformed-caret.html [ Failure ] @@ -20263,31 +20273,31 @@ crbug.com/591099 transforms/transformed-focused-text-input.html [ Failure ] crbug.com/591099 transforms/transforms-with-opacity.html [ Failure ] crbug.com/591099 transforms/transforms-with-zoom.html [ Failure ] -crbug.com/591099 transforms/translate-parsing.html [ Crash ] +crbug.com/591099 transforms/translate-parsing.html [ Crash Pass ] crbug.com/591099 transitions/3d/interrupted-transition.html [ Failure ] crbug.com/591099 transitions/bad-transition-shorthand-crash.html [ Failure ] -crbug.com/591099 transitions/cubic-bezier-overflow-svg-length.html [ Crash ] +crbug.com/591099 transitions/cubic-bezier-overflow-svg-length.html [ Crash Pass ] crbug.com/591099 transitions/inherit-other-props-do-not-affect-transition-property.html [ Failure ] crbug.com/591099 transitions/inherit-other-props.html [ Failure ] crbug.com/591099 transitions/inherit.html [ Failure ] -crbug.com/591099 transitions/interrupted-accelerated-transition.html [ Crash ] +crbug.com/591099 transitions/interrupted-accelerated-transition.html [ Crash Pass ] crbug.com/591099 transitions/interrupted-immediately.html [ Failure ] crbug.com/591099 transitions/matched-transform-functions.html [ Failure ] -crbug.com/591099 transitions/mismatched-shadow-styles.html [ Crash ] -crbug.com/591099 transitions/no-transition-on-implicit-margins.html [ Crash ] -crbug.com/591099 transitions/object-position-transition.html [ Crash ] +crbug.com/591099 transitions/mismatched-shadow-styles.html [ Crash Pass ] +crbug.com/591099 transitions/no-transition-on-implicit-margins.html [ Crash Pass ] +crbug.com/591099 transitions/object-position-transition.html [ Crash Pass ] crbug.com/591099 transitions/opacity-transform-transitions-inside-iframe.html [ Failure ] crbug.com/591099 transitions/opacity-transition-zindex.html [ Failure Pass ] crbug.com/591099 transitions/override-transition-crash.html [ Failure ] crbug.com/591099 transitions/retargetted-transition.html [ Failure ] crbug.com/591099 transitions/shadow.html [ Failure ] -crbug.com/591099 transitions/svg-layout-transition-zoom.html [ Crash ] -crbug.com/591099 transitions/svg-layout-transition.html [ Crash ] -crbug.com/591099 transitions/svg-transitions.html [ Crash ] +crbug.com/591099 transitions/svg-layout-transition-zoom.html [ Crash Pass ] +crbug.com/591099 transitions/svg-layout-transition.html [ Crash Pass ] +crbug.com/591099 transitions/svg-transitions.html [ Crash Pass ] crbug.com/591099 transitions/transition-end-event-all-properties.html [ Failure ] crbug.com/591099 transitions/transition-end-event-attributes.html [ Failure ] crbug.com/591099 transitions/transition-end-event-container.html [ Failure ] -crbug.com/591099 transitions/transition-end-event-destroy-iframe.html [ Crash ] +crbug.com/591099 transitions/transition-end-event-destroy-iframe.html [ Crash Failure ] crbug.com/591099 transitions/transition-end-event-destroy-renderer.html [ Failure ] crbug.com/591099 transitions/transition-end-event-left.html [ Failure ] crbug.com/591099 transitions/transition-end-event-multiple-01.html [ Failure ] @@ -20327,7 +20337,7 @@ crbug.com/591099 traversal/tree-walker-003.html [ Failure ] crbug.com/591099 traversal/tree-walker-004.html [ Failure ] crbug.com/591099 traversal/tree-walker-006.html [ Failure ] -crbug.com/591099 usb/usbDevice-iframe.html [ Crash ] +crbug.com/591099 usb/usbDevice-iframe.html [ Crash Pass ] crbug.com/591099 vibration/cancel-vibration-during-pattern-vibrating.html [ Failure ] crbug.com/591099 vibration/vibration-detached-no-crash.html [ Failure ] crbug.com/591099 vibration/vibration-durations.html [ Failure ] @@ -20335,7 +20345,7 @@ crbug.com/591099 vibration/vibration-iframe.html [ Timeout ] crbug.com/591099 vibration/vibration-patterns.html [ Failure ] crbug.com/591099 virtual/android/fast/rootscroller/set-root-scroller.html [ Failure ] -crbug.com/591099 virtual/android/fullscreen/anonymous-block-merge-crash.html [ Crash ] +crbug.com/591099 virtual/android/fullscreen/anonymous-block-merge-crash.html [ Crash Pass ] crbug.com/591099 virtual/android/fullscreen/compositor-touch-hit-rects-fullscreen-video-controls.html [ Failure ] crbug.com/591099 virtual/android/fullscreen/exit-full-screen-iframe.html [ Crash Failure ] crbug.com/591099 virtual/android/fullscreen/full-screen-cancel-nested.html [ Crash Failure ] @@ -20344,7 +20354,7 @@ crbug.com/591099 virtual/android/fullscreen/full-screen-element-stack.html [ Failure ] crbug.com/591099 virtual/android/fullscreen/full-screen-frameset.html [ Failure ] crbug.com/591099 virtual/android/fullscreen/full-screen-iframe-allowed-nested.html [ Timeout ] -crbug.com/591099 virtual/android/fullscreen/full-screen-iframe-allowed.html [ Crash ] +crbug.com/591099 virtual/android/fullscreen/full-screen-iframe-allowed.html [ Crash Failure ] crbug.com/591099 virtual/android/fullscreen/full-screen-iframe-legacy.html [ Failure ] crbug.com/591099 virtual/android/fullscreen/full-screen-iframe-not-allowed.html [ Failure ] crbug.com/591099 virtual/android/fullscreen/full-screen-iframe-without-allow-attribute-allowed-from-parent.html [ Failure ] @@ -20352,40 +20362,40 @@ crbug.com/591099 virtual/android/fullscreen/full-screen-request-removed.html [ Failure ] crbug.com/591099 virtual/android/fullscreen/full-screen-table-section.html [ Failure ] crbug.com/591099 virtual/android/fullscreen/full-screen-with-css-reference-filter.html [ Failure ] -crbug.com/591099 virtual/android/fullscreen/full-screen-with-flex-item.html [ Crash ] -crbug.com/591099 virtual/android/fullscreen/model/fully-exit-fullscreen-nested-iframe.html [ Crash ] +crbug.com/591099 virtual/android/fullscreen/full-screen-with-flex-item.html [ Crash Failure ] +crbug.com/591099 virtual/android/fullscreen/model/fully-exit-fullscreen-nested-iframe.html [ Crash Pass ] crbug.com/591099 virtual/android/fullscreen/video-controls-override.html [ Failure ] crbug.com/591099 virtual/android/fullscreen/video-controls-timeline.html [ Failure ] crbug.com/591099 virtual/android/fullscreen/video-fail-to-enter-full-screen.html [ Failure ] crbug.com/591099 virtual/android/media/mediadocument/media-document-with-download-button.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.composite.globalAlpha.fillPath.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.fillText.gradient.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.gradient.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.negative.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.verySmall.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.composite.globalAlpha.fillPath.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.fillText.gradient.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.gradient.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.negative.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.verySmall.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/OffscreenCanvas-constructor-in-worker.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/OffscreenCanvas-invalid-args-in-worker.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/OffscreenCanvas-transferable-exceptions.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/OffscreenCanvas-transferable.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/access-zero-sized-canvas.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/alpha.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/arc-crash.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/arc360.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/bug544329.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-2d-clip-anti-aliasing.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/access-zero-sized-canvas.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/alpha.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/arc-crash.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/arc360.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/bug544329.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-2d-clip-anti-aliasing.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ImageBitmap-close.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ImageBitmap-structured-clone.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ImageBitmap-transferable.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ImageData-neutered-source.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ImageData-workers.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-after-destroy-iframe.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-alphaImageData-behavior.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-arc-zero-lineto.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-bezier-same-endpoint.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-after-destroy-iframe.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-alphaImageData-behavior.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-arc-zero-lineto.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-bezier-same-endpoint.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-blending-image-over-image.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-blending-text.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-closePath-single-point.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-closePath-single-point.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-composite-alpha.html [ Crash Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-composite-canvas.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-composite-image.html [ Failure ] @@ -20404,25 +20414,25 @@ crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createImageBitmap-recursive.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createImageBitmap-svg-no-intrinsic-size.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createImageBitmap-svg.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createPattern-fillRect-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-currentColor.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-direction.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-draw-canvas-on-canvas-shadow.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createPattern-fillRect-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-currentColor.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-direction.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-draw-canvas-on-canvas-shadow.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-animated-images.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-animated.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-live-video.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-360-winding.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-animated.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-live-video.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-360-winding.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-connecting-line.html [ Failure Pass ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-zero-lineto.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-empty-image-pattern.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-alpha-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-gradient-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-pattern-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillRect-gradient-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillRect-shadow.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-zero-lineto.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-empty-image-pattern.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-alpha-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-gradient-shadow.html [ Crash Failure ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-pattern-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillRect-gradient-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillRect-shadow.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-fill-liveness.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-fill-paint-color.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-fill-paint-gradient.html [ Failure ] @@ -20439,100 +20449,100 @@ crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-width-height-hidpi.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-width-height-scale.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-width-height.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-font-cache.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-font-cache.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hides-fallback.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-accessibility-test.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-basic-test.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-clear-test.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-clip-test.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-css-transform-test.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-device-pixel-ratio-test.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-event-test.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-exception-test.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fallback-element-test-1.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fallback-element-test-2.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fallback-element-test-3.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fill-rule-test.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-path2d-test.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-path2d-transform-test.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-scale-factor.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-transform-test.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-invalid-fillstyle.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-invalid-strokestyle.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-accessibility-test.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-basic-test.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-clear-test.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-clip-test.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-css-transform-test.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-device-pixel-ratio-test.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-event-test.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-exception-test.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fallback-element-test-1.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fallback-element-test-2.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fallback-element-test-3.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fill-rule-test.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-path2d-test.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-path2d-transform-test.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-scale-factor.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-transform-test.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-invalid-fillstyle.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-invalid-strokestyle.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-invalid-video.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-isPointInStroke-with-path.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-isPointInStroke.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-large-dimensions.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineDash-input-sequence.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineDash-invalid.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineDash.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineWidth-intact-after-strokeRect.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-isPointInStroke-with-path.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-isPointInStroke.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-large-dimensions.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineDash-input-sequence.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineDash-invalid.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineDash.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineWidth-intact-after-strokeRect.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lost-gpu-context.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-measure-bidi-text.html [ Failure Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-negative-size.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-normalize-string.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-context-clip.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-context-fill.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-context-stroke.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-object.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-with-inf-nan-dimensions.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-set-transform.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-putImageData.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-quadratic-same-endpoint.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-context-clip.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-context-fill.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-context-stroke.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-object.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-with-inf-nan-dimensions.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-set-transform.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-putImageData.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-quadratic-same-endpoint.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-render-layer.html [ Failure Pass ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-resetTransform.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-resize-after-paint.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-drawImage-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-fillPath-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-fillRect-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-shadowBlur.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-strokePath-shadow.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-resetTransform.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-resize-after-paint.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-drawImage-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-fillPath-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-fillRect-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-shadowBlur.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-strokePath-shadow.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scroll-path-into-view.html [ Failure Timeout ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-set-properties-with-non-invertible-ctm.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-set-properties-with-non-invertible-ctm.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-shadow-source-in.html [ Failure Pass ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-skia-excessive-size.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-alpha-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-cap-join.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-gradient-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-skia-excessive-size.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-alpha-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-cap-join.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-gradient-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-text-baseline-tiny-fonts.html [ Failure Pass ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-text-space-characters.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-text-space-characters.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-textMetrics-width.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-transforms-during-path.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-transforms-fillRect-shadow.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-transforms-fillRect-shadow.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/currentTransform-null.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed-invisible-crash.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed-on-event.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed-with-path2d.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/drawImage-with-negative-source-destination.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/fallback-content.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/feimage-with-foreignobject-taint-canvas-2.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/feimage-with-foreignobject-taint-canvas.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed-invisible-crash.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed-on-event.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed-with-path2d.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/drawImage-with-negative-source-destination.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/fallback-content.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/feimage-with-foreignobject-taint-canvas-2.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/feimage-with-foreignobject-taint-canvas.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/fill-stroke-clip-reset-path.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/fillText-shadow.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/fillText-shadow.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/font-no-zoom.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/gradient-with-clip.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/font-no-zoom.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/gradient-with-clip.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/image-with-foreignobject-taint-canvas-2.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/image-with-foreignobject-taint-canvas.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/painting-on-bad-canvas.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/pattern-with-transform.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/image-with-foreignobject-taint-canvas-2.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/image-with-foreignobject-taint-canvas.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/painting-on-bad-canvas.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/pattern-with-transform.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/quadraticCurveTo.xml [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/resize-while-save-active.html [ Crash ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/set-empty-font-crash.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/resize-while-save-active.html [ Crash Pass ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/set-empty-font-crash.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/setWidthResetAfterForcedRender.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/shadow-huge-blur.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/shadow-huge-blur.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/shadow-offset-1.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/toDataURL-alpha.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/toDataURL-noData.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/toDataURL-noData.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/toDataURL-supportedTypes.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/transformed-canvas-reset.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/transformed-canvas-reset.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/unclosed-canvas-1.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/unclosed-canvas-3.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/unclosed-canvas-4.html [ Failure ] @@ -20543,12 +20553,12 @@ crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/renderer-and-vendor-strings.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/shader-deleted-by-accessor.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/tex-sub-image-cube-maps.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/texImage-imageBitmap-from-canvas-resize.html [ Crash ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/texImage-imageBitmap-from-canvas-resize.html [ Crash Pass ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/texture-color-profile.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/webgl-texture-binding-preserved.html [ Failure ] crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/webgl-viewport-parameters-preserved.html [ Failure ] -crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/zero-size-fill-rect.html [ Crash ] -crbug.com/591099 virtual/enable_wasm/external/wpt/wasm/wasm_local_iframe_test.html [ Crash Timeout ] +crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/zero-size-fill-rect.html [ Crash Pass ] +crbug.com/591099 virtual/enable_wasm/external/wpt/wasm/wasm_local_iframe_test.html [ Crash Pass Timeout ] crbug.com/591099 virtual/exotic-color-space/images/12-55.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/182.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/2-comp.html [ Failure ] @@ -20592,7 +20602,7 @@ crbug.com/591099 virtual/exotic-color-space/images/cross-fade-svg-size-diff.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/cross-fade-svg-size.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/cross-fade-tiled.html [ Failure ] -crbug.com/591099 virtual/exotic-color-space/images/destroyed-image-load-event.html [ Crash ] +crbug.com/591099 virtual/exotic-color-space/images/destroyed-image-load-event.html [ Crash Failure ] crbug.com/591099 virtual/exotic-color-space/images/drag-svg-image.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/embed-does-not-propagate-dimensions-to-object-ancestor.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/exif-orientation-css.html [ Crash Failure ] @@ -20608,7 +20618,7 @@ crbug.com/591099 virtual/exotic-color-space/images/icon-0colors.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/icon-decoding.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/image-change-src.html [ Crash Pass ] -crbug.com/591099 virtual/exotic-color-space/images/image-change-without-resize-shouldnt-layout.html [ Crash ] +crbug.com/591099 virtual/exotic-color-space/images/image-change-without-resize-shouldnt-layout.html [ Crash Pass ] crbug.com/591099 virtual/exotic-color-space/images/image-click-scale-restore-zoomed-image.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/image-css3-content-data.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/image-document-write-assert.html [ Failure ] @@ -20623,7 +20633,7 @@ crbug.com/591099 virtual/exotic-color-space/images/image-map-zoom-alt-content.html [ Crash Failure ] crbug.com/591099 virtual/exotic-color-space/images/image-map-zoom.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/image-page-injected-script-crash.html [ Crash Failure ] -crbug.com/591099 virtual/exotic-color-space/images/image-use-counters.html [ Crash ] +crbug.com/591099 virtual/exotic-color-space/images/image-use-counters.html [ Crash Pass ] crbug.com/591099 virtual/exotic-color-space/images/image-zoom-to-25.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/image-zoom-to-500.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/imagemap-circle-focus-ring.html [ Failure ] @@ -20639,17 +20649,17 @@ crbug.com/591099 virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/imagemap-polygon-focus-ring.html [ Failure ] -crbug.com/591099 virtual/exotic-color-space/images/imagemap-scroll.html [ Crash ] -crbug.com/591099 virtual/exotic-color-space/images/img-dimensions-styled.html [ Crash ] -crbug.com/591099 virtual/exotic-color-space/images/invalid-image-url-crash.html [ Crash ] +crbug.com/591099 virtual/exotic-color-space/images/imagemap-scroll.html [ Crash Failure ] +crbug.com/591099 virtual/exotic-color-space/images/img-dimensions-styled.html [ Crash Pass ] +crbug.com/591099 virtual/exotic-color-space/images/invalid-image-url-crash.html [ Crash Pass ] crbug.com/591099 virtual/exotic-color-space/images/jpeg-yuv-image-decoding.html [ Failure Pass ] crbug.com/591099 virtual/exotic-color-space/images/jpeg-yuv-progressive-canvas.html [ Failure Pass ] crbug.com/591099 virtual/exotic-color-space/images/jpeg-yuv-progressive-image.html [ Failure Pass ] crbug.com/591099 virtual/exotic-color-space/images/link-body-content-imageDimensionChanged-crash.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/load-img-with-empty-src.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/motion-jpeg-single-frame.html [ Failure ] -crbug.com/591099 virtual/exotic-color-space/images/move-image-to-new-document.html [ Crash ] -crbug.com/591099 virtual/exotic-color-space/images/multiple-inflight-error-event-crash.html [ Crash ] +crbug.com/591099 virtual/exotic-color-space/images/move-image-to-new-document.html [ Crash Pass ] +crbug.com/591099 virtual/exotic-color-space/images/multiple-inflight-error-event-crash.html [ Crash Pass ] crbug.com/591099 virtual/exotic-color-space/images/pdf-as-background.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/pdf-as-tiled-background.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/percent-height-image.html [ Failure ] @@ -20668,15 +20678,15 @@ crbug.com/591099 virtual/exotic-color-space/images/script-counter-imageDimensionChanged-crash.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/sprite-no-bleed.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/style-access-during-imageChanged-crash.html [ Crash Failure ] -crbug.com/591099 virtual/exotic-color-space/images/style-access-during-imageChanged-style-freeze.html [ Crash ] +crbug.com/591099 virtual/exotic-color-space/images/style-access-during-imageChanged-style-freeze.html [ Crash Pass ] crbug.com/591099 virtual/exotic-color-space/images/text-content-crash-2.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/text-content-crash.html [ Failure ] -crbug.com/591099 virtual/exotic-color-space/images/update-alt-text.html [ Crash ] +crbug.com/591099 virtual/exotic-color-space/images/update-alt-text.html [ Crash Pass ] crbug.com/591099 virtual/exotic-color-space/images/viewport-in-standalone-image-document.html [ Failure ] -crbug.com/591099 virtual/exotic-color-space/images/webgl-teximage2d.html [ Crash ] +crbug.com/591099 virtual/exotic-color-space/images/webgl-teximage2d.html [ Crash Pass ] crbug.com/591099 virtual/exotic-color-space/images/webp-flip.html [ Failure ] crbug.com/591099 virtual/exotic-color-space/images/zoomed-img-size.html [ Failure ] -crbug.com/591099 virtual/exotic-color-space/images/zoomed-offset-size.html [ Crash ] +crbug.com/591099 virtual/exotic-color-space/images/zoomed-offset-size.html [ Crash Pass ] crbug.com/591099 virtual/gpu-rasterization/images/12-55.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/182.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/2-comp.html [ Failure ] @@ -20717,7 +20727,7 @@ crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-simple.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-sizing.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-tiled.html [ Failure ] -crbug.com/591099 virtual/gpu-rasterization/images/destroyed-image-load-event.html [ Crash ] +crbug.com/591099 virtual/gpu-rasterization/images/destroyed-image-load-event.html [ Crash Failure ] crbug.com/591099 virtual/gpu-rasterization/images/drag-svg-image.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/embed-does-not-propagate-dimensions-to-object-ancestor.html [ Failure Pass ] crbug.com/591099 virtual/gpu-rasterization/images/exif-orientation-css.html [ Crash Failure ] @@ -20733,7 +20743,7 @@ crbug.com/591099 virtual/gpu-rasterization/images/icon-0colors.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/icon-decoding.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/image-change-src.html [ Crash Pass ] -crbug.com/591099 virtual/gpu-rasterization/images/image-change-without-resize-shouldnt-layout.html [ Crash ] +crbug.com/591099 virtual/gpu-rasterization/images/image-change-without-resize-shouldnt-layout.html [ Crash Pass ] crbug.com/591099 virtual/gpu-rasterization/images/image-click-scale-restore-zoomed-image.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/image-css3-content-data.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/image-document-write-assert.html [ Failure ] @@ -20748,7 +20758,7 @@ crbug.com/591099 virtual/gpu-rasterization/images/image-map-zoom-alt-content.html [ Crash Failure ] crbug.com/591099 virtual/gpu-rasterization/images/image-map-zoom.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/image-page-injected-script-crash.html [ Crash Failure ] -crbug.com/591099 virtual/gpu-rasterization/images/image-use-counters.html [ Crash ] +crbug.com/591099 virtual/gpu-rasterization/images/image-use-counters.html [ Crash Pass ] crbug.com/591099 virtual/gpu-rasterization/images/image-zoom-to-25.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/image-zoom-to-500.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/imagemap-circle-focus-ring.html [ Failure ] @@ -20764,17 +20774,17 @@ crbug.com/591099 virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/imagemap-polygon-focus-ring.html [ Failure ] -crbug.com/591099 virtual/gpu-rasterization/images/imagemap-scroll.html [ Crash ] -crbug.com/591099 virtual/gpu-rasterization/images/img-dimensions-styled.html [ Crash ] -crbug.com/591099 virtual/gpu-rasterization/images/invalid-image-url-crash.html [ Crash ] +crbug.com/591099 virtual/gpu-rasterization/images/imagemap-scroll.html [ Crash Failure ] +crbug.com/591099 virtual/gpu-rasterization/images/img-dimensions-styled.html [ Crash Pass ] +crbug.com/591099 virtual/gpu-rasterization/images/invalid-image-url-crash.html [ Crash Pass ] crbug.com/591099 virtual/gpu-rasterization/images/jpeg-yuv-image-decoding.html [ Failure Pass ] crbug.com/591099 virtual/gpu-rasterization/images/jpeg-yuv-progressive-canvas.html [ Failure Pass ] crbug.com/591099 virtual/gpu-rasterization/images/jpeg-yuv-progressive-image.html [ Failure Pass ] crbug.com/591099 virtual/gpu-rasterization/images/link-body-content-imageDimensionChanged-crash.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/load-img-with-empty-src.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/motion-jpeg-single-frame.html [ Failure ] -crbug.com/591099 virtual/gpu-rasterization/images/move-image-to-new-document.html [ Crash ] -crbug.com/591099 virtual/gpu-rasterization/images/multiple-inflight-error-event-crash.html [ Crash ] +crbug.com/591099 virtual/gpu-rasterization/images/move-image-to-new-document.html [ Crash Pass ] +crbug.com/591099 virtual/gpu-rasterization/images/multiple-inflight-error-event-crash.html [ Crash Pass ] crbug.com/591099 virtual/gpu-rasterization/images/pdf-as-background.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/pdf-as-tiled-background.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/percent-height-image.html [ Failure ] @@ -20793,43 +20803,43 @@ crbug.com/591099 virtual/gpu-rasterization/images/script-counter-imageDimensionChanged-crash.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/sprite-no-bleed.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/style-access-during-imageChanged-crash.html [ Crash Failure ] -crbug.com/591099 virtual/gpu-rasterization/images/style-access-during-imageChanged-style-freeze.html [ Crash ] +crbug.com/591099 virtual/gpu-rasterization/images/style-access-during-imageChanged-style-freeze.html [ Crash Pass ] crbug.com/591099 virtual/gpu-rasterization/images/text-content-crash-2.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/text-content-crash.html [ Failure ] -crbug.com/591099 virtual/gpu-rasterization/images/update-alt-text.html [ Crash ] +crbug.com/591099 virtual/gpu-rasterization/images/update-alt-text.html [ Crash Pass ] crbug.com/591099 virtual/gpu-rasterization/images/viewport-in-standalone-image-document.html [ Failure ] -crbug.com/591099 virtual/gpu-rasterization/images/webgl-teximage2d.html [ Crash ] +crbug.com/591099 virtual/gpu-rasterization/images/webgl-teximage2d.html [ Crash Pass ] crbug.com/591099 virtual/gpu-rasterization/images/webp-flip.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/zoomed-img-size.html [ Failure ] -crbug.com/591099 virtual/gpu-rasterization/images/zoomed-offset-size.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/2d.composite.globalAlpha.fillPath.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/2d.fillText.gradient.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.gradient.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.negative.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.verySmall.html [ Crash ] +crbug.com/591099 virtual/gpu-rasterization/images/zoomed-offset-size.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/2d.composite.globalAlpha.fillPath.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/2d.fillText.gradient.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.gradient.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.negative.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.verySmall.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-constructor-in-worker.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-invalid-args-in-worker.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-transferable-exceptions.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-transferable.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/access-zero-sized-canvas.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/alpha.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/arc-crash.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/arc360.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/bug544329.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-2d-clip-anti-aliasing.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/access-zero-sized-canvas.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/alpha.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/arc-crash.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/arc360.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/bug544329.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-2d-clip-anti-aliasing.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-ImageBitmap-close.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-ImageBitmap-structured-clone.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-ImageBitmap-transferable.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-ImageData-neutered-source.html [ Crash Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-ImageData-workers.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-after-destroy-iframe.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-alphaImageData-behavior.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-arc-zero-lineto.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-bezier-same-endpoint.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-after-destroy-iframe.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-alphaImageData-behavior.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-arc-zero-lineto.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-bezier-same-endpoint.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-blending-image-over-image.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-blending-text.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-closePath-single-point.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-closePath-single-point.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-composite-alpha.html [ Crash Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-composite-canvas.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-composite-image.html [ Failure ] @@ -20848,25 +20858,25 @@ crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-recursive.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-svg-no-intrinsic-size.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-svg.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-createPattern-fillRect-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-currentColor.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-direction.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-draw-canvas-on-canvas-shadow.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-createPattern-fillRect-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-currentColor.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-direction.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-draw-canvas-on-canvas-shadow.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-animated-images.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-animated.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-live-video.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse-360-winding.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-animated.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-live-video.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse-360-winding.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse-connecting-line.html [ Failure Pass ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse-zero-lineto.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-empty-image-pattern.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-alpha-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-gradient-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-pattern-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillRect-gradient-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillRect-shadow.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse-zero-lineto.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-empty-image-pattern.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-alpha-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-gradient-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-pattern-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillRect-gradient-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillRect-shadow.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-fill-liveness.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-fill-paint-color.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-fill-paint-gradient.html [ Failure ] @@ -20883,100 +20893,100 @@ crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-width-height-hidpi.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-width-height-scale.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-width-height.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-font-cache.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-font-cache.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-hides-fallback.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-accessibility-test.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-basic-test.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-clear-test.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-clip-test.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-css-transform-test.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-device-pixel-ratio-test.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-event-test.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-exception-test.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fallback-element-test-1.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fallback-element-test-2.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fallback-element-test-3.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fill-rule-test.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-path2d-test.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-path2d-transform-test.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-scale-factor.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-transform-test.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-imageSmoothingQuality.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-invalid-fillstyle.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-invalid-strokestyle.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-accessibility-test.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-basic-test.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-clear-test.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-clip-test.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-css-transform-test.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-device-pixel-ratio-test.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-event-test.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-exception-test.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fallback-element-test-1.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fallback-element-test-2.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fallback-element-test-3.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fill-rule-test.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-path2d-test.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-path2d-transform-test.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-scale-factor.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-transform-test.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-imageSmoothingQuality.html [ Crash Failure ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-invalid-fillstyle.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-invalid-strokestyle.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-invalid-video.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-isPointInStroke-with-path.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-isPointInStroke.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-large-dimensions.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineDash-input-sequence.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineDash-invalid.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineDash.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineWidth-intact-after-strokeRect.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-isPointInStroke-with-path.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-isPointInStroke.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-large-dimensions.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineDash-input-sequence.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineDash-invalid.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineDash.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineWidth-intact-after-strokeRect.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-lost-gpu-context.html [ Crash Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-measure-bidi-text.html [ Failure Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-negative-size.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-normalize-string.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-context-clip.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-context-fill.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-context-stroke.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-object.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-with-inf-nan-dimensions.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-pattern-set-transform.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-putImageData.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-quadratic-same-endpoint.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-context-clip.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-context-fill.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-context-stroke.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-object.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-with-inf-nan-dimensions.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-pattern-set-transform.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-putImageData.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-quadratic-same-endpoint.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-render-layer.html [ Failure Pass ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-resetTransform.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-resize-after-paint.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-drawImage-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-fillPath-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-fillRect-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-shadowBlur.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-strokePath-shadow.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-resetTransform.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-resize-after-paint.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-drawImage-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-fillPath-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-fillRect-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-shadowBlur.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-strokePath-shadow.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-scroll-path-into-view.html [ Failure Timeout ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-set-properties-with-non-invertible-ctm.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-set-properties-with-non-invertible-ctm.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-shadow-source-in.html [ Failure Pass ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-skia-excessive-size.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-alpha-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-cap-join.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-gradient-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-skia-excessive-size.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-alpha-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-cap-join.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-gradient-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-text-baseline-tiny-fonts.html [ Failure Pass ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-text-space-characters.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-text-space-characters.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-textMetrics-width.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/canvas-transforms-during-path.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-transforms-fillRect-shadow.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-transforms-fillRect-shadow.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/currentTransform-null.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed-invisible-crash.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed-on-event.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed-with-path2d.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/drawImage-with-negative-source-destination.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/fallback-content.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/feimage-with-foreignobject-taint-canvas-2.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/feimage-with-foreignobject-taint-canvas.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed-invisible-crash.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed-on-event.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed-with-path2d.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/drawImage-with-negative-source-destination.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/fallback-content.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/feimage-with-foreignobject-taint-canvas-2.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/feimage-with-foreignobject-taint-canvas.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/fill-stroke-clip-reset-path.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/fillText-shadow.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/fillText-shadow.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/fillrect_gradient.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/font-no-zoom.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/gradient-with-clip.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/font-no-zoom.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/gradient-with-clip.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/image-object-in-canvas.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/image-with-foreignobject-taint-canvas-2.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/image-with-foreignobject-taint-canvas.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/painting-on-bad-canvas.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/pattern-with-transform.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/image-with-foreignobject-taint-canvas-2.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/image-with-foreignobject-taint-canvas.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/painting-on-bad-canvas.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/pattern-with-transform.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/quadraticCurveTo.xml [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/resize-while-save-active.html [ Crash ] -crbug.com/591099 virtual/gpu/fast/canvas/set-empty-font-crash.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/resize-while-save-active.html [ Crash Pass ] +crbug.com/591099 virtual/gpu/fast/canvas/set-empty-font-crash.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/setWidthResetAfterForcedRender.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/shadow-huge-blur.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/shadow-huge-blur.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/shadow-offset-1.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/toDataURL-alpha.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/toDataURL-noData.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/toDataURL-noData.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/toDataURL-supportedTypes.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/transformed-canvas-reset.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/transformed-canvas-reset.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/unclosed-canvas-1.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/unclosed-canvas-3.html [ Crash Failure ] crbug.com/591099 virtual/gpu/fast/canvas/unclosed-canvas-4.html [ Failure ] @@ -20987,11 +20997,11 @@ crbug.com/591099 virtual/gpu/fast/canvas/webgl/renderer-and-vendor-strings.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/webgl/shader-deleted-by-accessor.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/webgl/tex-sub-image-cube-maps.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/webgl/texImage-imageBitmap-from-canvas-resize.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/webgl/texImage-imageBitmap-from-canvas-resize.html [ Crash Pass ] crbug.com/591099 virtual/gpu/fast/canvas/webgl/texture-color-profile.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/webgl/webgl-texture-binding-preserved.html [ Failure ] crbug.com/591099 virtual/gpu/fast/canvas/webgl/webgl-viewport-parameters-preserved.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/zero-size-fill-rect.html [ Crash ] +crbug.com/591099 virtual/gpu/fast/canvas/zero-size-fill-rect.html [ Crash Pass ] crbug.com/591099 virtual/high-contrast-mode/paint/high-contrast-mode/image-filter-all/text-on-backgrounds.html [ Failure ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-wrap-top-below-inline-003r.xht [ Failure Pass ] crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/block-replaced-width-006.xht [ Failure ] @@ -21016,11 +21026,13 @@ crbug.com/591099 virtual/layout_ng/fast/block/float/002.html [ Failure ] crbug.com/591099 virtual/layout_ng/fast/block/float/014.html [ Crash Failure ] crbug.com/591099 virtual/layout_ng/fast/block/float/017.html [ Failure ] +crbug.com/591099 virtual/layout_ng/fast/block/float/assert-when-moving-float.html [ Failure ] crbug.com/591099 virtual/layout_ng/fast/block/float/formatting-context-changes.html [ Failure ] crbug.com/591099 virtual/layout_ng/fast/block/float/overhanging-float-add-in-static-position-block.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng/fast/block/float/overhanging-float-add-in-static-position-block2.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-made-inline-crash.html [ Failure ] crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash-2.html [ Crash Failure ] +crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash.html [ Failure ] crbug.com/591099 virtual/layout_ng/fast/block/margin-collapse/line-beside-float-complex-margin-collapsing.html [ Failure ] crbug.com/591099 virtual/layout_ng/fast/block/margin-collapse/self-collapsing-block-creates-block-formatting-context.html [ Failure ] crbug.com/591099 virtual/mojo-loading/http/tests/inspector-protocol/network/disable-interception-midway.html [ Failure Pass Timeout ] @@ -21032,91 +21044,91 @@ crbug.com/591099 virtual/mojo-loading/http/tests/inspector/persistence/automapping-sourcemap.html [ Failure Pass Timeout ] crbug.com/591099 virtual/mojo-loading/http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.html [ Failure Pass Timeout ] crbug.com/591099 virtual/mojo-loading/http/tests/serviceworker/ServiceWorkerGlobalScope/registration-attribute.html [ Failure Pass ] -crbug.com/591099 virtual/mojo-localstorage/external/wpt/webstorage/event_no_duplicates.html [ Crash ] +crbug.com/591099 virtual/mojo-localstorage/external/wpt/webstorage/event_no_duplicates.html [ Crash Pass ] crbug.com/591099 virtual/mojo-localstorage/external/wpt/webstorage/storage_setitem.html [ Pass Timeout ] crbug.com/591099 virtual/mojo-localstorage/storage/domstorage/localstorage/missing-arguments.html [ Failure ] -crbug.com/591099 virtual/mse-1mb-buffers/http/tests/media/media-source/stream_memory_tests/mediasource-appendbuffer-quota-exceeded-1mb-buffers.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/external/wpt/remote-playback/idlharness.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/controls-list-add-hide.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/controls-list-remove-show.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/video-controls-overflow-menu-correct-ordering.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/video-controls-overflow-menu-updates-appropriately.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-dynamic-update.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-on-off.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-single-track.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-switch-track.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-button-narrow.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-button.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-do-not-fade-out.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-overlay-slow-fade.html [ Crash Timeout ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-overlay-cast-button.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-video-keynav-no-controls.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-video-keynav.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/download-button-displays-with-preload-none.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/overflow-fully-hidden.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/overlay-play-button-document-move.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/overlay-play-button-narrow.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/settings-disable-controls.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-click-outside.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-click-panel.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-click.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-resize.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-text.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-visibility.html [ Crash ] +crbug.com/591099 virtual/mse-1mb-buffers/http/tests/media/media-source/stream_memory_tests/mediasource-appendbuffer-quota-exceeded-1mb-buffers.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/external/wpt/remote-playback/idlharness.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/controls-list-add-hide.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/controls-list-remove-show.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/video-controls-overflow-menu-correct-ordering.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/video-controls-overflow-menu-updates-appropriately.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-dynamic-update.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-on-off.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-single-track.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-switch-track.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-button-narrow.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-button.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-do-not-fade-out.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-overlay-slow-fade.html [ Crash Pass Timeout ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-overlay-cast-button.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-video-keynav-no-controls.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-video-keynav.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/download-button-displays-with-preload-none.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/overflow-fully-hidden.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/overlay-play-button-document-move.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/overlay-play-button-narrow.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/settings-disable-controls.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-click-outside.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-click-panel.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-click.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-resize.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-text.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-visibility.html [ Crash Pass ] crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-with-cast-rendering.html [ Failure ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-enter-exit-fullscreen-while-hovering-shows-controls.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Crash ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-enter-exit-fullscreen-while-hovering-shows-controls.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Crash Pass ] crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-overlay-cast-dark-rendering.html [ Failure ] crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-overlay-cast-light-rendering.html [ Failure ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-overlay-play-button.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/remoteplayback/availability-callback-gc.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/remoteplayback/prompt-twice-throws.html [ Crash ] -crbug.com/591099 virtual/new-remote-playback-pipeline/media/remoteplayback/watch-availability-throws-low-end-device.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html [ Crash Timeout ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-overlay-play-button.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/remoteplayback/availability-callback-gc.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/remoteplayback/prompt-twice-throws.html [ Crash Pass ] +crbug.com/591099 virtual/new-remote-playback-pipeline/media/remoteplayback/watch-availability-throws-low-end-device.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html [ Crash Pass Timeout ] crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/registration-attribute.https.html [ Failure Pass ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/activation.https.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/activation.https.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/claim-fetch.https.html [ Crash Pass ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/claim-not-using-registration.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/client-id.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-get-cross-origin.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-get.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall-exact-controller.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall-include-uncontrolled.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall-order.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/extendable-event-async-waituntil.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-canvas-tainting-cache.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-canvas-tainting.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-cors-xhr.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-event.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-mixed-content-to-inscope.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-request-css-images.https.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/claim-not-using-registration.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/client-id.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-get-cross-origin.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-get.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall-exact-controller.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall-include-uncontrolled.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall-order.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/extendable-event-async-waituntil.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-canvas-tainting-cache.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-canvas-tainting.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-cors-xhr.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-event.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Crash Timeout ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-mixed-content-to-inscope.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-request-css-images.https.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-request-fallback.https.html [ Crash Pass ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-request-redirect.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-response-taint.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/foreign-fetch-cors.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/multi-globals/url-parsing.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-preload/redirect.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-preload/resource-timing.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-redirect-to-http.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-redirect.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ready.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/register-closed-window.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/register-link-header.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/register-same-scope-different-script-url.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/registration-iframe.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/unregister-controller.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/unregister-then-register.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/windowclient-navigate.https.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/fetch/chromium/discarded-window.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-request-redirect.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-response-taint.https.html [ Crash Timeout ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/foreign-fetch-cors.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/multi-globals/url-parsing.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-preload/redirect.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-preload/resource-timing.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-redirect-to-http.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-redirect.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ready.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/register-closed-window.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/register-link-header.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/register-same-scope-different-script-url.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/registration-iframe.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/unregister-controller.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/unregister-then-register.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/windowclient-navigate.https.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/fetch/chromium/discarded-window.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/lazy-addeventlisteners.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-worker-agents.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-worker-manager.html [ Failure ] @@ -21124,14 +21136,14 @@ crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-bypass-for-network-redirect.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-force-update-on-page-load.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-navigation-preload.html [ Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-redundant.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-view.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-redundant.html [ Crash Failure ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-view.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/BOM-override-script.html [ Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/DOMContentLoaded-event.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/acid2-pixel.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/acid2.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/DOMContentLoaded-event.html [ Crash Failure ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/acid2-pixel.html [ Crash Failure ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/acid2.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/acid3.html [ Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/adopt-iframe-src-attr-after-remove.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/adopt-iframe-src-attr-after-remove.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/async-script-removed.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/async-script.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/bad-charset-alias.html [ Failure ] @@ -21146,26 +21158,26 @@ crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/char-encoding-in-hidden-charset-field-with-one-field.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/char-encoding-in-text-charset-field-with-value.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/char-encoding-without-charset-field.html [ Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hint-accept-on-subresource.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept-iframe.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept-meta.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept-parent.php [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept.php [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-dynamic-rw-sizes.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-invalid-accept.php [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-no-accept.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-picture-source-removal.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-picture.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-preload-rw-sizes.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hint-accept-on-subresource.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept-iframe.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept-meta.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept-parent.php [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept.php [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-dynamic-rw-sizes.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-invalid-accept.php [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-no-accept.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-picture-source-removal.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-picture.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-preload-rw-sizes.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/copy-resolves-urls.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/crash-multiple-family-fontface.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/css-reject-any-type-in-strict-mode.html [ Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/delete-frame-during-readystatechange-with-gc-after-video-removal.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/delete-frame-during-readystatechange.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/detach-during-notifyDone.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/delete-frame-during-readystatechange-with-gc-after-video-removal.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/delete-frame-during-readystatechange.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/detach-during-notifyDone.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/dns-prefetch-control.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/drag-over-iframe-invalid-source-crash.html [ Crash Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/embed-image-load-outlives-gc-without-crashing.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/embed-image-load-outlives-gc-without-crashing.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/empty-cookie.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/empty-file-formdata.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/empty-urls.html [ Crash Failure ] @@ -21176,17 +21188,17 @@ crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/extract-http-content-language.php [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/favicon-as-image.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/font-face-in-multiple-segmented-faces.html [ Crash Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/form-action-using-replaceChild.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/form-action-using-replaceChild.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/form-post-textplain.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/frame-access-during-load.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/generated-content-inside-table.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/gmail-assert-on-load.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/iframe-reparenting-id-collision.html [ Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/iframe404.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/iframe404.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-blocked-src-change.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-blocked-src-no-change.html [ Crash Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-input-type-outlives-gc-without-crashing.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-load-outlives-gc-without-crashing.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-input-type-outlives-gc-without-crashing.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-load-outlives-gc-without-crashing.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-onerror-no-load-event.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/javascript-url-stop-loaders.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/link-rel-prefetch.html [ Crash Failure ] @@ -21195,14 +21207,14 @@ crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/object-embedding-svg-delayed-size-negotiation.xhtml [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/object-image-error-with-onload.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/object-image-error.html [ Crash Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/object-image-load-outlives-gc-without-crashing.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/onload-remove-iframe-crash-2.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/object-image-load-outlives-gc-without-crashing.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/onload-remove-iframe-crash-2.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/percent-sign-in-form-field-name.html [ Crash Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/plugin-array-detach.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/plugin-array-detach.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/refresh-headers.php [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/resource-timing-iframe-restored-from-history.html [ Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/resource-timing-sizes-multipart.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/resource-timing-sizes-tags.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/resource-timing-sizes-multipart.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/resource-timing-sizes-tags.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/script-after-slow-stylesheet-removed.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/script-defer-after-slow-stylesheet.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/script-sync-slow-scripts-onerror.html [ Failure ] @@ -21217,10 +21229,10 @@ crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/submit-post-in-utf16le.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/submit-post-in-utf32be.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/submit-post-in-utf32le.html [ Crash Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/svg-image-load-outlives-gc-without-crashing.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/svg-image-load-outlives-gc-without-crashing.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/uncacheable-script-repeated.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/unloadable-script.html [ Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/video-poster-image-load-outlives-gc-without-crashing.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/video-poster-image-load-outlives-gc-without-crashing.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/webtiming-buffer-full-no-event.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/webtiming-cross-origin-and-back.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/webtiming-cross-origin-redirect.php [ Failure ] @@ -21229,12 +21241,12 @@ crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/webtiming-resolution.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/webtiming-slow-load.php [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/webtiming-two-redirects.php [ Failure ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/xslt-bad-import.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/security/cookies/third-party-cookie-blocking-worker.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/security/cookies/websocket/third-party-cookie-blocked-on-cross-origin-websocket.html [ Crash ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/security/cookies/websocket/third-party-cookie-blocked-on-same-origin-websocket.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/xslt-bad-import.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/security/cookies/third-party-cookie-blocking-worker.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/security/cookies/websocket/third-party-cookie-blocked-on-cross-origin-websocket.html [ Crash Pass ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/security/cookies/websocket/third-party-cookie-blocked-on-same-origin-websocket.html [ Crash Pass ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/serviceworker/ServiceWorkerGlobalScope/registration-attribute.html [ Failure Pass ] -crbug.com/591099 virtual/off-main-thread-fetch/http/tests/serviceworker/chromium/frame-detached-by-navigation.html [ Crash ] +crbug.com/591099 virtual/off-main-thread-fetch/http/tests/serviceworker/chromium/frame-detached-by-navigation.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/serviceworker/chromium/resolve-after-window-close.html [ Crash Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/serviceworker/chromium/service-worker-gc.html [ Failure ] crbug.com/591099 virtual/off-main-thread-fetch/http/tests/serviceworker/chromium/window-close-during-registration.html [ Failure ] @@ -21347,23 +21359,23 @@ crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-changing-style-relayout-div-body-scrollablearea.html [ Crash Pass Timeout ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-display.html [ Failure ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-enable-changes-thickness-with-iframe.html [ Failure Pass ] -crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-not-inherited-by-iframe.html [ Crash ] -crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-reconstruction-document-write.html [ Crash ] +crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-not-inherited-by-iframe.html [ Crash Pass ] +crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-reconstruction-document-write.html [ Crash Pass ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-with-incomplete-style.html [ Failure ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/disabled-scrollbar.html [ Failure ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/hidden-iframe-scrollbar-crash.html [ Crash Failure ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/hidden-scrollbar-prevents-layout.html [ Failure ] -crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/iframe-scrollbar-becomes-custom.html [ Crash ] +crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/iframe-scrollbar-becomes-custom.html [ Crash Pass ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations.html [ Failure ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/overlay-scrollbars-within-overflow-scroll.html [ Failure ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/resize-scales-with-dpi-150.html [ Failure ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/rtl-resizer-position.html [ Failure ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/rtl/overflow-scroll-rtl.html [ Failure ] -crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollable-iframe-click-gets-focus.html [ Crash ] -crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollable-iframe-remove-crash.html [ Crash ] -crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-added-during-drag.html [ Crash ] +crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollable-iframe-click-gets-focus.html [ Crash Pass ] +crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollable-iframe-remove-crash.html [ Crash Pass ] +crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-added-during-drag.html [ Crash Pass ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-buttons.html [ Failure ] -crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-click-does-not-blur-content.html [ Crash ] +crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-click-does-not-blur-content.html [ Crash Failure ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-content-crash.html [ Failure ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-crash-on-refresh.html [ Failure ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-miss-mousemove-disabled.html [ Failure ] @@ -21375,11 +21387,11 @@ crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-visibility-hidden.html [ Failure ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbars-on-positioned-content.html [ Failure ] crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/viewport-scrollbar-corner-with-percent-padding-crash.html [ Failure ] -crbug.com/591099 virtual/rootlayerscrolls/fast/history/scroll-restoration/scroll-restoration-fragment-navigation-crossdoc.html [ Crash ] -crbug.com/591099 virtual/rootlayerscrolls/fast/history/scroll-restoration/scroll-restoration-navigation.html [ Crash ] +crbug.com/591099 virtual/rootlayerscrolls/fast/history/scroll-restoration/scroll-restoration-fragment-navigation-crossdoc.html [ Crash Pass ] +crbug.com/591099 virtual/rootlayerscrolls/fast/history/scroll-restoration/scroll-restoration-navigation.html [ Crash Pass ] crbug.com/591099 virtual/rootlayerscrolls/fast/rootscroller/set-root-scroller.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/abspos-relayout-overflow-style-change.html [ Failure ] -crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/content-box-smaller-than-scrollbar.html [ Crash ] +crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/content-box-smaller-than-scrollbar.html [ Crash Failure ] crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/custom-scrollbar-style-applied.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/editor-command-scroll-page-scale.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/fractional-scroll-height-chaining.html [ Failure ] @@ -21393,7 +21405,7 @@ crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scroll-clears-fragment-anchor.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scroll-element-into-view.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scroll-into-view-collapsed-div.html [ Failure ] -crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scroll-into-view-small-size-ancestor.html [ Crash ] +crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scroll-into-view-small-size-ancestor.html [ Crash Pass ] crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scroll-max-value.html [ Crash Failure ] crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scrollable-area-frame-overflow-hidden.html [ Crash Failure ] crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scrollbar-mousedown-mouseup.html [ Failure ] @@ -21411,23 +21423,23 @@ crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-changing-style-relayout-div-body-scrollablearea.html [ Crash Pass Timeout ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-display.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-enable-changes-thickness-with-iframe.html [ Failure Pass ] -crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-not-inherited-by-iframe.html [ Crash ] -crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-reconstruction-document-write.html [ Crash ] +crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-not-inherited-by-iframe.html [ Crash Pass ] +crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-reconstruction-document-write.html [ Crash Pass ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-with-incomplete-style.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/disabled-scrollbar.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/hidden-iframe-scrollbar-crash.html [ Crash Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/hidden-scrollbar-prevents-layout.html [ Failure ] -crbug.com/591099 virtual/rootlayerscrolls/scrollbars/iframe-scrollbar-becomes-custom.html [ Crash ] +crbug.com/591099 virtual/rootlayerscrolls/scrollbars/iframe-scrollbar-becomes-custom.html [ Crash Pass ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/overlay-scrollbars-within-overflow-scroll.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/resize-scales-with-dpi-150.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/rtl-resizer-position.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/rtl/overflow-scroll-rtl.html [ Failure ] -crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollable-iframe-click-gets-focus.html [ Crash ] -crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollable-iframe-remove-crash.html [ Crash ] +crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollable-iframe-click-gets-focus.html [ Crash Pass ] +crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollable-iframe-remove-crash.html [ Crash Pass ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-added-during-drag.html [ Timeout ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-buttons.html [ Failure ] -crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-click-does-not-blur-content.html [ Crash ] +crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-click-does-not-blur-content.html [ Crash Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-content-crash.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-crash-on-refresh.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-miss-mousemove-disabled.html [ Failure ] @@ -21439,7 +21451,7 @@ crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-visibility-hidden.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbars-on-positioned-content.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollbars/viewport-scrollbar-corner-with-percent-padding-crash.html [ Failure ] -crbug.com/591099 virtual/rootlayerscrolls/scrollingcoordinator/donot-compute-non-fast-scrollable-region-for-hidden-frames.html [ Crash Timeout ] +crbug.com/591099 virtual/rootlayerscrolls/scrollingcoordinator/donot-compute-non-fast-scrollable-region-for-hidden-frames.html [ Crash Pass Timeout ] crbug.com/591099 virtual/rootlayerscrolls/scrollingcoordinator/non-fast-scrollable-region-nested.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollingcoordinator/non-fast-scrollable-region-scaled-iframe.html [ Failure ] crbug.com/591099 virtual/rootlayerscrolls/scrollingcoordinator/non-fast-scrollable-region-transformed-iframe.html [ Failure ] @@ -21473,50 +21485,50 @@ crbug.com/591099 virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing.html [ Timeout ] crbug.com/591099 virtual/service-worker-navigation-preload-disabled/webexposed/nonstable-css-properties.html [ Failure ] crbug.com/591099 virtual/service-worker-navigation-preload-disabled/webexposed/permissions-attribute.html [ Failure ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html [ Crash Timeout ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/activation.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/claim-fetch.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/claim-not-using-registration.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/claim-with-redirect.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/client-id.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-get-cross-origin.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-get.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall-exact-controller.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall-include-uncontrolled.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall-order.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/extendable-event-async-waituntil.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-canvas-tainting-cache.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-canvas-tainting.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-cors-xhr.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-event.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-mixed-content-to-inscope.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-request-css-images.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-request-redirect.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-response-taint.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/foreign-fetch-cors.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/multi-globals/url-parsing.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-preload/redirect.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-preload/resource-timing.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-redirect-to-http.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-redirect.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ready.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/register-closed-window.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/register-link-header.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/register-same-scope-different-script-url.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/registration-iframe.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/unregister-controller.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/unregister-then-register.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/windowclient-navigate.https.html [ Crash ] -crbug.com/591099 virtual/service-worker-script-streaming/http/tests/serviceworker/chromium/frame-detached-by-navigation.html [ Crash ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html [ Crash Pass Timeout ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/activation.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/claim-fetch.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/claim-not-using-registration.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/claim-with-redirect.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/client-id.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-get-cross-origin.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-get.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall-exact-controller.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall-include-uncontrolled.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall-order.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/extendable-event-async-waituntil.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-canvas-tainting-cache.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-canvas-tainting.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-cors-xhr.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-event.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Crash Timeout ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-mixed-content-to-inscope.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-request-css-images.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-request-redirect.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-response-taint.https.html [ Crash Timeout ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/foreign-fetch-cors.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/multi-globals/url-parsing.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-preload/redirect.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-preload/resource-timing.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-redirect-to-http.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-redirect.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ready.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/register-closed-window.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/register-link-header.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/register-same-scope-different-script-url.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/registration-iframe.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/unregister-controller.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/unregister-then-register.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/windowclient-navigate.https.html [ Crash Pass ] +crbug.com/591099 virtual/service-worker-script-streaming/http/tests/serviceworker/chromium/frame-detached-by-navigation.html [ Crash Failure ] crbug.com/591099 virtual/service-worker-script-streaming/http/tests/serviceworker/chromium/resolve-after-window-close.html [ Failure ] crbug.com/591099 virtual/service-worker-script-streaming/http/tests/serviceworker/chromium/service-worker-gc.html [ Failure ] crbug.com/591099 virtual/service-worker-script-streaming/http/tests/serviceworker/chromium/window-close-during-registration.html [ Failure ] @@ -21533,20 +21545,20 @@ crbug.com/591099 virtual/stable/http/tests/navigation/anchor-goback.html [ Crash Failure ] crbug.com/591099 virtual/stable/http/tests/navigation/back-to-slow-frame.html [ Failure ] crbug.com/591099 virtual/stable/http/tests/navigation/cross-origin-fragment-navigation-is-async.html [ Failure ] -crbug.com/591099 virtual/stable/http/tests/navigation/fallback-anchor-reload.html [ Crash ] +crbug.com/591099 virtual/stable/http/tests/navigation/fallback-anchor-reload.html [ Crash Pass ] crbug.com/591099 virtual/stable/http/tests/navigation/form-targets-cross-site-frame-get.html [ Crash Failure ] crbug.com/591099 virtual/stable/http/tests/navigation/form-targets-cross-site-frame-no-referrer.html [ Crash Failure ] crbug.com/591099 virtual/stable/http/tests/navigation/form-targets-cross-site-frame-post.html [ Crash Failure ] crbug.com/591099 virtual/stable/http/tests/navigation/form-with-enctype-targets-cross-site-frame.html [ Crash Failure ] crbug.com/591099 virtual/stable/http/tests/navigation/forward-to-fragment-fires-onload.html [ Crash Failure ] crbug.com/591099 virtual/stable/http/tests/navigation/history-back-across-form-submission-to-fragment.html [ Failure ] -crbug.com/591099 virtual/stable/http/tests/navigation/image-load-in-subframe-unload-handler.html [ Crash ] +crbug.com/591099 virtual/stable/http/tests/navigation/image-load-in-subframe-unload-handler.html [ Crash Pass ] crbug.com/591099 virtual/stable/http/tests/navigation/javascriptlink-basic.html [ Crash Failure Timeout ] crbug.com/591099 virtual/stable/http/tests/navigation/javascriptlink-goback.html [ Crash Failure Timeout ] crbug.com/591099 virtual/stable/http/tests/navigation/lockedhistory-iframe.html [ Failure ] crbug.com/591099 virtual/stable/http/tests/navigation/metaredirect-basic.html [ Crash Failure ] crbug.com/591099 virtual/stable/http/tests/navigation/metaredirect-goback.html [ Crash Failure ] -crbug.com/591099 virtual/stable/http/tests/navigation/navigate-during-commit.html [ Crash ] +crbug.com/591099 virtual/stable/http/tests/navigation/navigate-during-commit.html [ Crash Pass ] crbug.com/591099 virtual/stable/http/tests/navigation/navigation-with-detached-origin-document.html [ Crash Pass ] crbug.com/591099 virtual/stable/http/tests/navigation/no-referrer-reset.html [ Failure Timeout ] crbug.com/591099 virtual/stable/http/tests/navigation/onload-navigation-iframe-2.html [ Failure ] @@ -21577,7 +21589,7 @@ crbug.com/591099 virtual/stable/http/tests/navigation/success200-goback.html [ Crash Failure ] crbug.com/591099 virtual/stable/http/tests/navigation/success200-loadsame.html [ Crash Failure ] crbug.com/591099 virtual/stable/http/tests/navigation/success200-reload.html [ Crash Failure ] -crbug.com/591099 virtual/stable/http/tests/navigation/targeted-navigation-in-unload-handler.html [ Crash ] +crbug.com/591099 virtual/stable/http/tests/navigation/targeted-navigation-in-unload-handler.html [ Crash Pass ] crbug.com/591099 virtual/stable/http/tests/navigation/timerredirect-basic.html [ Crash Failure ] crbug.com/591099 virtual/stable/http/tests/navigation/timerredirect-goback.html [ Crash Failure ] crbug.com/591099 virtual/stable/http/tests/navigation/useragent.php [ Failure ] @@ -21590,7 +21602,7 @@ crbug.com/591099 virtual/stable/http/tests/sendbeacon/beacon-detached-no-crash.html [ Failure ] crbug.com/591099 virtual/stable/http/tests/sendbeacon/beacon-same-origin.html [ Failure ] crbug.com/591099 virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker.html [ Pass Timeout ] -crbug.com/591099 virtual/stable/svg/transforms/stable/legacy-transform-box.html [ Crash ] +crbug.com/591099 virtual/stable/svg/transforms/stable/legacy-transform-box.html [ Crash Pass ] crbug.com/591099 virtual/stable/webexposed/custom-elements.html [ Failure ] crbug.com/591099 virtual/stable/webexposed/element-instance-property-listing.html [ Timeout ] crbug.com/591099 virtual/stable/webexposed/event-target-in-prototype.html [ Failure ] @@ -21607,105 +21619,105 @@ crbug.com/591099 virtual/threaded/animations/animation-css-rule-types.html [ Failure ] crbug.com/591099 virtual/threaded/animations/animation-events-create.html [ Failure ] crbug.com/591099 virtual/threaded/animations/animations-parsing.html [ Timeout ] -crbug.com/591099 virtual/threaded/animations/animations-responsive-to-color-change.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/clear-svg-animation-effects.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/composition/background-position-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/composition/caret-color-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/composition/stroke-dasharray-composition.html [ Crash ] +crbug.com/591099 virtual/threaded/animations/animations-responsive-to-color-change.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/clear-svg-animation-effects.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/composition/background-position-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/composition/caret-color-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/composition/stroke-dasharray-composition.html [ Crash Pass ] crbug.com/591099 virtual/threaded/animations/computed-style.html [ Failure ] -crbug.com/591099 virtual/threaded/animations/css-animation-overrides-svg-presentation-attribute-animation.html [ Crash ] +crbug.com/591099 virtual/threaded/animations/css-animation-overrides-svg-presentation-attribute-animation.html [ Crash Pass ] crbug.com/591099 virtual/threaded/animations/delay-start-event.html [ Failure ] -crbug.com/591099 virtual/threaded/animations/display-change-does-not-terminate-animation.html [ Crash ] +crbug.com/591099 virtual/threaded/animations/display-change-does-not-terminate-animation.html [ Crash Failure ] crbug.com/591099 virtual/threaded/animations/display-inline-style-adjust.html [ Failure Timeout ] crbug.com/591099 virtual/threaded/animations/display-none-cancel-computedstyle.html [ Failure ] crbug.com/591099 virtual/threaded/animations/display-none-terminates-animation.html [ Failure ] -crbug.com/591099 virtual/threaded/animations/img-element-transform.html [ Crash Timeout ] -crbug.com/591099 virtual/threaded/animations/inline-block-transform.html [ Crash ] +crbug.com/591099 virtual/threaded/animations/img-element-transform.html [ Crash Pass Timeout ] +crbug.com/591099 virtual/threaded/animations/inline-block-transform.html [ Crash Pass ] crbug.com/591099 virtual/threaded/animations/inline-element-animation-end-hit-test.html [ Failure ] -crbug.com/591099 virtual/threaded/animations/interpolation/backdrop-filter-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/background-color-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/background-image-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/background-position-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/background-position-origin-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/background-size-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/border-color-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/border-image-outset-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/border-image-slice-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/border-image-source-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/border-image-width-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/border-radius-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/border-spacing-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/border-width-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/bottom-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/box-shadow-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/calc-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/caret-color-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/clip-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/color-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/filter-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/font-size-adjust-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/font-size-interpolation-unset.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/font-size-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/font-size-zoom-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/font-weight-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/height-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/line-height-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/margin-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/max-height-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/min-height-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/object-position-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/offset-rotate-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/opacity-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/outline-color-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/outline-offset-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/outline-width-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/padding-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/perspective-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/perspective-origin-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/position-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/sample-interpolation-test.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-baseline-shift-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-cx-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-cy-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-d-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-fill-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-fill-opacity-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-flood-color-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-flood-opacity-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-lighting-color-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-r-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-rx-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-ry-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-stop-color-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-stop-opacity-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-dasharray-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-dashoffset-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-miterlimit-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-opacity-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-width-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/text-decoration-color-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/text-shadow-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/top-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/transform-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/transform-origin-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/vertical-align-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/viewport-unit-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-background-size-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-clip-path-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-column-rule-color-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-outset-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-slice-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-source-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-width-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-image-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-position-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-size-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-perspective-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-perspective-origin-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-text-stroke-color-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-transform-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/interpolation/webkit-transform-origin-interpolation.html [ Crash ] +crbug.com/591099 virtual/threaded/animations/interpolation/backdrop-filter-interpolation.html [ Crash Timeout ] +crbug.com/591099 virtual/threaded/animations/interpolation/background-color-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/background-image-interpolation.html [ Crash Timeout ] +crbug.com/591099 virtual/threaded/animations/interpolation/background-position-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/background-position-origin-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/background-size-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/border-color-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/border-image-outset-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/border-image-slice-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/border-image-source-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/border-image-width-interpolation.html [ Crash Timeout ] +crbug.com/591099 virtual/threaded/animations/interpolation/border-radius-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/border-spacing-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/border-width-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/bottom-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/box-shadow-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/calc-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/caret-color-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/clip-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/color-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/filter-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/font-size-adjust-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/font-size-interpolation-unset.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/font-size-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/font-size-zoom-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/font-weight-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/height-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/line-height-interpolation.html [ Crash Timeout ] +crbug.com/591099 virtual/threaded/animations/interpolation/margin-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/max-height-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/min-height-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/object-position-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/offset-rotate-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/opacity-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/outline-color-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/outline-offset-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/outline-width-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/padding-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/perspective-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/perspective-origin-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/position-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/sample-interpolation-test.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-baseline-shift-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-cx-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-cy-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-d-interpolation.html [ Crash Timeout ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-fill-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-fill-opacity-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-flood-color-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-flood-opacity-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-lighting-color-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-r-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-rx-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-ry-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-stop-color-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-stop-opacity-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-dasharray-interpolation.html [ Crash Timeout ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-dashoffset-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-miterlimit-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-opacity-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-width-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/text-decoration-color-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/text-shadow-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/top-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/transform-interpolation.html [ Crash Timeout ] +crbug.com/591099 virtual/threaded/animations/interpolation/transform-origin-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/vertical-align-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/viewport-unit-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-background-size-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-clip-path-interpolation.html [ Crash Timeout ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-column-rule-color-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-outset-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-slice-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-source-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-width-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-image-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-position-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-size-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-perspective-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-perspective-origin-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-text-stroke-color-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-transform-interpolation.html [ Crash Timeout ] +crbug.com/591099 virtual/threaded/animations/interpolation/webkit-transform-origin-interpolation.html [ Crash Pass ] crbug.com/591099 virtual/threaded/animations/keyframes-rule.html [ Failure ] crbug.com/591099 virtual/threaded/animations/lazy-detached-animation-stop.html [ Failure ] crbug.com/591099 virtual/threaded/animations/negative-delay-events.html [ Failure ] @@ -21714,7 +21726,7 @@ crbug.com/591099 virtual/threaded/animations/prefixed/animation-inherit-initial-unprefixed.html [ Failure ] crbug.com/591099 virtual/threaded/animations/prefixed/keyframes-cssom-prefixed-02.html [ Failure ] crbug.com/591099 virtual/threaded/animations/prefixed/keyframes-cssom-unprefixed-02.html [ Failure ] -crbug.com/591099 virtual/threaded/animations/responsive/d-responsive.html [ Crash ] +crbug.com/591099 virtual/threaded/animations/responsive/d-responsive.html [ Crash Pass ] crbug.com/591099 virtual/threaded/animations/responsive/line-height-responsive.html [ Pass Timeout ] crbug.com/591099 virtual/threaded/animations/rotate-transform-equivalent.html [ Failure Timeout ] crbug.com/591099 virtual/threaded/animations/skew-notsequential-compositor.html [ Failure Timeout ] @@ -21722,171 +21734,171 @@ crbug.com/591099 virtual/threaded/animations/stability/animation-iteration-event-destroy-renderer.html [ Failure ] crbug.com/591099 virtual/threaded/animations/stability/animation-on-inline-crash.html [ Failure ] crbug.com/591099 virtual/threaded/animations/stability/animation-start-event-destroy-renderer.html [ Failure ] -crbug.com/591099 virtual/threaded/animations/stability/base-render-style-crash.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/stability/checkbox-padding-animation-crash.html [ Crash ] +crbug.com/591099 virtual/threaded/animations/stability/base-render-style-crash.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/stability/checkbox-padding-animation-crash.html [ Crash Pass ] crbug.com/591099 virtual/threaded/animations/stability/element-animate-float-crash.html [ Failure Pass ] crbug.com/591099 virtual/threaded/animations/stability/empty-keyframe-animation-composited.html [ Failure ] crbug.com/591099 virtual/threaded/animations/stability/empty-keyframes-composited.html [ Failure ] crbug.com/591099 virtual/threaded/animations/stability/empty-keyframes.html [ Failure ] crbug.com/591099 virtual/threaded/animations/stability/import-crash.html [ Failure ] crbug.com/591099 virtual/threaded/animations/stability/length-zero-percent-crash.html [ Failure Pass ] -crbug.com/591099 virtual/threaded/animations/stability/option-element-crash.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/stability/option-opacity-inherit-crash.html [ Crash ] +crbug.com/591099 virtual/threaded/animations/stability/option-element-crash.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/stability/option-opacity-inherit-crash.html [ Crash Pass ] crbug.com/591099 virtual/threaded/animations/stability/pause-crash.html [ Failure ] -crbug.com/591099 virtual/threaded/animations/stability/svg-element-css-animation-crash.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/stability/svg-length-unittype-crash.html [ Crash ] +crbug.com/591099 virtual/threaded/animations/stability/svg-element-css-animation-crash.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/stability/svg-length-unittype-crash.html [ Crash Pass ] crbug.com/591099 virtual/threaded/animations/stability/zero-duration-infinite-iterations.html [ Failure ] crbug.com/591099 virtual/threaded/animations/stability/zero-duration-large-start-delay.html [ Failure ] crbug.com/591099 virtual/threaded/animations/state-at-end-event.html [ Failure Pass Timeout ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-amplitude-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-azimuth-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-baseFrequency-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-bias-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-cx-cy-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-d-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-diffuseConstant-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-divisor-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-dx-dy-length-list-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-dx-dy-number-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-elevation-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-exponent-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-fx-fy-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-gradientTransform-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-height-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-intercept-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-k1-k2-k3-k4-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-kernelMatrix-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-kernelUnitLength-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-limitingConeAngle-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-markerHeight-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-markerWidth-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-mode-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-numOctaves-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-offset-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-order-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-orient-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-pathLength-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-patternTransform-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-points-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-pointsAtX-pointsAtY-pointsAtZ-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-r-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-radius-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-refX-refY-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-rotate-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-rx-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-scale-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-seed-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-slope-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-specularConstant-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-specularExponent-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-startOffset-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-stdDeviation-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-surfaceScale-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-tableValues-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-targetX-targetY-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-textLength-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-composition-distinct.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-composition-list.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-matrix.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-values-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-viewBox-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-width-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-x-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-x-list-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-x1-x2-y1-y2-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-y-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-y-list-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-z-composition.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-amplitude-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-azimuth-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-baseFrequency-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-bias-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-calc-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-class-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-clipPathUnits-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-cx-cy-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-d-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-diffuseConstant-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-divisor-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-dx-dy-length-list-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-dx-dy-number-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-edgeMode-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-elevation-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-exponent-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-filterUnits-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-fx-fy-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-gradientTransform-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-gradientUnits-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-height-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-href-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-in-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-intercept-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-k1-k2-k3-k4-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-kernelMatrix-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-kernelUnitLength-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-lengthAdjust-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-limitingConeAngle-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-markerHeight-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-markerUnits-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-markerWidth-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-maskContentUnits-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-maskUnits-interpolation.html [ Crash Timeout ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-method-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-mode-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-numOctaves-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-offset-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-operator-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-order-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-orient-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-pathLength-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-patternContentUnits-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-patternTransform-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-patternUnits-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-points-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-pointsAtX-pointsAtY-pointsAtZ-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-preserveAlpha-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-preserveAspectRatio-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-primitiveUnits-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-r-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-radius-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-refX-refY-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-result-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-rotate-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-rx-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-scale-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-seed-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-slope-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-spacing-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-specularConstant-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-specularExponent-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-spreadMethod-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-startOffset-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-stdDeviation-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-stitchTiles-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-surfaceScale-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-tableValues-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-target-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-targetX-targetY-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-textLength-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-transform-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-type-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-values-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-viewBox-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-width-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-x-list-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-x-y-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-x1-x2-y1-y2-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-xChannelSelector-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-y-list-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-z-interpolation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-d-responsive.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-points-responsive.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-tableValues-responsive.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-transform-responsive.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-x-list-responsive.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-presentation-attribute-animation.html [ Crash ] -crbug.com/591099 virtual/threaded/animations/svg-responsive-to-timing-updates.html [ Crash ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-amplitude-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-azimuth-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-baseFrequency-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-bias-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-cx-cy-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-d-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-diffuseConstant-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-divisor-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-dx-dy-length-list-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-dx-dy-number-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-elevation-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-exponent-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-fx-fy-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-gradientTransform-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-height-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-intercept-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-k1-k2-k3-k4-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-kernelMatrix-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-kernelUnitLength-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-limitingConeAngle-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-markerHeight-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-markerWidth-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-mode-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-numOctaves-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-offset-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-order-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-orient-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-pathLength-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-patternTransform-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-points-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-pointsAtX-pointsAtY-pointsAtZ-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-r-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-radius-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-refX-refY-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-rotate-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-rx-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-scale-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-seed-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-slope-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-specularConstant-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-specularExponent-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-startOffset-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-stdDeviation-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-surfaceScale-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-tableValues-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-targetX-targetY-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-textLength-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-composition-distinct.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-composition-list.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-matrix.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-values-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-viewBox-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-width-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-x-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-x-list-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-x1-x2-y1-y2-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-y-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-y-list-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-z-composition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-amplitude-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-azimuth-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-baseFrequency-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-bias-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-calc-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-class-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-clipPathUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-cx-cy-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-d-interpolation.html [ Crash Timeout ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-diffuseConstant-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-divisor-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-dx-dy-length-list-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-dx-dy-number-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-edgeMode-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-elevation-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-exponent-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-filterUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-fx-fy-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-gradientTransform-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-gradientUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-height-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-href-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-in-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-intercept-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-k1-k2-k3-k4-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-kernelMatrix-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-kernelUnitLength-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-lengthAdjust-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-limitingConeAngle-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-markerHeight-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-markerUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-markerWidth-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-maskContentUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-maskUnits-interpolation.html [ Crash Pass Timeout ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-method-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-mode-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-numOctaves-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-offset-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-operator-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-order-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-orient-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-pathLength-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-patternContentUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-patternTransform-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-patternUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-points-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-pointsAtX-pointsAtY-pointsAtZ-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-preserveAlpha-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-preserveAspectRatio-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-primitiveUnits-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-r-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-radius-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-refX-refY-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-result-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-rotate-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-rx-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-scale-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-seed-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-slope-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-spacing-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-specularConstant-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-specularExponent-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-spreadMethod-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-startOffset-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-stdDeviation-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-stitchTiles-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-surfaceScale-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-tableValues-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-target-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-targetX-targetY-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-textLength-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-transform-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-type-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-values-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-viewBox-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-width-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-x-list-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-x-y-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-x1-x2-y1-y2-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-xChannelSelector-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-y-list-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-z-interpolation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-d-responsive.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-points-responsive.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-tableValues-responsive.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-transform-responsive.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-x-list-responsive.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-presentation-attribute-animation.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/animations/svg-responsive-to-timing-updates.html [ Crash Pass ] crbug.com/591099 virtual/threaded/animations/timing-model.html [ Pass Timeout ] crbug.com/591099 virtual/threaded/compositing/visibility/compositing-and-visibility-turned-off-together.html [ Failure ] crbug.com/591099 virtual/threaded/compositing/visibility/hidden-iframe.html [ Failure ] @@ -21914,77 +21926,77 @@ crbug.com/591099 virtual/threaded/fast/scroll-behavior/overflow-scroll-triggers-layout.html [ Failure ] crbug.com/591099 virtual/threaded/fast/scroll-behavior/parse-scroll-behavior.html [ Failure ] crbug.com/591099 virtual/threaded/fast/scroll-behavior/scroll-into-view-scrolls-layout-viewport.html [ Failure ] -crbug.com/591099 virtual/threaded/fast/scroll-behavior/scroll-over-resizer.html [ Crash ] +crbug.com/591099 virtual/threaded/fast/scroll-behavior/scroll-over-resizer.html [ Crash Pass ] crbug.com/591099 virtual/threaded/fast/scroll-behavior/smooth-scroll/fixed-background-in-iframe.html [ Failure ] crbug.com/591099 virtual/threaded/fast/scroll-behavior/smooth-scroll/keyboard-scroll.html [ Failure ] crbug.com/591099 virtual/threaded/fast/scroll-behavior/smooth-scroll/main-thread-scrolling-reason-added.html [ Failure ] crbug.com/591099 virtual/threaded/fast/scroll-behavior/smooth-scroll/main-thread-scrolling-reason-correctness.html [ Failure Timeout ] -crbug.com/591099 virtual/threaded/http/tests/worklet/chromium/import-on-detached-iframe.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/anonymous-image-object.html [ Crash ] +crbug.com/591099 virtual/threaded/http/tests/worklet/chromium/import-on-detached-iframe.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/inspector/tracing/anonymous-image-object.html [ Crash Failure ] crbug.com/591099 virtual/threaded/inspector/tracing/buffer-usage.html [ Failure ] crbug.com/591099 virtual/threaded/inspector/tracing/category-filter.html [ Failure ] -crbug.com/591099 virtual/threaded/inspector/tracing/console-timeline.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/decode-resize.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/frame-model-instrumentation.html [ Crash ] +crbug.com/591099 virtual/threaded/inspector/tracing/console-timeline.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/decode-resize.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/frame-model-instrumentation.html [ Crash Pass ] crbug.com/591099 virtual/threaded/inspector/tracing/frame-model.html [ Failure ] -crbug.com/591099 virtual/threaded/inspector/tracing/hit-test.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/idle-callback.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/scroll-invalidations.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/compile-script.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-gc-event.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-injected-script-eval.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-js-line-level-profile.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-microtasks.html [ Crash ] +crbug.com/591099 virtual/threaded/inspector/tracing/hit-test.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/idle-callback.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/scroll-invalidations.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/compile-script.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-gc-event.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-injected-script-eval.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-js-line-level-profile.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-microtasks.html [ Crash Failure ] crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-open-function-call.html [ Failure ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-runtime-stats.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-script-id.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-script-tag-1.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-script-tag-2.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-layout/timeline-layout-reason.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-layout/timeline-layout-with-invalidations.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-layout/timeline-layout.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-aggregated-details.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-animation-frame.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-bound-function.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-event-causes.html [ Crash ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-runtime-stats.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-script-id.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-script-tag-1.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-script-tag-2.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-layout/timeline-layout-reason.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-layout/timeline-layout-with-invalidations.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-layout/timeline-layout.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-aggregated-details.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-animation-frame.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-bound-function.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-event-causes.html [ Crash Failure ] crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-event-details.html [ Crash Failure ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-event-dispatch.html [ Crash ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-event-dispatch.html [ Crash Failure ] crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-filtering.html [ Crash Failure ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-grouped-invalidations.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-load-event.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-mark-timeline.html [ Crash ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-grouped-invalidations.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-load-event.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-mark-timeline.html [ Crash Failure ] crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-model.html [ Crash Failure ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-node-reference.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-parse-html.html [ Crash ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-node-reference.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-parse-html.html [ Crash Failure ] crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-range-stats.html [ Crash Failure ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-record-reload.html [ Crash ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-record-reload.html [ Crash Failure ] crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-search.html [ Failure ] crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-tree-search.html [ Crash Failure ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-trivial.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-window-filter.html [ Crash ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-trivial.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-window-filter.html [ Crash Failure ] crbug.com/591099 virtual/threaded/inspector/tracing/timeline-network/timeline-network-resource-details.html [ Failure ] crbug.com/591099 virtual/threaded/inspector/tracing/timeline-network/timeline-network-resource.html [ Failure ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/paint-profiler-update.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-and-multiple-style-invalidations.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations-on-deleted-node.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-with-style-recalc-invalidations.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/update-layer-tree.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/parse-author-style-sheet.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-recalculate-styles.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-style-recalc-all-invalidator-types.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-style-recalc-with-invalidations.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-style-recalc-with-invalidator-invalidations.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-time-stamp.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-time.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-timer-fired-from-eval-call-site.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-timer.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-usertiming.html [ Crash ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/paint-profiler-update.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-and-multiple-style-invalidations.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations-on-deleted-node.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-with-style-recalc-invalidations.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/update-layer-tree.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/parse-author-style-sheet.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-recalculate-styles.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-style-recalc-all-invalidator-types.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-style-recalc-with-invalidations.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-style-recalc-with-invalidator-invalidations.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-time-stamp.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-time.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-timer-fired-from-eval-call-site.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-timer.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-usertiming.html [ Crash Failure ] crbug.com/591099 virtual/threaded/inspector/tracing/tracing-timeline-load.html [ Failure ] -crbug.com/591099 virtual/threaded/inspector/tracing/worker-events.html [ Crash ] -crbug.com/591099 virtual/threaded/inspector/tracing/worker-js-frames.html [ Crash ] +crbug.com/591099 virtual/threaded/inspector/tracing/worker-events.html [ Crash Failure ] +crbug.com/591099 virtual/threaded/inspector/tracing/worker-js-frames.html [ Crash Failure ] crbug.com/591099 virtual/threaded/printing/absolute-position-headers-and-footers.html [ Failure ] crbug.com/591099 virtual/threaded/printing/absolute-positioned.html [ Failure ] crbug.com/591099 virtual/threaded/printing/allowed-page-breaks.html [ Failure ] @@ -22042,28 +22054,28 @@ crbug.com/591099 virtual/threaded/printing/viewport-size-dependant-iframe-with-multicol-crash.html [ Failure ] crbug.com/591099 virtual/threaded/transitions/3d/interrupted-transition.html [ Failure ] crbug.com/591099 virtual/threaded/transitions/bad-transition-shorthand-crash.html [ Failure ] -crbug.com/591099 virtual/threaded/transitions/cubic-bezier-overflow-svg-length.html [ Crash ] +crbug.com/591099 virtual/threaded/transitions/cubic-bezier-overflow-svg-length.html [ Crash Pass ] crbug.com/591099 virtual/threaded/transitions/inherit-other-props-do-not-affect-transition-property.html [ Failure ] crbug.com/591099 virtual/threaded/transitions/inherit-other-props.html [ Failure ] crbug.com/591099 virtual/threaded/transitions/inherit.html [ Failure ] -crbug.com/591099 virtual/threaded/transitions/interrupted-accelerated-transition.html [ Crash ] +crbug.com/591099 virtual/threaded/transitions/interrupted-accelerated-transition.html [ Crash Pass ] crbug.com/591099 virtual/threaded/transitions/interrupted-immediately.html [ Failure ] crbug.com/591099 virtual/threaded/transitions/matched-transform-functions.html [ Failure ] -crbug.com/591099 virtual/threaded/transitions/mismatched-shadow-styles.html [ Crash ] -crbug.com/591099 virtual/threaded/transitions/no-transition-on-implicit-margins.html [ Crash ] -crbug.com/591099 virtual/threaded/transitions/object-position-transition.html [ Crash ] +crbug.com/591099 virtual/threaded/transitions/mismatched-shadow-styles.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/transitions/no-transition-on-implicit-margins.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/transitions/object-position-transition.html [ Crash Pass ] crbug.com/591099 virtual/threaded/transitions/opacity-transform-transitions-inside-iframe.html [ Failure Timeout ] crbug.com/591099 virtual/threaded/transitions/opacity-transition-zindex.html [ Failure Pass Timeout ] crbug.com/591099 virtual/threaded/transitions/override-transition-crash.html [ Failure ] crbug.com/591099 virtual/threaded/transitions/retargetted-transition.html [ Failure ] crbug.com/591099 virtual/threaded/transitions/shadow.html [ Failure ] -crbug.com/591099 virtual/threaded/transitions/svg-layout-transition-zoom.html [ Crash ] -crbug.com/591099 virtual/threaded/transitions/svg-layout-transition.html [ Crash ] -crbug.com/591099 virtual/threaded/transitions/svg-transitions.html [ Crash ] +crbug.com/591099 virtual/threaded/transitions/svg-layout-transition-zoom.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/transitions/svg-layout-transition.html [ Crash Pass ] +crbug.com/591099 virtual/threaded/transitions/svg-transitions.html [ Crash Pass ] crbug.com/591099 virtual/threaded/transitions/transition-end-event-all-properties.html [ Failure Timeout ] crbug.com/591099 virtual/threaded/transitions/transition-end-event-attributes.html [ Failure ] crbug.com/591099 virtual/threaded/transitions/transition-end-event-container.html [ Failure ] -crbug.com/591099 virtual/threaded/transitions/transition-end-event-destroy-iframe.html [ Crash ] +crbug.com/591099 virtual/threaded/transitions/transition-end-event-destroy-iframe.html [ Crash Failure ] crbug.com/591099 virtual/threaded/transitions/transition-end-event-destroy-renderer.html [ Failure ] crbug.com/591099 virtual/threaded/transitions/transition-end-event-left.html [ Failure ] crbug.com/591099 virtual/threaded/transitions/transition-end-event-multiple-01.html [ Failure Timeout ] @@ -22097,34 +22109,34 @@ crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-in-horizontal-scrollbar-in-rtl.html [ Failure ] crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-in-vertical-scrollbar-in-rtl.html [ Failure ] crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-mousewheel-interaction.html [ Failure ] -crbug.com/591099 vr/events_vrdisplayactivate.html [ Crash ] -crbug.com/591099 vr/events_vrdisplayconnect.html [ Crash ] -crbug.com/591099 vr/events_vrdisplaypresentchange.html [ Crash ] -crbug.com/591099 vr/exitPresent_reject_notpresenting.html [ Crash ] -crbug.com/591099 vr/exitPresent_resolve.html [ Crash ] -crbug.com/591099 vr/getEyeParameters_match.html [ Crash ] -crbug.com/591099 vr/getLayers_notpresenting.html [ Crash ] -crbug.com/591099 vr/getLayers_presenting.html [ Crash ] -crbug.com/591099 vr/getLayers_presenting_nondefaultbounds.html [ Crash ] -crbug.com/591099 vr/getLayers_update.html [ Crash ] -crbug.com/591099 vr/requestAnimationFrame_consistentTimestamps.html [ Crash ] -crbug.com/591099 vr/requestAnimationFrame_handoff.html [ Crash ] -crbug.com/591099 vr/requestAnimationFrame_submitFrame_combinations.html [ Crash Timeout ] -crbug.com/591099 vr/requestPresent_reject_badleftbounds.html [ Crash ] -crbug.com/591099 vr/requestPresent_reject_badrightbounds.html [ Crash ] -crbug.com/591099 vr/requestPresent_reject_nogesture.html [ Crash ] -crbug.com/591099 vr/requestPresent_reject_nolayers.html [ Crash ] -crbug.com/591099 vr/requestPresent_reject_nosource.html [ Crash ] -crbug.com/591099 vr/requestPresent_reject_notsupported.html [ Crash ] -crbug.com/591099 vr/requestPresent_reject_nowebgl.html [ Crash ] -crbug.com/591099 vr/requestPresent_reject_nullsource.html [ Crash ] -crbug.com/591099 vr/requestPresent_reject_toomanylayers.html [ Crash ] -crbug.com/591099 vr/requestPresent_resolve.html [ Crash ] -crbug.com/591099 vr/requestPresent_resolve_repeatwithgesture.html [ Crash ] -crbug.com/591099 vr/requestPresent_resolve_repeatwithoutgesture.html [ Crash ] -crbug.com/591099 vr/requestPresent_resolve_then_reject.html [ Crash Timeout ] -crbug.com/591099 vr/requestPresent_resolve_webgl2.html [ Crash ] -crbug.com/591099 vr/stageParameters_match.html [ Crash ] +crbug.com/591099 vr/events_vrdisplayactivate.html [ Crash Pass ] +crbug.com/591099 vr/events_vrdisplayconnect.html [ Crash Pass ] +crbug.com/591099 vr/events_vrdisplaypresentchange.html [ Crash Pass ] +crbug.com/591099 vr/exitPresent_reject_notpresenting.html [ Crash Pass ] +crbug.com/591099 vr/exitPresent_resolve.html [ Crash Pass ] +crbug.com/591099 vr/getEyeParameters_match.html [ Crash Pass ] +crbug.com/591099 vr/getLayers_notpresenting.html [ Crash Pass ] +crbug.com/591099 vr/getLayers_presenting.html [ Crash Pass ] +crbug.com/591099 vr/getLayers_presenting_nondefaultbounds.html [ Crash Pass ] +crbug.com/591099 vr/getLayers_update.html [ Crash Pass ] +crbug.com/591099 vr/requestAnimationFrame_consistentTimestamps.html [ Crash Pass ] +crbug.com/591099 vr/requestAnimationFrame_handoff.html [ Crash Pass ] +crbug.com/591099 vr/requestAnimationFrame_submitFrame_combinations.html [ Crash Pass Timeout ] +crbug.com/591099 vr/requestPresent_reject_badleftbounds.html [ Crash Pass ] +crbug.com/591099 vr/requestPresent_reject_badrightbounds.html [ Crash Pass ] +crbug.com/591099 vr/requestPresent_reject_nogesture.html [ Crash Pass ] +crbug.com/591099 vr/requestPresent_reject_nolayers.html [ Crash Pass ] +crbug.com/591099 vr/requestPresent_reject_nosource.html [ Crash Pass ] +crbug.com/591099 vr/requestPresent_reject_notsupported.html [ Crash Pass ] +crbug.com/591099 vr/requestPresent_reject_nowebgl.html [ Crash Pass ] +crbug.com/591099 vr/requestPresent_reject_nullsource.html [ Crash Pass ] +crbug.com/591099 vr/requestPresent_reject_toomanylayers.html [ Crash Pass ] +crbug.com/591099 vr/requestPresent_resolve.html [ Crash Pass ] +crbug.com/591099 vr/requestPresent_resolve_repeatwithgesture.html [ Crash Pass ] +crbug.com/591099 vr/requestPresent_resolve_repeatwithoutgesture.html [ Crash Pass ] +crbug.com/591099 vr/requestPresent_resolve_then_reject.html [ Crash Pass Timeout ] +crbug.com/591099 vr/requestPresent_resolve_webgl2.html [ Crash Pass ] +crbug.com/591099 vr/stageParameters_match.html [ Crash Pass ] crbug.com/591099 webaudio/BiquadFilter/tail-time-lowpass.html [ Timeout ] crbug.com/591099 webaudio/OfflineAudioContext/offlineaudiocontext-detached-no-crash.html [ Failure ] crbug.com/591099 webaudio/ScriptProcessor/scriptprocessornode-detached-no-crash.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2 b/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2 index ffcbead..c28216d 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2 +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2
@@ -520,11 +520,9 @@ Bug(none) fast/canvas/OffscreenCanvas-transform-shadow-in-worker.html [ Failure ] Bug(none) fast/canvas/webgl/pixelated.html [ Failure ] Bug(none) fast/clip/nestedTransparencyClip.html [ Failure ] -Bug(none) fast/clip/overflow-border-radius-clip.html [ Failure ] Bug(none) fast/clip/overflow-border-radius-combinations.html [ Failure ] Bug(none) fast/clip/overflow-border-radius-composited-parent.html [ Failure ] Bug(none) fast/clip/overflow-border-radius-composited.html [ Failure ] -Bug(none) fast/clip/overflow-border-radius-fixed-position.html [ Failure ] Bug(none) fast/clip/overflow-border-radius-transformed.html [ Failure ] Bug(none) fast/css-generated-content/014.html [ Failure ] Bug(none) fast/css-generated-content/table-parts-before-and-after.html [ Failure ] @@ -637,7 +635,6 @@ Bug(none) fast/inline/inline-continuation-borders.html [ Failure ] Bug(none) fast/layers/normal-flow-hit-test.html [ Crash Failure ] Bug(none) fast/layers/opacity-outline.html [ Failure ] -Bug(none) fast/layers/overflow-hidden-rounded-corners-occlusion.html [ Failure ] Bug(none) fast/layers/remove-layer-with-nested-stacking.html [ Skip ] Bug(none) fast/layers/scroll-rect-to-visible.html [ Failure ] Bug(none) fast/lists/008.html [ Failure ] @@ -1006,7 +1003,6 @@ Bug(none) paint/invalidation/svg/deep-nested-embedded-svg-size-changes-no-layout-triggers-1.html [ Failure ] Bug(none) paint/invalidation/svg/deep-nested-embedded-svg-size-changes-no-layout-triggers-2.html [ Failure ] Bug(none) paint/invalidation/svg/use-detach.svg [ Failure ] -Bug(none) paint/background/rounded-clip-fractional-offset.html [ Failure ] Bug(none) paint/clipath/clip-path-with-background-and-box-behind.html [ Failure ] Bug(none) paint/frames/frameset-with-stacking-context-and-not-stacking-context-children.html [ Failure ] Bug(none) paint/frames/frameset-with-stacking-contexts.html [ Failure ] @@ -1252,7 +1248,6 @@ # Mask does not work correctly crbug.com/707444 svg/W3C-SVG-1.1/masking-intro-01-f.svg [ Failure ] -crbug.com/707444 svg/as-background-image/svg-as-background-6.html [ Failure ] crbug.com/707444 svg/batik/masking/maskRegions.svg [ Failure ] crbug.com/707444 svg/custom/clamped-masking-clipping.svg [ Failure ] crbug.com/707444 svg/custom/clip-mask-negative-scale.svg [ Failure ] @@ -1568,9 +1563,16 @@ crbug.com/589265 css3/blending/mix-blend-mode-isolated-group-3.html [ Failure ] crbug.com/589265 css3/blending/svg-blend-exclusion.html [ Failure ] crbug.com/589265 css3/blending/svg-blend-screen.html [ Failure ] +crbug.com/589265 fast/backgrounds/size/contain-and-cover-zoomed.html [ Failure ] crbug.com/589265 fast/css/ZeroOpacityLayers.html [ Failure ] crbug.com/589265 fast/css/ZeroOpacityLayers2.html [ Failure ] +crbug.com/589265 fast/forms/datalist/input-appearance-range-with-transform.html [ Failure ] crbug.com/589265 fast/forms/indeterminate.html [ Failure ] +crbug.com/589265 images/color-profile-filter.html [ Failure ] +crbug.com/589265 paint/invalidation/svg/repaint-paintorder.svg [ Failure ] +crbug.com/589265 paint/invalidation/svg/tabgroup.svg [ Failure ] +crbug.com/589265 svg/W3C-SVG-1.1/animate-elem-33-t.svg [ Failure ] +crbug.com/589265 svg/as-background-image/background-image-preserveaspectRatio-support.html [ Failure ] crbug.com/589265 svg/custom/small-rect-scale.svg [ Failure ] crbug.com/589265 svg/dynamic-updates/SVGFEBlendElement-dom-in-attr.html [ Failure ] crbug.com/589265 svg/dynamic-updates/SVGFEBlendElement-dom-in2-attr.html [ Failure ] @@ -1578,6 +1580,9 @@ crbug.com/589265 svg/dynamic-updates/SVGFEBlendElement-svgdom-in-prop.html [ Failure ] crbug.com/589265 svg/dynamic-updates/SVGFEBlendElement-svgdom-in2-prop.html [ Failure ] crbug.com/589265 svg/dynamic-updates/SVGFEBlendElement-svgdom-mode-prop.html [ Failure ] +crbug.com/589265 svg/text/text-selection-align-01-b.svg [ Failure ] +crbug.com/589265 svg/text/text-selection-align-05-b.svg [ Failure ] +crbug.com/589265 svg/zoom/page/zoom-svg-as-background-with-relative-size.html [ Failure ] # Failures due to SPv2 using SkBlendMode::kDstIn to implement masks. # Some rounding differences is expected but none of them should be apparent. @@ -1620,7 +1625,6 @@ # Subpixel adjustments due to differences in compositing crbug.com/589265 animations/animated-filter-svg-element.html [ Failure Crash ] crbug.com/589265 compositing/overflow/do-not-paint-outline-into-composited-scrolling-contents.html [ Failure ] -crbug.com/589265 fast/css/all-shorthand-first-letter.html [ Failure ] crbug.com/589265 fast/forms/number/number-appearance-spinbutton-layer.html [ Failure ] crbug.com/589265 fast/layers/add-layer-with-nested-stacking.html [ Failure ] crbug.com/589265 fast/layers/opacity-transforms.html [ Failure ] @@ -1673,7 +1677,6 @@ Bug(700530) fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk.html [ Failure ] # The following debug crashes have not been triaged. -crbug.com/702805 css3/blending/svg-blend-layer-filter.html [ Crash ] crbug.com/702805 virtual/threaded/compositing/visibility/overlays-persist-on-navigation.html [ Crash ] crbug.com/702805 svg/filters/feImage-self-referencing.html [ Crash ] crbug.com/702805 svg/filters/feImage-self-and-other-referencing.html [ Crash ] @@ -1745,3 +1748,5 @@ # reasons, in particular that the composited layerization algorithm provides # different results. Bug(none) paint/invalidation/compositing/subpixel-offset-scaled-transform-composited.html [ Failure ] + +crbug.com/737275 svg/as-background-image/svg-as-background-6.html [ Crash Failure ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 6e6368b..cbf0890 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -592,7 +592,7 @@ crbug.com/635619 virtual/layout_ng/fast/block/float/035.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/add-float-back-to-anonymous-block.html [ Failure ] crbug.com/719615 virtual/layout_ng/fast/block/float/add-inlines-in-block-children-block.html [ Failure ] -crbug.com/635619 virtual/layout_ng/fast/block/float/assert-when-moving-float.html [ Crash ] +crbug.com/635619 virtual/layout_ng/fast/block/float/assert-when-moving-float.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-2.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-3.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-4.html [ Failure ] @@ -673,7 +673,7 @@ crbug.com/635619 virtual/layout_ng/fast/block/float/remove-line-above-float-above-line-crash.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/rubybase-children-made-inline-crash.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash-2.html [ Failure Crash ] -crbug.com/635619 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash.html [ Crash ] +crbug.com/635619 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash.html [ Crash Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/shrink-to-avoid-float-complexity.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/shrink-to-fit-width.html [ Failure ] crbug.com/635619 virtual/layout_ng/fast/block/float/split-inline-sibling-of-float-crash.html [ Crash ] @@ -1527,9 +1527,6 @@ crbug.com/321237 [ Win ] fast/multicol/span/pseudo-before-after-in-content.html [ Failure ] crbug.com/321237 [ Win ] fast/selectors/004.html [ Failure ] -crbug.com/739514 external/wpt/html/semantics/scripting-1/the-script-element/load-error-events-2.html [ Failure ] -crbug.com/715369 external/wpt/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html [ Failure ] - crbug.com/501659 fast/xsl/xslt-missing-namespace-in-xslt.xml [ Failure ] crbug.com/501659 http/tests/security/xss-DENIED-xml-external-entity.xhtml [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/W3CImportExpectations b/third_party/WebKit/LayoutTests/W3CImportExpectations index edbe374..634d8150 100644 --- a/third_party/WebKit/LayoutTests/W3CImportExpectations +++ b/third_party/WebKit/LayoutTests/W3CImportExpectations
@@ -19,6 +19,8 @@ ## Owners: paint-dev@chromium.org # external/wpt/2dcontext [ Pass ] +## Owners: garykac@chromium.org +# external/wpt/clipboard-apis [Pass] ## Owners: jsbell@chromium.org # external/wpt/FileAPI [ Pass ] ## Owners: jsbell@chromium.org
diff --git a/third_party/WebKit/LayoutTests/editing/selection/empty-cell-right-click-expected.txt b/third_party/WebKit/LayoutTests/editing/selection/empty-cell-right-click-expected.txt deleted file mode 100644 index e0c1ba4..0000000 --- a/third_party/WebKit/LayoutTests/editing/selection/empty-cell-right-click-expected.txt +++ /dev/null
@@ -1,2 +0,0 @@ -Before: selection type is Caret -After: selection type is Caret
diff --git a/third_party/WebKit/LayoutTests/editing/selection/empty-cell-right-click.html b/third_party/WebKit/LayoutTests/editing/selection/empty-cell-right-click.html deleted file mode 100644 index ed29b8c..0000000 --- a/third_party/WebKit/LayoutTests/editing/selection/empty-cell-right-click.html +++ /dev/null
@@ -1,36 +0,0 @@ -<html> -<head> -<title>Right clicking on an empty cell should not extend the selection to the next cell.</title> -</head> -<body> -<div contentEditable="true"> -<table border="1" cellspacing="0"><tr><td id="first" width="50" height="25pt"></td><td width="50" height="25pt"></td><td width="50" height="25pt"></td></tr></table> -</div> -<ul id="console"></ul> -</body> -<script> -if (window.testRunner) { - testRunner.dumpAsText(); - var elem = document.getElementById("first"); - x = elem.offsetLeft + elem.offsetWidth / 2; - y = elem.offsetTop + elem.offsetHeight / 2; - eventSender.mouseMoveTo(x, y); - eventSender.mouseDown(); - eventSender.mouseUp(); - - log("Before: selection type is " + window.getSelection().type); - - eventSender.contextClick(); - - log("After: selection type is " + window.getSelection().type); -} - -function log(str) { - var li = document.createElement("li"); - li.appendChild(document.createTextNode(str)); - var console = document.getElementById("console"); - console.appendChild(li); -} - -</script> -</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-interfaces.https.html b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-interfaces.https.html new file mode 100644 index 0000000..a82e39f --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-interfaces.https.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<title>Clipboard IDL test</title> +<link rel="help" href="https://w3c.github.io/clipboard-apis/"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/WebIDLParser.js></script> +<script src=/resources/idlharness.js></script> +<script> +'use strict'; + +function doTest(idls) { + var idl_array = new IdlArray(); + idl_array.add_untested_idls('interface Navigator {};'); + idl_array.add_untested_idls('interface EventTarget {};'); + for (let idl of idls) { + idl_array.add_idls(idl); + } + idl_array.add_objects({ + Navigator: ['navigator'], + Clipboard: ['navigator.clipboard'], + }); + idl_array.test(); +}; + +function fetchText(url) { + return fetch(url).then((response) => response.text()); +} + +promise_test(() => { + return Promise.all(["/interfaces/clipboard.idl"].map(fetchText)) + .then(doTest); +}, "Test driver"); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-navigator-clipboard-basics.https.html b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-navigator-clipboard-basics.https.html new file mode 100644 index 0000000..3126655 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-navigator-clipboard-basics.https.html
@@ -0,0 +1,69 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Async Clipboard basic tests</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + +test(function() { + assert_not_equals(navigator.clipboard, undefined); + assert_true(navigator.clipboard instanceof Clipboard); + assert_equals(navigator.clipboard, navigator.clipboard); +}, "navigator.clipboard exists"); + +/* clipboard.write() */ + +promise_test(function() { + var dt = new DataTransfer(); + dt.items.add("Howdy", "text/plain"); + return navigator.clipboard.write(dt); +}, "navigator.clipboard.write(DataTransfer) succeeds"); + +promise_test(function(t) { + return promise_rejects(t, new TypeError(), + navigator.clipboard.write()); +}, "navigator.clipboard.write() fails (expect DataTransfer)"); + +promise_test(function(t) { + return promise_rejects(t, new TypeError(), + navigator.clipboard.write(null)); +}, "navigator.clipboard.write(null) fails (expect DataTransfer)"); + +promise_test(function(t) { + return promise_rejects(t, new TypeError(), + navigator.clipboard.write("Bad string")); +}, "navigator.clipboard.write(DOMString) fails (expect DataTransfer)"); + + +/* clipboard.writeText() */ + +promise_test(function() { + return navigator.clipboard.writeText("New clipboard text"); +}, "navigator.clipboard.writeText(DOMString) succeeds"); + +promise_test(function(t) { + return promise_rejects(t, new TypeError(), + navigator.clipboard.writeText()); +}, "navigator.clipboard.writeText() fails (expect DOMString)"); + + +/* clipboard.read() */ + +promise_test(function() { + return navigator.clipboard.read() + .then(function(result) { + assert_true(result instanceof DataTransfer); + }); +}, "navigator.clipboard.read() succeeds"); + + +/* clipboard.readText() */ + +promise_test(function() { + return navigator.clipboard.readText() + .then(function(result) { + assert_equals(typeof result, "string"); + }); +}, "navigator.clipboard.readText() succeeds"); + +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-dttext-read-dttext-manual.https.html b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-dttext-read-dttext-manual.https.html new file mode 100644 index 0000000..1fe946a --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-dttext-read-dttext-manual.https.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Async Clipboard write (dt/text) -> read (dt/text) tests</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +async_test(function(t) { + var test_data = "Clipboard write (dt/text) -> read (dt/text) test data"; + var cb = navigator.clipboard; + var dt = new DataTransfer(); + dt.items.add(test_data, "text/plain"); + + cb.write(dt).then(t.step_func(() => { + cb.read().then(t.step_func((data) => { + assert_equals(data.items.length, 1); + data.items[0].getAsString(t.step_func((s) => { + assert_equals(s, test_data); + t.done(); + })); + }), function() { + t.unreached_func("clipboard.read() fail"); + }); + }), function() { + t.unreached_func("clipboard.write() fail"); + }); +}, "Verify write and read clipboard (DataTransfer/text)"); +</script> +Note: This is a manual test because it writes/reads to the shared system +clipboard and thus cannot be run async with other tests that might interact +with the clipboard.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-dttext-read-text-manual.https.html b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-dttext-read-text-manual.https.html new file mode 100644 index 0000000..b341d92 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-dttext-read-text-manual.https.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Async Clipboard write (dt/text) -> readText tests</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +async_test(function(t) { + var test_data = "Clipboard write (dt/text) -> readText test data"; + var cb = navigator.clipboard; + var dt = new DataTransfer(); + dt.items.add(test_data, "text/plain"); + + cb.write(dt).then(t.step_func(() => { + cb.readText().then(t.step_func((data) => { + assert_equals(data, test_data); + t.done(); + }), function() { + t.unreached_func("clipboard.read() fail"); + }); + }), function() { + t.unreached_func("clipboard.write() fail"); + }); +}, "Verify write and read clipboard (DataTransfer/text)"); +</script> +Note: This is a manual test because it writes/reads to the shared system +clipboard and thus cannot be run async with other tests that might interact +with the clipboard.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-text-read-dttext-manual.https.html b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-text-read-dttext-manual.https.html new file mode 100644 index 0000000..ab11ab9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-text-read-dttext-manual.https.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Async Clipboard writeText -> read (dt/text) tests</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +async_test(function(t) { + var test_data = "Clipboard writeText -> read(dt/text) test data"; + var cb = navigator.clipboard; + cb.writeText(test_data).then(t.step_func(() => { + cb.read().then(t.step_func((data) => { + assert_equals(data.items.length, 1); + data.items[0].getAsString(t.step_func((s) => { + assert_equals(s, test_data); + t.done(); + })); + }), function() { + t.unreached_func("clipboard.read() fail"); + }); + }), function() { + t.unreached_func("clipboard.writeText() fail"); + }); +}, "Verify write and read clipboard (DOMString)"); +</script> +Note: This is a manual test because it writes/reads to the shared system +clipboard and thus cannot be run async with other tests that might interact +with the clipboard.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-text-read-text-manual.https.html b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-text-read-text-manual.https.html new file mode 100644 index 0000000..a557216 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-text-read-text-manual.https.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Async Clipboard writeText -> readText tests</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +async_test(function(t) { + var test_data = "Clipboard writeText -> readText test data"; + var cb = navigator.clipboard; + cb.writeText(test_data).then(t.step_func(() => { + cb.readText().then(t.step_func((data) => { + assert_equals(data, test_data); + t.done(); + }), function() { + t.unreached_func("clipboard.readText() fail"); + }); + }), function() { + t.unreached_func("clipboard.writeText() fail"); + }); +}, "Verify write and read clipboard (DOMString)"); +</script> +Note: This is a manual test because it writes/reads to the shared system +clipboard and thus cannot be run async with other tests that might interact +with the clipboard.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/clipboard.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/clipboard.idl new file mode 100644 index 0000000..ea969ca9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/clipboard.idl
@@ -0,0 +1,13 @@ +[SecureContext] +interface Clipboard : EventTarget { + Promise<DataTransfer> read(); + Promise<DOMString> readText(); + + Promise<void> write(DataTransfer data); + Promise<void> writeText(DOMString data); +}; + +[SecureContext] +partial interface Navigator { + [SameObject] readonly attribute Clipboard clipboard; +};
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferResult.https.html b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferResult.https.html index da7c395..5cad38a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferResult.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferResult.https.html
@@ -4,7 +4,6 @@ <script> 'use strict'; - test(t => { let data_view = new DataView(Uint8Array.from([1, 2, 3, 4]).buffer); let packet_data_view = new DataView(data_view.buffer);
diff --git a/third_party/WebKit/LayoutTests/fast/forms/validation-bubble-appearance-escape.html b/third_party/WebKit/LayoutTests/fast/forms/validation-bubble-appearance-escape.html new file mode 100644 index 0000000..1e2b5d5 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/forms/validation-bubble-appearance-escape.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<body> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<input pattern="\d{4}" title="Please specify four digits." value="abc" style="position:absolute; bottom:600px"> +<script> +test(() => { + document.querySelector('input').setCustomValidity('<script>'); + document.querySelector('input').reportValidity(); +}, 'Showing a validation message with HTML tags should not cause a DCHECK failure.'); +</script> +</body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js index 0d394984..c71d83c 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js
@@ -856,7 +856,6 @@ * @constructor * @param {!string} dirPath * @param {!string} name - * @param {!function(?Bindings.TempFile)} callback */ InspectorTest.TempFileMock = function(dirPath, name) { @@ -905,9 +904,10 @@ /** * @param {!Common.OutputStream} outputStream - * @param {!Bindings.OutputStreamDelegate} delegate + * @param {function(*)=} progress + * @return {!Promise<boolean>} */ - copyToOutputStream: function(outputStream, delegate) + copyToOutputStream: function(outputStream, progress) { var name = this._name; var text = this._chunks.join(""); @@ -929,11 +929,11 @@ cancel: function() { } } - delegate.onTransferStarted(chunkedReaderMock); outputStream.write(text); - delegate.onChunkTransferred(chunkedReaderMock); + if (progress) + progress(chunkedReaderMock); outputStream.close(); - delegate.onTransferFinished(chunkedReaderMock); + return Promise.resolve(true); }, remove: function() { }
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/timeline-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/timeline-test.js index 616b8ed7..3cae88d 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/timeline-test.js +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/timeline-test.js
@@ -69,9 +69,6 @@ return "{reason: " + cause.reason + ", stackTrace: " + stackTrace + "}"; } -InspectorTest.preloadPanel("timeline"); -Bindings.TempFile = InspectorTest.TempFileMock; - InspectorTest.createTracingModel = function(events) { var model = new SDK.TracingModel(new Bindings.TempFileBackingStorage("tracing")); @@ -302,13 +299,57 @@ return null; } -InspectorTest.FakeFileReader = function(input, delegate, callback) -{ - this._delegate = delegate; - this._callback = callback; - this._input = input; - this._loadedSize = 0; - this._fileSize = input.length; +InspectorTest.FakeFileReader = class { + constructor(input, chunkSize, chunkTransferredCallback) + { + this._input = input; + this._loadedSize = 0; + this._fileSize = input.length; + this._chunkTransferredCallback = chunkTransferredCallback; + } + + read(output) + { + var length = this._input.length; + var half = (length + 1) >> 1; + + var chunk = this._input.substring(0, half); + this._loadedSize += chunk.length; + output.write(chunk); + if (this._chunkTransferredCallback) + this._chunkTransferredCallback(this); + + chunk = this._input.substring(half); + this._loadedSize += chunk.length; + output.write(chunk); + if (this._chunkTransferredCallback) + this._chunkTransferredCallback(this); + + output.close(); + return Promise.resolve(true); + } + + cancel() { } + + loadedSize() + { + return this._loadedSize; + } + + fileSize() + { + return this._fileSize; + } + + fileName() + { + return "fakeFile"; + } + + error() + { + return null; + } }; InspectorTest.dumpFrame = function(frame) @@ -372,60 +413,11 @@ InspectorTest.dumpFlameChartProvider(provider, includeGroups); } -InspectorTest.FakeFileReader.prototype = { - start: function(output) - { - this._delegate.onTransferStarted(this); - - var length = this._input.length; - var half = (length + 1) >> 1; - - var chunk = this._input.substring(0, half); - this._loadedSize += chunk.length; - output.write(chunk); - this._delegate.onChunkTransferred(this); - - chunk = this._input.substring(half); - this._loadedSize += chunk.length; - output.write(chunk); - this._delegate.onChunkTransferred(this); - - output.close(); - this._delegate.onTransferFinished(this); - - this._callback(); - }, - - cancel: function() { }, - - loadedSize: function() - { - return this._loadedSize; - }, - - fileSize: function() - { - return this._fileSize; - }, - - fileName: function() - { - return "fakeFile"; - } -}; - InspectorTest.loadTimeline = function(timelineData) { - var timeline = UI.panels.timeline; - - function createFileReader(file, delegate) - { - return new InspectorTest.FakeFileReader(timelineData, delegate, timeline._saveToFile.bind(timeline)); - } - - InspectorTest.override(Timeline.TimelineLoader, "_createFileReader", createFileReader); + Bindings.ChunkedFileReader = InspectorTest.FakeFileReader; var promise = new Promise(fulfill => InspectorTest.runWhenTimelineIsReady(fulfill)); - timeline._loadFromFile({}); + UI.panels.timeline._loadFromFile(timelineData); return promise; }
diff --git a/third_party/WebKit/LayoutTests/images/color-profile-reflection.html b/third_party/WebKit/LayoutTests/images/color-profile-reflection.html index 21f87cb4..ec58703 100644 --- a/third_party/WebKit/LayoutTests/images/color-profile-reflection.html +++ b/third_party/WebKit/LayoutTests/images/color-profile-reflection.html
@@ -27,8 +27,7 @@ }; function done() { - runAfterLayoutAndPaint(function() { testRunner.notifyDone() }); + window.testRunner.notifyDone(); } - </script> </html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/page/setDocumentContent-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/page/setDocumentContent-expected.txt new file mode 100644 index 0000000..1c202f1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/page/setDocumentContent-expected.txt
@@ -0,0 +1,7 @@ +Tests that Page.setDocumentContent works. +Page enabled +Main Frame obtained +Document content before: <html><head></head><body><div>Привет мир</div></body></html> +Document content set +Document content after: <html><head></head><body><div>こんにちは世界</div></body></html> +
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/page/setDocumentContent.js b/third_party/WebKit/LayoutTests/inspector-protocol/page/setDocumentContent.js new file mode 100644 index 0000000..6131fa3 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/page/setDocumentContent.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + let {page, session, dp} = await testRunner.startHTML(`<div>Привет мир</div>`, + 'Tests that Page.setDocumentContent works.'); + + await dp.Page.enable(); + testRunner.log('Page enabled'); + + var resourceTreeResponse = await dp.Page.getResourceTree(); + var mainFrameId = resourceTreeResponse.result.frameTree.frame.id; + testRunner.log('Main Frame obtained'); + + testRunner.log('Document content before: ' + await session.evaluate(() => document.documentElement.outerHTML)); + await dp.Page.setDocumentContent({frameId: mainFrameId, html: '<div>こんにちは世界</div>'}); + testRunner.log('Document content set'); + testRunner.log('Document content after: ' + await session.evaluate(() => document.documentElement.outerHTML)); + + testRunner.completeTest(); +})
diff --git a/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader-expected.txt b/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader-expected.txt index 05a9d67..54b6b5d 100644 --- a/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader-expected.txt
@@ -1,7 +1,6 @@ This tests that ChunkedFileReader properly re-assembles chunks, especially in case these contain multibyte characters. -Bindings.OutputStreamDelegate.onTransferStarted() called -Chunks transferred: 40 -Bindings.OutputStreamDelegate.onTransferFinished() called +Read result: true +Chunks transferred: 41 DONE
diff --git a/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader.html b/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader.html index 4226238..78a6cb0 100644 --- a/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader.html +++ b/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader.html
@@ -4,50 +4,7 @@ <script src="../../http/tests/inspector/inspector-test.js"></script> <script> -function initialize_ChunkedFileReaderTest() -{ - -InspectorTest.TestOutputStreamDelegate = function(doneCallback) -{ - this._doneCallback = doneCallback; - this._chunkCount = 0; -} - -InspectorTest.TestOutputStreamDelegate.prototype = { - onTransferStarted: function() - { - InspectorTest.addResult("Bindings.OutputStreamDelegate.onTransferStarted() called"); - }, - - onTransferFinished: function() - { - InspectorTest.addResult("Chunks transferred: " + this._chunkCount); - InspectorTest.addResult("Bindings.OutputStreamDelegate.onTransferFinished() called"); - this._doneCallback(); - }, - - /** - * @param {!Bindings.ChunkedReader} reader - */ - onChunkTransferred: function(reader) - { - this._chunkCount++; - }, - - /** - * @param {!Bindings.ChunkedReader} reader - * @param {!Event} event - */ - onError: function(reader, event) - { - InspectorTest.addResult("Bindings.OutputStreamDelegate.onError() called"); - this._doneCallback(); - } -}; - -} - -function test() +async function test() { var text = ["Латынь из моды вышла ныне:\n", "Так, если правду вам сказать,\n", @@ -58,15 +15,17 @@ // Most of the characters above will be encoded as 2 bytes, so make sure we use odd // chunk size to cause chunk boundaries sometimes to happen between chaacter bytes. var chunkSize = 5; - var reader = new Bindings.ChunkedFileReader(blob, chunkSize, new InspectorTest.TestOutputStreamDelegate(onTransferFinished)); + var chunkCount = 0; + var reader = new Bindings.ChunkedFileReader(blob, chunkSize, () => ++chunkCount); var output = new Common.StringOutputStream(); - reader.start(output); - function onTransferFinished() - { - InspectorTest.assertEquals(text.join(""), output.data(), "Read text is different from written text"); - InspectorTest.addResult("DONE"); - InspectorTest.completeTest(); - } + + var error = await reader.read(output); + + InspectorTest.addResult("Read result: " + error); + InspectorTest.addResult("Chunks transferred: " + chunkCount); + InspectorTest.assertEquals(text.join(""), output.data(), "Read text is different from written text"); + InspectorTest.addResult("DONE"); + InspectorTest.completeTest(); } </script>
diff --git a/third_party/WebKit/LayoutTests/inspector/profiler/cpu-profiler-save-load.html b/third_party/WebKit/LayoutTests/inspector/profiler/cpu-profiler-save-load.html index 2ee335f..c13248d7 100644 --- a/third_party/WebKit/LayoutTests/inspector/profiler/cpu-profiler-save-load.html +++ b/third_party/WebKit/LayoutTests/inspector/profiler/cpu-profiler-save-load.html
@@ -108,13 +108,12 @@ var profileName = file.name.substr(0, file.name.length - ".cpuprofile".length); InspectorTest.waitUntilProfileViewIsShown(profileName, checkLoadedContent); profilesPanel._loadFromFile(file); - var onTransferFinished = Profiler.CPUProfileHeader.prototype.onTransferFinished; - Profiler.CPUProfileHeader.prototype.onTransferFinished = function() - { + InspectorTest.addSniffer(Profiler.CPUProfileHeader.prototype, "updateStatus", function(statusText) { + if (!statusText.startsWith("Parsing")) + return; loadedProfileData = this._jsonifiedProfile; - onTransferFinished.call(this); - UI.panels.js_profiler.showProfile(this); - } + setTimeout(() => UI.panels.js_profiler.showProfile(this), 0); + }, true); } ]);
diff --git a/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-loader.html b/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-loader.html index 556787f3..4a42abc 100644 --- a/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-loader.html +++ b/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-loader.html
@@ -81,33 +81,31 @@ size: sourceStringified.length }; - InspectorTest.override(Profiler.HeapProfileHeader.prototype, '_createFileReader', function(fileMock, delegate) { - return { - start: function(receiver) { - delegate.onTransferStarted(this); - receiver.write(sourceStringified); - delegate.onChunkTransferred(this); - receiver.close(); - delegate.onTransferFinished(this); - }, + Bindings.ChunkedFileReader = class { + constructor() {} - loadedSize: function() - { - return fileMock.size; - }, + read(receiver) { + receiver.write(sourceStringified); + receiver.close(); + return Promise.resolve(true); + } - fileSize: function() - { - return fileMock.size; - }, + loadedSize() + { + return fileMock.size; + } - fileName: function() - { - return fileMock.name; - } - }; - }); - InspectorTest.addSniffer(Profiler.HeapProfileHeader.prototype, "_snapshotReceived", function() { next(); }); + fileSize() + { + return fileMock.size; + } + + fileName() + { + return fileMock.name; + } + }; + InspectorTest.addSniffer(Profiler.HeapProfileHeader.prototype, "_snapshotReceived", next); panel._loadFromFile(fileMock); },
diff --git a/third_party/WebKit/LayoutTests/inspector/throttling/mobile-throttling.html b/third_party/WebKit/LayoutTests/inspector/throttling/mobile-throttling.html index ce09f425..a133853 100644 --- a/third_party/WebKit/LayoutTests/inspector/throttling/mobile-throttling.html +++ b/third_party/WebKit/LayoutTests/inspector/throttling/mobile-throttling.html
@@ -3,7 +3,6 @@ <title> Change mobile throttling setting.</title> <script src = "../../http/tests/inspector/inspector-test.js"></script> <script> - function initialize_ThrottlingTest() { InspectorTest.preloadPanel("network"); InspectorTest.preloadPanel("timeline"); @@ -14,8 +13,8 @@ var deviceModeView = new Emulation.DeviceModeView(); var deviceModeThrottling = deviceModeView._toolbar._throttlingConditionsItem; - var networkPanelThrottling = UI.panels.network._throttlingSelect; - var networkPanelOfflineCheckbox = UI.panels.network._offlineCheckbox.inputElement; + var networkPanelThrottling = UI.panels.network.throttlingSelectForTest(); + var networkPanelOfflineCheckbox = UI.panels.network.offlineCheckboxForTest().inputElement; var networkConditionsDrawerThrottlingSelector = self.runtime.sharedInstance(Network.NetworkConfigView)._networkThrottlingSelect; var performancePanelNetworkThrottling = UI.panels.timeline._networkThrottlingSelect;
diff --git a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html index 3707495..0538d5f 100644 --- a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html +++ b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html
@@ -6,7 +6,7 @@ <script src="../resources/timeline-data.js"></script> <script> -function test() +async function test() { var timeline = UI.panels.timeline; timeline._onModeChanged(); @@ -19,7 +19,8 @@ } timeline.requestWindowTimes = requestWindowTimesHook; - InspectorTest.loadTimeline(InspectorTest.timelineData()).then(() => InspectorTest.completeTest()); + await InspectorTest.loadTimeline(InspectorTest.timelineData()); + InspectorTest.completeTest(); } </script>
diff --git a/third_party/WebKit/LayoutTests/inspector/tracing/tracing-timeline-load.html b/third_party/WebKit/LayoutTests/inspector/tracing/tracing-timeline-load.html index cc2856a..b707015 100644 --- a/third_party/WebKit/LayoutTests/inspector/tracing/tracing-timeline-load.html +++ b/third_party/WebKit/LayoutTests/inspector/tracing/tracing-timeline-load.html
@@ -6,9 +6,9 @@ function test() { - InspectorTest.TestTimelineLoaderClient = function(callback) + InspectorTest.TestTimelineLoaderClient = function() { - this._callback = callback; + this._completePromise = new Promise(resolve => this._resolve = resolve); } InspectorTest.TestTimelineLoaderClient.prototype = { @@ -29,19 +29,18 @@ loadingComplete: function(model) { - this.model = model; InspectorTest.addResult(`TimelineLoaderClient.loadingComplete(${!!model})`); - this._callback(); + this._resolve(model); }, + + modelPromise: function() + { + return this._completePromise; + } } - function runTestWithDataAndCheck(input, expectedOutput, callback) + async function runTestWithDataAndCheck(input, expectedOutput, callback) { - function createFileReader(file, delegate) - { - return new InspectorTest.FakeFileReader(input, delegate, () => {}); - } - function checkSaveData(output) { var saveData = JSON.parse(output); @@ -49,36 +48,24 @@ callback(); } - InspectorTest.override(Timeline.TimelineLoader, "_createFileReader", createFileReader); - var delegate = new InspectorTest.TestTimelineLoaderClient(onTimelineLoaded); - Timeline.TimelineLoader.loadFromFile({}, delegate); - async function onTimelineLoaded() - { - var saver = new Timeline.TracingTimelineSaver(); - var stream = new InspectorTest.StringOutputStream(InspectorTest.safeWrap(checkSaveData)); - var storage = delegate.model.backingStorage(); - await stream.open(""); - storage.writeToStream(stream, saver); - } + Bindings.ChunkedFileReader = InspectorTest.FakeFileReader; + var client = new InspectorTest.TestTimelineLoaderClient(); + var loader = Timeline.TimelineLoader.loadFromFile(input, client); + var stream = new InspectorTest.StringOutputStream(InspectorTest.safeWrap(checkSaveData)); + var model = await client.modelPromise(); + var storage = model.backingStorage(); + await stream.open(""); + storage.writeToStream(stream); } - function runTestOnMalformedInput(input, callback) + async function runTestOnMalformedInput(input, callback) { - function createFileReader(file, delegate) - { - return new InspectorTest.FakeFileReader(input, delegate, () => {}); - } - - function checkLoadedData(data) - { - var model = delegate.model; - InspectorTest.addResult("Model is empty: " + (!model || (!model.minimumRecordTime() && !model.maximumRecordTime()))); - callback(); - } - - InspectorTest.override(Timeline.TimelineLoader, "_createFileReader", createFileReader); - var delegate = new InspectorTest.TestTimelineLoaderClient(checkLoadedData); - Timeline.TimelineLoader.loadFromFile({}, delegate); + Bindings.ChunkedFileReader = InspectorTest.FakeFileReader; + var client = new InspectorTest.TestTimelineLoaderClient(); + var loader = Timeline.TimelineLoader.loadFromFile(input, client); + var model = await client.modelPromise(); + InspectorTest.addResult("Model is empty: " + (!model || (!model.minimumRecordTime() && !model.maximumRecordTime()))); + callback(); } var data = [{"args":{"number":32},"cat":"__metadata","name":"num_cpus","ph":"M","pid":32127,"tid":0,"ts":0},
diff --git a/third_party/WebKit/LayoutTests/media/controls/controls-cast-button-low-end-device.html b/third_party/WebKit/LayoutTests/media/controls/controls-cast-button-low-end-device.html new file mode 100644 index 0000000..a21dd2ba --- /dev/null +++ b/third_party/WebKit/LayoutTests/media/controls/controls-cast-button-low-end-device.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<title>media controls cast button low end device</title> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../media-file.js"></script> +<script src="../media-controls.js"></script> +<script src="../remoteplayback/util.js"></script> +<video width="500"></video> +<script> +async_test(function(t) { + setIsLowEndDeviceForTest(t); + enableRemotePlaybackBackendForTest(t); + + var video = document.querySelector("video"); + video.controls = true; + + // No idea why waiting for the metadata to load is needed (or a couple + // of timeouts) since the button should show with the rest of the + // controls with no need for metadata. + // NOTE: shouldn't report the availability as true unless there's a URL + // to fling. + video.onloadedmetadata = t.step_func_done(_ => { + assert_true(isVisible(castButton(video))); + }); + + video.src = findMediaFile("video", "../content/test"); +}); +</script>
diff --git a/third_party/WebKit/LayoutTests/media/remoteplayback/util.js b/third_party/WebKit/LayoutTests/media/remoteplayback/util.js index 3502d1312..a38219f 100644 --- a/third_party/WebKit/LayoutTests/media/remoteplayback/util.js +++ b/third_party/WebKit/LayoutTests/media/remoteplayback/util.js
@@ -8,3 +8,12 @@ remotePlaybackBackendEnabledOldValue; }); } + +function setIsLowEndDeviceForTest(t) { + var isLowEndDeviceOldValue = internals.isLowEndDevice(); + internals.setIsLowEndDevice(true); + + t.add_cleanup(_ => { + internals.setIsLowEndDevice(isLowEndDeviceOldValue); + }); +}
diff --git a/third_party/WebKit/LayoutTests/media/remoteplayback/watch-availability-throws-low-end-device.html b/third_party/WebKit/LayoutTests/media/remoteplayback/watch-availability-throws-low-end-device.html index 87579191..60d46036 100644 --- a/third_party/WebKit/LayoutTests/media/remoteplayback/watch-availability-throws-low-end-device.html +++ b/third_party/WebKit/LayoutTests/media/remoteplayback/watch-availability-throws-low-end-device.html
@@ -5,6 +5,7 @@ <script src="../../resources/testharness.js"></script> <script src="../../resources/testharnessreport.js"></script> <script src="../media-file.js"></script> + <script src="util.js"></script> </head> <body> <script> @@ -12,6 +13,7 @@ // - internals.setIsLowEndDevice() async_test(function(t) { + enableRemotePlaybackBackendForTest(t); var v = document.createElement('video'); v.src = findMediaFile('video', '../content/test'); document.body.appendChild(v);
diff --git a/third_party/WebKit/LayoutTests/paint/overflow/composited-rounded-clip-floating-element-expected.txt b/third_party/WebKit/LayoutTests/paint/overflow/composited-rounded-clip-floating-element-expected.txt new file mode 100644 index 0000000..c0c1300 --- /dev/null +++ b/third_party/WebKit/LayoutTests/paint/overflow/composited-rounded-clip-floating-element-expected.txt
@@ -0,0 +1,16 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x36 + LayoutBlockFlow {HTML} at (0,0) size 800x36 + LayoutBlockFlow {BODY} at (8,8) size 784x20 +layer at (8,8) size 784x20 + LayoutBlockFlow {DIV} at (0,0) size 784x20 +layer at (8,8) size 784x0 + LayoutBlockFlow {DIV} at (0,0) size 784x0 +layer at (8,8) size 784x0 + LayoutBlockFlow {DIV} at (0,0) size 784x0 +layer at (8,8) size 784x0 + LayoutBlockFlow (relative positioned) {DIV} at (0,0) size 784x0 + LayoutBlockFlow (floating) {DIV} at (0,0) size 21x20 + LayoutText {#text} at (0,0) size 21x19 + text run at (0,0) width 21: "test"
diff --git a/third_party/WebKit/LayoutTests/paint/overflow/composited-rounded-clip-floating-element.html b/third_party/WebKit/LayoutTests/paint/overflow/composited-rounded-clip-floating-element.html new file mode 100644 index 0000000..169d6fb --- /dev/null +++ b/third_party/WebKit/LayoutTests/paint/overflow/composited-rounded-clip-floating-element.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<!-- Passes if the word "test" is visible --> +<div style="border-radius:2px;overflow:hidden;"> + <div style="overflow:hidden;"> + <div style="transform: translateZ(0);"></div> + </div> + + <!-- This div has zero height because its child is floating. Nevertheless the + child should get the rounded clip mask applied to it. It is indirectly + composited due to overlapping the above div --> + <div style="position:relative;"> + <div style="float:left">test</div> + </div> +</div>
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/overflow/composited-rounded-clip-floating-element-expected.png b/third_party/WebKit/LayoutTests/platform/linux/paint/overflow/composited-rounded-clip-floating-element-expected.png new file mode 100644 index 0000000..6f07a96d --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/paint/overflow/composited-rounded-clip-floating-element-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/overflow/composited-rounded-clip-floating-element-expected.png b/third_party/WebKit/LayoutTests/platform/mac/paint/overflow/composited-rounded-clip-floating-element-expected.png new file mode 100644 index 0000000..194cd5ea --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/paint/overflow/composited-rounded-clip-floating-element-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/overflow/composited-rounded-clip-floating-element-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/paint/overflow/composited-rounded-clip-floating-element-expected.txt new file mode 100644 index 0000000..b920092 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/paint/overflow/composited-rounded-clip-floating-element-expected.txt
@@ -0,0 +1,16 @@ +layer at (0,0) size 800x600 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 800x34 + LayoutBlockFlow {HTML} at (0,0) size 800x34 + LayoutBlockFlow {BODY} at (8,8) size 784x18 +layer at (8,8) size 784x18 + LayoutBlockFlow {DIV} at (0,0) size 784x18 +layer at (8,8) size 784x0 + LayoutBlockFlow {DIV} at (0,0) size 784x0 +layer at (8,8) size 784x0 + LayoutBlockFlow {DIV} at (0,0) size 784x0 +layer at (8,8) size 784x0 + LayoutBlockFlow (relative positioned) {DIV} at (0,0) size 784x0 + LayoutBlockFlow (floating) {DIV} at (0,0) size 22.22x18 + LayoutText {#text} at (0,0) size 23x18 + text run at (0,0) width 23: "test"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt index 81844b5..4757310 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -615,6 +615,13 @@ method @@iterator method constructor method item +interface Clipboard : EventTarget + attribute @@toStringTag + method constructor + method read + method readText + method write + method writeText interface ClipboardEvent : Event attribute @@toStringTag getter clipboardData
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/overflow/composited-rounded-clip-floating-element-expected.png b/third_party/WebKit/LayoutTests/platform/win/paint/overflow/composited-rounded-clip-floating-element-expected.png new file mode 100644 index 0000000..e7415340 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win/paint/overflow/composited-rounded-clip-floating-element-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt index 6fd2bfa..65eb1cda 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -544,6 +544,13 @@ method @@iterator method constructor method item +interface Clipboard : EventTarget + attribute @@toStringTag + method constructor + method read + method readText + method write + method writeText interface ClipboardEvent : Event attribute @@toStringTag getter clipboardData
diff --git a/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-b.svg b/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-b.svg index f8952627..92f14fc6 100644 --- a/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-b.svg +++ b/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-b.svg
@@ -29,6 +29,8 @@ function loaded() { document.documentElement.setCurrentTime(8); + // Pause the timeline to avoid it advancing before the result is sampled. + document.documentElement.pauseAnimations(); if (window.testRunner) testRunner.notifyDone(); }
diff --git a/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-c.svg b/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-c.svg index b134383..f960e37 100644 --- a/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-c.svg +++ b/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-c.svg
@@ -29,6 +29,8 @@ function loaded() { document.documentElement.setCurrentTime(11); + // Pause the timeline to avoid it advancing before the result is sampled. + document.documentElement.pauseAnimations(); if (window.testRunner) testRunner.notifyDone(); }
diff --git a/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive.svg b/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive.svg index 5b8310aa..587a7bd 100644 --- a/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive.svg +++ b/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive.svg
@@ -29,6 +29,8 @@ function loaded() { document.documentElement.setCurrentTime(3); + // Pause the timeline to avoid it advancing before the result is sampled. + document.documentElement.pauseAnimations(); if (window.testRunner) testRunner.notifyDone(); }
diff --git a/third_party/WebKit/LayoutTests/typedcssom/cssUnitValue_toMethod.html b/third_party/WebKit/LayoutTests/typedcssom/cssUnitValue_toMethod.html index 00f1a12..bccac27 100644 --- a/third_party/WebKit/LayoutTests/typedcssom/cssUnitValue_toMethod.html +++ b/third_party/WebKit/LayoutTests/typedcssom/cssUnitValue_toMethod.html
@@ -12,6 +12,15 @@ 'turn' ]; +let fixedLengthUnits = [ + 'px', + 'in', + 'cm', + 'mm', + 'pt', + 'pc' +]; + let conversionFactors = { 'deg': { 'deg': 1, @@ -37,6 +46,59 @@ 'grad': 400, 'turn': 1, }, + // 96 px per in + // 2.54 cm per in + // 10 mm per cm + // 72 pt per in + // 6 pc per in + 'px': { + 'px': 1, + 'in': 1 / 96, + 'cm': 2.54 / 96, + 'mm': 25.4 / 96, + 'pt': 72 / 96, + 'pc': 6 / 96 + }, + 'in': { + 'px': 96, + 'in': 1, + 'cm': 2.54, + 'mm': 25.4, + 'pt': 72, + 'pc': 6 + }, + 'cm': { + 'px': 96 / 2.54, + 'in': 1 / 2.54, + 'cm': 1, + 'mm': 10, + 'pt': 72 / 2.54, + 'pc': 6 / 2.54 + }, + 'mm': { + 'px': 96 / 25.4, + 'in': 1 / 25.4, + 'cm': 1 / 10, + 'mm': 1, + 'pt': 72 / 25.4, + 'pc': 6 / 25.4 + }, + 'pt': { + 'px': 96 / 72, + 'in': 1 / 72, + 'cm': 2.54 / 72, + 'mm': 25.4 / 72, + 'pt': 1, + 'pc': 6 / 72, + }, + 'pc': { + 'px': 96 / 6, + 'in': 1 / 6, + 'cm': 2.54 / 6, + 'mm': 25.4 / 6, + 'pt': 72 / 6, + 'pc': 1 + } } test(() => { @@ -65,4 +127,16 @@ } } +for (let unit of fixedLengthUnits) { + for (let toUnit of fixedLengthUnits) { + test(() => { + let unitValue = new CSSUnitValue(1, unit); + let result = unitValue.to(toUnit); + assert_approx_equals( + result.value, conversionFactors[unit][toUnit], EPSILON); + assert_equals(result.unit, toUnit); + }, 'Converting fixed length unit ' + unit + ' to ' + toUnit); + } +} + </script>
diff --git a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt index 9aa28ab3..c3fc5dc5 100644 --- a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt
@@ -1025,6 +1025,13 @@ method @@iterator method constructor method item +interface Clipboard : EventTarget + attribute @@toStringTag + method constructor + method read + method readText + method write + method writeText interface ClipboardEvent : Event attribute @@toStringTag getter clipboardData @@ -4411,6 +4418,7 @@ getter authentication getter bluetooth getter budget + getter clipboard getter connection getter cookieEnabled getter credentials
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt index 84197b0..d72d71e 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -1025,6 +1025,13 @@ method @@iterator method constructor method item +interface Clipboard : EventTarget + attribute @@toStringTag + method constructor + method read + method readText + method write + method writeText interface ClipboardEvent : Event attribute @@toStringTag getter clipboardData @@ -4418,6 +4425,7 @@ getter authentication getter bluetooth getter budget + getter clipboard getter connection getter cookieEnabled getter credentials
diff --git a/third_party/WebKit/Source/DEPS b/third_party/WebKit/Source/DEPS index 510a74f9..2ad1573e 100644 --- a/third_party/WebKit/Source/DEPS +++ b/third_party/WebKit/Source/DEPS
@@ -3,6 +3,7 @@ "+base/gtest_prod_util.h", "+build", "+services/service_manager/public/cpp/connector.h", + "+services/service_manager/public/cpp/interface_provider.h", "+testing/gmock/include/gmock", "+testing/gtest/include/gtest", "+v8",
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn index 123b123..087ea36 100644 --- a/third_party/WebKit/Source/core/BUILD.gn +++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -465,7 +465,6 @@ "$blink_core_output_dir/css/properties/CSSPropertyAPIAnimationIterationCount.h", "$blink_core_output_dir/css/properties/CSSPropertyAPIAnimationName.h", "$blink_core_output_dir/css/properties/CSSPropertyAPIAnimationPlayState.h", - "$blink_core_output_dir/css/properties/CSSPropertyAPIBackgroundColor.h", "$blink_core_output_dir/css/properties/CSSPropertyAPIBaselineShift.h", "$blink_core_output_dir/css/properties/CSSPropertyAPIBorderImageOutset.h", "$blink_core_output_dir/css/properties/CSSPropertyAPIBorderImageRepeat.h", @@ -478,6 +477,7 @@ "$blink_core_output_dir/css/properties/CSSPropertyAPIClip.h", "$blink_core_output_dir/css/properties/CSSPropertyAPIClipPath.h", "$blink_core_output_dir/css/properties/CSSPropertyAPIColor.h", + "$blink_core_output_dir/css/properties/CSSPropertyAPIColorNoQuirks.h", "$blink_core_output_dir/css/properties/CSSPropertyAPIColumnCount.h", "$blink_core_output_dir/css/properties/CSSPropertyAPIColumnGap.h", "$blink_core_output_dir/css/properties/CSSPropertyAPIColumnRuleWidth.h",
diff --git a/third_party/WebKit/Source/core/DEPS b/third_party/WebKit/Source/core/DEPS index 76e014f4..591e0d8 100644 --- a/third_party/WebKit/Source/core/DEPS +++ b/third_party/WebKit/Source/core/DEPS
@@ -11,7 +11,6 @@ "+platform", "+public/platform", "+public/web", - "+services/service_manager/public/cpp", "+third_party/skia/include", "+ui/gfx/geometry", "-web", @@ -21,5 +20,6 @@ # We do not want any new dependencies on Web(Local|Remote)FrameBase.h until # we resolve the control layer. "!core/frame/WebLocalFrameBase.h", - "!core/frame/WebRemoteFrameBase.h" + "!core/frame/WebRemoteFrameBase.h", + "!core/frame/WebRemoteFrameImpl.h", ]
diff --git a/third_party/WebKit/Source/core/animation/CSSImageInterpolationType.cpp b/third_party/WebKit/Source/core/animation/CSSImageInterpolationType.cpp index daf53ac..c9b5048 100644 --- a/third_party/WebKit/Source/core/animation/CSSImageInterpolationType.cpp +++ b/third_party/WebKit/Source/core/animation/CSSImageInterpolationType.cpp
@@ -38,7 +38,7 @@ return start_; if (progress >= 1) return end_; - return CSSCrossfadeValue::Create( + return cssvalue::CSSCrossfadeValue::Create( start_, end_, CSSPrimitiveValue::Create(progress, CSSPrimitiveValue::UnitType::kNumber));
diff --git a/third_party/WebKit/Source/core/clipboard/BUILD.gn b/third_party/WebKit/Source/core/clipboard/BUILD.gn index 7c3af33d..cebb63e 100644 --- a/third_party/WebKit/Source/core/clipboard/BUILD.gn +++ b/third_party/WebKit/Source/core/clipboard/BUILD.gn
@@ -6,6 +6,10 @@ blink_core_sources("clipboard") { sources = [ + "Clipboard.cpp", + "Clipboard.h", + "ClipboardPromise.cpp", + "ClipboardPromise.h", "DataObject.cpp", "DataObject.h", "DataObjectItem.cpp",
diff --git a/third_party/WebKit/Source/core/clipboard/Clipboard.cpp b/third_party/WebKit/Source/core/clipboard/Clipboard.cpp new file mode 100644 index 0000000..98b0ac9c --- /dev/null +++ b/third_party/WebKit/Source/core/clipboard/Clipboard.cpp
@@ -0,0 +1,45 @@ +// Copyright 2017 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 "core/clipboard/Clipboard.h" + +#include "bindings/core/v8/ScriptPromiseResolver.h" +#include "core/clipboard/ClipboardPromise.h" + +namespace blink { + +Clipboard::Clipboard(ExecutionContext* context) + : ContextLifecycleObserver(context) {} + +ScriptPromise Clipboard::read(ScriptState* script_state) { + return ClipboardPromise::CreateForRead(script_state); +} + +ScriptPromise Clipboard::readText(ScriptState* script_state) { + return ClipboardPromise::CreateForReadText(script_state); +} + +ScriptPromise Clipboard::write(ScriptState* script_state, DataTransfer* data) { + return ClipboardPromise::CreateForWrite(script_state, data); +} + +ScriptPromise Clipboard::writeText(ScriptState* script_state, + const String& data) { + return ClipboardPromise::CreateForWriteText(script_state, data); +} + +const AtomicString& Clipboard::InterfaceName() const { + return EventTargetNames::Clipboard; +} + +ExecutionContext* Clipboard::GetExecutionContext() const { + return ContextLifecycleObserver::GetExecutionContext(); +} + +DEFINE_TRACE(Clipboard) { + EventTarget::Trace(visitor); + ContextLifecycleObserver::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/clipboard/Clipboard.h b/third_party/WebKit/Source/core/clipboard/Clipboard.h new file mode 100644 index 0000000..568b45b --- /dev/null +++ b/third_party/WebKit/Source/core/clipboard/Clipboard.h
@@ -0,0 +1,42 @@ +// Copyright 2017 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 Clipboard_h +#define Clipboard_h + +#include "bindings/core/v8/ScriptPromise.h" +#include "core/dom/ContextLifecycleObserver.h" +#include "core/events/EventTarget.h" +#include "platform/wtf/Noncopyable.h" + +namespace blink { + +class DataTransfer; +class ScriptState; + +class Clipboard : public EventTargetWithInlineData, + public ContextLifecycleObserver { + USING_GARBAGE_COLLECTED_MIXIN(Clipboard); + DEFINE_WRAPPERTYPEINFO(); + WTF_MAKE_NONCOPYABLE(Clipboard); + + public: + explicit Clipboard(ExecutionContext*); + + ScriptPromise read(ScriptState*); + ScriptPromise readText(ScriptState*); + + ScriptPromise write(ScriptState*, DataTransfer*); + ScriptPromise writeText(ScriptState*, const String&); + + // EventTarget + const AtomicString& InterfaceName() const override; + ExecutionContext* GetExecutionContext() const override; + + DECLARE_VIRTUAL_TRACE(); +}; + +} // namespace blink + +#endif // Clipboard_h
diff --git a/third_party/WebKit/Source/core/clipboard/Clipboard.idl b/third_party/WebKit/Source/core/clipboard/Clipboard.idl new file mode 100644 index 0000000..22a02471 --- /dev/null +++ b/third_party/WebKit/Source/core/clipboard/Clipboard.idl
@@ -0,0 +1,14 @@ +// Copyright 2017 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. + +// https://w3c.github.io/clipboard-apis/#clipboard-interface + +[SecureContext] +interface Clipboard : EventTarget { + [CallWith=ScriptState] Promise<DataTransfer> read(); + [CallWith=ScriptState] Promise<DOMString> readText(); + + [CallWith=ScriptState] Promise<void> write(DataTransfer data); + [CallWith=ScriptState] Promise<void> writeText(DOMString data); +};
diff --git a/third_party/WebKit/Source/core/clipboard/ClipboardPromise.cpp b/third_party/WebKit/Source/core/clipboard/ClipboardPromise.cpp new file mode 100644 index 0000000..4a0739a --- /dev/null +++ b/third_party/WebKit/Source/core/clipboard/ClipboardPromise.cpp
@@ -0,0 +1,115 @@ +// Copyright 2017 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 "core/clipboard/ClipboardPromise.h" + +#include "bindings/core/v8/ScriptPromiseResolver.h" +#include "core/clipboard/DataObject.h" +#include "core/clipboard/DataTransfer.h" +#include "core/clipboard/DataTransferItem.h" +#include "core/clipboard/DataTransferItemList.h" +#include "core/dom/TaskRunnerHelper.h" +#include "platform/CrossThreadFunctional.h" +#include "platform/clipboard/ClipboardMimeTypes.h" +#include "public/platform/Platform.h" + +namespace blink { + +ScriptPromise ClipboardPromise::CreateForRead(ScriptState* script_state) { + ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state); + clipboard_promise->GetTaskRunner()->PostTask( + BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleRead, + WrapPersistent(clipboard_promise))); + return clipboard_promise->script_promise_resolver_->Promise(); +} + +ScriptPromise ClipboardPromise::CreateForReadText(ScriptState* script_state) { + ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state); + clipboard_promise->GetTaskRunner()->PostTask( + BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleReadText, + WrapPersistent(clipboard_promise))); + return clipboard_promise->script_promise_resolver_->Promise(); +} + +ScriptPromise ClipboardPromise::CreateForWrite(ScriptState* script_state, + DataTransfer* data) { + ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state); + clipboard_promise->GetTaskRunner()->PostTask( + BLINK_FROM_HERE, + WTF::Bind(&ClipboardPromise::HandleWrite, + WrapPersistent(clipboard_promise), WrapPersistent(data))); + return clipboard_promise->script_promise_resolver_->Promise(); +} + +ScriptPromise ClipboardPromise::CreateForWriteText(ScriptState* script_state, + const String& data) { + ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state); + clipboard_promise->GetTaskRunner()->PostTask( + BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleWriteText, + WrapPersistent(clipboard_promise), data)); + return clipboard_promise->script_promise_resolver_->Promise(); +} + +ClipboardPromise::ClipboardPromise(ScriptState* script_state) + : ContextLifecycleObserver(blink::ExecutionContext::From(script_state)), + script_promise_resolver_(ScriptPromiseResolver::Create(script_state)), + buffer_(WebClipboard::kBufferStandard) {} + +WebTaskRunner* ClipboardPromise::GetTaskRunner() { + // TODO(garykac): Replace MiscPlatformAPI with TaskType specific to clipboard. + return TaskRunnerHelper::Get(TaskType::kMiscPlatformAPI, + GetExecutionContext()) + .Get(); +} + +// TODO(garykac): This currently only handles plain text. +void ClipboardPromise::HandleRead() { + DCHECK(script_promise_resolver_); + String plain_text = Platform::Current()->Clipboard()->ReadPlainText(buffer_); + + const DataTransfer::DataTransferType type = + DataTransfer::DataTransferType::kCopyAndPaste; + const DataTransferAccessPolicy access = + DataTransferAccessPolicy::kDataTransferReadable; + DataObject* data = DataObject::CreateFromString(plain_text); + DataTransfer* dt = DataTransfer::Create(type, access, data); + script_promise_resolver_->Resolve(dt); +} + +void ClipboardPromise::HandleReadText() { + DCHECK(script_promise_resolver_); + String text = Platform::Current()->Clipboard()->ReadPlainText(buffer_); + script_promise_resolver_->Resolve(text); +} + +// TODO(garykac): This currently only handles plain text. +void ClipboardPromise::HandleWrite(DataTransfer* data) { + DCHECK(script_promise_resolver_); + size_t num_items = data->items()->length(); + for (unsigned long i = 0; i < num_items; i++) { + DataTransferItem* item = data->items()->item(i); + DataObjectItem* objectItem = item->GetDataObjectItem(); + if (objectItem->Kind() == DataObjectItem::kStringKind && + objectItem->GetType() == kMimeTypeTextPlain) { + String text = objectItem->GetAsString(); + Platform::Current()->Clipboard()->WritePlainText(text); + script_promise_resolver_->Resolve(); + return; + } + } + script_promise_resolver_->Reject(); +} + +void ClipboardPromise::HandleWriteText(const String& data) { + DCHECK(script_promise_resolver_); + Platform::Current()->Clipboard()->WritePlainText(data); + script_promise_resolver_->Resolve(); +} + +DEFINE_TRACE(ClipboardPromise) { + visitor->Trace(script_promise_resolver_); + ContextLifecycleObserver::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/clipboard/ClipboardPromise.h b/third_party/WebKit/Source/core/clipboard/ClipboardPromise.h new file mode 100644 index 0000000..1cfd0e3 --- /dev/null +++ b/third_party/WebKit/Source/core/clipboard/ClipboardPromise.h
@@ -0,0 +1,52 @@ +// Copyright 2017 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 ClipboardPromise_h +#define ClipboardPromise_h + +#include "bindings/core/v8/ScriptPromise.h" +#include "core/CoreExport.h" +#include "core/dom/ContextLifecycleObserver.h" +#include "public/platform/WebClipboard.h" + +namespace blink { + +class DataTransfer; +class ScriptPromiseResolver; + +class ClipboardPromise final + : public GarbageCollectedFinalized<ClipboardPromise>, + public ContextLifecycleObserver { + USING_GARBAGE_COLLECTED_MIXIN(ClipboardPromise); + WTF_MAKE_NONCOPYABLE(ClipboardPromise); + + public: + virtual ~ClipboardPromise(){}; + + static ScriptPromise CreateForRead(ScriptState*); + static ScriptPromise CreateForReadText(ScriptState*); + static ScriptPromise CreateForWrite(ScriptState*, DataTransfer*); + static ScriptPromise CreateForWriteText(ScriptState*, const String&); + + DECLARE_VIRTUAL_TRACE(); + + private: + ClipboardPromise(ScriptState*); + + WebTaskRunner* GetTaskRunner(); + + void HandleRead(); + void HandleReadText(); + + void HandleWrite(DataTransfer*); + void HandleWriteText(const String&); + + Member<ScriptPromiseResolver> script_promise_resolver_; + + WebClipboard::Buffer buffer_; +}; + +} // namespace blink + +#endif // ClipboardPromise_h
diff --git a/third_party/WebKit/Source/core/core_idl_files.gni b/third_party/WebKit/Source/core/core_idl_files.gni index c8c5ae7..f6cc9e7 100644 --- a/third_party/WebKit/Source/core/core_idl_files.gni +++ b/third_party/WebKit/Source/core/core_idl_files.gni
@@ -35,6 +35,7 @@ "animation/KeyframeEffect.idl", "animation/KeyframeEffectReadOnly.idl", "animation/ScrollTimeline.idl", + "clipboard/Clipboard.idl", "clipboard/DataTransfer.idl", "clipboard/DataTransferItemList.idl", "css/CSS.idl", @@ -470,6 +471,7 @@ "events/EventListener.idl", "events/NavigatorEvents.idl", "fileapi/URLFileAPI.idl", + "frame/NavigatorClipboard.idl", "frame/NavigatorConcurrentHardware.idl", "frame/NavigatorCookies.idl", "frame/NavigatorID.idl",
diff --git a/third_party/WebKit/Source/core/css/BUILD.gn b/third_party/WebKit/Source/core/css/BUILD.gn index ca13f0d..1fb11927 100644 --- a/third_party/WebKit/Source/core/css/BUILD.gn +++ b/third_party/WebKit/Source/core/css/BUILD.gn
@@ -381,7 +381,6 @@ "properties/CSSPropertyAPIAnimationIterationCount.cpp", "properties/CSSPropertyAPIAnimationName.cpp", "properties/CSSPropertyAPIAnimationPlayState.cpp", - "properties/CSSPropertyAPIBackgroundColor.cpp", "properties/CSSPropertyAPIBaselineShift.cpp", "properties/CSSPropertyAPIBorderImageOutset.cpp", "properties/CSSPropertyAPIBorderImageRepeat.cpp", @@ -394,6 +393,7 @@ "properties/CSSPropertyAPIClip.cpp", "properties/CSSPropertyAPIClipPath.cpp", "properties/CSSPropertyAPIColor.cpp", + "properties/CSSPropertyAPIColorNoQuirks.cpp", "properties/CSSPropertyAPIColumnCount.cpp", "properties/CSSPropertyAPIColumnGap.cpp", "properties/CSSPropertyAPIColumnRuleWidth.cpp",
diff --git a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp index ec23b00..83231bb 100644 --- a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp +++ b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp
@@ -33,6 +33,7 @@ #include "platform/wtf/text/StringBuilder.h" namespace blink { +namespace cssvalue { static bool SubimageIsPending(CSSValue* value) { if (value->IsImageValue()) @@ -302,4 +303,5 @@ CSSImageGeneratorValue::TraceAfterDispatch(visitor); } +} // namespace cssvalue } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h index 580551c..5c4eb01 100644 --- a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h +++ b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h
@@ -37,8 +37,10 @@ class CrossfadeSubimageObserverProxy; +namespace cssvalue { + class CORE_EXPORT CSSCrossfadeValue final : public CSSImageGeneratorValue { - friend class CrossfadeSubimageObserverProxy; + friend class blink::CrossfadeSubimageObserverProxy; USING_PRE_FINALIZER(CSSCrossfadeValue, Dispose); public: @@ -116,6 +118,7 @@ DEFINE_CSS_VALUE_TYPE_CASTS(CSSCrossfadeValue, IsCrossfadeValue()); +} // namespace cssvalue } // namespace blink #endif // CSSCrossfadeValue_h
diff --git a/third_party/WebKit/Source/core/css/CSSHelper.h b/third_party/WebKit/Source/core/css/CSSHelper.h index 30e5313..4cf135e 100644 --- a/third_party/WebKit/Source/core/css/CSSHelper.h +++ b/third_party/WebKit/Source/core/css/CSSHelper.h
@@ -26,12 +26,19 @@ namespace blink { +const double kMillimetersPerCentimeter = 10; +const double kCentimetersPerInch = 2.54; +const double kMillimetersPerInch = 25.4; +const double kPointsPerInch = 72; +const double kPicasPerInch = 6; + // These conversions are defined in css-values const double kCssPixelsPerInch = 96; -const double kCssPixelsPerCentimeter = kCssPixelsPerInch / 2.54; // 2.54 cm/in -const double kCssPixelsPerMillimeter = kCssPixelsPerCentimeter / 10; -const double kCssPixelsPerPoint = kCssPixelsPerInch / 72; -const double kCssPixelsPerPica = kCssPixelsPerInch / 6; +const double kCssPixelsPerCentimeter = kCssPixelsPerInch / kCentimetersPerInch; +const double kCssPixelsPerMillimeter = + kCssPixelsPerCentimeter / kMillimetersPerCentimeter; +const double kCssPixelsPerPoint = kCssPixelsPerInch / kPointsPerInch; +const double kCssPixelsPerPica = kCssPixelsPerInch / kPicasPerInch; } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.cpp b/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.cpp index b0f68e4..59fbd88 100644 --- a/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.cpp +++ b/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.cpp
@@ -33,6 +33,8 @@ namespace blink { +using cssvalue::ToCSSCrossfadeValue; + CSSImageGeneratorValue::CSSImageGeneratorValue(ClassType class_type) : CSSValue(class_type) {}
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.json5 b/third_party/WebKit/Source/core/css/CSSProperties.json5 index 6ad074c4..6ccbd6fd 100644 --- a/third_party/WebKit/Source/core/css/CSSProperties.json5 +++ b/third_party/WebKit/Source/core/css/CSSProperties.json5
@@ -398,6 +398,8 @@ // Other properties can depend upon high priority properties (e.g. font-size / ems) { name: "color", + api_class: "CSSPropertyAPIColor", + api_methods: ["parseSingleValue"], custom_all: true, inherited: true, interpolable: true, @@ -690,7 +692,7 @@ }, { name: "background-color", - api_class: true, + api_class: "CSSPropertyAPIColor", api_methods: ["parseSingleValue"], custom_all: true, interpolable: true, @@ -1302,7 +1304,7 @@ }, { name: "flood-color", - api_class: "CSSPropertyAPIColor", + api_class: "CSSPropertyAPIColorNoQuirks", api_methods: ["parseSingleValue"], converter: "ConvertColor", interpolable: true, @@ -1547,7 +1549,7 @@ }, { name: "lighting-color", - api_class: "CSSPropertyAPIColor", + api_class: "CSSPropertyAPIColorNoQuirks", api_methods: ["parseSingleValue"], converter: "ConvertColor", interpolable: true, @@ -2360,7 +2362,7 @@ }, { name: "stop-color", - api_class: "CSSPropertyAPIColor", + api_class: "CSSPropertyAPIColorNoQuirks", api_methods: ["parseSingleValue"], converter: "ConvertColor", interpolable: true, @@ -2954,7 +2956,7 @@ }, { name: "column-rule-color", - api_class: "CSSPropertyAPIColor", + api_class: "CSSPropertyAPIColorNoQuirks", api_methods: ["parseSingleValue"], custom_all: true, interpolable: true, @@ -3190,7 +3192,7 @@ }, { name: "-webkit-tap-highlight-color", - api_class: "CSSPropertyAPIColor", + api_class: "CSSPropertyAPIColorNoQuirks", api_methods: ["parseSingleValue"], converter: "ConvertColor", inherited: true, @@ -3207,7 +3209,7 @@ }, { name: "-webkit-text-emphasis-color", - api_class: "CSSPropertyAPIColor", + api_class: "CSSPropertyAPIColorNoQuirks", api_methods: ["parseSingleValue"], custom_all: true, inherited: true, @@ -3235,7 +3237,7 @@ }, { name: "-webkit-text-fill-color", - api_class: "CSSPropertyAPIColor", + api_class: "CSSPropertyAPIColorNoQuirks", api_methods: ["parseSingleValue"], custom_all: true, inherited: true, @@ -3255,7 +3257,7 @@ }, { name: "-webkit-text-stroke-color", - api_class: "CSSPropertyAPIColor", + api_class: "CSSPropertyAPIColorNoQuirks", api_methods: ["parseSingleValue"], custom_all: true, inherited: true, @@ -3427,7 +3429,7 @@ { name: "-webkit-border-end-color", - api_class: "CSSPropertyAPIColor", + api_class: "CSSPropertyAPIColorNoQuirks", api_methods: ["parseSingleValue"], direction_aware: true, }, @@ -3443,7 +3445,7 @@ }, { name: "-webkit-border-start-color", - api_class: "CSSPropertyAPIColor", + api_class: "CSSPropertyAPIColorNoQuirks", api_methods: ["parseSingleValue"], direction_aware: true, }, @@ -3459,7 +3461,7 @@ }, { name: "-webkit-border-before-color", - api_class: "CSSPropertyAPIColor", + api_class: "CSSPropertyAPIColorNoQuirks", api_methods: ["parseSingleValue"], direction_aware: true, }, @@ -3475,7 +3477,7 @@ }, { name: "-webkit-border-after-color", - api_class: "CSSPropertyAPIColor", + api_class: "CSSPropertyAPIColorNoQuirks", api_methods: ["parseSingleValue"], direction_aware: true, },
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp index f6fe21ab..547c553 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp +++ b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp
@@ -5,6 +5,7 @@ #include "core/css/cssom/CSSUnitValue.h" #include "bindings/core/v8/ExceptionState.h" +#include "core/css/CSSHelper.h" #include "platform/wtf/MathExtras.h" namespace blink { @@ -84,13 +85,125 @@ if (unit_ == unit) return Create(value_, unit_); - // TODO(meade): Implement other types. + // TODO(meade): Implement other types: time, frequency and resolution. + if (CSSPrimitiveValue::IsLength(unit_) && CSSPrimitiveValue::IsLength(unit)) { + // Only fixed lengths can be converted. + if (CSSPrimitiveValue::IsRelativeUnit(unit_) || + CSSPrimitiveValue::IsRelativeUnit(unit)) + return nullptr; + return Create(ConvertFixedLength(unit), unit); + } if (CSSPrimitiveValue::IsAngle(unit_) && CSSPrimitiveValue::IsAngle(unit)) return Create(ConvertAngle(unit), unit); return nullptr; } +double CSSUnitValue::ConvertFixedLength( + CSSPrimitiveValue::UnitType unit) const { + switch (unit_) { + case CSSPrimitiveValue::UnitType::kPixels: + switch (unit) { + case CSSPrimitiveValue::UnitType::kCentimeters: + return value_ / kCssPixelsPerCentimeter; + case CSSPrimitiveValue::UnitType::kMillimeters: + return value_ / kCssPixelsPerMillimeter; + case CSSPrimitiveValue::UnitType::kInches: + return value_ / kCssPixelsPerInch; + case CSSPrimitiveValue::UnitType::kPoints: + return value_ / kCssPixelsPerPoint; + case CSSPrimitiveValue::UnitType::kPicas: + return value_ / kCssPixelsPerPica; + default: + NOTREACHED(); + return 0; + } + case CSSPrimitiveValue::UnitType::kCentimeters: + switch (unit) { + case CSSPrimitiveValue::UnitType::kPixels: + return value_ * kCssPixelsPerCentimeter; + case CSSPrimitiveValue::UnitType::kMillimeters: + return value_ * kMillimetersPerCentimeter; + case CSSPrimitiveValue::UnitType::kInches: + return value_ / kCentimetersPerInch; + case CSSPrimitiveValue::UnitType::kPoints: + return value_ * (kPointsPerInch / kCentimetersPerInch); + case CSSPrimitiveValue::UnitType::kPicas: + return value_ * (kPicasPerInch / kCentimetersPerInch); + default: + NOTREACHED(); + return 0; + } + case CSSPrimitiveValue::UnitType::kMillimeters: + switch (unit) { + case CSSPrimitiveValue::UnitType::kPixels: + return value_ * kCssPixelsPerMillimeter; + case CSSPrimitiveValue::UnitType::kCentimeters: + return value_ / kMillimetersPerCentimeter; + case CSSPrimitiveValue::UnitType::kInches: + return value_ / (kMillimetersPerCentimeter * kCentimetersPerInch); + case CSSPrimitiveValue::UnitType::kPoints: + return value_ * (kPointsPerInch / kMillimetersPerInch); + case CSSPrimitiveValue::UnitType::kPicas: + return value_ * (kPicasPerInch / kMillimetersPerInch); + default: + NOTREACHED(); + return 0; + } + case CSSPrimitiveValue::UnitType::kInches: + switch (unit) { + case CSSPrimitiveValue::UnitType::kPixels: + return value_ * kCssPixelsPerInch; + case CSSPrimitiveValue::UnitType::kMillimeters: + return value_ * kCentimetersPerInch * kMillimetersPerCentimeter; + case CSSPrimitiveValue::UnitType::kCentimeters: + return value_ * kCentimetersPerInch; + case CSSPrimitiveValue::UnitType::kPoints: + return value_ * kPointsPerInch; + case CSSPrimitiveValue::UnitType::kPicas: + return value_ * kPicasPerInch; + default: + NOTREACHED(); + return 0; + } + case CSSPrimitiveValue::UnitType::kPoints: + switch (unit) { + case CSSPrimitiveValue::UnitType::kPixels: + return value_ * kCssPixelsPerPoint; + case CSSPrimitiveValue::UnitType::kMillimeters: + return value_ * (kMillimetersPerInch / kPointsPerInch); + case CSSPrimitiveValue::UnitType::kCentimeters: + return value_ * (kCentimetersPerInch / kPointsPerInch); + case CSSPrimitiveValue::UnitType::kInches: + return value_ / kPointsPerInch; + case CSSPrimitiveValue::UnitType::kPicas: + return value_ * (kPicasPerInch / kPointsPerInch); + default: + NOTREACHED(); + return 0; + } + case CSSPrimitiveValue::UnitType::kPicas: + switch (unit) { + case CSSPrimitiveValue::UnitType::kPixels: + return value_ * kCssPixelsPerPica; + case CSSPrimitiveValue::UnitType::kMillimeters: + return value_ * (kMillimetersPerInch / kPicasPerInch); + case CSSPrimitiveValue::UnitType::kCentimeters: + return value_ * (kCentimetersPerInch / kPicasPerInch); + case CSSPrimitiveValue::UnitType::kInches: + return value_ / kPicasPerInch; + case CSSPrimitiveValue::UnitType::kPoints: + return value_ * (kPointsPerInch / kPicasPerInch); + default: + NOTREACHED(); + return 0; + } + default: + NOTREACHED(); + return 0; + } +} + double CSSUnitValue::ConvertAngle(CSSPrimitiveValue::UnitType unit) const { switch (unit_) { case CSSPrimitiveValue::UnitType::kDegrees:
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.h b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.h index 4187bd174..ee35aea 100644 --- a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.h +++ b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.h
@@ -52,6 +52,7 @@ CSSUnitValue(double value, CSSPrimitiveValue::UnitType unit) : CSSNumericValue(), value_(value), unit_(unit) {} + double ConvertFixedLength(CSSPrimitiveValue::UnitType) const; double ConvertAngle(CSSPrimitiveValue::UnitType) const; double value_;
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp index f968a92..17ed878 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -1186,91 +1186,26 @@ column_count); } -static void CountKeywordOnlyPropertyUsage(CSSPropertyID property, - const CSSParserContext* context, - CSSValueID value_id) { - if (!context->IsUseCounterRecordingEnabled()) - return; - switch (property) { - case CSSPropertyWebkitAppearance: { - WebFeature feature; - if (value_id == CSSValueNone) { - feature = WebFeature::kCSSValueAppearanceNone; - } else { - feature = WebFeature::kCSSValueAppearanceNotNone; - if (value_id == CSSValueButton) - feature = WebFeature::kCSSValueAppearanceButton; - else if (value_id == CSSValueCaret) - feature = WebFeature::kCSSValueAppearanceCaret; - else if (value_id == CSSValueCheckbox) - feature = WebFeature::kCSSValueAppearanceCheckbox; - else if (value_id == CSSValueMenulist) - feature = WebFeature::kCSSValueAppearanceMenulist; - else if (value_id == CSSValueMenulistButton) - feature = WebFeature::kCSSValueAppearanceMenulistButton; - else if (value_id == CSSValueListbox) - feature = WebFeature::kCSSValueAppearanceListbox; - else if (value_id == CSSValueRadio) - feature = WebFeature::kCSSValueAppearanceRadio; - else if (value_id == CSSValueSearchfield) - feature = WebFeature::kCSSValueAppearanceSearchField; - else if (value_id == CSSValueTextfield) - feature = WebFeature::kCSSValueAppearanceTextField; - else - feature = WebFeature::kCSSValueAppearanceOthers; - } - context->Count(feature); - break; - } - - case CSSPropertyWebkitUserModify: { - switch (value_id) { - case CSSValueReadOnly: - context->Count(WebFeature::kCSSValueUserModifyReadOnly); - break; - case CSSValueReadWrite: - context->Count(WebFeature::kCSSValueUserModifyReadWrite); - break; - case CSSValueReadWritePlaintextOnly: - context->Count(WebFeature::kCSSValueUserModifyReadWritePlaintextOnly); - break; - default: - NOTREACHED(); - } - break; - } - - default: - break; - } -} const CSSValue* CSSPropertyParser::ParseSingleValue( CSSPropertyID unresolved_property, CSSPropertyID current_shorthand) { DCHECK(context_); - CSSPropertyID property = resolveCSSPropertyID(unresolved_property); - if (CSSParserFastPaths::IsKeywordPropertyID(property)) { - if (!CSSParserFastPaths::IsValidKeywordPropertyAndValue( - property, range_.Peek().Id(), context_->Mode())) - return nullptr; - CountKeywordOnlyPropertyUsage(property, context_, range_.Peek().Id()); - return ConsumeIdent(range_); - } // Gets the parsing method for our current property from the property API. // If it has been implemented, we call this method, otherwise we manually // parse this value in the switch statement below. As we implement APIs for // other properties, those properties will be taken out of the switch // statement. - const CSSPropertyDescriptor& css_property_desc = - CSSPropertyDescriptor::Get(property); - if (css_property_desc.parseSingleValue) { - return css_property_desc.parseSingleValue( - range_, *context_, - CSSParserLocalContext(isPropertyAlias(unresolved_property))); - } + bool needs_legacy_parsing = false; + const CSSValue* const parsed_value = + CSSPropertyParserHelpers::ParseLonghandViaAPI( + unresolved_property, current_shorthand, *context_, range_, + needs_legacy_parsing); + if (!needs_legacy_parsing) + return parsed_value; + CSSPropertyID property = resolveCSSPropertyID(unresolved_property); switch (property) { case CSSPropertyMaxWidth: case CSSPropertyMaxHeight: @@ -1308,7 +1243,6 @@ case CSSPropertyGridRowGap: return ConsumeLengthOrPercent(range_, context_->Mode(), kValueRangeNonNegative); - case CSSPropertyColor: case CSSPropertyBorderBottomColor: case CSSPropertyBorderLeftColor: case CSSPropertyBorderRightColor:
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp index 24e8241..00fc88d 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
@@ -18,7 +18,9 @@ #include "core/css/CSSVariableData.h" #include "core/css/StyleColor.h" #include "core/css/parser/CSSParserContext.h" +#include "core/css/parser/CSSParserFastPaths.h" #include "core/css/parser/CSSParserLocalContext.h" +#include "core/css/properties/CSSPropertyDescriptor.h" #include "core/css/properties/CSSPropertyTransformUtils.h" #include "core/frame/UseCounter.h" #include "platform/RuntimeEnabledFeatures.h" @@ -1493,6 +1495,144 @@ range, context, CSSParserLocalContext()); } +void CountKeywordOnlyPropertyUsage(CSSPropertyID property, + const CSSParserContext& context, + CSSValueID value_id) { + if (!context.IsUseCounterRecordingEnabled()) + return; + switch (property) { + case CSSPropertyWebkitAppearance: { + WebFeature feature; + if (value_id == CSSValueNone) { + feature = WebFeature::kCSSValueAppearanceNone; + } else { + feature = WebFeature::kCSSValueAppearanceNotNone; + if (value_id == CSSValueButton) + feature = WebFeature::kCSSValueAppearanceButton; + else if (value_id == CSSValueCaret) + feature = WebFeature::kCSSValueAppearanceCaret; + else if (value_id == CSSValueCheckbox) + feature = WebFeature::kCSSValueAppearanceCheckbox; + else if (value_id == CSSValueMenulist) + feature = WebFeature::kCSSValueAppearanceMenulist; + else if (value_id == CSSValueMenulistButton) + feature = WebFeature::kCSSValueAppearanceMenulistButton; + else if (value_id == CSSValueListbox) + feature = WebFeature::kCSSValueAppearanceListbox; + else if (value_id == CSSValueRadio) + feature = WebFeature::kCSSValueAppearanceRadio; + else if (value_id == CSSValueSearchfield) + feature = WebFeature::kCSSValueAppearanceSearchField; + else if (value_id == CSSValueTextfield) + feature = WebFeature::kCSSValueAppearanceTextField; + else + feature = WebFeature::kCSSValueAppearanceOthers; + } + context.Count(feature); + break; + } + + case CSSPropertyWebkitUserModify: { + switch (value_id) { + case CSSValueReadOnly: + context.Count(WebFeature::kCSSValueUserModifyReadOnly); + break; + case CSSValueReadWrite: + context.Count(WebFeature::kCSSValueUserModifyReadWrite); + break; + case CSSValueReadWritePlaintextOnly: + context.Count(WebFeature::kCSSValueUserModifyReadWritePlaintextOnly); + break; + default: + NOTREACHED(); + } + break; + } + + default: + break; + } +} + +const CSSValue* ParseLonghandViaAPI(CSSPropertyID unresolved_property, + CSSPropertyID current_shorthand, + const CSSParserContext& context, + CSSParserTokenRange& range, + bool& needs_legacy_parsing) { + DCHECK(!isShorthandProperty(unresolved_property)); + needs_legacy_parsing = false; + CSSPropertyID property = resolveCSSPropertyID(unresolved_property); + if (CSSParserFastPaths::IsKeywordPropertyID(property)) { + if (!CSSParserFastPaths::IsValidKeywordPropertyAndValue( + property, range.Peek().Id(), context.Mode())) + return nullptr; + CountKeywordOnlyPropertyUsage(property, context, range.Peek().Id()); + return ConsumeIdent(range); + } + + const CSSPropertyDescriptor& css_property_desc = + CSSPropertyDescriptor::Get(property); + if (css_property_desc.parseSingleValue) { + return css_property_desc.parseSingleValue( + range, context, + CSSParserLocalContext(isPropertyAlias(unresolved_property))); + } + needs_legacy_parsing = true; + return nullptr; +} + +bool ConsumeShorthandVia4LonghandsAPI( + const StylePropertyShorthand& shorthand, + bool important, + const CSSParserContext& context, + CSSParserTokenRange& range, + HeapVector<CSSProperty, 256>& properties) { + DCHECK_EQ(shorthand.length(), 4u); + const CSSPropertyID* longhands = shorthand.properties(); + bool needs_legacy_parsing = false; + const CSSValue* top = ParseLonghandViaAPI( + longhands[0], shorthand.id(), context, range, needs_legacy_parsing); + DCHECK(!needs_legacy_parsing); + + if (!top) + return false; + + const CSSValue* right = ParseLonghandViaAPI( + longhands[1], shorthand.id(), context, range, needs_legacy_parsing); + DCHECK(!needs_legacy_parsing); + + const CSSValue* bottom = nullptr; + const CSSValue* left = nullptr; + if (right) { + bottom = ParseLonghandViaAPI(longhands[2], shorthand.id(), context, range, + needs_legacy_parsing); + DCHECK(!needs_legacy_parsing); + if (bottom) { + left = ParseLonghandViaAPI(longhands[3], shorthand.id(), context, range, + needs_legacy_parsing); + DCHECK(!needs_legacy_parsing); + } + } + + if (!right) + right = top; + if (!bottom) + bottom = top; + if (!left) + left = right; + + AddProperty(longhands[0], shorthand.id(), *top, important, + IsImplicitProperty::kNotImplicit, properties); + AddProperty(longhands[1], shorthand.id(), *right, important, + IsImplicitProperty::kNotImplicit, properties); + AddProperty(longhands[2], shorthand.id(), *bottom, important, + IsImplicitProperty::kNotImplicit, properties); + AddProperty(longhands[3], shorthand.id(), *left, important, + IsImplicitProperty::kNotImplicit, properties); + + return range.AtEnd(); +} + } // namespace CSSPropertyParserHelpers } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h index ef4e81bc..a2b6a6a 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h
@@ -23,6 +23,7 @@ class CSSStringValue; class CSSURIValue; class CSSValuePair; +class StylePropertyShorthand; // When these functions are successful, they will consume all the relevant // tokens from the range and also consume any whitespace which follows. When @@ -120,6 +121,22 @@ IsImplicitProperty, HeapVector<CSSProperty, 256>& properties); +void CountKeywordOnlyPropertyUsage(CSSPropertyID, + const CSSParserContext&, + CSSValueID); + +const CSSValue* ParseLonghandViaAPI(CSSPropertyID unresolved_property, + CSSPropertyID current_shorthand, + const CSSParserContext&, + CSSParserTokenRange&, + bool& needs_legacy_parsing); + +bool ConsumeShorthandVia4LonghandsAPI(const StylePropertyShorthand&, + bool important, + const CSSParserContext&, + CSSParserTokenRange&, + HeapVector<CSSProperty, 256>& properties); + // Template implementations are at the bottom of the file for readability. template <typename... emptyBaseCase>
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIBackgroundColor.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIBackgroundColor.cpp deleted file mode 100644 index 6254c51..0000000 --- a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIBackgroundColor.cpp +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2017 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 "core/css/properties/CSSPropertyAPIBackgroundColor.h" - -#include "core/css/parser/CSSParserContext.h" -#include "core/css/parser/CSSParserMode.h" -#include "core/css/parser/CSSPropertyParserHelpers.h" - -namespace blink { - -const CSSValue* CSSPropertyAPIBackgroundColor::parseSingleValue( - CSSParserTokenRange& range, - const CSSParserContext& context, - const CSSParserLocalContext&) { - return CSSPropertyParserHelpers::ConsumeColor( - range, context.Mode(), IsQuirksModeBehavior(context.Mode())); -} - -} // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColor.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColor.cpp index f4e299cf..a234938b 100644 --- a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColor.cpp +++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColor.cpp
@@ -5,16 +5,17 @@ #include "core/css/properties/CSSPropertyAPIColor.h" #include "core/css/parser/CSSParserContext.h" +#include "core/css/parser/CSSParserMode.h" #include "core/css/parser/CSSPropertyParserHelpers.h" -class CSSParserLocalContext; namespace blink { const CSSValue* CSSPropertyAPIColor::parseSingleValue( CSSParserTokenRange& range, const CSSParserContext& context, const CSSParserLocalContext&) { - return CSSPropertyParserHelpers::ConsumeColor(range, context.Mode()); + return CSSPropertyParserHelpers::ConsumeColor( + range, context.Mode(), IsQuirksModeBehavior(context.Mode())); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColorNoQuirks.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColorNoQuirks.cpp new file mode 100644 index 0000000..42662bc --- /dev/null +++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColorNoQuirks.cpp
@@ -0,0 +1,20 @@ +// Copyright 2017 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 "core/css/properties/CSSPropertyAPIColorNoQuirks.h" + +#include "core/css/parser/CSSParserContext.h" +#include "core/css/parser/CSSPropertyParserHelpers.h" + +class CSSParserLocalContext; +namespace blink { + +const CSSValue* CSSPropertyAPIColorNoQuirks::parseSingleValue( + CSSParserTokenRange& range, + const CSSParserContext& context, + const CSSParserLocalContext&) { + return CSSPropertyParserHelpers::ConsumeColor(range, context.Mode()); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp b/third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp index 39ebbfa..34a8c234 100644 --- a/third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp +++ b/third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp
@@ -210,6 +210,8 @@ } bool ClassicPendingScript::WasCanceled() const { + if (!GetResource()) + return false; return GetResource()->WasCanceled(); }
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp index 24d6081..8295d60 100644 --- a/third_party/WebKit/Source/core/dom/Document.cpp +++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -254,12 +254,12 @@ #include "platform/wtf/text/CharacterNames.h" #include "platform/wtf/text/StringBuffer.h" #include "platform/wtf/text/TextEncodingRegistry.h" -#include "public/platform/InterfaceProvider.h" #include "public/platform/Platform.h" #include "public/platform/WebAddressSpace.h" #include "public/platform/WebPrerenderingSupport.h" #include "public/platform/modules/sensitive_input_visibility/sensitive_input_visibility_service.mojom-blink.h" #include "public/platform/site_engagement.mojom-blink.h" +#include "services/service_manager/public/cpp/interface_provider.h" #include <memory> @@ -4718,7 +4718,7 @@ return; mojom::blink::SensitiveInputVisibilityServicePtr sensitive_input_service_ptr; - GetFrame()->GetInterfaceProvider()->GetInterface( + GetFrame()->GetInterfaceProvider().GetInterface( mojo::MakeRequest(&sensitive_input_service_ptr)); if (password_count_ > 0) { sensitive_input_service_ptr->PasswordFieldVisibleInInsecureContext();
diff --git a/third_party/WebKit/Source/core/dom/ElementVisibilityObserverTest.cpp b/third_party/WebKit/Source/core/dom/ElementVisibilityObserverTest.cpp index 4abca33..8785685 100644 --- a/third_party/WebKit/Source/core/dom/ElementVisibilityObserverTest.cpp +++ b/third_party/WebKit/Source/core/dom/ElementVisibilityObserverTest.cpp
@@ -41,8 +41,8 @@ protected: void SetUp() override { local_frame_client_ = new StubLocalFrameClient(); - dummy_page_holder_ = DummyPageHolder::Create( - IntSize(), nullptr, local_frame_client_, nullptr, nullptr); + dummy_page_holder_ = DummyPageHolder::Create(IntSize(), nullptr, + local_frame_client_, nullptr); } void TearDown() override {
diff --git a/third_party/WebKit/Source/core/dom/README.md b/third_party/WebKit/Source/core/dom/README.md index a9b8175..b627458 100644 --- a/third_party/WebKit/Source/core/dom/README.md +++ b/third_party/WebKit/Source/core/dom/README.md
@@ -136,7 +136,7 @@ - PseudoElementData - VisitedLinkState (HTMLLinkElement) -## fullscreen (-> core/fullscreen or core/html) +## [Fullscreen](https://fullscreen.spec.whatwg.org/) (-> core/fullscreen) - DocumentFullscreen - ElementFullscreen
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp index b947258..82d5fa7d 100644 --- a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp +++ b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
@@ -676,22 +676,8 @@ ? element_document.Url() : KURL(); - switch (ExecuteScript(ClassicScript::Create( - ScriptSourceCode(element_->TextFromChildren(), script_url, position)))) { - case ExecuteScriptResult::kShouldFireLoadEvent: - // The load event is not fired because this is an inline script. - return true; - - case ExecuteScriptResult::kShouldFireErrorEvent: - DispatchErrorEvent(); - return false; - - case ExecuteScriptResult::kShouldFireNone: - return true; - } - - NOTREACHED(); - return false; + return ExecuteScriptBlock(ClassicPendingScript::Create(element_, position), + script_url); } bool ScriptLoader::FetchClassicScript( @@ -910,31 +896,58 @@ DCHECK(!will_be_parser_executed_); DCHECK(async_exec_type_ != ScriptRunner::kNone); DCHECK(pending_script_->IsExternalOrModule()); - DCHECK_EQ(pending_script_->IsExternal(), is_external_script_); - bool error_occurred = false; - Script* script = pending_script_->GetSource(NullURL(), error_occurred); - const bool wasCanceled = pending_script_->WasCanceled(); - const bool is_external = pending_script_->IsExternal(); - DetachPendingScript(); - if (error_occurred) { - DispatchErrorEvent(); - } else if (!wasCanceled) { - switch (ExecuteScript(script)) { - case ExecuteScriptResult::kShouldFireLoadEvent: - if (is_external) - DispatchLoadEvent(); - break; - case ExecuteScriptResult::kShouldFireErrorEvent: - DispatchErrorEvent(); - break; - case ExecuteScriptResult::kShouldFireNone: - break; - } - } + PendingScript* pending_script = pending_script_; + pending_script_ = nullptr; + ExecuteScriptBlock(pending_script, NullURL()); resource_ = nullptr; module_tree_client_ = nullptr; } +// https://html.spec.whatwg.org/#execute-the-script-block +bool ScriptLoader::ExecuteScriptBlock(PendingScript* pending_script, + const KURL& document_url) { + DCHECK(pending_script); + DCHECK_EQ(pending_script->IsExternal(), is_external_script_); + + bool error_occurred = false; + Script* script = pending_script->GetSource(document_url, error_occurred); + const bool was_canceled = pending_script->WasCanceled(); + const bool is_external = pending_script->IsExternal(); + pending_script->Dispose(); + + // 2. "If the script's script is null, fire an event named error at the + // element, and abort these steps." + if (error_occurred) { + DispatchErrorEvent(); + return false; + } + + if (was_canceled) + return false; + + // Steps 3--7 are in ExecuteScript(). + switch (ExecuteScript(script)) { + case ExecuteScriptResult::kShouldFireLoadEvent: + // 8. "If the script is from an external file, then fire an event named + // load at the script element." + if (is_external) + DispatchLoadEvent(); + return true; + + case ExecuteScriptResult::kShouldFireErrorEvent: + // Consider as if "the script's script is null" retrospectively, + // due to CSP check failures etc., which are considered as load failure. + DispatchErrorEvent(); + return false; + + case ExecuteScriptResult::kShouldFireNone: + return true; + } + + NOTREACHED(); + return false; +} + void ScriptLoader::PendingScriptFinished(PendingScript* pending_script) { DCHECK(!will_be_parser_executed_); DCHECK_EQ(pending_script_, pending_script);
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.h b/third_party/WebKit/Source/core/dom/ScriptLoader.h index a3171bc..678a63f 100644 --- a/third_party/WebKit/Source/core/dom/ScriptLoader.h +++ b/third_party/WebKit/Source/core/dom/ScriptLoader.h
@@ -81,6 +81,16 @@ TextPosition::MinimumPosition(), LegacyTypeSupport = kDisallowLegacyTypeInTypeAttribute); + // https://html.spec.whatwg.org/#execute-the-script-block + // The single entry point of script execution. + // PendingScript::Dispose() is called in ExecuteScriptBlock(). + // + // TODO(hiroshige): Replace ExecuteScript() calls with ExecuteScriptBlock(). + // + // TODO(hiroshige): Currently this returns bool (true if success) only to + // preserve existing code structure around PrepareScript(). Clean up this. + bool ExecuteScriptBlock(PendingScript*, const KURL&); + // Creates a PendingScript for external script whose fetch is started in // FetchClassicScript()/FetchModuleScriptTree(). PendingScript* CreatePendingScript(); @@ -91,6 +101,8 @@ kShouldFireNone }; WARN_UNUSED_RESULT ExecuteScriptResult ExecuteScript(const Script*); + + // The entry point only for ScriptRunner that wraps ExecuteScriptBlock(). virtual void Execute(); // XML parser calls these
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp index a80dfd1..be6bbd7 100644 --- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp +++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
@@ -947,10 +947,23 @@ return LayoutRect(layout_selection_->SelectionBounds()); } -static IntRect AbsoluteSelectionBoundsOf( - const VisibleSelectionInFlatTree& selection) { - return ComputeTextRect( - EphemeralRangeInFlatTree(selection.Start(), selection.End())); +IntRect FrameSelection::ComputeRectToScroll( + RevealExtentOption reveal_extent_option) { + const VisibleSelection& selection = ComputeVisibleSelectionInDOMTree(); + LayoutRect rect; + switch (selection.GetSelectionType()) { + case kCaretSelection: + return AbsoluteCaretBounds(); + case kRangeSelection: { + if (reveal_extent_option == kRevealExtent) + return AbsoluteCaretBoundsOf(CreateVisiblePosition(selection.Extent())); + layout_selection_->SetHasPendingSelection(); + return layout_selection_->SelectionBounds(); + } + default: + NOTREACHED(); + return {}; + } } // TODO(editing-dev): This should be done in FlatTree world. @@ -967,23 +980,6 @@ if (selection.GetSelectionType() == kNoSelection) return; - LayoutRect rect; - switch (selection.GetSelectionType()) { - case kCaretSelection: - rect = LayoutRect(AbsoluteCaretBounds()); - break; - case kRangeSelection: { - rect = LayoutRect( - reveal_extent_option == kRevealExtent - ? AbsoluteCaretBoundsOf(CreateVisiblePosition(selection.Extent())) - : AbsoluteSelectionBoundsOf(ComputeVisibleSelectionInFlatTree())); - break; - } - default: - NOTREACHED(); - break; - } - // FIXME: This code only handles scrolling the startContainer's layer, but // the selection rect could intersect more than just that. if (DocumentLoader* document_loader = frame_->Loader().GetDocumentLoader()) @@ -992,7 +988,8 @@ DCHECK(start.AnchorNode()); DCHECK(start.AnchorNode()->GetLayoutObject()); if (!start.AnchorNode()->GetLayoutObject()->ScrollRectToVisible( - rect, alignment, alignment)) + LayoutRect(ComputeRectToScroll(reveal_extent_option)), alignment, + alignment)) return; UpdateAppearance();
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.h b/third_party/WebKit/Source/core/editing/FrameSelection.h index cccc742e..2dcf720 100644 --- a/third_party/WebKit/Source/core/editing/FrameSelection.h +++ b/third_party/WebKit/Source/core/editing/FrameSelection.h
@@ -280,6 +280,8 @@ GranularityStrategy* GetGranularityStrategy(); + IntRect ComputeRectToScroll(RevealExtentOption); + // Implementation of |SynchronousMutationObserver| member functions. void ContextDestroyed(Document*) final; void NodeChildrenWillBeRemoved(ContainerNode&) final;
diff --git a/third_party/WebKit/Source/core/editing/LayoutSelection.cpp b/third_party/WebKit/Source/core/editing/LayoutSelection.cpp index bde815039..7585134d 100644 --- a/third_party/WebKit/Source/core/editing/LayoutSelection.cpp +++ b/third_party/WebKit/Source/core/editing/LayoutSelection.cpp
@@ -322,6 +322,8 @@ DCHECK(start_layout_object); DCHECK(end_layout_object); DCHECK(start_layout_object->View() == end_layout_object->View()); + if (!start_layout_object || !end_layout_object) + return SelectionPaintRange(); return SelectionPaintRange(start_layout_object, start_pos.ComputeEditingOffset(),
diff --git a/third_party/WebKit/Source/core/editing/SelectionModifier.cpp b/third_party/WebKit/Source/core/editing/SelectionModifier.cpp index 36b7d35..dbb85e8 100644 --- a/third_party/WebKit/Source/core/editing/SelectionModifier.cpp +++ b/third_party/WebKit/Source/core/editing/SelectionModifier.cpp
@@ -179,7 +179,7 @@ } static VisiblePosition AdjustForwardPositionForUserSelectAll( - VisiblePosition& position) { + const VisiblePosition& position) { Node* const root_user_select_all = EditingStrategy::RootUserSelectAllForNode( position.DeepEquivalent().AnchorNode()); if (!root_user_select_all) @@ -189,7 +189,7 @@ } static VisiblePosition AdjustBackwardPositionForUserSelectAll( - VisiblePosition& position) { + const VisiblePosition& position) { Node* const root_user_select_all = EditingStrategy::RootUserSelectAllForNode( position.DeepEquivalent().AnchorNode()); if (!root_user_select_all) @@ -258,12 +258,13 @@ pos = NextSentencePosition(pos); break; case kLineGranularity: - pos = NextLinePosition( - pos, LineDirectionPointForBlockDirectionNavigation(EXTENT)); + pos = NextLinePosition(pos, LineDirectionPointForBlockDirectionNavigation( + selection_.Extent())); break; case kParagraphGranularity: pos = NextParagraphPosition( - pos, LineDirectionPointForBlockDirectionNavigation(EXTENT)); + pos, + LineDirectionPointForBlockDirectionNavigation(selection_.Extent())); break; case kSentenceBoundary: pos = EndOfSentence(EndForPlatform()); @@ -348,15 +349,17 @@ // needs to leave the selection at that line start (no need to call // nextLinePosition!) pos = EndForPlatform(); - if (!selection_.IsRange() || !IsStartOfLine(pos)) + if (!selection_.IsRange() || !IsStartOfLine(pos)) { pos = NextLinePosition( - pos, LineDirectionPointForBlockDirectionNavigation(START)); + pos, + LineDirectionPointForBlockDirectionNavigation(selection_.Start())); + } break; } case kParagraphGranularity: pos = NextParagraphPosition( EndForPlatform(), - LineDirectionPointForBlockDirectionNavigation(START)); + LineDirectionPointForBlockDirectionNavigation(selection_.Start())); break; case kSentenceBoundary: pos = EndOfSentence(EndForPlatform()); @@ -443,11 +446,13 @@ break; case kLineGranularity: pos = PreviousLinePosition( - pos, LineDirectionPointForBlockDirectionNavigation(EXTENT)); + pos, + LineDirectionPointForBlockDirectionNavigation(selection_.Extent())); break; case kParagraphGranularity: pos = PreviousParagraphPosition( - pos, LineDirectionPointForBlockDirectionNavigation(EXTENT)); + pos, + LineDirectionPointForBlockDirectionNavigation(selection_.Extent())); break; case kSentenceBoundary: pos = StartOfSentence(StartForPlatform()); @@ -529,12 +534,12 @@ case kLineGranularity: pos = PreviousLinePosition( StartForPlatform(), - LineDirectionPointForBlockDirectionNavigation(START)); + LineDirectionPointForBlockDirectionNavigation(selection_.Start())); break; case kParagraphGranularity: pos = PreviousParagraphPosition( StartForPlatform(), - LineDirectionPointForBlockDirectionNavigation(START)); + LineDirectionPointForBlockDirectionNavigation(selection_.Start())); break; case kSentenceBoundary: pos = StartOfSentence(StartForPlatform()); @@ -617,7 +622,8 @@ // Note: the START position type is arbitrary because it is unused, it would // be the requested position type if there were no // xPosForVerticalArrowNavigation set. - LayoutUnit x = LineDirectionPointForBlockDirectionNavigation(START); + LayoutUnit x = + LineDirectionPointForBlockDirectionNavigation(selection_.Start()); switch (alter) { case FrameSelection::kAlterationMove: @@ -737,11 +743,13 @@ : selection_.End(), selection_.Affinity()); x_pos = LineDirectionPointForBlockDirectionNavigation( - direction == FrameSelection::kDirectionUp ? START : END); + direction == FrameSelection::kDirectionUp ? selection_.Start() + : selection_.End()); break; case FrameSelection::kAlterationExtend: pos = CreateVisiblePosition(selection_.Extent(), selection_.Affinity()); - x_pos = LineDirectionPointForBlockDirectionNavigation(EXTENT); + x_pos = + LineDirectionPointForBlockDirectionNavigation(selection_.Extent()); break; } @@ -830,28 +838,12 @@ } LayoutUnit SelectionModifier::LineDirectionPointForBlockDirectionNavigation( - EPositionType type) { + const Position& pos) { LayoutUnit x; if (selection_.IsNone()) return x; - Position pos; - switch (type) { - case START: - pos = selection_.Start(); - break; - case END: - pos = selection_.End(); - break; - case BASE: - pos = selection_.Base(); - break; - case EXTENT: - pos = selection_.Extent(); - break; - } - LocalFrame* frame = pos.GetDocument()->GetFrame(); if (!frame) return x;
diff --git a/third_party/WebKit/Source/core/editing/SelectionModifier.h b/third_party/WebKit/Source/core/editing/SelectionModifier.h index 50a0b1d..6d7b336 100644 --- a/third_party/WebKit/Source/core/editing/SelectionModifier.h +++ b/third_party/WebKit/Source/core/editing/SelectionModifier.h
@@ -58,11 +58,6 @@ VerticalDirection); private: - // TODO(yosin): We should move |EPositionType| to "SelectionModifier.cpp", - // it is only used for implementing |modify()|. - // TODO(yosin) We should use capitalized name for |EPositionType|. - enum EPositionType { START, END, BASE, EXTENT }; // NOLINT - LocalFrame* GetFrame() const { return frame_; } static bool ShouldAlwaysUseDirectionalSelection(LocalFrame*); @@ -71,7 +66,7 @@ VisiblePosition PositionForPlatform(bool is_get_start) const; VisiblePosition StartForPlatform() const; VisiblePosition EndForPlatform() const; - LayoutUnit LineDirectionPointForBlockDirectionNavigation(EPositionType); + LayoutUnit LineDirectionPointForBlockDirectionNavigation(const Position&); VisiblePosition ModifyExtendingRight(TextGranularity); VisiblePosition ModifyExtendingForward(TextGranularity); VisiblePosition ModifyMovingRight(TextGranularity);
diff --git a/third_party/WebKit/Source/core/editing/VisibleSelection.cpp b/third_party/WebKit/Source/core/editing/VisibleSelection.cpp index 1c71047e9..d7f32ba 100644 --- a/third_party/WebKit/Source/core/editing/VisibleSelection.cpp +++ b/third_party/WebKit/Source/core/editing/VisibleSelection.cpp
@@ -478,19 +478,20 @@ AdjustSelectionToAvoidCrossingEditingBoundaries(); UpdateSelectionType(); - if (GetSelectionType() == kRangeSelection) { - // "Constrain" the selection to be the smallest equivalent range of - // nodes. This is a somewhat arbitrary choice, but experience shows that - // it is useful to make to make the selection "canonical" (if only for - // purposes of comparing selections). This is an ideal point of the code - // to do this operation, since all selection changes that result in a - // RANGE come through here before anyone uses it. - // TODO(yosin) Canonicalizing is good, but haven't we already done it - // (when we set these two positions to |VisiblePosition| - // |deepEquivalent()|s above)? - start_ = MostForwardCaretPosition(start_); - end_ = MostBackwardCaretPosition(end_); - } + if (GetSelectionType() != kRangeSelection) + return; + + // "Constrain" the selection to be the smallest equivalent range of + // nodes. This is a somewhat arbitrary choice, but experience shows that + // it is useful to make to make the selection "canonical" (if only for + // purposes of comparing selections). This is an ideal point of the code + // to do this operation, since all selection changes that result in a + // RANGE come through here before anyone uses it. + // TODO(yosin) Canonicalizing is good, but haven't we already done it + // (when we set these two positions to |VisiblePosition| + // |deepEquivalent()|s above)? + start_ = MostForwardCaretPosition(start_); + end_ = MostBackwardCaretPosition(end_); } template <typename Strategy>
diff --git a/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp b/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp index c9e5b882..2132da9 100644 --- a/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp +++ b/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp
@@ -219,6 +219,24 @@ EXPECT_EQ(PositionInFlatTree(five, 5), selection_in_flat_tree.End()); } +// For http://wkb.ug/32622 +TEST_F(VisibleSelectionTest, ExpandUsingGranularityWithEmptyCell) { + SetBodyContent( + "<div contentEditable><table cellspacing=0><tr>" + "<td id='first' width='50' height='25pt'></td>" + "<td id='second' width='50' height='25pt'></td>" + "</tr></table></div>"); + Element* const first = GetDocument().getElementById("first"); + const VisibleSelectionInFlatTree& selection = + CreateVisibleSelectionWithGranularity( + SelectionInFlatTree::Builder() + .Collapse(PositionInFlatTree(first, 0)) + .Build(), + kWordGranularity); + EXPECT_EQ(PositionInFlatTree(first, 0), selection.Start()); + EXPECT_EQ(PositionInFlatTree(first, 0), selection.End()); +} + TEST_F(VisibleSelectionTest, Initialisation) { SetBodyContent(LOREM_IPSUM);
diff --git a/third_party/WebKit/Source/core/editing/VisibleUnitsLine.cpp b/third_party/WebKit/Source/core/editing/VisibleUnitsLine.cpp index 9ed1faa..0c90856 100644 --- a/third_party/WebKit/Source/core/editing/VisibleUnitsLine.cpp +++ b/third_party/WebKit/Source/core/editing/VisibleUnitsLine.cpp
@@ -140,9 +140,10 @@ return nullptr; } -Node* PreviousLeafWithSameEditability(Node* node, EditableType editable_type) { - const bool editable = HasEditableStyle(*node, editable_type); - for (Node* runner = PreviousAtomicLeafNode(*node); runner; +Node* PreviousLeafWithSameEditability(const Node& node, + EditableType editable_type) { + const bool editable = HasEditableStyle(node, editable_type); + for (Node* runner = PreviousAtomicLeafNode(node); runner; runner = PreviousAtomicLeafNode(*runner)) { if (editable == HasEditableStyle(*runner, editable_type)) return runner; @@ -270,12 +271,10 @@ Node* FindNodeInPreviousLine(const Node& start_node, const VisiblePosition& visible_position, EditableType editable_type) { - // TODO(editing-dev): We should make |PreviousLeafWithSameEditability()| to - // take |const Node&|. - for (Node* runner = PreviousLeafWithSameEditability( - const_cast<Node*>(&start_node), editable_type); + for (Node* runner = + PreviousLeafWithSameEditability(start_node, editable_type); runner; - runner = PreviousLeafWithSameEditability(runner, editable_type)) { + runner = PreviousLeafWithSameEditability(*runner, editable_type)) { if (!InSameLine(*runner, visible_position)) return runner; } @@ -295,7 +294,7 @@ Node* const previous_node = FindNodeInPreviousLine(*node, visible_position, editable_type); for (Node* runner = previous_node; runner && !runner->IsShadowRoot(); - runner = PreviousLeafWithSameEditability(runner, editable_type)) { + runner = PreviousLeafWithSameEditability(*runner, editable_type)) { if (HighestEditableRootOfNode(*runner, editable_type) != highest_root) break;
diff --git a/third_party/WebKit/Source/core/events/EventTargetFactory.json5 b/third_party/WebKit/Source/core/events/EventTargetFactory.json5 index b9dcfb58..fe22a3cc 100644 --- a/third_party/WebKit/Source/core/events/EventTargetFactory.json5 +++ b/third_party/WebKit/Source/core/events/EventTargetFactory.json5
@@ -6,6 +6,7 @@ data: [ "core/animation/AnimationPlayer", + "core/clipboard/Clipboard", "core/css/FontFaceSet", "core/css/MediaQueryList", "core/dom/BroadcastChannel",
diff --git a/third_party/WebKit/Source/core/exported/WebDataSourceImpl.cpp b/third_party/WebKit/Source/core/exported/WebDataSourceImpl.cpp index d2db829..0fee7de 100644 --- a/third_party/WebKit/Source/core/exported/WebDataSourceImpl.cpp +++ b/third_party/WebKit/Source/core/exported/WebDataSourceImpl.cpp
@@ -32,6 +32,7 @@ #include <memory> #include "core/dom/Document.h" +#include "core/frame/LocalFrame.h" #include "core/loader/SubresourceFilter.h" #include "platform/wtf/PtrUtil.h" #include "public/platform/WebDocumentSubresourceFilter.h" @@ -159,8 +160,8 @@ void WebDataSourceImpl::SetSubresourceFilter( WebDocumentSubresourceFilter* subresource_filter) { - DocumentLoader::SetSubresourceFilter( - SubresourceFilter::Create(this, WTF::WrapUnique(subresource_filter))); + DocumentLoader::SetSubresourceFilter(SubresourceFilter::Create( + *GetFrame()->GetDocument(), WTF::WrapUnique(subresource_filter))); } void WebDataSourceImpl::SetServiceWorkerNetworkProvider(
diff --git a/third_party/WebKit/Source/core/exported/WebFactory.h b/third_party/WebKit/Source/core/exported/WebFactory.h index 448bfa2..07e6208a 100644 --- a/third_party/WebKit/Source/core/exported/WebFactory.h +++ b/third_party/WebKit/Source/core/exported/WebFactory.h
@@ -17,7 +17,6 @@ class WebLocalFrameBase; class WebViewClient; class WebFrameClient; -class InterfaceProvider; class InterfaceRegistry; class WebFrame; enum class WebTreeScopeType; @@ -35,12 +34,10 @@ virtual WebLocalFrameBase* CreateMainWebLocalFrameBase( WebView*, WebFrameClient*, - InterfaceProvider*, InterfaceRegistry*) const = 0; virtual WebLocalFrameBase* CreateWebLocalFrameBase( WebTreeScopeType, WebFrameClient*, - InterfaceProvider*, InterfaceRegistry*, WebFrame* opener) const = 0;
diff --git a/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.cpp b/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.cpp index 6c10fbd..4cc9915 100644 --- a/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.cpp +++ b/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.cpp
@@ -150,14 +150,13 @@ const WebString& name, WebSandboxFlags sandbox_flags, WebFrameClient* client, - blink::InterfaceProvider* interface_provider, blink::InterfaceRegistry* interface_registry, WebFrame* previous_sibling, const WebParsedFeaturePolicy& container_policy, const WebFrameOwnerProperties& frame_owner_properties, WebFrame* opener) { WebLocalFrameBase* child = WebFactory::GetInstance().CreateWebLocalFrameBase( - scope, client, interface_provider, interface_registry, opener); + scope, client, interface_registry, opener); InsertAfter(child, previous_sibling); RemoteFrameOwner* owner = RemoteFrameOwner::Create(static_cast<SandboxFlags>(sandbox_flags),
diff --git a/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.h b/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.h index a3b0466..dfda3013 100644 --- a/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.h +++ b/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.h
@@ -47,7 +47,6 @@ const WebString& name, WebSandboxFlags, WebFrameClient*, - blink::InterfaceProvider*, blink::InterfaceRegistry*, WebFrame* previous_sibling, const WebParsedFeaturePolicy&,
diff --git a/third_party/WebKit/Source/core/exported/WebSharedWorkerImpl.cpp b/third_party/WebKit/Source/core/exported/WebSharedWorkerImpl.cpp index 066bca9..eaadbaa2 100644 --- a/third_party/WebKit/Source/core/exported/WebSharedWorkerImpl.cpp +++ b/third_party/WebKit/Source/core/exported/WebSharedWorkerImpl.cpp
@@ -63,7 +63,6 @@ #include "platform/weborigin/SecurityOrigin.h" #include "platform/wtf/Functional.h" #include "platform/wtf/PtrUtil.h" -#include "public/platform/Platform.h" #include "public/platform/WebContentSettingsClient.h" #include "public/platform/WebMessagePortChannel.h" #include "public/platform/WebString.h" @@ -140,7 +139,7 @@ // Browser process when the worker is created (similar to // RenderThread::OnCreateNewView). main_frame_ = WebFactory::GetInstance().CreateMainWebLocalFrameBase( - web_view_, this, Platform::Current()->GetInterfaceProvider(), nullptr); + web_view_, this, nullptr); main_frame_->SetDevToolsAgentClient(this); // If we were asked to pause worker context on start and wait for debugger
diff --git a/third_party/WebKit/Source/core/frame/BUILD.gn b/third_party/WebKit/Source/core/frame/BUILD.gn index 4c1d4d7b..71ba42e 100644 --- a/third_party/WebKit/Source/core/frame/BUILD.gn +++ b/third_party/WebKit/Source/core/frame/BUILD.gn
@@ -68,6 +68,8 @@ "Location.h", "Navigator.cpp", "Navigator.h", + "NavigatorClipboard.cpp", + "NavigatorClipboard.h", "NavigatorConcurrentHardware.cpp", "NavigatorConcurrentHardware.h", "NavigatorID.cpp",
diff --git a/third_party/WebKit/Source/core/frame/FrameTestHelpers.cpp b/third_party/WebKit/Source/core/frame/FrameTestHelpers.cpp index c4f6b68..ca3c3783 100644 --- a/third_party/WebKit/Source/core/frame/FrameTestHelpers.cpp +++ b/third_party/WebKit/Source/core/frame/FrameTestHelpers.cpp
@@ -151,8 +151,8 @@ WebTreeScopeType scope, TestWebFrameClient* client) { auto owned_client = CreateDefaultClientIfNeeded(client); - WebLocalFrameBase* frame = ToWebLocalFrameBase(parent.CreateLocalChild( - scope, client, client->GetInterfaceProviderForTesting(), nullptr)); + WebLocalFrameBase* frame = + ToWebLocalFrameBase(parent.CreateLocalChild(scope, client, nullptr)); client->Bind(frame, std::move(owned_client)); return frame; } @@ -163,8 +163,8 @@ std::unique_ptr<TestWebFrameClient> self_owned) { DCHECK(self_owned); TestWebFrameClient* client = self_owned.get(); - WebLocalFrameBase* frame = ToWebLocalFrameBase(parent.CreateLocalChild( - scope, client, self_owned->GetInterfaceProviderForTesting(), nullptr)); + WebLocalFrameBase* frame = + ToWebLocalFrameBase(parent.CreateLocalChild(scope, client, nullptr)); client->Bind(frame, std::move(self_owned)); return frame; } @@ -174,8 +174,8 @@ auto owned_client = CreateDefaultClientIfNeeded(client); WebLocalFrameBase* frame = ToWebLocalFrameBase(WebLocalFrame::CreateProvisional( - client, client->GetInterfaceProviderForTesting(), nullptr, &old_frame, - WebSandboxFlags::kNone, WebParsedFeaturePolicy())); + client, nullptr, &old_frame, WebSandboxFlags::kNone, + WebParsedFeaturePolicy())); client->Bind(frame, std::move(owned_client)); // Create a local root, if necessary. std::unique_ptr<TestWebWidgetClient> owned_widget_client; @@ -210,8 +210,8 @@ auto owned_client = CreateDefaultClientIfNeeded(client); auto* frame = ToWebLocalFrameBase(parent.CreateLocalChild( WebTreeScopeType::kDocument, name, WebSandboxFlags::kNone, client, - client->GetInterfaceProviderForTesting(), nullptr, previous_sibling, - WebParsedFeaturePolicy(), properties, nullptr)); + nullptr, previous_sibling, WebParsedFeaturePolicy(), properties, + nullptr)); client->Bind(frame, std::move(owned_client)); auto owned_widget_client = CreateDefaultClientIfNeeded(widget_client); @@ -256,8 +256,7 @@ auto owned_web_frame_client = CreateDefaultClientIfNeeded(web_frame_client); WebLocalFrame* frame = WebLocalFrame::CreateMainFrame( - web_view_, web_frame_client, - web_frame_client->GetInterfaceProviderForTesting(), nullptr, opener); + web_view_, web_frame_client, nullptr, opener); web_frame_client->Bind(frame, std::move(owned_web_frame_client)); // TODO(dcheng): The main frame widget currently has a special case. @@ -362,7 +361,8 @@ int TestWebFrameClient::loads_in_progress_ = 0; -TestWebFrameClient::TestWebFrameClient() {} +TestWebFrameClient::TestWebFrameClient() + : interface_provider_(new service_manager::InterfaceProvider()) {} void TestWebFrameClient::Bind(WebLocalFrame* frame, std::unique_ptr<TestWebFrameClient> self_owned) {
diff --git a/third_party/WebKit/Source/core/frame/FrameTestHelpers.h b/third_party/WebKit/Source/core/frame/FrameTestHelpers.h index cfd52ced8..f9c1e9a 100644 --- a/third_party/WebKit/Source/core/frame/FrameTestHelpers.h +++ b/third_party/WebKit/Source/core/frame/FrameTestHelpers.h
@@ -51,6 +51,7 @@ #include "public/web/WebRemoteFrameClient.h" #include "public/web/WebSettings.h" #include "public/web/WebViewClient.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace blink { @@ -308,9 +309,8 @@ static bool IsLoading() { return loads_in_progress_ > 0; } - // Tests can override the virtual method below to mock the interface provider. - virtual blink::InterfaceProvider* GetInterfaceProviderForTesting() { - return nullptr; + service_manager::InterfaceProvider* GetInterfaceProvider() override { + return interface_provider_.get(); } std::unique_ptr<blink::WebURLLoader> CreateURLLoader( @@ -326,6 +326,10 @@ // If set to a non-null value, self-deletes on frame detach. std::unique_ptr<TestWebFrameClient> self_owned_; + // Use service_manager::InterfaceProvider::TestApi to provide test interfaces + // through this client. + std::unique_ptr<service_manager::InterfaceProvider> interface_provider_; + // This is null from when the client is created until it is initialized with // Bind(). WebLocalFrame* frame_ = nullptr;
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.cpp b/third_party/WebKit/Source/core/frame/LocalFrame.cpp index 390f313..470ef9e 100644 --- a/third_party/WebKit/Source/core/frame/LocalFrame.cpp +++ b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
@@ -131,12 +131,9 @@ LocalFrame* LocalFrame::Create(LocalFrameClient* client, Page& page, FrameOwner* owner, - InterfaceProvider* interface_provider, InterfaceRegistry* interface_registry) { LocalFrame* frame = new LocalFrame( client, page, owner, - interface_provider ? interface_provider - : InterfaceProvider::GetEmptyInterfaceProvider(), interface_registry ? interface_registry : InterfaceRegistry::GetEmptyInterfaceRegistry()); probe::frameAttachedToParent(frame); @@ -745,7 +742,6 @@ inline LocalFrame::LocalFrame(LocalFrameClient* client, Page& page, FrameOwner* owner, - InterfaceProvider* interface_provider, InterfaceRegistry* interface_registry) : Frame(client, page, owner, LocalWindowProxyManager::Create(*this)), frame_scheduler_(page.GetChromeClient().CreateFrameScheduler( @@ -765,11 +761,10 @@ page_zoom_factor_(ParentPageZoomFactor(this)), text_zoom_factor_(ParentTextZoomFactor(this)), in_view_source_mode_(false), - interface_provider_(interface_provider), interface_registry_(interface_registry) { if (FrameResourceCoordinator::IsEnabled()) { frame_resource_coordinator_ = - FrameResourceCoordinator::Create(interface_provider); + FrameResourceCoordinator::Create(client->GetInterfaceProvider()); } if (IsLocalRoot()) { probe_sink_ = new CoreProbeSink(); @@ -1001,6 +996,11 @@ return false; } +service_manager::InterfaceProvider& LocalFrame::GetInterfaceProvider() { + DCHECK(Client()); + return *Client()->GetInterfaceProvider(); +} + LocalFrameClient* LocalFrame::Client() const { return static_cast<LocalFrameClient*>(Frame::Client()); }
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.h b/third_party/WebKit/Source/core/frame/LocalFrame.h index 76a9adbf..7903d86 100644 --- a/third_party/WebKit/Source/core/frame/LocalFrame.h +++ b/third_party/WebKit/Source/core/frame/LocalFrame.h
@@ -43,6 +43,10 @@ #include "platform/scroll/ScrollTypes.h" #include "platform/wtf/HashSet.h" +namespace service_manager { +class InterfaceProvider; +} + namespace blink { class Color; @@ -62,7 +66,6 @@ class FrameSelection; class InputMethodController; class CoreProbeSink; -class InterfaceProvider; class InterfaceRegistry; class IntPoint; class IntSize; @@ -96,7 +99,6 @@ static LocalFrame* Create(LocalFrameClient*, Page&, FrameOwner*, - InterfaceProvider* = nullptr, InterfaceRegistry* = nullptr); void Init(); @@ -225,12 +227,7 @@ bool CanNavigate(const Frame&); - // This method is deprecated. Please use - // LocalFrameClient::GetInterfaceProvider() instead. - // - // TODO(crbug.com/726943): Remove this method. - InterfaceProvider* GetInterfaceProvider() { return interface_provider_; } - + service_manager::InterfaceProvider& GetInterfaceProvider(); InterfaceRegistry* GetInterfaceRegistry() { return interface_registry_; } LocalFrameClient* Client() const; @@ -282,7 +279,6 @@ LocalFrame(LocalFrameClient*, Page&, FrameOwner*, - InterfaceProvider*, InterfaceRegistry*); // Intentionally private to prevent redundant checks when the type is @@ -326,7 +322,6 @@ Member<CoreProbeSink> probe_sink_; Member<PerformanceMonitor> performance_monitor_; - InterfaceProvider* const interface_provider_; InterfaceRegistry* const interface_registry_; IntRect remote_viewport_intersection_;
diff --git a/third_party/WebKit/Source/core/frame/NavigatorClipboard.cpp b/third_party/WebKit/Source/core/frame/NavigatorClipboard.cpp new file mode 100644 index 0000000..df12ca8 --- /dev/null +++ b/third_party/WebKit/Source/core/frame/NavigatorClipboard.cpp
@@ -0,0 +1,42 @@ +// Copyright 2017 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 "core/frame/NavigatorClipboard.h" + +#include "core/clipboard/Clipboard.h" +#include "core/dom/Document.h" +#include "core/frame/LocalFrame.h" + +namespace blink { + +Clipboard* NavigatorClipboard::clipboard(ScriptState* script_state, + Navigator& navigator) { + NavigatorClipboard* supplement = static_cast<NavigatorClipboard*>( + Supplement<Navigator>::From(navigator, SupplementName())); + if (!supplement) { + supplement = new NavigatorClipboard(navigator); + ProvideTo(navigator, SupplementName(), supplement); + } + + return supplement->clipboard_; +} + +DEFINE_TRACE(NavigatorClipboard) { + visitor->Trace(clipboard_); + Supplement<Navigator>::Trace(visitor); +} + +NavigatorClipboard::NavigatorClipboard(Navigator& navigator) + : Supplement<Navigator>(navigator) { + clipboard_ = + new Clipboard(GetSupplementable()->GetFrame() + ? GetSupplementable()->GetFrame()->GetDocument() + : nullptr); +} + +const char* NavigatorClipboard::SupplementName() { + return "NavigatorClipboard"; +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/frame/NavigatorClipboard.h b/third_party/WebKit/Source/core/frame/NavigatorClipboard.h new file mode 100644 index 0000000..1d17ab4 --- /dev/null +++ b/third_party/WebKit/Source/core/frame/NavigatorClipboard.h
@@ -0,0 +1,38 @@ +// Copyright 2017 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 NavigatorClipboard_h +#define NavigatorClipboard_h + +#include "core/CoreExport.h" +#include "core/frame/Navigator.h" +#include "platform/Supplementable.h" +#include "platform/heap/Handle.h" +#include "platform/wtf/Noncopyable.h" + +namespace blink { + +class Clipboard; +class ScriptState; + +class NavigatorClipboard final : public GarbageCollected<NavigatorClipboard>, + public Supplement<Navigator> { + USING_GARBAGE_COLLECTED_MIXIN(NavigatorClipboard); + WTF_MAKE_NONCOPYABLE(NavigatorClipboard); + + public: + static Clipboard* clipboard(ScriptState*, Navigator&); + + DECLARE_TRACE(); + + private: + explicit NavigatorClipboard(Navigator&); + static const char* SupplementName(); + + Member<Clipboard> clipboard_; +}; + +} // namespace blink + +#endif // NavigatorClipboard.h
diff --git a/third_party/WebKit/Source/core/frame/NavigatorClipboard.idl b/third_party/WebKit/Source/core/frame/NavigatorClipboard.idl new file mode 100644 index 0000000..a1ee432 --- /dev/null +++ b/third_party/WebKit/Source/core/frame/NavigatorClipboard.idl
@@ -0,0 +1,11 @@ +// Copyright 2017 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. + +// https://w3c.github.io/clipboard-apis/#navigator-interface + +[RuntimeEnabled=AsyncClipboard] +partial interface Navigator { + [CallWith=ScriptState, SecureContext, SameObject] + readonly attribute Clipboard clipboard; +};
diff --git a/third_party/WebKit/Source/core/frame/PerformanceMonitor.cpp b/third_party/WebKit/Source/core/frame/PerformanceMonitor.cpp index db90fa05..c7f566cc 100644 --- a/third_party/WebKit/Source/core/frame/PerformanceMonitor.cpp +++ b/third_party/WebKit/Source/core/frame/PerformanceMonitor.cpp
@@ -226,8 +226,7 @@ InnerReportGenericViolation(document, kBlockedParser, text, 0, nullptr); } -void PerformanceMonitor::WillProcessTask(scheduler::TaskQueue*, - double start_time) { +void PerformanceMonitor::WillProcessTask(double start_time) { // Reset m_taskExecutionContext. We don't clear this in didProcessTask // as it is needed in ReportTaskTime which occurs after didProcessTask. task_execution_context_ = nullptr; @@ -243,9 +242,7 @@ user_callback_ = nullptr; } -void PerformanceMonitor::DidProcessTask(scheduler::TaskQueue*, - double start_time, - double end_time) { +void PerformanceMonitor::DidProcessTask(double start_time, double end_time) { if (!enabled_) return; double layout_threshold = thresholds_[kLongLayout];
diff --git a/third_party/WebKit/Source/core/frame/PerformanceMonitor.h b/third_party/WebKit/Source/core/frame/PerformanceMonitor.h index 7679eb1..62b7601f 100644 --- a/third_party/WebKit/Source/core/frame/PerformanceMonitor.h +++ b/third_party/WebKit/Source/core/frame/PerformanceMonitor.h
@@ -116,10 +116,8 @@ std::unique_ptr<SourceLocation>); // scheduler::TaskTimeObserver implementation - void WillProcessTask(scheduler::TaskQueue*, double start_time) override; - void DidProcessTask(scheduler::TaskQueue*, - double start_time, - double end_time) override; + void WillProcessTask(double start_time) override; + void DidProcessTask(double start_time, double end_time) override; void OnBeginNestedRunLoop() override {} void WillExecuteScript(ExecutionContext*); void DidExecuteScript();
diff --git a/third_party/WebKit/Source/core/frame/PerformanceMonitorTest.cpp b/third_party/WebKit/Source/core/frame/PerformanceMonitorTest.cpp index 79303670..07b6f8f7 100644 --- a/third_party/WebKit/Source/core/frame/PerformanceMonitorTest.cpp +++ b/third_party/WebKit/Source/core/frame/PerformanceMonitorTest.cpp
@@ -36,14 +36,12 @@ } // scheduler::TaskTimeObserver implementation - void WillProcessTask(scheduler::TaskQueue* queue, double start_time) { - monitor_->WillProcessTask(queue, start_time); + void WillProcessTask(double start_time) { + monitor_->WillProcessTask(start_time); } - void DidProcessTask(scheduler::TaskQueue* queue, - double start_time, - double end_time) { - monitor_->DidProcessTask(queue, start_time, end_time); + void DidProcessTask(double start_time, double end_time) { + monitor_->DidProcessTask(start_time, end_time); } String FrameContextURL(); @@ -87,17 +85,17 @@ } TEST_F(PerformanceMonitorTest, SingleScriptInTask) { - WillProcessTask(nullptr, 3719349.445172); + WillProcessTask(3719349.445172); EXPECT_EQ(0, NumUniqueFrameContextsSeen()); WillExecuteScript(GetExecutionContext()); EXPECT_EQ(1, NumUniqueFrameContextsSeen()); - DidProcessTask(nullptr, 3719349.445172, 3719349.5561923); // Long task + DidProcessTask(3719349.445172, 3719349.5561923); // Long task EXPECT_EQ(1, NumUniqueFrameContextsSeen()); EXPECT_EQ("https://example.com/foo", FrameContextURL()); } TEST_F(PerformanceMonitorTest, MultipleScriptsInTask_SingleContext) { - WillProcessTask(nullptr, 3719349.445172); + WillProcessTask(3719349.445172); EXPECT_EQ(0, NumUniqueFrameContextsSeen()); WillExecuteScript(GetExecutionContext()); EXPECT_EQ(1, NumUniqueFrameContextsSeen()); @@ -105,13 +103,13 @@ WillExecuteScript(GetExecutionContext()); EXPECT_EQ(1, NumUniqueFrameContextsSeen()); - DidProcessTask(nullptr, 3719349.445172, 3719349.5561923); // Long task + DidProcessTask(3719349.445172, 3719349.5561923); // Long task EXPECT_EQ(1, NumUniqueFrameContextsSeen()); EXPECT_EQ("https://example.com/foo", FrameContextURL()); } TEST_F(PerformanceMonitorTest, MultipleScriptsInTask_MultipleContexts) { - WillProcessTask(nullptr, 3719349.445172); + WillProcessTask(3719349.445172); EXPECT_EQ(0, NumUniqueFrameContextsSeen()); WillExecuteScript(GetExecutionContext()); EXPECT_EQ(1, NumUniqueFrameContextsSeen()); @@ -119,18 +117,18 @@ WillExecuteScript(AnotherExecutionContext()); EXPECT_EQ(2, NumUniqueFrameContextsSeen()); - DidProcessTask(nullptr, 3719349.445172, 3719349.5561923); // Long task + DidProcessTask(3719349.445172, 3719349.5561923); // Long task EXPECT_EQ(2, NumUniqueFrameContextsSeen()); EXPECT_EQ("", FrameContextURL()); } TEST_F(PerformanceMonitorTest, NoScriptInLongTask) { - WillProcessTask(nullptr, 3719349.445172); + WillProcessTask(3719349.445172); WillExecuteScript(GetExecutionContext()); - DidProcessTask(nullptr, 3719349.445172, 3719349.445182); + DidProcessTask(3719349.445172, 3719349.445182); - WillProcessTask(nullptr, 3719349.445172); - DidProcessTask(nullptr, 3719349.445172, 3719349.5561923); // Long task + WillProcessTask(3719349.445172); + DidProcessTask(3719349.445172, 3719349.5561923); // Long task // Without presence of Script, FrameContext URL is not available EXPECT_EQ(0, NumUniqueFrameContextsSeen()); }
diff --git a/third_party/WebKit/Source/core/html/BUILD.gn b/third_party/WebKit/Source/core/html/BUILD.gn index 5a97aad..97ea827 100644 --- a/third_party/WebKit/Source/core/html/BUILD.gn +++ b/third_party/WebKit/Source/core/html/BUILD.gn
@@ -487,6 +487,10 @@ "media/MediaError.h", "media/MediaFragmentURIParser.cpp", "media/MediaFragmentURIParser.h", + "media/MediaRemotingElements.cpp", + "media/MediaRemotingElements.h", + "media/MediaRemotingInterstitial.cpp", + "media/MediaRemotingInterstitial.h", "parser/AtomicHTMLToken.cpp", "parser/AtomicHTMLToken.h", "parser/BackgroundHTMLInputStream.cpp", @@ -562,12 +566,6 @@ "parser/XSSAuditorDelegate.h", "shadow/DetailsMarkerControl.cpp", "shadow/DetailsMarkerControl.h", - "shadow/MediaControlElementTypes.cpp", - "shadow/MediaControlElementTypes.h", - "shadow/MediaRemotingElements.cpp", - "shadow/MediaRemotingElements.h", - "shadow/MediaRemotingInterstitial.cpp", - "shadow/MediaRemotingInterstitial.h", "shadow/ProgressShadowElement.cpp", "shadow/ProgressShadowElement.h", "shadow/ShadowElementNames.cpp",
diff --git a/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp b/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp index 6c28957..cb5bd7d 100644 --- a/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp
@@ -38,8 +38,8 @@ #include "core/frame/LocalDOMWindow.h" #include "core/frame/Settings.h" #include "core/html/media/MediaCustomControlsFullscreenDetector.h" +#include "core/html/media/MediaRemotingInterstitial.h" #include "core/html/parser/HTMLParserIdioms.h" -#include "core/html/shadow/MediaRemotingInterstitial.h" #include "core/imagebitmap/ImageBitmap.h" #include "core/imagebitmap/ImageBitmapOptions.h" #include "core/layout/LayoutImage.h"
diff --git a/third_party/WebKit/Source/core/html/forms/PasswordInputTypeTest.cpp b/third_party/WebKit/Source/core/html/forms/PasswordInputTypeTest.cpp index 860b0b0..88d0348f 100644 --- a/third_party/WebKit/Source/core/html/forms/PasswordInputTypeTest.cpp +++ b/third_party/WebKit/Source/core/html/forms/PasswordInputTypeTest.cpp
@@ -8,97 +8,76 @@ #include "core/html/HTMLInputElement.h" #include "core/testing/DummyPageHolder.h" #include "mojo/public/cpp/bindings/binding_set.h" -#include "mojo/public/cpp/bindings/interface_request.h" #include "platform/testing/UnitTestHelpers.h" -#include "public/platform/InterfaceProvider.h" #include "public/platform/modules/sensitive_input_visibility/sensitive_input_visibility_service.mojom-blink.h" +#include "services/service_manager/public/cpp/interface_provider.h" #include "testing/gtest/include/gtest/gtest.h" namespace blink { -class MockInterfaceProvider : public blink::InterfaceProvider { +class MockSensitiveInputVisibilityService + : public mojom::blink::SensitiveInputVisibilityService { public: - MockInterfaceProvider() - : mock_sensitive_input_visibility_service_(this), - password_field_visible_called_(false), - num_password_fields_invisible_calls_(0) {} - - virtual ~MockInterfaceProvider() {} - - void GetInterface(const char* name, - mojo::ScopedMessagePipeHandle handle) override { - mock_sensitive_input_visibility_service_.BindRequest( - mojom::blink::SensitiveInputVisibilityServiceRequest( - std::move(handle))); + MockSensitiveInputVisibilityService(LocalFrame& frame) { + service_manager::InterfaceProvider::TestApi test_api( + &frame.GetInterfaceProvider()); + test_api.SetBinderForName( + mojom::blink::SensitiveInputVisibilityService::Name_, + ConvertToBaseCallback( + WTF::Bind(&MockSensitiveInputVisibilityService::BindRequest, + WTF::Unretained(this)))); } - void SetPasswordFieldVisibleCalled() { - password_field_visible_called_ = true; + ~MockSensitiveInputVisibilityService() override {} + + void BindRequest(mojo::ScopedMessagePipeHandle handle) { + binding_set_.AddBinding( + this, mojom::blink::SensitiveInputVisibilityServiceRequest( + std::move(handle))); } bool PasswordFieldVisibleCalled() const { return password_field_visible_called_; } - void IncrementPasswordFieldsInvisibleCalled() { - ++num_password_fields_invisible_calls_; - } - unsigned NumPasswordFieldsInvisibleCalls() const { return num_password_fields_invisible_calls_; } private: - class MockSensitiveInputVisibilityService - : public mojom::blink::SensitiveInputVisibilityService { - public: - explicit MockSensitiveInputVisibilityService( - MockInterfaceProvider* registry) - : registry_(registry) {} - ~MockSensitiveInputVisibilityService() override {} + // mojom::SensitiveInputVisibilityService + void PasswordFieldVisibleInInsecureContext() override { + password_field_visible_called_ = true; + } - void BindRequest( - mojom::blink::SensitiveInputVisibilityServiceRequest request) { - binding_set_.AddBinding(this, std::move(request)); - } + void AllPasswordFieldsInInsecureContextInvisible() override { + ++num_password_fields_invisible_calls_; + } - private: - // mojom::SensitiveInputVisibilityService - void PasswordFieldVisibleInInsecureContext() override { - registry_->SetPasswordFieldVisibleCalled(); - } + mojo::BindingSet<SensitiveInputVisibilityService> binding_set_; - void AllPasswordFieldsInInsecureContextInvisible() override { - registry_->IncrementPasswordFieldsInvisibleCalled(); - } - - mojo::BindingSet<SensitiveInputVisibilityService> binding_set_; - MockInterfaceProvider* const registry_; - }; - - MockSensitiveInputVisibilityService mock_sensitive_input_visibility_service_; - bool password_field_visible_called_; - unsigned num_password_fields_invisible_calls_; + bool password_field_visible_called_ = false; + unsigned num_password_fields_invisible_calls_ = 0; }; // Tests that a Mojo message is sent when a visible password field // appears on the page. TEST(PasswordInputTypeTest, PasswordVisibilityEvent) { - MockInterfaceProvider interface_provider; - std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create( - IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider); + std::unique_ptr<DummyPageHolder> page_holder = + DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr); + MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame()); page_holder->GetDocument().body()->setInnerHTML("<input type='password'>"); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_TRUE(interface_provider.PasswordFieldVisibleCalled()); + EXPECT_TRUE(mock_service.PasswordFieldVisibleCalled()); } // Tests that a Mojo message is not sent when a visible password field // appears in a secure context. TEST(PasswordInputTypeTest, PasswordVisibilityEventInSecureContext) { - MockInterfaceProvider interface_provider; - std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create( - IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider); + std::unique_ptr<DummyPageHolder> page_holder = + DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr); + MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame()); page_holder->GetDocument().SetURL(KURL(NullURL(), "https://example.test")); page_holder->GetDocument().SetSecurityOrigin( SecurityOrigin::Create(KURL(NullURL(), "https://example.test"))); @@ -106,21 +85,21 @@ page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); // No message should have been sent from a secure context. blink::testing::RunPendingTasks(); - EXPECT_FALSE(interface_provider.PasswordFieldVisibleCalled()); + EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled()); } // Tests that a Mojo message is sent when a previously invisible password field // becomes visible. TEST(PasswordInputTypeTest, InvisiblePasswordFieldBecomesVisible) { - MockInterfaceProvider interface_provider; - std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create( - IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider); + std::unique_ptr<DummyPageHolder> page_holder = + DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr); + MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame()); page_holder->GetDocument().body()->setInnerHTML( "<input type='password' style='display:none;'>"); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); // The message should not be sent for a hidden password field. - EXPECT_FALSE(interface_provider.PasswordFieldVisibleCalled()); + EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled()); // Now make the input visible. HTMLInputElement* input = @@ -128,20 +107,20 @@ input->setAttribute("style", "", ASSERT_NO_EXCEPTION); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_TRUE(interface_provider.PasswordFieldVisibleCalled()); + EXPECT_TRUE(mock_service.PasswordFieldVisibleCalled()); } // Tests that a Mojo message is sent when a previously non-password field // becomes a password. TEST(PasswordInputTypeTest, NonPasswordFieldBecomesPassword) { - MockInterfaceProvider interface_provider; - std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create( - IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider); + std::unique_ptr<DummyPageHolder> page_holder = + DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr); + MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame()); page_holder->GetDocument().body()->setInnerHTML("<input type='text'>"); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); // The message should not be sent for a non-password field. blink::testing::RunPendingTasks(); - EXPECT_FALSE(interface_provider.PasswordFieldVisibleCalled()); + EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled()); // Now make the input a password field. HTMLInputElement* input = @@ -149,22 +128,22 @@ input->setType("password"); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_TRUE(interface_provider.PasswordFieldVisibleCalled()); + EXPECT_TRUE(mock_service.PasswordFieldVisibleCalled()); } // Tests that a Mojo message is *not* sent when a previously invisible password // field becomes a visible non-password field. TEST(PasswordInputTypeTest, InvisiblePasswordFieldBecomesVisibleNonPasswordField) { - MockInterfaceProvider interface_provider; - std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create( - IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider); + std::unique_ptr<DummyPageHolder> page_holder = + DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr); + MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame()); page_holder->GetDocument().body()->setInnerHTML( "<input type='password' style='display:none;'>"); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); // The message should not be sent for a hidden password field. - EXPECT_FALSE(interface_provider.PasswordFieldVisibleCalled()); + EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled()); // Now make the input a visible non-password field. HTMLInputElement* input = @@ -173,20 +152,20 @@ input->setAttribute("style", "", ASSERT_NO_EXCEPTION); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_FALSE(interface_provider.PasswordFieldVisibleCalled()); + EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled()); } // Tests that a Mojo message is sent when the only visible password // field becomes invisible. TEST(PasswordInputTypeTest, VisiblePasswordFieldBecomesInvisible) { - MockInterfaceProvider interface_provider; - std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create( - IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider); + std::unique_ptr<DummyPageHolder> page_holder = + DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr); + MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame()); page_holder->GetDocument().body()->setInnerHTML("<input type='password'>"); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_TRUE(interface_provider.PasswordFieldVisibleCalled()); - EXPECT_EQ(0u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_TRUE(mock_service.PasswordFieldVisibleCalled()); + EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls()); // Now make the input invisible. HTMLInputElement* input = @@ -194,20 +173,20 @@ input->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); } // Tests that a Mojo message is sent when all visible password fields // become invisible. TEST(PasswordInputTypeTest, AllVisiblePasswordFieldBecomeInvisible) { - MockInterfaceProvider interface_provider; - std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create( - IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider); + std::unique_ptr<DummyPageHolder> page_holder = + DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr); + MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame()); page_holder->GetDocument().body()->setInnerHTML( "<input type='password'><input type='password'>"); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_EQ(0u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls()); // Make the first input invisible. There should be no message because // there is still a visible input. @@ -216,38 +195,38 @@ input->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_EQ(0u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls()); // When all inputs are invisible, then a message should be sent. input = toHTMLInputElement(page_holder->GetDocument().body()->lastChild()); input->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); // If the count of visible inputs goes positive again and then back to // zero, a message should be sent again. input->setAttribute("style", "", ASSERT_NO_EXCEPTION); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); input->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_EQ(2u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_EQ(2u, mock_service.NumPasswordFieldsInvisibleCalls()); } // Tests that a Mojo message is sent when the containing element of a // visible password field becomes invisible. TEST(PasswordInputTypeTest, PasswordFieldContainerBecomesInvisible) { - MockInterfaceProvider interface_provider; - std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create( - IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider); + std::unique_ptr<DummyPageHolder> page_holder = + DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr); + MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame()); page_holder->GetDocument().body()->setInnerHTML( "<div><input type='password'></div>"); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_EQ(0u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls()); // If the containing div becomes invisible, a message should be sent. HTMLElement* div = @@ -255,31 +234,31 @@ div->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); // If the containing div becomes visible and then invisible again, a message // should be sent. div->setAttribute("style", "", ASSERT_NO_EXCEPTION); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); div->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_EQ(2u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_EQ(2u, mock_service.NumPasswordFieldsInvisibleCalls()); } // Tests that a Mojo message is sent when all visible password fields // become non-password fields. TEST(PasswordInputTypeTest, PasswordFieldsBecomeNonPasswordFields) { - MockInterfaceProvider interface_provider; - std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create( - IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider); + std::unique_ptr<DummyPageHolder> page_holder = + DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr); + MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame()); page_holder->GetDocument().body()->setInnerHTML( "<input type='password'><input type='password'>"); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_EQ(0u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls()); // Make the first input a non-password input. There should be no // message because there is still a visible password input. @@ -288,22 +267,22 @@ input->setType("text"); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_EQ(0u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls()); // When all inputs are no longer passwords, then a message should be sent. input = toHTMLInputElement(page_holder->GetDocument().body()->lastChild()); input->setType("text"); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); blink::testing::RunPendingTasks(); - EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls()); + EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); } // Tests that only one Mojo message is sent for multiple password // visibility events within the same task. TEST(PasswordInputTypeTest, MultipleEventsInSameTask) { - MockInterfaceProvider interface_provider; - std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create( - IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider); + std::unique_ptr<DummyPageHolder> page_holder = + DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr); + MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame()); page_holder->GetDocument().body()->setInnerHTML("<input type='password'>"); page_holder->GetDocument().View()->UpdateAllLifecyclePhases(); // Make the password field invisible in the same task. @@ -314,8 +293,8 @@ blink::testing::RunPendingTasks(); // Only a single Mojo message should have been sent, with the latest state of // the page (which is that no password fields are visible). - EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls()); - EXPECT_FALSE(interface_provider.PasswordFieldVisibleCalled()); + EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls()); + EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled()); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/html/media/MediaControls.h b/third_party/WebKit/Source/core/html/media/MediaControls.h index b2b00db..cc5ed6c 100644 --- a/third_party/WebKit/Source/core/html/media/MediaControls.h +++ b/third_party/WebKit/Source/core/html/media/MediaControls.h
@@ -11,7 +11,6 @@ namespace blink { -class Document; class HTMLDivElement; class HTMLMediaElement; class LayoutObject; @@ -66,7 +65,6 @@ // implementation and could be removed when the full implementation has moved // to modules. virtual HTMLDivElement* PanelElement() = 0; - virtual Document& OwnerDocument() = 0; virtual void OnMediaControlsEnabledChange() = 0; DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaRemotingElements.cpp b/third_party/WebKit/Source/core/html/media/MediaRemotingElements.cpp similarity index 98% rename from third_party/WebKit/Source/core/html/shadow/MediaRemotingElements.cpp rename to third_party/WebKit/Source/core/html/media/MediaRemotingElements.cpp index 5f774b1..4e491648 100644 --- a/third_party/WebKit/Source/core/html/shadow/MediaRemotingElements.cpp +++ b/third_party/WebKit/Source/core/html/media/MediaRemotingElements.cpp
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "core/html/shadow/MediaRemotingElements.h" +#include "core/html/media/MediaRemotingElements.h" #include "core/dom/ClientRect.h" #include "core/dom/ShadowRoot.h"
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaRemotingElements.h b/third_party/WebKit/Source/core/html/media/MediaRemotingElements.h similarity index 96% rename from third_party/WebKit/Source/core/html/shadow/MediaRemotingElements.h rename to third_party/WebKit/Source/core/html/media/MediaRemotingElements.h index 605678e..45ac577b8 100644 --- a/third_party/WebKit/Source/core/html/shadow/MediaRemotingElements.h +++ b/third_party/WebKit/Source/core/html/media/MediaRemotingElements.h
@@ -5,7 +5,7 @@ #ifndef MediaRemotingElements_h #define MediaRemotingElements_h -#include "core/html/shadow/MediaRemotingInterstitial.h" +#include "core/html/media/MediaRemotingInterstitial.h" namespace blink {
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaRemotingInterstitial.cpp b/third_party/WebKit/Source/core/html/media/MediaRemotingInterstitial.cpp similarity index 96% rename from third_party/WebKit/Source/core/html/shadow/MediaRemotingInterstitial.cpp rename to third_party/WebKit/Source/core/html/media/MediaRemotingInterstitial.cpp index f38296b..073fed8 100644 --- a/third_party/WebKit/Source/core/html/shadow/MediaRemotingInterstitial.cpp +++ b/third_party/WebKit/Source/core/html/media/MediaRemotingInterstitial.cpp
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "core/html/shadow/MediaRemotingInterstitial.h" +#include "core/html/media/MediaRemotingInterstitial.h" #include "core/dom/TaskRunnerHelper.h" #include "core/html/HTMLImageElement.h" #include "core/html/HTMLVideoElement.h" -#include "core/html/shadow/MediaRemotingElements.h" +#include "core/html/media/MediaRemotingElements.h" namespace {
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaRemotingInterstitial.h b/third_party/WebKit/Source/core/html/media/MediaRemotingInterstitial.h similarity index 98% rename from third_party/WebKit/Source/core/html/shadow/MediaRemotingInterstitial.h rename to third_party/WebKit/Source/core/html/media/MediaRemotingInterstitial.h index 75a0d4d4..96624dc 100644 --- a/third_party/WebKit/Source/core/html/shadow/MediaRemotingInterstitial.h +++ b/third_party/WebKit/Source/core/html/media/MediaRemotingInterstitial.h
@@ -60,6 +60,6 @@ Member<MediaRemotingCastMessageElement> cast_text_message_; }; -} // namespace +} // namespace blink #endif // MediaRemotingInterstitial_h
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp b/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp index 4ecbf7a..0be309118 100644 --- a/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp +++ b/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp
@@ -79,16 +79,19 @@ return value; } -WARN_UNUSED_RESULT ScriptLoader::ExecuteScriptResult DoExecuteScript( - ScriptElementBase* element, - const Script* script, - const TextPosition& text_position) { +void DoExecuteScript(PendingScript* pending_script, const KURL& document_url) { + ScriptElementBase* element = pending_script->GetElement(); ScriptLoader* script_loader = element->Loader(); DCHECK(script_loader); - TRACE_EVENT_WITH_FLOW1("blink", "HTMLParserScriptRunner ExecuteScript", - element, TRACE_EVENT_FLAG_FLOW_IN, "data", - GetTraceArgsForScriptElement(element, text_position)); - return script_loader->ExecuteScript(script); + const char* const trace_event_name = + pending_script->ErrorOccurred() + ? "HTMLParserScriptRunner ExecuteScriptFailed" + : "HTMLParserScriptRunner ExecuteScript"; + TRACE_EVENT_WITH_FLOW1("blink", trace_event_name, element, + TRACE_EVENT_FLAG_FLOW_IN, "data", + GetTraceArgsForScriptElement( + element, pending_script->StartingPosition())); + script_loader->ExecuteScriptBlock(pending_script, document_url); } void TraceParserBlockingScript(const PendingScript* pending_script, @@ -202,10 +205,6 @@ void HTMLParserScriptRunner::ExecutePendingScriptAndDispatchEvent( PendingScript* pending_script, ScriptStreamer::Type pending_script_type) { - bool error_occurred = false; - Script* script = pending_script->GetSource( - DocumentURLForScriptExecution(document_), error_occurred); - // Stop watching loads before executeScript to prevent recursion if the script // reloads itself. // TODO(kouhei): Consider merging this w/ pendingScript->dispose() after the @@ -222,17 +221,12 @@ } } - TextPosition script_start_position = pending_script->StartingPosition(); double script_parser_blocking_time = pending_script->ParserBlockingLoadStartTime(); ScriptElementBase* element = pending_script->GetElement(); // 1. "Let the script be the pending parsing-blocking script. // There is no longer a pending parsing-blocking script." - // Clear the pending script before possible re-entrancy from executeScript() - pending_script->Dispose(); - pending_script = nullptr; - if (pending_script_type == ScriptStreamer::kParsingBlocking) { parser_blocking_script_ = nullptr; } @@ -248,31 +242,14 @@ ignore_destructive_write_count_incrementer(document_); // 8. "Execute the script." - if (error_occurred) { - TRACE_EVENT_WITH_FLOW1( - "blink", "HTMLParserScriptRunner ExecuteScriptFailed", element, - TRACE_EVENT_FLAG_FLOW_IN, "data", - GetTraceArgsForScriptElement(element, script_start_position)); - script_loader->DispatchErrorEvent(); - } else { - DCHECK(IsExecutingScript()); - if (script_parser_blocking_time > 0.0) { - DocumentParserTiming::From(*document_) - .RecordParserBlockedOnScriptLoadDuration( - MonotonicallyIncreasingTime() - script_parser_blocking_time, - script_loader->WasCreatedDuringDocumentWrite()); - } - switch (DoExecuteScript(element, script, script_start_position)) { - case ScriptLoader::ExecuteScriptResult::kShouldFireErrorEvent: - script_loader->DispatchErrorEvent(); - break; - case ScriptLoader::ExecuteScriptResult::kShouldFireLoadEvent: - element->DispatchLoadEvent(); - break; - case ScriptLoader::ExecuteScriptResult::kShouldFireNone: - break; - } + DCHECK(IsExecutingScript()); + if (!pending_script->ErrorOccurred() && script_parser_blocking_time > 0.0) { + DocumentParserTiming::From(*document_) + .RecordParserBlockedOnScriptLoadDuration( + MonotonicallyIncreasingTime() - script_parser_blocking_time, + script_loader->WasCreatedDuringDocumentWrite()); } + DoExecuteScript(pending_script, DocumentURLForScriptExecution(document_)); // 9. "Decrement the parser's script nesting level by one. // If the parser's script nesting level is zero @@ -660,22 +637,9 @@ if (parser_blocking_script_) parser_blocking_script_->Dispose(); parser_blocking_script_ = nullptr; - ScriptSourceCode source_code(element->TextFromChildren(), - DocumentURLForScriptExecution(document_), - script_start_position); - switch (DoExecuteScript(element, ClassicScript::Create(source_code), - script_start_position)) { - case ScriptLoader::ExecuteScriptResult::kShouldFireLoadEvent: - // The load event is not fired because this is an inline script. - break; - - case ScriptLoader::ExecuteScriptResult::kShouldFireErrorEvent: - script_loader->DispatchErrorEvent(); - break; - - case ScriptLoader::ExecuteScriptResult::kShouldFireNone: - break; - } + DoExecuteScript( + ClassicPendingScript::Create(element, script_start_position), + DocumentURLForScriptExecution(document_)); } } else { // 2nd Clause of Step 23.
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.cpp b/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.cpp deleted file mode 100644 index d78c84d..0000000 --- a/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.cpp +++ /dev/null
@@ -1,201 +0,0 @@ -/* - * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "core/html/shadow/MediaControlElementTypes.h" - -#include "bindings/core/v8/ExceptionState.h" -#include "core/CSSValueKeywords.h" -#include "core/HTMLNames.h" -#include "core/css/StylePropertySet.h" -#include "core/dom/Text.h" -#include "core/events/MouseEvent.h" -#include "core/html/HTMLLabelElement.h" -#include "core/html/HTMLMediaElement.h" -#include "core/html/media/MediaControls.h" -#include "core/layout/LayoutObject.h" -#include "platform/text/PlatformLocale.h" - -namespace blink { - -using namespace HTMLNames; - -class Event; - -const HTMLMediaElement* ToParentMediaElement(const Node* node) { - if (!node) - return nullptr; - const Node* media_node = node->OwnerShadowHost(); - if (!media_node) - return nullptr; - if (!IsHTMLMediaElement(media_node)) - return nullptr; - - return ToHTMLMediaElement(media_node); -} - -const HTMLMediaElement* ToParentMediaElement( - const LayoutObject& layout_object) { - return ToParentMediaElement(layout_object.GetNode()); -} - -MediaControlElementType GetMediaControlElementType(const Node* node) { - SECURITY_DCHECK(node->IsMediaControlElement()); - const HTMLElement* element = ToHTMLElement(node); - if (isHTMLInputElement(*element)) - return static_cast<const MediaControlInputElement*>(element)->DisplayType(); - return static_cast<const MediaControlDivElement*>(element)->DisplayType(); -} - -MediaControlElement::MediaControlElement(MediaControls& media_controls, - MediaControlElementType display_type, - HTMLElement* element) - : media_controls_(&media_controls), - display_type_(display_type), - element_(element), - is_wanted_(true), - does_fit_(true) {} - -HTMLMediaElement& MediaControlElement::MediaElement() const { - return GetMediaControls().MediaElement(); -} - -void MediaControlElement::UpdateShownState() { - if (is_wanted_ && does_fit_) - element_->RemoveInlineStyleProperty(CSSPropertyDisplay); - else - element_->SetInlineStyleProperty(CSSPropertyDisplay, CSSValueNone); -} - -void MediaControlElement::SetDoesFit(bool fits) { - does_fit_ = fits; - UpdateShownState(); -} - -void MediaControlElement::SetIsWanted(bool wanted) { - if (is_wanted_ == wanted) - return; - is_wanted_ = wanted; - UpdateShownState(); -} - -bool MediaControlElement::IsWanted() { - return is_wanted_; -} - -void MediaControlElement::SetDisplayType(MediaControlElementType display_type) { - if (display_type == display_type_) - return; - - display_type_ = display_type; - if (LayoutObject* object = element_->GetLayoutObject()) - object->SetShouldDoFullPaintInvalidation(); -} - -void MediaControlElement::ShouldShowButtonInOverflowMenu(bool should_show) { - if (!HasOverflowButton()) - return; - if (should_show) { - overflow_menu_element_->RemoveInlineStyleProperty(CSSPropertyDisplay); - } else { - overflow_menu_element_->SetInlineStyleProperty(CSSPropertyDisplay, - CSSValueNone); - } -} - -String MediaControlElement::GetOverflowMenuString() { - return MediaElement().GetLocale().QueryString(GetOverflowStringName()); -} - -void MediaControlElement::UpdateOverflowString() { - if (overflow_menu_element_ && overflow_menu_text_) - overflow_menu_text_->ReplaceWholeText(GetOverflowMenuString()); -} - -DEFINE_TRACE(MediaControlElement) { - visitor->Trace(media_controls_); - visitor->Trace(element_); - visitor->Trace(overflow_menu_element_); - visitor->Trace(overflow_menu_text_); -} - -// ---------------------------- - -MediaControlDivElement::MediaControlDivElement( - MediaControls& media_controls, - MediaControlElementType display_type) - : HTMLDivElement(media_controls.OwnerDocument()), - MediaControlElement(media_controls, display_type, this) {} - -DEFINE_TRACE(MediaControlDivElement) { - MediaControlElement::Trace(visitor); - HTMLDivElement::Trace(visitor); -} - -// ---------------------------- - -MediaControlInputElement::MediaControlInputElement( - MediaControls& media_controls, - MediaControlElementType display_type) - : HTMLInputElement(media_controls.OwnerDocument(), false), - MediaControlElement(media_controls, display_type, this) {} - -bool MediaControlInputElement::IsMouseFocusable() const { - return false; -} - -HTMLElement* MediaControlInputElement::CreateOverflowElement( - MediaControls& media_controls, - MediaControlInputElement* button) { - if (!button) - return nullptr; - - // We don't want the button visible within the overflow menu. - button->SetIsWanted(false); - - overflow_menu_text_ = Text::Create(media_controls.OwnerDocument(), - button->GetOverflowMenuString()); - - HTMLLabelElement* element = - HTMLLabelElement::Create(media_controls.OwnerDocument()); - element->SetShadowPseudoId( - AtomicString("-internal-media-controls-overflow-menu-list-item")); - // Appending a button to a label element ensures that clicks on the label - // are passed down to the button, performing the action we'd expect. - element->AppendChild(button); - element->AppendChild(overflow_menu_text_); - overflow_menu_element_ = element; - return element; -} - -DEFINE_TRACE(MediaControlInputElement) { - MediaControlElement::Trace(visitor); - HTMLInputElement::Trace(visitor); -} - -} // namespace blink
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.h b/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.h deleted file mode 100644 index 798efbb..0000000 --- a/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.h +++ /dev/null
@@ -1,196 +0,0 @@ -/* - * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef MediaControlElementTypes_h -#define MediaControlElementTypes_h - -#include "core/CoreExport.h" -#include "core/html/HTMLDivElement.h" -#include "core/html/HTMLInputElement.h" -#include "public/platform/WebLocalizedString.h" - -namespace blink { - -class HTMLMediaElement; -class MediaControls; - -enum MediaControlElementType { - kMediaEnterFullscreenButton = 0, - kMediaMuteButton, - kMediaPlayButton, - kMediaSlider, - kMediaSliderThumb, - kMediaShowClosedCaptionsButton, - kMediaHideClosedCaptionsButton, - kMediaTextTrackList, - kMediaUnMuteButton, - kMediaPauseButton, - kMediaTimelineContainer, - kMediaCurrentTimeDisplay, - kMediaTimeRemainingDisplay, - kMediaTrackSelectionCheckmark, - kMediaControlsPanel, - kMediaVolumeSliderContainer, - kMediaVolumeSlider, - kMediaVolumeSliderThumb, - kMediaExitFullscreenButton, - kMediaOverlayPlayButton, - kMediaCastOffButton, - kMediaCastOnButton, - kMediaOverlayCastOffButton, - kMediaOverlayCastOnButton, - kMediaOverflowButton, - kMediaOverflowList, - kMediaDownloadButton, -}; - -CORE_EXPORT const HTMLMediaElement* ToParentMediaElement(const Node*); -CORE_EXPORT const HTMLMediaElement* ToParentMediaElement(const LayoutObject&); - -CORE_EXPORT MediaControlElementType GetMediaControlElementType(const Node*); - -// ---------------------------- - -// TODO(mustaq): The Media control elements that use MouseEvents should be -// ported to use PointerEvents instead. -class CORE_EXPORT MediaControlElement : public GarbageCollectedMixin { - public: - // These hold the state about whether this control should be shown if - // space permits. These will also show / hide as needed. - virtual void SetIsWanted(bool); - bool IsWanted(); - - // Tell us whether we fit or not. This will hide / show the control as - // needed, also. - void SetDoesFit(bool); - - MediaControlElementType DisplayType() const { return display_type_; } - - // By default, media controls elements are not added to the overflow menu. - // Controls that can be added to the overflow menu should override this - // function and return true. - virtual bool HasOverflowButton() { return false; } - - // If true, shows the overflow menu item if it exists. Hides it if false. - void ShouldShowButtonInOverflowMenu(bool); - - // Returns a string representation of the media control element. Used for - // the overflow menu. - String GetOverflowMenuString(); - - // Updates the value of the Text string shown in the overflow menu. - void UpdateOverflowString(); - - DECLARE_VIRTUAL_TRACE(); - - protected: - MediaControlElement(MediaControls&, MediaControlElementType, HTMLElement*); - - MediaControls& GetMediaControls() const { - DCHECK(media_controls_); - return *media_controls_; - } - HTMLMediaElement& MediaElement() const; - - void SetDisplayType(MediaControlElementType); - - // Represents the overflow menu element for this media control. - // The Element contains the button that the user can click on, but having - // the button within an Element enables us to style the overflow menu. - // Setting this pointer is optional so it may be null. - Member<Element> overflow_menu_element_; - - // The text representation of the button within the overflow menu. - Member<Text> overflow_menu_text_; - - private: - // Hide or show based on our fits / wanted state. We want to show - // if and only if we're wanted and we fit. - void UpdateShownState(); - - // Returns a string representation of the media control element. - // Subclasses should override this method to return the string representation - // of the overflow button. - virtual WebLocalizedString::Name GetOverflowStringName() { - NOTREACHED(); - return WebLocalizedString::kAXAMPMFieldText; - } - - Member<MediaControls> media_controls_; - MediaControlElementType display_type_; - Member<HTMLElement> element_; - bool is_wanted_ : 1; - bool does_fit_ : 1; -}; - -// ---------------------------- - -class CORE_EXPORT MediaControlDivElement : public HTMLDivElement, - public MediaControlElement { - USING_GARBAGE_COLLECTED_MIXIN(MediaControlDivElement); - - public: - DECLARE_VIRTUAL_TRACE(); - - protected: - MediaControlDivElement(MediaControls&, MediaControlElementType); - - private: - bool IsMediaControlElement() const final { return true; } -}; - -// ---------------------------- - -class CORE_EXPORT MediaControlInputElement : public HTMLInputElement, - public MediaControlElement { - USING_GARBAGE_COLLECTED_MIXIN(MediaControlInputElement); - - public: - DECLARE_VIRTUAL_TRACE(); - - // Creates an overflow menu element with the given button as a child. - HTMLElement* CreateOverflowElement(MediaControls&, MediaControlInputElement*); - - protected: - MediaControlInputElement(MediaControls&, MediaControlElementType); - - private: - virtual void UpdateDisplayType() {} - bool IsMediaControlElement() const final { return true; } - bool IsMouseFocusable() const override; - - // Creates an overflow menu HTML element. - virtual MediaControlInputElement* CreateOverflowButton(MediaControls&) { - return nullptr; - } -}; - -} // namespace blink - -#endif // MediaControlElementTypes_h
diff --git a/third_party/WebKit/Source/core/html/shadow/OWNERS b/third_party/WebKit/Source/core/html/shadow/OWNERS deleted file mode 100644 index c774e98..0000000 --- a/third_party/WebKit/Source/core/html/shadow/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -per-file Media*=mlamouri@chromium.org
diff --git a/third_party/WebKit/Source/core/inspector/DOMPatchSupport.cpp b/third_party/WebKit/Source/core/inspector/DOMPatchSupport.cpp index afb5e8c6..c406897 100644 --- a/third_party/WebKit/Source/core/inspector/DOMPatchSupport.cpp +++ b/third_party/WebKit/Source/core/inspector/DOMPatchSupport.cpp
@@ -56,13 +56,6 @@ namespace blink { -void DOMPatchSupport::PatchDocument(Document& document, const String& markup) { - InspectorHistory history; - DOMEditor dom_editor(&history); - DOMPatchSupport patch_support(&dom_editor, document); - patch_support.PatchDocument(markup); -} - DOMPatchSupport::DOMPatchSupport(DOMEditor* dom_editor, Document& document) : dom_editor_(dom_editor), document_(document) {}
diff --git a/third_party/WebKit/Source/core/inspector/DOMPatchSupport.h b/third_party/WebKit/Source/core/inspector/DOMPatchSupport.h index 26fd66e..2e4a2ba 100644 --- a/third_party/WebKit/Source/core/inspector/DOMPatchSupport.h +++ b/third_party/WebKit/Source/core/inspector/DOMPatchSupport.h
@@ -49,8 +49,6 @@ WTF_MAKE_NONCOPYABLE(DOMPatchSupport); public: - static void PatchDocument(Document&, const String& markup); - DOMPatchSupport(DOMEditor*, Document&); void PatchDocument(const String& markup);
diff --git a/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp index a15af9a..8932083 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp
@@ -49,7 +49,6 @@ #include "core/html/imports/HTMLImportLoader.h" #include "core/html/imports/HTMLImportsController.h" #include "core/html/parser/TextResourceDecoder.h" -#include "core/inspector/DOMPatchSupport.h" #include "core/inspector/IdentifiersFactory.h" #include "core/inspector/InspectedFrames.h" #include "core/inspector/InspectorCSSAgent.h" @@ -655,7 +654,7 @@ Document* document = frame->GetDocument(); if (!document) return Response::Error("No Document instance to set HTML for"); - DOMPatchSupport::PatchDocument(*document, html); + document->SetContent(html); return Response::OK(); }
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node.cc index 67957ae..596b4ee 100644 --- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node.cc +++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node.cc
@@ -8,6 +8,7 @@ #include "core/layout/LayoutBlockFlow.h" #include "core/layout/LayoutObject.h" #include "core/layout/LayoutText.h" +#include "core/layout/api/LineLayoutAPIShim.h" #include "core/layout/line/LineInfo.h" #include "core/layout/line/RootInlineBox.h" #include "core/layout/ng/inline/ng_bidi_paragraph.h" @@ -148,6 +149,10 @@ if (inline_box->GetLineLayoutItem().IsBox()) { LineLayoutBox box(inline_box->GetLineLayoutItem()); box.SetLocation(inline_box->Location()); + + LayoutObject* layout_object = LineLayoutAPIShim::LayoutObjectFrom(box); + if (layout_object->IsAtomicInlineLevel()) + ToLayoutBox(layout_object)->SetInlineBoxWrapper(inline_box); } }
diff --git a/third_party/WebKit/Source/core/loader/EmptyClients.h b/third_party/WebKit/Source/core/loader/EmptyClients.h index a2ae83f..d6918dd 100644 --- a/third_party/WebKit/Source/core/loader/EmptyClients.h +++ b/third_party/WebKit/Source/core/loader/EmptyClients.h
@@ -57,6 +57,7 @@ #include "public/platform/WebScreenInfo.h" #include "public/platform/WebSpellCheckPanelHostClient.h" #include "public/platform/WebURLLoader.h" +#include "services/service_manager/public/cpp/interface_provider.h" #include "v8/include/v8.h" /* @@ -347,6 +348,10 @@ WebCookieJar* CookieJar() const override { return 0; } + service_manager::InterfaceProvider* GetInterfaceProvider() { + return &interface_provider_; + } + WebSpellCheckPanelHostClient* SpellCheckPanelHostClient() const override { return nullptr; } @@ -373,6 +378,7 @@ EmptyLocalFrameClient() {} ContentSettingsClient content_settings_client_; + service_manager::InterfaceProvider interface_provider_; }; class CORE_EXPORT EmptyTextCheckerClient : public TextCheckerClient {
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp index 730549d2..0776e3b 100644 --- a/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp +++ b/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
@@ -178,8 +178,8 @@ void SetFilterPolicy(WebDocumentSubresourceFilter::LoadPolicy policy) { document->Loader()->SetSubresourceFilter(SubresourceFilter::Create( - document->Loader(), WTF::MakeUnique<FixedPolicySubresourceFilter>( - policy, &filtered_load_callback_counter_))); + *document, WTF::MakeUnique<FixedPolicySubresourceFilter>( + policy, &filtered_load_callback_counter_))); } ResourceRequestBlockedReason CanRequest() {
diff --git a/third_party/WebKit/Source/core/loader/SubresourceFilter.cpp b/third_party/WebKit/Source/core/loader/SubresourceFilter.cpp index a5798747..3c622e9 100644 --- a/third_party/WebKit/Source/core/loader/SubresourceFilter.cpp +++ b/third_party/WebKit/Source/core/loader/SubresourceFilter.cpp
@@ -10,6 +10,8 @@ #include "core/dom/TaskRunnerHelper.h" #include "core/frame/LocalFrame.h" #include "core/inspector/ConsoleMessage.h" +#include "core/loader/DocumentLoader.h" +#include "core/workers/WorkerOrWorkletGlobalScope.h" #include "platform/WebTaskRunner.h" #include "platform/weborigin/KURL.h" #include "platform/wtf/text/StringBuilder.h" @@ -34,15 +36,15 @@ // static SubresourceFilter* SubresourceFilter::Create( - DocumentLoader* loader, + ExecutionContext& execution_context, std::unique_ptr<WebDocumentSubresourceFilter> filter) { - return new SubresourceFilter(loader, std::move(filter)); + return new SubresourceFilter(&execution_context, std::move(filter)); } SubresourceFilter::SubresourceFilter( - DocumentLoader* document_loader, + ExecutionContext* execution_context, std::unique_ptr<WebDocumentSubresourceFilter> subresource_filter) - : document_loader_(document_loader), + : execution_context_(execution_context), subresource_filter_(std::move(subresource_filter)) {} SubresourceFilter::~SubresourceFilter() {} @@ -62,6 +64,9 @@ } bool SubresourceFilter::AllowWebSocketConnection(const KURL& url) { + // Currently WebSocket is handled via document on the main thread. + DCHECK(execution_context_->IsDocument()); + WebDocumentSubresourceFilter::LoadPolicy load_policy = subresource_filter_->GetLoadPolicyForWebSocketConnect(url); @@ -69,8 +74,8 @@ // thread. Note that this unconditionally calls reportLoad unlike allowLoad, // because there aren't developer-invisible connections (like speculative // preloads) happening here. - RefPtr<WebTaskRunner> task_runner = TaskRunnerHelper::Get( - TaskType::kNetworking, document_loader_->GetFrame()); + RefPtr<WebTaskRunner> task_runner = + TaskRunnerHelper::Get(TaskType::kNetworking, execution_context_); DCHECK(task_runner->RunsTasksInCurrentSequence()); task_runner->PostTask(BLINK_FROM_HERE, WTF::Bind(&SubresourceFilter::ReportLoad, @@ -81,9 +86,6 @@ void SubresourceFilter::ReportLoad( const KURL& resource_url, WebDocumentSubresourceFilter::LoadPolicy load_policy) { - Document* document = document_loader_->GetFrame() - ? document_loader_->GetFrame()->GetDocument() - : nullptr; switch (load_policy) { case WebDocumentSubresourceFilter::kAllow: break; @@ -95,17 +97,28 @@ // document wide console message, so no need to log it here. // TODO: Consider logging this as a kInterventionMessageSource for showing // warning in Lighthouse. - if (document && subresource_filter_->ShouldLogToConsole()) { - document->AddConsoleMessage(ConsoleMessage::Create( + if (subresource_filter_->ShouldLogToConsole()) { + execution_context_->AddConsoleMessage(ConsoleMessage::Create( kOtherMessageSource, kErrorMessageLevel, GetErrorStringForDisallowedLoad(resource_url))); } // fall through case WebDocumentSubresourceFilter::kWouldDisallow: - document_loader_->DidObserveLoadingBehavior( - kWebLoadingBehaviorSubresourceFilterMatch); + // TODO(csharrison): Consider posting a task to the main thread from + // worker thread, or adding support for DidObserveLoadingBehavior to + // ExecutionContext. + if (execution_context_->IsDocument()) { + if (DocumentLoader* loader = ToDocument(execution_context_)->Loader()) { + loader->DidObserveLoadingBehavior( + kWebLoadingBehaviorSubresourceFilterMatch); + } + } break; } } +DEFINE_TRACE(SubresourceFilter) { + visitor->Trace(execution_context_); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/loader/SubresourceFilter.h b/third_party/WebKit/Source/core/loader/SubresourceFilter.h index 53c0bf3..1ee6c3d7 100644 --- a/third_party/WebKit/Source/core/loader/SubresourceFilter.h +++ b/third_party/WebKit/Source/core/loader/SubresourceFilter.h
@@ -8,7 +8,6 @@ #include <memory> #include "core/CoreExport.h" -#include "core/loader/DocumentLoader.h" #include "platform/heap/Handle.h" #include "platform/weborigin/SecurityViolationReportingPolicy.h" #include "public/platform/WebDocumentSubresourceFilter.h" @@ -16,6 +15,7 @@ namespace blink { +class ExecutionContext; class KURL; // Wrapper around a WebDocumentSubresourceFilter. This class will make it easier @@ -25,7 +25,7 @@ : public GarbageCollectedFinalized<SubresourceFilter> { public: static SubresourceFilter* Create( - DocumentLoader*, + ExecutionContext&, std::unique_ptr<WebDocumentSubresourceFilter>); ~SubresourceFilter(); @@ -34,16 +34,16 @@ SecurityViolationReportingPolicy); bool AllowWebSocketConnection(const KURL&); - DEFINE_INLINE_TRACE() { visitor->Trace(document_loader_); } + DECLARE_VIRTUAL_TRACE(); private: - SubresourceFilter(DocumentLoader*, + SubresourceFilter(ExecutionContext*, std::unique_ptr<WebDocumentSubresourceFilter>); void ReportLoad(const KURL& resource_url, WebDocumentSubresourceFilter::LoadPolicy); - Member<DocumentLoader> document_loader_; + Member<ExecutionContext> execution_context_; std::unique_ptr<WebDocumentSubresourceFilter> subresource_filter_; };
diff --git a/third_party/WebKit/Source/core/loader/WorkerFetchContext.cpp b/third_party/WebKit/Source/core/loader/WorkerFetchContext.cpp index 4160cfa2..815a9957 100644 --- a/third_party/WebKit/Source/core/loader/WorkerFetchContext.cpp +++ b/third_party/WebKit/Source/core/loader/WorkerFetchContext.cpp
@@ -8,6 +8,7 @@ #include "core/frame/Deprecation.h" #include "core/frame/UseCounter.h" #include "core/loader/MixedContentChecker.h" +#include "core/loader/SubresourceFilter.h" #include "core/probe/CoreProbes.h" #include "core/timing/WorkerGlobalScopePerformance.h" #include "core/workers/WorkerClients.h" @@ -87,6 +88,12 @@ TaskRunnerHelper::Get(TaskType::kUnspecedLoading, global_scope_)) { web_context_->InitializeOnWorkerThread( loading_task_runner_->ToSingleThreadTaskRunner()); + std::unique_ptr<blink::WebDocumentSubresourceFilter> web_filter = + web_context_->TakeSubresourceFilter(); + if (web_filter) { + subresource_filter_ = + SubresourceFilter::Create(global_scope, std::move(web_filter)); + } } KURL WorkerFetchContext::GetFirstPartyForCookies() const { @@ -104,8 +111,7 @@ } SubresourceFilter* WorkerFetchContext::GetSubresourceFilter() const { - // TODO(horo): Implement this. (https://crbug.com/739597) - return nullptr; + return subresource_filter_.Get(); } bool WorkerFetchContext::ShouldBlockRequestByInspector( @@ -336,6 +342,7 @@ DEFINE_TRACE(WorkerFetchContext) { visitor->Trace(global_scope_); + visitor->Trace(subresource_filter_); visitor->Trace(resource_fetcher_); BaseFetchContext::Trace(visitor); }
diff --git a/third_party/WebKit/Source/core/loader/WorkerFetchContext.h b/third_party/WebKit/Source/core/loader/WorkerFetchContext.h index 6cd9bea4..aef3b71 100644 --- a/third_party/WebKit/Source/core/loader/WorkerFetchContext.h +++ b/third_party/WebKit/Source/core/loader/WorkerFetchContext.h
@@ -13,6 +13,7 @@ namespace blink { class ResourceFetcher; +class SubresourceFilter; class WebTaskRunner; class WebURLLoader; class WebWorkerFetchContext; @@ -111,6 +112,7 @@ Member<WorkerOrWorkletGlobalScope> global_scope_; std::unique_ptr<WebWorkerFetchContext> web_context_; + Member<SubresourceFilter> subresource_filter_; Member<ResourceFetcher> resource_fetcher_; RefPtr<WebTaskRunner> loading_task_runner_; };
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp b/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp index f698bae..9169c14 100644 --- a/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp +++ b/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp
@@ -48,11 +48,22 @@ #include "v8/include/v8.h" namespace blink { + namespace { + // The amount of time to wait before informing the clients that the image has // been updated (in seconds). This effectively throttles invalidations that // result from new data arriving for this image. constexpr double kFlushDelaySeconds = 1.; + +bool HasServerLoFiResponseHeaders(const ResourceResponse& response) { + return response.HttpHeaderField("chrome-proxy-content-transform") + .Contains("empty-image") || + // Check for the legacy Server Lo-Fi response headers, since it's + // possible that an old Lo-Fi image could be served from the cache. + response.HttpHeaderField("chrome-proxy").Contains("q=low"); +} + } // namespace class ImageResource::ImageResourceInfoImpl final @@ -429,10 +440,17 @@ multipart_parser_ = new MultipartImageResourceParser( response, response.MultipartBoundary(), this); } + + // Notify the base class that a response has been received. Note that after + // this call, |GetResponse()| will represent the full effective + // ResourceResponse, while |response| might just be a revalidation response + // (e.g. a 304) with a partial set of updated headers that were folded into + // the cached response. Resource::ResponseReceived(response, std::move(handle)); + if (RuntimeEnabledFeatures::ClientHintsEnabled()) { device_pixel_ratio_header_value_ = - this->GetResponse() + GetResponse() .HttpHeaderField(HTTPNames::Content_DPR) .ToFloat(&has_device_pixel_ratio_header_value_); if (!has_device_pixel_ratio_header_value_ || @@ -444,9 +462,9 @@ if (placeholder_option_ == PlaceholderOption::kShowAndReloadPlaceholderAlways && - IsEntireResource(this->GetResponse())) { - if (this->GetResponse().HttpStatusCode() < 400 || - this->GetResponse().HttpStatusCode() >= 600) { + IsEntireResource(GetResponse())) { + if (GetResponse().HttpStatusCode() < 400 || + GetResponse().HttpStatusCode() >= 600) { // Don't treat a complete and broken image as a placeholder if the // response code is something other than a 4xx or 5xx error. // This is done to prevent reissuing the request in cases like @@ -457,9 +475,44 @@ placeholder_option_ = PlaceholderOption::kReloadPlaceholderOnDecodeError; } } + + if (HasServerLoFiResponseHeaders(GetResponse())) { + // Ensure that the PreviewsState bit for Server Lo-Fi is set iff Chrome + // received the appropriate Server Lo-Fi response headers for this image. + // + // Normally, the |kServerLoFiOn| bit should already be set if Server Lo-Fi + // response headers are coming back, but it's possible for legacy Lo-Fi + // images to be served from the cache even if Chrome isn't in Lo-Fi mode. + // This also serves as a nice last line of defence to ensure that Server + // Lo-Fi images can be reloaded to show the original even if e.g. a server + // bug causes Lo-Fi images to be sent when they aren't expected. + SetPreviewsState(GetResourceRequest().GetPreviewsState() | + WebURLRequest::kServerLoFiOn); + } else if (GetResourceRequest().GetPreviewsState() & + WebURLRequest::kServerLoFiOn) { + // If Chrome expects a Lo-Fi response, but the server decided to send the + // full image, then clear the Server Lo-Fi Previews state bit. + WebURLRequest::PreviewsState new_previews_state = + GetResourceRequest().GetPreviewsState(); + + new_previews_state &= ~WebURLRequest::kServerLoFiOn; + if (new_previews_state == WebURLRequest::kPreviewsUnspecified) + new_previews_state = WebURLRequest::kPreviewsOff; + + SetPreviewsState(new_previews_state); + } } bool ImageResource::ShouldShowPlaceholder() const { + if (RuntimeEnabledFeatures::ClientPlaceholdersForServerLoFiEnabled() && + (GetResourceRequest().GetPreviewsState() & + WebURLRequest::kServerLoFiOn)) { + // If the runtime feature is enabled, show Client Lo-Fi placeholder images + // in place of Server Lo-Fi responses. This is done so that all Lo-Fi images + // have a consistent appearance. + return true; + } + switch (placeholder_option_) { case PlaceholderOption::kShowAndReloadPlaceholderAlways: case PlaceholderOption::kShowAndDoNotReloadPlaceholder: @@ -486,27 +539,21 @@ return false; } -static bool IsLoFiImage(const ImageResource& resource) { - if (resource.IsLoaded()) { - return resource.GetResponse() - .HttpHeaderField("chrome-proxy-content-transform") - .Contains("empty-image") || - resource.GetResponse() - .HttpHeaderField("chrome-proxy") - .Contains("q=low"); - } - return resource.GetResourceRequest().GetPreviewsState() & - WebURLRequest::kServerLoFiOn; -} - void ImageResource::ReloadIfLoFiOrPlaceholderImage( ResourceFetcher* fetcher, ReloadLoFiOrPlaceholderPolicy policy) { if (policy == kReloadIfNeeded && !ShouldReloadBrokenPlaceholder()) return; + // If the image is loaded, then the |PreviewsState::kServerLoFiOn| bit should + // be set iff the image has Server Lo-Fi response headers. + DCHECK(!IsLoaded() || + HasServerLoFiResponseHeaders(GetResponse()) == + static_cast<bool>(GetResourceRequest().GetPreviewsState() & + WebURLRequest::kServerLoFiOn)); + if (placeholder_option_ == PlaceholderOption::kDoNotReloadPlaceholder && - !IsLoFiImage(*this)) + !(GetResourceRequest().GetPreviewsState() & WebURLRequest::kServerLoFiOn)) return; // Prevent clients and observers from being notified of completion while the
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp index 1d00e49..50f4449 100644 --- a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp +++ b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp
@@ -32,6 +32,7 @@ #include <memory> #include "core/loader/resource/MockImageResourceObserver.h" +#include "platform/RuntimeEnabledFeatures.h" #include "platform/SharedBuffer.h" #include "platform/exported/WrappedResourceResponse.h" #include "platform/graphics/BitmapImage.h" @@ -45,6 +46,7 @@ #include "platform/loader/testing/MockFetchContext.h" #include "platform/loader/testing/MockResourceClient.h" #include "platform/scheduler/test/fake_web_task_runner.h" +#include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h" #include "platform/testing/ScopedMockedURL.h" #include "platform/testing/TestingPlatformSupport.h" #include "platform/testing/UnitTestHelpers.h" @@ -343,6 +345,11 @@ return ResourceFetcher::Create(context, context->GetTaskRunner()); } +using ScopedClientPlaceholderForServerLoFiForTest = + ScopedRuntimeEnabledFeatureForTest< + RuntimeEnabledFeatures::ClientPlaceholdersForServerLoFiEnabled, + RuntimeEnabledFeatures::SetClientPlaceholdersForServerLoFiEnabled>; + TEST(ImageResourceTest, MultipartImage) { ResourceFetcher* fetcher = CreateFetcher(); KURL test_url(kParsedURLString, kTestURL); @@ -560,7 +567,23 @@ EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); } -TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderAfterFinished) { +class ImageResourceReloadTest : public ::testing::TestWithParam<bool> { + public: + ~ImageResourceReloadTest() override {} + + bool IsClientPlaceholderForServerLoFiEnabled() const { return GetParam(); } + + void SetUp() override { + scoped_show_placeholder_.reset( + new ScopedClientPlaceholderForServerLoFiForTest(GetParam())); + } + + private: + std::unique_ptr<ScopedClientPlaceholderForServerLoFiForTest> + scoped_show_placeholder_; +}; + +TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderAfterFinished) { KURL test_url(kParsedURLString, kTestURL); ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); ImageResource* image_resource = ImageResource::CreateForTest(test_url); @@ -589,7 +612,10 @@ // The observer should have been notified that the image load completed. EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); - EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); + EXPECT_NE(IsClientPlaceholderForServerLoFiEnabled(), + image_resource->GetContent()->GetImage()->IsBitmapImage()); + EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(), + image_resource->ShouldShowPlaceholder()); EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); EXPECT_EQ(kJpegImageHeight, image_resource->GetContent()->GetImage()->height()); @@ -604,7 +630,8 @@ WebCachePolicy::kBypassingCache, false); } -TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderAfterFinishedWithOldHeaders) { +TEST_P(ImageResourceReloadTest, + ReloadIfLoFiOrPlaceholderAfterFinishedWithOldHeaders) { KURL test_url(kParsedURLString, kTestURL); ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); ImageResource* image_resource = ImageResource::CreateForTest(test_url); @@ -632,7 +659,10 @@ // The observer should have been notified that the image load completed. EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); - EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); + EXPECT_NE(IsClientPlaceholderForServerLoFiEnabled(), + image_resource->GetContent()->GetImage()->IsBitmapImage()); + EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(), + image_resource->ShouldShowPlaceholder()); EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); EXPECT_EQ(kJpegImageHeight, image_resource->GetContent()->GetImage()->height()); @@ -647,8 +677,8 @@ WebCachePolicy::kBypassingCache, false); } -TEST(ImageResourceTest, - ReloadIfLoFiOrPlaceholderAfterFinishedWithoutLoFiHeaders) { +TEST_P(ImageResourceReloadTest, + ReloadIfLoFiOrPlaceholderAfterFinishedWithoutLoFiHeaders) { KURL test_url(kParsedURLString, kTestURL); ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); ResourceRequest request(test_url); @@ -693,7 +723,7 @@ EXPECT_TRUE(image_resource->IsLoaded()); } -TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) { +TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) { ResourceFetcher* fetcher = CreateFetcher(); KURL test_url(kParsedURLString, kTestURL); @@ -735,7 +765,39 @@ GetMemoryCache()->Remove(image_resource); } -TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) { +TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderBeforeResponse) { + KURL test_url(kParsedURLString, kTestURL); + ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); + + ResourceRequest request(test_url); + request.SetPreviewsState(WebURLRequest::kServerLoFiOn); + FetchParameters fetch_params(request); + ResourceFetcher* fetcher = CreateFetcher(); + + ImageResource* image_resource = ImageResource::Fetch(fetch_params, fetcher); + std::unique_ptr<MockImageResourceObserver> observer = + MockImageResourceObserver::Create(image_resource->GetContent()); + + EXPECT_FALSE(image_resource->ErrorOccurred()); + EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(), + image_resource->ShouldShowPlaceholder()); + + // Call reloadIfLoFiOrPlaceholderImage() while the image is still loading. + image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, + Resource::kReloadAlways); + + EXPECT_EQ(1, observer->ImageChangedCount()); + EXPECT_EQ(0, observer->ImageWidthOnLastImageChanged()); + // The observer should not have been notified of completion yet, since the + // image is still loading. + EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); + + TestThatReloadIsStartedThenServeReload( + test_url, image_resource, image_resource->GetContent(), observer.get(), + WebCachePolicy::kBypassingCache, false); +} + +TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderDuringResponse) { KURL test_url(kParsedURLString, kTestURL); ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); @@ -749,9 +811,13 @@ MockImageResourceObserver::Create(image_resource->GetContent()); // Send the image response. + ResourceResponse resource_response(test_url, "image/jpeg", sizeof(kJpegImage), + g_null_atom); + resource_response.AddHTTPHeaderField("chrome-proxy-content-transform", + "empty-image"); + image_resource->Loader()->DidReceiveResponse( - WrappedResourceResponse(ResourceResponse( - test_url, "image/jpeg", sizeof(kJpegImage), g_null_atom))); + WrappedResourceResponse(resource_response)); image_resource->Loader()->DidReceiveData( reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); @@ -761,7 +827,8 @@ EXPECT_EQ(1, observer->ImageChangedCount()); EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); - EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); + EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(), + image_resource->ShouldShowPlaceholder()); EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); EXPECT_EQ(kJpegImageHeight, image_resource->GetContent()->GetImage()->height()); @@ -781,7 +848,7 @@ WebCachePolicy::kBypassingCache, false); } -TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderForPlaceholder) { +TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderForPlaceholder) { KURL test_url(kParsedURLString, kTestURL); ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); @@ -805,6 +872,10 @@ WebCachePolicy::kBypassingCache, false); } +INSTANTIATE_TEST_CASE_P(/* no prefix */, + ImageResourceReloadTest, + ::testing::Bool()); + TEST(ImageResourceTest, SVGImage) { KURL url(kParsedURLString, "http://127.0.0.1:8000/foo"); ImageResource* image_resource = ImageResource::CreateForTest(url); @@ -1696,7 +1767,6 @@ // Send the image response. ResourceResponse resource_response(NullURL(), "image/jpeg", sizeof(kJpegImage2), g_null_atom); - resource_response.AddHTTPHeaderField("chrome-proxy", "q=low"); image_resource->ResponseReceived(resource_response, nullptr);
diff --git a/third_party/WebKit/Source/core/mojo/DEPS b/third_party/WebKit/Source/core/mojo/DEPS index e6eb1f8..a3ad469 100644 --- a/third_party/WebKit/Source/core/mojo/DEPS +++ b/third_party/WebKit/Source/core/mojo/DEPS
@@ -1,4 +1,3 @@ include_rules = [ "+mojo/public/cpp/system", - "+services/service_manager/public/cpp", ]
diff --git a/third_party/WebKit/Source/core/page/PagePopupClient.cpp b/third_party/WebKit/Source/core/page/PagePopupClient.cpp index c3debeb..a805691 100644 --- a/third_party/WebKit/Source/core/page/PagePopupClient.cpp +++ b/third_party/WebKit/Source/core/page/PagePopupClient.cpp
@@ -75,6 +75,25 @@ addLiteral("\"", data); } +void PagePopupClient::AddHTMLString(const String& str, SharedBuffer* data) { + StringBuilder builder; + builder.ReserveCapacity(str.length()); + for (unsigned i = 0; i < str.length(); ++i) { + if (str[i] == '&') { + builder.Append("&"); + } else if (str[i] == '<') { + builder.Append("<"); + } else if (str[i] == '\'') { + builder.Append("'"); + } else if (str[i] == '"') { + builder.Append("""); + } else { + builder.Append(str[i]); + } + } + AddString(builder.ToString(), data); +} + void PagePopupClient::AddProperty(const char* name, const String& value, SharedBuffer* data) {
diff --git a/third_party/WebKit/Source/core/page/PagePopupClient.h b/third_party/WebKit/Source/core/page/PagePopupClient.h index eacfa99..7a51d09a 100644 --- a/third_party/WebKit/Source/core/page/PagePopupClient.h +++ b/third_party/WebKit/Source/core/page/PagePopupClient.h
@@ -82,6 +82,7 @@ // Helper functions to be used in PagePopupClient::writeDocument(). static void AddString(const String&, SharedBuffer*); static void AddJavaScriptString(const String&, SharedBuffer*); + static void AddHTMLString(const String&, SharedBuffer*); static void AddProperty(const char* name, const String& value, SharedBuffer*); static void AddProperty(const char* name, int value, SharedBuffer*); static void AddProperty(const char* name, unsigned value, SharedBuffer*);
diff --git a/third_party/WebKit/Source/core/page/ValidationMessageOverlayDelegate.cpp b/third_party/WebKit/Source/core/page/ValidationMessageOverlayDelegate.cpp index a18f19f..0f69ad2 100644 --- a/third_party/WebKit/Source/core/page/ValidationMessageOverlayDelegate.cpp +++ b/third_party/WebKit/Source/core/page/ValidationMessageOverlayDelegate.cpp
@@ -163,12 +163,12 @@ ? "<div dir=ltr id=main-message>" : "<div dir=rtl id=main-message>", data); - PagePopupClient::AddString(message_, data); + PagePopupClient::AddHTMLString(message_, data); PagePopupClient::AddString(sub_message_dir_ == TextDirection::kLtr ? "</div><div dir=ltr id=sub-message>" : "</div><div dir=rtl id=sub-message>", data); - PagePopupClient::AddString(sub_message_, data); + PagePopupClient::AddHTMLString(sub_message_, data); PagePopupClient::AddString( "</div></main>" "<div id=outer-arrow-bottom></div>"
diff --git a/third_party/WebKit/Source/core/paint/FilterPainter.cpp b/third_party/WebKit/Source/core/paint/FilterPainter.cpp index c86f1a6..410ceea 100644 --- a/third_party/WebKit/Source/core/paint/FilterPainter.cpp +++ b/third_party/WebKit/Source/core/paint/FilterPainter.cpp
@@ -57,8 +57,9 @@ if (clip_rect.Rect() != painting_info.paint_dirty_rect || clip_rect.HasRadius()) { clip_recorder_ = WTF::WrapUnique(new LayerClipRecorder( - context, layer.GetLayoutObject(), DisplayItem::kClipLayerFilter, - clip_rect, painting_info.root_layer, LayoutPoint(), paint_flags)); + context, layer, DisplayItem::kClipLayerFilter, clip_rect, + painting_info.root_layer, LayoutPoint(), paint_flags, + layer.GetLayoutObject())); } if (!context.GetPaintController().DisplayItemConstructionIsDisabled()) {
diff --git a/third_party/WebKit/Source/core/paint/LayerClipRecorder.cpp b/third_party/WebKit/Source/core/paint/LayerClipRecorder.cpp index 9befa968..ddb33be 100644 --- a/third_party/WebKit/Source/core/paint/LayerClipRecorder.cpp +++ b/third_party/WebKit/Source/core/paint/LayerClipRecorder.cpp
@@ -16,15 +16,16 @@ namespace blink { LayerClipRecorder::LayerClipRecorder(GraphicsContext& graphics_context, - const LayoutBoxModelObject& layout_object, + const PaintLayer& paint_layer, DisplayItem::Type clip_type, const ClipRect& clip_rect, const PaintLayer* clip_root, const LayoutPoint& fragment_offset, PaintLayerFlags paint_flags, + const DisplayItemClient& client, BorderRadiusClippingRule rule) : graphics_context_(graphics_context), - layout_object_(layout_object), + client_(client), clip_type_(clip_type) { if (RuntimeEnabledFeatures::SlimmingPaintV2Enabled()) return; @@ -34,16 +35,16 @@ paint_flags & kPaintLayerPaintingAncestorClippingMaskPhase); Vector<FloatRoundedRect> rounded_rects; if (clip_root && (clip_rect.HasRadius() || painting_masks)) { - CollectRoundedRectClips(*layout_object.Layer(), clip_root, fragment_offset, + CollectRoundedRectClips(paint_layer, clip_root, fragment_offset, painting_masks, rule, rounded_rects); } graphics_context_.GetPaintController().CreateAndAppend<ClipDisplayItem>( - layout_object, clip_type_, snapped_clip_rect, rounded_rects); + client_, clip_type_, snapped_clip_rect, rounded_rects); } -static bool InContainingBlockChain(PaintLayer* start_layer, - PaintLayer* end_layer) { +static bool InContainingBlockChain(const PaintLayer* start_layer, + const PaintLayer* end_layer) { if (start_layer == end_layer) return true; @@ -60,7 +61,7 @@ } void LayerClipRecorder::CollectRoundedRectClips( - PaintLayer& paint_layer, + const PaintLayer& paint_layer, const PaintLayer* clip_root, const LayoutPoint& offset_within_layer, bool cross_composited_scrollers, @@ -70,9 +71,9 @@ // up our layer chain applying the clips from any layers with overflow. The // condition for being able to apply these clips is that the overflow object // be in our containing block chain so we check that also. - for (PaintLayer* layer = rule == kIncludeSelfForBorderRadius - ? &paint_layer - : paint_layer.Parent(); + for (const PaintLayer* layer = rule == kIncludeSelfForBorderRadius + ? &paint_layer + : paint_layer.Parent(); layer; layer = layer->Parent()) { // Composited scrolling layers handle border-radius clip in the compositor // via a mask layer. We do not want to apply a border-radius clip to the @@ -109,7 +110,7 @@ if (RuntimeEnabledFeatures::SlimmingPaintV2Enabled()) return; graphics_context_.GetPaintController().EndItem<EndClipDisplayItem>( - layout_object_, DisplayItem::ClipTypeToEndClipType(clip_type_)); + client_, DisplayItem::ClipTypeToEndClipType(clip_type_)); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/paint/LayerClipRecorder.h b/third_party/WebKit/Source/core/paint/LayerClipRecorder.h index 0a435ed3..62f33fd 100644 --- a/third_party/WebKit/Source/core/paint/LayerClipRecorder.h +++ b/third_party/WebKit/Source/core/paint/LayerClipRecorder.h
@@ -16,7 +16,6 @@ class ClipRect; class GraphicsContext; -class LayoutBoxModelObject; class CORE_EXPORT LayerClipRecorder { USING_FAST_MALLOC(LayerClipRecorder); @@ -43,12 +42,13 @@ // Would be nice to clean up this. explicit LayerClipRecorder( GraphicsContext&, - const LayoutBoxModelObject&, + const PaintLayer&, DisplayItem::Type, const ClipRect&, const PaintLayer* clip_root, const LayoutPoint& fragment_offset, PaintLayerFlags, + const DisplayItemClient&, BorderRadiusClippingRule = kIncludeSelfForBorderRadius); ~LayerClipRecorder(); @@ -64,7 +64,7 @@ // The BorderRadiusClippingRule defines whether clips on the PaintLayer itself // are included. Output is appended to rounded_rect_clips. static void CollectRoundedRectClips( - PaintLayer&, + const PaintLayer&, const PaintLayer* clip_root, const LayoutPoint& offset_within_layer, bool cross_composited_scrollers, @@ -73,7 +73,7 @@ private: GraphicsContext& graphics_context_; - const LayoutBoxModelObject& layout_object_; + const DisplayItemClient& client_; DisplayItem::Type clip_type_; };
diff --git a/third_party/WebKit/Source/core/paint/LayerClipRecorderTest.cpp b/third_party/WebKit/Source/core/paint/LayerClipRecorderTest.cpp index 46032cf..18c0a91 100644 --- a/third_party/WebKit/Source/core/paint/LayerClipRecorderTest.cpp +++ b/third_party/WebKit/Source/core/paint/LayerClipRecorderTest.cpp
@@ -31,9 +31,10 @@ LayoutRect rect(1, 1, 9, 9); ClipRect clip_rect(rect); LayerClipRecorder layer_clip_recorder( - context, layout_view.Compositor()->RootLayer()->GetLayoutObject(), + context, *layout_view.Compositor()->RootLayer(), DisplayItem::kClipLayerForeground, clip_rect, 0, LayoutPoint(), - PaintLayerFlags()); + PaintLayerFlags(), + layout_view.Compositor()->RootLayer()->GetLayoutObject()); } void DrawRectInClip(GraphicsContext& context, @@ -43,9 +44,10 @@ IntRect rect(1, 1, 9, 9); ClipRect clip_rect((LayoutRect(rect))); LayerClipRecorder layer_clip_recorder( - context, layout_view.Compositor()->RootLayer()->GetLayoutObject(), + context, *layout_view.Compositor()->RootLayer(), DisplayItem::kClipLayerForeground, clip_rect, 0, LayoutPoint(), - PaintLayerFlags()); + PaintLayerFlags(), + layout_view.Compositor()->RootLayer()->GetLayoutObject()); if (!LayoutObjectDrawingRecorder::UseCachedDrawingIfPossible( context, layout_view, phase)) { LayoutObjectDrawingRecorder drawing_recorder(context, layout_view, phase,
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp index 4ba3f1d..163f586 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp +++ b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
@@ -6,6 +6,7 @@ #include "core/frame/LocalFrameView.h" #include "core/layout/LayoutView.h" +#include "core/layout/compositing/CompositedLayerMapping.h" #include "core/paint/ClipPathClipper.h" #include "core/paint/FilterPainter.h" #include "core/paint/LayerClipRecorder.h" @@ -780,10 +781,11 @@ clip_rect_for_fragment.MoveBy(fragment.pagination_offset); clip_rect_for_fragment.Intersect(fragment.background_rect); if (NeedsToClip(painting_info, clip_rect_for_fragment, paint_flags)) { - clip_recorder.emplace(context, parent_layer->GetLayoutObject(), + clip_recorder.emplace(context, *parent_layer, DisplayItem::kClipLayerParent, clip_rect_for_fragment, painting_info.root_layer, - fragment.pagination_offset, paint_flags); + fragment.pagination_offset, paint_flags, + parent_layer->GetLayoutObject()); } } if (PaintFragmentByApplyingTransform(context, painting_info, paint_flags, @@ -924,11 +926,11 @@ Optional<LayerClipRecorder> clip_recorder; if (NeedsToClip(local_painting_info, fragment.background_rect, paint_flags)) { - clip_recorder.emplace(context, paint_layer_.GetLayoutObject(), - DisplayItem::kClipLayerOverflowControls, - fragment.background_rect, - local_painting_info.root_layer, - fragment.pagination_offset, paint_flags); + clip_recorder.emplace( + context, paint_layer_, DisplayItem::kClipLayerOverflowControls, + fragment.background_rect, local_painting_info.root_layer, + fragment.pagination_offset, paint_flags, + paint_layer_.GetLayoutObject()); } Optional<ScrollRecorder> scroll_recorder; @@ -959,6 +961,7 @@ ClipState clip_state) { DCHECK(paint_layer_.IsSelfPaintingLayer()); + DisplayItemClient* client = &paint_layer_.GetLayoutObject(); Optional<LayerClipRecorder> clip_recorder; if (clip_state != kHasClipped && painting_info.clip_to_dirty_rect && (NeedsToClip(painting_info, clip_rect, paint_flags) || @@ -978,6 +981,10 @@ // The ancestor is the thing that needs to clip, so do not include // this layer's clips. clipping_rule = LayerClipRecorder::kDoNotIncludeSelfForBorderRadius; + // The ancestor clipping mask may have a larger visual rect than + // paint_layer_, since it includes ancestor clips. + client = paint_layer_.GetCompositedLayerMapping() + ->AncestorClippingMaskLayer(); break; } default: @@ -985,10 +992,9 @@ break; } - clip_recorder.emplace(context, paint_layer_.GetLayoutObject(), clip_type, - clip_rect, painting_info.root_layer, - fragment.pagination_offset, paint_flags, - clipping_rule); + clip_recorder.emplace(context, paint_layer_, clip_type, clip_rect, + painting_info.root_layer, fragment.pagination_offset, + paint_flags, *client, clipping_rule); } // If we are painting a mask for any reason and we have already processed the @@ -996,7 +1002,7 @@ // We know that the mask just needs the area bounded by the clip rects to be // filled with black. if (clip_recorder && phase == kPaintPhaseClippingMask) { - FillMaskingFragment(context, clip_rect); + FillMaskingFragment(context, clip_rect, *client); return; } @@ -1063,11 +1069,11 @@ if (should_clip && NeedsToClip(local_painting_info, layer_fragments[0].foreground_rect, paint_flags)) { - clip_recorder.emplace(context, paint_layer_.GetLayoutObject(), - DisplayItem::kClipLayerForeground, - layer_fragments[0].foreground_rect, - local_painting_info.root_layer, - layer_fragments[0].pagination_offset, paint_flags); + clip_recorder.emplace( + context, paint_layer_, DisplayItem::kClipLayerForeground, + layer_fragments[0].foreground_rect, local_painting_info.root_layer, + layer_fragments[0].pagination_offset, paint_flags, + paint_layer_.GetLayoutObject()); clip_state = kHasClipped; } @@ -1226,15 +1232,15 @@ } void PaintLayerPainter::FillMaskingFragment(GraphicsContext& context, - const ClipRect& clip_rect) { - const LayoutObject& layout_object = paint_layer_.GetLayoutObject(); - if (LayoutObjectDrawingRecorder::UseCachedDrawingIfPossible( - context, layout_object, kPaintPhaseClippingMask)) + const ClipRect& clip_rect, + const DisplayItemClient& client) { + DisplayItem::Type type = + DisplayItem::PaintPhaseToDrawingType(kPaintPhaseClippingMask); + if (DrawingRecorder::UseCachedDrawingIfPossible(context, client, type)) return; IntRect snapped_clip_rect = PixelSnappedIntRect(clip_rect.Rect()); - LayoutObjectDrawingRecorder drawing_recorder( - context, layout_object, kPaintPhaseClippingMask, snapped_clip_rect); + DrawingRecorder drawing_recorder(context, client, type, snapped_clip_rect); context.FillRect(snapped_clip_rect, Color::kBlack); }
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerPainter.h b/third_party/WebKit/Source/core/paint/PaintLayerPainter.h index 771aaaa4..be10a76 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayerPainter.h +++ b/third_party/WebKit/Source/core/paint/PaintLayerPainter.h
@@ -14,6 +14,7 @@ namespace blink { class ClipRect; +class DisplayItemClient; class PaintLayer; class GraphicsContext; class LayoutPoint; @@ -136,7 +137,9 @@ const PaintLayerPaintingInfo&, PaintLayerFlags); - void FillMaskingFragment(GraphicsContext&, const ClipRect&); + void FillMaskingFragment(GraphicsContext&, + const ClipRect&, + const DisplayItemClient&); static bool NeedsToClip(const PaintLayerPaintingInfo& local_painting_info, const ClipRect&,
diff --git a/third_party/WebKit/Source/core/testing/DummyPageHolder.cpp b/third_party/WebKit/Source/core/testing/DummyPageHolder.cpp index d2a9797..0a20520 100644 --- a/third_party/WebKit/Source/core/testing/DummyPageHolder.cpp +++ b/third_party/WebKit/Source/core/testing/DummyPageHolder.cpp
@@ -46,18 +46,16 @@ const IntSize& initial_view_size, Page::PageClients* page_clients, LocalFrameClient* local_frame_client, - FrameSettingOverrideFunction setting_overrider, - InterfaceProvider* interface_provider) { - return WTF::WrapUnique( - new DummyPageHolder(initial_view_size, page_clients, local_frame_client, - setting_overrider, interface_provider)); + FrameSettingOverrideFunction setting_overrider) { + return WTF::WrapUnique(new DummyPageHolder( + initial_view_size, page_clients, local_frame_client, setting_overrider)); } -DummyPageHolder::DummyPageHolder(const IntSize& initial_view_size, - Page::PageClients* page_clients_argument, - LocalFrameClient* local_frame_client, - FrameSettingOverrideFunction setting_overrider, - InterfaceProvider* interface_provider) { +DummyPageHolder::DummyPageHolder( + const IntSize& initial_view_size, + Page::PageClients* page_clients_argument, + LocalFrameClient* local_frame_client, + FrameSettingOverrideFunction setting_overrider) { Page::PageClients page_clients; if (!page_clients_argument) { FillWithEmptyClients(page_clients); @@ -81,8 +79,7 @@ if (!local_frame_client_) local_frame_client_ = EmptyLocalFrameClient::Create(); - frame_ = LocalFrame::Create(local_frame_client_.Get(), *page_, nullptr, - interface_provider); + frame_ = LocalFrame::Create(local_frame_client_.Get(), *page_, nullptr); frame_->SetView(LocalFrameView::Create(*frame_, initial_view_size)); frame_->View()->GetPage()->GetVisualViewport().SetSize(initial_view_size); frame_->Init();
diff --git a/third_party/WebKit/Source/core/testing/DummyPageHolder.h b/third_party/WebKit/Source/core/testing/DummyPageHolder.h index 6c90565..b43f93d 100644 --- a/third_party/WebKit/Source/core/testing/DummyPageHolder.h +++ b/third_party/WebKit/Source/core/testing/DummyPageHolder.h
@@ -42,7 +42,6 @@ namespace blink { class Document; -class InterfaceProvider; class IntSize; class LocalFrame; class LocalFrameView; @@ -72,8 +71,7 @@ const IntSize& initial_view_size = IntSize(), Page::PageClients* = 0, LocalFrameClient* = nullptr, - FrameSettingOverrideFunction = nullptr, - InterfaceProvider* = nullptr); + FrameSettingOverrideFunction = nullptr); ~DummyPageHolder(); Page& GetPage() const; @@ -85,8 +83,7 @@ DummyPageHolder(const IntSize& initial_view_size, Page::PageClients*, LocalFrameClient*, - FrameSettingOverrideFunction setting_overrider, - InterfaceProvider* = nullptr); + FrameSettingOverrideFunction setting_overrider); Persistent<Page> page_;
diff --git a/third_party/WebKit/Source/core/testing/Internals.cpp b/third_party/WebKit/Source/core/testing/Internals.cpp index 7f678f2..73fae78a 100644 --- a/third_party/WebKit/Source/core/testing/Internals.cpp +++ b/third_party/WebKit/Source/core/testing/Internals.cpp
@@ -3414,4 +3414,8 @@ MemoryCoordinator::SetIsLowEndDeviceForTesting(is_low_end_device); } +bool Internals::isLowEndDevice() const { + return MemoryCoordinator::IsLowEndDevice(); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/testing/Internals.h b/third_party/WebKit/Source/core/testing/Internals.h index ca564bf9..ebbf5ca 100644 --- a/third_party/WebKit/Source/core/testing/Internals.h +++ b/third_party/WebKit/Source/core/testing/Internals.h
@@ -567,6 +567,8 @@ // Overrides if the device is low-end (low on memory). void setIsLowEndDevice(bool); + // Returns if the device is low-end. + bool isLowEndDevice() const; private: explicit Internals(ExecutionContext*);
diff --git a/third_party/WebKit/Source/core/testing/Internals.idl b/third_party/WebKit/Source/core/testing/Internals.idl index 5a9ef15..1a30806 100644 --- a/third_party/WebKit/Source/core/testing/Internals.idl +++ b/third_party/WebKit/Source/core/testing/Internals.idl
@@ -394,4 +394,5 @@ void crash(); void setIsLowEndDevice(boolean isLowEndDevice); + boolean isLowEndDevice(); };
diff --git a/third_party/WebKit/Source/core/timing/PerformanceTest.cpp b/third_party/WebKit/Source/core/timing/PerformanceTest.cpp index c26eb671..b1d87166 100644 --- a/third_party/WebKit/Source/core/timing/PerformanceTest.cpp +++ b/third_party/WebKit/Source/core/timing/PerformanceTest.cpp
@@ -45,7 +45,7 @@ auto* monitor = GetFrame()->GetPerformanceMonitor(); monitor->WillExecuteScript(GetDocument()); monitor->DidExecuteScript(); - monitor->DidProcessTask(nullptr, 0, 1); + monitor->DidProcessTask(0, 1); } LocalFrame* GetFrame() const { return &page_holder_->GetFrame(); }
diff --git a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp index 448d3ce..267fb29 100644 --- a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp +++ b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp
@@ -36,7 +36,7 @@ #include "core/HTMLNames.h" #include "core/XMLNSNames.h" #include "core/dom/CDATASection.h" -#include "core/dom/ClassicScript.h" +#include "core/dom/ClassicPendingScript.h" #include "core/dom/Comment.h" #include "core/dom/Document.h" #include "core/dom/DocumentFragment.h" @@ -1136,18 +1136,10 @@ if (script_loader->ReadyToBeParserExecuted()) { // 5th Clause, Step 23 of https://html.spec.whatwg.org/#prepare-a-script - switch (script_loader->ExecuteScript(ClassicScript::Create( - ScriptSourceCode(script_element_base->TextFromChildren(), - GetDocument()->Url(), script_start_position_)))) { - case ScriptLoader::ExecuteScriptResult::kShouldFireErrorEvent: - script_loader->DispatchErrorEvent(); - return; - case ScriptLoader::ExecuteScriptResult::kShouldFireLoadEvent: - // The load event is not fired because this is an inline script. - break; - case ScriptLoader::ExecuteScriptResult::kShouldFireNone: - break; - } + script_loader->ExecuteScriptBlock( + ClassicPendingScript::Create(script_element_base, + script_start_position_), + GetDocument()->Url()); } else if (script_loader->WillBeParserExecuted()) { // 1st/2nd Clauses, Step 23 of // https://html.spec.whatwg.org/#prepare-a-script
diff --git a/third_party/WebKit/Source/devtools/front_end/accessibility/ARIAConfig.js b/third_party/WebKit/Source/devtools/front_end/accessibility/ARIAConfig.js index 217f6e7..909b0136 100644 --- a/third_party/WebKit/Source/devtools/front_end/accessibility/ARIAConfig.js +++ b/third_party/WebKit/Source/devtools/front_end/accessibility/ARIAConfig.js
@@ -1,3 +1,7 @@ +// Copyright 2017 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. + Accessibility.ARIAMetadata._config = { 'attributes': { 'aria-activedescendant': {'type': 'IDREF'}, @@ -5,31 +9,46 @@ 'aria-autocomplete': {'default': 'none', 'enum': ['inline', 'list', 'both', 'none'], 'type': 'token'}, 'aria-busy': {'default': 'false', 'type': 'boolean'}, 'aria-checked': {'default': 'undefined', 'enum': ['true', 'false', 'mixed', 'undefined'], 'type': 'token'}, + 'aria-colcount': {'type': 'integer'}, + 'aria-colindex': {'type': 'integer'}, + 'aria-colspan': {'type': 'integer'}, 'aria-controls': {'type': 'IDREF_list'}, + 'aria-current': + {'default': 'false', 'enum': ['page', 'step', 'location', 'date', 'time', 'true', 'false'], 'type': 'token'}, 'aria-describedby': {'type': 'IDREF_list'}, + 'aria-details': {'type': 'IDREF'}, 'aria-disabled': {'default': 'false', 'type': 'boolean'}, 'aria-dropeffect': {'default': 'none', 'enum': ['copy', 'move', 'link', 'execute', 'popup', 'none'], 'type': 'token_list'}, + 'aria-errormessage': {'type': 'IDREF'}, 'aria-expanded': {'default': 'undefined', 'enum': ['true', 'false', 'undefined'], 'type': 'token'}, 'aria-flowto': {'type': 'IDREF_list'}, 'aria-grabbed': {'default': 'undefined', 'enum': ['true', 'false', 'undefined'], 'type': 'token'}, - 'aria-haspopup': {'default': 'false', 'type': 'boolean'}, - 'aria-hidden': {'default': 'false', 'type': 'boolean'}, + 'aria-haspopup': + {'default': 'false', 'enum': ['false', 'true', 'menu', 'listbox', 'tree', 'grid', 'dialog'], 'type': 'token'}, + 'aria-hidden': {'default': 'undefined', 'enum': ['true', 'false', 'undefined'], 'type': 'token'}, 'aria-invalid': {'default': 'false', 'enum': ['grammar', 'false', 'spelling', 'true'], 'type': 'token'}, + 'aria-keyshortcuts': {'type': 'string'}, 'aria-label': {'type': 'string'}, 'aria-labelledby': {'type': 'IDREF_list'}, 'aria-level': {'type': 'integer'}, 'aria-live': {'default': 'off', 'enum': ['off', 'polite', 'assertive'], 'type': 'token'}, + 'aria-modal': {'default': 'false', 'type': 'boolean'}, 'aria-multiline': {'default': 'false', 'type': 'boolean'}, 'aria-multiselectable': {'default': 'false', 'type': 'boolean'}, - 'aria-orientation': {'default': 'vertical', 'enum': ['horizontal', 'vertical'], 'type': 'token'}, + 'aria-orientation': {'default': 'undefined', 'enum': ['horizontal', 'undefined', 'vertical'], 'type': 'token'}, 'aria-owns': {'type': 'IDREF_list'}, + 'aria-placeholder': {'type': 'string'}, 'aria-posinset': {'type': 'integer'}, 'aria-pressed': {'default': 'undefined', 'enum': ['true', 'false', 'mixed', 'undefined'], 'type': 'token'}, 'aria-readonly': {'default': 'false', 'type': 'boolean'}, 'aria-relevant': {'default': 'additions text', 'enum': ['additions', 'removals', 'text', 'all'], 'type': 'token_list'}, 'aria-required': {'default': 'false', 'type': 'boolean'}, + 'aria-roledescription': {'type': 'string'}, + 'aria-rowcount': {'type': 'integer'}, + 'aria-rowindex': {'type': 'integer'}, + 'aria-rowspan': {'type': 'integer'}, 'aria-selected': {'default': 'undefined', 'enum': ['true', 'false', 'undefined'], 'type': 'token'}, 'aria-setsize': {'type': 'integer'}, 'aria-sort': {'default': 'none', 'enum': ['ascending', 'descending', 'none', 'other'], 'type': 'token'}, @@ -40,29 +59,56 @@ 'tabindex': {'type': 'integer'} }, 'roles': { - 'alert': {'nameFrom': ['author'], 'superclasses': ['region']}, - 'alertdialog': {'nameFrom': ['author'], 'superclasses': ['alert', 'dialog']}, - 'application': {'nameFrom': ['author'], 'superclasses': ['landmark']}, - 'article': {'nameFrom': ['author'], 'superclasses': ['document', 'region']}, + 'alert': { + 'nameFrom': ['author'], + 'superclasses': ['section'], + 'implicitValues': {'aria-live': 'assertive', 'aria-atomic': 'true'} + }, + 'alertdialog': {'nameFrom': ['author'], 'superclasses': ['alert', 'dialog'], 'nameRequired': true}, + 'application': {'nameFrom': ['author'], 'superclasses': ['structure'], 'nameRequired': true}, + 'article': { + 'nameFrom': ['author'], + 'superclasses': ['document'], + 'supportedAttributes': ['aria-posinset', 'aria-setsize'] + }, 'banner': {'nameFrom': ['author'], 'superclasses': ['landmark']}, 'button': { 'nameFrom': ['contents', 'author'], 'superclasses': ['command'], - 'supportedAttributes': ['aria-expanded', 'aria-pressed'] + 'supportedAttributes': ['aria-expanded', 'aria-pressed'], + 'nameRequired': true, + 'childrenPresentational': true }, - 'checkbox': {'nameFrom': ['contents', 'author'], 'requiredAttributes': ['aria-checked'], 'superclasses': ['input']}, + 'cell': { + 'namefrom': ['contents', 'author'], + 'scope': 'row', + 'superclasses': ['section'], + 'supportedAttributes': ['aria-colindex', 'aria-colspan', 'aria-rowindex', 'aria-rowspan'] + }, + 'checkbox': { + 'nameFrom': ['contents', 'author'], + 'requiredAttributes': ['aria-checked'], + 'superclasses': ['input'], + 'supportedAttributes': ['aria-readonly'], + 'nameRequired': true, + 'implicitValues': {'aria-checked': false} + }, 'columnheader': { 'nameFrom': ['contents', 'author'], 'scope': ['row'], 'superclasses': ['gridcell', 'sectionhead', 'widget'], - 'supportedAttributes': ['aria-sort'] + 'supportedAttributes': ['aria-sort'], + 'nameRequired': true }, 'combobox': { - 'mustContain': ['listbox', 'textbox'], + // TODO(aboxhall): Follow up with Nektarios and Aaron regarding role on textbox + 'mustContain': ['textbox'], 'nameFrom': ['author'], - 'requiredAttributes': ['aria-expanded'], + 'requiredAttributes': ['aria-controls', 'aria-expanded'], 'superclasses': ['select'], - 'supportedAttributes': ['aria-autocomplete', 'aria-required'] + 'supportedAttributes': ['aria-autocomplete', 'aria-readonly', 'aria-required'], + 'nameRequired': true, + 'implicitValues': {'aria-expanded': 'false', 'aria-haspopup': 'listbox'} }, 'command': {'abstract': true, 'nameFrom': ['author'], 'superclasses': ['widget']}, 'complementary': {'nameFrom': ['author'], 'superclasses': ['landmark']}, @@ -74,74 +120,151 @@ }, 'contentinfo': {'nameFrom': ['author'], 'superclasses': ['landmark']}, 'definition': {'nameFrom': ['author'], 'superclasses': ['section']}, - 'dialog': {'nameFrom': ['author'], 'superclasses': ['window']}, - 'directory': {'nameFrom': ['contents', 'author'], 'superclasses': ['list']}, - 'document': {'nameFrom': ['author'], 'superclasses': ['structure'], 'supportedAttributes': ['aria-expanded']}, + 'dialog': {'nameFrom': ['author'], 'superclasses': ['window'], 'nameRequired': true}, + 'directory': {'nameFrom': ['author'], 'superclasses': ['list']}, + 'document': { + 'nameFrom': ['author'], + 'superclasses': ['structure'], + 'supportedAttributes': ['aria-expanded'], + 'nameRequired': false + }, + 'feed': {'nameFrom': ['author'], 'superclasses': ['list'], 'mustContain': ['article'], 'nameRequired': false}, + 'figure': {'namefrom': ['author'], 'superclasses': ['section'], 'nameRequired': false}, 'form': {'nameFrom': ['author'], 'superclasses': ['landmark']}, 'grid': { - 'mustContain': ['row', 'rowgroup', 'row'], 'nameFrom': ['author'], - 'superclasses': ['composite', 'region'], - 'supportedAttributes': ['aria-level', 'aria-multiselectable', 'aria-readonly'] + 'superclasses': ['composite', 'table'], + // TODO(aboxhall): Figure out how to express "rowgroup --> row" here. + 'mustContain': ['row'], + 'supportedAttributes': ['aria-level', 'aria-multiselectable', 'aria-readonly'], + 'nameRequired': true }, 'gridcell': { 'nameFrom': ['contents', 'author'], 'scope': ['row'], - 'superclasses': ['section', 'widget'], - 'supportedAttributes': ['aria-readonly', 'aria-required', 'aria-selected'] + 'superclasses': ['cell', 'widget'], + 'supportedAttributes': ['aria-readonly', 'aria-required', 'aria-selected'], + 'nameRequired': true }, 'group': {'nameFrom': ['author'], 'superclasses': ['section'], 'supportedAttributes': ['aria-activedescendant']}, - 'heading': {'superclasses': ['sectionhead'], 'supportedAttributes': ['aria-level']}, - 'img': {'nameFrom': ['author'], 'superclasses': ['section']}, + 'heading': { + 'namefrom': ['contents', 'author'], + 'superclasses': ['sectionhead'], + 'supportedAttributes': ['aria-level'], + 'nameRequired': true, + 'implicitValues': {'aria-level': '2'} + }, + 'img': {'nameFrom': ['author'], 'superclasses': ['section'], 'nameRequired': true, 'childrenPresentational': true}, 'input': {'abstract': true, 'nameFrom': ['author'], 'superclasses': ['widget']}, - 'landmark': {'abstract': true, 'nameFrom': ['contents', 'author'], 'superclasses': ['region']}, - 'link': {'nameFrom': ['contents', 'author'], 'superclasses': ['command'], 'supportedAttributes': ['aria-expanded']}, - 'list': {'mustContain': ['group', 'listitem', 'listitem'], 'nameFrom': ['author'], 'superclasses': ['region']}, - 'listbox': { - 'mustContain': ['option'], + 'landmark': {'abstract': true, 'nameFrom': ['author'], 'superclasses': ['section'], 'nameRequired': false}, + 'link': { + 'nameFrom': ['contents', 'author'], + 'superclasses': ['command'], + 'supportedAttributes': ['aria-expanded'], + 'nameRequired': true + }, + 'list': { + // TODO(aboxhall): Figure out how to express "group --> listitem" + 'mustContain': ['listitem'], 'nameFrom': ['author'], - 'superclasses': ['list', 'select'], - 'supportedAttributes': ['aria-multiselectable', 'aria-required'] + 'superclasses': ['section'], + 'implicitValues': {'aria-orientation': 'vertical'} + }, + 'listbox': { + 'nameFrom': ['author'], + 'superclasses': ['select'], + 'mustContain': ['option'], + 'supportedAttributes': ['aria-multiselectable', 'aria-readonly', 'aria-required'], + 'nameRequired': true, + 'implicitValues': {'aria-orientation': 'vertical'}, }, 'listitem': { - 'nameFrom': ['contents', 'author'], - 'scope': ['list'], + 'nameFrom': ['author'], 'superclasses': ['section'], + 'scope': ['group', 'list'], 'supportedAttributes': ['aria-level', 'aria-posinset', 'aria-setsize'] }, - 'log': {'nameFrom': ['author'], 'superclasses': ['region']}, + 'log': { + 'nameFrom': ['author'], + 'superclasses': ['section'], + 'nameRequired': true, + 'implicitValues': {'aria-live': 'polite'} + }, 'main': {'nameFrom': ['author'], 'superclasses': ['landmark']}, - 'marquee': {'superclasses': ['section']}, - 'math': {'nameFrom': ['author'], 'superclasses': ['section']}, + 'marquee': {'nameFrom': ['author'], 'superclasses': ['section'], 'nameRequired': true}, + 'math': { + 'nameFrom': ['author'], + 'superclasses': ['section'], + 'nameRequired': true, + // TODO(aboxhall/aleventhal): this is what the spec says, but seems wrong. + childrenPresentational: true + }, 'menu': { 'mustContain': ['group', 'menuitemradio', 'menuitem', 'menuitemcheckbox', 'menuitemradio'], 'nameFrom': ['author'], - 'superclasses': ['list', 'select'] + 'superclasses': ['select'], + 'implicitValues': {'aria-orientation': 'vertical'} }, - 'menubar': {'nameFrom': ['author'], 'superclasses': ['menu']}, - 'menuitem': {'nameFrom': ['contents', 'author'], 'scope': ['menu', 'menubar'], 'superclasses': ['command']}, - 'menuitemcheckbox': - {'nameFrom': ['contents', 'author'], 'scope': ['menu', 'menubar'], 'superclasses': ['checkbox', 'menuitem']}, - 'menuitemradio': { + 'menubar': { + 'nameFrom': ['author'], + 'superclasses': ['menu'], + // TODO(aboxhall): figure out how to express "group --> {menuitem, menuitemradio, menuitemcheckbox}" + 'mustContain': ['menuitem', 'menuitemradio', 'menuitemcheckbox'], + 'implicitValues': {'aria-orientation': 'horizontal'} + }, + 'menuitem': { + 'nameFrom': ['contents', 'author'], + 'scope': ['group', 'menu', 'menubar'], + 'superclasses': ['command'], + 'nameRequired': true + }, + 'menuitemcheckbox': { 'nameFrom': ['contents', 'author'], 'scope': ['menu', 'menubar'], - 'superclasses': ['menuitemcheckbox', 'radio'] + 'superclasses': ['checkbox', 'menuitem'], + 'nameRequired': true, + 'childrenPresentational': true, + 'implicitValues': {'aria-checked': false} + }, + 'menuitemradio': { + 'nameFrom': ['contents', 'author'], + 'scope': ['menu', 'menubar', 'group'], + 'superclasses': ['menuitemcheckbox', 'radio'], + 'nameRequired': true, + 'childrenPresentational': true, + 'implicitValues': {'aria-checked': false} }, 'navigation': {'nameFrom': ['author'], 'superclasses': ['landmark']}, + 'none': {'superclasses': ['structure']}, 'note': {'nameFrom': ['author'], 'superclasses': ['section']}, 'option': { 'nameFrom': ['contents', 'author'], + 'scope': ['listbox'], 'superclasses': ['input'], - 'supportedAttributes': ['aria-checked', 'aria-posinset', 'aria-selected', 'aria-setsize'] + 'requiredAttributes': ['aria-selected'], + 'supportedAttributes': ['aria-checked', 'aria-posinset', 'aria-setsize'], + 'nameRequired': true, + 'childrenPresentational': true, + 'implicitValues': {'aria-selected': 'false'} }, 'presentation': {'superclasses': ['structure']}, - 'progressbar': {'nameFrom': ['author'], 'superclasses': ['range']}, - 'radio': {'nameFrom': ['contents', 'author'], 'superclasses': ['checkbox', 'option']}, + 'progressbar': + {'nameFrom': ['author'], 'superclasses': ['range'], 'nameRequired': true, 'childrenPresentational': true}, + 'radio': { + 'nameFrom': ['contents', 'author'], + 'superclasses': ['input'], + 'requiredAttributes': ['aria-checked'], + 'supportedAttributes': ['aria-posinset', 'aria-setsize'], + 'nameRequired': true, + 'childrenPresentational': true, + 'implicitValues': {'aria-checked': 'false'} + }, 'radiogroup': { - 'mustContain': ['radio'], 'nameFrom': ['author'], 'superclasses': ['select'], - 'supportedAttributes': ['aria-required'] + 'mustContain': ['radio'], + 'supportedAttributes': ['aria-readonly', 'aria-required'], + 'nameRequired': true }, 'range': { 'abstract': true, @@ -149,105 +272,169 @@ 'superclasses': ['widget'], 'supportedAttributes': ['aria-valuemax', 'aria-valuemin', 'aria-valuenow', 'aria-valuetext'] }, - 'region': {'nameFrom': ['author'], 'superclasses': ['section']}, + 'region': {'nameFrom': ['author'], 'superclasses': ['landmark'], 'nameRequired': true}, 'roletype': { 'abstract': true, 'supportedAttributes': [ - 'aria-atomic', 'aria-busy', 'aria-controls', 'aria-describedby', 'aria-disabled', 'aria-dropeffect', - 'aria-flowto', 'aria-grabbed', 'aria-haspopup', 'aria-hidden', 'aria-invalid', 'aria-label', 'aria-labelledby', - 'aria-live', 'aria-owns', 'aria-relevant' + 'aria-atomic', 'aria-busy', 'aria-controls', 'aria-current', 'aria-describedby', 'aria-details', + 'aria-disabled', 'aria-dropeffect', 'aria-errormessage', 'aria-flowto', 'aria-grabbed', 'aria-haspopup', + 'aria-hidden', 'aria-invalid', 'aria-keyshortcuts', 'aria-label', 'aria-labelledby', 'aria-live', + 'aria-owns', 'aria-relevant', 'aria-roledescription' ] }, 'row': { - 'mustContain': ['columnheader', 'gridcell', 'rowheader'], 'nameFrom': ['contents', 'author'], - 'scope': ['grid', 'rowgroup', 'treegrid'], 'superclasses': ['group', 'widget'], - 'supportedAttributes': ['aria-level', 'aria-selected'] + 'mustContain': ['cell', 'columnheader', 'gridcell', 'rowheader'], + 'scope': ['grid', 'rowgroup', 'table', 'treegrid'], + // TODO(aboxhall/aleventhal): This is not in the spec yet, but + // setsize and posinset are included here for treegrid + // purposes. Issue already filed on spec. Remove this comment + // when spec updated. + 'supportedAttributes': + ['aria-colindex', 'aria-level', 'aria-rowindex', 'aria-selected', 'aria-setsize', 'aria-posinset'] }, - 'rowgroup': - {'mustContain': ['row'], 'nameFrom': ['contents', 'author'], 'scope': ['grid'], 'superclasses': ['group']}, + 'rowgroup': { + 'nameFrom': ['contents', 'author'], + 'superclasses': ['structure'], + 'mustContain': ['row'], + 'scope': ['grid', 'table', 'treegrid'], + }, 'rowheader': { 'nameFrom': ['contents', 'author'], 'scope': ['row'], - 'superclasses': ['gridcell', 'sectionhead', 'widget'], - 'supportedAttributes': ['aria-sort'] + 'superclasses': ['cell', 'gridcell', 'sectionhead'], + 'supportedAttributes': ['aria-sort'], + 'nameRequired': true }, 'scrollbar': { 'nameFrom': ['author'], 'requiredAttributes': ['aria-controls', 'aria-orientation', 'aria-valuemax', 'aria-valuemin', 'aria-valuenow'], - 'superclasses': ['input', 'range'] + 'superclasses': ['range'], + 'nameRequired': false, + 'childrenPresentational': true, + 'implicitValues': {'aria-orientation': 'vertical', 'aria-valuemin': '0', 'aria-valuemax': '100'} }, 'search': {'nameFrom': ['author'], 'superclasses': ['landmark']}, - 'section': { - 'abstract': true, - 'nameFrom': ['contents', 'author'], - 'superclasses': ['structure'], - 'supportedAttributes': ['aria-expanded'] - }, + 'searchbox': {'nameFrom': ['author'], 'superclasses': ['textbox'], 'nameRequired': true}, + 'section': {'abstract': true, 'superclasses': ['structure'], 'supportedAttributes': ['aria-expanded']}, 'sectionhead': { 'abstract': true, 'nameFrom': ['contents', 'author'], 'superclasses': ['structure'], 'supportedAttributes': ['aria-expanded'] }, - 'select': {'abstract': true, 'nameFrom': ['author'], 'superclasses': ['composite', 'group', 'input']}, + 'select': {'abstract': true, 'nameFrom': ['author'], 'superclasses': ['composite', 'group']}, 'separator': { 'nameFrom': ['author'], + // TODO(aboxhall): superclass depends on focusability, but + // doesn't affect required/supported attributes 'superclasses': ['structure'], - 'supportedAttributes': ['aria-expanded', 'aria-orientation'] + // TODO(aboxhall): required attributes depend on focusability + 'supportedAttributes': ['aria-orientation', 'aria-valuemin', 'aria-valuemax', 'aria-valuenow', 'aria-valuetext'] }, 'slider': { 'nameFrom': ['author'], 'requiredAttributes': ['aria-valuemax', 'aria-valuemin', 'aria-valuenow'], 'superclasses': ['input', 'range'], - 'supportedAttributes': ['aria-orientation'] + 'supportedAttributes': ['aria-orientation'], + 'nameRequired': true, + 'childrenPresentational': true, + // TODO(aboxhall): aria-valuenow default is halfway between + // aria-valuemin and aria-valuemax + 'implicitValues': {'aria-orientation': 'horizontal', 'aria-valuemin': '0', 'aria-valuemax': '100'} }, 'spinbutton': { 'nameFrom': ['author'], 'requiredAttributes': ['aria-valuemax', 'aria-valuemin', 'aria-valuenow'], - 'superclasses': ['input', 'range'], - 'supportedAttributes': ['aria-required'] + 'superclasses': ['composite', 'input', 'range'], + 'supportedAttributes': ['aria-required', 'aria-readonly'], + 'nameRequired': true, + 'implicitValues': {'aria-valuenow': '0'} }, - 'status': {'superclasses': ['region']}, + 'status': { + 'nameFrom': ['author'], + 'superclasses': ['section'], + 'implicitValues': {'aria-live': 'polite', 'aria-atomic': 'true'} + }, 'structure': {'abstract': true, 'superclasses': ['roletype']}, + 'switch': { + 'nameFrom': ['contents', 'author'], + 'superclasses': ['checkbox'], + 'requiredAttributes': ['aria-checked'], + 'nameRequired': true, + 'childrenPresentational': true, + 'implicitValues': {'aria-checked': 'false'} + }, 'tab': { 'nameFrom': ['contents', 'author'], 'scope': ['tablist'], 'superclasses': ['sectionhead', 'widget'], - 'supportedAttributes': ['aria-selected'] + 'supportedAttributes': ['aria-selected'], + 'childrenPresentational': true, + 'implicitValues': {'aria-selected': 'false'} + }, + 'table': { + 'nameFrom': ['author'], + 'superclasses': ['section'], + // TODO(aboxhall): Figure out how to express "rowgroup --> row" + 'mustContain': ['row'], + 'supportedAttributes': ['aria-colcount', 'aria-rowcount'], + 'nameRequired': true }, 'tablist': { - 'mustContain': ['tab'], 'nameFrom': ['author'], - 'superclasses': ['composite', 'directory'], - 'supportedAttributes': ['aria-level'] + 'superclasses': ['composite'], + 'mustContain': ['tab'], + 'supportedAttributes': ['aria-level', 'aria-multiselectable', 'aria-orientation'], + 'implicitValues': {'aria-orientation': 'horizontal'} }, - 'tabpanel': {'nameFrom': ['author'], 'superclasses': ['region']}, + 'tabpanel': {'nameFrom': ['author'], 'superclasses': ['section'], 'nameRequired': true}, + 'term': {'nameFrom': ['author'], 'superclasses': ['section']}, 'textbox': { 'nameFrom': ['author'], 'superclasses': ['input'], - 'supportedAttributes': - ['aria-activedescendant', 'aria-autocomplete', 'aria-multiline', 'aria-readonly', 'aria-required'] + 'supportedAttributes': [ + 'aria-activedescendant', 'aria-autocomplete', 'aria-multiline', 'aria-placeholder', 'aria-readonly', + 'aria-required' + ], + 'nameRequired': true }, 'timer': {'nameFrom': ['author'], 'superclasses': ['status']}, - 'toolbar': {'nameFrom': ['author'], 'superclasses': ['group']}, - 'tooltip': {'superclasses': ['section']}, - 'tree': { - 'mustContain': ['group', 'treeitem', 'treeitem'], + 'toolbar': { 'nameFrom': ['author'], - 'superclasses': ['select'], - 'supportedAttributes': ['aria-multiselectable', 'aria-required'] + 'superclasses': ['group'], + 'supportedAttributes': ['aria-orientation'], + 'implicitValues': {'aria-orientation': 'horizontal'} }, - 'treegrid': {'mustContain': ['row'], 'nameFrom': ['author'], 'superclasses': ['grid', 'tree']}, - 'treeitem': - {'nameFrom': ['contents', 'author'], 'scope': ['group', 'tree'], 'superclasses': ['listitem', 'option']}, + 'tooltip': {'nameFrom': ['contents', 'author'], 'superclasses': ['section'], 'nameRequired': true}, + 'tree': { + 'nameFrom': ['author'], + 'mustContain': ['group', 'treeitem'], + 'superclasses': ['select'], + 'supportedAttributes': ['aria-multiselectable', 'aria-required'], + 'nameRequired': true, + 'implicitValues': {'aria-orientation': 'vertical'} + }, + 'treegrid': { + // TODO(aboxhall): Figure out how to express "rowgroup --> row" + 'mustContain': ['row'], + 'nameFrom': ['author'], + 'superclasses': ['grid', 'tree'], + 'nameRequired': true + }, + 'treeitem': { + 'nameFrom': ['contents', 'author'], + 'scope': ['group', 'tree'], + 'superclasses': ['listitem', 'option'], + 'nameRequired': true + }, 'widget': {'abstract': true, 'superclasses': ['roletype']}, 'window': { 'abstract': true, 'nameFrom': ['author'], 'superclasses': ['roletype'], - 'supportedAttributes': ['aria-expanded'] + 'supportedAttributes': ['aria-expanded', 'aria-modal'] } } };
diff --git a/third_party/WebKit/Source/devtools/front_end/accessibility/AXBreadcrumbsPane.js b/third_party/WebKit/Source/devtools/front_end/accessibility/AXBreadcrumbsPane.js index 72de23e..054cef0a 100644 --- a/third_party/WebKit/Source/devtools/front_end/accessibility/AXBreadcrumbsPane.js +++ b/third_party/WebKit/Source/devtools/front_end/accessibility/AXBreadcrumbsPane.js
@@ -10,6 +10,7 @@ super(Common.UIString('Accessibility Tree')); this.element.classList.add('ax-subpane'); + UI.ARIAUtils.markAsTree(this.element); this._axSidebarView = axSidebarView; @@ -53,11 +54,14 @@ var depth = 0; var breadcrumb = null; + var parent = null; for (ancestor of ancestorChain) { breadcrumb = new Accessibility.AXBreadcrumb(ancestor, depth, (ancestor === axNode)); - if (ancestor.children().length) - breadcrumb.element().classList.add('parent'); - this._rootElement.appendChild(breadcrumb.element()); + if (parent) + parent.appendChild(breadcrumb); + else + this._rootElement.appendChild(breadcrumb.element()); + parent = breadcrumb; depth++; } @@ -68,7 +72,7 @@ for (var child of axNode.children()) { var childBreadcrumb = new Accessibility.AXBreadcrumb(child, depth, false); - this._rootElement.appendChild(childBreadcrumb.element()); + inspectedNodeBreadcrumb.appendChild(childBreadcrumb); } this._selectedByUser = false; @@ -115,11 +119,11 @@ * @return {boolean} */ _preselectPrevious() { - var previousElement = this._preselectedBreadcrumb.element().previousSibling; - if (!previousElement) + var previousBreadcrumb = this._preselectedBreadcrumb.previousBreadcrumb(); + if (!previousBreadcrumb) return false; this._selectedByUser = true; - this._setPreselectedBreadcrumb(previousElement.breadcrumb); + this._setPreselectedBreadcrumb(previousBreadcrumb); return true; } @@ -127,11 +131,11 @@ * @return {boolean} */ _preselectNext() { - var nextElement = this._preselectedBreadcrumb.element().nextSibling; - if (!nextElement) + var nextBreadcrumb = this._preselectedBreadcrumb.nextBreadcrumb(); + if (!nextBreadcrumb) return false; this._selectedByUser = true; - this._setPreselectedBreadcrumb(nextElement.breadcrumb); + this._setPreselectedBreadcrumb(nextBreadcrumb); return true; } @@ -161,7 +165,7 @@ * @param {!Event} event */ _onMouseMove(event) { - var breadcrumbElement = event.target.enclosingNodeOrSelfWithClass('ax-node'); + var breadcrumbElement = event.target.enclosingNodeOrSelfWithClass('ax-breadcrumb'); if (!breadcrumbElement) { this._setHoveredBreadcrumb(null); return; @@ -176,7 +180,7 @@ * @param {!Event} event */ _onClick(event) { - var breadcrumbElement = event.target.enclosingNodeOrSelfWithClass('ax-node'); + var breadcrumbElement = event.target.enclosingNodeOrSelfWithClass('ax-breadcrumb'); if (!breadcrumbElement) { this._setHoveredBreadcrumb(null); return; @@ -274,22 +278,32 @@ /** @type {!Accessibility.AccessibilityNode} */ this._axNode = axNode; - this._element = createElementWithClass('div', 'ax-node'); + this._element = createElementWithClass('div', 'ax-breadcrumb'); + UI.ARIAUtils.markAsTreeitem(this._element); this._element.breadcrumb = this; + this._nodeElement = createElementWithClass('div', 'ax-node'); + this._element.appendChild(this._nodeElement); + this._nodeWrapper = createElementWithClass('div', 'wrapper'); + this._nodeElement.appendChild(this._nodeWrapper); + this._selectionElement = createElementWithClass('div', 'selection fill'); - this._element.appendChild(this._selectionElement); + this._nodeElement.appendChild(this._selectionElement); - this._nodeWrapper = createElementWithClass('span', 'wrapper'); - this._element.appendChild(this._nodeWrapper); + this._childrenGroupElement = createElementWithClass('div', 'children'); + UI.ARIAUtils.markAsGroup(this._childrenGroupElement); + this._element.appendChild(this._childrenGroupElement); + /** @type !Array<!Accessibility.AXBreadcrumb> */ + this._children = []; this._hovered = false; this._preselected = false; + this._parent = null; this._inspected = inspected; - this.element().classList.toggle('inspected', inspected); + this._nodeElement.classList.toggle('inspected', inspected); - this._element.style.paddingLeft = (16 * depth + 4) + 'px'; + this._nodeElement.style.paddingLeft = (16 * depth + 4) + 'px'; if (this._axNode.ignored()) { this._appendIgnoredNodeElement(); @@ -302,10 +316,10 @@ } if (this._axNode.hasOnlyUnloadedChildren()) - this._element.classList.add('children-unloaded'); + this._nodeElement.classList.add('children-unloaded'); if (!this._axNode.isDOMNode()) - this._element.classList.add('no-dom-node'); + this._nodeElement.classList.add('no-dom-node'); } /** @@ -316,6 +330,24 @@ } /** + * @param {!Accessibility.AXBreadcrumb} breadcrumb + */ + appendChild(breadcrumb) { + this._children.push(breadcrumb); + breadcrumb.setParent(this); + this._nodeElement.classList.add('parent'); + UI.ARIAUtils.setExpanded(this._element, true); + this._childrenGroupElement.appendChild(breadcrumb.element()); + } + + /** + * @param {!Accessibility.AXBreadcrumb} breadcrumb + */ + setParent(breadcrumb) { + this._parent = breadcrumb; + } + + /** * @return {boolean} */ preselected() { @@ -330,14 +362,14 @@ if (this._preselected === preselected) return; this._preselected = preselected; - this.element().classList.toggle('preselected', preselected); + this._nodeElement.classList.toggle('preselected', preselected); if (preselected) - this.element().setAttribute('tabIndex', 0); + this._nodeElement.setAttribute('tabIndex', 0); else - this.element().removeAttribute('tabIndex'); + this._nodeElement.removeAttribute('tabIndex'); if (this._preselected) { if (selectedByUser) - this.element().focus(); + this._nodeElement.focus(); if (!this._inspected) this._axNode.highlightDOMNode(); else @@ -352,9 +384,9 @@ if (this._hovered === hovered) return; this._hovered = hovered; - this.element().classList.toggle('hovered', hovered); + this._nodeElement.classList.toggle('hovered', hovered); if (this._hovered) { - this.element().classList.toggle('hovered', true); + this._nodeElement.classList.toggle('hovered', true); this._axNode.highlightDOMNode(); } } @@ -381,6 +413,29 @@ } /** + * @return {?Accessibility.AXBreadcrumb} + */ + nextBreadcrumb() { + if (this._children.length) + return this._children[0]; + var nextSibling = this.element().nextSibling; + if (nextSibling) + return nextSibling.breadcrumb; + return null; + } + + /** + * @return {?Accessibility.AXBreadcrumb} + */ + previousBreadcrumb() { + var previousSibling = this.element().previousSibling; + if (previousSibling) + return previousSibling.breadcrumb; + + return this._parent; + } + + /** * @param {string} name */ _appendNameElement(name) {
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings/FileUtils.js b/third_party/WebKit/Source/devtools/front_end/bindings/FileUtils.js index 454bdc8..69b9524 100644 --- a/third_party/WebKit/Source/devtools/front_end/bindings/FileUtils.js +++ b/third_party/WebKit/Source/devtools/front_end/bindings/FileUtils.js
@@ -27,27 +27,6 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/** - * @interface - */ -Bindings.OutputStreamDelegate = function() {}; - -Bindings.OutputStreamDelegate.prototype = { - onTransferStarted() {}, - - onTransferFinished() {}, - - /** - * @param {!Bindings.ChunkedReader} reader - */ - onChunkTransferred(reader) {}, - - /** - * @param {!Bindings.ChunkedReader} reader - * @param {!Event} event - */ - onError(reader, event) {}, -}; /** * @interface @@ -70,7 +49,12 @@ */ fileName() {}, - cancel() {} + cancel() {}, + + /** + * @return {?FileError} + */ + error() {} }; /** @@ -81,29 +65,33 @@ /** * @param {!File} file * @param {number} chunkSize - * @param {!Bindings.OutputStreamDelegate} delegate + * @param {function(!Bindings.ChunkedReader)=} chunkTransferredCallback */ - constructor(file, chunkSize, delegate) { + constructor(file, chunkSize, chunkTransferredCallback) { this._file = file; this._fileSize = file.size; this._loadedSize = 0; this._chunkSize = chunkSize; - this._delegate = delegate; + this._chunkTransferredCallback = chunkTransferredCallback; this._decoder = new TextDecoder(); this._isCanceled = false; + /** @type {?FileError} */ + this._error = null; } /** * @param {!Common.OutputStream} output + * @return {!Promise<boolean>} */ - start(output) { + read(output) { + if (this._chunkTransferredCallback) + this._chunkTransferredCallback(this); this._output = output; - this._reader = new FileReader(); this._reader.onload = this._onChunkLoaded.bind(this); - this._reader.onerror = this._delegate.onError.bind(this._delegate, this); - this._delegate.onTransferStarted(); + this._reader.onerror = this._onError.bind(this); this._loadChunk(); + return new Promise(resolve => this._transferFinished = resolve); } /** @@ -138,6 +126,14 @@ } /** + * @override + * @return {?FileError} + */ + error() { + return this._error; + } + + /** * @param {!Event} event */ _onChunkLoaded(event) { @@ -154,13 +150,14 @@ this._output.write(decodedString); if (this._isCanceled) return; - this._delegate.onChunkTransferred(this); + if (this._chunkTransferredCallback) + this._chunkTransferredCallback(this); if (endOfFile) { this._file = null; this._reader = null; this._output.close(); - this._delegate.onTransferFinished(); + this._transferFinished(!this._error); return; } @@ -173,6 +170,14 @@ var nextPart = this._file.slice(chunkStart, chunkEnd); this._reader.readAsArrayBuffer(nextPart); } + + /** + * @param {!Event} event + */ + _onError(event) { + this._error = event.target.error; + this._transferFinished(false); + } }; /**
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings/TempFile.js b/third_party/WebKit/Source/devtools/front_end/bindings/TempFile.js index 682b71e..1ab0e33 100644 --- a/third_party/WebKit/Source/devtools/front_end/bindings/TempFile.js +++ b/third_party/WebKit/Source/devtools/front_end/bindings/TempFile.js
@@ -143,23 +143,31 @@ /** * @param {!Common.OutputStream} outputStream - * @param {!Bindings.OutputStreamDelegate} delegate + * @param {function(!Bindings.ChunkedReader)=} progress + * @return {!Promise<?FileError>} */ - copyToOutputStream(outputStream, delegate) { - /** - * @param {!File} file - */ - function didGetFile(file) { - var reader = new Bindings.ChunkedFileReader(file, 10 * 1000 * 1000, delegate); - reader.start(outputStream); - } + copyToOutputStream(outputStream, progress) { + return new Promise(resolve => { + this._fileEntry.file(didGetFile, didFailToGetFile); - function didFailToGetFile(error) { - Common.console.error('Failed to load temp file: ' + error.message); - outputStream.close(); - } + /** + * @param {!File} file + */ + async function didGetFile(file) { + var reader = new Bindings.ChunkedFileReader(file, 10 * 1000 * 1000, progress); + var success = await reader.read(outputStream); + resolve(success ? null : reader.error()); + } - this._fileEntry.file(didGetFile, didFailToGetFile); + /** + * @param {!FileError} error + */ + function didFailToGetFile(error) { + Common.console.error('Failed to load temp file: ' + error.message); + outputStream.close(); + resolve(error); + } + }); } remove() { @@ -232,12 +240,12 @@ /** * @param {!Common.OutputStream} outputStream - * @param {!Bindings.OutputStreamDelegate} delegate + * @param {function()=} progress + * @return {!Promise<?FileError>} */ - async copyToOutputStream(outputStream, delegate) { + async copyToOutputStream(outputStream, progress) { await this._writeFinishedPromise; - if (this._tempFile) - this._tempFile.copyToOutputStream(outputStream, delegate); + return this._tempFile ? await this._tempFile.copyToOutputStream(outputStream, progress) : null; } async remove() { @@ -364,11 +372,10 @@ /** * @param {!Common.OutputStream} outputStream - * @param {!Bindings.OutputStreamDelegate} delegate + * @return {!Promise<?FileError>} */ - writeToStream(outputStream, delegate) { - if (this._file) - this._file.copyToOutputStream(outputStream, delegate); + writeToStream(outputStream) { + return this._file ? this._file.copyToOutputStream(outputStream) : Promise.resolve(null); } };
diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js index 343b688..f490923 100644 --- a/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js +++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js
@@ -30,7 +30,6 @@ /** * @implements {UI.ContextMenu.Provider} * @implements {UI.Searchable} - * @unrestricted */ Network.NetworkPanel = class extends UI.Panel { constructor() { @@ -42,6 +41,10 @@ this._networkRecordFilmStripSetting = Common.settings.createSetting('networkRecordFilmStripSetting', false); this._toggleRecordAction = /** @type {!UI.Action }*/ (UI.actionRegistry.action('network.toggle-recording')); + /** @type {number|undefined} */ + this._pendingStopTimer; + /** @type {?Network.NetworkItemView} */ + this._networkItemView = null; /** @type {?PerfUI.FilmStripView} */ this._filmStripView = null; /** @type {?Network.NetworkPanel.FilmStripRecorder} */ @@ -93,7 +96,11 @@ this._networkLogLargeRowsSetting.addChangeListener(this._toggleLargerRequests, this); this._networkRecordFilmStripSetting.addChangeListener(this._toggleRecordFilmStrip, this); - this._createToolbarButtons(); + this._preserveLogSetting = Common.moduleSetting('network_log.preserve-log'); + + this._offlineCheckbox = MobileThrottling.throttlingManager().createOfflineToolbarCheckbox(); + this._throttlingSelect = this._createThrottlingConditionsSelect(); + this._setupToolbarButtons(); this._toggleRecord(true); this._toggleShowOverview(); @@ -136,6 +143,20 @@ } /** + * @return {!UI.ToolbarCheckbox} + */ + offlineCheckboxForTest() { + return this._offlineCheckbox; + } + + /** + * @return {!UI.ToolbarComboBox} + */ + throttlingSelectForTest() { + return this._throttlingSelect; + } + + /** * @param {!Common.Event} event */ _onWindowChanged(event) { @@ -144,12 +165,12 @@ this._networkLogView.setWindow(startTime, endTime); } - _createToolbarButtons() { + _setupToolbarButtons() { this._panelToolbar.appendToolbarItem(UI.Toolbar.createActionButton(this._toggleRecordAction)); - this._clearButton = new UI.ToolbarButton(Common.UIString('Clear'), 'largeicon-clear'); - this._clearButton.addEventListener(UI.ToolbarButton.Events.Click, () => NetworkLog.networkLog.reset(), this); - this._panelToolbar.appendToolbarItem(this._clearButton); + var clearButton = new UI.ToolbarButton(Common.UIString('Clear'), 'largeicon-clear'); + clearButton.addEventListener(UI.ToolbarButton.Events.Click, () => NetworkLog.networkLog.reset(), this); + this._panelToolbar.appendToolbarItem(clearButton); this._panelToolbar.appendSeparator(); var recordFilmStripButton = new UI.ToolbarSettingToggle( this._networkRecordFilmStripSetting, 'largeicon-camera', Common.UIString('Capture screenshots')); @@ -176,20 +197,17 @@ } this._panelToolbar.appendSeparator(); - this._preserveLogSetting = Common.moduleSetting('network_log.preserve-log'); this._panelToolbar.appendToolbarItem(new UI.ToolbarSettingCheckbox( this._preserveLogSetting, Common.UIString('Do not clear log on page reload / navigation'), Common.UIString('Preserve log'))); - this._disableCacheCheckbox = new UI.ToolbarSettingCheckbox( + var disableCacheCheckbox = new UI.ToolbarSettingCheckbox( Common.moduleSetting('cacheDisabled'), Common.UIString('Disable cache (while DevTools is open)'), Common.UIString('Disable cache')); - this._panelToolbar.appendToolbarItem(this._disableCacheCheckbox); + this._panelToolbar.appendToolbarItem(disableCacheCheckbox); this._panelToolbar.appendSeparator(); - this._offlineCheckbox = MobileThrottling.throttlingManager().createOfflineToolbarCheckbox(); this._panelToolbar.appendToolbarItem(this._offlineCheckbox); - this._throttlingSelect = this._createThrottlingConditionsSelect(); this._panelToolbar.appendToolbarItem(this._throttlingSelect); this._panelToolbar.appendToolbarItem(new UI.ToolbarItem(this._progressBarContainer)); @@ -609,7 +627,6 @@ /** * @implements {SDK.TracingManagerClient} - * @unrestricted */ Network.NetworkPanel.FilmStripRecorder = class { /** @@ -623,6 +640,10 @@ this._resourceTreeModel = null; this._timeCalculator = timeCalculator; this._filmStripView = filmStripView; + /** @type {?SDK.TracingModel} */ + this._tracingModel = null; + /** @type {?function(?SDK.FilmStripModel)} */ + this._callback = null; } /** @@ -643,7 +664,7 @@ this._tracingModel.tracingComplete(); this._tracingManager = null; this._callback(new SDK.FilmStripModel(this._tracingModel, this._timeCalculator.minimumBoundary() * 1000)); - delete this._callback; + this._callback = null; if (this._resourceTreeModel) this._resourceTreeModel.resumeReload(); this._resourceTreeModel = null; @@ -672,9 +693,8 @@ this._tracingManager = tracingManagers[0]; this._resourceTreeModel = this._tracingManager.target().model(SDK.ResourceTreeModel); if (this._tracingModel) - this._tracingModel.reset(); - else - this._tracingModel = new SDK.TracingModel(new Bindings.TempFileBackingStorage('tracing')); + this._tracingModel.dispose(); + this._tracingModel = new SDK.TracingModel(new Bindings.TempFileBackingStorage('tracing')); this._tracingManager.start(this, '-*,disabled-by-default-devtools.screenshot', ''); } @@ -702,7 +722,6 @@ /** * @implements {UI.ActionDelegate} - * @unrestricted */ Network.NetworkPanel.RecordActionDelegate = class { /**
diff --git a/third_party/WebKit/Source/devtools/front_end/perf_ui/ChartViewport.js b/third_party/WebKit/Source/devtools/front_end/perf_ui/ChartViewport.js index 21633d5..c0678642 100644 --- a/third_party/WebKit/Source/devtools/front_end/perf_ui/ChartViewport.js +++ b/third_party/WebKit/Source/devtools/front_end/perf_ui/ChartViewport.js
@@ -325,6 +325,13 @@ } /** + * @return {number} + */ + timeToPixel() { + return this._offsetWidth / (this._timeWindowRight - this._timeWindowLeft); + } + + /** * @param {boolean} visible */ _showCursor(visible) {
diff --git a/third_party/WebKit/Source/devtools/front_end/perf_ui/FlameChart.js b/third_party/WebKit/Source/devtools/front_end/perf_ui/FlameChart.js index 4efe917..c99673d 100644 --- a/third_party/WebKit/Source/devtools/front_end/perf_ui/FlameChart.js +++ b/third_party/WebKit/Source/devtools/front_end/perf_ui/FlameChart.js
@@ -642,6 +642,7 @@ var entryTotalTimes = timelineData.entryTotalTimes; var entryStartTimes = timelineData.entryStartTimes; var entryLevels = timelineData.entryLevels; + var timeToPixel = this._chartViewport.timeToPixel(); var titleIndices = []; var markerIndices = []; @@ -745,7 +746,7 @@ var unclippedBarX = this._chartViewport.timeToPosition(entryStartTime); var barHeight = this._levelHeight(barLevel); if (this._dataProvider.decorateEntry( - entryIndex, context, text, barX, barY, barWidth, barHeight, unclippedBarX, this._timeToPixel)) + entryIndex, context, text, barX, barY, barWidth, barHeight, unclippedBarX, timeToPixel)) continue; if (!text || !text.length) continue; @@ -935,6 +936,7 @@ var barHeight = group.style.height; var entryStartTimes = this._rawTimelineData.entryStartTimes; var entryTotalTimes = this._rawTimelineData.entryTotalTimes; + var timeToPixel = this._chartViewport.timeToPixel(); for (var level = group.startLevel; level < endLevel; ++level) { var levelIndexes = this._timelineLevels[level]; @@ -961,7 +963,7 @@ context.fillStyle = color; context.fillRect(barX, y, barWidth, barHeight - 1); this._dataProvider.decorateEntry( - entryIndex, context, '', barX, y, barWidth, barHeight, unclippedBarX, this._timeToPixel); + entryIndex, context, '', barX, y, barWidth, barHeight, unclippedBarX, timeToPixel); continue; } range.append(new Common.Segment(barX, endBarX, color)); @@ -1065,6 +1067,7 @@ var markers = this._timelineData().markers; var left = this._markerIndexBeforeTime(this._calculator.minimumBoundary()); var rightBoundary = this._calculator.maximumBoundary(); + var timeToPixel = this._chartViewport.timeToPixel(); var context = /** @type {!CanvasRenderingContext2D} */ (this._canvas.getContext('2d')); context.save(); @@ -1076,7 +1079,7 @@ var timestamp = markers[i].startTime(); if (timestamp > rightBoundary) break; - markers[i].draw(context, this._calculator.computePosition(timestamp), height, this._timeToPixel); + markers[i].draw(context, this._calculator.computePosition(timestamp), height, timeToPixel); } context.restore(); } @@ -1306,9 +1309,6 @@ var totalPixels = Math.floor(this._offsetWidth / windowWidth); this._pixelWindowLeft = Math.floor(totalPixels * this._windowLeft); - this._timeToPixel = totalPixels / this._totalTime; - this._pixelToTime = this._totalTime / totalPixels; - this._chartViewport.setBoundaries(this._minimumBoundary, this._totalTime); } @@ -1487,10 +1487,10 @@ * @param {number} barWidth * @param {number} barHeight * @param {number} unclippedBarX - * @param {number} timeToPixels + * @param {number} timeToPixelRatio * @return {boolean} */ - decorateEntry(entryIndex, context, text, barX, barY, barWidth, barHeight, unclippedBarX, timeToPixels) {}, + decorateEntry(entryIndex, context, text, barX, barY, barWidth, barHeight, unclippedBarX, timeToPixelRatio) {}, /** * @param {number} entryIndex
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/HeapSnapshotView.js b/third_party/WebKit/Source/devtools/front_end/profiler/HeapSnapshotView.js index b4ba48f..04707a9 100644 --- a/third_party/WebKit/Source/devtools/front_end/profiler/HeapSnapshotView.js +++ b/third_party/WebKit/Source/devtools/front_end/profiler/HeapSnapshotView.js
@@ -1316,6 +1316,8 @@ this._loadPromise = new Promise(resolve => this._fulfillLoad = resolve); this._totalNumberOfChunks = 0; this._bufferedWriter = null; + /** @type {?Bindings.TempFile} */ + this._tempFile = null; } /** @@ -1359,6 +1361,9 @@ this._didWriteToTempFile(file); } + /** + * @param {!Bindings.TempFile} tempFile + */ _didWriteToTempFile(tempFile) { if (this._wasDisposed) { if (tempFile) @@ -1470,25 +1475,39 @@ * @param {boolean} accepted * @this {Profiler.HeapProfileHeader} */ - function onOpen(accepted) { + async function onOpen(accepted) { if (!accepted) return; - if (this._failedToCreateTempFile) { Common.console.error('Failed to open temp file with heap snapshot'); fileOutputStream.close(); - } else if (this._tempFile) { - var delegate = new Profiler.SaveSnapshotOutputStreamDelegate(this); - this._tempFile.copyToOutputStream(fileOutputStream, delegate); - } else { - this._onTempFileReady = onOpen.bind(this, accepted); - this._updateSaveProgress(0, 1); + return; } + if (this._tempFile) { + var error = await this._tempFile.copyToOutputStream(fileOutputStream, this._onChunkTransferred.bind(this)); + if (error) + Common.console.error('Failed to read heap snapshot from temp file: ' + error.message); + this._didCompleteSnapshotTransfer(); + return; + } + this._onTempFileReady = onOpen.bind(this, accepted); + this._updateSaveProgress(0, 1); } } + /** + * @param {!Bindings.ChunkedReader} reader + */ + _onChunkTransferred(reader) { + this._updateSaveProgress(reader.loadedSize(), reader.fileSize()); + } + + /** + * @param {number} value + * @param {number} total + */ _updateSaveProgress(value, total) { - var percentValue = ((total ? (value / total) : 0) * 100).toFixed(0); + var percentValue = ((total && value / total) * 100).toFixed(0); this.updateStatus(Common.UIString('Saving\u2026 %d%%', percentValue)); } @@ -1496,119 +1515,13 @@ * @override * @param {!File} file */ - loadFromFile(file) { + async loadFromFile(file) { this.updateStatus(Common.UIString('Loading\u2026'), true); this._setupWorker(); - var delegate = new Profiler.HeapSnapshotLoadFromFileDelegate(this); - var fileReader = this._createFileReader(file, delegate); - fileReader.start(/** @type {!Common.OutputStream} */ (this._receiver)); - } - - /** - * @param {!File} file - * @param {!Profiler.HeapSnapshotLoadFromFileDelegate} delegate - * @return {!Bindings.ChunkedFileReader} - */ - _createFileReader(file, delegate) { - return new Bindings.ChunkedFileReader(file, 10000000, delegate); - } -}; - -/** - * @implements {Bindings.OutputStreamDelegate} - * @unrestricted - */ -Profiler.HeapSnapshotLoadFromFileDelegate = class { - /** - * @param {!Profiler.HeapProfileHeader} snapshotHeader - */ - constructor(snapshotHeader) { - this._snapshotHeader = snapshotHeader; - } - - /** - * @override - */ - onTransferStarted() { - } - - /** - * @override - * @param {!Bindings.ChunkedReader} reader - */ - onChunkTransferred(reader) { - } - - /** - * @override - */ - onTransferFinished() { - } - - /** - * @override - * @param {!Bindings.ChunkedReader} reader - * @param {!Event} e - */ - onError(reader, e) { - var subtitle; - switch (e.target.error.code) { - case e.target.error.NOT_FOUND_ERR: - subtitle = Common.UIString('\'%s\' not found.', reader.fileName()); - break; - case e.target.error.NOT_READABLE_ERR: - subtitle = Common.UIString('\'%s\' is not readable', reader.fileName()); - break; - case e.target.error.ABORT_ERR: - return; - default: - subtitle = Common.UIString('\'%s\' error %d', reader.fileName(), e.target.error.code); - } - this._snapshotHeader.updateStatus(subtitle); - } -}; - -/** - * @implements {Bindings.OutputStreamDelegate} - */ -Profiler.SaveSnapshotOutputStreamDelegate = class { - /** - * @param {!Profiler.HeapProfileHeader} profileHeader - */ - constructor(profileHeader) { - this._profileHeader = profileHeader; - } - - /** - * @override - */ - onTransferStarted() { - this._profileHeader._updateSaveProgress(0, 1); - } - - /** - * @override - */ - onTransferFinished() { - this._profileHeader._didCompleteSnapshotTransfer(); - } - - /** - * @override - * @param {!Bindings.ChunkedReader} reader - */ - onChunkTransferred(reader) { - this._profileHeader._updateSaveProgress(reader.loadedSize(), reader.fileSize()); - } - - /** - * @override - * @param {!Bindings.ChunkedReader} reader - * @param {!Event} event - */ - onError(reader, event) { - Common.console.error('Failed to read heap snapshot from temp file: ' + /** @type {!ErrorEvent} */ (event).message); - this.onTransferFinished(); + var reader = new Bindings.ChunkedFileReader(file, 10000000); + var success = await reader.read(/** @type {!Common.OutputStream} */ (this._receiver)); + if (!success) + this.updateStatus(reader.error().message); } };
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileHeader.js b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileHeader.js index 6dd2a45..08f9dd0 100644 --- a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileHeader.js +++ b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileHeader.js
@@ -40,7 +40,7 @@ * @return {!Profiler.ProfileSidebarTreeElement} */ createSidebarTreeElement(dataDisplayDelegate) { - throw new Error('Needs implemented.'); + throw new Error('Not implemented.'); } /** @@ -67,14 +67,14 @@ } saveToFile() { - throw new Error('Needs implemented'); + throw new Error('Not implemented'); } /** * @param {!File} file */ loadFromFile(file) { - throw new Error('Needs implemented'); + throw new Error('Not implemented'); } /**
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileView.js b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileView.js index 9f7df63..66840ef 100644 --- a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileView.js +++ b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileView.js
@@ -383,7 +383,6 @@ /** * @implements {Common.OutputStream} - * @implements {Bindings.OutputStreamDelegate} * @unrestricted */ Profiler.WritableProfileHeader = class extends Profiler.ProfileHeader { @@ -399,54 +398,17 @@ } /** - * @override - */ - onTransferStarted() { - this._jsonifiedProfile = ''; - this.updateStatus(Common.UIString('Loading\u2026 %s', Number.bytesToString(this._jsonifiedProfile.length)), true); - } - - /** - * @override * @param {!Bindings.ChunkedReader} reader */ - onChunkTransferred(reader) { + _onChunkTransferred(reader) { this.updateStatus(Common.UIString('Loading\u2026 %d%%', Number.bytesToString(this._jsonifiedProfile.length))); } /** - * @override - */ - onTransferFinished() { - this.updateStatus(Common.UIString('Parsing\u2026'), true); - this._profile = JSON.parse(this._jsonifiedProfile); - this._jsonifiedProfile = null; - this.updateStatus(Common.UIString('Loaded'), false); - - if (this.profileType().profileBeingRecorded() === this) - this.profileType().setProfileBeingRecorded(null); - } - - /** - * @override * @param {!Bindings.ChunkedReader} reader - * @param {!Event} e */ - onError(reader, e) { - var subtitle; - switch (e.target.error.code) { - case e.target.error.NOT_FOUND_ERR: - subtitle = Common.UIString('\'%s\' not found.', reader.fileName()); - break; - case e.target.error.NOT_READABLE_ERR: - subtitle = Common.UIString('\'%s\' is not readable', reader.fileName()); - break; - case e.target.error.ABORT_ERR: - return; - default: - subtitle = Common.UIString('\'%s\' error %d', reader.fileName(), e.target.error.code); - } - this.updateStatus(subtitle); + _onError(reader) { + this.updateStatus(Common.UIString(`File '%s' read error: %s`, reader.fileName(), reader.error().message)); } /** @@ -522,10 +484,24 @@ * @override * @param {!File} file */ - loadFromFile(file) { + async loadFromFile(file) { this.updateStatus(Common.UIString('Loading\u2026'), true); - var fileReader = new Bindings.ChunkedFileReader(file, 10000000, this); - fileReader.start(this); + var fileReader = new Bindings.ChunkedFileReader(file, 10000000, this._onChunkTransferred.bind(this)); + this._jsonifiedProfile = ''; + + var success = await fileReader.read(this); + if (!success) { + this._onError(fileReader); + return; + } + + this.updateStatus(Common.UIString('Parsing\u2026'), true); + this._profile = JSON.parse(this._jsonifiedProfile); + this._jsonifiedProfile = null; + this.updateStatus(Common.UIString('Loaded'), false); + + if (this.profileType().profileBeingRecorded() === this) + this.profileType().setProfileBeingRecorded(null); } /**
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/ProfilesPanel.js b/third_party/WebKit/Source/devtools/front_end/profiler/ProfilesPanel.js index 5829c1f..29059af 100644 --- a/third_party/WebKit/Source/devtools/front_end/profiler/ProfilesPanel.js +++ b/third_party/WebKit/Source/devtools/front_end/profiler/ProfilesPanel.js
@@ -159,13 +159,13 @@ continue; extensions.push(extension); } - Common.console.error(Common.UIString( - 'Can\'t load file. Only files with extensions \'%s\' can be loaded.', extensions.join('\', \''))); + Common.console.error( + Common.UIString(`Can't load file. Only files with extensions '%s' can be loaded.`, extensions.join(`', '`))); return; } if (!!profileType.profileBeingRecorded()) { - Common.console.error(Common.UIString('Can\'t load profile while another profile is recording.')); + Common.console.error(Common.UIString(`Can't load profile while another profile is being recorded.`)); return; }
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/PerformanceModel.js b/third_party/WebKit/Source/devtools/front_end/timeline/PerformanceModel.js index e9139e4..14a1fa12 100644 --- a/third_party/WebKit/Source/devtools/front_end/timeline/PerformanceModel.js +++ b/third_party/WebKit/Source/devtools/front_end/timeline/PerformanceModel.js
@@ -154,11 +154,11 @@ /** * @param {!Common.OutputStream} stream - * @param {!Bindings.OutputStreamDelegate} delegate + * @return {!Promise<?FileError>} */ - save(stream, delegate) { + save(stream) { var backingStorage = /** @type {!Bindings.TempFileBackingStorage} */ (this._tracingModel.backingStorage()); - backingStorage.writeToStream(stream, delegate); + return backingStorage.writeToStream(stream); } };
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineLoader.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineLoader.js index 3f0e016..2c4ae84 100644 --- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineLoader.js +++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineLoader.js
@@ -1,9 +1,9 @@ // Copyright 2016 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. + /** * @implements {Common.OutputStream} - * @implements {Bindings.OutputStreamDelegate} * @unrestricted */ Timeline.TimelineLoader = class { @@ -22,7 +22,6 @@ this._buffer = ''; this._firstRawChunk = true; this._firstChunk = true; - this._loadedBytes = 0; /** @type {number} */ this._totalSize; @@ -36,10 +35,13 @@ */ static loadFromFile(file, client) { var loader = new Timeline.TimelineLoader(client); - var fileReader = Timeline.TimelineLoader._createFileReader(file, loader); + var fileReader = new Bindings.ChunkedFileReader(file, Timeline.TimelineLoader.TransferChunkLengthBytes); loader._canceledCallback = fileReader.cancel.bind(fileReader); loader._totalSize = file.size; - fileReader.start(loader); + fileReader.read(loader).then(success => { + if (!success) + this._reportErrorAndCancelLoading(fileReader.error().message); + }); return loader; } @@ -49,18 +51,9 @@ * @return {!Timeline.TimelineLoader} */ static loadFromURL(url, client) { - var stream = new Timeline.TimelineLoader(client); - Host.ResourceLoader.loadAsStream(url, null, stream); - return stream; - } - - /** - * @param {!File} file - * @param {!Bindings.OutputStreamDelegate} delegate - * @return {!Bindings.ChunkedReader} - */ - static _createFileReader(file, delegate) { - return new Bindings.ChunkedFileReader(file, Timeline.TimelineLoader.TransferChunkLengthBytes, delegate); + var loader = new Timeline.TimelineLoader(client); + Host.ResourceLoader.loadAsStream(url, null, loader); + return loader; } cancel() { @@ -199,46 +192,6 @@ } /** - * @override - */ - onTransferStarted() { - } - - /** - * @override - * @param {!Bindings.ChunkedReader} reader - */ - onChunkTransferred(reader) { - } - - /** - * @override - */ - onTransferFinished() { - } - - /** - * @override - * @param {!Bindings.ChunkedReader} reader - * @param {!Event} event - */ - onError(reader, event) { - switch (event.target.error.name) { - case 'NotFoundError': - this._reportErrorAndCancelLoading(Common.UIString('File "%s" not found.', reader.fileName())); - break; - case 'NotReadableError': - this._reportErrorAndCancelLoading(Common.UIString('File "%s" is not readable', reader.fileName())); - break; - case 'AbortError': - break; - default: - this._reportErrorAndCancelLoading( - Common.UIString('An error occurred while reading the file "%s"', reader.fileName())); - } - } - - /** * @param {string} text */ _parseCPUProfileFormat(text) { @@ -288,39 +241,3 @@ SkippingTail: Symbol('SkippingTail'), LoadingCPUProfileFormat: Symbol('LoadingCPUProfileFormat') }; - -/** - * @implements {Bindings.OutputStreamDelegate} - * @unrestricted - */ -Timeline.TracingTimelineSaver = class { - /** - * @override - */ - onTransferStarted() { - } - - /** - * @override - */ - onTransferFinished() { - } - - /** - * @override - * @param {!Bindings.ChunkedReader} reader - */ - onChunkTransferred(reader) { - } - - /** - * @override - * @param {!Bindings.ChunkedReader} reader - * @param {!Event} event - */ - onError(reader, event) { - var error = event.target.error; - Common.console.error( - Common.UIString('Failed to save timeline: %s (%s, %s)', error.message, error.name, error.code)); - } -};
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js index efd952c7..5a66f66f 100644 --- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js +++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
@@ -365,7 +365,11 @@ if (!accepted) return; - performanceModel.save(stream, new Timeline.TracingTimelineSaver()); + var error = await performanceModel.save(stream); + if (!error) + return; + Common.console.error( + Common.UIString('Failed to save timeline: %s (%s, %s)', error.message, error.name, error.code)); } async _showHistory() { @@ -387,12 +391,8 @@ return true; } - /** - * @return {boolean} - */ _selectFileToLoad() { this._fileSelectorElement.click(); - return true; } /**
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineJSProfile.js b/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineJSProfile.js index 0d15c58..d664afff 100644 --- a/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineJSProfile.js +++ b/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineJSProfile.js
@@ -143,18 +143,21 @@ function filterStackFrames(stack) { if (showAllEvents) return; - var isPreviousFrameNative = false; + var previousNativeFrameName = null; for (var i = 0, j = 0; i < stack.length; ++i) { const frame = stack[i]; const url = frame.url; const isNativeFrame = url && url.startsWith('native '); if (!showNativeFunctions && isNativeFrame) continue; - if (TimelineModel.TimelineJSProfileProcessor.isNativeRuntimeFrame(frame) && !showNativeName(frame.functionName)) + var isNativeRuntimeFrame = TimelineModel.TimelineJSProfileProcessor.isNativeRuntimeFrame(frame); + if (isNativeRuntimeFrame && !showNativeName(frame.functionName)) continue; - if (isPreviousFrameNative && isNativeFrame) + var nativeFrameName = + isNativeRuntimeFrame ? TimelineModel.TimelineJSProfileProcessor.nativeGroup(frame.functionName) : null; + if (previousNativeFrameName && previousNativeFrameName === nativeFrameName) continue; - isPreviousFrameNative = isNativeFrame; + previousNativeFrameName = nativeFrameName; stack[j++] = frame; } stack.length = j; @@ -214,22 +217,11 @@ * @return {?TimelineModel.TimelineJSProfileProcessor.NativeGroups} */ static nativeGroup(nativeName) { - var map = TimelineModel.TimelineJSProfileProcessor.nativeGroup._map; - if (!map) { - const nativeGroups = TimelineModel.TimelineJSProfileProcessor.NativeGroups; - map = new Map([ - ['Compile', nativeGroups.Compile], ['CompileCode', nativeGroups.Compile], - ['CompileCodeLazy', nativeGroups.Compile], ['CompileDeserialize', nativeGroups.Compile], - ['CompileEval', nativeGroups.Compile], ['CompileFullCode', nativeGroups.Compile], - ['CompileIgnition', nativeGroups.Compile], ['CompilerDispatcher', nativeGroups.Compile], - ['CompileSerialize', nativeGroups.Compile], ['ParseProgram', nativeGroups.Parse], - ['ParseFunction', nativeGroups.Parse], ['RecompileConcurrent', nativeGroups.Compile], - ['RecompileSynchronous', nativeGroups.Compile], ['ParseLazy', nativeGroups.Parse] - ]); - /** @type {!Map<string, !TimelineModel.TimelineJSProfileProcessor.NativeGroups>} */ - TimelineModel.TimelineJSProfileProcessor.nativeGroup._map = map; - } - return map.get(nativeName) || null; + if (nativeName.startsWith('Parse')) + return TimelineModel.TimelineJSProfileProcessor.NativeGroups.Parse; + if (nativeName.startsWith('Compile') || nativeName.startsWith('Recompile')) + return TimelineModel.TimelineJSProfileProcessor.NativeGroups.Compile; + return null; } /**
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/textButton.css b/third_party/WebKit/Source/devtools/front_end/ui/textButton.css index 0cb514c..2d40651 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui/textButton.css +++ b/third_party/WebKit/Source/devtools/front_end/ui/textButton.css
@@ -10,7 +10,7 @@ font-size: 12px; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 2px; - padding: 3px 12px; + padding: 0px 12px; font-weight: 500; color: #333; background-color: #fff;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMediaControls.cpp b/third_party/WebKit/Source/modules/accessibility/AXMediaControls.cpp index 4446167..7058ede 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXMediaControls.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXMediaControls.cpp
@@ -28,8 +28,10 @@ #include "modules/accessibility/AXMediaControls.h" +#include "core/html/HTMLInputElement.h" #include "core/layout/LayoutObject.h" #include "modules/accessibility/AXObjectCacheImpl.h" +#include "modules/media_controls/elements/MediaControlElementsHelper.h" #include "modules/media_controls/elements/MediaControlTimeDisplayElement.h" #include "platform/text/PlatformLocale.h" @@ -52,7 +54,8 @@ AXObjectCacheImpl& ax_object_cache) { DCHECK(layout_object->GetNode()); - switch (GetMediaControlElementType(layout_object->GetNode())) { + switch (MediaControlElementsHelper::GetMediaControlElementType( + layout_object->GetNode())) { case kMediaSlider: return AccessibilityMediaTimeline::Create(layout_object, ax_object_cache); @@ -98,7 +101,8 @@ if (!GetLayoutObject() || !GetLayoutObject()->GetNode()) return kMediaTimelineContainer; // Timeline container is not accessible. - return GetMediaControlElementType(GetLayoutObject()->GetNode()); + return MediaControlElementsHelper::GetMediaControlElementType( + GetLayoutObject()->GetNode()); } String AccessibilityMediaControl::TextAlternative(
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMediaControls.h b/third_party/WebKit/Source/modules/accessibility/AXMediaControls.h index 07b70bf..10324d4 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXMediaControls.h +++ b/third_party/WebKit/Source/modules/accessibility/AXMediaControls.h
@@ -29,8 +29,8 @@ #ifndef AXMediaControls_h #define AXMediaControls_h -#include "core/html/shadow/MediaControlElementTypes.h" #include "modules/accessibility/AXSlider.h" +#include "modules/media_controls/elements/MediaControlElementType.h" namespace blink {
diff --git a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp index b806d32..54059b9 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
@@ -63,11 +63,11 @@ #include "core/html/TextControlElement.h" #include "core/html/forms/RadioInputType.h" #include "core/html/parser/HTMLParserIdioms.h" -#include "core/html/shadow/MediaControlElementTypes.h" #include "core/layout/LayoutBlockFlow.h" #include "core/layout/LayoutObject.h" #include "core/svg/SVGElement.h" #include "modules/accessibility/AXObjectCacheImpl.h" +#include "modules/media_controls/elements/MediaControlElementsHelper.h" #include "platform/text/PlatformLocale.h" #include "platform/weborigin/KURL.h" #include "platform/wtf/text/StringBuilder.h" @@ -1076,7 +1076,8 @@ if (!node) return true; - return isHTMLVideoElement(ToParentMediaElement(node)); + return isHTMLVideoElement( + MediaControlElementsHelper::ToParentMediaElement(node)); } bool AXNodeObject::IsEmbeddedObject() const {
diff --git a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp index 4b5f89b..dd2ba69 100644 --- a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp
@@ -20,8 +20,8 @@ #include "modules/bluetooth/BluetoothRemoteGATTCharacteristic.h" #include "modules/bluetooth/BluetoothUUID.h" #include "modules/bluetooth/RequestDeviceOptions.h" -#include "public/platform/InterfaceProvider.h" #include "public/platform/Platform.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace blink { @@ -171,16 +171,11 @@ "Must be handling a user gesture to show a permission request.")); } - if (!service_) { - InterfaceProvider* interface_provider = nullptr; - if (context->IsDocument()) { - Document* document = ToDocument(context); - if (document->GetFrame()) - interface_provider = document->GetFrame()->GetInterfaceProvider(); + if (!service_ && context->IsDocument()) { + LocalFrame* frame = ToDocument(context)->GetFrame(); + if (frame) { + frame->GetInterfaceProvider().GetInterface(mojo::MakeRequest(&service_)); } - - if (interface_provider) - interface_provider->GetInterface(mojo::MakeRequest(&service_)); } if (!service_) {
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp index af5bee2..6eef0d9e 100644 --- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp +++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp
@@ -199,9 +199,8 @@ void CanvasRenderingContext2DTest::SetUp() { Page::PageClients page_clients; FillWithEmptyClients(page_clients); - dummy_page_holder_ = - DummyPageHolder::Create(IntSize(800, 600), &page_clients, nullptr, - override_settings_function_, nullptr); + dummy_page_holder_ = DummyPageHolder::Create( + IntSize(800, 600), &page_clients, nullptr, override_settings_function_); document_ = &dummy_page_holder_->GetDocument(); document_->documentElement()->setInnerHTML( "<body><canvas id='c'></canvas></body>");
diff --git a/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp b/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp index 48ea22b2..1e29852 100644 --- a/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp +++ b/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp
@@ -68,7 +68,6 @@ #include "platform/weborigin/SecurityOrigin.h" #include "platform/wtf/Functional.h" #include "platform/wtf/PtrUtil.h" -#include "public/platform/Platform.h" #include "public/platform/WebContentSettingsClient.h" #include "public/platform/WebURLRequest.h" #include "public/platform/WebWorkerFetchContext.h" @@ -298,7 +297,7 @@ settings->SetAllowRunningOfInsecureContent(false); settings->SetDataSaverEnabled(worker_start_data_.data_saver_enabled); main_frame_ = WebFactory::GetInstance().CreateMainWebLocalFrameBase( - web_view_, this, nullptr, nullptr); + web_view_, this, nullptr); main_frame_->SetDevToolsAgentClient(this); // If we were asked to wait for debugger then it is the good time to do that.
diff --git a/third_party/WebKit/Source/modules/geolocation/Geolocation.cpp b/third_party/WebKit/Source/modules/geolocation/Geolocation.cpp index a49fea9..fba227d 100644 --- a/third_party/WebKit/Source/modules/geolocation/Geolocation.cpp +++ b/third_party/WebKit/Source/modules/geolocation/Geolocation.cpp
@@ -40,8 +40,8 @@ #include "modules/permissions/PermissionUtils.h" #include "platform/wtf/Assertions.h" #include "platform/wtf/CurrentTime.h" -#include "public/platform/InterfaceProvider.h" #include "public/platform/Platform.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace blink { namespace { @@ -446,7 +446,7 @@ return; geolocation_permission_ = kPermissionRequested; - frame->GetInterfaceProvider()->GetInterface( + frame->GetInterfaceProvider().GetInterface( mojo::MakeRequest(&permission_service_)); permission_service_.set_connection_error_handler( ConvertToBaseCallback(WTF::Bind(&Geolocation::OnPermissionConnectionError, @@ -518,7 +518,7 @@ if (geolocation_service_) return; - GetFrame()->GetInterfaceProvider()->GetInterface( + GetFrame()->GetInterfaceProvider().GetInterface( mojo::MakeRequest(&geolocation_service_)); geolocation_service_.set_connection_error_handler(ConvertToBaseCallback( WTF::Bind(&Geolocation::OnGeolocationConnectionError,
diff --git a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp index 00f836c1..fea051f 100644 --- a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp +++ b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp
@@ -24,6 +24,7 @@ #include "public/platform/Platform.h" #include "public/platform/WebImageCaptureFrameGrabber.h" #include "public/platform/WebMediaStreamTrack.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace blink { @@ -623,8 +624,7 @@ DCHECK(stream_track_); DCHECK(!service_.is_bound()); - GetFrame()->GetInterfaceProvider()->GetInterface( - mojo::MakeRequest(&service_)); + GetFrame()->GetInterfaceProvider().GetInterface(mojo::MakeRequest(&service_)); service_.set_connection_error_handler(ConvertToBaseCallback(WTF::Bind( &ImageCapture::OnServiceConnectionError, WrapWeakPersistent(this))));
diff --git a/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp b/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp index a42d2e0..0348980 100644 --- a/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp +++ b/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp
@@ -7,7 +7,7 @@ #include "core/dom/Document.h" #include "core/frame/LocalFrame.h" #include "platform/wtf/Functional.h" -#include "public/platform/InterfaceProvider.h" +#include "services/service_manager/public/cpp/interface_provider.h" #include <utility> @@ -105,7 +105,7 @@ } if (!provider_) { - GetSupplementable()->GetInterfaceProvider()->GetInterface( + GetSupplementable()->GetInterfaceProvider().GetInterface( mojo::MakeRequest(&provider_)); // TODO(mgiuca): Set a connection error handler. This requires a refactor to // work like NavigatorShare.cpp (retain a persistent list of clients to
diff --git a/third_party/WebKit/Source/modules/keyboard_lock/NavigatorKeyboardLock.cpp b/third_party/WebKit/Source/modules/keyboard_lock/NavigatorKeyboardLock.cpp index 887f9b6..d4718b0 100644 --- a/third_party/WebKit/Source/modules/keyboard_lock/NavigatorKeyboardLock.cpp +++ b/third_party/WebKit/Source/modules/keyboard_lock/NavigatorKeyboardLock.cpp
@@ -11,7 +11,7 @@ #include "platform/heap/Persistent.h" #include "platform/wtf/Assertions.h" #include "platform/wtf/Functional.h" -#include "public/platform/InterfaceProvider.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace blink { @@ -82,7 +82,7 @@ if (!frame) { return false; } - frame->GetInterfaceProvider()->GetInterface(mojo::MakeRequest(&service_)); + frame->GetInterfaceProvider().GetInterface(mojo::MakeRequest(&service_)); } DCHECK(service_);
diff --git a/third_party/WebKit/Source/modules/media_controls/BUILD.gn b/third_party/WebKit/Source/modules/media_controls/BUILD.gn index 77f7560..8b2e1c59 100644 --- a/third_party/WebKit/Source/modules/media_controls/BUILD.gn +++ b/third_party/WebKit/Source/modules/media_controls/BUILD.gn
@@ -20,12 +20,19 @@ "elements/MediaControlCastButtonElement.h", "elements/MediaControlCurrentTimeDisplayElement.cpp", "elements/MediaControlCurrentTimeDisplayElement.h", + "elements/MediaControlDivElement.cpp", + "elements/MediaControlDivElement.h", "elements/MediaControlDownloadButtonElement.cpp", "elements/MediaControlDownloadButtonElement.h", + "elements/MediaControlElementBase.cpp", + "elements/MediaControlElementBase.h", + "elements/MediaControlElementType.h", "elements/MediaControlElementsHelper.cpp", "elements/MediaControlElementsHelper.h", "elements/MediaControlFullscreenButtonElement.cpp", "elements/MediaControlFullscreenButtonElement.h", + "elements/MediaControlInputElement.cpp", + "elements/MediaControlInputElement.h", "elements/MediaControlMuteButtonElement.cpp", "elements/MediaControlMuteButtonElement.h", "elements/MediaControlOverflowMenuButtonElement.cpp",
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp index 9bf2b7bd7..cabbe8b 100644 --- a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp +++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp
@@ -1062,7 +1062,7 @@ // won't benefit from that anwyay, we just do it here like JS will. // Controls that we'll hide / show, in order of decreasing priority. - MediaControlElement* elements[] = { + MediaControlElementBase* elements[] = { // Exclude m_overflowMenu; we handle it specially. play_button_.Get(), fullscreen_button_.Get(), @@ -1085,7 +1085,7 @@ // This prevents the wrong controls from being shown briefly // immediately after the first layout and paint, but before we have // a chance to revise them. - for (MediaControlElement* element : elements) { + for (MediaControlElementBase* element : elements) { if (element) element->SetDoesFit(false); } @@ -1115,10 +1115,10 @@ overflow_menu_->SetIsWanted(true); int used_width = minimum_width; - std::list<MediaControlElement*> overflow_elements; - MediaControlElement* first_displaced_element = nullptr; + std::list<MediaControlElementBase*> overflow_elements; + MediaControlElementBase* first_displaced_element = nullptr; // For each control that fits, enable it in order of decreasing priority. - for (MediaControlElement* element : elements) { + for (MediaControlElementBase* element : elements) { if (!element) continue; int width = minimum_width;
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.h b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.h index c8bba03..530b863 100644 --- a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.h +++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.h
@@ -98,7 +98,6 @@ // There is no update because only the overlay is expected to change. RefreshCastButtonVisibilityWithoutUpdate(); } - Document& OwnerDocument() { return GetDocument(); } // Called by the fullscreen buttons to toggle fulllscreen on/off. void EnterFullscreen();
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsImplTest.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsImplTest.cpp index 5745aca5..6dc7898d 100644 --- a/third_party/WebKit/Source/modules/media_controls/MediaControlsImplTest.cpp +++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsImplTest.cpp
@@ -18,7 +18,6 @@ #include "core/frame/Settings.h" #include "core/html/HTMLElement.h" #include "core/html/HTMLVideoElement.h" -#include "core/html/shadow/MediaControlElementTypes.h" #include "core/input/EventHandler.h" #include "core/layout/LayoutObject.h" #include "core/loader/EmptyClients.h"
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp index 093d15c..c51a3c1 100644 --- a/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp +++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp
@@ -66,12 +66,12 @@ // TODO(avayvod, mlamouri): Attach can be called twice. See // https://crbug.com/713275. - if (remote_playback_availability_callback_id_ == -1) { - remote_playback_availability_callback_id_ = + if (!remote_playback_availability_callback_id_.has_value()) { + remote_playback_availability_callback_id_ = WTF::make_optional( remote->WatchAvailabilityInternal(new AvailabilityCallbackWrapper( WTF::Bind(&MediaControlsMediaEventListener:: OnRemotePlaybackAvailabilityChanged, - WrapWeakPersistent(this)))); + WrapWeakPersistent(this))))); } } } @@ -100,10 +100,12 @@ // TODO(avayvod): apparently Detach() can be called without a previous // Attach() call. See https://crbug.com/713275 for more details. - if (remote_playback_availability_callback_id_ != -1) { + if (remote_playback_availability_callback_id_.has_value() && + remote_playback_availability_callback_id_.value() != + RemotePlayback::kWatchAvailabilityNotSupported) { remote->CancelWatchAvailabilityInternal( - remote_playback_availability_callback_id_); - remote_playback_availability_callback_id_ = -1; + remote_playback_availability_callback_id_.value()); + remote_playback_availability_callback_id_.reset(); } } }
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.h b/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.h index 530d746..8c4a239 100644 --- a/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.h +++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.h
@@ -6,6 +6,7 @@ #define MediaControlsMediaEventListener_h #include "core/events/EventListener.h" +#include "platform/wtf/Optional.h" namespace blink { @@ -39,7 +40,7 @@ void OnRemotePlaybackAvailabilityChanged(); Member<MediaControlsImpl> media_controls_; - int remote_playback_availability_callback_id_ = -1; + WTF::Optional<int> remote_playback_availability_callback_id_; }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.cpp index fedd97f..bab9a01 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.cpp +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.cpp
@@ -84,14 +84,14 @@ return true; } -WebLocalizedString::Name -MediaControlCastButtonElement::GetOverflowStringName() { +WebLocalizedString::Name MediaControlCastButtonElement::GetOverflowStringName() + const { if (IsPlayingRemotely()) return WebLocalizedString::kOverflowMenuStopCast; return WebLocalizedString::kOverflowMenuCast; } -bool MediaControlCastButtonElement::HasOverflowButton() { +bool MediaControlCastButtonElement::HasOverflowButton() const { return true; }
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.h index 0d29cff..a2f859e9 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlCastButtonElement_h #define MediaControlCastButtonElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlInputElement.h" namespace blink { @@ -26,8 +26,8 @@ // MediaControlInputElement overrides. bool WillRespondToMouseClickEvents() override; - WebLocalizedString::Name GetOverflowStringName() override; - bool HasOverflowButton() override; + WebLocalizedString::Name GetOverflowStringName() const override; + bool HasOverflowButton() const override; private: // This is used for UMA histogram (Cast.Sender.Overlay). New values should
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDivElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDivElement.cpp new file mode 100644 index 0000000..92d5e4c90 --- /dev/null +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDivElement.cpp
@@ -0,0 +1,26 @@ +// Copyright 2017 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 "modules/media_controls/elements/MediaControlDivElement.h" + +#include "modules/media_controls/MediaControlsImpl.h" + +namespace blink { + +MediaControlDivElement::MediaControlDivElement( + MediaControlsImpl& media_controls, + MediaControlElementType display_type) + : HTMLDivElement(media_controls.GetDocument()), + MediaControlElementBase(media_controls, display_type, this) {} + +bool MediaControlDivElement::IsMediaControlElement() const { + return true; +} + +DEFINE_TRACE(MediaControlDivElement) { + HTMLDivElement::Trace(visitor); + MediaControlElementBase::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDivElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDivElement.h new file mode 100644 index 0000000..de305b6 --- /dev/null +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDivElement.h
@@ -0,0 +1,32 @@ +// Copyright 2017 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 MediaControlDivElement_h +#define MediaControlDivElement_h + +#include "core/html/HTMLDivElement.h" +#include "modules/media_controls/elements/MediaControlElementBase.h" + +namespace blink { + +class MediaControlsImpl; + +// MediaControlElementBase implementation based on a <div>. Used for panels, and +// floating UI. +class MediaControlDivElement : public HTMLDivElement, + public MediaControlElementBase { + USING_GARBAGE_COLLECTED_MIXIN(MediaControlDivElement); + + DECLARE_VIRTUAL_TRACE(); + + protected: + MediaControlDivElement(MediaControlsImpl&, MediaControlElementType); + + private: + bool IsMediaControlElement() const final; +}; + +} // namespace blink + +#endif // MediaControlDivElement_h
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.cpp index 2007c5d..fc58f57 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.cpp +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.cpp
@@ -77,16 +77,16 @@ } WebLocalizedString::Name -MediaControlDownloadButtonElement::GetOverflowStringName() { +MediaControlDownloadButtonElement::GetOverflowStringName() const { return WebLocalizedString::kOverflowMenuDownload; } -bool MediaControlDownloadButtonElement::HasOverflowButton() { +bool MediaControlDownloadButtonElement::HasOverflowButton() const { return true; } void MediaControlDownloadButtonElement::SetIsWanted(bool wanted) { - MediaControlElement::SetIsWanted(wanted); + MediaControlInputElement::SetIsWanted(wanted); if (!IsWanted()) return;
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.h index da1f7e08..ca659182 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlDownloadButtonElement_h #define MediaControlDownloadButtonElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlInputElement.h" namespace blink { @@ -23,8 +23,8 @@ // MediaControlInputElement overrides. // TODO(mlamouri): add WillRespondToMouseClickEvents - WebLocalizedString::Name GetOverflowStringName() override; - bool HasOverflowButton() override; + WebLocalizedString::Name GetOverflowStringName() const override; + bool HasOverflowButton() const override; void SetIsWanted(bool) override; DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementBase.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementBase.cpp new file mode 100644 index 0000000..d5352e8 --- /dev/null +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementBase.cpp
@@ -0,0 +1,109 @@ +// Copyright 2017 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 "modules/media_controls/elements/MediaControlElementBase.h" + +#include "core/html/HTMLMediaElement.h" +#include "core/layout/LayoutObject.h" +#include "modules/media_controls/MediaControlsImpl.h" +#include "platform/text/PlatformLocale.h" + +namespace blink { + +void MediaControlElementBase::SetIsWanted(bool wanted) { + if (is_wanted_ == wanted) + return; + + is_wanted_ = wanted; + UpdateShownState(); +} + +bool MediaControlElementBase::IsWanted() const { + return is_wanted_; +} + +void MediaControlElementBase::SetDoesFit(bool fits) { + does_fit_ = fits; + UpdateShownState(); +} + +MediaControlElementType MediaControlElementBase::DisplayType() const { + return display_type_; +} + +bool MediaControlElementBase::HasOverflowButton() const { + return false; +} + +void MediaControlElementBase::ShouldShowButtonInOverflowMenu(bool should_show) { + if (!HasOverflowButton()) + return; + + if (should_show) { + overflow_menu_element_->RemoveInlineStyleProperty(CSSPropertyDisplay); + } else { + overflow_menu_element_->SetInlineStyleProperty(CSSPropertyDisplay, + CSSValueNone); + } +} + +String MediaControlElementBase::GetOverflowMenuString() const { + return MediaElement().GetLocale().QueryString(GetOverflowStringName()); +} + +void MediaControlElementBase::UpdateOverflowString() { + if (overflow_menu_element_ && overflow_menu_text_) + overflow_menu_text_->ReplaceWholeText(GetOverflowMenuString()); +} + +MediaControlElementBase::MediaControlElementBase( + MediaControlsImpl& media_controls, + MediaControlElementType display_type, + HTMLElement* element) + : media_controls_(&media_controls), + display_type_(display_type), + element_(element), + is_wanted_(true), + does_fit_(true) {} + +MediaControlsImpl& MediaControlElementBase::GetMediaControls() const { + DCHECK(media_controls_); + return *media_controls_; +} + +HTMLMediaElement& MediaControlElementBase::MediaElement() const { + return GetMediaControls().MediaElement(); +} + +void MediaControlElementBase::SetDisplayType( + MediaControlElementType display_type) { + if (display_type == display_type_) + return; + + display_type_ = display_type; + if (LayoutObject* object = element_->GetLayoutObject()) + object->SetShouldDoFullPaintInvalidation(); +} + +void MediaControlElementBase::UpdateShownState() { + if (is_wanted_ && does_fit_) + element_->RemoveInlineStyleProperty(CSSPropertyDisplay); + else + element_->SetInlineStyleProperty(CSSPropertyDisplay, CSSValueNone); +} + +WebLocalizedString::Name MediaControlElementBase::GetOverflowStringName() + const { + NOTREACHED(); + return WebLocalizedString::kAXAMPMFieldText; +} + +DEFINE_TRACE(MediaControlElementBase) { + visitor->Trace(media_controls_); + visitor->Trace(element_); + visitor->Trace(overflow_menu_element_); + visitor->Trace(overflow_menu_text_); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementBase.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementBase.h new file mode 100644 index 0000000..08c216a --- /dev/null +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementBase.h
@@ -0,0 +1,94 @@ +// Copyright 2017 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 MediaControlElementBase_h +#define MediaControlElementBase_h + +#include "core/dom/Element.h" +#include "modules/media_controls/elements/MediaControlElementType.h" +#include "platform/heap/GarbageCollected.h" +#include "platform/heap/Visitor.h" +#include "public/platform/WebLocalizedString.h" + +namespace blink { + +class Element; +class HTMLElement; +class HTMLMediaElement; +class MediaControlsImpl; + +// MediaControlElementBase is the base class for all the media control elements. +// It is sub-classed by MediaControlInputElement and MediaControlDivElement +// which are then used by the final implementations. +class MediaControlElementBase : public GarbageCollectedMixin { + public: + // These hold the state about whether this control should be shown if + // space permits. These will also show / hide as needed. + virtual void SetIsWanted(bool); + bool IsWanted() const; + + // Tell us whether we fit or not. This will hide / show the control as + // needed, also. + void SetDoesFit(bool); + + // Returns the display type of the element that is set at creation. + MediaControlElementType DisplayType() const; + + // By default, media controls elements are not added to the overflow menu. + // Controls that can be added to the overflow menu should override this + // function and return true. + virtual bool HasOverflowButton() const; + + // If true, shows the overflow menu item if it exists. Hides it if false. + void ShouldShowButtonInOverflowMenu(bool); + + // Returns a string representation of the media control element. Used for + // the overflow menu. + String GetOverflowMenuString() const; + + // Updates the value of the Text string shown in the overflow menu. + void UpdateOverflowString(); + + DECLARE_VIRTUAL_TRACE(); + + protected: + MediaControlElementBase(MediaControlsImpl&, + MediaControlElementType, + HTMLElement*); + + MediaControlsImpl& GetMediaControls() const; + + HTMLMediaElement& MediaElement() const; + + void SetDisplayType(MediaControlElementType); + + // Represents the overflow menu element for this media control. + // The Element contains the button that the user can click on, but having + // the button within an Element enables us to style the overflow menu. + // Setting this pointer is optional so it may be null. + Member<Element> overflow_menu_element_; + + // The text representation of the button within the overflow menu. + Member<Text> overflow_menu_text_; + + private: + // Hide or show based on our fits / wanted state. We want to show + // if and only if we're wanted and we fit. + void UpdateShownState(); + + // Returns a string representation of the media control element. + // Subclasses should override this method to return the string representation + // of the overflow button. + virtual WebLocalizedString::Name GetOverflowStringName() const; + + Member<MediaControlsImpl> media_controls_; + MediaControlElementType display_type_; + Member<HTMLElement> element_; + bool is_wanted_ : 1; + bool does_fit_ : 1; +}; + +} // namespace blink + +#endif // MediaControlElementBase_h
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementType.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementType.h new file mode 100644 index 0000000..3d0678f2 --- /dev/null +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementType.h
@@ -0,0 +1,41 @@ +// Copyright 2017 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 MediaControlElementType_h +#define MediaControlElementType_h + +// Classes sub-classing MediaControlElementBase will all have a defined type +// from this list. It is used by code that need to know what type of media +// control element it is interacting with. +enum MediaControlElementType { + kMediaEnterFullscreenButton = 0, + kMediaMuteButton, + kMediaPlayButton, + kMediaSlider, + kMediaSliderThumb, + kMediaShowClosedCaptionsButton, + kMediaHideClosedCaptionsButton, + kMediaTextTrackList, + kMediaUnMuteButton, + kMediaPauseButton, + kMediaTimelineContainer, + kMediaCurrentTimeDisplay, + kMediaTimeRemainingDisplay, + kMediaTrackSelectionCheckmark, + kMediaControlsPanel, + kMediaVolumeSliderContainer, + kMediaVolumeSlider, + kMediaVolumeSliderThumb, + kMediaExitFullscreenButton, + kMediaOverlayPlayButton, + kMediaCastOffButton, + kMediaCastOnButton, + kMediaOverlayCastOffButton, + kMediaOverlayCastOnButton, + kMediaOverflowButton, + kMediaOverflowList, + kMediaDownloadButton, +}; + +#endif // MediaControlElementType_h
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.cpp index 0771867..0aeb5cc 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.cpp +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.cpp
@@ -5,8 +5,11 @@ #include "modules/media_controls/elements/MediaControlElementsHelper.h" #include "core/events/Event.h" +#include "core/html/HTMLMediaElement.h" #include "core/layout/LayoutSlider.h" #include "core/layout/api/LayoutSliderItem.h" +#include "modules/media_controls/elements/MediaControlDivElement.h" +#include "modules/media_controls/elements/MediaControlInputElement.h" namespace blink { @@ -47,4 +50,27 @@ type == EventTypeNames::pointermove; } +// static +MediaControlElementType MediaControlElementsHelper::GetMediaControlElementType( + const Node* node) { + SECURITY_DCHECK(node->IsMediaControlElement()); + const HTMLElement* element = ToHTMLElement(node); + if (isHTMLInputElement(*element)) + return static_cast<const MediaControlInputElement*>(element)->DisplayType(); + return static_cast<const MediaControlDivElement*>(element)->DisplayType(); +} + +// static +const HTMLMediaElement* MediaControlElementsHelper::ToParentMediaElement( + const Node* node) { + if (!node) + return nullptr; + const Node* shadow_host = node->OwnerShadowHost(); + if (!shadow_host) + return nullptr; + + return IsHTMLMediaElement(shadow_host) ? ToHTMLMediaElement(shadow_host) + : nullptr; +} + } // namespace blink
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.h index 557ba729..d4f0f3f 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.h
@@ -5,12 +5,16 @@ #ifndef MediaControlElementsHelper_h #define MediaControlElementsHelper_h +#include "modules/ModulesExport.h" +#include "modules/media_controls/elements/MediaControlElementType.h" #include "platform/wtf/Allocator.h" namespace blink { class Event; +class HTMLMediaElement; class LayoutObject; +class Node; // Helper class for media control elements. It contains methods, constants or // concepts shared by more than one element. @@ -23,6 +27,17 @@ // Sliders (the volume control and timeline) need to capture some additional // events used when dragging the thumb. static bool IsUserInteractionEventForSlider(Event*, LayoutObject*); + + // Returns the MediaControlElementType associated with a given |Node|. The + // |node| _must_ be a media control element. + // Exported to be used by the accessibility module. + MODULES_EXPORT static MediaControlElementType GetMediaControlElementType( + const Node*); + + // Returns the media element associated with a given |node|. + // Exported to be used by the accessibility module. + MODULES_EXPORT static const HTMLMediaElement* ToParentMediaElement( + const Node*); }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.cpp index d47c72f..1c3c169 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.cpp +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.cpp
@@ -33,13 +33,13 @@ } WebLocalizedString::Name -MediaControlFullscreenButtonElement::GetOverflowStringName() { +MediaControlFullscreenButtonElement::GetOverflowStringName() const { if (MediaElement().IsFullscreen()) return WebLocalizedString::kOverflowMenuExitFullscreen; return WebLocalizedString::kOverflowMenuEnterFullscreen; } -bool MediaControlFullscreenButtonElement::HasOverflowButton() { +bool MediaControlFullscreenButtonElement::HasOverflowButton() const { return true; }
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.h index ca4d990..edd6016 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlFullscreenButtonElement_h #define MediaControlFullscreenButtonElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlInputElement.h" namespace blink { @@ -22,8 +22,8 @@ // MediaControlInputElement overrides. bool WillRespondToMouseClickEvents() override; - WebLocalizedString::Name GetOverflowStringName() override; - bool HasOverflowButton() override; + WebLocalizedString::Name GetOverflowStringName() const override; + bool HasOverflowButton() const override; private: void DefaultEventHandler(Event*) override;
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlInputElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlInputElement.cpp new file mode 100644 index 0000000..595547c --- /dev/null +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlInputElement.cpp
@@ -0,0 +1,57 @@ +// Copyright 2017 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 "modules/media_controls/elements/MediaControlInputElement.h" + +#include "core/html/HTMLLabelElement.h" +#include "modules/media_controls/MediaControlsImpl.h" + +namespace blink { + +HTMLElement* MediaControlInputElement::CreateOverflowElement( + MediaControlsImpl& media_controls, + MediaControlInputElement* button) { + if (!button) + return nullptr; + + // We don't want the button visible within the overflow menu. + button->SetIsWanted(false); + + overflow_menu_text_ = Text::Create(media_controls.GetDocument(), + button->GetOverflowMenuString()); + + HTMLLabelElement* element = + HTMLLabelElement::Create(media_controls.GetDocument()); + element->SetShadowPseudoId( + AtomicString("-internal-media-controls-overflow-menu-list-item")); + // Appending a button to a label element ensures that clicks on the label + // are passed down to the button, performing the action we'd expect. + element->AppendChild(button); + element->AppendChild(overflow_menu_text_); + overflow_menu_element_ = element; + return element; +} + +MediaControlInputElement::MediaControlInputElement( + MediaControlsImpl& media_controls, + MediaControlElementType display_type) + : HTMLInputElement(media_controls.GetDocument(), false), + MediaControlElementBase(media_controls, display_type, this) {} + +void MediaControlInputElement::UpdateDisplayType() {} + +bool MediaControlInputElement::IsMediaControlElement() const { + return true; +} + +bool MediaControlInputElement::IsMouseFocusable() const { + return false; +} + +DEFINE_TRACE(MediaControlInputElement) { + HTMLInputElement::Trace(visitor); + MediaControlElementBase::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlInputElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlInputElement.h new file mode 100644 index 0000000..a84a846 --- /dev/null +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlInputElement.h
@@ -0,0 +1,40 @@ +// Copyright 2017 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 MediaControlInputElement_h +#define MediaControlInputElement_h + +#include "core/html/HTMLInputElement.h" +#include "modules/media_controls/elements/MediaControlElementBase.h" + +namespace blink { + +class MediaControlsImpl; + +// MediaControlElementBase implementation based on an <input> element. Used by +// buttons and sliders. +class MediaControlInputElement : public HTMLInputElement, + public MediaControlElementBase { + USING_GARBAGE_COLLECTED_MIXIN(MediaControlInputElement); + + public: + // Creates an overflow menu element with the given button as a child. + HTMLElement* CreateOverflowElement(MediaControlsImpl&, + MediaControlInputElement*); + + DECLARE_VIRTUAL_TRACE(); + + protected: + MediaControlInputElement(MediaControlsImpl&, MediaControlElementType); + + private: + virtual void UpdateDisplayType(); + + bool IsMouseFocusable() const override; + bool IsMediaControlElement() const final; +}; + +} // namespace blink + +#endif // MediaControlInputElement_h
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.cpp index c4bc997..f0d352f1 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.cpp +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.cpp
@@ -34,14 +34,14 @@ UpdateOverflowString(); } -WebLocalizedString::Name -MediaControlMuteButtonElement::GetOverflowStringName() { +WebLocalizedString::Name MediaControlMuteButtonElement::GetOverflowStringName() + const { if (MediaElement().muted()) return WebLocalizedString::kOverflowMenuUnmute; return WebLocalizedString::kOverflowMenuMute; } -bool MediaControlMuteButtonElement::HasOverflowButton() { +bool MediaControlMuteButtonElement::HasOverflowButton() const { return true; }
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.h index c70fd28a..28c3d65 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlMuteButtonElement_h #define MediaControlMuteButtonElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlInputElement.h" namespace blink { @@ -19,8 +19,8 @@ // MediaControlInputElement overrides. bool WillRespondToMouseClickEvents() override; void UpdateDisplayType() override; - WebLocalizedString::Name GetOverflowStringName() override; - bool HasOverflowButton() override; + WebLocalizedString::Name GetOverflowStringName() const override; + bool HasOverflowButton() const override; private: void DefaultEventHandler(Event*) override;
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuButtonElement.h index 846e4f7..a296933 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuButtonElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuButtonElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlOverflowMenuButtonElement_h #define MediaControlOverflowMenuButtonElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlInputElement.h" namespace blink {
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuListElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuListElement.h index 2d3a9867..33ebc09 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuListElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuListElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlOverflowMenuListElement_h #define MediaControlOverflowMenuListElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlDivElement.h" namespace blink {
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayEnclosureElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayEnclosureElement.h index c9451c39..da808cce 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayEnclosureElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayEnclosureElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlOverlayEnclosureElement_h #define MediaControlOverlayEnclosureElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlDivElement.h" namespace blink {
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayPlayButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayPlayButtonElement.h index 0e6b35f..f1b1ddf 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayPlayButtonElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayPlayButtonElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlOverlayPlayButtonElement_h #define MediaControlOverlayPlayButtonElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlInputElement.h" namespace blink {
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelElement.h index ec9419d..3c2da324 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlPanelElement_h #define MediaControlPanelElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlDivElement.h" #include "platform/Timer.h" namespace blink {
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelEnclosureElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelEnclosureElement.h index df4b385..12563e3 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelEnclosureElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelEnclosureElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlPanelEnclosureElement_h #define MediaControlPanelEnclosureElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlDivElement.h" namespace blink {
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.cpp index d7e14b7..b1862a1 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.cpp +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.cpp
@@ -31,14 +31,14 @@ UpdateOverflowString(); } -WebLocalizedString::Name -MediaControlPlayButtonElement::GetOverflowStringName() { +WebLocalizedString::Name MediaControlPlayButtonElement::GetOverflowStringName() + const { if (MediaElement().paused()) return WebLocalizedString::kOverflowMenuPlay; return WebLocalizedString::kOverflowMenuPause; } -bool MediaControlPlayButtonElement::HasOverflowButton() { +bool MediaControlPlayButtonElement::HasOverflowButton() const { return true; }
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.h index ab42606..2d32521 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlPlayButtonElement_h #define MediaControlPlayButtonElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlInputElement.h" namespace blink { @@ -19,8 +19,8 @@ // MediaControlInputElement overrides. bool WillRespondToMouseClickEvents() override; void UpdateDisplayType() override; - WebLocalizedString::Name GetOverflowStringName() override; - bool HasOverflowButton() override; + WebLocalizedString::Name GetOverflowStringName() const override; + bool HasOverflowButton() const override; void OnMediaKeyboardEvent(Event* event) { DefaultEventHandler(event); }
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.cpp index 7dc7b8b..43f9c9b 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.cpp +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.cpp
@@ -6,6 +6,7 @@ #include "core/InputTypeNames.h" #include "core/events/Event.h" +#include "core/html/HTMLInputElement.h" #include "core/html/HTMLLabelElement.h" #include "core/html/HTMLMediaElement.h" #include "core/html/HTMLSpanElement.h"
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.h index 4d564539..7f168a7 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlTextTrackListElement_h #define MediaControlTextTrackListElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlDivElement.h" namespace blink {
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimeDisplayElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimeDisplayElement.h index 85ab767d..2c8e56fb 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimeDisplayElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimeDisplayElement.h
@@ -5,8 +5,8 @@ #ifndef MediaControlTimeDisplayElement_h #define MediaControlTimeDisplayElement_h -#include "core/html/shadow/MediaControlElementTypes.h" #include "modules/ModulesExport.h" +#include "modules/media_controls/elements/MediaControlDivElement.h" namespace blink {
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimelineElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimelineElement.h index 9f3034c..c797adb 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimelineElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimelineElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlTimelineElement_h #define MediaControlTimelineElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlInputElement.h" #include "modules/media_controls/elements/MediaControlTimelineMetrics.h" namespace blink {
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.cpp index e774df1..697f2dfe 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.cpp +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.cpp
@@ -34,11 +34,11 @@ } WebLocalizedString::Name -MediaControlToggleClosedCaptionsButtonElement::GetOverflowStringName() { +MediaControlToggleClosedCaptionsButtonElement::GetOverflowStringName() const { return WebLocalizedString::kOverflowMenuCaptions; } -bool MediaControlToggleClosedCaptionsButtonElement::HasOverflowButton() { +bool MediaControlToggleClosedCaptionsButtonElement::HasOverflowButton() const { return true; }
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.h index e648a95..0e7b33a 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlToggleClosedCaptionsButtonElement_h #define MediaControlToggleClosedCaptionsButtonElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlInputElement.h" namespace blink { @@ -20,8 +20,8 @@ // MediaControlInputElement overrides. bool WillRespondToMouseClickEvents() override; void UpdateDisplayType() override; - WebLocalizedString::Name GetOverflowStringName() override; - bool HasOverflowButton() override; + WebLocalizedString::Name GetOverflowStringName() const override; + bool HasOverflowButton() const override; private: void DefaultEventHandler(Event*) override;
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlVolumeSliderElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlVolumeSliderElement.h index 2e3c434..6b790b4 100644 --- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlVolumeSliderElement.h +++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlVolumeSliderElement.h
@@ -5,7 +5,7 @@ #ifndef MediaControlVolumeSliderElement_h #define MediaControlVolumeSliderElement_h -#include "core/html/shadow/MediaControlElementTypes.h" +#include "modules/media_controls/elements/MediaControlInputElement.h" namespace blink {
diff --git a/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp b/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp index d1002243..2e650b0 100644 --- a/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp +++ b/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp
@@ -13,8 +13,8 @@ #include "modules/mediasession/MediaMetadata.h" #include "modules/mediasession/MediaMetadataSanitizer.h" #include "platform/wtf/Optional.h" -#include "public/platform/InterfaceProvider.h" #include "public/platform/Platform.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace blink { @@ -198,15 +198,11 @@ DCHECK(GetExecutionContext()->IsDocument()) << "MediaSession::getService() is only available from a frame"; Document* document = ToDocument(GetExecutionContext()); - if (!document->GetFrame()) + LocalFrame* frame = document->GetFrame(); + if (!frame) return nullptr; - InterfaceProvider* interface_provider = - document->GetFrame()->GetInterfaceProvider(); - if (!interface_provider) - return nullptr; - - interface_provider->GetInterface(mojo::MakeRequest(&service_)); + frame->GetInterfaceProvider().GetInterface(mojo::MakeRequest(&service_)); if (service_.get()) { // Record the eTLD+1 of the frame using the API. Platform::Current()->RecordRapporURL("Media.Session.APIUsage.Origin",
diff --git a/third_party/WebKit/Source/modules/nfc/NFC.cpp b/third_party/WebKit/Source/modules/nfc/NFC.cpp index fff6f4f..9d3e1aa 100644 --- a/third_party/WebKit/Source/modules/nfc/NFC.cpp +++ b/third_party/WebKit/Source/modules/nfc/NFC.cpp
@@ -18,8 +18,8 @@ #include "modules/nfc/NFCPushOptions.h" #include "modules/nfc/NFCWatchOptions.h" #include "platform/mojo/MojoHelper.h" -#include "public/platform/InterfaceProvider.h" #include "public/platform/Platform.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace { const char kJsonMimePostfix[] = "+json"; @@ -642,7 +642,7 @@ if (!IsSupportedInContext(GetExecutionContext(), error_message)) return; - frame->GetInterfaceProvider()->GetInterface(mojo::MakeRequest(&nfc_)); + frame->GetInterfaceProvider().GetInterface(mojo::MakeRequest(&nfc_)); nfc_.set_connection_error_handler(ConvertToBaseCallback( WTF::Bind(&NFC::OnConnectionError, WrapWeakPersistent(this)))); device::mojom::blink::NFCClientPtr client;
diff --git a/third_party/WebKit/Source/modules/payments/BUILD.gn b/third_party/WebKit/Source/modules/payments/BUILD.gn index 8dd3cc7..1a5de53 100644 --- a/third_party/WebKit/Source/modules/payments/BUILD.gn +++ b/third_party/WebKit/Source/modules/payments/BUILD.gn
@@ -8,6 +8,8 @@ sources = [ "CanMakePaymentEvent.cpp", "CanMakePaymentEvent.h", + "CanMakePaymentRespondWithObserver.cpp", + "CanMakePaymentRespondWithObserver.h", "HTMLIFrameElementPayments.cpp", "HTMLIFrameElementPayments.h", "PaymentAddress.cpp", @@ -18,6 +20,8 @@ "PaymentCompleter.h", "PaymentEventDataConversion.cpp", "PaymentEventDataConversion.h", + "PaymentHandlerUtils.cpp", + "PaymentHandlerUtils.h", "PaymentInstruments.cpp", "PaymentInstruments.h", "PaymentManager.cpp",
diff --git a/third_party/WebKit/Source/modules/payments/CanMakePaymentRespondWithObserver.cpp b/third_party/WebKit/Source/modules/payments/CanMakePaymentRespondWithObserver.cpp new file mode 100644 index 0000000..41c940c88 --- /dev/null +++ b/third_party/WebKit/Source/modules/payments/CanMakePaymentRespondWithObserver.cpp
@@ -0,0 +1,63 @@ +// Copyright 2017 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 "modules/payments/CanMakePaymentRespondWithObserver.h" + +#include <v8.h> +#include "bindings/core/v8/ScriptValue.h" +#include "bindings/core/v8/V8BindingForCore.h" +#include "bindings/modules/v8/V8PaymentAppResponse.h" +#include "core/dom/ExecutionContext.h" +#include "modules/payments/PaymentAppResponse.h" +#include "modules/payments/PaymentHandlerUtils.h" +#include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h" +#include "modules/serviceworkers/WaitUntilObserver.h" +#include "public/platform/modules/payments/WebPaymentAppResponse.h" + +namespace blink { + +CanMakePaymentRespondWithObserver::CanMakePaymentRespondWithObserver( + ExecutionContext* context, + int event_id, + WaitUntilObserver* observer) + : RespondWithObserver(context, event_id, observer) {} + +void CanMakePaymentRespondWithObserver::OnResponseRejected( + WebServiceWorkerResponseError error) { + PaymentHandlerUtils::ReportResponseError(GetExecutionContext(), + "CanMakePaymentEvent", error); + + ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) + ->RespondToCanMakePaymentEvent(event_id_, false, event_dispatch_time_); +} + +void CanMakePaymentRespondWithObserver::OnResponseFulfilled( + const ScriptValue& value) { + DCHECK(GetExecutionContext()); + ExceptionState exception_state(value.GetIsolate(), + ExceptionState::kUnknownContext, + "PaymentRequestEvent", "respondWith"); + bool response = ToBoolean(ToIsolate(GetExecutionContext()), value.V8Value(), + exception_state); + if (exception_state.HadException()) { + exception_state.ClearException(); + OnResponseRejected(kWebServiceWorkerResponseErrorNoV8Instance); + return; + } + + ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) + ->RespondToCanMakePaymentEvent(event_id_, response, event_dispatch_time_); +} + +void CanMakePaymentRespondWithObserver::OnNoResponse() { + DCHECK(GetExecutionContext()); + ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) + ->RespondToCanMakePaymentEvent(event_id_, false, event_dispatch_time_); +} + +DEFINE_TRACE(CanMakePaymentRespondWithObserver) { + RespondWithObserver::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/modules/payments/CanMakePaymentRespondWithObserver.h b/third_party/WebKit/Source/modules/payments/CanMakePaymentRespondWithObserver.h new file mode 100644 index 0000000..f468f70 --- /dev/null +++ b/third_party/WebKit/Source/modules/payments/CanMakePaymentRespondWithObserver.h
@@ -0,0 +1,37 @@ +// Copyright 2017 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 CanMakePaymentRespondWithObserver_h +#define CanMakePaymentRespondWithObserver_h + +#include "modules/ModulesExport.h" +#include "modules/serviceworkers/RespondWithObserver.h" +#include "public/platform/modules/serviceworker/WebServiceWorkerResponseError.h" + +namespace blink { + +class ExecutionContext; +class ScriptValue; +class WaitUntilObserver; + +// Implementation for CanMakePaymentEvent.respondWith(), which is used by the +// payment handler to indicate whether it can respond to a payment request. +class MODULES_EXPORT CanMakePaymentRespondWithObserver final + : public RespondWithObserver { + public: + CanMakePaymentRespondWithObserver(ExecutionContext*, + int event_id, + WaitUntilObserver*); + ~CanMakePaymentRespondWithObserver() override = default; + + void OnResponseRejected(WebServiceWorkerResponseError) override; + void OnResponseFulfilled(const ScriptValue&) override; + void OnNoResponse() override; + + DECLARE_VIRTUAL_TRACE(); +}; + +} // namespace blink + +#endif // CanMakePaymentRespondWithObserver_h
diff --git a/third_party/WebKit/Source/modules/payments/PaymentHandlerUtils.cpp b/third_party/WebKit/Source/modules/payments/PaymentHandlerUtils.cpp new file mode 100644 index 0000000..00e6b139 --- /dev/null +++ b/third_party/WebKit/Source/modules/payments/PaymentHandlerUtils.cpp
@@ -0,0 +1,57 @@ +// Copyright 2017 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 "modules/payments/PaymentHandlerUtils.h" + +#include "core/dom/ExecutionContext.h" +#include "core/inspector/ConsoleMessage.h" + +namespace blink { + +void PaymentHandlerUtils::ReportResponseError( + ExecutionContext* execution_context, + const String& event_name_prefix, + WebServiceWorkerResponseError error) { + String error_message = event_name_prefix + ".respondWith() failed: "; + switch (error) { + case kWebServiceWorkerResponseErrorPromiseRejected: + error_message = + error_message + "the promise passed to respondWith() was rejected."; + break; + case kWebServiceWorkerResponseErrorDefaultPrevented: + error_message = + error_message + + "preventDefault() was called without calling respondWith()."; + break; + case kWebServiceWorkerResponseErrorNoV8Instance: + error_message = error_message + + "an object that was not a PaymentResponse was passed to " + "respondWith()."; + break; + case kWebServiceWorkerResponseErrorUnknown: + error_message = error_message + "an unexpected error occurred."; + break; + case kWebServiceWorkerResponseErrorResponseTypeError: + case kWebServiceWorkerResponseErrorResponseTypeOpaque: + case kWebServiceWorkerResponseErrorResponseTypeNotBasicOrDefault: + case kWebServiceWorkerResponseErrorBodyUsed: + case kWebServiceWorkerResponseErrorResponseTypeOpaqueForClientRequest: + case kWebServiceWorkerResponseErrorResponseTypeOpaqueRedirect: + case kWebServiceWorkerResponseErrorBodyLocked: + case kWebServiceWorkerResponseErrorNoForeignFetchResponse: + case kWebServiceWorkerResponseErrorForeignFetchHeadersWithoutOrigin: + case kWebServiceWorkerResponseErrorForeignFetchMismatchedOrigin: + case kWebServiceWorkerResponseErrorRedirectedResponseForNotFollowRequest: + case kWebServiceWorkerResponseErrorDataPipeCreationFailed: + NOTREACHED(); + error_message = error_message + "an unexpected error occurred."; + break; + } + + DCHECK(execution_context); + execution_context->AddConsoleMessage(ConsoleMessage::Create( + kJSMessageSource, kWarningMessageLevel, error_message)); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/modules/payments/PaymentHandlerUtils.h b/third_party/WebKit/Source/modules/payments/PaymentHandlerUtils.h new file mode 100644 index 0000000..1327c8d3 --- /dev/null +++ b/third_party/WebKit/Source/modules/payments/PaymentHandlerUtils.h
@@ -0,0 +1,27 @@ +// Copyright 2017 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 PaymentHandlerUtils_h +#define PaymentHandlerUtils_h + +#include "platform/wtf/Allocator.h" +#include "platform/wtf/text/WTFString.h" +#include "public/platform/modules/serviceworker/WebServiceWorkerResponseError.h" + +namespace blink { + +class ExecutionContext; + +class PaymentHandlerUtils { + STATIC_ONLY(PaymentHandlerUtils); + + public: + static void ReportResponseError(ExecutionContext*, + const String& event_name_prefix, + WebServiceWorkerResponseError); +}; + +} // namespace blink + +#endif // PaymentHandlerUtils_h
diff --git a/third_party/WebKit/Source/modules/payments/PaymentManager.cpp b/third_party/WebKit/Source/modules/payments/PaymentManager.cpp index 855c429..5d13a4b 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentManager.cpp +++ b/third_party/WebKit/Source/modules/payments/PaymentManager.cpp
@@ -14,7 +14,6 @@ #include "modules/serviceworkers/ServiceWorkerRegistration.h" #include "platform/bindings/ScriptState.h" #include "platform/mojo/MojoHelper.h" -#include "public/platform/InterfaceProvider.h" #include "public/platform/Platform.h" namespace blink { @@ -44,7 +43,7 @@ if (context && context->IsDocument()) { LocalFrame* frame = ToDocument(context)->GetFrame(); if (frame) - frame->GetInterfaceProvider()->GetInterface(std::move(request)); + frame->GetInterfaceProvider().GetInterface(std::move(request)); } else if (context && context->IsWorkerGlobalScope()) { WorkerThread* thread = ToWorkerGlobalScope(context)->GetThread(); thread->GetInterfaceProvider().GetInterface(std::move(request));
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp index cd94eb74..c90050d 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp +++ b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp
@@ -45,9 +45,9 @@ #include "platform/feature_policy/FeaturePolicy.h" #include "platform/mojo/MojoHelper.h" #include "platform/wtf/HashSet.h" -#include "public/platform/InterfaceProvider.h" #include "public/platform/Platform.h" #include "public/platform/WebTraceLocation.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace { @@ -1033,7 +1033,7 @@ DCHECK(shipping_type_.IsNull() || shipping_type_ == "shipping" || shipping_type_ == "delivery" || shipping_type_ == "pickup"); - GetFrame()->GetInterfaceProvider()->GetInterface( + GetFrame()->GetInterfaceProvider().GetInterface( mojo::MakeRequest(&payment_provider_)); payment_provider_.set_connection_error_handler(ConvertToBaseCallback( WTF::Bind(&PaymentRequest::OnError, WrapWeakPersistent(this),
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.cpp b/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.cpp index a9643ee..4f41e36 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.cpp +++ b/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.cpp
@@ -9,62 +9,13 @@ #include "bindings/core/v8/V8BindingForCore.h" #include "bindings/modules/v8/V8PaymentAppResponse.h" #include "core/dom/ExecutionContext.h" -#include "core/inspector/ConsoleMessage.h" #include "modules/payments/PaymentAppResponse.h" +#include "modules/payments/PaymentHandlerUtils.h" #include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h" #include "modules/serviceworkers/WaitUntilObserver.h" #include "public/platform/modules/payments/WebPaymentAppResponse.h" namespace blink { -namespace { - -// Returns the error message to let the developer know about the reason of the -// unusual failures. -const String GetMessageForResponseError(WebServiceWorkerResponseError error) { - String error_message = - "The respondWith() was rejected in PaymentRequestEvent: "; - switch (error) { - case kWebServiceWorkerResponseErrorPromiseRejected: - error_message = error_message + "the promise was rejected."; - break; - case kWebServiceWorkerResponseErrorDefaultPrevented: - error_message = - error_message + - "preventDefault() was called without calling respondWith()."; - break; - case kWebServiceWorkerResponseErrorNoV8Instance: - error_message = error_message + - "an object that was not a PaymentResponse was passed to " - "respondWith()."; - break; - case kWebServiceWorkerResponseErrorResponseTypeError: - error_message = error_message + - "the promise was resolved with an error response object."; - break; - case kWebServiceWorkerResponseErrorUnknown: - error_message = error_message + "an unexpected error occurred."; - break; - case kWebServiceWorkerResponseErrorResponseTypeOpaque: - case kWebServiceWorkerResponseErrorResponseTypeNotBasicOrDefault: - case kWebServiceWorkerResponseErrorBodyUsed: - case kWebServiceWorkerResponseErrorResponseTypeOpaqueForClientRequest: - case kWebServiceWorkerResponseErrorResponseTypeOpaqueRedirect: - case kWebServiceWorkerResponseErrorBodyLocked: - case kWebServiceWorkerResponseErrorNoForeignFetchResponse: - case kWebServiceWorkerResponseErrorForeignFetchHeadersWithoutOrigin: - case kWebServiceWorkerResponseErrorForeignFetchMismatchedOrigin: - case kWebServiceWorkerResponseErrorRedirectedResponseForNotFollowRequest: - case kWebServiceWorkerResponseErrorDataPipeCreationFailed: - NOTREACHED(); - error_message = error_message + "an unexpected error occurred."; - break; - } - return error_message; -} - -} // namespace - -PaymentRequestRespondWithObserver::~PaymentRequestRespondWithObserver() {} PaymentRequestRespondWithObserver* PaymentRequestRespondWithObserver::Create( ExecutionContext* context, @@ -75,10 +26,8 @@ void PaymentRequestRespondWithObserver::OnResponseRejected( WebServiceWorkerResponseError error) { - DCHECK(GetExecutionContext()); - GetExecutionContext()->AddConsoleMessage( - ConsoleMessage::Create(kJSMessageSource, kWarningMessageLevel, - GetMessageForResponseError(error))); + PaymentHandlerUtils::ReportResponseError(GetExecutionContext(), + "PaymentRequestEvent", error); WebPaymentAppResponse web_data; ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.h b/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.h index 9e9158133..8504d80 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.h +++ b/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.h
@@ -15,12 +15,13 @@ class ScriptValue; class WaitUntilObserver; -// This class observes the service worker's handling of a PaymentRequestEvent -// and notifies the client. +// Implementation for PaymentRequestEvent.respondWith(), which is used by the +// payment handler to provide a payment response when the payment successfully +// completes. class MODULES_EXPORT PaymentRequestRespondWithObserver final : public RespondWithObserver { public: - virtual ~PaymentRequestRespondWithObserver(); + ~PaymentRequestRespondWithObserver() override = default; static PaymentRequestRespondWithObserver* Create(ExecutionContext*, int event_id,
diff --git a/third_party/WebKit/Source/modules/permissions/PermissionUtils.cpp b/third_party/WebKit/Source/modules/permissions/PermissionUtils.cpp index 97a18f4..c2b0614d 100644 --- a/third_party/WebKit/Source/modules/permissions/PermissionUtils.cpp +++ b/third_party/WebKit/Source/modules/permissions/PermissionUtils.cpp
@@ -7,10 +7,8 @@ #include "core/dom/Document.h" #include "core/dom/ExecutionContext.h" #include "core/frame/LocalFrame.h" -#include "core/frame/LocalFrameClient.h" #include "core/workers/WorkerGlobalScope.h" #include "core/workers/WorkerThread.h" -#include "public/platform/InterfaceProvider.h" #include "services/service_manager/public/cpp/interface_provider.h" namespace blink { @@ -34,7 +32,7 @@ if (!frame) return false; - frame->GetInterfaceProvider()->GetInterface(std::move(request)); + frame->GetInterfaceProvider().GetInterface(std::move(request)); return true; }
diff --git a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp index ffafadd..f5f0c8d 100644 --- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp +++ b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp
@@ -73,6 +73,10 @@ return KURL(kParsedURLString, "remote-playback://" + encoded_source_info); } +bool IsBackgroundAvailabilityMonitoringDisabled() { + return MemoryCoordinator::IsLowEndDevice(); +} + } // anonymous namespace // static @@ -108,15 +112,14 @@ return promise; } - if (MemoryCoordinator::IsLowEndDevice()) { + int id = WatchAvailabilityInternal(new AvailabilityCallbackWrapper(callback)); + if (id == kWatchAvailabilityNotSupported) { resolver->Reject(DOMException::Create( kNotSupportedError, "Availability monitoring is not supported on this device.")); return promise; } - int id = WatchAvailabilityInternal(new AvailabilityCallbackWrapper(callback)); - // TODO(avayvod): Currently the availability is tracked for each media element // as soon as it's created, we probably want to limit that to when the // page/element is visible (see https://crbug.com/597281) and has default @@ -234,6 +237,11 @@ int RemotePlayback::WatchAvailabilityInternal( AvailabilityCallbackWrapper* callback) { + if (RuntimeEnabledFeatures::RemotePlaybackBackendEnabled() && + IsBackgroundAvailabilityMonitoringDisabled()) { + return kWatchAvailabilityNotSupported; + } + int id; do { id = GetExecutionContext()->CircularSequentialID(); @@ -352,6 +360,9 @@ void RemotePlayback::SourceChanged(const WebURL& source) { DCHECK(RuntimeEnabledFeatures::NewRemotePlaybackPipelineEnabled()); + if (IsBackgroundAvailabilityMonitoringDisabled()) + return; + WebURL current_url = availability_urls_.IsEmpty() ? WebURL() : availability_urls_[0]; WebURL new_url = GetAvailabilityUrl(source); @@ -377,6 +388,12 @@ } bool RemotePlayback::RemotePlaybackAvailable() const { + if (IsBackgroundAvailabilityMonitoringDisabled() && + RuntimeEnabledFeatures::RemotePlaybackBackendEnabled() && + !media_element_->currentSrc().IsEmpty()) { + return true; + } + return availability_ == WebRemotePlaybackAvailability::kDeviceAvailable; } @@ -450,6 +467,9 @@ } void RemotePlayback::MaybeStartListeningForAvailability() { + if (IsBackgroundAvailabilityMonitoringDisabled()) + return; + if (!RuntimeEnabledFeatures::RemotePlaybackBackendEnabled()) return;
diff --git a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.h b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.h index 70ac0b39..79f7b820 100644 --- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.h +++ b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.h
@@ -39,6 +39,10 @@ USING_GARBAGE_COLLECTED_MIXIN(RemotePlayback); public: + // Result of WatchAvailabilityInternal that means availability is not + // supported. + static const int kWatchAvailabilityNotSupported = -1; + static RemotePlayback* Create(HTMLMediaElement&); // Notifies this object that disableRemotePlayback attribute was set on the @@ -72,6 +76,8 @@ void PromptInternal(); // The implementation of watchAvailability() and cancelWatchAvailability(). + // Can return kWatchAvailabilityNotSupported to indicate the availability + // monitoring is disabled. RemotePlaybackAvailable() will return true then. int WatchAvailabilityInternal(AvailabilityCallbackWrapper*); bool CancelWatchAvailabilityInternal(int id);
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.cpp index 23f41f0..5b3178ae 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.cpp
@@ -154,6 +154,13 @@ fetch_event_id, response, stream_handle, event_dispatch_time); } +void ServiceWorkerGlobalScopeClient::RespondToCanMakePaymentEvent( + int event_id, + bool response, + double event_dispatch_time) { + client_.RespondToCanMakePaymentEvent(event_id, response, event_dispatch_time); +} + void ServiceWorkerGlobalScopeClient::RespondToPaymentRequestEvent( int event_id, const WebPaymentAppResponse& response,
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h index 51eb4ad1..8718788 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h
@@ -107,6 +107,9 @@ const WebServiceWorkerResponse&, WebServiceWorkerStreamHandle*, double event_dispatch_time); + void RespondToCanMakePaymentEvent(int event_id, + bool can_make_payment, + double event_dispatch_time); void RespondToPaymentRequestEvent(int event_id, const WebPaymentAppResponse&, double event_dispatch_time);
diff --git a/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp index a4b60bb..c6864e1 100644 --- a/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp +++ b/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp
@@ -11,7 +11,6 @@ #include "core/workers/WorkerThread.h" #include "modules/imagecapture/Point2D.h" #include "modules/shapedetection/DetectedBarcode.h" -#include "public/platform/InterfaceProvider.h" #include "services/service_manager/public/cpp/interface_provider.h" namespace blink { @@ -25,7 +24,7 @@ if (context->IsDocument()) { LocalFrame* frame = ToDocument(context)->GetFrame(); if (frame) - frame->GetInterfaceProvider()->GetInterface(std::move(request)); + frame->GetInterfaceProvider().GetInterface(std::move(request)); } else { WorkerThread* thread = ToWorkerGlobalScope(context)->GetThread(); thread->GetInterfaceProvider().GetInterface(std::move(request));
diff --git a/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp index f14dc03..269b5eee 100644 --- a/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp +++ b/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
@@ -13,7 +13,6 @@ #include "modules/shapedetection/DetectedFace.h" #include "modules/shapedetection/FaceDetectorOptions.h" #include "modules/shapedetection/Landmark.h" -#include "public/platform/InterfaceProvider.h" #include "public/platform/Platform.h" #include "services/service_manager/public/cpp/interface_provider.h" #include "services/shape_detection/public/interfaces/facedetection_provider.mojom-blink.h" @@ -38,7 +37,7 @@ if (context->IsDocument()) { LocalFrame* frame = ToDocument(context)->GetFrame(); if (frame) - frame->GetInterfaceProvider()->GetInterface(std::move(request)); + frame->GetInterfaceProvider().GetInterface(std::move(request)); } else { WorkerThread* thread = ToWorkerGlobalScope(context)->GetThread(); thread->GetInterfaceProvider().GetInterface(std::move(request));
diff --git a/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp index 09fb158..edb855a 100644 --- a/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp +++ b/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp
@@ -10,7 +10,6 @@ #include "core/html/canvas/CanvasImageSource.h" #include "core/workers/WorkerThread.h" #include "modules/shapedetection/DetectedText.h" -#include "public/platform/InterfaceProvider.h" #include "services/service_manager/public/cpp/interface_provider.h" namespace blink { @@ -24,7 +23,7 @@ if (context->IsDocument()) { LocalFrame* frame = ToDocument(context)->GetFrame(); if (frame) - frame->GetInterfaceProvider()->GetInterface(std::move(request)); + frame->GetInterfaceProvider().GetInterface(std::move(request)); } else { WorkerThread* thread = ToWorkerGlobalScope(context)->GetThread(); thread->GetInterfaceProvider().GetInterface(std::move(request));
diff --git a/third_party/WebKit/Source/modules/vr/VRController.cpp b/third_party/WebKit/Source/modules/vr/VRController.cpp index 5e4191e..c51cdd8 100644 --- a/third_party/WebKit/Source/modules/vr/VRController.cpp +++ b/third_party/WebKit/Source/modules/vr/VRController.cpp
@@ -10,9 +10,8 @@ #include "core/frame/LocalFrame.h" #include "modules/vr/NavigatorVR.h" #include "modules/vr/VRGetDevicesCallback.h" -#include "public/platform/InterfaceProvider.h" - #include "platform/wtf/Assertions.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace blink { @@ -21,7 +20,7 @@ navigator_vr_(navigator_vr), display_synced_(false), binding_(this) { - navigator_vr->GetDocument()->GetFrame()->GetInterfaceProvider()->GetInterface( + navigator_vr->GetDocument()->GetFrame()->GetInterfaceProvider().GetInterface( mojo::MakeRequest(&service_)); service_.set_connection_error_handler(ConvertToBaseCallback( WTF::Bind(&VRController::Dispose, WrapWeakPersistent(this))));
diff --git a/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLock.cpp b/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLock.cpp index 697ab8b0..231e83d 100644 --- a/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLock.cpp +++ b/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLock.cpp
@@ -9,7 +9,7 @@ #include "core/frame/Screen.h" #include "core/page/PageVisibilityState.h" #include "platform/RuntimeEnabledFeatures.h" -#include "public/platform/InterfaceProvider.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace blink { @@ -67,8 +67,7 @@ PageVisibilityObserver(frame.GetPage()), keep_awake_(false) { DCHECK(!service_.is_bound()); - DCHECK(frame.GetInterfaceProvider()); - frame.GetInterfaceProvider()->GetInterface(mojo::MakeRequest(&service_)); + frame.GetInterfaceProvider().GetInterface(mojo::MakeRequest(&service_)); } bool ScreenWakeLock::keepAwake() const {
diff --git a/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLockTest.cpp b/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLockTest.cpp index ed9eb27..43dbff2 100644 --- a/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLockTest.cpp +++ b/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLockTest.cpp
@@ -13,10 +13,10 @@ #include "mojo/public/cpp/bindings/strong_binding.h" #include "platform/testing/URLTestHelpers.h" #include "platform/testing/UnitTestHelpers.h" -#include "public/platform/InterfaceProvider.h" #include "public/platform/Platform.h" #include "public/platform/WebPageVisibilityState.h" #include "public/platform/WebURLLoaderMockFactory.h" +#include "services/service_manager/public/cpp/interface_provider.h" #include "testing/gtest/include/gtest/gtest.h" #include <memory> @@ -27,63 +27,41 @@ using device::mojom::blink::WakeLock; using device::mojom::blink::WakeLockRequest; -// This class allows binding interface requests to a MockWakeLock. -class MockInterfaceProvider : public InterfaceProvider { +// A mock WakeLock used to intercept calls to the mojo methods. +class MockWakeLock : public WakeLock { public: - MockInterfaceProvider() : wake_lock_status_(false) {} - ~MockInterfaceProvider() {} + MockWakeLock() : binding_(this) {} + ~MockWakeLock() = default; - void GetInterface(const char* name, mojo::ScopedMessagePipeHandle) override; - - bool WakeLockStatus() const { return wake_lock_status_; } - void SetWakeLockStatus(bool status) { wake_lock_status_ = status; } - - private: - // A mock WakeLock used to intercept calls to the mojo methods. - class MockWakeLock : public WakeLock { - public: - MockWakeLock(MockInterfaceProvider* registry, WakeLockRequest request) - : binding_(this, std::move(request)), registry_(registry) {} - ~MockWakeLock() {} - - private: - // mojom::WakeLock - void RequestWakeLock() override { registry_->SetWakeLockStatus(true); } - void CancelWakeLock() override { registry_->SetWakeLockStatus(false); } - void AddClient(device::mojom::blink::WakeLockRequest wake_lock) override {} - void ChangeType(device::mojom::WakeLockType type, - ChangeTypeCallback callback) override {} - void HasWakeLockForTests(HasWakeLockForTestsCallback callback) override {} - - mojo::Binding<WakeLock> binding_; - MockInterfaceProvider* const registry_; - }; - std::unique_ptr<MockWakeLock> mock_wake_lock_; - - bool wake_lock_status_; -}; - -void MockInterfaceProvider::GetInterface(const char* name, - mojo::ScopedMessagePipeHandle handle) { - mock_wake_lock_.reset( - new MockWakeLock(this, WakeLockRequest(std::move(handle)))); -} - -// A TestWebFrameClient to allow overriding the interfaceProvider() with a mock. -class TestWebFrameClient : public FrameTestHelpers::TestWebFrameClient { - public: - ~TestWebFrameClient() override = default; - InterfaceProvider* GetInterfaceProviderForTesting() override { - return &interface_provider_; + void Bind(mojo::ScopedMessagePipeHandle handle) { + binding_.Bind(WakeLockRequest(std::move(handle))); } + bool WakeLockStatus() { return wake_lock_status_; } + private: - MockInterfaceProvider interface_provider_; + // mojom::WakeLock + void RequestWakeLock() override { wake_lock_status_ = true; } + void CancelWakeLock() override { wake_lock_status_ = false; } + void AddClient(device::mojom::blink::WakeLockRequest wake_lock) override {} + void ChangeType(device::mojom::WakeLockType type, + ChangeTypeCallback callback) override {} + void HasWakeLockForTests(HasWakeLockForTestsCallback callback) override {} + + mojo::Binding<WakeLock> binding_; + bool wake_lock_status_ = false; }; class ScreenWakeLockTest : public ::testing::Test { protected: void SetUp() override { + service_manager::InterfaceProvider::TestApi test_api( + test_web_frame_client_.GetInterfaceProvider()); + test_api.SetBinderForName( + WakeLock::Name_, + ConvertToBaseCallback( + WTF::Bind(&MockWakeLock::Bind, WTF::Unretained(&mock_wake_lock_)))); + web_view_helper_.Initialize(&test_web_frame_client_); URLTestHelpers::RegisterMockedURLLoadFromBase( WebString::FromUTF8("http://example.com/"), testing::CoreTestDataPath(), @@ -106,8 +84,8 @@ LocalFrame* GetFrame() { DCHECK(web_view_helper_.WebView()); - DCHECK(web_view_helper_.LocalMainFrame()); - return web_view_helper_.LocalMainFrame()->GetFrame(); + DCHECK(web_view_helper_.WebView()->MainFrameImpl()); + return web_view_helper_.WebView()->MainFrameImpl()->GetFrame(); } Screen* GetScreen() { @@ -121,11 +99,7 @@ return ScreenWakeLock::keepAwake(*GetScreen()); } - bool ClientKeepScreenAwake() { - return static_cast<MockInterfaceProvider*>( - test_web_frame_client_.GetInterfaceProviderForTesting()) - ->WakeLockStatus(); - } + bool ClientKeepScreenAwake() { return mock_wake_lock_.WakeLockStatus(); } void SetKeepAwake(bool keepAwake) { DCHECK(GetScreen()); @@ -152,8 +126,10 @@ // Order of these members is important as we need to make sure that // test_web_frame_client_ outlives web_view_helper_ (destruction order) - TestWebFrameClient test_web_frame_client_; + FrameTestHelpers::TestWebFrameClient test_web_frame_client_; FrameTestHelpers::WebViewHelper web_view_helper_; + + MockWakeLock mock_wake_lock_; }; TEST_F(ScreenWakeLockTest, setAndReset) {
diff --git a/third_party/WebKit/Source/modules/webauth/WebAuthentication.cpp b/third_party/WebKit/Source/modules/webauth/WebAuthentication.cpp index b2f17e44..4ef1510 100644 --- a/third_party/WebKit/Source/modules/webauth/WebAuthentication.cpp +++ b/third_party/WebKit/Source/modules/webauth/WebAuthentication.cpp
@@ -16,7 +16,7 @@ #include "modules/webauth/ScopedCredential.h" #include "modules/webauth/ScopedCredentialOptions.h" #include "modules/webauth/ScopedCredentialParameters.h" -#include "public/platform/InterfaceProvider.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace { const char kNoAuthenticatorError[] = "Authenticator unavailable."; @@ -258,7 +258,7 @@ return ScriptPromise::RejectWithDOMException( script_state, DOMException::Create(kNotSupportedError)); } - GetFrame()->GetInterfaceProvider()->GetInterface( + GetFrame()->GetInterfaceProvider().GetInterface( mojo::MakeRequest(&authenticator_)); authenticator_.set_connection_error_handler(ConvertToBaseCallback(
diff --git a/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp b/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp index 667432a..d72ce8c 100644 --- a/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp +++ b/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp
@@ -14,8 +14,8 @@ #include "modules/webshare/ShareData.h" #include "platform/bindings/V8ThrowException.h" #include "platform/mojo/MojoHelper.h" -#include "public/platform/InterfaceProvider.h" #include "public/platform/Platform.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace blink { @@ -124,7 +124,7 @@ if (!service_) { LocalFrame* frame = doc->GetFrame(); DCHECK(frame); - frame->GetInterfaceProvider()->GetInterface(mojo::MakeRequest(&service_)); + frame->GetInterfaceProvider().GetInterface(mojo::MakeRequest(&service_)); service_.set_connection_error_handler(ConvertToBaseCallback(WTF::Bind( &NavigatorShare::OnConnectionError, WrapWeakPersistent(this)))); DCHECK(service_);
diff --git a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp index 686b901..535ce3f 100644 --- a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp +++ b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp
@@ -36,7 +36,6 @@ #include "core/fileapi/FileReaderLoader.h" #include "core/fileapi/FileReaderLoaderClient.h" #include "core/frame/LocalFrame.h" -#include "core/frame/LocalFrameClient.h" #include "core/frame/WebLocalFrameBase.h" #include "core/inspector/ConsoleMessage.h" #include "core/loader/BaseFetchContext.h" @@ -61,11 +60,11 @@ #include "platform/weborigin/SecurityOrigin.h" #include "platform/wtf/Functional.h" #include "platform/wtf/PtrUtil.h" -#include "public/platform/InterfaceProvider.h" #include "public/platform/Platform.h" #include "public/platform/WebSocketHandshakeThrottle.h" #include "public/platform/WebTraceLocation.h" #include "public/platform/WebURL.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace blink { @@ -282,7 +281,7 @@ mojom::blink::WebSocketPtr socket_ptr; auto socket_request = mojo::MakeRequest(&socket_ptr); if (GetDocument() && GetDocument()->GetFrame()) { - GetDocument()->GetFrame()->GetInterfaceProvider()->GetInterface( + GetDocument()->GetFrame()->GetInterfaceProvider().GetInterface( std::move(socket_request)); }
diff --git a/third_party/WebKit/Source/modules/webusb/DEPS b/third_party/WebKit/Source/modules/webusb/DEPS index a455f6b..1e6ebea1 100644 --- a/third_party/WebKit/Source/modules/webusb/DEPS +++ b/third_party/WebKit/Source/modules/webusb/DEPS
@@ -1,5 +1,4 @@ include_rules = [ "+device/usb/public/interfaces", "+mojo/public/cpp/bindings", - "+services/service_manager/public/cpp", ]
diff --git a/third_party/WebKit/Source/modules/webusb/USB.cpp b/third_party/WebKit/Source/modules/webusb/USB.cpp index db85429..602dced 100644 --- a/third_party/WebKit/Source/modules/webusb/USB.cpp +++ b/third_party/WebKit/Source/modules/webusb/USB.cpp
@@ -10,7 +10,6 @@ #include "core/dom/Document.h" #include "core/dom/ExceptionCode.h" #include "core/dom/UserGestureIndicator.h" -#include "core/frame/LocalFrameClient.h" #include "device/usb/public/interfaces/device.mojom-blink.h" #include "modules/EventTargetModules.h" #include "modules/webusb/USBConnectionEvent.h" @@ -125,7 +124,7 @@ } if (!chooser_service_) { - GetFrame()->Client()->GetInterfaceProvider()->GetInterface( + GetFrame()->GetInterfaceProvider().GetInterface( mojo::MakeRequest(&chooser_service_)); chooser_service_.set_connection_error_handler( ConvertToBaseCallback(WTF::Bind(&USB::OnChooserServiceConnectionError, @@ -272,7 +271,7 @@ return; DCHECK(GetFrame()); - GetFrame()->Client()->GetInterfaceProvider()->GetInterface( + GetFrame()->GetInterfaceProvider().GetInterface( mojo::MakeRequest(&device_manager_)); device_manager_.set_connection_error_handler(ConvertToBaseCallback(WTF::Bind( &USB::OnDeviceManagerConnectionError, WrapWeakPersistent(this))));
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn index 93a78d7..74bbce27 100644 --- a/third_party/WebKit/Source/platform/BUILD.gn +++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -1283,6 +1283,8 @@ "scheduler/base/queueing_time_estimator.h", "scheduler/base/real_time_domain.cc", "scheduler/base/real_time_domain.h", + "scheduler/base/task_queue.cc", + "scheduler/base/task_queue.h", "scheduler/base/task_queue_impl.cc", "scheduler/base/task_queue_impl.h", "scheduler/base/task_queue_manager.cc", @@ -1328,8 +1330,12 @@ "scheduler/child/worker_global_scope_scheduler.h", "scheduler/child/worker_scheduler.cc", "scheduler/child/worker_scheduler.h", + "scheduler/child/worker_scheduler_helper.cc", + "scheduler/child/worker_scheduler_helper.h", "scheduler/child/worker_scheduler_impl.cc", "scheduler/child/worker_scheduler_impl.h", + "scheduler/child/worker_task_queue.cc", + "scheduler/child/worker_task_queue.h", "scheduler/renderer/auto_advancing_virtual_time_domain.cc", "scheduler/renderer/auto_advancing_virtual_time_domain.h", "scheduler/renderer/budget_pool.cc", @@ -1340,6 +1346,10 @@ "scheduler/renderer/deadline_task_runner.h", "scheduler/renderer/idle_time_estimator.cc", "scheduler/renderer/idle_time_estimator.h", + "scheduler/renderer/main_thread_scheduler_helper.cc", + "scheduler/renderer/main_thread_scheduler_helper.h", + "scheduler/renderer/main_thread_task_queue.cc", + "scheduler/renderer/main_thread_task_queue.h", "scheduler/renderer/render_widget_scheduling_state.cc", "scheduler/renderer/render_widget_signals.cc", "scheduler/renderer/render_widget_signals.h", @@ -1709,6 +1719,7 @@ "graphics/gpu/DrawingBufferTestHelpers.h", "network/mime/MockMimeRegistry.h", "scheduler/base/task_queue_manager_delegate_for_test.cc", + "scheduler/base/task_queue_manager_delegate_for_test.h", "scheduler/base/test_task_time_observer.h", "scheduler/base/test_time_source.cc", "scheduler/base/test_time_source.h", @@ -1720,6 +1731,8 @@ "scheduler/test/lazy_scheduler_message_loop_delegate_for_tests.cc", "scheduler/test/lazy_scheduler_message_loop_delegate_for_tests.h", "scheduler/test/renderer_scheduler_test_support.cc", + "scheduler/test/test_task_queue.cc", + "scheduler/test/test_task_queue.h", "scroll/ScrollbarTestSuite.h", "testing/CompositorTest.cpp", "testing/CompositorTest.h", @@ -1876,6 +1889,7 @@ "graphics/RecordingImageBufferSurfaceTest.cpp", "graphics/compositing/ContentLayerClientImplTest.cpp", "graphics/compositing/PaintArtifactCompositorTest.cpp", + "graphics/compositing/PaintChunksToCcLayerTest.cpp", "graphics/filters/ImageFilterBuilderTest.cpp", "graphics/gpu/DrawingBufferTest.cpp", "graphics/gpu/SharedGpuContextTest.cpp", @@ -2061,8 +2075,6 @@ test("blink_platform_perftests") { sources = [ - "scheduler/base/task_queue_manager_delegate_for_test.cc", - "scheduler/base/task_queue_manager_delegate_for_test.h", "scheduler/base/task_queue_manager_perftest.cc", "testing/BlinkPerfTestSuite.cpp", "testing/BlinkPerfTestSuite.h", @@ -2078,6 +2090,7 @@ deps = [ ":platform", + ":test_support", "//base", "//base/test:test_support", "//testing/gtest",
diff --git a/third_party/WebKit/Source/platform/DEPS b/third_party/WebKit/Source/platform/DEPS index 4edbeed..c243c07 100644 --- a/third_party/WebKit/Source/platform/DEPS +++ b/third_party/WebKit/Source/platform/DEPS
@@ -37,7 +37,6 @@ "+mozilla", "+platform", "+public/platform", - "+services/service_manager/public/interfaces", "+skia/ext", "+third_party/ced/src/compact_enc_det/compact_enc_det.h", "+third_party/khronos",
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5 b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5 index f329ba1..cb12eb6 100644 --- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5 +++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5
@@ -80,6 +80,10 @@ status: "stable", }, { + name: "AsyncClipboard", + status: "experimental", + }, + { name: "AudioOutputDevices", status: "stable", }, @@ -156,6 +160,9 @@ status: "stable", }, { + name: "ClientPlaceholdersForServerLoFi", + }, + { name: "CoalescedEvents", status: "stable", },
diff --git a/third_party/WebKit/Source/platform/TimerTest.cpp b/third_party/WebKit/Source/platform/TimerTest.cpp index b3cf96a9..6d50da8 100644 --- a/third_party/WebKit/Source/platform/TimerTest.cpp +++ b/third_party/WebKit/Source/platform/TimerTest.cpp
@@ -10,6 +10,7 @@ #include "platform/scheduler/base/task_queue_impl.h" #include "platform/scheduler/child/web_scheduler.h" #include "platform/scheduler/child/web_task_runner_impl.h" +#include "platform/scheduler/renderer/main_thread_task_queue.h" #include "platform/scheduler/renderer/renderer_scheduler_impl.h" #include "platform/scheduler/renderer/web_view_scheduler.h" #include "platform/testing/TestingPlatformSupport.h" @@ -538,7 +539,7 @@ TEST_F(TimerTest, UserSuppliedWebTaskRunner) { scoped_refptr<scheduler::TaskQueue> task_runner( platform_->GetRendererScheduler()->NewTimerTaskQueue( - scheduler::TaskQueue::QueueType::TEST)); + scheduler::MainThreadTaskQueue::QueueType::TEST)); RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner = scheduler::WebTaskRunnerImpl::Create(task_runner); TimerForTest<TimerTest> timer(web_task_runner, this, @@ -626,7 +627,7 @@ scoped_refptr<scheduler::TaskQueue> task_runner1( platform_->GetRendererScheduler()->NewTimerTaskQueue( - scheduler::TaskQueue::QueueType::TEST)); + scheduler::MainThreadTaskQueue::QueueType::TEST)); RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner1 = scheduler::WebTaskRunnerImpl::Create(task_runner1); TaskObserver task_observer1(web_task_runner1, &run_order); @@ -634,7 +635,7 @@ scoped_refptr<scheduler::TaskQueue> task_runner2( platform_->GetRendererScheduler()->NewTimerTaskQueue( - scheduler::TaskQueue::QueueType::TEST)); + scheduler::MainThreadTaskQueue::QueueType::TEST)); RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner2 = scheduler::WebTaskRunnerImpl::Create(task_runner2); TaskObserver task_observer2(web_task_runner2, &run_order); @@ -666,7 +667,7 @@ scoped_refptr<scheduler::TaskQueue> task_runner1( platform_->GetRendererScheduler()->NewTimerTaskQueue( - scheduler::TaskQueue::QueueType::TEST)); + scheduler::MainThreadTaskQueue::QueueType::TEST)); RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner1 = scheduler::WebTaskRunnerImpl::Create(task_runner1); TaskObserver task_observer1(web_task_runner1, &run_order); @@ -674,7 +675,7 @@ scoped_refptr<scheduler::TaskQueue> task_runner2( platform_->GetRendererScheduler()->NewTimerTaskQueue( - scheduler::TaskQueue::QueueType::TEST)); + scheduler::MainThreadTaskQueue::QueueType::TEST)); RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner2 = scheduler::WebTaskRunnerImpl::Create(task_runner2); TaskObserver task_observer2(web_task_runner2, &run_order); @@ -708,13 +709,13 @@ TEST_F(TimerTest, MoveToNewTaskRunnerWithoutTasks) { scoped_refptr<scheduler::TaskQueue> task_runner1( platform_->GetRendererScheduler()->NewTimerTaskQueue( - scheduler::TaskQueue::QueueType::TEST)); + scheduler::MainThreadTaskQueue::QueueType::TEST)); RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner1 = scheduler::WebTaskRunnerImpl::Create(task_runner1); scoped_refptr<scheduler::TaskQueue> task_runner2( platform_->GetRendererScheduler()->NewTimerTaskQueue( - scheduler::TaskQueue::QueueType::TEST)); + scheduler::MainThreadTaskQueue::QueueType::TEST)); RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner2 = scheduler::WebTaskRunnerImpl::Create(task_runner2);
diff --git a/third_party/WebKit/Source/platform/exported/WebRuntimeFeatures.cpp b/third_party/WebKit/Source/platform/exported/WebRuntimeFeatures.cpp index 8ab62d4..bc0e908 100644 --- a/third_party/WebKit/Source/platform/exported/WebRuntimeFeatures.cpp +++ b/third_party/WebKit/Source/platform/exported/WebRuntimeFeatures.cpp
@@ -422,4 +422,8 @@ RuntimeEnabledFeatures::SetWebAuthEnabled(enable); } +void WebRuntimeFeatures::EnableClientPlaceholdersForServerLoFi(bool enable) { + RuntimeEnabledFeatures::SetClientPlaceholdersForServerLoFiEnabled(enable); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/DEPS b/third_party/WebKit/Source/platform/graphics/DEPS index 7dcab9c..767e09e6 100644 --- a/third_party/WebKit/Source/platform/graphics/DEPS +++ b/third_party/WebKit/Source/platform/graphics/DEPS
@@ -8,6 +8,7 @@ "+base/threading/thread_checker.h", "+cc", "-cc/blink", + "+components/viz/common/quads", "+gpu/command_buffer/client/gles2_interface.h", "+gpu/command_buffer/client/gpu_memory_buffer_manager.h", "+gpu/command_buffer/common/capabilities.h",
diff --git a/third_party/WebKit/Source/platform/graphics/Gradient.cpp b/third_party/WebKit/Source/platform/graphics/Gradient.cpp index 477657d..5d34b39 100644 --- a/third_party/WebKit/Source/platform/graphics/Gradient.cpp +++ b/third_party/WebKit/Source/platform/graphics/Gradient.cpp
@@ -129,7 +129,7 @@ } } -std::unique_ptr<PaintShader> Gradient::CreateShaderInternal( +sk_sp<PaintShader> Gradient::CreateShaderInternal( const SkMatrix& local_matrix) { SortStopsIfNecessary(); DCHECK(stops_sorted_); @@ -159,7 +159,7 @@ uint32_t flags = color_interpolation_ == ColorInterpolation::kPremultiplied ? SkGradientShader::kInterpolateColorsInPremul_Flag : 0; - std::unique_ptr<PaintShader> shader = + sk_sp<PaintShader> shader = CreateShader(colors, pos, tile, flags, local_matrix, colors.back()); DCHECK(shader); @@ -175,7 +175,7 @@ cached_shader_ = CreateShaderInternal(local_matrix); } - flags.setShader(WTF::MakeUnique<PaintShader>(*cached_shader_)); + flags.setShader(cached_shader_); // Legacy behavior: gradients are always dithered. flags.setDither(true); @@ -194,13 +194,12 @@ p1_(p1) {} protected: - std::unique_ptr<PaintShader> CreateShader( - const ColorBuffer& colors, - const OffsetBuffer& pos, - SkShader::TileMode tile_mode, - uint32_t flags, - const SkMatrix& local_matrix, - SkColor fallback_color) const override { + sk_sp<PaintShader> CreateShader(const ColorBuffer& colors, + const OffsetBuffer& pos, + SkShader::TileMode tile_mode, + uint32_t flags, + const SkMatrix& local_matrix, + SkColor fallback_color) const override { SkPoint pts[2] = {p0_.Data(), p1_.Data()}; return PaintShader::MakeLinearGradient( pts, colors.data(), pos.data(), static_cast<int>(colors.size()), @@ -229,13 +228,12 @@ aspect_ratio_(aspect_ratio) {} protected: - std::unique_ptr<PaintShader> CreateShader( - const ColorBuffer& colors, - const OffsetBuffer& pos, - SkShader::TileMode tile_mode, - uint32_t flags, - const SkMatrix& local_matrix, - SkColor fallback_color) const override { + sk_sp<PaintShader> CreateShader(const ColorBuffer& colors, + const OffsetBuffer& pos, + SkShader::TileMode tile_mode, + uint32_t flags, + const SkMatrix& local_matrix, + SkColor fallback_color) const override { SkTCopyOnFirstWrite<SkMatrix> adjusted_local_matrix(local_matrix); if (aspect_ratio_ != 1) { // CSS3 elliptical gradients: apply the elliptical scaling at the @@ -282,13 +280,12 @@ angle_(angle) {} protected: - std::unique_ptr<PaintShader> CreateShader( - const ColorBuffer& colors, - const OffsetBuffer& pos, - SkShader::TileMode tile_mode, - uint32_t flags, - const SkMatrix& local_matrix, - SkColor fallback_color) const override { + sk_sp<PaintShader> CreateShader(const ColorBuffer& colors, + const OffsetBuffer& pos, + SkShader::TileMode tile_mode, + uint32_t flags, + const SkMatrix& local_matrix, + SkColor fallback_color) const override { DCHECK_NE(tile_mode, SkShader::kMirror_TileMode); // Skia's sweep gradient angles are relative to the x-axis, not the y-axis.
diff --git a/third_party/WebKit/Source/platform/graphics/Gradient.h b/third_party/WebKit/Source/platform/graphics/Gradient.h index 19f952a..eab3f275 100644 --- a/third_party/WebKit/Source/platform/graphics/Gradient.h +++ b/third_party/WebKit/Source/platform/graphics/Gradient.h
@@ -102,16 +102,15 @@ using ColorBuffer = Vector<SkColor, 8>; using OffsetBuffer = Vector<SkScalar, 8>; - virtual std::unique_ptr<PaintShader> CreateShader(const ColorBuffer&, - const OffsetBuffer&, - SkShader::TileMode, - uint32_t flags, - const SkMatrix&, - SkColor) const = 0; + virtual sk_sp<PaintShader> CreateShader(const ColorBuffer&, + const OffsetBuffer&, + SkShader::TileMode, + uint32_t flags, + const SkMatrix&, + SkColor) const = 0; private: - std::unique_ptr<PaintShader> CreateShaderInternal( - const SkMatrix& local_matrix); + sk_sp<PaintShader> CreateShaderInternal(const SkMatrix& local_matrix); sk_sp<SkColorFilter> color_filter_; @@ -125,7 +124,7 @@ Vector<ColorStop, 2> stops_; bool stops_sorted_; - mutable std::unique_ptr<PaintShader> cached_shader_; + mutable sk_sp<PaintShader> cached_shader_; }; } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/Image.cpp b/third_party/WebKit/Source/platform/graphics/Image.cpp index a49261b..4e4d26c4b 100644 --- a/third_party/WebKit/Source/platform/graphics/Image.cpp +++ b/third_party/WebKit/Source/platform/graphics/Image.cpp
@@ -228,12 +228,12 @@ namespace { -std::unique_ptr<PaintShader> CreatePatternShader(const PaintImage& image, - const SkMatrix& shader_matrix, - const PaintFlags& paint, - const FloatSize& spacing, - SkShader::TileMode tmx, - SkShader::TileMode tmy) { +sk_sp<PaintShader> CreatePatternShader(const PaintImage& image, + const SkMatrix& shader_matrix, + const PaintFlags& paint, + const FloatSize& spacing, + SkShader::TileMode tmx, + SkShader::TileMode tmy) { if (spacing.IsZero()) { return PaintShader::MakeImage(image.sk_image(), tmx, tmy, &shader_matrix); }
diff --git a/third_party/WebKit/Source/platform/graphics/ImagePattern.cpp b/third_party/WebKit/Source/platform/graphics/ImagePattern.cpp index dbf9de5..25de65b1 100644 --- a/third_party/WebKit/Source/platform/graphics/ImagePattern.cpp +++ b/third_party/WebKit/Source/platform/graphics/ImagePattern.cpp
@@ -29,8 +29,7 @@ return local_matrix != previous_local_matrix_; } -std::unique_ptr<PaintShader> ImagePattern::CreateShader( - const SkMatrix& local_matrix) { +sk_sp<PaintShader> ImagePattern::CreateShader(const SkMatrix& local_matrix) { if (!tile_image_) { return PaintShader::MakeColor(SK_ColorTRANSPARENT); }
diff --git a/third_party/WebKit/Source/platform/graphics/ImagePattern.h b/third_party/WebKit/Source/platform/graphics/ImagePattern.h index ed52189..a9c0ffb 100644 --- a/third_party/WebKit/Source/platform/graphics/ImagePattern.h +++ b/third_party/WebKit/Source/platform/graphics/ImagePattern.h
@@ -20,7 +20,7 @@ bool IsTextureBacked() const override; protected: - std::unique_ptr<PaintShader> CreateShader(const SkMatrix&) override; + sk_sp<PaintShader> CreateShader(const SkMatrix&) override; bool IsLocalMatrixChanged(const SkMatrix&) const override; private:
diff --git a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp index 36286e71..e6f773c 100644 --- a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp +++ b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
@@ -6,6 +6,7 @@ #include "cc/output/compositor_frame.h" #include "cc/quads/texture_draw_quad.h" +#include "components/viz/common/quads/resource_format.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "platform/CrossThreadFunctional.h" #include "platform/Histogram.h" @@ -275,7 +276,7 @@ cc::TransferableResource resource; resource.id = next_resource_id_; - resource.format = cc::ResourceFormat::RGBA_8888; + resource.format = viz::ResourceFormat::RGBA_8888; resource.size = gfx::Size(width_, height_); // This indicates the filtering on the resource inherently, not the desired // filtering effect on the quad.
diff --git a/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.cpp b/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.cpp index c3b59885..34c0ed6 100644 --- a/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.cpp +++ b/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.cpp
@@ -33,7 +33,7 @@ PaintRecordPattern::~PaintRecordPattern() {} -std::unique_ptr<PaintShader> PaintRecordPattern::CreateShader( +sk_sp<PaintShader> PaintRecordPattern::CreateShader( const SkMatrix& local_matrix) { return PaintShader::MakePaintRecord( tile_record_, tile_record_bounds_, SkShader::kRepeat_TileMode,
diff --git a/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.h b/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.h index 3d826a63..fe3d95d 100644 --- a/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.h +++ b/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.h
@@ -21,7 +21,7 @@ ~PaintRecordPattern() override; protected: - std::unique_ptr<PaintShader> CreateShader(const SkMatrix&) override; + sk_sp<PaintShader> CreateShader(const SkMatrix&) override; private: PaintRecordPattern(sk_sp<PaintRecord>,
diff --git a/third_party/WebKit/Source/platform/graphics/Pattern.cpp b/third_party/WebKit/Source/platform/graphics/Pattern.cpp index 53cf3a8..181339a 100644 --- a/third_party/WebKit/Source/platform/graphics/Pattern.cpp +++ b/third_party/WebKit/Source/platform/graphics/Pattern.cpp
@@ -59,7 +59,7 @@ if (!cached_shader_ || IsLocalMatrixChanged(local_matrix)) cached_shader_ = CreateShader(local_matrix); - flags.setShader(WTF::MakeUnique<PaintShader>(*cached_shader_)); + flags.setShader(cached_shader_); } bool Pattern::IsLocalMatrixChanged(const SkMatrix& local_matrix) const {
diff --git a/third_party/WebKit/Source/platform/graphics/Pattern.h b/third_party/WebKit/Source/platform/graphics/Pattern.h index f939b5e..1db8d22 100644 --- a/third_party/WebKit/Source/platform/graphics/Pattern.h +++ b/third_party/WebKit/Source/platform/graphics/Pattern.h
@@ -72,13 +72,13 @@ virtual bool IsTextureBacked() const { return false; } protected: - virtual std::unique_ptr<PaintShader> CreateShader(const SkMatrix&) = 0; + virtual sk_sp<PaintShader> CreateShader(const SkMatrix&) = 0; virtual bool IsLocalMatrixChanged(const SkMatrix&) const; RepeatMode repeat_mode_; Pattern(RepeatMode); - mutable std::unique_ptr<PaintShader> cached_shader_; + mutable sk_sp<PaintShader> cached_shader_; }; } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp index d265df4..eca0d14 100644 --- a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp +++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp
@@ -1478,7 +1478,7 @@ rects_with_color.push_back( RectWithColor(FloatRect(0, 0, 100, 100), Color::kWhite)); rects_with_color.push_back( - RectWithColor(FloatRect(40, 50, 50, 60), Color(Color::kBlack))); + RectWithColor(FloatRect(40, 50, 10, 10), Color(Color::kBlack))); rects_with_color.push_back( RectWithColor(FloatRect(0, 0, 200, 300), Color::kGray)); const cc::Layer* layer = ContentLayerAt(0);
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp index 44f49632..21ee964e 100644 --- a/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp +++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp
@@ -19,210 +19,341 @@ namespace { -// Applies the clips between |localState| and |ancestorState| into a single -// combined cc::FloatClipDisplayItem on |ccList|. -static void ApplyClipsBetweenStates(const PropertyTreeState& local_state, - const PropertyTreeState& ancestor_state, - cc::DisplayItemList& cc_list, - Vector<int>& needed_restores) { - DCHECK(local_state.Transform() == ancestor_state.Transform()); -#if DCHECK_IS_ON() - const TransformPaintPropertyNode* transform_node = - local_state.Clip()->LocalTransformSpace(); - if (transform_node != ancestor_state.Transform()) { - const TransformationMatrix& local_to_ancestor_matrix = - GeometryMapper::SourceToDestinationProjection( - transform_node, ancestor_state.Transform()); - // Clips are only in descendant spaces that are transformed by one - // or more scrolls. - DCHECK(local_to_ancestor_matrix.IsIdentityOrTranslation()); - } -#endif - - const FloatClipRect& combined_clip = - GeometryMapper::LocalToAncestorClipRect(local_state, ancestor_state); - bool antialias = false; - - { - cc::PaintOpBuffer* buffer = cc_list.StartPaint(); - buffer->push<cc::SaveOp>(); - buffer->push<cc::ClipRectOp>(combined_clip.Rect(), SkClipOp::kIntersect, - antialias); - cc_list.EndPaintOfPairedBegin(); - } - needed_restores.push_back(1); -} - -static void RecordPairedBeginDisplayItems( - const Vector<PropertyTreeState>& paired_states, - const PropertyTreeState& pending_layer_state, - cc::DisplayItemList& cc_list, - Vector<int>& needed_restores) { - PropertyTreeState mapped_clip_destination_space = pending_layer_state; - PropertyTreeState clip_space = pending_layer_state; - bool has_clip = false; - - for (Vector<PropertyTreeState>::const_reverse_iterator paired_state = - paired_states.rbegin(); - paired_state != paired_states.rend(); ++paired_state) { - switch (paired_state->GetInnermostNode()) { - case PropertyTreeState::kTransform: { - if (has_clip) { - ApplyClipsBetweenStates(clip_space, mapped_clip_destination_space, - cc_list, needed_restores); - has_clip = false; - } - mapped_clip_destination_space = *paired_state; - clip_space = *paired_state; - - TransformationMatrix matrix = paired_state->Transform()->Matrix(); - matrix.ApplyTransformOrigin(paired_state->Transform()->Origin()); - - SkMatrix skmatrix = - static_cast<SkMatrix>(TransformationMatrix::ToSkMatrix44(matrix)); - { - cc::PaintOpBuffer* buffer = cc_list.StartPaint(); - buffer->push<cc::SaveOp>(); - buffer->push<cc::ConcatOp>(skmatrix); - cc_list.EndPaintOfPairedBegin(); - } - needed_restores.push_back(1); - break; - } - case PropertyTreeState::kClip: { - // Clips are handled in |applyClips| when ending the iterator, or - // transitioning between transform spaces. Here we store off the - // PropertyTreeState of the first found clip, under the transform of - // pairedState->transform(). All subsequent clips before applying the - // transform will be applied in applyClips. - clip_space = *paired_state; - has_clip = true; -#if DCHECK_IS_ON() - if (paired_state->Clip()->LocalTransformSpace() != - paired_state->Transform()) { - const TransformationMatrix& local_transform_matrix = - paired_state->Effect()->LocalTransformSpace()->Matrix(); - // Clips are only in descendant spaces that are transformed by scroll. - DCHECK(local_transform_matrix.IsIdentityOrTranslation()); - } -#endif - break; - } - case PropertyTreeState::kEffect: { - // TODO(chrishtr): skip effect and/or compositing display items if - // not necessary. - - FloatRect clip_rect = - paired_state->Effect()->OutputClip()->ClipRect().Rect(); - // TODO(chrishtr): specify origin of the filter. - FloatPoint filter_origin; - if (paired_state->Effect()->LocalTransformSpace() != - paired_state->Transform()) { - const TransformPaintPropertyNode* transform_node = - paired_state->Effect()->LocalTransformSpace(); - const TransformationMatrix& local_to_ancestor_matrix = - GeometryMapper::SourceToDestinationProjection( - transform_node, paired_state->Transform()); - // Effects are only in descendant spaces that are transformed by one - // or more scrolls. - DCHECK(local_to_ancestor_matrix.IsIdentityOrTranslation()); - - clip_rect = local_to_ancestor_matrix.MapRect(clip_rect); - filter_origin = local_to_ancestor_matrix.MapPoint(filter_origin); - } - - { - cc::PaintFlags flags; - flags.setBlendMode(paired_state->Effect()->BlendMode()); - // TODO(ajuma): This should really be rounding instead of flooring the - // alpha value, but that breaks slimming paint reftests. - flags.setAlpha(static_cast<uint8_t>( - gfx::ToFlooredInt(255 * paired_state->Effect()->Opacity()))); - flags.setColorFilter( - GraphicsContext::WebCoreColorFilterToSkiaColorFilter( - paired_state->Effect()->GetColorFilter())); - - cc::PaintOpBuffer* buffer = cc_list.StartPaint(); - // TODO(chrishtr): compute bounds as necessary. - buffer->push<cc::SaveLayerOp>(nullptr, &flags); - cc_list.EndPaintOfPairedBegin(); - } - needed_restores.push_back(1); - - { - cc::PaintOpBuffer* buffer = cc_list.StartPaint(); - - buffer->push<cc::SaveOp>(); - buffer->push<cc::TranslateOp>(filter_origin.X(), filter_origin.Y()); - - cc::PaintFlags flags; - flags.setImageFilter(cc::RenderSurfaceFilters::BuildImageFilter( - paired_state->Effect()->Filter().AsCcFilterOperations(), - gfx::SizeF(clip_rect.Width(), clip_rect.Height()))); - - SkRect layer_bounds = clip_rect; - layer_bounds.offset(-filter_origin.X(), -filter_origin.Y()); - buffer->push<cc::SaveLayerOp>(&layer_bounds, &flags); - buffer->push<cc::TranslateOp>(-filter_origin.X(), -filter_origin.Y()); - - cc_list.EndPaintOfPairedBegin(); - } - // The SaveOp+SaveLayerOp above are grouped such that they share a - // visual rect, so group the two restores in the same way so we don't - // have a mismatch in the number of EndPaintOfPairedBegin() vs - // EndPaintOfPairedEnd(). - needed_restores.push_back(2); - break; - } - case PropertyTreeState::kNone: - break; - } - } - - if (has_clip) { - ApplyClipsBetweenStates(clip_space, mapped_clip_destination_space, cc_list, - needed_restores); - } -} - -static void RecordPairedEndDisplayItems(const Vector<int>& needed_restores, - cc::DisplayItemList& cc_list) { - // TODO(danakj): This loop could use base::Reversed once it's allowed here. - for (auto it = needed_restores.rbegin(); it != needed_restores.rend(); ++it) { - cc::PaintOpBuffer* buffer = cc_list.StartPaint(); - int num_restores = *it; - for (int i = 0; i < num_restores; ++i) - buffer->push<cc::RestoreOp>(); - cc_list.EndPaintOfPairedEnd(); - } -} - constexpr gfx::Rect g_large_rect(-200000, -200000, 400000, 400000); -static void AppendDisplayItemToCcDisplayItemList( - const DisplayItem& display_item, - cc::DisplayItemList& cc_list) { +void AppendDisplayItemToCcDisplayItemList(const DisplayItem& display_item, + cc::DisplayItemList& list) { DCHECK(DisplayItem::IsDrawingType(display_item.GetType())); - if (DisplayItem::IsDrawingType(display_item.GetType())) { - const auto& drawing_display_item = - static_cast<const DrawingDisplayItem&>(display_item); - sk_sp<const cc::PaintOpBuffer> record = - drawing_display_item.GetPaintRecord(); - if (!record) - return; - // In theory we would pass the bounds of the record, previously done as: - // gfx::Rect bounds = gfx::SkIRectToRect(record->cullRect().roundOut()); - // or use the visual rect directly. However, clip content layers attempt - // to raster in a different space than that of the visual rects. We'll be - // reworking visual rects further for SPv2, so for now we just pass a - // visual rect large enough to make sure items raster. - { - cc::PaintOpBuffer* buffer = cc_list.StartPaint(); - buffer->push<cc::DrawRecordOp>(std::move(record)); - cc_list.EndPaintOfUnpaired(g_large_rect); + + sk_sp<const PaintRecord> record = + static_cast<const DrawingDisplayItem&>(display_item).GetPaintRecord(); + if (!record) + return; + cc::PaintOpBuffer* buffer = list.StartPaint(); + buffer->push<cc::DrawRecordOp>(std::move(record)); + // TODO(trchen): Pass correct visual rect here. + // The visual rect of the item can be used by cc to skip replaying items + // that can't be seen. To workaround a space conversion bug, the optimization + // is suppressed by passing a large rect. + list.EndPaintOfUnpaired(g_large_rect); +} + +void AppendRestore(cc::DisplayItemList& list, size_t n) { + cc::PaintOpBuffer* buffer = list.StartPaint(); + while (n--) + buffer->push<cc::RestoreOp>(); + list.EndPaintOfPairedEnd(); +} + +class ConversionContext { + public: + ConversionContext(const PropertyTreeState& layer_state, + cc::DisplayItemList& cc_list) + : current_transform_(layer_state.Transform()), + current_clip_(layer_state.Clip()), + current_effect_(layer_state.Effect()), + cc_list_(cc_list) {} + ~ConversionContext(); + + // The main function of this class. It converts a list of paint chunks into + // non-pair display items, and paint properties associated with them are + // implemented by paired display items. + // This is done by closing and opening paired items to adjust the current + // property state to the chunk's state when each chunk is consumed. + // Note that the clip/effect state is "lazy" in the sense that it stays + // in whatever state the last chunk left with, and only adjusted when + // a new chunk is consumed. The class implemented a few helpers to manage + // state switching so that paired display items are nested properly. + // + // State management example (transform tree omitted). + // Corresponds to unit test PaintChunksToCcLayerTest.InterleavedClipEffect: + // Clip tree: C0 <-- C1 <-- C2 <-- C3 <-- C4 + // Effect tree: E0(clip=C0) <-- E1(clip=C2) <-- E2(clip=C4) + // Layer state: C0, E0 + // Paint chunks: P0(C3, E0), P1(C4, E2), P2(C3, E1), P3(C4, E0) + // Initialization: + // The current state is initalized with the layer state, and starts with + // an empty state stack. + // current_clip = C0 + // current_effect = E0 + // state_stack = [] + // When P0 is consumed, C1, C2 and C3 need to be applied to the state: + // Output: Begin_C1 Begin_C2 Begin_C3 Draw_P0 + // current_clip = C3 + // state_stack = [C0, C1, C2] + // When P1 is consumed, C3 needs to be closed before E1 can be entered, + // then C3 and C4 need to be entered before E2 can be entered: + // Output: End_C3 Begin_E1 Begin_C3 Begin_C4 Begin_E2 Draw_P1 + // current_clip = C4 + // current_effect = E2 + // state_stack = [C0, C1, E0, C2, C3, E1] + // When P2 is consumed, E2 then C4 need to be exited: + // Output: End_E2 End_C4 Draw_P2 + // current_clip = C3 + // current_effect = E1 + // state_stack = [C0, C1, E0, C2] + // When P3 is consumed, C3 must exit before E1 can be exited, then we can + // enter C3 and C4: + // Output: End_C3 End_E1 Enter_C3 Enter_C4 Draw_P3 + // current_clip = C4 + // current_effect = E0 + // state_stack = [C0, C1, C2, C3] + // At last, close all pushed states to balance pairs (this happens when the + // context object is destructed): + // Output: End_C4 End_C3 End_C2 End_C1 + void Convert(const Vector<const PaintChunk*>&, const DisplayItemList&); + + private: + // Switch the current clip to the target state, staying in the same effect. + // It is no-op if the context is already in the target state. + // Otherwise zero or more clips will be popped from or pushed onto the + // current state stack. + // INPUT: + // The target clip must be a descendant of the input clip of current effect. + // OUTPUT: + // The current transform may be changed. + // The current clip will change to the target clip. + // The current effect will not change. + void SwitchToClip(const ClipPaintPropertyNode*); + + // Switch the current effect to the target state. + // It is no-op if the context is already in the target state. + // Otherwise zero or more effect effects will be popped from or pushed onto + // the state stack. As effects getting popped from the stack, clips applied + // on top of them will be popped as well. Also clips will be pushed at + // appropriate steps to apply output clip to newly pushed effects. + // INPUT: + // The target effect must be a descendant of the layer's effect. + // OUTPUT: + // The current transform may be changed. + // The current clip may be changed, and is guaranteed to be a descendant of + // the output clip of the target effect. + // The current effect will change to the target effect. + void SwitchToEffect(const EffectPaintPropertyNode*); + + const TransformPaintPropertyNode* current_transform_; + const ClipPaintPropertyNode* current_clip_; + const EffectPaintPropertyNode* current_effect_; + + // State stack. + // The size of the stack is the number of nested paired items that are + // currently nested. Note that this is a "restore stack", i.e. the top + // element does not represent the current state, but the state prior to + // applying the last paired begin. + struct StateEntry { + // Remembers the type of paired begin that caused a state to be saved. + // This is useful for emitting corresponding paired end. + enum class PairedType : char { kClip, kEffect } type; + + const TransformPaintPropertyNode* transform; + const ClipPaintPropertyNode* clip; + const EffectPaintPropertyNode* effect; + }; + Vector<StateEntry> state_stack_; + + cc::DisplayItemList& cc_list_; +}; + +ConversionContext::~ConversionContext() { + for (size_t i = state_stack_.size(); i--;) { + if (state_stack_[i].type == StateEntry::PairedType::kClip) { + AppendRestore(cc_list_, 1); + } else { + DCHECK_EQ(StateEntry::PairedType::kEffect, state_stack_[i].type); + AppendRestore(cc_list_, 2); } } } +void ConversionContext::SwitchToClip(const ClipPaintPropertyNode* target_clip) { + if (target_clip == current_clip_) + return; + + // Step 1: Exit all clips until the lowest common ancestor is found. + const ClipPaintPropertyNode* lca_clip = + &LowestCommonAncestor(*target_clip, *current_clip_); + while (current_clip_ != lca_clip) { + DCHECK(state_stack_.size() && + state_stack_.back().type == StateEntry::PairedType::kClip) + << "Error: Chunk has a clip that escaped its effect's clip."; + if (!state_stack_.size() || + state_stack_.back().type != StateEntry::PairedType::kClip) + break; + StateEntry& previous_state = state_stack_.back(); + current_transform_ = previous_state.transform; + current_clip_ = previous_state.clip; + DCHECK_EQ(previous_state.effect, current_effect_); + state_stack_.pop_back(); + AppendRestore(cc_list_, 1); + } + + // Step 2: Collect all clips between the target clip and the current clip. + // At this point the current clip must be an ancestor of the target. + Vector<const ClipPaintPropertyNode*, 1u> pending_clips; + for (const ClipPaintPropertyNode* clip = target_clip; clip != current_clip_; + clip = clip->Parent()) { + // This should never happen unless the DCHECK in step 1 failed. + if (!clip) + break; + pending_clips.push_back(clip); + } + + // Step 3: Now apply the list of clips in top-down order. + for (size_t i = pending_clips.size(); i--;) { + const ClipPaintPropertyNode* sub_clip = pending_clips[i]; + DCHECK_EQ(current_clip_, sub_clip->Parent()); + + // Step 3a: Switch CTM to the clip's local space then apply clip. + cc::PaintOpBuffer* buffer = cc_list_.StartPaint(); + buffer->push<cc::SaveOp>(); + const TransformPaintPropertyNode* target_transform = + sub_clip->LocalTransformSpace(); + if (current_transform_ != target_transform) { + buffer->push<cc::ConcatOp>( + static_cast<SkMatrix>(TransformationMatrix::ToSkMatrix44( + GeometryMapper::SourceToDestinationProjection( + target_transform, current_transform_)))); + } + buffer->push<cc::ClipRectOp>( + static_cast<SkRect>(sub_clip->ClipRect().Rect()), SkClipOp::kIntersect, + false); + if (sub_clip->ClipRect().IsRounded()) { + buffer->push<cc::ClipRRectOp>(static_cast<SkRRect>(sub_clip->ClipRect()), + SkClipOp::kIntersect, true); + } + cc_list_.EndPaintOfPairedBegin(); + + // Step 3b: Adjust state and push previous state onto clip stack. + state_stack_.emplace_back(StateEntry{StateEntry::PairedType::kClip, + current_transform_, current_clip_, + current_effect_}); + current_transform_ = target_transform; + current_clip_ = sub_clip; + } +} + +void ConversionContext::SwitchToEffect( + const EffectPaintPropertyNode* target_effect) { + if (target_effect == current_effect_) + return; + + // Step 1: Exit all effects until the lowest common ancestor is found. + const EffectPaintPropertyNode* lca_effect = + &LowestCommonAncestor(*target_effect, *current_effect_); + while (current_effect_ != lca_effect) { + DCHECK(state_stack_.size()) << "Error: Chunk layerized into a layer with " + "an effect that's too deep."; + if (!state_stack_.size()) + break; + + StateEntry& previous_state = state_stack_.back(); + if (previous_state.type == StateEntry::PairedType::kClip) { + AppendRestore(cc_list_, 1); + } else { + DCHECK_EQ(StateEntry::PairedType::kEffect, previous_state.type); + AppendRestore(cc_list_, 2); + } + current_transform_ = previous_state.transform; + current_clip_ = previous_state.clip; + current_effect_ = previous_state.effect; + state_stack_.pop_back(); + } + + // Step 2: Collect all effects between the target effect and the current + // effect. At this point the current effect must be an ancestor of the target. + Vector<const EffectPaintPropertyNode*, 1u> pending_effects; + for (const EffectPaintPropertyNode* effect = target_effect; + effect != current_effect_; effect = effect->Parent()) { + // This should never happen unless the DCHECK in step 1 failed. + if (!effect) + break; + pending_effects.push_back(effect); + } + + // Step 3: Now apply the list of effects in top-down order. + for (size_t i = pending_effects.size(); i--;) { + const EffectPaintPropertyNode* sub_effect = pending_effects[i]; + DCHECK_EQ(current_effect_, sub_effect->Parent()); + + // Step 3a: Before each effect can be applied, we must enter its output + // clip first. + SwitchToClip(sub_effect->OutputClip()); + + // Step 3b: Apply non-spatial effects first, adjust CTM, then apply spatial + // effects. Strictly speaking the CTM shall be appled first, it is done + // in this particular order only to save one SaveOp. + // TODO(trchen): Omit one of the SaveLayerOp if no-op. + cc::PaintOpBuffer* buffer = cc_list_.StartPaint(); + + cc::PaintFlags flags; + flags.setBlendMode(sub_effect->BlendMode()); + // TODO(ajuma): This should really be rounding instead of flooring the + // alpha value, but that breaks slimming paint reftests. + flags.setAlpha( + static_cast<uint8_t>(gfx::ToFlooredInt(255 * sub_effect->Opacity()))); + flags.setColorFilter(GraphicsContext::WebCoreColorFilterToSkiaColorFilter( + sub_effect->GetColorFilter())); + buffer->push<cc::SaveLayerOp>(nullptr, &flags); + + const TransformPaintPropertyNode* target_transform = + sub_effect->LocalTransformSpace(); + if (current_transform_ != target_transform) { + buffer->push<cc::ConcatOp>( + static_cast<SkMatrix>(TransformationMatrix::ToSkMatrix44( + GeometryMapper::SourceToDestinationProjection( + target_transform, current_transform_)))); + } + + // TODO(chrishtr): specify origin of the filter. + FloatPoint filter_origin; + buffer->push<cc::TranslateOp>(filter_origin.X(), filter_origin.Y()); + // The size parameter is only used to computed the origin of zoom + // operation, which we never generate. + gfx::SizeF empty; + cc::PaintFlags filter_flags; + filter_flags.setImageFilter(cc::RenderSurfaceFilters::BuildImageFilter( + sub_effect->Filter().AsCcFilterOperations(), empty)); + buffer->push<cc::SaveLayerOp>(nullptr, &filter_flags); + buffer->push<cc::TranslateOp>(-filter_origin.X(), -filter_origin.Y()); + + cc_list_.EndPaintOfPairedBegin(); + + // Step 3c: Adjust state and push previous state onto effect stack. + // TODO(trchen): Change input clip to expansion hint once implemented. + const ClipPaintPropertyNode* input_clip = current_clip_; + state_stack_.emplace_back(StateEntry{StateEntry::PairedType::kEffect, + current_transform_, current_clip_, + current_effect_}); + current_transform_ = target_transform; + current_clip_ = input_clip; + current_effect_ = sub_effect; + } +} + +void ConversionContext::Convert(const Vector<const PaintChunk*>& paint_chunks, + const DisplayItemList& display_items) { + for (auto chunk_it = paint_chunks.begin(); chunk_it != paint_chunks.end(); + chunk_it++) { + const PaintChunk& chunk = **chunk_it; + const PropertyTreeState& chunk_state = chunk.properties.property_tree_state; + SwitchToEffect(chunk_state.Effect()); + SwitchToClip(chunk_state.Clip()); + bool transformed = chunk_state.Transform() != current_transform_; + if (transformed) { + cc::PaintOpBuffer* buffer = cc_list_.StartPaint(); + buffer->push<cc::SaveOp>(); + buffer->push<cc::ConcatOp>( + static_cast<SkMatrix>(TransformationMatrix::ToSkMatrix44( + GeometryMapper::SourceToDestinationProjection( + chunk_state.Transform(), current_transform_)))); + cc_list_.EndPaintOfPairedBegin(); + } + for (const auto& item : display_items.ItemsInPaintChunk(chunk)) + AppendDisplayItemToCcDisplayItemList(item, cc_list_); + if (transformed) + AppendRestore(cc_list_, 1); + } +} + } // unnamed namespace scoped_refptr<cc::DisplayItemList> PaintChunksToCcLayer::Convert( @@ -241,36 +372,10 @@ cc_list->EndPaintOfPairedBegin(); } - for (const auto* paint_chunk : paint_chunks) { - const PropertyTreeState* state = - &paint_chunk->properties.property_tree_state; - PropertyTreeStateIterator iterator(*state); - Vector<PropertyTreeState> paired_states; - for (; state && *state != layer_state; state = iterator.Next()) { - if (state->GetInnermostNode() != PropertyTreeState::kNone) - paired_states.push_back(*state); - } + ConversionContext(layer_state, *cc_list).Convert(paint_chunks, display_items); - // TODO(chrishtr): we can avoid some extra paired display items if - // multiple PaintChunks share them. We can also collapse clips between - // transforms into single clips in the same way that PaintLayerClipper does. - Vector<int> needed_restores; - - RecordPairedBeginDisplayItems(paired_states, layer_state, *cc_list, - needed_restores); - - for (const auto& display_item : - display_items.ItemsInPaintChunk(*paint_chunk)) - AppendDisplayItemToCcDisplayItemList(display_item, *cc_list); - - RecordPairedEndDisplayItems(needed_restores, *cc_list); - } - - if (need_translate) { - cc::PaintOpBuffer* buffer = cc_list->StartPaint(); - buffer->push<cc::RestoreOp>(); - cc_list->EndPaintOfPairedEnd(); - } + if (need_translate) + AppendRestore(*cc_list, 1); if (under_invalidation_checking_params) { auto& params = *under_invalidation_checking_params;
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayerTest.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayerTest.cpp new file mode 100644 index 0000000..db3ba00 --- /dev/null +++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayerTest.cpp
@@ -0,0 +1,375 @@ +// Copyright 2017 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 "platform/graphics/compositing/PaintChunksToCcLayer.h" + +#include <initializer_list> + +#include "cc/paint/display_item_list.h" +#include "cc/paint/paint_op_buffer.h" +#include "platform/graphics/paint/ClipPaintPropertyNode.h" +#include "platform/graphics/paint/DisplayItemList.h" +#include "platform/graphics/paint/DrawingDisplayItem.h" +#include "platform/graphics/paint/EffectPaintPropertyNode.h" +#include "platform/graphics/paint/PaintChunk.h" +#include "platform/graphics/paint/TransformPaintPropertyNode.h" +#include "platform/testing/FakeDisplayItemClient.h" +#include "platform/testing/PaintPropertyTestHelpers.h" +#include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { +namespace { + +using testing::CreateOpacityOnlyEffect; + +class PaintChunksToCcLayerTest : public ::testing::Test, + private ScopedSlimmingPaintV2ForTest { + protected: + PaintChunksToCcLayerTest() : ScopedSlimmingPaintV2ForTest(true) {} +}; + +const char* GetOpName(cc::PaintOpType op) { + if (op == cc::PaintOpType::ClipRect) + return "ClipRect"; + if (op == cc::PaintOpType::Concat) + return "Concat"; + if (op == cc::PaintOpType::DrawRecord) + return "DrawRecord"; + if (op == cc::PaintOpType::Save) + return "Save"; + if (op == cc::PaintOpType::SaveLayer) + return "SaveLayer"; + if (op == cc::PaintOpType::Restore) + return "Restore"; + NOTREACHED(); + return "ERROR"; +} + +// A simple matcher that only looks for a few ops, ignoring all else. +// Recognized ops: ClipRect, Concat, DrawRecord, Save, SaveLayer, Restore. +class PaintRecordMatcher + : public ::testing::MatcherInterface<const cc::PaintOpBuffer&> { + public: + static ::testing::Matcher<const cc::PaintOpBuffer&> Make( + std::initializer_list<cc::PaintOpType> args) { + return ::testing::MakeMatcher(new PaintRecordMatcher(args)); + } + PaintRecordMatcher(std::initializer_list<cc::PaintOpType> args) + : expected_ops_(args) {} + + bool MatchAndExplain( + const cc::PaintOpBuffer& buffer, + ::testing::MatchResultListener* listener) const override { + auto next = expected_ops_.begin(); + for (cc::PaintOpBuffer::Iterator it(&buffer); it; ++it) { + cc::PaintOpType op = (*it)->GetType(); + switch (op) { + case cc::PaintOpType::ClipRect: + case cc::PaintOpType::Concat: + case cc::PaintOpType::DrawRecord: + case cc::PaintOpType::Save: + case cc::PaintOpType::SaveLayer: + case cc::PaintOpType::Restore: + if (next == expected_ops_.end()) { + if (listener->IsInterested()) { + *listener << "unexpected op " << GetOpName(op) << " at index " + << it.op_idx() << ", expecting end of list."; + } + return false; + } + if (*next == op) { + next++; + continue; + } + if (listener->IsInterested()) { + *listener << "unexpected op " << GetOpName(op) << " at index " + << it.op_idx() << ", expecting " << GetOpName(*next) + << "(#" << (next - expected_ops_.begin()) << ")."; + } + return false; + default: + continue; + } + } + if (next == expected_ops_.end()) + return true; + if (listener->IsInterested()) { + *listener << "unexpected end of list, expecting " << GetOpName(*next) + << "(#" << (next - expected_ops_.begin()) << ")."; + } + return false; + } + void DescribeTo(::std::ostream* os) const override { + *os << "["; + bool first = true; + for (auto op : expected_ops_) { + if (first) + first = false; + else + *os << ", "; + *os << GetOpName(op); + } + *os << "]"; + } + + private: + Vector<cc::PaintOpType> expected_ops_; +}; + +// Convenient shorthands. +const TransformPaintPropertyNode* t0() { + return TransformPaintPropertyNode::Root(); +} +const ClipPaintPropertyNode* c0() { + return ClipPaintPropertyNode::Root(); +} +const EffectPaintPropertyNode* e0() { + return EffectPaintPropertyNode::Root(); +} + +PaintChunk::Id DefaultId() { + DEFINE_STATIC_LOCAL(FakeDisplayItemClient, fake_client, ()); + return PaintChunk::Id(fake_client, DisplayItem::kDrawingFirst); +} + +struct TestChunks { + Vector<PaintChunk> chunks; + DisplayItemList items = DisplayItemList(0); + + void AddChunk(const TransformPaintPropertyNode* t, + const ClipPaintPropertyNode* c, + const EffectPaintPropertyNode* e) { + size_t i = items.size(); + auto record = sk_make_sp<PaintRecord>(); + record->push<cc::NoopOp>(); + items.AllocateAndConstruct<DrawingDisplayItem>( + DefaultId().client, DefaultId().type, std::move(record), + FloatRect(-200000, -200000, 400000, 400000)); + chunks.emplace_back(i, i + 1, DefaultId(), PropertyTreeState(t, c, e)); + } + + Vector<const PaintChunk*> GetChunkList() const { + Vector<const PaintChunk*> result; + for (const PaintChunk& chunk : chunks) + result.push_back(&chunk); + return result; + } +}; + +TEST_F(PaintChunksToCcLayerTest, EffectGroupingSimple) { + // This test verifies effects are applied as a group. + RefPtr<EffectPaintPropertyNode> e1 = CreateOpacityOnlyEffect(e0(), 0.5f); + TestChunks chunks; + chunks.AddChunk(t0(), c0(), e1.Get()); + chunks.AddChunk(t0(), c0(), e1.Get()); + + sk_sp<PaintRecord> output = + PaintChunksToCcLayer::Convert(chunks.GetChunkList(), + PropertyTreeState(t0(), c0(), e0()), + gfx::Vector2dF(), chunks.items) + ->ReleaseAsRecord(); + EXPECT_THAT( + output, + Pointee(PaintRecordMatcher::Make( + {cc::PaintOpType::SaveLayer, cc::PaintOpType::SaveLayer, // <e1> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::DrawRecord, // <p1/> + cc::PaintOpType::Restore, cc::PaintOpType::Restore}))); // </e1> +} + +TEST_F(PaintChunksToCcLayerTest, EffectGroupingNested) { + // This test verifies nested effects are grouped properly. + RefPtr<EffectPaintPropertyNode> e1 = CreateOpacityOnlyEffect(e0(), 0.5f); + RefPtr<EffectPaintPropertyNode> e2 = CreateOpacityOnlyEffect(e1.Get(), 0.5f); + RefPtr<EffectPaintPropertyNode> e3 = CreateOpacityOnlyEffect(e1.Get(), 0.5f); + TestChunks chunks; + chunks.AddChunk(t0(), c0(), e2.Get()); + chunks.AddChunk(t0(), c0(), e3.Get()); + + sk_sp<PaintRecord> output = + PaintChunksToCcLayer::Convert(chunks.GetChunkList(), + PropertyTreeState(t0(), c0(), e0()), + gfx::Vector2dF(), chunks.items) + ->ReleaseAsRecord(); + EXPECT_THAT( + output, + Pointee(PaintRecordMatcher::Make( + {cc::PaintOpType::SaveLayer, cc::PaintOpType::SaveLayer, // <e1> + cc::PaintOpType::SaveLayer, cc::PaintOpType::SaveLayer, // <e2> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Restore, cc::PaintOpType::Restore, // </e2> + cc::PaintOpType::SaveLayer, cc::PaintOpType::SaveLayer, // <e3> + cc::PaintOpType::DrawRecord, // <p1/> + cc::PaintOpType::Restore, cc::PaintOpType::Restore, // </e3> + cc::PaintOpType::Restore, cc::PaintOpType::Restore}))); // </e1> +} + +TEST_F(PaintChunksToCcLayerTest, InterleavedClipEffect) { + // This test verifies effects are enclosed by their output clips. + // It is the same as the example made in the class comments of + // ConversionContext. + // Refer to PaintChunksToCcLayer.cpp for detailed explanation. + // (Search "State management example".) + RefPtr<ClipPaintPropertyNode> c1 = ClipPaintPropertyNode::Create( + c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); + RefPtr<ClipPaintPropertyNode> c2 = ClipPaintPropertyNode::Create( + c1.Get(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); + RefPtr<ClipPaintPropertyNode> c3 = ClipPaintPropertyNode::Create( + c2.Get(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); + RefPtr<ClipPaintPropertyNode> c4 = ClipPaintPropertyNode::Create( + c3.Get(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); + RefPtr<EffectPaintPropertyNode> e1 = EffectPaintPropertyNode::Create( + e0(), t0(), c2.Get(), ColorFilter(), CompositorFilterOperations(), 0.5f, + SkBlendMode::kSrcOver); + RefPtr<EffectPaintPropertyNode> e2 = EffectPaintPropertyNode::Create( + e1.Get(), t0(), c4.Get(), ColorFilter(), CompositorFilterOperations(), + 0.5f, SkBlendMode::kSrcOver); + TestChunks chunks; + chunks.AddChunk(t0(), c3.Get(), e0()); + chunks.AddChunk(t0(), c4.Get(), e2.Get()); + chunks.AddChunk(t0(), c3.Get(), e1.Get()); + chunks.AddChunk(t0(), c4.Get(), e0()); + + sk_sp<PaintRecord> output = + PaintChunksToCcLayer::Convert(chunks.GetChunkList(), + PropertyTreeState(t0(), c0(), e0()), + gfx::Vector2dF(), chunks.items) + ->ReleaseAsRecord(); + EXPECT_THAT( + output, + Pointee(PaintRecordMatcher::Make( + {cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c1> + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c2> + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c3> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Restore, // </c3> + cc::PaintOpType::SaveLayer, cc::PaintOpType::SaveLayer, // <e1> + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c3> + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c4> + cc::PaintOpType::SaveLayer, cc::PaintOpType::SaveLayer, // <e2> + cc::PaintOpType::DrawRecord, // <p1/> + cc::PaintOpType::Restore, cc::PaintOpType::Restore, // </e2> + cc::PaintOpType::Restore, // </c4> + cc::PaintOpType::DrawRecord, // <p2/> + cc::PaintOpType::Restore, // </c3> + cc::PaintOpType::Restore, cc::PaintOpType::Restore, // </e1> + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c3> + cc::PaintOpType::Save, cc::PaintOpType::ClipRect, // <c4> + cc::PaintOpType::DrawRecord, // <p3/> + cc::PaintOpType::Restore, // </c4> + cc::PaintOpType::Restore, // </c3> + cc::PaintOpType::Restore, // </c2> + cc::PaintOpType::Restore}))); // </c1> +} + +TEST_F(PaintChunksToCcLayerTest, ClipSpaceInversion) { + // This test verifies chunks that have a shallower transform state than + // its clip can still be painted. The infamous CSS corner case: + // <div style="position:absolute; clip:rect(...)"> + // <div style="position:fixed;">Clipped but not scroll along.</div> + // </div> + RefPtr<TransformPaintPropertyNode> t1 = TransformPaintPropertyNode::Create( + t0(), TransformationMatrix().Scale(2.f), FloatPoint3D()); + RefPtr<ClipPaintPropertyNode> c1 = ClipPaintPropertyNode::Create( + c0(), t1.Get(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); + TestChunks chunks; + chunks.AddChunk(t0(), c1.Get(), e0()); + + sk_sp<PaintRecord> output = + PaintChunksToCcLayer::Convert(chunks.GetChunkList(), + PropertyTreeState(t0(), c0(), e0()), + gfx::Vector2dF(), chunks.items) + ->ReleaseAsRecord(); + EXPECT_THAT(output, + Pointee(PaintRecordMatcher::Make( + {cc::PaintOpType::Save, cc::PaintOpType::Concat, // <t1 + cc::PaintOpType::ClipRect, // c1> + cc::PaintOpType::Save, cc::PaintOpType::Concat, // <t1^-1> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Restore, // </t1^-1> + cc::PaintOpType::Restore}))); // </c1 t1> +} + +TEST_F(PaintChunksToCcLayerTest, EffectSpaceInversion) { + // This test verifies chunks that have a shallower transform state than + // its effect can still be painted. The infamous CSS corner case: + // <div style="overflow:scroll"> + // <div style="opacity:0.5"> + // <div style="position:absolute;">Transparent but not scroll + // along.</div> + // </div> + // </div> + RefPtr<TransformPaintPropertyNode> t1 = TransformPaintPropertyNode::Create( + t0(), TransformationMatrix().Scale(2.f), FloatPoint3D()); + RefPtr<EffectPaintPropertyNode> e1 = EffectPaintPropertyNode::Create( + e0(), t1.Get(), c0(), ColorFilter(), CompositorFilterOperations(), 0.5f, + SkBlendMode::kSrcOver); + TestChunks chunks; + chunks.AddChunk(t0(), c0(), e1.Get()); + + sk_sp<PaintRecord> output = + PaintChunksToCcLayer::Convert(chunks.GetChunkList(), + PropertyTreeState(t0(), c0(), e0()), + gfx::Vector2dF(), chunks.items) + ->ReleaseAsRecord(); + EXPECT_THAT( + output, + Pointee(PaintRecordMatcher::Make( + {cc::PaintOpType::SaveLayer, cc::PaintOpType::Concat, // <t1 + cc::PaintOpType::SaveLayer, // e1> + cc::PaintOpType::Save, cc::PaintOpType::Concat, // <t1^-1> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Restore, // </t1^-1> + cc::PaintOpType::Restore, cc::PaintOpType::Restore}))); // </e1 t1> +} + +TEST_F(PaintChunksToCcLayerTest, NonRootLayerSimple) { + // This test verifies a layer with composited property state does not + // apply properties again internally. + RefPtr<TransformPaintPropertyNode> t1 = TransformPaintPropertyNode::Create( + t0(), TransformationMatrix().Scale(2.f), FloatPoint3D()); + RefPtr<ClipPaintPropertyNode> c1 = ClipPaintPropertyNode::Create( + c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); + RefPtr<EffectPaintPropertyNode> e1 = CreateOpacityOnlyEffect(e0(), 0.5f); + TestChunks chunks; + chunks.AddChunk(t1.Get(), c1.Get(), e1.Get()); + + sk_sp<PaintRecord> output = + PaintChunksToCcLayer::Convert( + chunks.GetChunkList(), + PropertyTreeState(t1.Get(), c1.Get(), e1.Get()), gfx::Vector2dF(), + chunks.items) + ->ReleaseAsRecord(); + EXPECT_THAT(output, + Pointee(PaintRecordMatcher::Make({cc::PaintOpType::DrawRecord}))); +} + +TEST_F(PaintChunksToCcLayerTest, NonRootLayerTransformEscape) { + // This test verifies chunks that have a shallower transform state than the + // layer can still be painted. + RefPtr<TransformPaintPropertyNode> t1 = TransformPaintPropertyNode::Create( + t0(), TransformationMatrix().Scale(2.f), FloatPoint3D()); + RefPtr<ClipPaintPropertyNode> c1 = ClipPaintPropertyNode::Create( + c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f)); + RefPtr<EffectPaintPropertyNode> e1 = CreateOpacityOnlyEffect(e0(), 0.5f); + TestChunks chunks; + chunks.AddChunk(t0(), c1.Get(), e1.Get()); + + sk_sp<PaintRecord> output = + PaintChunksToCcLayer::Convert( + chunks.GetChunkList(), + PropertyTreeState(t1.Get(), c1.Get(), e1.Get()), gfx::Vector2dF(), + chunks.items) + ->ReleaseAsRecord(); + EXPECT_THAT(output, + Pointee(PaintRecordMatcher::Make( + {cc::PaintOpType::Save, cc::PaintOpType::Concat, // <t1^-1> + cc::PaintOpType::DrawRecord, // <p0/> + cc::PaintOpType::Restore}))); // </t1^-1> +} + +} // namespace +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.cpp b/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.cpp index 2729c5f..23627c7 100644 --- a/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.cpp +++ b/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.cpp
@@ -4,10 +4,9 @@ #include "platform/instrumentation/resource_coordinator/FrameResourceCoordinator.h" -#include "public/platform/InterfaceProvider.h" -#include "public/platform/Platform.h" #include "services/resource_coordinator/public/cpp/resource_coordinator_features.h" #include "services/resource_coordinator/public/interfaces/coordination_unit_provider.mojom-blink.h" +#include "services/service_manager/public/cpp/interface_provider.h" namespace blink { @@ -24,12 +23,12 @@ // static FrameResourceCoordinator* FrameResourceCoordinator::Create( - InterfaceProvider* interface_provider) { + service_manager::InterfaceProvider* interface_provider) { return new FrameResourceCoordinator(interface_provider); } FrameResourceCoordinator::FrameResourceCoordinator( - InterfaceProvider* interface_provider) { + service_manager::InterfaceProvider* interface_provider) { interface_provider->GetInterface(mojo::MakeRequest(&service_)); service_.set_connection_error_handler(
diff --git a/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.h b/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.h index 51e405dd..810706f09 100644 --- a/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.h +++ b/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.h
@@ -8,9 +8,11 @@ #include "platform/heap/Handle.h" #include "services/resource_coordinator/public/interfaces/coordination_unit.mojom-blink.h" -namespace blink { - +namespace service_manager { class InterfaceProvider; +} + +namespace blink { class PLATFORM_EXPORT FrameResourceCoordinator final : public GarbageCollectedFinalized<FrameResourceCoordinator> { @@ -18,14 +20,14 @@ public: static bool IsEnabled(); - static FrameResourceCoordinator* Create(InterfaceProvider*); + static FrameResourceCoordinator* Create(service_manager::InterfaceProvider*); virtual ~FrameResourceCoordinator(); void SendEvent(const resource_coordinator::mojom::blink::EventType&); DECLARE_TRACE(); private: - explicit FrameResourceCoordinator(InterfaceProvider*); + explicit FrameResourceCoordinator(service_manager::InterfaceProvider*); resource_coordinator::mojom::blink::CoordinationUnitPtr service_; };
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp index 5dd391e..adaf7bc 100644 --- a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp +++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp
@@ -614,7 +614,7 @@ EXPECT_TRUE(fetcher->ContainsAsPreload(resource1)); Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); - // The second preload fetch returnes the first preload. + // The second preload fetch returns the first preload. Resource* resource2 = MockResource::Fetch(fetch_params_for_preload, fetcher); EXPECT_TRUE(fetcher->ContainsAsPreload(resource1)); EXPECT_TRUE(resource1->IsPreloaded()); @@ -645,7 +645,7 @@ EXPECT_TRUE(fetcher->ContainsAsPreload(resource1)); Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); - // The second preload fetch returnes the first preload. + // The second preload fetch returns the first preload. Resource* resource2 = MockResource::Fetch(fetch_params_for_preload, fetcher); EXPECT_TRUE(fetcher->ContainsAsPreload(resource1)); EXPECT_TRUE(resource1->IsPreloaded()); @@ -681,7 +681,7 @@ EXPECT_TRUE(fetcher->ContainsAsPreload(resource1)); Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); - // The second preload fetch returnes the first preload. + // The second preload fetch returns the first preload. Resource* resource2 = MockResource::Fetch(fetch_params_for_link_preload, fetcher); EXPECT_TRUE(fetcher->ContainsAsPreload(resource1));
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue.cc new file mode 100644 index 0000000..ad00471 --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue.cc
@@ -0,0 +1,128 @@ +// Copyright 2017 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 "platform/scheduler/base/task_queue.h" + +#include "platform/scheduler/base/task_queue_impl.h" + +namespace blink { +namespace scheduler { + +TaskQueue::TaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl) + : impl_(std::move(impl)) {} + +TaskQueue::~TaskQueue() {} + +void TaskQueue::UnregisterTaskQueue() { + impl_->UnregisterTaskQueue(this); +} + +bool TaskQueue::RunsTasksInCurrentSequence() const { + return impl_->RunsTasksInCurrentSequence(); +} + +bool TaskQueue::PostDelayedTask(const tracked_objects::Location& from_here, + base::OnceClosure task, + base::TimeDelta delay) { + return impl_->PostDelayedTask(from_here, std::move(task), delay); +} + +bool TaskQueue::PostNonNestableDelayedTask( + const tracked_objects::Location& from_here, + base::OnceClosure task, + base::TimeDelta delay) { + return impl_->PostNonNestableDelayedTask(from_here, std::move(task), delay); +} + +std::unique_ptr<TaskQueue::QueueEnabledVoter> +TaskQueue::CreateQueueEnabledVoter() { + return impl_->CreateQueueEnabledVoter(this); +} + +bool TaskQueue::IsQueueEnabled() const { + return impl_->IsQueueEnabled(); +} + +bool TaskQueue::IsEmpty() const { + return impl_->IsEmpty(); +} + +size_t TaskQueue::GetNumberOfPendingTasks() const { + return impl_->GetNumberOfPendingTasks(); +} + +bool TaskQueue::HasTaskToRunImmediately() const { + return impl_->HasTaskToRunImmediately(); +} + +base::Optional<base::TimeTicks> TaskQueue::GetNextScheduledWakeUp() { + return impl_->GetNextScheduledWakeUp(); +} + +void TaskQueue::SetQueuePriority(TaskQueue::QueuePriority priority) { + impl_->SetQueuePriority(priority); +} + +TaskQueue::QueuePriority TaskQueue::GetQueuePriority() const { + return impl_->GetQueuePriority(); +} + +void TaskQueue::AddTaskObserver( + base::MessageLoop::TaskObserver* task_observer) { + impl_->AddTaskObserver(task_observer); +} + +void TaskQueue::RemoveTaskObserver( + base::MessageLoop::TaskObserver* task_observer) { + impl_->RemoveTaskObserver(task_observer); +} + +void TaskQueue::SetTimeDomain(TimeDomain* time_domain) { + impl_->SetTimeDomain(time_domain); +} + +TimeDomain* TaskQueue::GetTimeDomain() const { + return impl_->GetTimeDomain(); +} + +void TaskQueue::SetBlameContext( + base::trace_event::BlameContext* blame_context) { + impl_->SetBlameContext(blame_context); +} + +void TaskQueue::InsertFence(InsertFencePosition position) { + impl_->InsertFence(position); +} + +void TaskQueue::RemoveFence() { + impl_->RemoveFence(); +} + +bool TaskQueue::HasFence() const { + return impl_->HasFence(); +} + +bool TaskQueue::BlockedByFence() const { + return impl_->BlockedByFence(); +} + +const char* TaskQueue::GetName() const { + return impl_->GetName(); +} + +void TaskQueue::SetObserver(Observer* observer) { + if (observer) { + // Observer is guaranteed to outlive TaskQueue and TaskQueueImpl lifecycle + // is controlled by |this|. + impl_->SetOnNextWakeUpChangedCallback( + base::Bind(&TaskQueue::Observer::OnQueueNextWakeUpChanged, + base::Unretained(observer), base::Unretained(this))); + } else { + impl_->SetOnNextWakeUpChangedCallback( + base::Callback<void(base::TimeTicks)>()); + } +} + +} // namespace scheduler +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue.h b/third_party/WebKit/Source/platform/scheduler/base/task_queue.h index 237aef3..27c0652 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue.h +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue.h
@@ -9,6 +9,8 @@ #include "base/message_loop/message_loop.h" #include "base/optional.h" #include "base/single_thread_task_runner.h" +#include "base/synchronization/lock.h" +#include "base/threading/platform_thread.h" #include "base/time/time.h" #include "platform/PlatformExport.h" @@ -21,12 +23,14 @@ namespace blink { namespace scheduler { +namespace internal { +class TaskQueueImpl; +} + class TimeDomain; class PLATFORM_EXPORT TaskQueue : public base::SingleThreadTaskRunner { public: - TaskQueue() {} - class PLATFORM_EXPORT Observer { public: virtual ~Observer() {} @@ -46,7 +50,7 @@ // Unregisters the task queue after which no tasks posted to it will run and // the TaskQueueManager's reference to it will be released soon. - virtual void UnregisterTaskQueue() = 0; + virtual void UnregisterTaskQueue(); enum QueuePriority { // Queues with control priority will run before any other queue, and will @@ -74,33 +78,10 @@ // Can be called on any thread. static const char* PriorityToString(QueuePriority priority); - enum class QueueType { - // Keep TaskQueue::NameForQueueType in sync. - // This enum is used for a histogram and it should not be re-numbered. - CONTROL = 0, - DEFAULT = 1, - DEFAULT_LOADING = 2, - DEFAULT_TIMER = 3, - UNTHROTTLED = 4, - FRAME_LOADING = 5, - FRAME_TIMER = 6, - FRAME_UNTHROTTLED = 7, - COMPOSITOR = 8, - IDLE = 9, - TEST = 10, - - COUNT = 11 - }; - - // Returns name of the given queue type. Returned string has application - // lifetime. - static const char* NameForQueueType(QueueType queue_type); - - // Options for constructing a TaskQueue. Once set the |name| and - // |should_monitor_quiescence| are immutable. + // Options for constructing a TaskQueue. struct Spec { - explicit Spec(QueueType type) - : type(type), + explicit Spec(const char* name) + : name(name), should_monitor_quiescence(false), time_domain(nullptr), should_notify_observers(true), @@ -127,7 +108,7 @@ return *this; } - QueueType type; + const char* name; bool should_monitor_quiescence; TimeDomain* time_domain; bool should_notify_observers; @@ -156,59 +137,53 @@ // TaskQueue is enabled. The TaskQueue will be enabled if there are no voters // or if all agree it should be enabled. // NOTE this must be called on the thread this TaskQueue was created by. - virtual std::unique_ptr<QueueEnabledVoter> CreateQueueEnabledVoter() = 0; + std::unique_ptr<QueueEnabledVoter> CreateQueueEnabledVoter(); // NOTE this must be called on the thread this TaskQueue was created by. - virtual bool IsQueueEnabled() const = 0; + bool IsQueueEnabled() const; // Returns true if the queue is completely empty. - virtual bool IsEmpty() const = 0; + bool IsEmpty() const; // Returns the number of pending tasks in the queue. - virtual size_t GetNumberOfPendingTasks() const = 0; + size_t GetNumberOfPendingTasks() const; // Returns true if the queue has work that's ready to execute now. // NOTE: this must be called on the thread this TaskQueue was created by. - virtual bool HasTaskToRunImmediately() const = 0; + bool HasTaskToRunImmediately() const; // Returns requested run time of next scheduled wake-up for a delayed task // which is not ready to run. If there are no such tasks or the queue is // disabled (by a QueueEnabledVoter) it returns base::nullopt. // NOTE: this must be called on the thread this TaskQueue was created by. - virtual base::Optional<base::TimeTicks> GetNextScheduledWakeUp() = 0; + base::Optional<base::TimeTicks> GetNextScheduledWakeUp(); // Can be called on any thread. - virtual QueueType GetQueueType() const = 0; - - // Can be called on any thread. - virtual const char* GetName() const = 0; + virtual const char* GetName() const; // Set the priority of the queue to |priority|. NOTE this must be called on // the thread this TaskQueue was created by. - virtual void SetQueuePriority(QueuePriority priority) = 0; + void SetQueuePriority(QueuePriority priority); // Returns the current queue priority. - virtual QueuePriority GetQueuePriority() const = 0; + QueuePriority GetQueuePriority() const; // These functions can only be called on the same thread that the task queue // manager executes its tasks on. - virtual void AddTaskObserver( - base::MessageLoop::TaskObserver* task_observer) = 0; - virtual void RemoveTaskObserver( - base::MessageLoop::TaskObserver* task_observer) = 0; + void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer); + void RemoveTaskObserver(base::MessageLoop::TaskObserver* task_observer); // Set the blame context which is entered and left while executing tasks from // this task queue. |blame_context| must be null or outlive this task queue. // Must be called on the thread this TaskQueue was created by. - virtual void SetBlameContext( - base::trace_event::BlameContext* blame_context) = 0; + void SetBlameContext(base::trace_event::BlameContext* blame_context); // Removes the task queue from the previous TimeDomain and adds it to // |domain|. This is a moderately expensive operation. - virtual void SetTimeDomain(TimeDomain* domain) = 0; + void SetTimeDomain(TimeDomain* domain); // Returns the queue's current TimeDomain. Can be called from any thread. - virtual TimeDomain* GetTimeDomain() const = 0; + TimeDomain* GetTimeDomain() const; enum class InsertFencePosition { NOW, // Tasks posted on the queue up till this point further may run. @@ -221,21 +196,41 @@ // removed or a subsequent fence has unblocked some tasks within the queue. // Note: delayed tasks get their enqueue order set once their delay has // expired, and non-delayed tasks get their enqueue order set when posted. - virtual void InsertFence(InsertFencePosition position) = 0; + void InsertFence(InsertFencePosition position); // Removes any previously added fence and unblocks execution of any tasks // blocked by it. - virtual void RemoveFence() = 0; + void RemoveFence(); - virtual bool HasFence() const = 0; + bool HasFence() const; // Returns true if the queue has a fence which is blocking execution of tasks. - virtual bool BlockedByFence() const = 0; + bool BlockedByFence() const; - virtual void SetObserver(Observer* observer) = 0; + void SetObserver(Observer* observer); + + // base::SingleThreadTaskRunner implementation + bool RunsTasksInCurrentSequence() const override; + bool PostDelayedTask(const tracked_objects::Location& from_here, + base::OnceClosure task, + base::TimeDelta delay) override; + bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, + base::OnceClosure task, + base::TimeDelta delay) override; protected: - ~TaskQueue() override {} + explicit TaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl); + ~TaskQueue() override; + + internal::TaskQueueImpl* GetTaskQueueImpl() const { return impl_.get(); } + + private: + friend class internal::TaskQueueImpl; + friend class TaskQueueManager; + + friend class TaskQueueThrottlerTest; + + const std::unique_ptr<internal::TaskQueueImpl> impl_; DISALLOW_COPY_AND_ASSIGN(TaskQueue); };
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc index 8063c89c..b16bea2b 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc
@@ -20,40 +20,7 @@ namespace scheduler { // static -const char* TaskQueue::NameForQueueType(TaskQueue::QueueType queue_type) { - switch (queue_type) { - case TaskQueue::QueueType::CONTROL: - return "control_tq"; - case TaskQueue::QueueType::DEFAULT: - return "default_tq"; - case TaskQueue::QueueType::DEFAULT_LOADING: - return "default_loading_tq"; - case TaskQueue::QueueType::DEFAULT_TIMER: - return "default_timer_tq"; - case TaskQueue::QueueType::UNTHROTTLED: - return "unthrottled_tq"; - case TaskQueue::QueueType::FRAME_LOADING: - return "frame_loading_tq"; - case TaskQueue::QueueType::FRAME_TIMER: - return "frame_timer_tq"; - case TaskQueue::QueueType::FRAME_UNTHROTTLED: - return "frame_unthrottled_tq"; - case TaskQueue::QueueType::COMPOSITOR: - return "compositor_tq"; - case TaskQueue::QueueType::IDLE: - return "idle_tq"; - case TaskQueue::QueueType::TEST: - return "test_tq"; - case TaskQueue::QueueType::COUNT: - DCHECK(false); - return nullptr; - } - DCHECK(false); - return nullptr; -} - -// static -const char* TaskQueue::PriorityToString(QueuePriority priority) { +const char* TaskQueue::PriorityToString(TaskQueue::QueuePriority priority) { switch (priority) { case CONTROL_PRIORITY: return "control"; @@ -75,11 +42,10 @@ TaskQueueImpl::TaskQueueImpl(TaskQueueManager* task_queue_manager, TimeDomain* time_domain, - const Spec& spec) - : thread_id_(base::PlatformThread::CurrentId()), + const TaskQueue::Spec& spec) + : name_(spec.name), + thread_id_(base::PlatformThread::CurrentId()), any_thread_(task_queue_manager, time_domain), - type_(spec.type), - name_(NameForQueueType(spec.type)), main_thread_only_(task_queue_manager, this, time_domain), should_monitor_quiescence_(spec.should_monitor_quiescence), should_notify_observers_(spec.should_notify_observers), @@ -141,9 +107,7 @@ TaskQueueImpl::AnyThread::AnyThread(TaskQueueManager* task_queue_manager, TimeDomain* time_domain) - : task_queue_manager(task_queue_manager), - time_domain(time_domain), - observer(nullptr) {} + : task_queue_manager(task_queue_manager), time_domain(time_domain) {} TaskQueueImpl::AnyThread::~AnyThread() {} @@ -153,7 +117,6 @@ TimeDomain* time_domain) : task_queue_manager(task_queue_manager), time_domain(time_domain), - observer(nullptr), delayed_work_queue( new WorkQueue(task_queue, "delayed", WorkQueue::QueueType::DELAYED)), immediate_work_queue(new WorkQueue(task_queue, @@ -163,31 +126,39 @@ is_enabled_refcount(0), voter_refcount(0), blame_context(nullptr), - current_fence(0) {} + current_fence(0), + is_enabled_for_test(true) {} TaskQueueImpl::MainThreadOnly::~MainThreadOnly() {} -void TaskQueueImpl::UnregisterTaskQueue() { +void TaskQueueImpl::UnregisterTaskQueue(scoped_refptr<TaskQueue> task_queue) { base::AutoLock lock(any_thread_lock_); base::AutoLock immediate_incoming_queue_lock(immediate_incoming_queue_lock_); if (main_thread_only().time_domain) main_thread_only().time_domain->UnregisterQueue(this); if (!any_thread().task_queue_manager) return; + + main_thread_only().on_task_completed_handler = OnTaskCompletedHandler(); any_thread().time_domain = nullptr; main_thread_only().time_domain = nullptr; - any_thread().task_queue_manager->UnregisterTaskQueue(this); + any_thread().task_queue_manager->UnregisterTaskQueue(task_queue); any_thread().task_queue_manager = nullptr; main_thread_only().task_queue_manager = nullptr; - any_thread().observer = nullptr; - main_thread_only().observer = nullptr; + any_thread().on_next_wake_up_changed_callback = OnNextWakeUpChangedCallback(); + main_thread_only().on_next_wake_up_changed_callback = + OnNextWakeUpChangedCallback(); main_thread_only().delayed_incoming_queue = std::priority_queue<Task>(); immediate_incoming_queue().clear(); main_thread_only().immediate_work_queue.reset(); main_thread_only().delayed_work_queue.reset(); } +const char* TaskQueueImpl::GetName() const { + return name_; +} + bool TaskQueueImpl::RunsTasksInCurrentSequence() const { return base::PlatformThread::CurrentId() == thread_id_; } @@ -304,12 +275,10 @@ int thread_hop_task_sequence_number = any_thread().task_queue_manager->GetNextSequenceNumber(); PushOntoImmediateIncomingQueueLocked( - FROM_HERE, - base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this, - base::Passed(&pending_task)), - base::TimeTicks(), - thread_hop_task_sequence_number, - false); + FROM_HERE, + base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, + base::Unretained(this), base::Passed(&pending_task)), + base::TimeTicks(), thread_hop_task_sequence_number, false); } void TaskQueueImpl::ScheduleDelayedWorkTask(Task pending_task) { @@ -361,8 +330,8 @@ (!IsQueueEnabled() || main_thread_only().current_fence); any_thread().task_queue_manager->OnQueueHasIncomingImmediateWork( this, sequence_number, queue_is_blocked); - if (any_thread().observer) - any_thread().observer->OnQueueNextWakeUpChanged(this, desired_run_time); + if (!any_thread().on_next_wake_up_changed_callback.is_null()) + any_thread().on_next_wake_up_changed_callback.Run(desired_run_time); } TraceQueueSize(); @@ -479,22 +448,14 @@ main_thread_only().delayed_incoming_queue.size()); } -const char* TaskQueueImpl::GetName() const { - return name_; -} - -TaskQueue::QueueType TaskQueueImpl::GetQueueType() const { - return type_; -} - -void TaskQueueImpl::SetQueuePriority(QueuePriority priority) { +void TaskQueueImpl::SetQueuePriority(TaskQueue::QueuePriority priority) { if (!main_thread_only().task_queue_manager || priority == GetQueuePriority()) return; main_thread_only().task_queue_manager->selector_.SetQueuePriority(this, priority); } -TaskQueueImpl::QueuePriority TaskQueueImpl::GetQueuePriority() const { +TaskQueue::QueuePriority TaskQueueImpl::GetQueuePriority() const { size_t set_index = immediate_work_queue()->work_queue_set_index(); DCHECK_EQ(set_index, delayed_work_queue()->work_queue_set_index()); return static_cast<TaskQueue::QueuePriority>(set_index); @@ -548,7 +509,7 @@ QueueAsValueInto(main_thread_only().delayed_incoming_queue, now, state); state->EndArray(); } - state->SetString("priority", PriorityToString(GetQueuePriority())); + state->SetString("priority", TaskQueue::PriorityToString(GetQueuePriority())); state->EndDictionary(); } @@ -762,18 +723,19 @@ } TaskQueueImpl::QueueEnabledVoterImpl::QueueEnabledVoterImpl( - TaskQueueImpl* task_queue) + scoped_refptr<TaskQueue> task_queue) : task_queue_(task_queue), enabled_(true) {} TaskQueueImpl::QueueEnabledVoterImpl::~QueueEnabledVoterImpl() { - task_queue_->RemoveQueueEnabledVoter(this); + if (task_queue_->GetTaskQueueImpl()) + task_queue_->GetTaskQueueImpl()->RemoveQueueEnabledVoter(this); } void TaskQueueImpl::QueueEnabledVoterImpl::SetQueueEnabled(bool enabled) { if (enabled_ == enabled) return; - task_queue_->OnQueueEnabledVoteChanged(enabled); + task_queue_->GetTaskQueueImpl()->OnQueueEnabledVoteChanged(enabled); enabled_ = enabled; } @@ -798,8 +760,10 @@ } bool TaskQueueImpl::IsQueueEnabled() const { - return main_thread_only().is_enabled_refcount == - main_thread_only().voter_refcount; + // By default is_enabled_refcount and voter_refcount both equal zero. + return (main_thread_only().is_enabled_refcount == + main_thread_only().voter_refcount) && + main_thread_only().is_enabled_for_test; } void TaskQueueImpl::OnQueueEnabledVoteChanged(bool enabled) { @@ -823,10 +787,11 @@ return; if (enable) { - if (HasPendingImmediateWork() && main_thread_only().observer) { + if (HasPendingImmediateWork() && + !main_thread_only().on_next_wake_up_changed_callback.is_null()) { // Delayed work notification will be issued via time domain. - main_thread_only().observer->OnQueueNextWakeUpChanged(this, - base::TimeTicks()); + main_thread_only().on_next_wake_up_changed_callback.Run( + base::TimeTicks()); } ScheduleDelayedWorkInTimeDomain(main_thread_only().time_domain->Now()); @@ -841,11 +806,12 @@ } } -std::unique_ptr<TaskQueueImpl::QueueEnabledVoter> -TaskQueueImpl::CreateQueueEnabledVoter() { +std::unique_ptr<TaskQueue::QueueEnabledVoter> +TaskQueueImpl::CreateQueueEnabledVoter(scoped_refptr<TaskQueue> task_queue) { + DCHECK_EQ(task_queue->GetTaskQueueImpl(), this); main_thread_only().voter_refcount++; main_thread_only().is_enabled_refcount++; - return base::MakeUnique<QueueEnabledVoterImpl>(this); + return base::MakeUnique<QueueEnabledVoterImpl>(task_queue); } void TaskQueueImpl::SweepCanceledDelayedTasks(base::TimeTicks now) { @@ -882,17 +848,18 @@ immediate_incoming_queue().push_back(std::move(task)); } -void TaskQueueImpl::SetObserver(Observer* observer) { +void TaskQueueImpl::SetOnNextWakeUpChangedCallback( + TaskQueueImpl::OnNextWakeUpChangedCallback callback) { #if DCHECK_IS_ON() - if (observer) { - DCHECK(!main_thread_only().observer) << "Can't assign two different " - "observers to " - "blink::scheduler::TaskQueue"; + if (callback) { + DCHECK(main_thread_only().on_next_wake_up_changed_callback.is_null()) + << "Can't assign two different observers to " + "blink::scheduler::TaskQueue"; } #endif base::AutoLock lock(any_thread_lock_); - any_thread().observer = observer; - main_thread_only().observer = observer; + any_thread().on_next_wake_up_changed_callback = callback; + main_thread_only().on_next_wake_up_changed_callback = callback; } void TaskQueueImpl::ScheduleDelayedWorkInTimeDomain(base::TimeTicks now) { @@ -913,12 +880,13 @@ // If queue has immediate work an appropriate notification has already // been issued. - if (!scheduled_time_domain_wake_up || !main_thread_only().observer || + if (!scheduled_time_domain_wake_up || + main_thread_only().on_next_wake_up_changed_callback.is_null() || HasPendingImmediateWork()) return; - main_thread_only().observer->OnQueueNextWakeUpChanged( - this, scheduled_time_domain_wake_up.value()); + main_thread_only().on_next_wake_up_changed_callback.Run( + scheduled_time_domain_wake_up.value()); } bool TaskQueueImpl::HasPendingImmediateWork() { @@ -933,6 +901,22 @@ return !immediate_incoming_queue().empty(); } +void TaskQueueImpl::SetOnTaskCompletedHandler( + TaskQueueImpl::OnTaskCompletedHandler handler) { + main_thread_only().on_task_completed_handler = std::move(handler); +} + +void TaskQueueImpl::OnTaskCompleted(base::TimeTicks start, + base::TimeTicks end) { + if (!main_thread_only().on_task_completed_handler.is_null()) + main_thread_only().on_task_completed_handler.Run(start, end); +} + +void TaskQueueImpl::SetQueueEnabledForTest(bool enabled) { + main_thread_only().is_enabled_for_test = enabled; + EnableOrDisableWithSelector(IsQueueEnabled()); +} + } // namespace internal } // namespace scheduler } // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h index 77fbf79..1ae5094 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h
@@ -12,6 +12,7 @@ #include "base/callback.h" #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" #include "base/pending_task.h" #include "base/threading/thread_checker.h" @@ -58,11 +59,13 @@ // queue is selected, it round-robins between the immediate_work_queue and // delayed_work_queue. The reason for this is we want to make sure delayed // tasks (normally the most common type) don't starve out immediate work. -class PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue { +class PLATFORM_EXPORT TaskQueueImpl { public: TaskQueueImpl(TaskQueueManager* task_queue_manager, TimeDomain* time_domain, - const Spec& spec); + const TaskQueue::Spec& spec); + + ~TaskQueueImpl(); // Represents a time at which a task wants to run. Tasks scheduled for the // same point in time will be ordered by their sequence numbers. @@ -130,36 +133,42 @@ EnqueueOrder enqueue_order_; }; + using OnNextWakeUpChangedCallback = base::Callback<void(base::TimeTicks)>; + using OnTaskCompletedHandler = + base::Callback<void(base::TimeTicks, base::TimeTicks)>; + // TaskQueue implementation. - void UnregisterTaskQueue() override; - bool RunsTasksInCurrentSequence() const override; + const char* GetName() const; + bool RunsTasksInCurrentSequence() const; bool PostDelayedTask(const tracked_objects::Location& from_here, base::OnceClosure task, - base::TimeDelta delay) override; + base::TimeDelta delay); bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, base::OnceClosure task, - base::TimeDelta delay) override; - std::unique_ptr<QueueEnabledVoter> CreateQueueEnabledVoter() override; - bool IsQueueEnabled() const override; - bool IsEmpty() const override; - size_t GetNumberOfPendingTasks() const override; - bool HasTaskToRunImmediately() const override; - base::Optional<base::TimeTicks> GetNextScheduledWakeUp() override; - void SetQueuePriority(QueuePriority priority) override; - QueuePriority GetQueuePriority() const override; - void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer) override; - void RemoveTaskObserver( - base::MessageLoop::TaskObserver* task_observer) override; - void SetTimeDomain(TimeDomain* time_domain) override; - TimeDomain* GetTimeDomain() const override; - void SetBlameContext(base::trace_event::BlameContext* blame_context) override; - void InsertFence(InsertFencePosition position) override; - void RemoveFence() override; - bool HasFence() const override; - bool BlockedByFence() const override; - const char* GetName() const override; - QueueType GetQueueType() const override; - void SetObserver(Observer* observer) override; + base::TimeDelta delay); + // Require a reference to enclosing task queue for lifetime control. + std::unique_ptr<TaskQueue::QueueEnabledVoter> CreateQueueEnabledVoter( + scoped_refptr<TaskQueue> owning_task_queue); + bool IsQueueEnabled() const; + bool IsEmpty() const; + size_t GetNumberOfPendingTasks() const; + bool HasTaskToRunImmediately() const; + base::Optional<base::TimeTicks> GetNextScheduledWakeUp(); + void SetQueuePriority(TaskQueue::QueuePriority priority); + TaskQueue::QueuePriority GetQueuePriority() const; + void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer); + void RemoveTaskObserver(base::MessageLoop::TaskObserver* task_observer); + void SetTimeDomain(TimeDomain* time_domain); + TimeDomain* GetTimeDomain() const; + void SetBlameContext(base::trace_event::BlameContext* blame_context); + void InsertFence(TaskQueue::InsertFencePosition position); + void RemoveFence(); + bool HasFence() const; + bool BlockedByFence() const; + // Implementation of TaskQueue::SetObserver. + void SetOnNextWakeUpChangedCallback(OnNextWakeUpChangedCallback callback); + + void UnregisterTaskQueue(scoped_refptr<TaskQueue> task_queue); // Returns true if a (potentially hypothetical) task with the specified // |enqueue_order| could run on the queue. Must be called from the main @@ -228,26 +237,37 @@ void PushImmediateIncomingTaskForTest(TaskQueueImpl::Task&& task); EnqueueOrder GetFenceForTest() const; - class QueueEnabledVoterImpl : public QueueEnabledVoter { + class QueueEnabledVoterImpl : public TaskQueue::QueueEnabledVoter { public: - explicit QueueEnabledVoterImpl(TaskQueueImpl* task_queue); + explicit QueueEnabledVoterImpl(scoped_refptr<TaskQueue> task_queue); ~QueueEnabledVoterImpl() override; // QueueEnabledVoter implementation. void SetQueueEnabled(bool enabled) override; - TaskQueueImpl* GetTaskQueueForTest() const { return task_queue_.get(); } + TaskQueueImpl* GetTaskQueueForTest() const { + return task_queue_->GetTaskQueueImpl(); + } private: friend class TaskQueueImpl; - scoped_refptr<TaskQueueImpl> task_queue_; + scoped_refptr<TaskQueue> task_queue_; bool enabled_; }; // Iterates over |delayed_incoming_queue| removing canceled tasks. void SweepCanceledDelayedTasks(base::TimeTicks now); + // Allows wrapping TaskQueue to set a handler to subscribe for notifications + // about completed tasks. + void SetOnTaskCompletedHandler(OnTaskCompletedHandler handler); + void OnTaskCompleted(base::TimeTicks start, base::TimeTicks end); + + // Disables queue for testing purposes, when a QueueEnabledVoter can't be + // constructed due to not having TaskQueue. + void SetQueueEnabledForTest(bool enabled); + private: friend class WorkQueue; friend class WorkQueueTest; @@ -266,7 +286,8 @@ // main thread, so it should be locked before accessing from other threads. TaskQueueManager* task_queue_manager; TimeDomain* time_domain; - Observer* observer; + // Callback corresponding to TaskQueue::Observer::OnQueueNextChanged. + OnNextWakeUpChangedCallback on_next_wake_up_changed_callback; }; struct MainThreadOnly { @@ -280,7 +301,8 @@ // See description inside struct AnyThread for details. TaskQueueManager* task_queue_manager; TimeDomain* time_domain; - Observer* observer; + // Callback corresponding to TaskQueue::Observer::OnQueueNextChanged. + OnNextWakeUpChangedCallback on_next_wake_up_changed_callback; std::unique_ptr<WorkQueue> delayed_work_queue; std::unique_ptr<WorkQueue> immediate_work_queue; @@ -293,10 +315,11 @@ base::trace_event::BlameContext* blame_context; // Not owned. EnqueueOrder current_fence; base::Optional<base::TimeTicks> scheduled_time_domain_wake_up; + OnTaskCompletedHandler on_task_completed_handler; + // If false, queue will be disabled. Used only for tests. + bool is_enabled_for_test; }; - ~TaskQueueImpl() override; - bool PostImmediateTaskImpl(const tracked_objects::Location& from_here, base::OnceClosure task, TaskType task_type); @@ -354,6 +377,8 @@ // Schedules delayed work on time domain and calls the observer. void ScheduleDelayedWorkInTimeDomain(base::TimeTicks now); + const char* name_; + const base::PlatformThreadId thread_id_; mutable base::Lock any_thread_lock_; @@ -367,9 +392,6 @@ return any_thread_; } - const QueueType type_; - const char* const name_; - base::ThreadChecker main_thread_checker_; MainThreadOnly main_thread_only_; MainThreadOnly& main_thread_only() {
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc index d409fcf..0108188 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc
@@ -17,6 +17,7 @@ #include "platform/scheduler/base/task_time_observer.h" #include "platform/scheduler/base/work_queue.h" #include "platform/scheduler/base/work_queue_sets.h" +#include "platform/wtf/PtrUtil.h" namespace blink { namespace scheduler { @@ -106,19 +107,18 @@ time_domains_.erase(time_domain); } -scoped_refptr<internal::TaskQueueImpl> TaskQueueManager::NewTaskQueue( +std::unique_ptr<internal::TaskQueueImpl> TaskQueueManager::CreateTaskQueueImpl( const TaskQueue::Spec& spec) { - TRACE_EVENT1("renderer.scheduler", "TaskQueueManager::NewTaskQueue", - "queue_name", TaskQueue::NameForQueueType(spec.type)); DCHECK(main_thread_checker_.CalledOnValidThread()); TimeDomain* time_domain = spec.time_domain ? spec.time_domain : real_time_domain_.get(); DCHECK(time_domains_.find(time_domain) != time_domains_.end()); - scoped_refptr<internal::TaskQueueImpl> queue( - make_scoped_refptr(new internal::TaskQueueImpl(this, time_domain, spec))); - queues_.insert(queue); - selector_.AddQueue(queue.get()); - return queue; + return WTF::MakeUnique<internal::TaskQueueImpl>(this, time_domain, spec); +} + +void TaskQueueManager::RegisterTaskQueue(scoped_refptr<TaskQueue> task_queue) { + queues_.insert(task_queue); + selector_.AddQueue(task_queue->GetTaskQueueImpl()); } void TaskQueueManager::SetObserver(Observer* observer) { @@ -127,23 +127,22 @@ } void TaskQueueManager::UnregisterTaskQueue( - scoped_refptr<internal::TaskQueueImpl> task_queue) { + scoped_refptr<TaskQueue> task_queue) { TRACE_EVENT1("renderer.scheduler", "TaskQueueManager::UnregisterTaskQueue", "queue_name", task_queue->GetName()); DCHECK(main_thread_checker_.CalledOnValidThread()); - if (observer_) - observer_->OnUnregisterTaskQueue(task_queue); // Add |task_queue| to |queues_to_delete_| so we can prevent it from being // freed while any of our structures hold hold a raw pointer to it. queues_to_delete_.insert(task_queue); queues_.erase(task_queue); - selector_.RemoveQueue(task_queue.get()); + selector_.RemoveQueue(task_queue->GetTaskQueueImpl()); { base::AutoLock lock(any_thread_lock_); - any_thread().has_incoming_immediate_work.erase(task_queue.get()); + any_thread().has_incoming_immediate_work.erase( + task_queue->GetTaskQueueImpl()); } } @@ -516,7 +515,7 @@ if (notify_time_observers) { task_start_time = MonotonicTimeInSeconds(time_before_task.Now()); for (auto& observer : task_time_observers_) - observer.WillProcessTask(queue, task_start_time); + observer.WillProcessTask(task_start_time); } } @@ -541,8 +540,13 @@ if (task_start_time) { *time_after_task = real_time_domain()->Now(); double task_end_time = MonotonicTimeInSeconds(*time_after_task); + + queue->OnTaskCompleted( + base::TimeTicks() + base::TimeDelta::FromSecondsD(task_start_time), + base::TimeTicks() + base::TimeDelta::FromSecondsD(task_end_time)); + for (auto& observer : task_time_observers_) - observer.DidProcessTask(queue, task_start_time, task_end_time); + observer.DidProcessTask(task_start_time, task_end_time); } for (auto& observer : task_observers_) @@ -639,7 +643,7 @@ base::TimeTicks now = real_time_domain()->CreateLazyNow().Now(); state->BeginArray("queues"); for (auto& queue : queues_) - queue->AsValueInto(now, state.get()); + queue->GetTaskQueueImpl()->AsValueInto(now, state.get()); state->EndArray(); state->BeginDictionary("selector"); selector_.AsValueInto(state.get()); @@ -683,10 +687,8 @@ internal::WorkQueue* work_queue) { DCHECK(main_thread_checker_.CalledOnValidThread()); DCHECK(!work_queue->Empty()); - if (observer_) { - observer_->OnTriedToExecuteBlockedTask(*work_queue->task_queue(), - *work_queue->GetFrontTask()); - } + if (observer_) + observer_->OnTriedToExecuteBlockedTask(); } bool TaskQueueManager::HasImmediateWorkForTesting() const { @@ -701,11 +703,12 @@ void TaskQueueManager::SweepCanceledDelayedTasks() { std::map<TimeDomain*, base::TimeTicks> time_domain_now; - for (const scoped_refptr<internal::TaskQueueImpl>& queue : queues_) { + for (const auto& queue : queues_) { TimeDomain* time_domain = queue->GetTimeDomain(); if (time_domain_now.find(time_domain) == time_domain_now.end()) time_domain_now.insert(std::make_pair(time_domain, time_domain->Now())); - queue->SweepCanceledDelayedTasks(time_domain_now[time_domain]); + queue->GetTaskQueueImpl()->SweepCanceledDelayedTasks( + time_domain_now[time_domain]); } }
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h index dd8e9a18..5e86eda7 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h
@@ -36,9 +36,10 @@ class LazyNow; class RealTimeDomain; -class TimeDomain; +class TaskQueue; class TaskQueueManagerDelegate; class TaskTimeObserver; +class TimeDomain; // The task queue manager provides N task queues and a selector interface for // choosing which task queue to service next. Each task queue consists of two @@ -98,23 +99,22 @@ // last call to GetAndClearSystemIsQuiescentBit. bool GetAndClearSystemIsQuiescentBit(); - // Creates a task queue with the given |spec|. Must be called on the thread - // this class was created on. - scoped_refptr<internal::TaskQueueImpl> NewTaskQueue( - const TaskQueue::Spec& spec); + // Creates a task queue with the given type, |spec| and args. Must be called + // on the thread this class was created on. + template <typename TaskQueueType, typename... Args> + scoped_refptr<TaskQueueType> CreateTaskQueue(const TaskQueue::Spec& spec, + Args&&... args) { + scoped_refptr<TaskQueueType> task_queue(new TaskQueueType( + CreateTaskQueueImpl(spec), std::forward<Args>(args)...)); + RegisterTaskQueue(task_queue); + return task_queue; + } class PLATFORM_EXPORT Observer { public: virtual ~Observer() {} - // Called when |queue| is unregistered. - virtual void OnUnregisterTaskQueue( - const scoped_refptr<TaskQueue>& queue) = 0; - - // Called when the manager tried to execute a task from a disabled - // queue. See TaskQueue::Spec::SetShouldReportWhenExecutionBlocked. - virtual void OnTriedToExecuteBlockedTask(const TaskQueue& queue, - const base::PendingTask& task) = 0; + virtual void OnTriedToExecuteBlockedTask() = 0; }; // Called once to set the Observer. This function is called on the main @@ -135,7 +135,7 @@ // Returns the currently executing TaskQueue if any. Must be called on the // thread this class was created on. - TaskQueue* currently_executing_task_queue() const { + internal::TaskQueueImpl* currently_executing_task_queue() const { DCHECK(main_thread_checker_.CalledOnValidThread()); return currently_executing_task_queue_; } @@ -227,7 +227,7 @@ }; // Unregisters a TaskQueue previously created by |NewTaskQueue()|. - void UnregisterTaskQueue(scoped_refptr<internal::TaskQueueImpl> task_queue); + void UnregisterTaskQueue(scoped_refptr<TaskQueue> task_queue); // TaskQueueSelector::Observer implementation: void OnTaskQueueEnabled(internal::TaskQueueImpl* queue) override; @@ -312,14 +312,18 @@ void ReloadEmptyWorkQueues( const IncomingImmediateWorkMap& queues_to_reload) const; + std::unique_ptr<internal::TaskQueueImpl> CreateTaskQueueImpl( + const TaskQueue::Spec& spec); + void RegisterTaskQueue(scoped_refptr<TaskQueue> task_queue); + std::set<TimeDomain*> time_domains_; std::unique_ptr<RealTimeDomain> real_time_domain_; - std::set<scoped_refptr<internal::TaskQueueImpl>> queues_; + std::set<scoped_refptr<TaskQueue>> queues_; // We have to be careful when deleting a queue because some of the code uses // raw pointers and doesn't expect the rug to be pulled out from underneath. - std::set<scoped_refptr<internal::TaskQueueImpl>> queues_to_delete_; + std::set<scoped_refptr<TaskQueue>> queues_to_delete_; internal::EnqueueOrderGenerator enqueue_order_generator_; base::debug::TaskAnnotator task_annotator_;
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_perftest.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_perftest.cc index 4c33e1d2..c93d4246 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_perftest.cc +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_perftest.cc
@@ -21,6 +21,7 @@ #include "platform/scheduler/base/test_task_time_observer.h" #include "platform/scheduler/base/virtual_time_domain.h" #include "platform/scheduler/base/work_queue_sets.h" +#include "platform/scheduler/test/test_task_queue.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/perf/perf_test.h" @@ -93,9 +94,8 @@ manager_->RegisterTimeDomain(virtual_time_domain_.get()); for (size_t i = 0; i < num_queues; i++) { - queues_.push_back(manager_->NewTaskQueue( - TaskQueue::Spec(TaskQueue::QueueType::TEST) - .SetTimeDomain(virtual_time_domain_.get()))); + queues_.push_back(manager_->CreateTaskQueue<TestTaskQueue>( + TaskQueue::Spec("test").SetTimeDomain(virtual_time_domain_.get()))); } }
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc index 5ab22a8..13115f9 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc
@@ -31,6 +31,7 @@ #include "platform/scheduler/base/virtual_time_domain.h" #include "platform/scheduler/base/work_queue.h" #include "platform/scheduler/base/work_queue_sets.h" +#include "platform/scheduler/test/test_task_queue.h" #include "testing/gmock/include/gmock/gmock.h" using ::testing::AnyNumber; @@ -89,6 +90,19 @@ void DeleteTaskQueueManager() { manager_.reset(); } protected: + scoped_refptr<TestTaskQueue> CreateTaskQueueWithSpec(TaskQueue::Spec spec) { + return manager_->CreateTaskQueue<TestTaskQueue>(spec); + } + + scoped_refptr<TestTaskQueue> CreateTaskQueue() { + return CreateTaskQueueWithSpec(TaskQueue::Spec("test")); + } + + scoped_refptr<TestTaskQueue> CreateTaskQueueWithMonitoredQuiescence() { + return CreateTaskQueueWithSpec( + TaskQueue::Spec("test").SetShouldMonitorQuiescence(true)); + } + void InitializeWithClock(size_t num_queues, std::unique_ptr<base::TickClock> test_time_source) { test_task_runner_ = make_scoped_refptr( @@ -100,8 +114,7 @@ manager_ = base::MakeUnique<TaskQueueManagerForTest>(main_task_runner_); for (size_t i = 0; i < num_queues; i++) - runners_.push_back( - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST))); + runners_.push_back(CreateTaskQueue()); } void Initialize(size_t num_queues) { @@ -121,8 +134,7 @@ base::WrapUnique(new TestTimeSource(now_src_.get())))); for (size_t i = 0; i < num_queues; i++) - runners_.push_back( - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST))); + runners_.push_back(CreateTaskQueue()); } void WakeUpReadyDelayedQueues(LazyNow lazy_now) { @@ -187,7 +199,7 @@ scoped_refptr<TaskQueueManagerDelegateForTest> main_task_runner_; scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_; std::unique_ptr<TaskQueueManagerForTest> manager_; - std::vector<scoped_refptr<internal::TaskQueueImpl>> runners_; + std::vector<scoped_refptr<TestTaskQueue>> runners_; TestTaskTimeObserver test_task_time_observer_; }; @@ -222,8 +234,7 @@ manager_->AddTaskTimeObserver(&test_task_time_observer_); for (size_t i = 0; i < 3; i++) - runners_.push_back( - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST))); + runners_.push_back(CreateTaskQueue()); runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask)); runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask)); @@ -252,8 +263,7 @@ base::WrapUnique(test_count_uses_time_source))); manager_->AddTaskTimeObserver(&test_task_time_observer_); - runners_.push_back( - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST))); + runners_.push_back(CreateTaskQueue()); std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; for (int i = 0; i <= 6; ++i) { @@ -365,12 +375,13 @@ EXPECT_TRUE(runners_[0]->HasTaskToRunImmediately()); // Move the task into the |immediate_work_queue|. - EXPECT_TRUE(runners_[0]->immediate_work_queue()->Empty()); + EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->immediate_work_queue()->Empty()); std::unique_ptr<TaskQueue::QueueEnabledVoter> voter = runners_[0]->CreateQueueEnabledVoter(); voter->SetQueueEnabled(false); test_task_runner_->RunUntilIdle(); - EXPECT_FALSE(runners_[0]->immediate_work_queue()->Empty()); + EXPECT_FALSE( + runners_[0]->GetTaskQueueImpl()->immediate_work_queue()->Empty()); EXPECT_TRUE(runners_[0]->HasTaskToRunImmediately()); // Run the task, making the queue empty. @@ -392,7 +403,7 @@ // Move the task into the |delayed_work_queue|. WakeUpReadyDelayedQueues(LazyNow(now_src_.get())); - EXPECT_FALSE(runners_[0]->delayed_work_queue()->Empty()); + EXPECT_FALSE(runners_[0]->GetTaskQueueImpl()->delayed_work_queue()->Empty()); EXPECT_TRUE(runners_[0]->HasTaskToRunImmediately()); // Run the task, making the queue empty. @@ -1099,15 +1110,9 @@ TEST_F(TaskQueueManagerTest, GetAndClearSystemIsQuiescentBit) { Initialize(3u); - scoped_refptr<internal::TaskQueueImpl> queue0 = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST) - .SetShouldMonitorQuiescence(true)); - scoped_refptr<internal::TaskQueueImpl> queue1 = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST) - .SetShouldMonitorQuiescence(true)); - scoped_refptr<internal::TaskQueueImpl> queue2 = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST) - .SetShouldMonitorQuiescence(false)); + scoped_refptr<TaskQueue> queue0 = CreateTaskQueueWithMonitoredQuiescence(); + scoped_refptr<TaskQueue> queue1 = CreateTaskQueueWithMonitoredQuiescence(); + scoped_refptr<TaskQueue> queue2 = CreateTaskQueue(); EXPECT_TRUE(manager_->GetAndClearSystemIsQuiescentBit()); @@ -1329,12 +1334,9 @@ TEST_F(TaskQueueManagerTest, NewTaskQueues) { Initialize(1u); - scoped_refptr<internal::TaskQueueImpl> queue1 = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)); - scoped_refptr<internal::TaskQueueImpl> queue2 = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)); - scoped_refptr<internal::TaskQueueImpl> queue3 = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)); + scoped_refptr<TaskQueue> queue1 = CreateTaskQueue(); + scoped_refptr<TaskQueue> queue2 = CreateTaskQueue(); + scoped_refptr<TaskQueue> queue3 = CreateTaskQueue(); ASSERT_NE(queue1, queue2); ASSERT_NE(queue1, queue3); @@ -1352,12 +1354,9 @@ TEST_F(TaskQueueManagerTest, UnregisterTaskQueue) { Initialize(1u); - scoped_refptr<internal::TaskQueueImpl> queue1 = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)); - scoped_refptr<internal::TaskQueueImpl> queue2 = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)); - scoped_refptr<internal::TaskQueueImpl> queue3 = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)); + scoped_refptr<TaskQueue> queue1 = CreateTaskQueue(); + scoped_refptr<TaskQueue> queue2 = CreateTaskQueue(); + scoped_refptr<TaskQueue> queue3 = CreateTaskQueue(); ASSERT_NE(queue1, queue2); ASSERT_NE(queue1, queue3); @@ -1394,7 +1393,7 @@ } namespace { -void UnregisterQueue(scoped_refptr<internal::TaskQueueImpl> queue) { +void UnregisterQueue(scoped_refptr<TaskQueue> queue) { queue->UnregisterTaskQueue(); } } @@ -1417,38 +1416,19 @@ class MockObserver : public TaskQueueManager::Observer { public: - MOCK_METHOD1(OnUnregisterTaskQueue, - void(const scoped_refptr<TaskQueue>& queue)); - MOCK_METHOD2(OnTriedToExecuteBlockedTask, - void(const TaskQueue& queue, const base::PendingTask& task)); + MOCK_METHOD0(OnTriedToExecuteBlockedTask, void()); }; } // namespace -TEST_F(TaskQueueManagerTest, OnUnregisterTaskQueue) { - Initialize(0u); - - MockObserver observer; - manager_->SetObserver(&observer); - - scoped_refptr<internal::TaskQueueImpl> task_queue = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)); - - EXPECT_CALL(observer, OnUnregisterTaskQueue(_)).Times(1); - task_queue->UnregisterTaskQueue(); - - manager_->SetObserver(nullptr); -} - TEST_F(TaskQueueManagerTest, OnTriedToExecuteBlockedTask) { Initialize(0u); MockObserver observer; manager_->SetObserver(&observer); - scoped_refptr<internal::TaskQueueImpl> task_queue = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST) - .SetShouldReportWhenExecutionBlocked(true)); + scoped_refptr<TaskQueue> task_queue = CreateTaskQueueWithSpec( + TaskQueue::Spec("test").SetShouldReportWhenExecutionBlocked(true)); std::unique_ptr<TaskQueue::QueueEnabledVoter> voter = task_queue->CreateQueueEnabledVoter(); @@ -1460,7 +1440,7 @@ voter->SetQueueEnabled(true); voter->SetQueueEnabled(false); - EXPECT_CALL(observer, OnTriedToExecuteBlockedTask(_, _)).Times(1); + EXPECT_CALL(observer, OnTriedToExecuteBlockedTask()).Times(1); test_task_runner_->RunPendingTasks(); manager_->SetObserver(nullptr); @@ -1472,28 +1452,22 @@ MockObserver observer; manager_->SetObserver(&observer); - scoped_refptr<internal::TaskQueueImpl> task_queue = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST) - .SetShouldReportWhenExecutionBlocked(true)); + scoped_refptr<TaskQueue> task_queue = CreateTaskQueueWithSpec( + TaskQueue::Spec("test").SetShouldReportWhenExecutionBlocked(true)); task_queue->PostTask(FROM_HERE, base::Bind(&NopTask)); - EXPECT_CALL(observer, OnTriedToExecuteBlockedTask(_, _)).Times(0); + EXPECT_CALL(observer, OnTriedToExecuteBlockedTask()).Times(0); test_task_runner_->RunPendingTasks(); manager_->SetObserver(nullptr); } -void HasOneRefTask(std::vector<bool>* log, internal::TaskQueueImpl* tq) { - log->push_back(tq->HasOneRef()); -} - TEST_F(TaskQueueManagerTest, UnregisterTaskQueueInNestedLoop) { InitializeWithRealMessageLoop(1u); // We retain a reference to the task queue even when the manager has deleted // its reference. - scoped_refptr<internal::TaskQueueImpl> task_queue = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)); + scoped_refptr<TaskQueue> task_queue = CreateTaskQueue(); std::vector<bool> log; std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; @@ -1503,31 +1477,20 @@ // reference until the nested run loop exits. // NB: This first HasOneRefTask is a sanity check. tasks_to_post_from_nested_loop.push_back( - std::make_pair(base::Bind(&HasOneRefTask, base::Unretained(&log), + std::make_pair(base::Bind(&NopTask), true)); + tasks_to_post_from_nested_loop.push_back( + std::make_pair(base::Bind(&TaskQueue::UnregisterTaskQueue, base::Unretained(task_queue.get())), true)); tasks_to_post_from_nested_loop.push_back( - std::make_pair(base::Bind(&internal::TaskQueueImpl::UnregisterTaskQueue, - base::Unretained(task_queue.get())), - true)); - tasks_to_post_from_nested_loop.push_back( - std::make_pair(base::Bind(&HasOneRefTask, base::Unretained(&log), - base::Unretained(task_queue.get())), - true)); + std::make_pair(base::Bind(&NopTask), true)); runners_[0]->PostTask( FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), base::RetainedRef(runners_[0]), base::Unretained(&tasks_to_post_from_nested_loop))); base::RunLoop().RunUntilIdle(); - // Add a final call to HasOneRefTask. This gives the manager a chance to - // release its reference, and checks that it has. - runners_[0]->PostTask(FROM_HERE, - base::Bind(&HasOneRefTask, base::Unretained(&log), - base::Unretained(task_queue.get()))); - base::RunLoop().RunUntilIdle(); - - EXPECT_THAT(log, ElementsAre(false, false, true)); + // Just make sure that we don't crash. } TEST_F(TaskQueueManagerTest, TimeDomainsAreIndependant) { @@ -1708,7 +1671,7 @@ Mock::VerifyAndClearExpectations(&observer); // Unless the immediate work queue is emptied. - runners_[0]->ReloadImmediateWorkQueueIfEmpty(); + runners_[0]->GetTaskQueueImpl()->ReloadImmediateWorkQueueIfEmpty(); EXPECT_CALL(observer, OnQueueNextWakeUpChanged(runners_[0].get(), base::TimeTicks())); runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask)); @@ -1930,7 +1893,7 @@ class QuadraticTask { public: - QuadraticTask(scoped_refptr<internal::TaskQueueImpl> task_queue, + QuadraticTask(scoped_refptr<TaskQueue> task_queue, base::TimeDelta delay, base::SimpleTestTickClock* now_src) : count_(0), task_queue_(task_queue), delay_(delay), now_src_(now_src) {} @@ -1956,7 +1919,7 @@ private: int count_; - scoped_refptr<internal::TaskQueueImpl> task_queue_; + scoped_refptr<TaskQueue> task_queue_; base::TimeDelta delay_; base::Callback<bool()> should_exit_; base::SimpleTestTickClock* now_src_; @@ -1964,7 +1927,7 @@ class LinearTask { public: - LinearTask(scoped_refptr<internal::TaskQueueImpl> task_queue, + LinearTask(scoped_refptr<TaskQueue> task_queue, base::TimeDelta delay, base::SimpleTestTickClock* now_src) : count_(0), task_queue_(task_queue), delay_(delay), now_src_(now_src) {} @@ -1987,7 +1950,7 @@ private: int count_; - scoped_refptr<internal::TaskQueueImpl> task_queue_; + scoped_refptr<TaskQueue> task_queue_; base::TimeDelta delay_; base::Callback<bool()> should_exit_; base::SimpleTestTickClock* now_src_; @@ -2117,7 +2080,7 @@ namespace { void CurrentlyExecutingTaskQueueTestTask( TaskQueueManager* task_queue_manager, - std::vector<TaskQueue*>* task_sources) { + std::vector<internal::TaskQueueImpl*>* task_sources) { task_sources->push_back(task_queue_manager->currently_executing_task_queue()); } } @@ -2125,17 +2088,18 @@ TEST_F(TaskQueueManagerTest, CurrentlyExecutingTaskQueue_TaskRunning) { Initialize(2u); - internal::TaskQueueImpl* queue0 = runners_[0].get(); - internal::TaskQueueImpl* queue1 = runners_[1].get(); + TestTaskQueue* queue0 = runners_[0].get(); + TestTaskQueue* queue1 = runners_[1].get(); - std::vector<TaskQueue*> task_sources; + std::vector<internal::TaskQueueImpl*> task_sources; queue0->PostTask(FROM_HERE, base::Bind(&CurrentlyExecutingTaskQueueTestTask, manager_.get(), &task_sources)); queue1->PostTask(FROM_HERE, base::Bind(&CurrentlyExecutingTaskQueueTestTask, manager_.get(), &task_sources)); test_task_runner_->RunUntilIdle(); - EXPECT_THAT(task_sources, ElementsAre(queue0, queue1)); + EXPECT_THAT(task_sources, ElementsAre(queue0->GetTaskQueueImpl(), + queue1->GetTaskQueueImpl())); EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); } @@ -2143,12 +2107,12 @@ void RunloopCurrentlyExecutingTaskQueueTestTask( base::MessageLoop* message_loop, TaskQueueManager* task_queue_manager, - std::vector<TaskQueue*>* task_sources, - std::vector<std::pair<base::Closure, TaskQueue*>>* tasks) { + std::vector<internal::TaskQueueImpl*>* task_sources, + std::vector<std::pair<base::Closure, TestTaskQueue*>>* tasks) { base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); task_sources->push_back(task_queue_manager->currently_executing_task_queue()); - for (std::pair<base::Closure, TaskQueue*>& pair : *tasks) { + for (std::pair<base::Closure, TestTaskQueue*>& pair : *tasks) { pair.second->PostTask(FROM_HERE, pair.first); } @@ -2160,12 +2124,12 @@ TEST_F(TaskQueueManagerTest, CurrentlyExecutingTaskQueue_NestedLoop) { InitializeWithRealMessageLoop(3u); - TaskQueue* queue0 = runners_[0].get(); - TaskQueue* queue1 = runners_[1].get(); - TaskQueue* queue2 = runners_[2].get(); + TestTaskQueue* queue0 = runners_[0].get(); + TestTaskQueue* queue1 = runners_[1].get(); + TestTaskQueue* queue2 = runners_[2].get(); - std::vector<TaskQueue*> task_sources; - std::vector<std::pair<base::Closure, TaskQueue*>> + std::vector<internal::TaskQueueImpl*> task_sources; + std::vector<std::pair<base::Closure, TestTaskQueue*>> tasks_to_post_from_nested_loop; tasks_to_post_from_nested_loop.push_back( std::make_pair(base::Bind(&CurrentlyExecutingTaskQueueTestTask, @@ -2182,7 +2146,10 @@ &tasks_to_post_from_nested_loop)); base::RunLoop().RunUntilIdle(); - EXPECT_THAT(task_sources, ElementsAre(queue0, queue1, queue2, queue0)); + EXPECT_THAT( + task_sources, + ElementsAre(queue0->GetTaskQueueImpl(), queue1->GetTaskQueueImpl(), + queue2->GetTaskQueueImpl(), queue0->GetTaskQueueImpl())); EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); } @@ -2233,7 +2200,7 @@ using trace_analyzer::Query; InitializeWithRealMessageLoop(1u); - TaskQueue* queue = runners_[0].get(); + TestTaskQueue* queue = runners_[0].get(); StartTracing(); { @@ -2459,8 +2426,7 @@ TEST_F(TaskQueueManagerTest, UnregisterQueueBeforeEnabledVoterDeleted) { Initialize(1u); - scoped_refptr<internal::TaskQueueImpl> queue = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)); + scoped_refptr<TaskQueue> queue = CreateTaskQueue(); std::unique_ptr<TaskQueue::QueueEnabledVoter> voter = queue->CreateQueueEnabledVoter(); @@ -2475,8 +2441,7 @@ TEST_F(TaskQueueManagerTest, UnregisterQueueBeforeDisabledVoterDeleted) { Initialize(1u); - scoped_refptr<internal::TaskQueueImpl> queue = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)); + scoped_refptr<TaskQueue> queue = CreateTaskQueue(); std::unique_ptr<TaskQueue::QueueEnabledVoter> voter = queue->CreateQueueEnabledVoter(); @@ -2736,10 +2701,9 @@ } namespace { -void MessageLoopTaskWithDelayedQuit( - base::MessageLoop* message_loop, - base::SimpleTestTickClock* now_src, - scoped_refptr<internal::TaskQueueImpl> task_queue) { +void MessageLoopTaskWithDelayedQuit(base::MessageLoop* message_loop, + base::SimpleTestTickClock* now_src, + scoped_refptr<TaskQueue> task_queue) { base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); base::RunLoop run_loop; task_queue->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(), @@ -2760,10 +2724,9 @@ } namespace { -void MessageLoopTaskWithImmediateQuit( - base::MessageLoop* message_loop, - base::Closure non_nested_quit_closure, - scoped_refptr<internal::TaskQueueImpl> task_queue) { +void MessageLoopTaskWithImmediateQuit(base::MessageLoop* message_loop, + base::Closure non_nested_quit_closure, + scoped_refptr<TaskQueue> task_queue) { base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); base::RunLoop run_loop; @@ -2794,31 +2757,31 @@ Initialize(1u); EnqueueOrder enqueue_order = GetNextSequenceNumber(); - EXPECT_TRUE(runners_[0]->CouldTaskRun(enqueue_order)); + EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order)); std::unique_ptr<TaskQueue::QueueEnabledVoter> voter = runners_[0]->CreateQueueEnabledVoter(); voter->SetQueueEnabled(false); - EXPECT_FALSE(runners_[0]->CouldTaskRun(enqueue_order)); + EXPECT_FALSE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order)); voter->SetQueueEnabled(true); - EXPECT_TRUE(runners_[0]->CouldTaskRun(enqueue_order)); + EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order)); } TEST_F(TaskQueueManagerTest, CouldTaskRun_Fence) { Initialize(1u); EnqueueOrder enqueue_order = GetNextSequenceNumber(); - EXPECT_TRUE(runners_[0]->CouldTaskRun(enqueue_order)); + EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order)); runners_[0]->InsertFence(TaskQueue::InsertFencePosition::NOW); - EXPECT_TRUE(runners_[0]->CouldTaskRun(enqueue_order)); + EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order)); runners_[0]->InsertFence(TaskQueue::InsertFencePosition::BEGINNING_OF_TIME); - EXPECT_FALSE(runners_[0]->CouldTaskRun(enqueue_order)); + EXPECT_FALSE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order)); runners_[0]->RemoveFence(); - EXPECT_TRUE(runners_[0]->CouldTaskRun(enqueue_order)); + EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order)); } TEST_F(TaskQueueManagerTest, CouldTaskRun_FenceBeforeThenAfter) { @@ -2827,10 +2790,10 @@ runners_[0]->InsertFence(TaskQueue::InsertFencePosition::NOW); EnqueueOrder enqueue_order = GetNextSequenceNumber(); - EXPECT_FALSE(runners_[0]->CouldTaskRun(enqueue_order)); + EXPECT_FALSE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order)); runners_[0]->InsertFence(TaskQueue::InsertFencePosition::NOW); - EXPECT_TRUE(runners_[0]->CouldTaskRun(enqueue_order)); + EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order)); } TEST_F(TaskQueueManagerTest, DelayedDoWorkNotPostedForDisabledQueue) {
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_selector_unittest.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_selector_unittest.cc index 96f1c6c..9bf2ad2 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_selector_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_selector_unittest.cc
@@ -98,35 +98,16 @@ static void TestFunction() {} - void EnableQueue(TaskQueue::QueueEnabledVoter* voter) { - TaskQueueImpl::QueueEnabledVoterImpl* voter_impl = - static_cast<TaskQueueImpl::QueueEnabledVoterImpl*>(voter); - - voter_impl->SetQueueEnabled(true); - - ASSERT_TRUE(voter_impl->GetTaskQueueForTest()->IsQueueEnabled()); - selector_.EnableQueue(voter_impl->GetTaskQueueForTest()); - } - - void DisableQueue(TaskQueue::QueueEnabledVoter* voter) { - TaskQueueImpl::QueueEnabledVoterImpl* voter_impl = - static_cast<TaskQueueImpl::QueueEnabledVoterImpl*>(voter); - - voter_impl->SetQueueEnabled(false); - ASSERT_FALSE(voter_impl->GetTaskQueueForTest()->IsQueueEnabled()); - selector_.DisableQueue(voter_impl->GetTaskQueueForTest()); - } - protected: void SetUp() final { virtual_time_domain_ = base::WrapUnique<VirtualTimeDomain>( new VirtualTimeDomain(base::TimeTicks())); for (size_t i = 0; i < kTaskQueueCount; i++) { - scoped_refptr<TaskQueueImpl> task_queue = make_scoped_refptr( - new TaskQueueImpl(nullptr, virtual_time_domain_.get(), - TaskQueue::Spec(TaskQueue::QueueType::TEST))); + std::unique_ptr<TaskQueueImpl> task_queue = + base::MakeUnique<TaskQueueImpl>(nullptr, virtual_time_domain_.get(), + TaskQueue::Spec("test")); selector_.AddQueue(task_queue.get()); - task_queues_.push_back(task_queue); + task_queues_.push_back(std::move(task_queue)); } for (size_t i = 0; i < kTaskQueueCount; i++) { EXPECT_EQ(TaskQueue::NORMAL_PRIORITY, task_queues_[i]->GetQueuePriority()) @@ -136,27 +117,26 @@ } void TearDown() final { - for (scoped_refptr<TaskQueueImpl>& task_queue : task_queues_) { - task_queue->UnregisterTaskQueue(); + for (std::unique_ptr<TaskQueueImpl>& task_queue : task_queues_) { // Note since this test doesn't have a TaskQueueManager we need to // manually remove |task_queue| from the |selector_|. Normally // UnregisterTaskQueue would do that. selector_.RemoveQueue(task_queue.get()); + task_queue->UnregisterTaskQueue(nullptr); } } - scoped_refptr<TaskQueueImpl> NewTaskQueueWithBlockReporting() { - return make_scoped_refptr( - new TaskQueueImpl(nullptr, virtual_time_domain_.get(), - TaskQueue::Spec(TaskQueue::QueueType::TEST) - .SetShouldReportWhenExecutionBlocked(true))); + std::unique_ptr<TaskQueueImpl> NewTaskQueueWithBlockReporting() { + return base::MakeUnique<TaskQueueImpl>( + nullptr, virtual_time_domain_.get(), + TaskQueue::Spec("test").SetShouldReportWhenExecutionBlocked(true)); } const size_t kTaskQueueCount = 5; base::Closure test_closure_; TaskQueueSelectorForTest selector_; std::unique_ptr<VirtualTimeDomain> virtual_time_domain_; - std::vector<scoped_refptr<TaskQueueImpl>> task_queues_; + std::vector<std::unique_ptr<TaskQueueImpl>> task_queues_; std::map<TaskQueueImpl*, size_t> queue_to_index_map_; }; @@ -202,13 +182,13 @@ } TEST_F(TaskQueueSelectorTest, TestObserverWithEnabledQueue) { - std::unique_ptr<TaskQueue::QueueEnabledVoter> voter1 = - task_queues_[1]->CreateQueueEnabledVoter(); - DisableQueue(voter1.get()); + task_queues_[1]->SetQueueEnabledForTest(false); + selector_.DisableQueue(task_queues_[1].get()); MockObserver mock_observer; selector_.SetTaskQueueSelectorObserver(&mock_observer); EXPECT_CALL(mock_observer, OnTaskQueueEnabled(_)).Times(1); - EnableQueue(voter1.get()); + task_queues_[1]->SetQueueEnabledForTest(true); + selector_.EnableQueue(task_queues_[1].get()); } TEST_F(TaskQueueSelectorTest, @@ -226,33 +206,31 @@ size_t queue_order[] = {0, 1, 2, 3, 4}; PushTasks(queue_order, 5); - std::unique_ptr<TaskQueue::QueueEnabledVoter> voter2 = - task_queues_[2]->CreateQueueEnabledVoter(); - std::unique_ptr<TaskQueue::QueueEnabledVoter> voter4 = - task_queues_[4]->CreateQueueEnabledVoter(); - DisableQueue(voter2.get()); - DisableQueue(voter4.get()); + task_queues_[2]->SetQueueEnabledForTest(false); + selector_.DisableQueue(task_queues_[2].get()); + task_queues_[4]->SetQueueEnabledForTest(false); + selector_.DisableQueue(task_queues_[4].get()); // Disabling a queue should not affect its priority. EXPECT_EQ(TaskQueue::NORMAL_PRIORITY, task_queues_[2]->GetQueuePriority()); EXPECT_EQ(TaskQueue::NORMAL_PRIORITY, task_queues_[4]->GetQueuePriority()); EXPECT_THAT(PopTasks(), ::testing::ElementsAre(0, 1, 3)); EXPECT_CALL(mock_observer, OnTaskQueueEnabled(_)).Times(2); - EnableQueue(voter2.get()); + task_queues_[2]->SetQueueEnabledForTest(true); + selector_.EnableQueue(task_queues_[2].get()); selector_.SetQueuePriority(task_queues_[2].get(), TaskQueue::BEST_EFFORT_PRIORITY); - EXPECT_THAT(PopTasks(), ::testing::ElementsAre(2)); - EnableQueue(voter4.get()); - EXPECT_THAT(PopTasks(), ::testing::ElementsAre(4)); + EXPECT_THAT(PopTasks(), testing::ElementsAre(2)); + task_queues_[4]->SetQueueEnabledForTest(true); + selector_.EnableQueue(task_queues_[4].get()); + EXPECT_THAT(PopTasks(), testing::ElementsAre(4)); } TEST_F(TaskQueueSelectorTest, TestDisableChangePriorityThenEnable) { EXPECT_TRUE(task_queues_[2]->delayed_work_queue()->Empty()); EXPECT_TRUE(task_queues_[2]->immediate_work_queue()->Empty()); - std::unique_ptr<TaskQueue::QueueEnabledVoter> voter2 = - task_queues_[2]->CreateQueueEnabledVoter(); - DisableQueue(voter2.get()); + task_queues_[2]->SetQueueEnabledForTest(false); selector_.SetQueuePriority(task_queues_[2].get(), TaskQueue::HIGH_PRIORITY); size_t queue_order[] = {0, 1, 2, 3, 4}; @@ -260,7 +238,7 @@ EXPECT_TRUE(task_queues_[2]->delayed_work_queue()->Empty()); EXPECT_FALSE(task_queues_[2]->immediate_work_queue()->Empty()); - EnableQueue(voter2.get()); + task_queues_[2]->SetQueueEnabledForTest(true); EXPECT_EQ(TaskQueue::HIGH_PRIORITY, task_queues_[2]->GetQueuePriority()); EXPECT_THAT(PopTasks(), ::testing::ElementsAre(2, 0, 1, 3, 4)); @@ -273,15 +251,15 @@ // Test only disabled queues. size_t queue_order[] = {0}; PushTasks(queue_order, 1); - std::unique_ptr<TaskQueue::QueueEnabledVoter> voter0 = - task_queues_[0]->CreateQueueEnabledVoter(); - DisableQueue(voter0.get()); + task_queues_[0]->SetQueueEnabledForTest(false); + selector_.DisableQueue(task_queues_[0].get()); EXPECT_FALSE(selector_.SelectWorkQueueToService(&chosen_work_queue)); // These tests are unusual since there's no TQM. To avoid a later DCHECK when // deleting the task queue, we re-enable the queue here so the selector // doesn't get out of sync. - EnableQueue(voter0.get()); + task_queues_[0]->SetQueueEnabledForTest(true); + selector_.EnableQueue(task_queues_[0].get()); } TEST_F(TaskQueueSelectorTest, TestAge) { @@ -456,12 +434,10 @@ EXPECT_CALL(mock_observer, OnTaskQueueEnabled(_)).Times(1); - scoped_refptr<TaskQueueImpl> task_queue(NewTaskQueueWithBlockReporting()); + std::unique_ptr<TaskQueueImpl> task_queue(NewTaskQueueWithBlockReporting()); selector.AddQueue(task_queue.get()); - std::unique_ptr<TaskQueue::QueueEnabledVoter> voter = - task_queue->CreateQueueEnabledVoter(); - voter->SetQueueEnabled(false); + task_queue->SetQueueEnabledForTest(false); selector.DisableQueue(task_queue.get()); TaskQueueImpl::Task task(FROM_HERE, test_closure_, base::TimeTicks(), 0, @@ -473,10 +449,10 @@ EXPECT_CALL(mock_observer, OnTriedToSelectBlockedWorkQueue(_)).Times(1); EXPECT_FALSE(selector.SelectWorkQueueToService(&chosen_work_queue)); - voter.reset(); + task_queue->SetQueueEnabledForTest(true); selector.EnableQueue(task_queue.get()); - task_queue->UnregisterTaskQueue(); selector.RemoveQueue(task_queue.get()); + task_queue->UnregisterTaskQueue(nullptr); } TEST_F(TaskQueueSelectorTest, TestObserverWithTwoBlockedQueues) { @@ -484,17 +460,13 @@ MockObserver mock_observer; selector.SetTaskQueueSelectorObserver(&mock_observer); - scoped_refptr<TaskQueueImpl> task_queue(NewTaskQueueWithBlockReporting()); - scoped_refptr<TaskQueueImpl> task_queue2(NewTaskQueueWithBlockReporting()); + std::unique_ptr<TaskQueueImpl> task_queue(NewTaskQueueWithBlockReporting()); + std::unique_ptr<TaskQueueImpl> task_queue2(NewTaskQueueWithBlockReporting()); selector.AddQueue(task_queue.get()); selector.AddQueue(task_queue2.get()); - std::unique_ptr<TaskQueue::QueueEnabledVoter> voter = - task_queue->CreateQueueEnabledVoter(); - std::unique_ptr<TaskQueue::QueueEnabledVoter> voter2 = - task_queue2->CreateQueueEnabledVoter(); - voter->SetQueueEnabled(false); - voter2->SetQueueEnabled(false); + task_queue->SetQueueEnabledForTest(false); + task_queue2->SetQueueEnabledForTest(false); selector.DisableQueue(task_queue.get()); selector.DisableQueue(task_queue2.get()); @@ -517,20 +489,20 @@ EXPECT_CALL(mock_observer, OnTaskQueueEnabled(_)).Times(2); - voter.reset(); + task_queue->SetQueueEnabledForTest(true); selector.EnableQueue(task_queue.get()); // Removing the second queue and selecting again should result in another // notification. - task_queue->UnregisterTaskQueue(); selector.RemoveQueue(task_queue.get()); + task_queue->UnregisterTaskQueue(nullptr); EXPECT_CALL(mock_observer, OnTriedToSelectBlockedWorkQueue(_)).Times(1); EXPECT_FALSE(selector.SelectWorkQueueToService(&chosen_work_queue)); - voter2.reset(); + task_queue2->SetQueueEnabledForTest(true); selector.EnableQueue(task_queue2.get()); - task_queue2->UnregisterTaskQueue(); selector.RemoveQueue(task_queue2.get()); + task_queue2->UnregisterTaskQueue(nullptr); } struct ChooseOldestWithPriorityTestParam {
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_time_observer.h b/third_party/WebKit/Source/platform/scheduler/base/task_time_observer.h index 50db881..85b0ad9 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/task_time_observer.h +++ b/third_party/WebKit/Source/platform/scheduler/base/task_time_observer.h
@@ -11,8 +11,6 @@ namespace blink { namespace scheduler { -class TaskQueue; - // TaskTimeObserver provides an API for observing completion of renderer tasks. class PLATFORM_EXPORT TaskTimeObserver { public: @@ -20,17 +18,13 @@ virtual ~TaskTimeObserver() {} // Callback to be called when task is about to start. - // |task_queue| - TaskQueue on which this task will run, // |start_time| - time in seconds when task started to run, - virtual void WillProcessTask(TaskQueue* task_queue, double start_time) = 0; + virtual void WillProcessTask(double start_time) = 0; // Callback to be called when task is completed. - // |task_queue| - TaskQueue on which this task was run, // |start_time| - time in seconds when task started to run, // |end_time| - time in seconds when task was completed. - virtual void DidProcessTask(TaskQueue* task_queue, - double start_time, - double end_time) = 0; + virtual void DidProcessTask(double start_time, double end_time) = 0; // Callback to be called when we enter a nested run loop. virtual void OnBeginNestedRunLoop() = 0;
diff --git a/third_party/WebKit/Source/platform/scheduler/base/test_task_time_observer.h b/third_party/WebKit/Source/platform/scheduler/base/test_task_time_observer.h index 53538b9..794a6617 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/test_task_time_observer.h +++ b/third_party/WebKit/Source/platform/scheduler/base/test_task_time_observer.h
@@ -13,10 +13,8 @@ class TestTaskTimeObserver : public TaskTimeObserver { public: - void WillProcessTask(TaskQueue* task_queue, double start_time) override {} - void DidProcessTask(TaskQueue* task_queue, - double start_time, - double end_time) override {} + void WillProcessTask(double start_time) override {} + void DidProcessTask(double start_time, double end_time) override {} void OnBeginNestedRunLoop() override {} };
diff --git a/third_party/WebKit/Source/platform/scheduler/base/time_domain.cc b/third_party/WebKit/Source/platform/scheduler/base/time_domain.cc index 66b7bae..1194263 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/time_domain.cc +++ b/third_party/WebKit/Source/platform/scheduler/base/time_domain.cc
@@ -113,7 +113,8 @@ return true; } -bool TimeDomain::NextScheduledTaskQueue(TaskQueue** out_task_queue) const { +bool TimeDomain::NextScheduledTaskQueue( + internal::TaskQueueImpl** out_task_queue) const { DCHECK(main_thread_checker_.CalledOnValidThread()); if (delayed_wake_up_queue_.empty()) return false;
diff --git a/third_party/WebKit/Source/platform/scheduler/base/time_domain.h b/third_party/WebKit/Source/platform/scheduler/base/time_domain.h index 19cec2d..cb2dd61a 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/time_domain.h +++ b/third_party/WebKit/Source/platform/scheduler/base/time_domain.h
@@ -69,7 +69,7 @@ // If there is a scheduled delayed task, |out_task_queue| is set to the queue // the next task was posted to and it returns true. Returns false otherwise. - bool NextScheduledTaskQueue(TaskQueue** out_task_queue) const; + bool NextScheduledTaskQueue(internal::TaskQueueImpl** out_task_queue) const; // Schedules a call to TaskQueueImpl::WakeUpForDelayedWork when this // TimeDomain reaches |delayed_run_time|. This supersedes any previously
diff --git a/third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc b/third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc index d77dee24..196185d 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc
@@ -68,14 +68,13 @@ public: void SetUp() final { time_domain_ = base::WrapUnique(CreateMockTimeDomain()); - task_queue_ = make_scoped_refptr(new internal::TaskQueueImpl( - nullptr, time_domain_.get(), - TaskQueue::Spec(TaskQueue::QueueType::TEST))); + task_queue_ = base::MakeUnique<internal::TaskQueueImpl>( + nullptr, time_domain_.get(), TaskQueue::Spec("test")); } void TearDown() final { if (task_queue_) - task_queue_->UnregisterTaskQueue(); + task_queue_->UnregisterTaskQueue(nullptr); } virtual MockTimeDomain* CreateMockTimeDomain() { @@ -83,7 +82,7 @@ } std::unique_ptr<MockTimeDomain> time_domain_; - scoped_refptr<internal::TaskQueueImpl> task_queue_; + std::unique_ptr<internal::TaskQueueImpl> task_queue_; }; TEST_F(TimeDomainTest, ScheduleDelayedWork) { @@ -97,7 +96,7 @@ EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); EXPECT_EQ(delayed_runtime, next_scheduled_runtime); - TaskQueue* next_task_queue; + internal::TaskQueueImpl* next_task_queue; EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); EXPECT_EQ(task_queue_.get(), next_task_queue); Mock::VerifyAndClearExpectations(time_domain_.get()); @@ -135,17 +134,17 @@ } TEST_F(TimeDomainTest, RequestWakeUpAt_OnlyCalledForEarlierTasks) { - scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( - new internal::TaskQueueImpl(nullptr, time_domain_.get(), - TaskQueue::Spec(TaskQueue::QueueType::TEST))); + std::unique_ptr<internal::TaskQueueImpl> task_queue2 = + base::MakeUnique<internal::TaskQueueImpl>(nullptr, time_domain_.get(), + TaskQueue::Spec("test")); - scoped_refptr<internal::TaskQueueImpl> task_queue3 = make_scoped_refptr( - new internal::TaskQueueImpl(nullptr, time_domain_.get(), - TaskQueue::Spec(TaskQueue::QueueType::TEST))); + std::unique_ptr<internal::TaskQueueImpl> task_queue3 = + base::MakeUnique<internal::TaskQueueImpl>(nullptr, time_domain_.get(), + TaskQueue::Spec("test")); - scoped_refptr<internal::TaskQueueImpl> task_queue4 = make_scoped_refptr( - new internal::TaskQueueImpl(nullptr, time_domain_.get(), - TaskQueue::Spec(TaskQueue::QueueType::TEST))); + std::unique_ptr<internal::TaskQueueImpl> task_queue4 = + base::MakeUnique<internal::TaskQueueImpl>(nullptr, time_domain_.get(), + TaskQueue::Spec("test")); base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10); base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(20); @@ -173,15 +172,15 @@ EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, _)); EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(_)).Times(2); - task_queue2->UnregisterTaskQueue(); - task_queue3->UnregisterTaskQueue(); - task_queue4->UnregisterTaskQueue(); + task_queue2->UnregisterTaskQueue(nullptr); + task_queue3->UnregisterTaskQueue(nullptr); + task_queue4->UnregisterTaskQueue(nullptr); } TEST_F(TimeDomainTest, UnregisterQueue) { - scoped_refptr<internal::TaskQueueImpl> task_queue2_ = make_scoped_refptr( - new internal::TaskQueueImpl(nullptr, time_domain_.get(), - TaskQueue::Spec(TaskQueue::QueueType::TEST))); + std::unique_ptr<internal::TaskQueueImpl> task_queue2_ = + base::MakeUnique<internal::TaskQueueImpl>(nullptr, time_domain_.get(), + TaskQueue::Spec("test")); base::TimeTicks now = time_domain_->Now(); base::TimeTicks wake_up1 = now + base::TimeDelta::FromMilliseconds(10); @@ -190,7 +189,7 @@ base::TimeTicks wake_up2 = now + base::TimeDelta::FromMilliseconds(100); time_domain_->ScheduleDelayedWork(task_queue2_.get(), {wake_up2, 0}, now); - TaskQueue* next_task_queue; + internal::TaskQueueImpl* next_task_queue; EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); EXPECT_EQ(task_queue_.get(), next_task_queue); @@ -200,7 +199,7 @@ EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, wake_up2)).Times(1); time_domain_->UnregisterQueue(task_queue_.get()); - task_queue_ = scoped_refptr<internal::TaskQueueImpl>(); + task_queue_ = std::unique_ptr<internal::TaskQueueImpl>(); EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); EXPECT_EQ(task_queue2_.get(), next_task_queue); @@ -243,9 +242,9 @@ EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, delayed_runtime)); EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(delayed_runtime)); - scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( - new internal::TaskQueueImpl(nullptr, time_domain_.get(), - TaskQueue::Spec(TaskQueue::QueueType::TEST))); + std::unique_ptr<internal::TaskQueueImpl> task_queue2 = + base::MakeUnique<internal::TaskQueueImpl>(nullptr, time_domain_.get(), + TaskQueue::Spec("test")); time_domain_->ScheduleDelayedWork(task_queue2.get(), {delayed_runtime, ++sequence_num}, now); @@ -257,11 +256,11 @@ // The second task queue should wake up first since it has a lower sequence // number. - TaskQueue* next_task_queue; + internal::TaskQueueImpl* next_task_queue; EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); EXPECT_EQ(task_queue2.get(), next_task_queue); - task_queue2->UnregisterTaskQueue(); + task_queue2->UnregisterTaskQueue(nullptr); } TEST_F(TimeDomainTest, CancelDelayedWork) { @@ -271,7 +270,7 @@ EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, run_time)); time_domain_->ScheduleDelayedWork(task_queue_.get(), {run_time, 0}, now); - TaskQueue* next_task_queue; + internal::TaskQueueImpl* next_task_queue; EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); EXPECT_EQ(task_queue_.get(), next_task_queue); @@ -281,9 +280,9 @@ } TEST_F(TimeDomainTest, CancelDelayedWork_TwoQueues) { - scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( - new internal::TaskQueueImpl(nullptr, time_domain_.get(), - TaskQueue::Spec(TaskQueue::QueueType::TEST))); + std::unique_ptr<internal::TaskQueueImpl> task_queue2 = + base::MakeUnique<internal::TaskQueueImpl>(nullptr, time_domain_.get(), + TaskQueue::Spec("test")); base::TimeTicks now = time_domain_->Now(); base::TimeTicks run_time1 = now + base::TimeDelta::FromMilliseconds(20); @@ -296,7 +295,7 @@ time_domain_->ScheduleDelayedWork(task_queue2.get(), {run_time2, 0}, now); Mock::VerifyAndClearExpectations(time_domain_.get()); - TaskQueue* next_task_queue; + internal::TaskQueueImpl* next_task_queue; EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); EXPECT_EQ(task_queue_.get(), next_task_queue); @@ -318,7 +317,7 @@ EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(_)).Times(AnyNumber()); // Tidy up. - task_queue2->UnregisterTaskQueue(); + task_queue2->UnregisterTaskQueue(nullptr); } } // namespace scheduler
diff --git a/third_party/WebKit/Source/platform/scheduler/base/work_queue_unittest.cc b/third_party/WebKit/Source/platform/scheduler/base/work_queue_unittest.cc index 4941dbe..1835001 100644 --- a/third_party/WebKit/Source/platform/scheduler/base/work_queue_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/base/work_queue_unittest.cc
@@ -24,9 +24,8 @@ public: void SetUp() override { time_domain_.reset(new RealTimeDomain()); - task_queue_ = make_scoped_refptr( - new TaskQueueImpl(nullptr, time_domain_.get(), - TaskQueue::Spec(TaskQueue::QueueType::TEST))); + task_queue_ = base::MakeUnique<TaskQueueImpl>(nullptr, time_domain_.get(), + TaskQueue::Spec("test")); work_queue_.reset(new WorkQueue(task_queue_.get(), "test", WorkQueue::QueueType::IMMEDIATE)); @@ -45,7 +44,7 @@ } std::unique_ptr<RealTimeDomain> time_domain_; - scoped_refptr<TaskQueueImpl> task_queue_; + std::unique_ptr<TaskQueueImpl> task_queue_; std::unique_ptr<WorkQueue> work_queue_; std::unique_ptr<WorkQueueSets> work_queue_sets_; std::unique_ptr<TaskQueueImpl::TaskDeque> incoming_queue_;
diff --git a/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.cc b/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.cc index 10522bcb..5d293ea 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.cc +++ b/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.cc
@@ -20,15 +20,15 @@ CompositorWorkerScheduler::CompositorWorkerScheduler( base::Thread* thread, scoped_refptr<SchedulerTqmDelegate> main_task_runner) - : WorkerScheduler(WTF::MakeUnique<SchedulerHelper>(main_task_runner)), + : WorkerScheduler(WTF::MakeUnique<WorkerSchedulerHelper>(main_task_runner)), thread_(thread) {} CompositorWorkerScheduler::~CompositorWorkerScheduler() {} void CompositorWorkerScheduler::Init() {} -scoped_refptr<TaskQueue> CompositorWorkerScheduler::DefaultTaskQueue() { - return helper_->DefaultTaskQueue(); +scoped_refptr<WorkerTaskQueue> CompositorWorkerScheduler::DefaultTaskQueue() { + return helper_->DefaultWorkerTaskQueue(); } scoped_refptr<base::SingleThreadTaskRunner>
diff --git a/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.h b/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.h index e42cdec1..ba2393a 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.h +++ b/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.h
@@ -32,7 +32,7 @@ // WorkerScheduler: void Init() override; - scoped_refptr<TaskQueue> DefaultTaskQueue() override; + scoped_refptr<WorkerTaskQueue> DefaultTaskQueue() override; // ChildScheduler: scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner() override;
diff --git a/third_party/WebKit/Source/platform/scheduler/child/idle_canceled_delayed_task_sweeper_unittest.cc b/third_party/WebKit/Source/platform/scheduler/child/idle_canceled_delayed_task_sweeper_unittest.cc index d106333..c2a20ad 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/idle_canceled_delayed_task_sweeper_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/child/idle_canceled_delayed_task_sweeper_unittest.cc
@@ -13,6 +13,7 @@ #include "platform/scheduler/child/idle_helper.h" #include "platform/scheduler/child/scheduler_helper.h" #include "platform/scheduler/child/scheduler_tqm_delegate_for_test.h" +#include "platform/scheduler/renderer/main_thread_scheduler_helper.h" #include "testing/gtest/include/gtest/gtest.h" namespace blink { @@ -36,15 +37,18 @@ delegate_(SchedulerTqmDelegateForTest::Create( mock_task_runner_, base::WrapUnique(new TestTimeSource(clock_.get())))), - scheduler_helper_(new SchedulerHelper(delegate_)), + scheduler_helper_(new MainThreadSchedulerHelper(delegate_, nullptr)), idle_helper_(new IdleHelper(scheduler_helper_.get(), this, "test", - base::TimeDelta::FromSeconds(30))), + base::TimeDelta::FromSeconds(30), + scheduler_helper_->NewTaskQueue( + MainThreadTaskQueue::QueueType::TEST, + TaskQueue::Spec("test_idle_tq")))), idle_canceled_delayed_taks_sweeper_( new IdleCanceledDelayedTaskSweeper(scheduler_helper_.get(), idle_helper_->IdleTaskRunner())), - default_task_queue_(scheduler_helper_->DefaultTaskQueue()) { + default_task_queue_(scheduler_helper_->DefaultMainThreadTaskQueue()) { clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); } @@ -73,7 +77,7 @@ scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; scoped_refptr<SchedulerTqmDelegateForTest> delegate_; - std::unique_ptr<SchedulerHelper> scheduler_helper_; + std::unique_ptr<MainThreadSchedulerHelper> scheduler_helper_; std::unique_ptr<IdleHelper> idle_helper_; std::unique_ptr<IdleCanceledDelayedTaskSweeper> idle_canceled_delayed_taks_sweeper_;
diff --git a/third_party/WebKit/Source/platform/scheduler/child/idle_helper.cc b/third_party/WebKit/Source/platform/scheduler/child/idle_helper.cc index f16a09a..1132e8a 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/idle_helper.cc +++ b/third_party/WebKit/Source/platform/scheduler/child/idle_helper.cc
@@ -20,14 +20,12 @@ SchedulerHelper* helper, Delegate* delegate, const char* idle_period_tracing_name, - base::TimeDelta required_quiescence_duration_before_long_idle_period) + base::TimeDelta required_quiescence_duration_before_long_idle_period, + scoped_refptr<TaskQueue> idle_queue) : helper_(helper), delegate_(delegate), - idle_queue_( - helper_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::IDLE))), - state_(helper, - delegate, - idle_period_tracing_name), + idle_queue_(std::move(idle_queue)), + state_(helper, delegate, idle_period_tracing_name), required_quiescence_duration_before_long_idle_period_( required_quiescence_duration_before_long_idle_period), is_shutdown_(false),
diff --git a/third_party/WebKit/Source/platform/scheduler/child/idle_helper.h b/third_party/WebKit/Source/platform/scheduler/child/idle_helper.h index a1335c5c..aec0d27 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/idle_helper.h +++ b/third_party/WebKit/Source/platform/scheduler/child/idle_helper.h
@@ -91,7 +91,8 @@ SchedulerHelper* helper, Delegate* delegate, const char* idle_period_tracing_name, - base::TimeDelta required_quiescence_duration_before_long_idle_period); + base::TimeDelta required_quiescence_duration_before_long_idle_period, + scoped_refptr<TaskQueue> idle_queue); ~IdleHelper() override; // Prevents any further idle tasks from running.
diff --git a/third_party/WebKit/Source/platform/scheduler/child/idle_helper_unittest.cc b/third_party/WebKit/Source/platform/scheduler/child/idle_helper_unittest.cc index 8901a29..d5e9161 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/idle_helper_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/child/idle_helper_unittest.cc
@@ -21,6 +21,7 @@ #include "platform/scheduler/child/scheduler_helper.h" #include "platform/scheduler/child/scheduler_tqm_delegate_for_test.h" #include "platform/scheduler/child/scheduler_tqm_delegate_impl.h" +#include "platform/scheduler/child/worker_scheduler_helper.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -158,11 +159,13 @@ public: explicit IdleHelperForTest( SchedulerHelper* scheduler_helper, - base::TimeDelta required_quiescence_duration_before_long_idle_period) + base::TimeDelta required_quiescence_duration_before_long_idle_period, + scoped_refptr<TaskQueue> idle_task_runner) : IdleHelper(scheduler_helper, this, "TestSchedulerIdlePeriod", - required_quiescence_duration_before_long_idle_period) {} + required_quiescence_duration_before_long_idle_period, + idle_task_runner) {} ~IdleHelperForTest() override {} @@ -192,11 +195,12 @@ message_loop, mock_task_runner_, base::WrapUnique(new TestTimeSource(clock_.get())))), - scheduler_helper_(new SchedulerHelper(main_task_runner_)), + scheduler_helper_(new WorkerSchedulerHelper(main_task_runner_)), idle_helper_(new IdleHelperForTest( scheduler_helper_.get(), - required_quiescence_duration_before_long_idle_period)), - default_task_runner_(scheduler_helper_->DefaultTaskQueue()), + required_quiescence_duration_before_long_idle_period, + scheduler_helper_->NewTaskQueue(TaskQueue::Spec("idle_test")))), + default_task_runner_(scheduler_helper_->DefaultWorkerTaskQueue()), idle_task_runner_(idle_helper_->IdleTaskRunner()) { clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); } @@ -292,7 +296,7 @@ std::unique_ptr<base::MessageLoop> message_loop_; scoped_refptr<SchedulerTqmDelegate> main_task_runner_; - std::unique_ptr<SchedulerHelper> scheduler_helper_; + std::unique_ptr<WorkerSchedulerHelper> scheduler_helper_; std::unique_ptr<IdleHelperForTest> idle_helper_; scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
diff --git a/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.cc b/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.cc index b0a71c95..2fa8cd8d 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.cc +++ b/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.cc
@@ -15,26 +15,19 @@ SchedulerHelper::SchedulerHelper( scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate) - : SchedulerHelper(task_queue_manager_delegate, - TaskQueue::Spec(TaskQueue::QueueType::DEFAULT) - .SetShouldMonitorQuiescence(true)) {} - -SchedulerHelper::SchedulerHelper( - scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate, - TaskQueue::Spec default_task_queue_spec) : task_queue_manager_delegate_(task_queue_manager_delegate), task_queue_manager_(new TaskQueueManager(task_queue_manager_delegate)), - control_task_queue_( - NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::CONTROL) - .SetShouldNotifyObservers(false))), - default_task_queue_(NewTaskQueue(default_task_queue_spec)), observer_(nullptr) { - control_task_queue_->SetQueuePriority(TaskQueue::CONTROL_PRIORITY); - task_queue_manager_->SetWorkBatchSize(4); +} + +void SchedulerHelper::InitDefaultQueues( + scoped_refptr<TaskQueue> default_task_queue, + scoped_refptr<TaskQueue> control_task_queue) { + control_task_queue->SetQueuePriority(TaskQueue::CONTROL_PRIORITY); DCHECK(task_queue_manager_delegate_); - task_queue_manager_delegate_->SetDefaultTaskRunner(default_task_queue_.get()); + task_queue_manager_delegate_->SetDefaultTaskRunner(default_task_queue); } SchedulerHelper::~SchedulerHelper() { @@ -58,21 +51,6 @@ record_task_delay_histograms); } -scoped_refptr<TaskQueue> SchedulerHelper::NewTaskQueue( - const TaskQueue::Spec& spec) { - DCHECK(task_queue_manager_.get()); - return task_queue_manager_->NewTaskQueue(spec); -} - -scoped_refptr<TaskQueue> SchedulerHelper::DefaultTaskQueue() { - CheckOnValidThread(); - return default_task_queue_; -} - -scoped_refptr<TaskQueue> SchedulerHelper::ControlTaskQueue() { - return control_task_queue_; -} - size_t SchedulerHelper::GetNumberOfPendingTasks() const { return task_queue_manager_->GetNumberOfPendingTasks(); } @@ -156,23 +134,9 @@ task_queue_manager_->UnregisterTimeDomain(time_domain); } -void SchedulerHelper::OnUnregisterTaskQueue( - const scoped_refptr<TaskQueue>& queue) { +void SchedulerHelper::OnTriedToExecuteBlockedTask() { if (observer_) - observer_->OnUnregisterTaskQueue(queue); -} - -void SchedulerHelper::OnTriedToExecuteBlockedTask( - const TaskQueue& queue, - const base::PendingTask& task) { - if (observer_) - observer_->OnTriedToExecuteBlockedTask(queue, task); -} - -TaskQueue* SchedulerHelper::CurrentlyExecutingTaskQueue() const { - if (!task_queue_manager_) - return nullptr; - return task_queue_manager_->currently_executing_task_queue(); + observer_->OnTriedToExecuteBlockedTask(); } } // namespace scheduler
diff --git a/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.h b/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.h index f4329de..ce645c81 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.h +++ b/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.h
@@ -23,9 +23,6 @@ public: explicit SchedulerHelper( scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate); - explicit SchedulerHelper( - scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate, - TaskQueue::Spec default_task_queue_spec); ~SchedulerHelper() override; // There is a small overhead to recording task delay histograms, we may not @@ -33,17 +30,15 @@ void SetRecordTaskDelayHistograms(bool record_task_delay_histograms); // TaskQueueManager::Observer implementation: - void OnUnregisterTaskQueue(const scoped_refptr<TaskQueue>& queue) override; - void OnTriedToExecuteBlockedTask(const TaskQueue& queue, - const base::PendingTask& task) override; + void OnTriedToExecuteBlockedTask() override; // Returns the default task queue. - scoped_refptr<TaskQueue> DefaultTaskQueue(); + virtual scoped_refptr<TaskQueue> DefaultTaskQueue() = 0; // Returns the control task queue. Tasks posted to this queue are executed // with the highest priority. Care must be taken to avoid starvation of other // task queues. - scoped_refptr<TaskQueue> ControlTaskQueue(); + virtual scoped_refptr<TaskQueue> ControlTaskQueue() = 0; // Adds or removes a task observer from the scheduler. The observer will be // notified before and after every executed task. These functions can only be @@ -66,21 +61,13 @@ DCHECK(thread_checker_.CalledOnValidThread()); } - // Creates a new TaskQueue with the given |spec|. - scoped_refptr<TaskQueue> NewTaskQueue(const TaskQueue::Spec& spec); - class PLATFORM_EXPORT Observer { public: virtual ~Observer() {} - // Called when |queue| is unregistered. - virtual void OnUnregisterTaskQueue( - const scoped_refptr<TaskQueue>& queue) = 0; - // Called when the scheduler tried to execute a task from a disabled // queue. See TaskQueue::Spec::SetShouldReportWhenExecutionBlocked. - virtual void OnTriedToExecuteBlockedTask(const TaskQueue& queue, - const base::PendingTask& task) = 0; + virtual void OnTriedToExecuteBlockedTask() = 0; }; // Called once to set the Observer. This function is called on the main @@ -97,7 +84,6 @@ void UnregisterTimeDomain(TimeDomain* time_domain); const scoped_refptr<SchedulerTqmDelegate>& scheduler_tqm_delegate() const; bool GetAndClearSystemIsQuiescentBit(); - TaskQueue* CurrentlyExecutingTaskQueue() const; size_t GetNumberOfPendingTasks() const; @@ -105,14 +91,16 @@ void SetWorkBatchSizeForTesting(size_t work_batch_size); TaskQueueManager* GetTaskQueueManagerForTesting(); - private: - friend class SchedulerHelperTest; + protected: + void InitDefaultQueues(scoped_refptr<TaskQueue> default_task_queue, + scoped_refptr<TaskQueue> control_task_queue); base::ThreadChecker thread_checker_; scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate_; std::unique_ptr<TaskQueueManager> task_queue_manager_; - scoped_refptr<TaskQueue> control_task_queue_; - scoped_refptr<TaskQueue> default_task_queue_; + + private: + friend class SchedulerHelperTest; Observer* observer_; // NOT OWNED
diff --git a/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper_unittest.cc b/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper_unittest.cc index f3dae923..2b5537e 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper_unittest.cc
@@ -15,6 +15,7 @@ #include "platform/scheduler/base/task_queue.h" #include "platform/scheduler/base/test_time_source.h" #include "platform/scheduler/child/scheduler_tqm_delegate_for_test.h" +#include "platform/scheduler/child/worker_scheduler_helper.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -55,8 +56,8 @@ main_task_runner_(SchedulerTqmDelegateForTest::Create( mock_task_runner_, base::WrapUnique(new TestTimeSource(clock_.get())))), - scheduler_helper_(new SchedulerHelper(main_task_runner_)), - default_task_runner_(scheduler_helper_->DefaultTaskQueue()) { + scheduler_helper_(new WorkerSchedulerHelper(main_task_runner_)), + default_task_runner_(scheduler_helper_->DefaultWorkerTaskQueue()) { clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); } @@ -86,7 +87,7 @@ scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; scoped_refptr<SchedulerTqmDelegateForTest> main_task_runner_; - std::unique_ptr<SchedulerHelper> scheduler_helper_; + std::unique_ptr<WorkerSchedulerHelper> scheduler_helper_; scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; DISALLOW_COPY_AND_ASSIGN(SchedulerHelperTest); @@ -130,18 +131,18 @@ TEST_F(SchedulerHelperTest, DefaultTaskRunnerRegistration) { EXPECT_EQ(main_task_runner_->default_task_runner(), - scheduler_helper_->DefaultTaskQueue()); + scheduler_helper_->DefaultWorkerTaskQueue()); scheduler_helper_->Shutdown(); EXPECT_EQ(nullptr, main_task_runner_->default_task_runner()); } TEST_F(SchedulerHelperTest, GetNumberOfPendingTasks) { std::vector<std::string> run_order; - scheduler_helper_->DefaultTaskQueue()->PostTask( + scheduler_helper_->DefaultWorkerTaskQueue()->PostTask( FROM_HERE, base::Bind(&AppendToVectorTestTask, &run_order, "D1")); - scheduler_helper_->DefaultTaskQueue()->PostTask( + scheduler_helper_->DefaultWorkerTaskQueue()->PostTask( FROM_HERE, base::Bind(&AppendToVectorTestTask, &run_order, "D2")); - scheduler_helper_->ControlTaskQueue()->PostTask( + scheduler_helper_->ControlWorkerTaskQueue()->PostTask( FROM_HERE, base::Bind(&AppendToVectorTestTask, &run_order, "C1")); EXPECT_EQ(3U, scheduler_helper_->GetNumberOfPendingTasks()); RunUntilIdle(); @@ -162,8 +163,8 @@ MockTaskObserver observer; scheduler_helper_->AddTaskObserver(&observer); - scheduler_helper_->DefaultTaskQueue()->PostTask(FROM_HERE, - base::Bind(&NopTask)); + scheduler_helper_->DefaultWorkerTaskQueue()->PostTask(FROM_HERE, + base::Bind(&NopTask)); EXPECT_CALL(observer, WillProcessTask(_)).Times(1); EXPECT_CALL(observer, DidProcessTask(_)).Times(1); @@ -174,8 +175,8 @@ MockTaskObserver observer; scheduler_helper_->AddTaskObserver(&observer); - scheduler_helper_->ControlTaskQueue()->PostTask(FROM_HERE, - base::Bind(&NopTask)); + scheduler_helper_->ControlWorkerTaskQueue()->PostTask(FROM_HERE, + base::Bind(&NopTask)); EXPECT_CALL(observer, WillProcessTask(_)).Times(0); EXPECT_CALL(observer, DidProcessTask(_)).Times(0); @@ -186,34 +187,17 @@ class MockObserver : public SchedulerHelper::Observer { public: - MOCK_METHOD1(OnUnregisterTaskQueue, - void(const scoped_refptr<TaskQueue>& queue)); - MOCK_METHOD2(OnTriedToExecuteBlockedTask, - void(const TaskQueue& queue, const base::PendingTask& task)); + MOCK_METHOD0(OnTriedToExecuteBlockedTask, void()); }; } // namespace -TEST_F(SchedulerHelperTest, OnUnregisterTaskQueue) { - MockObserver observer; - scheduler_helper_->SetObserver(&observer); - - scoped_refptr<TaskQueue> task_queue = scheduler_helper_->NewTaskQueue( - TaskQueue::Spec(TaskQueue::QueueType::TEST)); - - EXPECT_CALL(observer, OnUnregisterTaskQueue(_)).Times(1); - task_queue->UnregisterTaskQueue(); - - scheduler_helper_->SetObserver(nullptr); -} - TEST_F(SchedulerHelperTest, OnTriedToExecuteBlockedTask) { MockObserver observer; scheduler_helper_->SetObserver(&observer); scoped_refptr<TaskQueue> task_queue = scheduler_helper_->NewTaskQueue( - TaskQueue::Spec(TaskQueue::QueueType::TEST) - .SetShouldReportWhenExecutionBlocked(true)); + TaskQueue::Spec("test").SetShouldReportWhenExecutionBlocked(true)); std::unique_ptr<TaskQueue::QueueEnabledVoter> voter = task_queue->CreateQueueEnabledVoter(); voter->SetQueueEnabled(false); @@ -224,7 +208,7 @@ voter->SetQueueEnabled(true); voter->SetQueueEnabled(false); - EXPECT_CALL(observer, OnTriedToExecuteBlockedTask(_, _)).Times(1); + EXPECT_CALL(observer, OnTriedToExecuteBlockedTask()).Times(1); RunUntilIdle(); scheduler_helper_->SetObserver(nullptr);
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler.cc index 7178a0b..af790692 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler.cc +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler.cc
@@ -11,9 +11,7 @@ WorkerGlobalScopeScheduler::WorkerGlobalScopeScheduler( WorkerScheduler* worker_scheduler) { - scoped_refptr<TaskQueue> task_queue = - worker_scheduler->CreateUnthrottledTaskRunner( - TaskQueue::QueueType::UNTHROTTLED); + scoped_refptr<TaskQueue> task_queue = worker_scheduler->CreateTaskRunner(); unthrottled_task_runner_ = WebTaskRunnerImpl::Create(std::move(task_queue)); }
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.cc index d3ca3a9..d0fa1a6 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.cc +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.cc
@@ -14,7 +14,7 @@ namespace blink { namespace scheduler { -WorkerScheduler::WorkerScheduler(std::unique_ptr<SchedulerHelper> helper) +WorkerScheduler::WorkerScheduler(std::unique_ptr<WorkerSchedulerHelper> helper) : helper_(std::move(helper)) {} WorkerScheduler::~WorkerScheduler() {} @@ -25,14 +25,11 @@ return base::WrapUnique(new WorkerSchedulerImpl(std::move(main_task_runner))); } -scoped_refptr<TaskQueue> WorkerScheduler::CreateUnthrottledTaskRunner( - TaskQueue::QueueType queue_type) { +scoped_refptr<WorkerTaskQueue> WorkerScheduler::CreateTaskRunner() { helper_->CheckOnValidThread(); - scoped_refptr<TaskQueue> unthrottled_task_queue( - helper_->NewTaskQueue(TaskQueue::Spec(queue_type) - .SetShouldMonitorQuiescence(true) - .SetTimeDomain(nullptr))); - return unthrottled_task_queue; + return helper_->NewTaskQueue(TaskQueue::Spec("worker_tq") + .SetShouldMonitorQuiescence(true) + .SetTimeDomain(nullptr)); } } // namespace scheduler
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.h b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.h index 1e55375..0b434e2 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.h +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.h
@@ -11,7 +11,8 @@ #include "base/message_loop/message_loop.h" #include "platform/PlatformExport.h" #include "platform/scheduler/base/task_queue.h" -#include "platform/scheduler/child/scheduler_helper.h" +#include "platform/scheduler/child/worker_scheduler_helper.h" +#include "platform/scheduler/child/worker_task_queue.h" #include "public/platform/scheduler/child/child_scheduler.h" #include "public/platform/scheduler/child/single_thread_idle_task_runner.h" @@ -27,19 +28,18 @@ // Blink should use WorkerScheduler::DefaultTaskQueue instead of // ChildScheduler::DefaultTaskRunner. - virtual scoped_refptr<TaskQueue> DefaultTaskQueue() = 0; + virtual scoped_refptr<WorkerTaskQueue> DefaultTaskQueue() = 0; // Must be called before the scheduler can be used. Does any post construction // initialization needed such as initializing idle period detection. virtual void Init() = 0; - scoped_refptr<TaskQueue> CreateUnthrottledTaskRunner( - TaskQueue::QueueType queue_type); + scoped_refptr<WorkerTaskQueue> CreateTaskRunner(); protected: - explicit WorkerScheduler(std::unique_ptr<SchedulerHelper> helper); + explicit WorkerScheduler(std::unique_ptr<WorkerSchedulerHelper> helper); - std::unique_ptr<SchedulerHelper> helper_; + std::unique_ptr<WorkerSchedulerHelper> helper_; DISALLOW_COPY_AND_ASSIGN(WorkerScheduler); };
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_helper.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_helper.cc new file mode 100644 index 0000000..1b43c03 --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_helper.cc
@@ -0,0 +1,47 @@ +// Copyright 2017 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 "platform/scheduler/child/worker_scheduler_helper.h" + +#include "platform/scheduler/child/scheduler_tqm_delegate.h" +#include "platform/scheduler/child/worker_task_queue.h" + +namespace blink { +namespace scheduler { + +WorkerSchedulerHelper::WorkerSchedulerHelper( + scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate) + : SchedulerHelper(task_queue_manager_delegate), + default_task_queue_(NewTaskQueue(TaskQueue::Spec("worker_default_tq") + .SetShouldMonitorQuiescence(true))), + control_task_queue_(NewTaskQueue(TaskQueue::Spec("worker_control_tq") + .SetShouldNotifyObservers(false))) { + InitDefaultQueues(default_task_queue_, control_task_queue_); +} + +WorkerSchedulerHelper::~WorkerSchedulerHelper() {} + +scoped_refptr<WorkerTaskQueue> WorkerSchedulerHelper::DefaultWorkerTaskQueue() { + return default_task_queue_; +} + +scoped_refptr<TaskQueue> WorkerSchedulerHelper::DefaultTaskQueue() { + return default_task_queue_; +} + +scoped_refptr<WorkerTaskQueue> WorkerSchedulerHelper::ControlWorkerTaskQueue() { + return control_task_queue_; +} + +scoped_refptr<TaskQueue> WorkerSchedulerHelper::ControlTaskQueue() { + return control_task_queue_; +} + +scoped_refptr<WorkerTaskQueue> WorkerSchedulerHelper::NewTaskQueue( + const TaskQueue::Spec& spec) { + return task_queue_manager_->CreateTaskQueue<WorkerTaskQueue>(spec); +} + +} // namespace scheduler +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_helper.h b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_helper.h new file mode 100644 index 0000000..7598407b --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_helper.h
@@ -0,0 +1,40 @@ +// Copyright 2017 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_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_SCHEDULER_HELPER_H_ +#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_SCHEDULER_HELPER_H_ + +#include "platform/scheduler/child/scheduler_helper.h" + +#include "platform/scheduler/child/worker_task_queue.h" + +namespace blink { +namespace scheduler { + +class PLATFORM_EXPORT WorkerSchedulerHelper : public SchedulerHelper { + public: + explicit WorkerSchedulerHelper( + scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate); + ~WorkerSchedulerHelper() override; + + scoped_refptr<WorkerTaskQueue> NewTaskQueue(const TaskQueue::Spec& spec); + + scoped_refptr<WorkerTaskQueue> DefaultWorkerTaskQueue(); + scoped_refptr<WorkerTaskQueue> ControlWorkerTaskQueue(); + + protected: + scoped_refptr<TaskQueue> DefaultTaskQueue() override; + scoped_refptr<TaskQueue> ControlTaskQueue() override; + + protected: + const scoped_refptr<WorkerTaskQueue> default_task_queue_; + const scoped_refptr<WorkerTaskQueue> control_task_queue_; + + DISALLOW_COPY_AND_ASSIGN(WorkerSchedulerHelper); +}; + +} // namespace scheduler +} // namespace blink + +#endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_SCHEDULER_HELPER_H_
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc index 196009b4..3d66f3c 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc
@@ -12,6 +12,7 @@ #include "platform/scheduler/base/task_queue.h" #include "platform/scheduler/base/time_converter.h" #include "platform/scheduler/child/scheduler_tqm_delegate.h" +#include "platform/scheduler/child/worker_scheduler_helper.h" #include "platform/wtf/PtrUtil.h" namespace blink { @@ -38,11 +39,12 @@ WorkerSchedulerImpl::WorkerSchedulerImpl( scoped_refptr<SchedulerTqmDelegate> main_task_runner) - : WorkerScheduler(WTF::MakeUnique<SchedulerHelper>(main_task_runner)), + : WorkerScheduler(WTF::MakeUnique<WorkerSchedulerHelper>(main_task_runner)), idle_helper_(helper_.get(), this, "WorkerSchedulerIdlePeriod", - base::TimeDelta::FromMilliseconds(300)), + base::TimeDelta::FromMilliseconds(300), + helper_->NewTaskQueue(TaskQueue::Spec("worker_idle_tq"))), idle_canceled_delayed_task_sweeper_(helper_.get(), idle_helper_.IdleTaskRunner()), load_tracker_(helper_->scheduler_tqm_delegate()->NowTicks(), @@ -71,12 +73,12 @@ scoped_refptr<base::SingleThreadTaskRunner> WorkerSchedulerImpl::DefaultTaskRunner() { DCHECK(initialized_); - return helper_->DefaultTaskQueue(); + return helper_->DefaultWorkerTaskQueue(); } -scoped_refptr<TaskQueue> WorkerSchedulerImpl::DefaultTaskQueue() { +scoped_refptr<WorkerTaskQueue> WorkerSchedulerImpl::DefaultTaskQueue() { DCHECK(initialized_); - return helper_->DefaultTaskQueue(); + return helper_->DefaultWorkerTaskQueue(); } scoped_refptr<SingleThreadIdleTaskRunner> @@ -135,12 +137,9 @@ return idle_helper_.CurrentIdleTaskDeadline(); } -void WorkerSchedulerImpl::WillProcessTask(TaskQueue* task_queue, - double start_time) {} +void WorkerSchedulerImpl::WillProcessTask(double start_time) {} -void WorkerSchedulerImpl::DidProcessTask(TaskQueue* task_queue, - double start_time, - double end_time) { +void WorkerSchedulerImpl::DidProcessTask(double start_time, double end_time) { DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, task_time_counter, ("WorkerThread.Task.Time", 0, 10000000, 50)); task_time_counter.Count((end_time - start_time) *
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.h index a14e776..0fdc4f2 100644 --- a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.h +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.h
@@ -29,7 +29,7 @@ // WorkerScheduler implementation: scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner() override; - scoped_refptr<TaskQueue> DefaultTaskQueue() override; + scoped_refptr<WorkerTaskQueue> DefaultTaskQueue() override; scoped_refptr<SingleThreadIdleTaskRunner> IdleTaskRunner() override; bool CanExceedIdleDeadlineIfRequired() const override; bool ShouldYieldForHighPriorityWork() override; @@ -40,10 +40,8 @@ void Shutdown() override; // TaskTimeObserver implementation: - void WillProcessTask(TaskQueue* task_queue, double start_time) override; - void DidProcessTask(TaskQueue* task_queue, - double start_time, - double end_time) override; + void WillProcessTask(double start_time) override; + void DidProcessTask(double start_time, double end_time) override; void OnBeginNestedRunLoop() override; SchedulerHelper* GetSchedulerHelperForTesting();
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_task_queue.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_task_queue.cc new file mode 100644 index 0000000..423dd6e --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_task_queue.cc
@@ -0,0 +1,18 @@ +// Copyright 2015 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 "platform/scheduler/child/worker_task_queue.h" + +#include "platform/scheduler/base/task_queue_impl.h" + +namespace blink { +namespace scheduler { + +WorkerTaskQueue::WorkerTaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl) + : TaskQueue(std::move(impl)) {} + +WorkerTaskQueue::~WorkerTaskQueue() {} + +} // namespace scheduler +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_task_queue.h b/third_party/WebKit/Source/platform/scheduler/child/worker_task_queue.h new file mode 100644 index 0000000..c6945512 --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_task_queue.h
@@ -0,0 +1,22 @@ +// Copyright 2017 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_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_TASK_QUEUE_H_ +#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_TASK_QUEUE_H_ + +#include "platform/scheduler/base/task_queue.h" + +namespace blink { +namespace scheduler { + +class PLATFORM_EXPORT WorkerTaskQueue : public TaskQueue { + public: + explicit WorkerTaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl); + ~WorkerTaskQueue() override; +}; + +} // namespace scheduler +} // namespace blink + +#endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_TASK_QUEUE_H_
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/auto_advancing_virtual_time_domain_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/auto_advancing_virtual_time_domain_unittest.cc index b6b847e7..bd25f1df 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/auto_advancing_virtual_time_domain_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/auto_advancing_virtual_time_domain_unittest.cc
@@ -11,6 +11,7 @@ #include "platform/scheduler/base/test_task_time_observer.h" #include "platform/scheduler/base/test_time_source.h" #include "platform/scheduler/child/scheduler_tqm_delegate_for_test.h" +#include "platform/scheduler/test/test_task_queue.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -35,7 +36,7 @@ manager_ = base::MakeUnique<TaskQueueManager>(main_task_runner_); manager_->AddTaskTimeObserver(&test_task_time_observer_); task_queue_ = - manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)); + manager_->CreateTaskQueue<TestTaskQueue>(TaskQueue::Spec("test")); initial_time_ = clock_->NowTicks(); auto_advancing_time_domain_.reset( new AutoAdvancingVirtualTimeDomain(initial_time_));
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc index 5e2c42b..2f1e7252 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc
@@ -134,7 +134,7 @@ task_queue_throttler_->CreateWakeUpBudgetPool("test"); scoped_refptr<TaskQueue> queue = - scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST); + scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST); pool->SetWakeUpRate(0.1); pool->SetWakeUpDuration(base::TimeDelta::FromMilliseconds(10));
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/idle_time_estimator_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/idle_time_estimator_unittest.cc index e770040..7c087a4f 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/idle_time_estimator_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/idle_time_estimator_unittest.cc
@@ -5,12 +5,15 @@ #include "platform/scheduler/renderer/idle_time_estimator.h" #include "base/memory/ptr_util.h" +#include "base/memory/ref_counted.h" #include "base/test/simple_test_tick_clock.h" #include "cc/test/ordered_simple_task_runner.h" +#include "platform/scheduler/base/task_queue.h" #include "platform/scheduler/base/task_queue_manager.h" #include "platform/scheduler/base/test_task_time_observer.h" #include "platform/scheduler/base/test_time_source.h" #include "platform/scheduler/child/scheduler_tqm_delegate_for_test.h" +#include "platform/scheduler/test/test_task_queue.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -46,8 +49,8 @@ main_task_runner_ = SchedulerTqmDelegateForTest::Create( mock_task_runner_, base::MakeUnique<TestTimeSource>(clock_.get())); manager_ = base::MakeUnique<TaskQueueManager>(main_task_runner_); - compositor_task_queue_ = manager_->NewTaskQueue( - TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR)); + compositor_task_queue_ = + manager_->CreateTaskQueue<TestTaskQueue>(TaskQueue::Spec("test_tq")); estimator_.reset(new IdleTimeEstimatorForTest( compositor_task_queue_, test_time_source_.get(), 10, 50)); }
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.cc b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.cc new file mode 100644 index 0000000..c8e59e0 --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.cc
@@ -0,0 +1,59 @@ +// Copyright 2017 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 "platform/scheduler/renderer/main_thread_scheduler_helper.h" + +#include "platform/scheduler/child/scheduler_tqm_delegate.h" +#include "platform/scheduler/renderer/main_thread_task_queue.h" + +namespace blink { +namespace scheduler { + +MainThreadSchedulerHelper::MainThreadSchedulerHelper( + scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate, + RendererSchedulerImpl* renderer_scheduler) + : SchedulerHelper(task_queue_manager_delegate), + renderer_scheduler_(renderer_scheduler), + default_task_queue_( + NewTaskQueue(MainThreadTaskQueue::QueueType::DEFAULT, + MainThreadTaskQueue::CreateSpecForType( + MainThreadTaskQueue::QueueType::DEFAULT) + .SetShouldMonitorQuiescence(true))), + control_task_queue_( + NewTaskQueue(MainThreadTaskQueue::QueueType::CONTROL, + MainThreadTaskQueue::CreateSpecForType( + MainThreadTaskQueue::QueueType::CONTROL) + .SetShouldNotifyObservers(false))) { + InitDefaultQueues(default_task_queue_, control_task_queue_); +} + +MainThreadSchedulerHelper::~MainThreadSchedulerHelper() {} + +scoped_refptr<MainThreadTaskQueue> +MainThreadSchedulerHelper::DefaultMainThreadTaskQueue() { + return default_task_queue_; +} + +scoped_refptr<TaskQueue> MainThreadSchedulerHelper::DefaultTaskQueue() { + return default_task_queue_; +} + +scoped_refptr<MainThreadTaskQueue> +MainThreadSchedulerHelper::ControlMainThreadTaskQueue() { + return control_task_queue_; +} + +scoped_refptr<TaskQueue> MainThreadSchedulerHelper::ControlTaskQueue() { + return control_task_queue_; +} + +scoped_refptr<MainThreadTaskQueue> MainThreadSchedulerHelper::NewTaskQueue( + MainThreadTaskQueue::QueueType type, + const TaskQueue::Spec& spec) { + return task_queue_manager_->CreateTaskQueue<MainThreadTaskQueue>( + spec, type, renderer_scheduler_); +} + +} // namespace scheduler +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.h b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.h new file mode 100644 index 0000000..bf70cf1 --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.h
@@ -0,0 +1,47 @@ +// Copyright 2017 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_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_MAIN_THREAD_SCHEDULER_HELPER_H_ +#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_MAIN_THREAD_SCHEDULER_HELPER_H_ + +#include "platform/scheduler/child/scheduler_helper.h" + +#include "platform/scheduler/renderer/main_thread_task_queue.h" + +namespace blink { +namespace scheduler { + +class RendererSchedulerImpl; + +class PLATFORM_EXPORT MainThreadSchedulerHelper : public SchedulerHelper { + public: + MainThreadSchedulerHelper( + scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate, + RendererSchedulerImpl* renderer_scheduler); + ~MainThreadSchedulerHelper() override; + + scoped_refptr<MainThreadTaskQueue> NewTaskQueue( + MainThreadTaskQueue::QueueType type, + const TaskQueue::Spec& spec); + + scoped_refptr<MainThreadTaskQueue> DefaultMainThreadTaskQueue(); + scoped_refptr<MainThreadTaskQueue> ControlMainThreadTaskQueue(); + + protected: + scoped_refptr<TaskQueue> DefaultTaskQueue() override; + scoped_refptr<TaskQueue> ControlTaskQueue() override; + + private: + RendererSchedulerImpl* renderer_scheduler_; // NOT OWNED + + const scoped_refptr<MainThreadTaskQueue> default_task_queue_; + const scoped_refptr<MainThreadTaskQueue> control_task_queue_; + + DISALLOW_COPY_AND_ASSIGN(MainThreadSchedulerHelper); +}; + +} // namespace scheduler +} // namespace blink + +#endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_MAIN_THREAD_SCHEDULER_HELPER_H_
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc new file mode 100644 index 0000000..15fb1a0 --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc
@@ -0,0 +1,80 @@ +// Copyright 2015 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 "platform/scheduler/renderer/main_thread_task_queue.h" + +#include "platform/scheduler/base/task_queue_impl.h" +#include "platform/scheduler/renderer/renderer_scheduler_impl.h" + +namespace blink { +namespace scheduler { + +// static +const char* MainThreadTaskQueue::NameForQueueType( + MainThreadTaskQueue::QueueType queue_type) { + switch (queue_type) { + case MainThreadTaskQueue::QueueType::CONTROL: + return "control_tq"; + case MainThreadTaskQueue::QueueType::DEFAULT: + return "default_tq"; + case MainThreadTaskQueue::QueueType::DEFAULT_LOADING: + return "default_loading_tq"; + case MainThreadTaskQueue::QueueType::DEFAULT_TIMER: + return "default_timer_tq"; + case MainThreadTaskQueue::QueueType::UNTHROTTLED: + return "unthrottled_tq"; + case MainThreadTaskQueue::QueueType::FRAME_LOADING: + return "frame_loading_tq"; + case MainThreadTaskQueue::QueueType::FRAME_TIMER: + return "frame_timer_tq"; + case MainThreadTaskQueue::QueueType::FRAME_UNTHROTTLED: + return "frame_unthrottled_tq"; + case MainThreadTaskQueue::QueueType::COMPOSITOR: + return "compositor_tq"; + case MainThreadTaskQueue::QueueType::IDLE: + return "idle_tq"; + case MainThreadTaskQueue::QueueType::TEST: + return "test_tq"; + case MainThreadTaskQueue::QueueType::COUNT: + NOTREACHED(); + return nullptr; + } + NOTREACHED(); + return nullptr; +} + +// static +TaskQueue::Spec MainThreadTaskQueue::CreateSpecForType( + MainThreadTaskQueue::QueueType queue_type) { + return TaskQueue::Spec(NameForQueueType(queue_type)); +} + +MainThreadTaskQueue::MainThreadTaskQueue( + std::unique_ptr<internal::TaskQueueImpl> impl, + MainThreadTaskQueue::QueueType queue_type, + RendererSchedulerImpl* renderer_scheduler) + : TaskQueue(std::move(impl)), + queue_type_(queue_type), + renderer_scheduler_(renderer_scheduler) { + GetTaskQueueImpl()->SetOnTaskCompletedHandler(base::Bind( + &MainThreadTaskQueue::OnTaskCompleted, base::Unretained(this))); +} + +MainThreadTaskQueue::~MainThreadTaskQueue() {} + +void MainThreadTaskQueue::OnTaskCompleted(base::TimeTicks start, + base::TimeTicks end) { + renderer_scheduler_->OnTaskCompleted(this, start, end); +} + +void MainThreadTaskQueue::UnregisterTaskQueue() { + if (renderer_scheduler_) { + // RendererScheduler can be null in tests. + renderer_scheduler_->OnUnregisterTaskQueue(this); + } + TaskQueue::UnregisterTaskQueue(); +} + +} // namespace scheduler +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h new file mode 100644 index 0000000..09bbe24 --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h
@@ -0,0 +1,69 @@ +// Copyright 2015 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_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_MAIN_THREAD_TASK_QUEUE_H_ +#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_MAIN_THREAD_TASK_QUEUE_H_ + +#include "platform/scheduler/base/task_queue.h" + +namespace blink { +namespace scheduler { + +class RendererSchedulerImpl; + +class PLATFORM_EXPORT MainThreadTaskQueue : public TaskQueue { + public: + enum class QueueType { + // Keep MainThreadTaskQueue::NameForQueueType in sync. + // This enum is used for a histogram and it should not be re-numbered. + CONTROL = 0, + DEFAULT = 1, + DEFAULT_LOADING = 2, + DEFAULT_TIMER = 3, + UNTHROTTLED = 4, + FRAME_LOADING = 5, + FRAME_TIMER = 6, + FRAME_UNTHROTTLED = 7, + COMPOSITOR = 8, + IDLE = 9, + TEST = 10, + + COUNT = 11 + }; + + // Returns name of the given queue type. Returned string has application + // lifetime. + static const char* NameForQueueType(QueueType queue_type); + + // Create spec with correct name for given type. + static TaskQueue::Spec CreateSpecForType(QueueType queue_type); + + ~MainThreadTaskQueue() override; + + QueueType queue_type() const { return queue_type_; } + + void OnTaskCompleted(base::TimeTicks start, base::TimeTicks end); + + // Override base method to notify RendererScheduler about unregistered queue. + void UnregisterTaskQueue() override; + + private: + MainThreadTaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl, + QueueType queue_type, + RendererSchedulerImpl* renderer_scheduler); + + friend class TaskQueueManager; + + QueueType queue_type_; + + // Needed to notify renderer scheduler about completed tasks. + RendererSchedulerImpl* renderer_scheduler_; // NOT OWNED + + DISALLOW_COPY_AND_ASSIGN(MainThreadTaskQueue); +}; + +} // namespace scheduler +} // namespace blink + +#endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_MAIN_THREAD_TASK_QUEUE_H_
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc index c0dcae2..e5e244f 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
@@ -89,24 +89,30 @@ RendererSchedulerImpl::RendererSchedulerImpl( scoped_refptr<SchedulerTqmDelegate> main_task_runner) - : helper_(main_task_runner), - idle_helper_(&helper_, - this, - "RendererSchedulerIdlePeriod", - base::TimeDelta()), + : helper_(main_task_runner, this), + idle_helper_( + &helper_, + this, + "RendererSchedulerIdlePeriod", + base::TimeDelta(), + helper_.NewTaskQueue(MainThreadTaskQueue::QueueType::IDLE, + MainThreadTaskQueue::CreateSpecForType( + MainThreadTaskQueue::QueueType::IDLE))), idle_canceled_delayed_task_sweeper_(&helper_, idle_helper_.IdleTaskRunner()), render_widget_scheduler_signals_(this), - control_task_queue_(helper_.ControlTaskQueue()), + control_task_queue_(helper_.ControlMainThreadTaskQueue()), compositor_task_queue_( - helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR) + helper_.NewTaskQueue(MainThreadTaskQueue::QueueType::COMPOSITOR, + MainThreadTaskQueue::CreateSpecForType( + MainThreadTaskQueue::QueueType::COMPOSITOR) .SetShouldMonitorQuiescence(true))), compositor_task_queue_enabled_voter_( compositor_task_queue_->CreateQueueEnabledVoter()), delayed_update_policy_runner_( base::Bind(&RendererSchedulerImpl::UpdatePolicy, base::Unretained(this)), - helper_.ControlTaskQueue()), + helper_.ControlMainThreadTaskQueue()), seqlock_queueing_time_estimator_( QueueingTimeEstimator(this, kQueueingTimeWindowDuration, 20)), main_thread_only_(this, @@ -122,9 +128,9 @@ &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); default_loading_task_queue_ = - NewLoadingTaskQueue(TaskQueue::QueueType::DEFAULT_LOADING); + NewLoadingTaskQueue(MainThreadTaskQueue::QueueType::DEFAULT_LOADING); default_timer_task_queue_ = - NewTimerTaskQueue(TaskQueue::QueueType::DEFAULT_TIMER); + NewTimerTaskQueue(MainThreadTaskQueue::QueueType::DEFAULT_TIMER); TRACE_EVENT_OBJECT_CREATED_WITH_ID( TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", @@ -173,7 +179,7 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( RendererSchedulerImpl* renderer_scheduler_impl, - const scoped_refptr<TaskQueue>& compositor_task_runner, + const scoped_refptr<MainThreadTaskQueue>& compositor_task_runner, base::TickClock* time_source, base::TimeTicks now) : loading_task_cost_estimator(time_source, @@ -293,7 +299,7 @@ scoped_refptr<base::SingleThreadTaskRunner> RendererSchedulerImpl::DefaultTaskRunner() { - return helper_.DefaultTaskQueue(); + return helper_.DefaultMainThreadTaskQueue(); } scoped_refptr<base::SingleThreadTaskRunner> @@ -319,44 +325,46 @@ return default_timer_task_queue_; } -scoped_refptr<TaskQueue> RendererSchedulerImpl::DefaultTaskQueue() { - return helper_.DefaultTaskQueue(); +scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::DefaultTaskQueue() { + return helper_.DefaultMainThreadTaskQueue(); } -scoped_refptr<TaskQueue> RendererSchedulerImpl::CompositorTaskQueue() { +scoped_refptr<MainThreadTaskQueue> +RendererSchedulerImpl::CompositorTaskQueue() { helper_.CheckOnValidThread(); return compositor_task_queue_; } -scoped_refptr<TaskQueue> RendererSchedulerImpl::LoadingTaskQueue() { +scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::LoadingTaskQueue() { helper_.CheckOnValidThread(); return default_loading_task_queue_; } -scoped_refptr<TaskQueue> RendererSchedulerImpl::TimerTaskQueue() { +scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::TimerTaskQueue() { helper_.CheckOnValidThread(); return default_timer_task_queue_; } -scoped_refptr<TaskQueue> RendererSchedulerImpl::ControlTaskQueue() { +scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::ControlTaskQueue() { helper_.CheckOnValidThread(); - return helper_.ControlTaskQueue(); + return helper_.ControlMainThreadTaskQueue(); } -scoped_refptr<TaskQueue> RendererSchedulerImpl::VirtualTimeControlTaskQueue() { +scoped_refptr<MainThreadTaskQueue> +RendererSchedulerImpl::VirtualTimeControlTaskQueue() { helper_.CheckOnValidThread(); return virtual_time_control_task_queue_; } -scoped_refptr<TaskQueue> RendererSchedulerImpl::NewLoadingTaskQueue( - TaskQueue::QueueType queue_type) { +scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::NewLoadingTaskQueue( + MainThreadTaskQueue::QueueType queue_type) { helper_.CheckOnValidThread(); - scoped_refptr<TaskQueue> loading_task_queue(helper_.NewTaskQueue( - TaskQueue::Spec(queue_type) - .SetShouldMonitorQuiescence(true) - .SetTimeDomain(GetMainThreadOnly().use_virtual_time - ? GetVirtualTimeDomain() - : nullptr))); + scoped_refptr<MainThreadTaskQueue> loading_task_queue(helper_.NewTaskQueue( + queue_type, MainThreadTaskQueue::CreateSpecForType(queue_type) + .SetShouldMonitorQuiescence(true) + .SetTimeDomain(GetMainThreadOnly().use_virtual_time + ? GetVirtualTimeDomain() + : nullptr))); auto insert_result = loading_task_runners_.insert(std::make_pair( loading_task_queue, loading_task_queue->CreateQueueEnabledVoter())); insert_result.first->second->SetQueueEnabled( @@ -374,17 +382,17 @@ return loading_task_queue; } -scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskQueue( - TaskQueue::QueueType queue_type) { +scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::NewTimerTaskQueue( + MainThreadTaskQueue::QueueType queue_type) { helper_.CheckOnValidThread(); // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity. - scoped_refptr<TaskQueue> timer_task_queue(helper_.NewTaskQueue( - TaskQueue::Spec(queue_type) - .SetShouldMonitorQuiescence(true) - .SetShouldReportWhenExecutionBlocked(true) - .SetTimeDomain(GetMainThreadOnly().use_virtual_time - ? GetVirtualTimeDomain() - : nullptr))); + scoped_refptr<MainThreadTaskQueue> timer_task_queue(helper_.NewTaskQueue( + queue_type, MainThreadTaskQueue::CreateSpecForType(queue_type) + .SetShouldMonitorQuiescence(true) + .SetShouldReportWhenExecutionBlocked(true) + .SetTimeDomain(GetMainThreadOnly().use_virtual_time + ? GetVirtualTimeDomain() + : nullptr))); auto insert_result = timer_task_runners_.insert(std::make_pair( timer_task_queue, timer_task_queue->CreateQueueEnabledVoter())); insert_result.first->second->SetQueueEnabled( @@ -403,15 +411,17 @@ return timer_task_queue; } -scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskQueue( - TaskQueue::QueueType queue_type) { +scoped_refptr<MainThreadTaskQueue> +RendererSchedulerImpl::NewUnthrottledTaskQueue( + MainThreadTaskQueue::QueueType queue_type) { helper_.CheckOnValidThread(); - scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue( - TaskQueue::Spec(queue_type) - .SetShouldMonitorQuiescence(true) - .SetTimeDomain(GetMainThreadOnly().use_virtual_time - ? GetVirtualTimeDomain() - : nullptr))); + scoped_refptr<MainThreadTaskQueue> unthrottled_task_queue( + helper_.NewTaskQueue( + queue_type, MainThreadTaskQueue::CreateSpecForType(queue_type) + .SetShouldMonitorQuiescence(true) + .SetTimeDomain(GetMainThreadOnly().use_virtual_time + ? GetVirtualTimeDomain() + : nullptr))); unthrottled_task_runners_.insert(unthrottled_task_queue); return unthrottled_task_queue; } @@ -422,7 +432,7 @@ } void RendererSchedulerImpl::OnUnregisterTaskQueue( - const scoped_refptr<TaskQueue>& task_queue) { + const scoped_refptr<MainThreadTaskQueue>& task_queue) { if (task_queue_throttler_) task_queue_throttler_->UnregisterTaskQueue(task_queue.get()); @@ -1272,7 +1282,7 @@ // TODO(alexclarke): We shouldn't have to prioritize the default queue, but it // appears to be necessary since the order of loading tasks and IPCs (which // are mostly dispatched on the default queue) need to be preserved. - ApplyTaskQueuePolicy(helper_.DefaultTaskQueue().get(), nullptr, + ApplyTaskQueuePolicy(helper_.DefaultMainThreadTaskQueue().get(), nullptr, GetMainThreadOnly().current_policy.default_queue_policy, new_policy.default_queue_policy); if (GetMainThreadOnly().rail_mode_observer && @@ -1298,7 +1308,7 @@ } void RendererSchedulerImpl::ApplyTaskQueuePolicy( - TaskQueue* task_queue, + MainThreadTaskQueue* task_queue, TaskQueue::QueueEnabledVoter* task_queue_enabled_voter, const TaskQueuePolicy& old_task_queue_policy, const TaskQueuePolicy& new_task_queue_policy) const { @@ -1426,7 +1436,8 @@ return true; } -SchedulerHelper* RendererSchedulerImpl::GetSchedulerHelperForTesting() { +MainThreadSchedulerHelper* +RendererSchedulerImpl::GetSchedulerHelperForTesting() { return &helper_; } @@ -1886,9 +1897,7 @@ web_view_scheduler->ReportIntervention(message); } -void RendererSchedulerImpl::OnTriedToExecuteBlockedTask( - const TaskQueue& queue, - const base::PendingTask& task) { +void RendererSchedulerImpl::OnTriedToExecuteBlockedTask() { if (GetMainThreadOnly().current_use_case == UseCase::TOUCHSTART || GetMainThreadOnly().longest_jank_free_task_duration < base::TimeDelta::FromMilliseconds(kRailsResponseTimeMillis) || @@ -1928,8 +1937,7 @@ } } -void RendererSchedulerImpl::WillProcessTask(TaskQueue* task_queue, - double start_time) { +void RendererSchedulerImpl::WillProcessTask(double start_time) { base::TimeTicks start_time_ticks = MonotonicTimeInSecondsToTimeTicks(start_time); GetMainThreadOnly().current_task_start_time = start_time_ticks; @@ -1938,26 +1946,24 @@ seqlock_queueing_time_estimator_.seqlock.WriteEnd(); } -void RendererSchedulerImpl::DidProcessTask(TaskQueue* task_queue, - double start_time, - double end_time) { +void RendererSchedulerImpl::DidProcessTask(double start_time, double end_time) { DCHECK_LE(start_time, end_time); // TODO(scheduler-dev): Remove conversions when Blink starts using // base::TimeTicks instead of doubles for time. - base::TimeTicks start_time_ticks = - MonotonicTimeInSecondsToTimeTicks(start_time); base::TimeTicks end_time_ticks = MonotonicTimeInSecondsToTimeTicks(end_time); seqlock_queueing_time_estimator_.seqlock.WriteBegin(); seqlock_queueing_time_estimator_.data.OnTopLevelTaskCompleted(end_time_ticks); seqlock_queueing_time_estimator_.seqlock.WriteEnd(); +} - task_queue_throttler()->OnTaskRunTimeReported(task_queue, start_time_ticks, - end_time_ticks); +void RendererSchedulerImpl::OnTaskCompleted(MainThreadTaskQueue* queue, + base::TimeTicks start, + base::TimeTicks end) { + task_queue_throttler()->OnTaskRunTimeReported(queue, start, end); // TODO(altimin): Per-page metrics should also be considered. - RecordTaskMetrics(task_queue->GetQueueType(), start_time_ticks, - end_time_ticks); + RecordTaskMetrics(queue->queue_type(), start, end); } namespace { @@ -1975,9 +1981,10 @@ } // namespace -void RendererSchedulerImpl::RecordTaskMetrics(TaskQueue::QueueType queue_type, - base::TimeTicks start_time, - base::TimeTicks end_time) { +void RendererSchedulerImpl::RecordTaskMetrics( + MainThreadTaskQueue::QueueType queue_type, + base::TimeTicks start_time, + base::TimeTicks end_time) { base::TimeDelta duration = end_time - start_time; if (duration > kLongTaskDiscardingThreshold) return; @@ -1994,9 +2001,10 @@ // TODO(altimin): See whether this metric is still useful after // adding RendererScheduler.TaskDurationPerQueueType. - UMA_HISTOGRAM_ENUMERATION("RendererScheduler.NumberOfTasksPerQueueType2", - static_cast<int>(queue_type), - static_cast<int>(TaskQueue::QueueType::COUNT)); + UMA_HISTOGRAM_ENUMERATION( + "RendererScheduler.NumberOfTasksPerQueueType2", + static_cast<int>(queue_type), + static_cast<int>(MainThreadTaskQueue::QueueType::COUNT)); GetMainThreadOnly().task_duration_reporter.RecordTask(queue_type, duration); @@ -2171,12 +2179,15 @@ // The |unthrottled_task_runners_| are not actively managed by UpdatePolicy(). AutoAdvancingVirtualTimeDomain* time_domain = GetVirtualTimeDomain(); - for (const scoped_refptr<TaskQueue>& task_queue : unthrottled_task_runners_) + for (const scoped_refptr<MainThreadTaskQueue>& task_queue : + unthrottled_task_runners_) task_queue->SetTimeDomain(time_domain); DCHECK(!virtual_time_control_task_queue_); virtual_time_control_task_queue_ = - helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::CONTROL)); + helper_.NewTaskQueue(MainThreadTaskQueue::QueueType::CONTROL, + MainThreadTaskQueue::CreateSpecForType( + MainThreadTaskQueue::QueueType::CONTROL)); virtual_time_control_task_queue_->SetQueuePriority( TaskQueue::CONTROL_PRIORITY); virtual_time_control_task_queue_->SetTimeDomain(time_domain); @@ -2189,7 +2200,8 @@ RealTimeDomain* time_domain = real_time_domain(); // The |unthrottled_task_runners_| are not actively managed by UpdatePolicy(). - for (const scoped_refptr<TaskQueue>& task_queue : unthrottled_task_runners_) + for (const scoped_refptr<MainThreadTaskQueue>& task_queue : + unthrottled_task_runners_) task_queue->SetTimeDomain(time_domain); virtual_time_control_task_queue_->UnregisterTaskQueue(); virtual_time_control_task_queue_ = nullptr; @@ -2210,7 +2222,8 @@ now; } -void RendererSchedulerImpl::AddQueueToWakeUpBudgetPool(TaskQueue* queue) { +void RendererSchedulerImpl::AddQueueToWakeUpBudgetPool( + MainThreadTaskQueue* queue) { if (!GetMainThreadOnly().wake_up_budget_pool) { GetMainThreadOnly().wake_up_budget_pool = task_queue_throttler()->CreateWakeUpBudgetPool("renderer_wake_up_pool");
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h index c9929be..e14c904 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h +++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
@@ -20,9 +20,10 @@ #include "platform/scheduler/base/thread_load_tracker.h" #include "platform/scheduler/child/idle_canceled_delayed_task_sweeper.h" #include "platform/scheduler/child/idle_helper.h" -#include "platform/scheduler/child/scheduler_helper.h" #include "platform/scheduler/renderer/deadline_task_runner.h" #include "platform/scheduler/renderer/idle_time_estimator.h" +#include "platform/scheduler/renderer/main_thread_scheduler_helper.h" +#include "platform/scheduler/renderer/main_thread_task_queue.h" #include "platform/scheduler/renderer/render_widget_signals.h" #include "platform/scheduler/renderer/task_cost_estimator.h" #include "platform/scheduler/renderer/task_duration_metric_reporter.h" @@ -46,7 +47,7 @@ class PLATFORM_EXPORT RendererSchedulerImpl : public RendererScheduler, public IdleHelper::Delegate, - public SchedulerHelper::Observer, + public MainThreadSchedulerHelper::Observer, public RenderWidgetSignals::Observer, public TaskTimeObserver, public QueueingTimeEstimator::Client, @@ -134,15 +135,11 @@ bool has_visible_render_widget_with_touch_handler) override; // SchedulerHelper::Observer implementation: - void OnUnregisterTaskQueue(const scoped_refptr<TaskQueue>& queue) override; - void OnTriedToExecuteBlockedTask(const TaskQueue& queue, - const base::PendingTask& task) override; + void OnTriedToExecuteBlockedTask() override; // TaskTimeObserver implementation: - void WillProcessTask(TaskQueue* task_queue, double start_time) override; - void DidProcessTask(TaskQueue* task_queue, - double start_time, - double end_time) override; + void WillProcessTask(double start_time) override; + void DidProcessTask(double start_time, double end_time) override; void OnBeginNestedRunLoop() override; // QueueingTimeEstimator::Client implementation: @@ -150,28 +147,30 @@ base::TimeDelta queueing_time, base::TimeTicks window_start_time) override; - scoped_refptr<TaskQueue> DefaultTaskQueue(); - scoped_refptr<TaskQueue> CompositorTaskQueue(); - scoped_refptr<TaskQueue> LoadingTaskQueue(); - scoped_refptr<TaskQueue> TimerTaskQueue(); + scoped_refptr<MainThreadTaskQueue> DefaultTaskQueue(); + scoped_refptr<MainThreadTaskQueue> CompositorTaskQueue(); + scoped_refptr<MainThreadTaskQueue> LoadingTaskQueue(); + scoped_refptr<MainThreadTaskQueue> TimerTaskQueue(); // Returns a new loading task queue. This queue is intended for tasks related // to resource dispatch, foreground HTML parsing, etc... - scoped_refptr<TaskQueue> NewLoadingTaskQueue(TaskQueue::QueueType queue_type); + scoped_refptr<MainThreadTaskQueue> NewLoadingTaskQueue( + MainThreadTaskQueue::QueueType queue_type); // Returns a new timer task queue. This queue is intended for DOM Timers. - scoped_refptr<TaskQueue> NewTimerTaskQueue(TaskQueue::QueueType queue_type); + scoped_refptr<MainThreadTaskQueue> NewTimerTaskQueue( + MainThreadTaskQueue::QueueType queue_type); // Returns a task queue for tasks which should never get throttled. - scoped_refptr<TaskQueue> NewUnthrottledTaskQueue( - TaskQueue::QueueType queue_type); + scoped_refptr<MainThreadTaskQueue> NewUnthrottledTaskQueue( + MainThreadTaskQueue::QueueType queue_type); // Returns a task queue where tasks run at the highest possible priority. - scoped_refptr<TaskQueue> ControlTaskQueue(); + scoped_refptr<MainThreadTaskQueue> ControlTaskQueue(); // A control task queue which also respects virtual time. Only available if // virtual time has been enabled. - scoped_refptr<TaskQueue> VirtualTimeControlTaskQueue(); + scoped_refptr<MainThreadTaskQueue> VirtualTimeControlTaskQueue(); void RegisterTimeDomain(TimeDomain* time_domain); void UnregisterTimeDomain(TimeDomain* time_domain); @@ -207,7 +206,7 @@ bool is_main_frame); // Test helpers. - SchedulerHelper* GetSchedulerHelperForTesting(); + MainThreadSchedulerHelper* GetSchedulerHelperForTesting(); TaskCostEstimator* GetLoadingTaskCostEstimatorForTesting(); TaskCostEstimator* GetTimerTaskCostEstimatorForTesting(); IdleTimeEstimator* GetIdleTimeEstimatorForTesting(); @@ -234,6 +233,12 @@ void OnFirstMeaningfulPaint(); + void OnUnregisterTaskQueue(const scoped_refptr<MainThreadTaskQueue>& queue); + + void OnTaskCompleted(MainThreadTaskQueue* queue, + base::TimeTicks start, + base::TimeTicks end); + // base::trace_event::TraceLog::EnabledStateObserver implementation: void OnTraceLogEnabled() override; void OnTraceLogDisabled() override; @@ -416,7 +421,7 @@ void BroadcastIntervention(const std::string& message); void ApplyTaskQueuePolicy( - TaskQueue* task_queue, + MainThreadTaskQueue* task_queue, TaskQueue::QueueEnabledVoter* task_queue_enabled_voter, const TaskQueuePolicy& old_task_queue_policy, const TaskQueuePolicy& new_task_queue_policy) const; @@ -426,33 +431,33 @@ bool ShouldDisableThrottlingBecauseOfAudio(base::TimeTicks now); - void AddQueueToWakeUpBudgetPool(TaskQueue* queue); + void AddQueueToWakeUpBudgetPool(MainThreadTaskQueue* queue); - void RecordTaskMetrics(TaskQueue::QueueType queue_type, + void RecordTaskMetrics(MainThreadTaskQueue::QueueType queue_type, base::TimeTicks start_time, base::TimeTicks end_time); - SchedulerHelper helper_; + MainThreadSchedulerHelper helper_; IdleHelper idle_helper_; IdleCanceledDelayedTaskSweeper idle_canceled_delayed_task_sweeper_; std::unique_ptr<TaskQueueThrottler> task_queue_throttler_; RenderWidgetSignals render_widget_scheduler_signals_; - const scoped_refptr<TaskQueue> control_task_queue_; - const scoped_refptr<TaskQueue> compositor_task_queue_; - scoped_refptr<TaskQueue> virtual_time_control_task_queue_; + const scoped_refptr<MainThreadTaskQueue> control_task_queue_; + const scoped_refptr<MainThreadTaskQueue> compositor_task_queue_; + scoped_refptr<MainThreadTaskQueue> virtual_time_control_task_queue_; std::unique_ptr<TaskQueue::QueueEnabledVoter> compositor_task_queue_enabled_voter_; using TaskQueueVoterMap = - std::map<scoped_refptr<TaskQueue>, + std::map<scoped_refptr<MainThreadTaskQueue>, std::unique_ptr<TaskQueue::QueueEnabledVoter>>; TaskQueueVoterMap loading_task_runners_; TaskQueueVoterMap timer_task_runners_; - std::set<scoped_refptr<TaskQueue>> unthrottled_task_runners_; - scoped_refptr<TaskQueue> default_loading_task_queue_; - scoped_refptr<TaskQueue> default_timer_task_queue_; + std::set<scoped_refptr<MainThreadTaskQueue>> unthrottled_task_runners_; + scoped_refptr<MainThreadTaskQueue> default_loading_task_queue_; + scoped_refptr<MainThreadTaskQueue> default_timer_task_queue_; // Note |virtual_time_domain_| is lazily created. std::unique_ptr<AutoAdvancingVirtualTimeDomain> virtual_time_domain_; @@ -471,10 +476,11 @@ // (the accessors) for the following data members. struct MainThreadOnly { - MainThreadOnly(RendererSchedulerImpl* renderer_scheduler_impl, - const scoped_refptr<TaskQueue>& compositor_task_runner, - base::TickClock* time_source, - base::TimeTicks now); + MainThreadOnly( + RendererSchedulerImpl* renderer_scheduler_impl, + const scoped_refptr<MainThreadTaskQueue>& compositor_task_runner, + base::TickClock* time_source, + base::TimeTicks now); ~MainThreadOnly(); TaskCostEstimator loading_task_cost_estimator;
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc index 556ffba..9d0c2094 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
@@ -563,8 +563,8 @@ double start = (clock_->NowTicks() - base::TimeTicks()).InSecondsF(); clock_->Advance(base::TimeDelta::FromSecondsD(duration)); double end = (clock_->NowTicks() - base::TimeTicks()).InSecondsF(); - scheduler_->WillProcessTask(scheduler_->TimerTaskQueue().get(), start); - scheduler_->DidProcessTask(scheduler_->TimerTaskQueue().get(), start, end); + scheduler_->WillProcessTask(start); + scheduler_->DidProcessTask(start, end); } void GetQueueingTimeEstimatorLock() { @@ -3702,7 +3702,8 @@ // task runner. SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); scoped_refptr<TaskQueue> unthrottled_task_runner = - scheduler_->NewUnthrottledTaskQueue(TaskQueue::QueueType::UNTHROTTLED); + scheduler_->NewUnthrottledTaskQueue( + MainThreadTaskQueue::QueueType::UNTHROTTLED); size_t timer_count = 0; size_t unthrottled_count = 0; @@ -3746,11 +3747,11 @@ scheduler_->EnableVirtualTime(); scoped_refptr<TaskQueue> loading_tq = - scheduler_->NewLoadingTaskQueue(TaskQueue::QueueType::TEST); + scheduler_->NewLoadingTaskQueue(MainThreadTaskQueue::QueueType::TEST); scoped_refptr<TaskQueue> timer_tq = - scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST); + scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST); scoped_refptr<TaskQueue> unthrottled_tq = - scheduler_->NewUnthrottledTaskQueue(TaskQueue::QueueType::TEST); + scheduler_->NewUnthrottledTaskQueue(MainThreadTaskQueue::QueueType::TEST); EXPECT_EQ(scheduler_->DefaultTaskQueue()->GetTimeDomain(), scheduler_->GetVirtualTimeDomain()); @@ -3772,24 +3773,26 @@ EXPECT_EQ(unthrottled_tq->GetTimeDomain(), scheduler_->GetVirtualTimeDomain()); - EXPECT_EQ(scheduler_->NewLoadingTaskQueue(TaskQueue::QueueType::TEST) + EXPECT_EQ( + scheduler_->NewLoadingTaskQueue(MainThreadTaskQueue::QueueType::TEST) + ->GetTimeDomain(), + scheduler_->GetVirtualTimeDomain()); + EXPECT_EQ(scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST) ->GetTimeDomain(), scheduler_->GetVirtualTimeDomain()); - EXPECT_EQ(scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST) - ->GetTimeDomain(), - scheduler_->GetVirtualTimeDomain()); - EXPECT_EQ(scheduler_->NewUnthrottledTaskQueue(TaskQueue::QueueType::TEST) - ->GetTimeDomain(), - scheduler_->GetVirtualTimeDomain()); + EXPECT_EQ( + scheduler_->NewUnthrottledTaskQueue(MainThreadTaskQueue::QueueType::TEST) + ->GetTimeDomain(), + scheduler_->GetVirtualTimeDomain()); } TEST_F(RendererSchedulerImplTest, DisableVirtualTimeForTesting) { scheduler_->EnableVirtualTime(); scoped_refptr<TaskQueue> timer_tq = - scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST); + scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST); scoped_refptr<TaskQueue> unthrottled_tq = - scheduler_->NewUnthrottledTaskQueue(TaskQueue::QueueType::TEST); + scheduler_->NewUnthrottledTaskQueue(MainThreadTaskQueue::QueueType::TEST); scheduler_->DisableVirtualTimeForTesting(); EXPECT_EQ(scheduler_->DefaultTaskQueue()->GetTimeDomain(), @@ -3931,7 +3934,6 @@ scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold())); clock_->Advance(base::TimeDelta::FromSecondsD(2)); scheduler_->WillProcessTask( - scheduler_->TimerTaskQueue().get(), (clock_->NowTicks() - base::TimeTicks()).InSecondsF()); EXPECT_FALSE( scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold()));
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.cc b/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.cc index d0f1f45..49f004a 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.cc
@@ -13,8 +13,8 @@ : TaskDurationMetricReporter(base::Histogram::FactoryGet( metric_name, 1, - static_cast<int>(TaskQueue::QueueType::COUNT), - static_cast<int>(TaskQueue::QueueType::COUNT) + 1, + static_cast<int>(MainThreadTaskQueue::QueueType::COUNT), + static_cast<int>(MainThreadTaskQueue::QueueType::COUNT) + 1, base::HistogramBase::kUmaTargetedHistogramFlag)) {} TaskDurationMetricReporter::TaskDurationMetricReporter( @@ -23,8 +23,9 @@ TaskDurationMetricReporter::~TaskDurationMetricReporter() {} -void TaskDurationMetricReporter::RecordTask(TaskQueue::QueueType queue_type, - base::TimeDelta duration) { +void TaskDurationMetricReporter::RecordTask( + MainThreadTaskQueue::QueueType queue_type, + base::TimeDelta duration) { // Report only whole milliseconds to avoid overflow. base::TimeDelta& unreported_duration = unreported_task_duration_[static_cast<int>(queue_type)];
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.h b/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.h index f305e7f..c5790c38 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.h +++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.h
@@ -11,7 +11,7 @@ #include "base/macros.h" #include "base/time/time.h" #include "platform/PlatformExport.h" -#include "platform/scheduler/base/task_queue.h" +#include "platform/scheduler/renderer/main_thread_task_queue.h" namespace base { class HistogramBase; @@ -27,7 +27,7 @@ explicit TaskDurationMetricReporter(const char* metric_name); ~TaskDurationMetricReporter(); - void RecordTask(TaskQueue::QueueType queue_type, + void RecordTask(MainThreadTaskQueue::QueueType queue_type, base::TimeDelta time_duration); private: @@ -35,7 +35,8 @@ TaskDurationMetricReporter(base::HistogramBase* histogram); - std::array<base::TimeDelta, static_cast<size_t>(TaskQueue::QueueType::COUNT)> + std::array<base::TimeDelta, + static_cast<size_t>(MainThreadTaskQueue::QueueType::COUNT)> unreported_task_duration_; base::HistogramBase* task_duration_per_queue_type_histogram_;
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter_unittest.cc index 4e7a63f..be6a216d 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter_unittest.cc
@@ -57,22 +57,22 @@ TaskDurationMetricReporter metric_reporter(&histogram); EXPECT_CALL(histogram, AddCount(2, 3)); - metric_reporter.RecordTask(static_cast<TaskQueue::QueueType>(2), + metric_reporter.RecordTask(static_cast<MainThreadTaskQueue::QueueType>(2), base::TimeDelta::FromMicroseconds(3400)); Mock::VerifyAndClearExpectations(&histogram); EXPECT_CALL(histogram, AddCount(_, _)).Times(0); - metric_reporter.RecordTask(static_cast<TaskQueue::QueueType>(2), + metric_reporter.RecordTask(static_cast<MainThreadTaskQueue::QueueType>(2), base::TimeDelta::FromMicroseconds(300)); Mock::VerifyAndClearExpectations(&histogram); EXPECT_CALL(histogram, AddCount(2, 1)); - metric_reporter.RecordTask(static_cast<TaskQueue::QueueType>(2), + metric_reporter.RecordTask(static_cast<MainThreadTaskQueue::QueueType>(2), base::TimeDelta::FromMicroseconds(800)); Mock::VerifyAndClearExpectations(&histogram); EXPECT_CALL(histogram, AddCount(2, 16)); - metric_reporter.RecordTask(static_cast<TaskQueue::QueueType>(2), + metric_reporter.RecordTask(static_cast<MainThreadTaskQueue::QueueType>(2), base::TimeDelta::FromMicroseconds(15600)); Mock::VerifyAndClearExpectations(&histogram); }
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc index cd39aa3..80f44e3 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc
@@ -52,16 +52,6 @@ } } -bool IsQueueBlocked(TaskQueue* task_queue) { - internal::TaskQueueImpl* task_queue_impl = - reinterpret_cast<internal::TaskQueueImpl*>(task_queue); - if (!task_queue_impl->IsQueueEnabled()) - return true; - return task_queue_impl->GetFenceForTest() == - static_cast<internal::EnqueueOrder>( - internal::EnqueueOrderValues::BLOCKING_FENCE); -} - // Test clock which simulates passage of time by automatically // advancing time with each call to Now(). class AutoAdvancingTestClock : public base::SimpleTestTickClock { @@ -99,7 +89,8 @@ mock_task_runner_, base::MakeUnique<TestTimeSource>(clock_.get())); scheduler_.reset(new RendererSchedulerImpl(delegate_)); task_queue_throttler_ = scheduler_->task_queue_throttler(); - timer_queue_ = scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST); + timer_queue_ = + scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST); } void TearDown() override { @@ -130,6 +121,15 @@ mock_task_runner_->RunUntilIdle(); } + bool IsQueueBlocked(TaskQueue* task_queue) { + internal::TaskQueueImpl* task_queue_impl = task_queue->GetTaskQueueImpl(); + if (!task_queue_impl->IsQueueEnabled()) + return true; + return task_queue_impl->GetFenceForTest() == + static_cast<internal::EnqueueOrder>( + internal::EnqueueOrderValues::BLOCKING_FENCE); + } + protected: virtual std::unique_ptr<AutoAdvancingTestClock> CreateClock() { return base::MakeUnique<AutoAdvancingTestClock>(base::TimeDelta()); @@ -745,7 +745,7 @@ std::vector<base::TimeTicks> run_times; scoped_refptr<TaskQueue> second_queue = - scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST); + scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST); CPUTimeBudgetPool* pool = task_queue_throttler_->CreateCPUTimeBudgetPool("test"); @@ -1070,7 +1070,7 @@ std::vector<base::TimeTicks> run_times; scoped_refptr<TaskQueue> second_queue = - scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST); + scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST); task_queue_throttler_->IncreaseThrottleRefCount(timer_queue_.get()); task_queue_throttler_->IncreaseThrottleRefCount(second_queue.get()); @@ -1106,7 +1106,7 @@ std::vector<base::TimeTicks> run_times; scoped_refptr<TaskQueue> second_queue = - scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST); + scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST); CPUTimeBudgetPool* pool1 = task_queue_throttler_->CreateCPUTimeBudgetPool("test");
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc index 15094cd..35341de 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc
@@ -147,7 +147,7 @@ DCHECK(parent_web_view_scheduler_); if (!loading_web_task_runner_) { loading_task_queue_ = renderer_scheduler_->NewLoadingTaskQueue( - TaskQueue::QueueType::FRAME_LOADING); + MainThreadTaskQueue::QueueType::FRAME_LOADING); loading_task_queue_->SetBlameContext(blame_context_); loading_queue_enabled_voter_ = loading_task_queue_->CreateQueueEnabledVoter(); @@ -161,7 +161,7 @@ DCHECK(parent_web_view_scheduler_); if (!timer_web_task_runner_) { timer_task_queue_ = renderer_scheduler_->NewTimerTaskQueue( - TaskQueue::QueueType::FRAME_TIMER); + MainThreadTaskQueue::QueueType::FRAME_TIMER); timer_task_queue_->SetBlameContext(blame_context_); timer_queue_enabled_voter_ = timer_task_queue_->CreateQueueEnabledVoter(); timer_queue_enabled_voter_->SetQueueEnabled(!frame_suspended_); @@ -188,7 +188,7 @@ // TODO(altimin): Split FRAME_UNTHROTTLED into FRAME_UNTHROTTLED and // FRAME_UNSUSPENDED. suspendable_task_queue_ = renderer_scheduler_->NewTimerTaskQueue( - TaskQueue::QueueType::FRAME_UNTHROTTLED); + MainThreadTaskQueue::QueueType::FRAME_UNTHROTTLED); suspendable_task_queue_->SetBlameContext(blame_context_); suspendable_web_task_runner_ = WebTaskRunnerImpl::Create(suspendable_task_queue_); @@ -203,7 +203,7 @@ DCHECK(parent_web_view_scheduler_); if (!unthrottled_web_task_runner_) { unthrottled_task_queue_ = renderer_scheduler_->NewUnthrottledTaskQueue( - TaskQueue::QueueType::FRAME_UNTHROTTLED); + MainThreadTaskQueue::QueueType::FRAME_UNTHROTTLED); unthrottled_task_queue_->SetBlameContext(blame_context_); unthrottled_web_task_runner_ = WebTaskRunnerImpl::Create(unthrottled_task_queue_); @@ -217,7 +217,7 @@ if (!unthrottled_but_blockable_web_task_runner_) { unthrottled_but_blockable_task_queue_ = renderer_scheduler_->NewTimerTaskQueue( - TaskQueue::QueueType::FRAME_UNTHROTTLED); + MainThreadTaskQueue::QueueType::FRAME_UNTHROTTLED); unthrottled_but_blockable_task_queue_->SetBlameContext(blame_context_); unthrottled_but_blockable_web_task_runner_ = WebTaskRunnerImpl::Create(unthrottled_but_blockable_task_queue_);
diff --git a/third_party/WebKit/Source/platform/scheduler/test/test_task_queue.cc b/third_party/WebKit/Source/platform/scheduler/test/test_task_queue.cc new file mode 100644 index 0000000..53338a6 --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/test/test_task_queue.cc
@@ -0,0 +1,18 @@ +// Copyright 2017 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 "platform/scheduler/test/test_task_queue.h" + +#include "platform/scheduler/base/task_queue_impl.h" + +namespace blink { +namespace scheduler { + +TestTaskQueue::TestTaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl) + : TaskQueue(std::move(impl)) {} + +TestTaskQueue::~TestTaskQueue() {} + +} // namespace scheduler +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/test/test_task_queue.h b/third_party/WebKit/Source/platform/scheduler/test/test_task_queue.h new file mode 100644 index 0000000..260979f --- /dev/null +++ b/third_party/WebKit/Source/platform/scheduler/test/test_task_queue.h
@@ -0,0 +1,24 @@ +// Copyright 2017 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_WEBKIT_SOURCE_PLATFORM_SCHEDULER_TEST_TEST_TASK_QUEUE_H_ +#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_TEST_TEST_TASK_QUEUE_H_ + +#include "platform/scheduler/base/task_queue.h" + +namespace blink { +namespace scheduler { + +class TestTaskQueue : public TaskQueue { + public: + explicit TestTaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl); + ~TestTaskQueue() override; + + using TaskQueue::GetTaskQueueImpl; +}; + +} // namespace scheduler +} // namespace blink + +#endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_TEST_TEST_TASK_QUEUE_H_
diff --git a/third_party/WebKit/Source/platform/testing/PictureMatchers.cpp b/third_party/WebKit/Source/platform/testing/PictureMatchers.cpp index f39a0bf..07567bd 100644 --- a/third_party/WebKit/Source/platform/testing/PictureMatchers.cpp +++ b/third_party/WebKit/Source/platform/testing/PictureMatchers.cpp
@@ -17,11 +17,6 @@ namespace { -struct QuadWithColor { - FloatQuad quad; - Color color; -}; - class DrawsRectangleCanvas : public SkCanvas { public: DrawsRectangleCanvas() @@ -29,26 +24,27 @@ save_count_(0), alpha_(255), alpha_save_layer_count_(-1) {} - const Vector<QuadWithColor>& QuadsWithColor() const { return quads_; } + const Vector<RectWithColor>& RectsWithColor() const { return rects_; } void onDrawRect(const SkRect& rect, const SkPaint& paint) override { - SkRect clipped_rect(rect); - for (Vector<ClipAndIndex>::const_reverse_iterator clip = clips_.rbegin(); - clip != clips_.rend(); clip++) { - if (SkRect::Intersects(rect, clip->rect)) - CHECK(clipped_rect.intersect(clip->rect)); - } SkPoint quad[4]; - getTotalMatrix().mapRectToQuad(quad, clipped_rect); - QuadWithColor quad_with_color; - quad_with_color.quad = FloatQuad(quad); + getTotalMatrix().mapRectToQuad(quad, rect); + + SkRect device_rect; + device_rect.set(quad, 4); + SkIRect device_clip_bounds; + FloatRect clipped_rect; + if (getDeviceClipBounds(&device_clip_bounds) && + device_rect.intersect(SkRect::Make(device_clip_bounds))) + clipped_rect = device_rect; unsigned paint_alpha = static_cast<unsigned>(paint.getAlpha()); SkPaint paint_with_alpha(paint); paint_with_alpha.setAlpha(static_cast<U8CPU>(alpha_ * paint_alpha / 255)); - quad_with_color.color = Color(paint_with_alpha.getColor()); - quads_.push_back(quad_with_color); - SkCanvas::onDrawRect(clipped_rect, paint); + Color color = Color(paint_with_alpha.getColor()); + + rects_.emplace_back(clipped_rect, color); + SkCanvas::onDrawRect(rect, paint); } SkCanvas::SaveLayerStrategy getSaveLayerStrategy( @@ -70,8 +66,6 @@ void willRestore() override { DCHECK_GT(save_count_, 0); - if (clips_.size() && save_count_ == clips_.back().save_count) - clips_.pop_back(); if (alpha_save_layer_count_ == save_count_) { alpha_ = 255; alpha_save_layer_count_ = -1; @@ -80,24 +74,8 @@ SkCanvas::willRestore(); } - void onClipRect(const SkRect& rect, - SkClipOp op, - ClipEdgeStyle style) override { - ClipAndIndex clip_struct; - clip_struct.rect = rect; - clip_struct.save_count = save_count_; - clips_.push_back(clip_struct); - SkCanvas::onClipRect(rect, op, style); - } - - struct ClipAndIndex { - SkRect rect; - int save_count; - }; - private: - Vector<QuadWithColor> quads_; - Vector<ClipAndIndex> clips_; + Vector<RectWithColor> rects_; int save_count_; unsigned alpha_; int alpha_save_layer_count_; @@ -114,24 +92,24 @@ ::testing::MatchResultListener* listener) const override { DrawsRectangleCanvas canvas; picture.playback(&canvas); - const auto& quads = canvas.QuadsWithColor(); - if (quads.size() != rects_with_color_.size()) { - *listener << "which draws " << quads.size() << " quads"; + const auto& actual_rects = canvas.RectsWithColor(); + if (actual_rects.size() != rects_with_color_.size()) { + *listener << "which draws " << actual_rects.size() << " rects"; return false; } - for (unsigned index = 0; index < quads.size(); index++) { - const auto& quad_with_color = quads[index]; - const auto& rect_with_color = rects_with_color_[index]; + for (unsigned index = 0; index < actual_rects.size(); index++) { + const auto& actual_rect_with_color = actual_rects[index]; + const auto& expect_rect_with_color = rects_with_color_[index]; - const FloatRect& rect = quad_with_color.quad.BoundingBox(); - if (EnclosingIntRect(rect) != EnclosingIntRect(rect_with_color.rect) || - quad_with_color.color != rect_with_color.color) { + if (EnclosingIntRect(actual_rect_with_color.rect) != + EnclosingIntRect(expect_rect_with_color.rect) || + actual_rect_with_color.color != expect_rect_with_color.color) { if (listener->IsInterested()) { *listener << "at index " << index << " which draws "; - PrintTo(rect, listener->stream()); + PrintTo(actual_rect_with_color.rect, listener->stream()); *listener << " with color " - << quad_with_color.color.Serialized().Ascii().data() + << actual_rect_with_color.color.Serialized().Ascii().data() << "\n"; } return false;
diff --git a/third_party/WebKit/Source/platform/wtf/HashMap.h b/third_party/WebKit/Source/platform/wtf/HashMap.h index 2eb7921..cdc1d92 100644 --- a/third_party/WebKit/Source/platform/wtf/HashMap.h +++ b/third_party/WebKit/Source/platform/wtf/HashMap.h
@@ -39,8 +39,9 @@ }; // Note: empty or deleted key values are not allowed, using them may lead to -// undefined behavior. For pointer keys this means that null pointers are not -// allowed unless you supply custom key traits. +// undefined behavior. For pointer keys this means that null pointers are not +// allowed; for integer keys 0 or -1 can't be used as a key. This restriction +// can be lifted if you supply custom key traits. template <typename KeyArg, typename MappedArg, typename HashArg = typename DefaultHash<KeyArg>::Hash,
diff --git a/third_party/WebKit/Source/platform/wtf/HashSet.h b/third_party/WebKit/Source/platform/wtf/HashSet.h index 1729e0d8..b4c11c8 100644 --- a/third_party/WebKit/Source/platform/wtf/HashSet.h +++ b/third_party/WebKit/Source/platform/wtf/HashSet.h
@@ -30,8 +30,9 @@ struct IdentityExtractor; // Note: empty or deleted values are not allowed, using them may lead to -// undefined behavior. For pointer valuess this means that null pointers are -// not allowed unless you supply custom traits. +// undefined behavior. For pointer keys this means that null pointers are not +// allowed; for integer keys 0 or -1 can't be used as a key. This restriction +// can be lifted if you supply custom key traits. template <typename ValueArg, typename HashArg = typename DefaultHash<ValueArg>::Hash, typename TraitsArg = HashTraits<ValueArg>,
diff --git a/third_party/WebKit/Source/web/WebFactoryImpl.cpp b/third_party/WebKit/Source/web/WebFactoryImpl.cpp index 0a76029..45d9449 100644 --- a/third_party/WebKit/Source/web/WebFactoryImpl.cpp +++ b/third_party/WebKit/Source/web/WebFactoryImpl.cpp
@@ -26,19 +26,18 @@ WebLocalFrameBase* WebFactoryImpl::CreateMainWebLocalFrameBase( WebView* web_view, WebFrameClient* client, - InterfaceProvider* provider, InterfaceRegistry* registry) const { - return WebLocalFrameImpl::CreateMainFrame(web_view, client, provider, - registry, nullptr, g_empty_atom, + return WebLocalFrameImpl::CreateMainFrame(web_view, client, registry, nullptr, + g_empty_atom, WebSandboxFlags::kNone); } WebLocalFrameBase* WebFactoryImpl::CreateWebLocalFrameBase( WebTreeScopeType type, WebFrameClient* client, - InterfaceProvider* provider, InterfaceRegistry* registry, WebFrame* opener) const { - return WebLocalFrameImpl::Create(type, client, provider, registry, opener); + return WebLocalFrameImpl::Create(type, client, registry, opener); } -} + +} // namespace blink
diff --git a/third_party/WebKit/Source/web/WebFactoryImpl.h b/third_party/WebKit/Source/web/WebFactoryImpl.h index 674a7a5d..9219769 100644 --- a/third_party/WebKit/Source/web/WebFactoryImpl.h +++ b/third_party/WebKit/Source/web/WebFactoryImpl.h
@@ -24,11 +24,9 @@ WebLocalFrameBase* CreateMainWebLocalFrameBase( WebView*, WebFrameClient*, - InterfaceProvider*, InterfaceRegistry*) const override; WebLocalFrameBase* CreateWebLocalFrameBase(WebTreeScopeType, WebFrameClient*, - InterfaceProvider*, InterfaceRegistry*, WebFrame* opener) const override; };
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp index f6317cf7..13dec4e 100644 --- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp +++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
@@ -1496,36 +1496,31 @@ WebLocalFrame* WebLocalFrame::CreateMainFrame( WebView* web_view, WebFrameClient* client, - InterfaceProvider* interface_provider, InterfaceRegistry* interface_registry, WebFrame* opener, const WebString& name, WebSandboxFlags sandbox_flags) { return WebLocalFrameImpl::CreateMainFrame( - web_view, client, interface_provider, interface_registry, opener, name, - sandbox_flags); + web_view, client, interface_registry, opener, name, sandbox_flags); } WebLocalFrame* WebLocalFrame::CreateProvisional( WebFrameClient* client, - InterfaceProvider* interface_provider, InterfaceRegistry* interface_registry, WebRemoteFrame* old_web_frame, WebSandboxFlags flags, WebParsedFeaturePolicy container_policy) { - return WebLocalFrameImpl::CreateProvisional(client, interface_provider, - interface_registry, old_web_frame, - flags, container_policy); + return WebLocalFrameImpl::CreateProvisional( + client, interface_registry, old_web_frame, flags, container_policy); } WebLocalFrameImpl* WebLocalFrameImpl::Create( WebTreeScopeType scope, WebFrameClient* client, - blink::InterfaceProvider* interface_provider, blink::InterfaceRegistry* interface_registry, WebFrame* opener) { - WebLocalFrameImpl* frame = new WebLocalFrameImpl( - scope, client, interface_provider, interface_registry); + WebLocalFrameImpl* frame = + new WebLocalFrameImpl(scope, client, interface_registry); frame->SetOpener(opener); return frame; } @@ -1533,14 +1528,12 @@ WebLocalFrameImpl* WebLocalFrameImpl::CreateMainFrame( WebView* web_view, WebFrameClient* client, - InterfaceProvider* interface_provider, InterfaceRegistry* interface_registry, WebFrame* opener, const WebString& name, WebSandboxFlags sandbox_flags) { - WebLocalFrameImpl* frame = - new WebLocalFrameImpl(WebTreeScopeType::kDocument, client, - interface_provider, interface_registry); + WebLocalFrameImpl* frame = new WebLocalFrameImpl(WebTreeScopeType::kDocument, + client, interface_registry); frame->SetOpener(opener); Page& page = *static_cast<WebViewBase*>(web_view)->GetPage(); DCHECK(!page.MainFrame()); @@ -1553,14 +1546,13 @@ WebLocalFrameImpl* WebLocalFrameImpl::CreateProvisional( WebFrameClient* client, - blink::InterfaceProvider* interface_provider, blink::InterfaceRegistry* interface_registry, WebRemoteFrame* old_web_frame, WebSandboxFlags flags, WebParsedFeaturePolicy container_policy) { DCHECK(client); - WebLocalFrameImpl* web_frame = new WebLocalFrameImpl( - old_web_frame, client, interface_provider, interface_registry); + WebLocalFrameImpl* web_frame = + new WebLocalFrameImpl(old_web_frame, client, interface_registry); Frame* old_frame = ToWebRemoteFrameImpl(old_web_frame)->GetFrame(); web_frame->SetParent(old_web_frame->Parent()); web_frame->SetOpener(old_web_frame->Opener()); @@ -1593,10 +1585,9 @@ WebLocalFrameImpl* WebLocalFrameImpl::CreateLocalChild( WebTreeScopeType scope, WebFrameClient* client, - blink::InterfaceProvider* interface_provider, blink::InterfaceRegistry* interface_registry) { - WebLocalFrameImpl* frame = new WebLocalFrameImpl( - scope, client, interface_provider, interface_registry); + WebLocalFrameImpl* frame = + new WebLocalFrameImpl(scope, client, interface_registry); AppendChild(frame); return frame; } @@ -1604,14 +1595,12 @@ WebLocalFrameImpl::WebLocalFrameImpl( WebTreeScopeType scope, WebFrameClient* client, - blink::InterfaceProvider* interface_provider, blink::InterfaceRegistry* interface_registry) : WebLocalFrameBase(scope), local_frame_client_impl_(LocalFrameClientImpl::Create(this)), client_(client), autofill_client_(0), input_events_scale_factor_for_emulation_(1), - interface_provider_(interface_provider), interface_registry_(interface_registry), web_dev_tools_frontend_(0), input_method_controller_(*this), @@ -1626,13 +1615,11 @@ WebLocalFrameImpl::WebLocalFrameImpl( WebRemoteFrame* old_web_frame, WebFrameClient* client, - blink::InterfaceProvider* interface_provider, blink::InterfaceRegistry* interface_registry) : WebLocalFrameImpl(old_web_frame->InShadowTree() ? WebTreeScopeType::kShadow : WebTreeScopeType::kDocument, client, - interface_provider, interface_registry) {} WebLocalFrameImpl::~WebLocalFrameImpl() { @@ -1664,7 +1651,7 @@ FrameOwner* owner, const AtomicString& name) { SetCoreFrame(LocalFrame::Create(local_frame_client_impl_.Get(), page, owner, - interface_provider_, interface_registry_)); + interface_registry_)); frame_->Tree().SetName(name); // We must call init() after frame_ is assigned because it is referenced // during init().
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.h b/third_party/WebKit/Source/web/WebLocalFrameImpl.h index b1e67a0..4695423 100644 --- a/third_party/WebKit/Source/web/WebLocalFrameImpl.h +++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.h
@@ -241,7 +241,6 @@ // WebLocalFrame methods: WebLocalFrameImpl* CreateLocalChild(WebTreeScopeType, WebFrameClient*, - blink::InterfaceProvider*, blink::InterfaceRegistry*) override; void SetAutofillClient(WebAutofillClient*) override; WebAutofillClient* AutofillClient() override; @@ -335,18 +334,15 @@ static WebLocalFrameImpl* Create(WebTreeScopeType, WebFrameClient*, - InterfaceProvider*, InterfaceRegistry*, WebFrame* opener); static WebLocalFrameImpl* CreateMainFrame(WebView*, WebFrameClient*, - InterfaceProvider*, InterfaceRegistry*, WebFrame* opener, const WebString& name, WebSandboxFlags); static WebLocalFrameImpl* CreateProvisional(WebFrameClient*, - InterfaceProvider*, InterfaceRegistry*, WebRemoteFrame*, WebSandboxFlags, @@ -458,11 +454,9 @@ WebLocalFrameImpl(WebTreeScopeType, WebFrameClient*, - blink::InterfaceProvider*, blink::InterfaceRegistry*); WebLocalFrameImpl(WebRemoteFrame*, WebFrameClient*, - blink::InterfaceProvider*, blink::InterfaceRegistry*); // Inherited from WebFrame, but intentionally hidden: it never makes sense @@ -518,7 +512,6 @@ float input_events_scale_factor_for_emulation_; // Borrowed pointers to Mojo objects. - blink::InterfaceProvider* interface_provider_; blink::InterfaceRegistry* interface_registry_; WebDevToolsFrontendImpl* web_dev_tools_frontend_;
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/common_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/common_unittest.py index 56c3d1d..0bd1c15e5 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/common_unittest.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/common_unittest.py
@@ -83,16 +83,16 @@ def test_commit_that_has_open_pr_is_exportable(self): commit = MockChromiumCommit(MockHost(), change_id='Change-Id: I00decade') github = MockWPTGitHub(pull_requests=[ - PullRequest('PR1', 1, 'body\nChange-Id: I00c0ffee', 'closed'), - PullRequest('PR2', 2, 'body\nChange-Id: I00decade', 'open'), + PullRequest('PR1', 1, 'body\nChange-Id: I00c0ffee', 'closed', []), + PullRequest('PR2', 2, 'body\nChange-Id: I00decade', 'open', []), ]) self.assertTrue(is_exportable(commit, MockLocalWPT(), github)) def test_commit_that_has_closed_pr_is_not_exportable(self): commit = MockChromiumCommit(MockHost(), change_id='Change-Id: I00decade') github = MockWPTGitHub(pull_requests=[ - PullRequest('PR1', 1, 'body\nChange-Id: I00c0ffee', 'closed'), - PullRequest('PR2', 2, 'body\nChange-Id: I00decade', 'closed'), + PullRequest('PR1', 1, 'body\nChange-Id: I00c0ffee', 'closed', []), + PullRequest('PR2', 2, 'body\nChange-Id: I00decade', 'closed', []), ]) self.assertFalse(is_exportable(commit, MockLocalWPT(), github))
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter.py index 6c894c8..25bb5a7 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter.py
@@ -89,8 +89,9 @@ _log.info('[dry_run] Would have attempted to merge PR') return - _log.info('Removing provisional label...') - self.wpt_github.remove_label(pull_request.number, PROVISIONAL_PR_LABEL) + if PROVISIONAL_PR_LABEL in pull_request.labels: + _log.info('Removing provisional label "%s"...', PROVISIONAL_PR_LABEL) + self.wpt_github.remove_label(pull_request.number, PROVISIONAL_PR_LABEL) _log.info('Attempting to merge...')
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter_unittest.py index 3ca537b..0355827 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter_unittest.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter_unittest.py
@@ -28,7 +28,7 @@ test_exporter = TestExporter(host, 'gh-username', 'gh-token', gerrit_user=None, gerrit_token=None, dry_run=True) test_exporter.wpt_github = MockWPTGitHub(pull_requests=[ - PullRequest(title='title1', number=1234, body='', state='open'), + PullRequest(title='title1', number=1234, body='', state='open', labels=[]), ]) test_exporter.gerrit = MockGerritAPI(host, 'gerrit-username', 'gerrit-token') test_exporter.get_exportable_commits = lambda: [ @@ -115,19 +115,22 @@ title='Open PR', number=1234, body='rutabaga\nCr-Commit-Position: refs/heads/master@{#458475}', - state='open' + state='open', + labels=['do not merge yet'] ), PullRequest( title='Merged PR', number=2345, body='rutabaga\nCr-Commit-Position: refs/heads/master@{#458477}', - state='closed' + state='closed', + labels=[] ), PullRequest( title='Open PR', number=3456, body='rutabaga\nCr-Commit-Position: refs/heads/master@{#458478}', - state='open' + state='open', + labels=[] # It's important that this is empty. ), ], unsuccessful_merge_index=0) test_exporter.gerrit = MockGerritAPI(host, 'gerrit-username', 'gerrit-token') @@ -148,7 +151,9 @@ 'add_label "chromium-export"', 'pr_with_position', 'pr_with_position', - 'remove_label "do not merge yet"', + # Testing the lack of remove_label here. The exporter should not + # try to remove the provisional label from PRs it has already + # removed it from. 'get_pr_branch', 'merge_pull_request', 'delete_remote_branch', @@ -199,7 +204,8 @@ gerrit_token=None, dry_run=False) test_exporter.wpt_github = MockWPTGitHub(pull_requests=[ PullRequest(title='title1', number=1234, - body='description\nWPT-Export-Revision: 1', state='open'), + body='description\nWPT-Export-Revision: 1', + state='open', labels=[]), ]) test_exporter.get_exportable_commits = lambda: [] test_exporter.gerrit = MockGerritAPI(host, 'gerrit-username', 'gerrit-token') @@ -228,7 +234,8 @@ gerrit_token=None, dry_run=False) test_exporter.wpt_github = MockWPTGitHub(pull_requests=[ PullRequest(title='title1', number=1234, - body='description\nWPT-Export-Revision: 1', state='open'), + body='description\nWPT-Export-Revision: 1', + state='open', labels=[]), ]) test_exporter.get_exportable_commits = lambda: [] test_exporter.gerrit = MockGerritAPI(host, 'gerrit-username', 'gerrit-token') @@ -277,7 +284,7 @@ test_exporter.wpt_github = MockWPTGitHub(pull_requests=[ PullRequest(title='title1', number=1234, body='description\nWPT-Export-Revision: 9\nChange-Id: decafbad', - state='open'), + state='open', labels=['do not merge yet']), ]) test_exporter.get_exportable_commits = lambda: [ ChromiumCommit(host, sha='c881563d734a86f7d9cd57ac509653a61c45c240'),
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py index 6641d7a..38727022 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py
@@ -20,7 +20,7 @@ def test_main_abort_on_exportable_commit_if_open_pr_found(self): host = MockHost() wpt_github = MockWPTGitHub(pull_requests=[ - PullRequest('Title', 5, 'Commit body\nChange-Id: Iba5eba11', 'open'), + PullRequest('Title', 5, 'Commit body\nChange-Id: Iba5eba11', 'open', []), ]) importer = TestImporter(host, wpt_github=wpt_github) importer.exportable_but_not_exported_commits = lambda _: [
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github.py index ff5e090..b2f099f 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github.py
@@ -123,11 +123,15 @@ WPT_GH_ORG, WPT_GH_REPO_NAME, number, - label, + urllib2.quote(label), ) + _, status_code = self.request(path, method='DELETE') - if status_code != 204: - raise GitHubError('Received non-204 status code attempting to delete remote branch: {}'.format(status_code)) + # The GitHub API documentation claims that this endpoint returns a 204 + # on success. However in reality it returns a 200. + # https://developer.github.com/v3/issues/labels/#remove-a-label-from-an-issue + if status_code not in (200, 204): + raise GitHubError('Received non-200 status code attempting to delete label: {}'.format(status_code)) def in_flight_pull_requests(self): path = '/search/issues?q=repo:{}/{}%20is:open%20type:pr%20label:{}'.format( @@ -142,11 +146,13 @@ raise Exception('Non-200 status code (%s): %s' % (status_code, data)) def make_pr_from_item(self, item): + labels = [label['name'] for label in item['labels']] return PullRequest( title=item['title'], number=item['number'], body=item['body'], - state=item['state']) + state=item['state'], + labels=labels) @memoized def all_pull_requests(self): @@ -267,4 +273,4 @@ pass -PullRequest = namedtuple('PullRequest', ['title', 'number', 'body', 'state']) +PullRequest = namedtuple('PullRequest', ['title', 'number', 'body', 'state', 'labels'])
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github_unittest.py index 5d32b44c..d30d7bdf 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github_unittest.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github_unittest.py
@@ -34,9 +34,9 @@ with self.assertRaises(MergeError): self.wpt_github.merge_pull_request(5678) - def test_remove_label_throws_github_error_on_non_204(self): + def test_remove_label_throws_github_error_on_non_200_or_204(self): self.wpt_github.host.web.responses = [ - {'status_code': 200}, + {'status_code': 201}, ] with self.assertRaises(GitHubError):
diff --git a/third_party/WebKit/public/platform/WebDocumentSubresourceFilter.h b/third_party/WebKit/public/platform/WebDocumentSubresourceFilter.h index 25f6e8c..9ec6052 100644 --- a/third_party/WebKit/public/platform/WebDocumentSubresourceFilter.h +++ b/third_party/WebKit/public/platform/WebDocumentSubresourceFilter.h
@@ -13,6 +13,14 @@ class WebDocumentSubresourceFilter { public: + // This builder class is created on the main thread and passed to a worker + // thread to create the subresource filter for the worker thread. + class Builder { + public: + virtual ~Builder() {} + virtual std::unique_ptr<WebDocumentSubresourceFilter> Build() = 0; + }; + enum LoadPolicy { kAllow, kDisallow, kWouldDisallow }; virtual ~WebDocumentSubresourceFilter() {}
diff --git a/third_party/WebKit/public/platform/WebRuntimeFeatures.h b/third_party/WebKit/public/platform/WebRuntimeFeatures.h index 89c42a6..1ce4008 100644 --- a/third_party/WebKit/public/platform/WebRuntimeFeatures.h +++ b/third_party/WebKit/public/platform/WebRuntimeFeatures.h
@@ -162,6 +162,7 @@ BLINK_PLATFORM_EXPORT static void EnableMediaControlsOverlayPlayButton(bool); BLINK_PLATFORM_EXPORT static void EnableRemotePlaybackBackend(bool); BLINK_PLATFORM_EXPORT static void EnableMediaCastOverlayButton(bool); + BLINK_PLATFORM_EXPORT static void EnableClientPlaceholdersForServerLoFi(bool); private: WebRuntimeFeatures();
diff --git a/third_party/WebKit/public/platform/WebWorkerFetchContext.h b/third_party/WebKit/public/platform/WebWorkerFetchContext.h index d325f0d..ee5cb9f 100644 --- a/third_party/WebKit/public/platform/WebWorkerFetchContext.h +++ b/third_party/WebKit/public/platform/WebWorkerFetchContext.h
@@ -5,7 +5,10 @@ #ifndef WebWorkerFetchContext_h #define WebWorkerFetchContext_h +#include <memory> + #include "public/platform/WebApplicationCacheHost.h" +#include "public/platform/WebDocumentSubresourceFilter.h" #include "public/platform/WebURL.h" namespace base { @@ -16,6 +19,7 @@ class WebURLLoader; class WebURLRequest; +class WebDocumentSubresourceFilter; // WebWorkerFetchContext is a per-worker object created on the main thread, // passed to a worker (dedicated, shared and service worker) and initialized on @@ -60,6 +64,20 @@ virtual int ApplicationCacheHostID() const { return WebApplicationCacheHost::kAppCacheNoHostId; } + + // Sets the builder object of WebDocumentSubresourceFilter on the main thread + // which will be used in TakeSubresourceFilter() to create a + // WebDocumentSubresourceFilter on the worker thread. + virtual void SetSubresourceFilterBuilder( + std::unique_ptr<WebDocumentSubresourceFilter::Builder>) {} + + // Creates a WebDocumentSubresourceFilter on the worker thread using the + // WebDocumentSubresourceFilter::Builder which is set on the main thread. + // This method should only be called once. + virtual std::unique_ptr<WebDocumentSubresourceFilter> + TakeSubresourceFilter() { + return nullptr; + } }; } // namespace blink
diff --git a/third_party/WebKit/public/web/WebFrameClient.h b/third_party/WebKit/public/web/WebFrameClient.h index c16217eb..92a7365 100644 --- a/third_party/WebKit/public/web/WebFrameClient.h +++ b/third_party/WebKit/public/web/WebFrameClient.h
@@ -193,8 +193,9 @@ virtual BlameContext* GetFrameBlameContext() { return nullptr; } // Returns an InterfaceProvider the frame can use to request interfaces from - // the browser. + // the browser. This method may not return nullptr. virtual service_manager::InterfaceProvider* GetInterfaceProvider() { + NOTREACHED(); return nullptr; }
diff --git a/third_party/WebKit/public/web/WebLocalFrame.h b/third_party/WebKit/public/web/WebLocalFrame.h index 8e4c158..7b9db02e 100644 --- a/third_party/WebKit/public/web/WebLocalFrame.h +++ b/third_party/WebKit/public/web/WebLocalFrame.h
@@ -27,7 +27,6 @@ namespace blink { -class InterfaceProvider; class InterfaceRegistry; class WebAssociatedURLLoader; class WebAutofillClient; @@ -77,7 +76,6 @@ BLINK_EXPORT static WebLocalFrame* CreateMainFrame( WebView*, WebFrameClient*, - blink::InterfaceProvider*, blink::InterfaceRegistry*, WebFrame* opener = nullptr, const WebString& name = WebString(), @@ -102,7 +100,6 @@ // frame. BLINK_EXPORT static WebLocalFrame* CreateProvisional( WebFrameClient*, - blink::InterfaceProvider*, blink::InterfaceRegistry*, WebRemoteFrame*, WebSandboxFlags, @@ -113,7 +110,6 @@ // it's no longer needed. virtual WebLocalFrame* CreateLocalChild(WebTreeScopeType, WebFrameClient*, - blink::InterfaceProvider*, blink::InterfaceRegistry*) = 0; // Returns the WebFrame associated with the current V8 context. This
diff --git a/third_party/WebKit/public/web/WebRemoteFrame.h b/third_party/WebKit/public/web/WebRemoteFrame.h index 13482bc..7c78c3e 100644 --- a/third_party/WebKit/public/web/WebRemoteFrame.h +++ b/third_party/WebKit/public/web/WebRemoteFrame.h
@@ -15,7 +15,6 @@ namespace blink { enum class WebTreeScopeType; -class InterfaceProvider; class InterfaceRegistry; class WebFrameClient; class WebLayer; @@ -44,7 +43,6 @@ const WebString& name, WebSandboxFlags, WebFrameClient*, - blink::InterfaceProvider*, blink::InterfaceRegistry*, WebFrame* previous_sibling, const WebParsedFeaturePolicy&,
diff --git a/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h b/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h index 689ba8f..2251c02f 100644 --- a/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h +++ b/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h
@@ -188,6 +188,9 @@ const WebServiceWorkerResponse& response, WebServiceWorkerStreamHandle* body_as_stream, double event_dispatch_time) {} + virtual void RespondToCanMakePaymentEvent(int event_id, + bool can_make_payment, + double event_dispatch_time) {} virtual void RespondToPaymentRequestEvent( int event_id, const WebPaymentAppResponse& response,
diff --git a/third_party/axe-core/LICENSE b/third_party/axe-core/LICENSE new file mode 100644 index 0000000..be2cc4df --- /dev/null +++ b/third_party/axe-core/LICENSE
@@ -0,0 +1,362 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0.
diff --git a/third_party/axe-core/OWNERS b/third_party/axe-core/OWNERS new file mode 100644 index 0000000..1877266f --- /dev/null +++ b/third_party/axe-core/OWNERS
@@ -0,0 +1,2 @@ +aboxhall@chromium.org +hcarmona@chromium.org
diff --git a/third_party/axe-core/README.chromium b/third_party/axe-core/README.chromium new file mode 100644 index 0000000..6bd3e1bb --- /dev/null +++ b/third_party/axe-core/README.chromium
@@ -0,0 +1,20 @@ +Name: AXE-CORE Accessibility Audit +Short Name: axe-core +URL: https://github.com/dequelabs/axe-core/ +Version: 0 +Date: Sun Jun 18 19:21:36 2017 -0400 +Revision: 1986520cdca8ed0f208d2cbd918829b27266a374 +License: MPL 2.0 +License File: LICENSE +Security Critical: no + +Description: +Accessibility engine for automated Web UI testing. This will be used to run +automated accessibility tests in web-ui. + +Local Modifications: + 1 Checked out the origin/shadowDOM branch + 2 Created build + 3 New files: + README.chromium + OWNERS
diff --git a/third_party/axe-core/axe.js b/third_party/axe-core/axe.js new file mode 100644 index 0000000..19c2cbf --- /dev/null +++ b/third_party/axe-core/axe.js
@@ -0,0 +1,9454 @@ +/*! aXe v2.3.1 + * Copyright (c) 2017 Deque Systems, Inc. + * + * Your use of this Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This entire copyright notice must appear in every copy of this file you + * distribute or in any file that contains substantial portions of this source + * code. + */ +(function axeFunction(window) { + var global = window; + var document = window.document; + 'use strict'; + var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj; + }; + var axe = axe || {}; + axe.version = '2.3.1'; + if (typeof define === 'function' && define.amd) { + define([], function() { + 'use strict'; + return axe; + }); + } + if ((typeof module === 'undefined' ? 'undefined' : _typeof(module)) === 'object' && module.exports && typeof axeFunction.toString === 'function') { + axe.source = '(' + axeFunction.toString() + ')(typeof window === "object" ? window : this);'; + module.exports = axe; + } + if (typeof window.getComputedStyle === 'function') { + window.axe = axe; + } + var commons; + function SupportError(error) { + this.name = 'SupportError'; + this.cause = error.cause; + this.message = '`' + error.cause + '` - feature unsupported in your environment.'; + if (error.ruleId) { + this.ruleId = error.ruleId; + this.message += ' Skipping ' + this.ruleId + ' rule.'; + } + this.stack = new Error().stack; + } + SupportError.prototype = Object.create(Error.prototype); + SupportError.prototype.constructor = SupportError; + 'use strict'; + var utils = axe.utils = {}; + 'use strict'; + var helpers = {}; + 'use strict'; + var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj; + }; + function getDefaultConfiguration(audit) { + 'use strict'; + var config; + if (audit) { + config = axe.utils.clone(audit); + config.commons = audit.commons; + } else { + config = {}; + } + config.reporter = config.reporter || null; + config.rules = config.rules || []; + config.checks = config.checks || []; + config.data = Object.assign({ + checks: {}, + rules: {} + }, config.data); + return config; + } + function unpackToObject(collection, audit, method) { + 'use strict'; + var i, l; + for (i = 0, l = collection.length; i < l; i++) { + audit[method](collection[i]); + } + } + function Audit(audit) { + this.brand = 'axe'; + this.application = 'axeAPI'; + this.tagExclude = [ 'experimental' ]; + this.defaultConfig = audit; + this._init(); + } + Audit.prototype._init = function() { + var audit = getDefaultConfiguration(this.defaultConfig); + axe.commons = commons = audit.commons; + this.reporter = audit.reporter; + this.commands = {}; + this.rules = []; + this.checks = {}; + unpackToObject(audit.rules, this, 'addRule'); + unpackToObject(audit.checks, this, 'addCheck'); + this.data = {}; + this.data.checks = audit.data && audit.data.checks || {}; + this.data.rules = audit.data && audit.data.rules || {}; + this.data.failureSummaries = audit.data && audit.data.failureSummaries || {}; + this.data.incompleteFallbackMessage = audit.data && audit.data.incompleteFallbackMessage || ''; + this._constructHelpUrls(); + }; + Audit.prototype.registerCommand = function(command) { + 'use strict'; + this.commands[command.id] = command.callback; + }; + Audit.prototype.addRule = function(spec) { + 'use strict'; + if (spec.metadata) { + this.data.rules[spec.id] = spec.metadata; + } + var rule = this.getRule(spec.id); + if (rule) { + rule.configure(spec); + } else { + this.rules.push(new Rule(spec, this)); + } + }; + Audit.prototype.addCheck = function(spec) { + 'use strict'; + var metadata = spec.metadata; + if ((typeof metadata === 'undefined' ? 'undefined' : _typeof(metadata)) === 'object') { + this.data.checks[spec.id] = metadata; + if (_typeof(metadata.messages) === 'object') { + Object.keys(metadata.messages).filter(function(prop) { + return metadata.messages.hasOwnProperty(prop) && typeof metadata.messages[prop] === 'string'; + }).forEach(function(prop) { + if (metadata.messages[prop].indexOf('function') === 0) { + metadata.messages[prop] = new Function('return ' + metadata.messages[prop] + ';')(); + } + }); + } + } + if (this.checks[spec.id]) { + this.checks[spec.id].configure(spec); + } else { + this.checks[spec.id] = new Check(spec); + } + }; + Audit.prototype.run = function(context, options, resolve, reject) { + 'use strict'; + this.validateOptions(options); + axe._tree = axe.utils.getFlattenedTree(document.body); + var q = axe.utils.queue(); + this.rules.forEach(function(rule) { + if (axe.utils.ruleShouldRun(rule, context, options)) { + if (options.performanceTimer) { + var markEnd = 'mark_rule_end_' + rule.id; + var markStart = 'mark_rule_start_' + rule.id; + axe.utils.performanceTimer.mark(markStart); + } + q.defer(function(res, rej) { + rule.run(context, options, function(out) { + if (options.performanceTimer) { + axe.utils.performanceTimer.mark(markEnd); + axe.utils.performanceTimer.measure('rule_' + rule.id, markStart, markEnd); + } + res(out); + }, function(err) { + if (!options.debug) { + var errResult = Object.assign(new RuleResult(rule), { + result: axe.constants.CANTTELL, + description: 'An error occured while running this rule', + message: err.message, + help: err.stack || err.message, + error: err + }); + res(errResult); + } else { + rej(err); + } + }); + }); + } + }); + q.then(function(results) { + axe._tree = undefined; + resolve(results.filter(function(result) { + return !!result; + })); + }).catch(reject); + }; + Audit.prototype.after = function(results, options) { + 'use strict'; + var rules = this.rules; + return results.map(function(ruleResult) { + var rule = axe.utils.findBy(rules, 'id', ruleResult.id); + return rule.after(ruleResult, options); + }); + }; + Audit.prototype.getRule = function(ruleId) { + return this.rules.find(function(rule) { + return rule.id === ruleId; + }); + }; + Audit.prototype.validateOptions = function(options) { + 'use strict'; + var audit = this; + if (_typeof(options.runOnly) === 'object') { + var only = options.runOnly; + if (only.type === 'rule' && Array.isArray(only.value)) { + only.value.forEach(function(ruleId) { + if (!audit.getRule(ruleId)) { + throw new Error('unknown rule `' + ruleId + '` in options.runOnly'); + } + }); + } else if (Array.isArray(only.value) && only.value.length > 0) { + var tags = [].concat(only.value); + audit.rules.forEach(function(rule) { + var tagPos, i, l; + if (!tags) { + return; + } + for (i = 0, l = rule.tags.length; i < l; i++) { + tagPos = tags.indexOf(rule.tags[i]); + if (tagPos !== -1) { + tags.splice(tagPos, 1); + } + } + }); + if (tags.length !== 0) { + throw new Error('could not find tags `' + tags.join('`, `') + '`'); + } + } + } + if (_typeof(options.rules) === 'object') { + Object.keys(options.rules).forEach(function(ruleId) { + if (!audit.getRule(ruleId)) { + throw new Error('unknown rule `' + ruleId + '` in options.rules'); + } + }); + } + return options; + }; + Audit.prototype.setBranding = function(branding) { + 'use strict'; + var previous = { + brand: this.brand, + application: this.application + }; + if (branding && branding.hasOwnProperty('brand') && branding.brand && typeof branding.brand === 'string') { + this.brand = branding.brand; + } + if (branding && branding.hasOwnProperty('application') && branding.application && typeof branding.application === 'string') { + this.application = branding.application; + } + this._constructHelpUrls(previous); + }; + function getHelpUrl(_ref, ruleId, version) { + var brand = _ref.brand, application = _ref.application; + return axe.constants.helpUrlBase + brand + '/' + (version || axe.version.substring(0, axe.version.lastIndexOf('.'))) + '/' + ruleId + '?application=' + application; + } + Audit.prototype._constructHelpUrls = function() { + var _this = this; + var previous = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var version = axe.version.substring(0, axe.version.lastIndexOf('.')); + this.rules.forEach(function(rule) { + if (!_this.data.rules[rule.id]) { + _this.data.rules[rule.id] = {}; + } + var metaData = _this.data.rules[rule.id]; + if (typeof metaData.helpUrl !== 'string' || previous && metaData.helpUrl === getHelpUrl(previous, rule.id, version)) { + metaData.helpUrl = getHelpUrl(_this, rule.id, version); + } + }); + }; + Audit.prototype.resetRulesAndChecks = function() { + 'use strict'; + this._init(); + }; + 'use strict'; + function CheckResult(check) { + 'use strict'; + this.id = check.id; + this.data = null; + this.relatedNodes = []; + this.result = null; + } + 'use strict'; + function createExecutionContext(spec) { + 'use strict'; + if (typeof spec === 'string') { + return new Function('return ' + spec + ';')(); + } + return spec; + } + function Check(spec) { + if (spec) { + this.id = spec.id; + this.configure(spec); + } + } + Check.prototype.enabled = true; + Check.prototype.run = function(node, options, resolve, reject) { + 'use strict'; + options = options || {}; + var enabled = options.hasOwnProperty('enabled') ? options.enabled : this.enabled, checkOptions = options.options || this.options; + if (enabled) { + var checkResult = new CheckResult(this); + var checkHelper = axe.utils.checkHelper(checkResult, options, resolve, reject); + var result; + try { + result = this.evaluate.call(checkHelper, node.actualNode, checkOptions, node); + } catch (e) { + reject(e); + return; + } + if (!checkHelper.isAsync) { + checkResult.result = result; + setTimeout(function() { + resolve(checkResult); + }, 0); + } + } else { + resolve(null); + } + }; + Check.prototype.configure = function(spec) { + var _this = this; + [ 'options', 'enabled' ].filter(function(prop) { + return spec.hasOwnProperty(prop); + }).forEach(function(prop) { + return _this[prop] = spec[prop]; + }); + [ 'evaluate', 'after' ].filter(function(prop) { + return spec.hasOwnProperty(prop); + }).forEach(function(prop) { + return _this[prop] = createExecutionContext(spec[prop]); + }); + }; + 'use strict'; + var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj; + }; + function pushUniqueFrame(collection, frame) { + 'use strict'; + if (axe.utils.isHidden(frame)) { + return; + } + var fr = axe.utils.findBy(collection, 'node', frame); + if (!fr) { + collection.push({ + node: frame, + include: [], + exclude: [] + }); + } + } + function pushUniqueFrameSelector(context, type, selectorArray) { + 'use strict'; + context.frames = context.frames || []; + var result, frame; + var frames = document.querySelectorAll(selectorArray.shift()); + frameloop: for (var i = 0, l = frames.length; i < l; i++) { + frame = frames[i]; + for (var j = 0, l2 = context.frames.length; j < l2; j++) { + if (context.frames[j].node === frame) { + context.frames[j][type].push(selectorArray); + break frameloop; + } + } + result = { + node: frame, + include: [], + exclude: [] + }; + if (selectorArray) { + result[type].push(selectorArray); + } + context.frames.push(result); + } + } + function normalizeContext(context) { + 'use strict'; + if (context && (typeof context === 'undefined' ? 'undefined' : _typeof(context)) === 'object' || context instanceof NodeList) { + if (context instanceof Node) { + return { + include: [ context ], + exclude: [] + }; + } + if (context.hasOwnProperty('include') || context.hasOwnProperty('exclude')) { + return { + include: context.include && +context.include.length ? context.include : [ document ], + exclude: context.exclude || [] + }; + } + if (context.length === +context.length) { + return { + include: context, + exclude: [] + }; + } + } + if (typeof context === 'string') { + return { + include: [ context ], + exclude: [] + }; + } + return { + include: [ document ], + exclude: [] + }; + } + function parseSelectorArray(context, type) { + 'use strict'; + var item, result = [], nodeList; + for (var i = 0, l = context[type].length; i < l; i++) { + item = context[type][i]; + if (typeof item === 'string') { + nodeList = Array.from(document.querySelectorAll(item)); + result = result.concat(nodeList.map(function(node) { + return axe.utils.getFlattenedTree(node)[0]; + })); + break; + } else if (item && item.length && !(item instanceof Node)) { + if (item.length > 1) { + pushUniqueFrameSelector(context, type, item); + } else { + nodeList = Array.from(document.querySelectorAll(item[0])); + result = result.concat(nodeList.map(function(node) { + return axe.utils.getFlattenedTree(node)[0]; + })); + } + } else if (item instanceof Node) { + result.push(axe.utils.getFlattenedTree(item)[0]); + } + } + return result.filter(function(r) { + return r; + }); + } + function validateContext(context) { + 'use strict'; + if (context.include.length === 0) { + if (context.frames.length === 0) { + var env = axe.utils.respondable.isInFrame() ? 'frame' : 'page'; + return new Error('No elements found for include in ' + env + ' Context'); + } + context.frames.forEach(function(frame, i) { + if (frame.include.length === 0) { + return new Error('No elements found for include in Context of frame ' + i); + } + }); + } + } + function Context(spec) { + 'use strict'; + var self = this; + this.frames = []; + this.initiator = spec && typeof spec.initiator === 'boolean' ? spec.initiator : true; + this.page = false; + spec = normalizeContext(spec); + this.exclude = spec.exclude; + this.include = spec.include; + this.include = parseSelectorArray(this, 'include'); + this.exclude = parseSelectorArray(this, 'exclude'); + axe.utils.select('frame, iframe', this).forEach(function(frame) { + if (isNodeInContext(frame, self)) { + pushUniqueFrame(self.frames, frame.actualNode); + } + }); + if (this.include.length === 1 && this.include[0].actualNode === document.documentElement) { + this.page = true; + } + var err = validateContext(this); + if (err instanceof Error) { + throw err; + } + } + 'use strict'; + function RuleResult(rule) { + 'use strict'; + this.id = rule.id; + this.result = axe.constants.NA; + this.pageLevel = rule.pageLevel; + this.impact = null; + this.nodes = []; + } + 'use strict'; + function Rule(spec, parentAudit) { + 'use strict'; + this._audit = parentAudit; + this.id = spec.id; + this.selector = spec.selector || '*'; + this.excludeHidden = typeof spec.excludeHidden === 'boolean' ? spec.excludeHidden : true; + this.enabled = typeof spec.enabled === 'boolean' ? spec.enabled : true; + this.pageLevel = typeof spec.pageLevel === 'boolean' ? spec.pageLevel : false; + this.any = spec.any || []; + this.all = spec.all || []; + this.none = spec.none || []; + this.tags = spec.tags || []; + if (spec.matches) { + this.matches = createExecutionContext(spec.matches); + } + } + Rule.prototype.matches = function() { + 'use strict'; + return true; + }; + Rule.prototype.gather = function(context) { + 'use strict'; + var elements = axe.utils.select(this.selector, context); + if (this.excludeHidden) { + return elements.filter(function(element) { + return !axe.utils.isHidden(element.actualNode); + }); + } + return elements; + }; + Rule.prototype.runChecks = function(type, node, options, resolve, reject) { + 'use strict'; + var self = this; + var checkQueue = axe.utils.queue(); + this[type].forEach(function(c) { + var check = self._audit.checks[c.id || c]; + var option = axe.utils.getCheckOption(check, self.id, options); + checkQueue.defer(function(res, rej) { + check.run(node, option, res, rej); + }); + }); + checkQueue.then(function(results) { + results = results.filter(function(check) { + return check; + }); + resolve({ + type: type, + results: results + }); + }).catch(reject); + }; + Rule.prototype.run = function(context, options, resolve, reject) { + var _this = this; + var q = axe.utils.queue(); + var ruleResult = new RuleResult(this); + var nodes = void 0; + try { + nodes = this.gather(context).filter(function(node) { + return _this.matches(node.actualNode); + }); + } catch (error) { + reject(new SupportError({ + cause: error, + ruleId: this.id + })); + return; + } + if (options.performanceTimer) { + axe.log('gather (', nodes.length, '):', axe.utils.performanceTimer.timeElapsed() + 'ms'); + } + nodes.forEach(function(node) { + q.defer(function(resolveNode, rejectNode) { + var checkQueue = axe.utils.queue(); + checkQueue.defer(function(res, rej) { + _this.runChecks('any', node, options, res, rej); + }); + checkQueue.defer(function(res, rej) { + _this.runChecks('all', node, options, res, rej); + }); + checkQueue.defer(function(res, rej) { + _this.runChecks('none', node, options, res, rej); + }); + checkQueue.then(function(results) { + if (results.length) { + var hasResults = false, result = {}; + results.forEach(function(r) { + var res = r.results.filter(function(result) { + return result; + }); + result[r.type] = res; + if (res.length) { + hasResults = true; + } + }); + if (hasResults) { + result.node = new axe.utils.DqElement(node.actualNode, options); + ruleResult.nodes.push(result); + } + } + resolveNode(); + }).catch(function(err) { + return rejectNode(err); + }); + }); + }); + q.then(function() { + return resolve(ruleResult); + }).catch(function(error) { + return reject(error); + }); + }; + function findAfterChecks(rule) { + 'use strict'; + return axe.utils.getAllChecks(rule).map(function(c) { + var check = rule._audit.checks[c.id || c]; + return check && typeof check.after === 'function' ? check : null; + }).filter(Boolean); + } + function findCheckResults(nodes, checkID) { + 'use strict'; + var checkResults = []; + nodes.forEach(function(nodeResult) { + var checks = axe.utils.getAllChecks(nodeResult); + checks.forEach(function(checkResult) { + if (checkResult.id === checkID) { + checkResults.push(checkResult); + } + }); + }); + return checkResults; + } + function filterChecks(checks) { + 'use strict'; + return checks.filter(function(check) { + return check.filtered !== true; + }); + } + function sanitizeNodes(result) { + 'use strict'; + var checkTypes = [ 'any', 'all', 'none' ]; + var nodes = result.nodes.filter(function(detail) { + var length = 0; + checkTypes.forEach(function(type) { + detail[type] = filterChecks(detail[type]); + length += detail[type].length; + }); + return length > 0; + }); + if (result.pageLevel && nodes.length) { + nodes = [ nodes.reduce(function(a, b) { + if (a) { + checkTypes.forEach(function(type) { + a[type].push.apply(a[type], b[type]); + }); + return a; + } + }) ]; + } + return nodes; + } + Rule.prototype.after = function(result, options) { + 'use strict'; + var afterChecks = findAfterChecks(this); + var ruleID = this.id; + afterChecks.forEach(function(check) { + var beforeResults = findCheckResults(result.nodes, check.id); + var option = axe.utils.getCheckOption(check, ruleID, options); + var afterResults = check.after(beforeResults, option); + beforeResults.forEach(function(item) { + if (afterResults.indexOf(item) === -1) { + item.filtered = true; + } + }); + }); + result.nodes = sanitizeNodes(result); + return result; + }; + Rule.prototype.configure = function(spec) { + 'use strict'; + if (spec.hasOwnProperty('selector')) { + this.selector = spec.selector; + } + if (spec.hasOwnProperty('excludeHidden')) { + this.excludeHidden = typeof spec.excludeHidden === 'boolean' ? spec.excludeHidden : true; + } + if (spec.hasOwnProperty('enabled')) { + this.enabled = typeof spec.enabled === 'boolean' ? spec.enabled : true; + } + if (spec.hasOwnProperty('pageLevel')) { + this.pageLevel = typeof spec.pageLevel === 'boolean' ? spec.pageLevel : false; + } + if (spec.hasOwnProperty('any')) { + this.any = spec.any; + } + if (spec.hasOwnProperty('all')) { + this.all = spec.all; + } + if (spec.hasOwnProperty('none')) { + this.none = spec.none; + } + if (spec.hasOwnProperty('tags')) { + this.tags = spec.tags; + } + if (spec.hasOwnProperty('matches')) { + if (typeof spec.matches === 'string') { + this.matches = new Function('return ' + spec.matches + ';')(); + } else { + this.matches = spec.matches; + } + } + }; + 'use strict'; + (function(axe) { + var definitions = [ { + name: 'NA', + value: 'inapplicable', + priority: 0, + group: 'inapplicable' + }, { + name: 'PASS', + value: 'passed', + priority: 1, + group: 'passes' + }, { + name: 'CANTTELL', + value: 'cantTell', + priority: 2, + group: 'incomplete' + }, { + name: 'FAIL', + value: 'failed', + priority: 3, + group: 'violations' + } ]; + var constants = { + helpUrlBase: 'https://dequeuniversity.com/rules/', + results: [], + resultGroups: [], + resultGroupMap: {}, + impact: Object.freeze([ 'minor', 'moderate', 'serious', 'critical' ]) + }; + definitions.forEach(function(definition) { + var name = definition.name; + var value = definition.value; + var priority = definition.priority; + var group = definition.group; + constants[name] = value; + constants[name + '_PRIO'] = priority; + constants[name + '_GROUP'] = group; + constants.results[priority] = value; + constants.resultGroups[priority] = group; + constants.resultGroupMap[value] = group; + }); + Object.freeze(constants.results); + Object.freeze(constants.resultGroups); + Object.freeze(constants.resultGroupMap); + Object.freeze(constants); + Object.defineProperty(axe, 'constants', { + value: constants, + enumerable: true, + configurable: false, + writable: false + }); + })(axe); + 'use strict'; + var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj; + }; + axe.log = function() { + 'use strict'; + if ((typeof console === 'undefined' ? 'undefined' : _typeof(console)) === 'object' && console.log) { + Function.prototype.apply.call(console.log, console, arguments); + } + }; + 'use strict'; + var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj; + }; + axe.a11yCheck = function(context, options, callback) { + 'use strict'; + if (typeof options === 'function') { + callback = options; + options = {}; + } + if (!options || (typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object') { + options = {}; + } + var audit = axe._audit; + if (!audit) { + throw new Error('No audit configured'); + } + options.reporter = options.reporter || audit.reporter || 'v2'; + if (options.performanceTimer) { + axe.utils.performanceTimer.start(); + } + var reporter = axe.getReporter(options.reporter); + axe._runRules(context, options, function(results) { + var res = reporter(results, options, callback); + if (res !== undefined) { + if (options.performanceTimer) { + axe.utils.performanceTimer.end(); + } + callback(res); + } + }, axe.log); + }; + 'use strict'; + function cleanupPlugins(resolve, reject) { + 'use strict'; + if (!axe._audit) { + throw new Error('No audit configured'); + } + var q = axe.utils.queue(); + var cleanupErrors = []; + Object.keys(axe.plugins).forEach(function(key) { + q.defer(function(res) { + var rej = function rej(err) { + cleanupErrors.push(err); + res(); + }; + try { + axe.plugins[key].cleanup(res, rej); + } catch (err) { + rej(err); + } + }); + }); + axe.utils.toArray(document.querySelectorAll('frame, iframe')).forEach(function(frame) { + q.defer(function(res, rej) { + return axe.utils.sendCommandToFrame(frame, { + command: 'cleanup-plugin' + }, res, rej); + }); + }); + q.then(function(results) { + if (cleanupErrors.length === 0) { + resolve(results); + } else { + reject(cleanupErrors); + } + }).catch(reject); + } + axe.cleanup = cleanupPlugins; + 'use strict'; + function configureChecksRulesAndBranding(spec) { + 'use strict'; + var audit; + audit = axe._audit; + if (!audit) { + throw new Error('No audit configured'); + } + if (spec.reporter && (typeof spec.reporter === 'function' || reporters[spec.reporter])) { + audit.reporter = spec.reporter; + } + if (spec.checks) { + spec.checks.forEach(function(check) { + audit.addCheck(check); + }); + } + if (spec.rules) { + spec.rules.forEach(function(rule) { + audit.addRule(rule); + }); + } + if (typeof spec.branding !== 'undefined') { + audit.setBranding(spec.branding); + } else { + audit._constructHelpUrls(); + } + if (spec.tagExclude) { + audit.tagExclude = spec.tagExclude; + } + } + axe.configure = configureChecksRulesAndBranding; + 'use strict'; + axe.getRules = function(tags) { + 'use strict'; + tags = tags || []; + var matchingRules = !tags.length ? axe._audit.rules : axe._audit.rules.filter(function(item) { + return !!tags.filter(function(tag) { + return item.tags.indexOf(tag) !== -1; + }).length; + }); + var ruleData = axe._audit.data.rules || {}; + return matchingRules.map(function(matchingRule) { + var rd = ruleData[matchingRule.id] || {}; + return { + ruleId: matchingRule.id, + description: rd.description, + help: rd.help, + helpUrl: rd.helpUrl, + tags: matchingRule.tags + }; + }); + }; + 'use strict'; + function runCommand(data, keepalive, callback) { + 'use strict'; + var resolve = callback; + var reject = function reject(err) { + if (err instanceof Error === false) { + err = new Error(err); + } + callback(err); + }; + var context = data && data.context || {}; + if (context.include && !context.include.length) { + context.include = [ document ]; + } + var options = data && data.options || {}; + switch (data.command) { + case 'rules': + return runRules(context, options, resolve, reject); + + case 'cleanup-plugin': + return cleanupPlugins(resolve, reject); + + default: + if (axe._audit && axe._audit.commands && axe._audit.commands[data.command]) { + return axe._audit.commands[data.command](data, callback); + } + } + } + axe._load = function(audit) { + 'use strict'; + axe.utils.respondable.subscribe('axe.ping', function(data, keepalive, respond) { + respond({ + axe: true + }); + }); + axe.utils.respondable.subscribe('axe.start', runCommand); + axe._audit = new Audit(audit); + }; + 'use strict'; + var axe = axe || {}; + axe.plugins = {}; + function Plugin(spec) { + 'use strict'; + this._run = spec.run; + this._collect = spec.collect; + this._registry = {}; + spec.commands.forEach(function(command) { + axe._audit.registerCommand(command); + }); + } + Plugin.prototype.run = function() { + 'use strict'; + return this._run.apply(this, arguments); + }; + Plugin.prototype.collect = function() { + 'use strict'; + return this._collect.apply(this, arguments); + }; + Plugin.prototype.cleanup = function(done) { + 'use strict'; + var q = axe.utils.queue(); + var that = this; + Object.keys(this._registry).forEach(function(key) { + q.defer(function(done) { + that._registry[key].cleanup(done); + }); + }); + q.then(function() { + done(); + }); + }; + Plugin.prototype.add = function(impl) { + 'use strict'; + this._registry[impl.id] = impl; + }; + axe.registerPlugin = function(plugin) { + 'use strict'; + axe.plugins[plugin.id] = new Plugin(plugin); + }; + 'use strict'; + var reporters = {}; + var defaultReporter; + axe.getReporter = function(reporter) { + 'use strict'; + if (typeof reporter === 'string' && reporters[reporter]) { + return reporters[reporter]; + } + if (typeof reporter === 'function') { + return reporter; + } + return defaultReporter; + }; + axe.addReporter = function registerReporter(name, cb, isDefault) { + 'use strict'; + reporters[name] = cb; + if (isDefault) { + defaultReporter = cb; + } + }; + 'use strict'; + function resetConfiguration() { + 'use strict'; + var audit = axe._audit; + if (!audit) { + throw new Error('No audit configured'); + } + audit.resetRulesAndChecks(); + } + axe.reset = resetConfiguration; + 'use strict'; + function runRules(context, options, resolve, reject) { + 'use strict'; + try { + context = new Context(context); + } catch (e) { + return reject(e); + } + var q = axe.utils.queue(); + var audit = axe._audit; + if (options.performanceTimer) { + axe.utils.performanceTimer.auditStart(); + } + if (context.frames.length && options.iframes !== false) { + q.defer(function(res, rej) { + axe.utils.collectResultsFromFrames(context, options, 'rules', null, res, rej); + }); + } + q.defer(function(res, rej) { + audit.run(context, options, res, rej); + }); + q.then(function(data) { + try { + if (options.performanceTimer) { + axe.utils.performanceTimer.auditEnd(); + } + var results = axe.utils.mergeResults(data.map(function(d) { + return { + results: d + }; + })); + if (context.initiator) { + results = audit.after(results, options); + results.forEach(axe.utils.publishMetaData); + results = results.map(axe.utils.finalizeRuleResult); + } + try { + resolve(results); + } catch (e) { + axe.log(e); + } + } catch (e) { + reject(e); + } + }).catch(reject); + } + axe._runRules = runRules; + 'use strict'; + var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj; + }; + function isContext(potential) { + 'use strict'; + switch (true) { + case typeof potential === 'string': + case Array.isArray(potential): + case Node && potential instanceof Node: + case NodeList && potential instanceof NodeList: + return true; + + case (typeof potential === 'undefined' ? 'undefined' : _typeof(potential)) !== 'object': + return false; + + case potential.include !== undefined: + case potential.exclude !== undefined: + case typeof potential.length === 'number': + return true; + + default: + return false; + } + } + var noop = function noop() {}; + function normalizeRunParams(context, options, callback) { + 'use strict'; + var typeErr = new TypeError('axe.run arguments are invalid'); + if (!isContext(context)) { + if (callback !== undefined) { + throw typeErr; + } + callback = options; + options = context; + context = document; + } + if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object') { + if (callback !== undefined) { + throw typeErr; + } + callback = options; + options = {}; + } + if (typeof callback !== 'function' && callback !== undefined) { + throw typeErr; + } + return { + context: context, + options: options, + callback: callback || noop + }; + } + axe.run = function(context, options, callback) { + 'use strict'; + if (!axe._audit) { + throw new Error('No audit configured'); + } + var args = normalizeRunParams(context, options, callback); + context = args.context; + options = args.options; + callback = args.callback; + options.reporter = options.reporter || axe._audit.reporter || 'v1'; + if (options.performanceTimer) { + axe.utils.performanceTimer.start(); + } + var p = void 0; + var reject = noop; + var resolve = noop; + if (window.Promise && callback === noop) { + p = new Promise(function(_resolve, _reject) { + reject = _reject; + resolve = _resolve; + }); + } + axe._runRules(context, options, function(rawResults) { + var respond = function respond(results) { + try { + callback(null, results); + } catch (e) { + axe.log(e); + } + resolve(results); + }; + if (options.performanceTimer) { + axe.utils.performanceTimer.end(); + } + try { + var reporter = axe.getReporter(options.reporter); + var results = reporter(rawResults, options, respond); + if (results !== undefined) { + respond(results); + } + } catch (err) { + callback(err); + reject(err); + } + }, function(err) { + callback(err); + reject(err); + }); + return p; + }; + 'use strict'; + helpers.failureSummary = function failureSummary(nodeData) { + 'use strict'; + var failingChecks = {}; + failingChecks.none = nodeData.none.concat(nodeData.all); + failingChecks.any = nodeData.any; + return Object.keys(failingChecks).map(function(key) { + if (!failingChecks[key].length) { + return; + } + var sum = axe._audit.data.failureSummaries[key]; + if (sum && typeof sum.failureMessage === 'function') { + return sum.failureMessage(failingChecks[key].map(function(check) { + return check.message || ''; + })); + } + }).filter(function(i) { + return i !== undefined; + }).join('\n\n'); + }; + 'use strict'; + helpers.incompleteFallbackMessage = function incompleteFallbackMessage() { + 'use strict'; + return axe._audit.data.incompleteFallbackMessage(); + }; + 'use strict'; + var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj; + }; + function normalizeRelatedNodes(node, options) { + 'use strict'; + [ 'any', 'all', 'none' ].forEach(function(type) { + if (!Array.isArray(node[type])) { + return; + } + node[type].filter(function(checkRes) { + return Array.isArray(checkRes.relatedNodes); + }).forEach(function(checkRes) { + checkRes.relatedNodes = checkRes.relatedNodes.map(function(relatedNode) { + var res = { + html: relatedNode.source + }; + if (options.elementRef && !relatedNode.fromFrame) { + res.element = relatedNode.element; + } + if (options.selectors !== false || relatedNode.fromFrame) { + res.target = relatedNode.selector; + } + if (options.xpath) { + res.xpath = relatedNode.xpath; + } + return res; + }); + }); + }); + } + var resultKeys = axe.constants.resultGroups; + helpers.processAggregate = function(results, options) { + var resultObject = axe.utils.aggregateResult(results); + resultObject.timestamp = new Date().toISOString(); + resultObject.url = window.location.href; + resultKeys.forEach(function(key) { + resultObject[key] = (resultObject[key] || []).map(function(ruleResult) { + ruleResult = Object.assign({}, ruleResult); + if (Array.isArray(ruleResult.nodes) && ruleResult.nodes.length > 0) { + ruleResult.nodes = ruleResult.nodes.map(function(subResult) { + if (_typeof(subResult.node) === 'object') { + subResult.html = subResult.node.source; + if (options.elementRef && !subResult.node.fromFrame) { + subResult.element = subResult.node.element; + } + if (options.selectors !== false || subResult.node.fromFrame) { + subResult.target = subResult.node.selector; + } + if (options.xpath) { + subResult.xpath = subResult.node.xpath; + } + } + delete subResult.result; + delete subResult.node; + normalizeRelatedNodes(subResult, options); + return subResult; + }); + } + resultKeys.forEach(function(key) { + return delete ruleResult[key]; + }); + delete ruleResult.pageLevel; + delete ruleResult.result; + return ruleResult; + }); + }); + return resultObject; + }; + 'use strict'; + axe.addReporter('na', function(results, options, callback) { + 'use strict'; + if (typeof options === 'function') { + callback = options; + options = {}; + } + var out = helpers.processAggregate(results, options); + callback({ + violations: out.violations, + passes: out.passes, + incomplete: out.incomplete, + inapplicable: out.inapplicable, + timestamp: out.timestamp, + url: out.url + }); + }); + 'use strict'; + axe.addReporter('no-passes', function(results, options, callback) { + 'use strict'; + if (typeof options === 'function') { + callback = options; + options = {}; + } + var out = helpers.processAggregate(results, options); + callback({ + violations: out.violations, + timestamp: out.timestamp, + url: out.url + }); + }); + 'use strict'; + axe.addReporter('raw', function(results, options, callback) { + 'use strict'; + if (typeof options === 'function') { + callback = options; + options = {}; + } + callback(results); + }); + 'use strict'; + axe.addReporter('v1', function(results, options, callback) { + 'use strict'; + if (typeof options === 'function') { + callback = options; + options = {}; + } + var out = helpers.processAggregate(results, options); + out.violations.forEach(function(result) { + return result.nodes.forEach(function(nodeResult) { + nodeResult.failureSummary = helpers.failureSummary(nodeResult); + }); + }); + callback({ + violations: out.violations, + passes: out.passes, + incomplete: out.incomplete, + inapplicable: out.inapplicable, + timestamp: out.timestamp, + url: out.url + }); + }); + 'use strict'; + axe.addReporter('v2', function(results, options, callback) { + 'use strict'; + if (typeof options === 'function') { + callback = options; + options = {}; + } + var out = helpers.processAggregate(results, options); + callback({ + violations: out.violations, + passes: out.passes, + incomplete: out.incomplete, + inapplicable: out.inapplicable, + timestamp: out.timestamp, + url: out.url + }); + }, true); + 'use strict'; + axe.utils.aggregate = function(map, values, initial) { + values = values.slice(); + if (initial) { + values.push(initial); + } + var sorting = values.map(function(val) { + return map.indexOf(val); + }).sort(); + return map[sorting.pop()]; + }; + 'use strict'; + var checkMap = []; + checkMap[axe.constants.PASS_PRIO] = true; + checkMap[axe.constants.CANTTELL_PRIO] = null; + checkMap[axe.constants.FAIL_PRIO] = false; + var checkTypes = [ 'any', 'all', 'none' ]; + function anyAllNone(obj, functor) { + return checkTypes.reduce(function(out, type) { + out[type] = (obj[type] || []).map(function(val) { + return functor(val, type); + }); + return out; + }, {}); + } + axe.utils.aggregateChecks = function(nodeResOriginal) { + var nodeResult = Object.assign({}, nodeResOriginal); + anyAllNone(nodeResult, function(check, type) { + var i = checkMap.indexOf(check.result); + check.priority = i !== -1 ? i : axe.constants.CANTTELL_PRIO; + if (type === 'none') { + check.priority = 4 - check.priority; + } + }); + var priorities = anyAllNone(nodeResult, function(c) { + return c.priority; + }); + nodeResult.priority = Math.max(priorities.all.reduce(function(a, b) { + return Math.max(a, b); + }, 0), priorities.none.reduce(function(a, b) { + return Math.max(a, b); + }, 0), priorities.any.reduce(function(a, b) { + return Math.min(a, b); + }, 4) % 4); + var impacts = []; + checkTypes.forEach(function(type) { + nodeResult[type] = nodeResult[type].filter(function(check) { + return check.priority === nodeResult.priority; + }); + nodeResult[type].forEach(function(check) { + return impacts.push(check.impact); + }); + }); + if (nodeResult.priority === axe.constants.FAIL_PRIO) { + nodeResult.impact = axe.utils.aggregate(axe.constants.impact, impacts); + } else { + nodeResult.impact = null; + } + anyAllNone(nodeResult, function(c) { + delete c.result; + delete c.priority; + }); + nodeResult.result = axe.constants.results[nodeResult.priority]; + delete nodeResult.priority; + return nodeResult; + }; + 'use strict'; + function copyToGroup(resultObject, subResult, group) { + var resultCopy = Object.assign({}, subResult); + resultCopy.nodes = (resultCopy[group] || []).concat(); + axe.constants.resultGroups.forEach(function(group) { + delete resultCopy[group]; + }); + resultObject[group].push(resultCopy); + } + axe.utils.aggregateResult = function(results) { + var resultObject = {}; + axe.constants.resultGroups.forEach(function(groupName) { + return resultObject[groupName] = []; + }); + results.forEach(function(subResult) { + if (subResult.error) { + copyToGroup(resultObject, subResult, axe.constants.CANTTELL_GROUP); + } else if (subResult.result === axe.constants.NA) { + copyToGroup(resultObject, subResult, axe.constants.NA_GROUP); + } else { + axe.constants.resultGroups.forEach(function(group) { + if (Array.isArray(subResult[group]) && subResult[group].length > 0) { + copyToGroup(resultObject, subResult, group); + } + }); + } + }); + return resultObject; + }; + 'use strict'; + (function() { + axe.utils.aggregateRule = function(subResults) { + var ruleResult = {}; + subResults = subResults.map(function(subResult) { + if (subResult.any && subResult.all && subResult.none) { + return axe.utils.aggregateChecks(subResult); + } else if (Array.isArray(subResult.node)) { + return axe.utils.finalizeRuleResult(subResult); + } else { + throw new TypeError('Invalid Result type'); + } + }); + var resultList = subResults.map(function(node) { + return node.result; + }); + ruleResult.result = axe.utils.aggregate(axe.constants.results, resultList, ruleResult.result); + axe.constants.resultGroups.forEach(function(group) { + return ruleResult[group] = []; + }); + subResults.forEach(function(subResult) { + var groupName = axe.constants.resultGroupMap[subResult.result]; + ruleResult[groupName].push(subResult); + }); + var failGroup = axe.constants.FAIL_GROUP; + if (ruleResult[failGroup].length > 0) { + var impactList = ruleResult[failGroup].map(function(failure) { + return failure.impact; + }); + ruleResult.impact = axe.utils.aggregate(axe.constants.impact, impactList) || null; + } else { + ruleResult.impact = null; + } + return ruleResult; + }; + })(); + 'use strict'; + function areStylesSet(el, styles, stopAt) { + 'use strict'; + var styl = window.getComputedStyle(el, null); + var set = false; + if (!styl) { + return false; + } + styles.forEach(function(att) { + if (styl.getPropertyValue(att.property) === att.value) { + set = true; + } + }); + if (set) { + return true; + } + if (el.nodeName.toUpperCase() === stopAt.toUpperCase() || !el.parentNode) { + return false; + } + return areStylesSet(el.parentNode, styles, stopAt); + } + axe.utils.areStylesSet = areStylesSet; + 'use strict'; + axe.utils.checkHelper = function checkHelper(checkResult, options, resolve, reject) { + 'use strict'; + return { + isAsync: false, + async: function async() { + this.isAsync = true; + return function(result) { + if (result instanceof Error === false) { + checkResult.value = result; + resolve(checkResult); + } else { + reject(result); + } + }; + }, + data: function data(_data) { + checkResult.data = _data; + }, + relatedNodes: function relatedNodes(nodes) { + nodes = nodes instanceof Node ? [ nodes ] : axe.utils.toArray(nodes); + checkResult.relatedNodes = nodes.map(function(element) { + return new axe.utils.DqElement(element, options); + }); + } + }; + }; + 'use strict'; + var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj; + }; + axe.utils.clone = function(obj) { + 'use strict'; + var index, length, out = obj; + if (obj !== null && (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object') { + if (Array.isArray(obj)) { + out = []; + for (index = 0, length = obj.length; index < length; index++) { + out[index] = axe.utils.clone(obj[index]); + } + } else { + out = {}; + for (index in obj) { + out[index] = axe.utils.clone(obj[index]); + } + } + } + return out; + }; + 'use strict'; + function err(message, node) { + 'use strict'; + return new Error(message + ': ' + axe.utils.getSelector(node)); + } + axe.utils.sendCommandToFrame = function(node, parameters, resolve, reject) { + 'use strict'; + var win = node.contentWindow; + if (!win) { + axe.log('Frame does not have a content window', node); + resolve(null); + return; + } + var timeout = setTimeout(function() { + timeout = setTimeout(function() { + var errMsg = err('No response from frame', node); + if (!parameters.debug) { + axe.log(errMsg); + resolve(null); + } else { + reject(errMsg); + } + }, 0); + }, 500); + axe.utils.respondable(win, 'axe.ping', null, undefined, function() { + clearTimeout(timeout); + timeout = setTimeout(function() { + reject(err('Axe in frame timed out', node)); + }, 3e4); + axe.utils.respondable(win, 'axe.start', parameters, undefined, function(data) { + clearTimeout(timeout); + if (data instanceof Error === false) { + resolve(data); + } else { + reject(data); + } + }); + }); + }; + function collectResultsFromFrames(context, options, command, parameter, resolve, reject) { + 'use strict'; + var q = axe.utils.queue(); + var frames = context.frames; + frames.forEach(function(frame) { + var params = { + options: options, + command: command, + parameter: parameter, + context: { + initiator: false, + page: context.page, + include: frame.include || [], + exclude: frame.exclude || [] + } + }; + q.defer(function(res, rej) { + var node = frame.node; + axe.utils.sendCommandToFrame(node, params, function(data) { + if (data) { + return res({ + results: data, + frameElement: node, + frame: axe.utils.getSelector(node) + }); + } + res(null); + }, rej); + }); + }); + q.then(function(data) { + resolve(axe.utils.mergeResults(data, options)); + }).catch(reject); + } + axe.utils.collectResultsFromFrames = collectResultsFromFrames; + 'use strict'; + axe.utils.contains = function(node, otherNode) { + 'use strict'; + function containsShadowChild(node, otherNode) { + if (node.shadowId === otherNode.shadowId) { + return true; + } + return !!node.children.find(function(child) { + return containsShadowChild(child, otherNode); + }); + } + if (node.shadowId || otherNode.shadowId) { + return containsShadowChild(node, otherNode); + } + if (typeof node.actualNode.contains === 'function') { + return node.actualNode.contains(otherNode.actualNode); + } + return !!(node.actualNode.compareDocumentPosition(otherNode.actualNode) & 16); + }; + 'use strict'; + (function(axe) { + /*! + * The copyright below covers the code within this function block only + * + * Copyright (c) 2013 Dulin Marat + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + function CssSelectorParser() { + this.pseudos = {}; + this.attrEqualityMods = {}; + this.ruleNestingOperators = {}; + this.substitutesEnabled = false; + } + CssSelectorParser.prototype.registerSelectorPseudos = function(name) { + for (var j = 0, len = arguments.length; j < len; j++) { + name = arguments[j]; + this.pseudos[name] = 'selector'; + } + return this; + }; + CssSelectorParser.prototype.unregisterSelectorPseudos = function(name) { + for (var j = 0, len = arguments.length; j < len; j++) { + name = arguments[j]; + delete this.pseudos[name]; + } + return this; + }; + CssSelectorParser.prototype.registerNumericPseudos = function(name) { + for (var j = 0, len = arguments.length; j < len; j++) { + name = arguments[j]; + this.pseudos[name] = 'numeric'; + } + return this; + }; + CssSelectorParser.prototype.unregisterNumericPseudos = function(name) { + for (var j = 0, len = arguments.length; j < len; j++) { + name = arguments[j]; + delete this.pseudos[name]; + } + return this; + }; + CssSelectorParser.prototype.registerNestingOperators = function(operator) { + for (var j = 0, len = arguments.length; j < len; j++) { + operator = arguments[j]; + this.ruleNestingOperators[operator] = true; + } + return this; + }; + CssSelectorParser.prototype.unregisterNestingOperators = function(operator) { + for (var j = 0, len = arguments.length; j < len; j++) { + operator = arguments[j]; + delete this.ruleNestingOperators[operator]; + } + return this; + }; + CssSelectorParser.prototype.registerAttrEqualityMods = function(mod) { + for (var j = 0, len = arguments.length; j < len; j++) { + mod = arguments[j]; + this.attrEqualityMods[mod] = true; + } + return this; + }; + CssSelectorParser.prototype.unregisterAttrEqualityMods = function(mod) { + for (var j = 0, len = arguments.length; j < len; j++) { + mod = arguments[j]; + delete this.attrEqualityMods[mod]; + } + return this; + }; + CssSelectorParser.prototype.enableSubstitutes = function() { + this.substitutesEnabled = true; + return this; + }; + CssSelectorParser.prototype.disableSubstitutes = function() { + this.substitutesEnabled = false; + return this; + }; + function isIdentStart(c) { + return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c === '-' || c === '_'; + } + function isIdent(c) { + return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9' || c === '-' || c === '_'; + } + function isHex(c) { + return c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F' || c >= '0' && c <= '9'; + } + function isDecimal(c) { + return c >= '0' && c <= '9'; + } + function isAttrMatchOperator(chr) { + return chr === '=' || chr === '^' || chr === '$' || chr === '*' || chr === '~'; + } + var identSpecialChars = { + '!': true, + '"': true, + '#': true, + $: true, + '%': true, + '&': true, + '\'': true, + '(': true, + ')': true, + '*': true, + '+': true, + ',': true, + '.': true, + '/': true, + ';': true, + '<': true, + '=': true, + '>': true, + '?': true, + '@': true, + '[': true, + '\\': true, + ']': true, + '^': true, + '`': true, + '{': true, + '|': true, + '}': true, + '~': true + }; + var strReplacementsRev = { + '\n': '\\n', + '\r': '\\r', + '\t': '\\t', + '\f': '\\f', + '\v': '\\v' + }; + var singleQuoteEscapeChars = { + n: '\n', + r: '\r', + t: '\t', + f: '\f', + '\\': '\\', + '\'': '\'' + }; + var doubleQuotesEscapeChars = { + n: '\n', + r: '\r', + t: '\t', + f: '\f', + '\\': '\\', + '"': '"' + }; + function ParseContext(str, pos, pseudos, attrEqualityMods, ruleNestingOperators, substitutesEnabled) { + var chr, getIdent, getStr, l, skipWhitespace; + l = str.length; + chr = null; + getStr = function getStr(quote, escapeTable) { + var esc, hex, result; + result = ''; + pos++; + chr = str.charAt(pos); + while (pos < l) { + if (chr === quote) { + pos++; + return result; + } else if (chr === '\\') { + pos++; + chr = str.charAt(pos); + if (chr === quote) { + result += quote; + } else if (esc = escapeTable[chr]) { + result += esc; + } else if (isHex(chr)) { + hex = chr; + pos++; + chr = str.charAt(pos); + while (isHex(chr)) { + hex += chr; + pos++; + chr = str.charAt(pos); + } + if (chr === ' ') { + pos++; + chr = str.charAt(pos); + } + result += String.fromCharCode(parseInt(hex, 16)); + continue; + } else { + result += chr; + } + } else { + result += chr; + } + pos++; + chr = str.charAt(pos); + } + return result; + }; + getIdent = function getIdent() { + var result = ''; + chr = str.charAt(pos); + while (pos < l) { + if (isIdent(chr)) { + result += chr; + } else if (chr === '\\') { + pos++; + if (pos >= l) { + throw Error('Expected symbol but end of file reached.'); + } + chr = str.charAt(pos); + if (identSpecialChars[chr]) { + result += chr; + } else if (isHex(chr)) { + var hex = chr; + pos++; + chr = str.charAt(pos); + while (isHex(chr)) { + hex += chr; + pos++; + chr = str.charAt(pos); + } + if (chr === ' ') { + pos++; + chr = str.charAt(pos); + } + result += String.fromCharCode(parseInt(hex, 16)); + continue; + } else { + result += chr; + } + } else { + return result; + } + pos++; + chr = str.charAt(pos); + } + return result; + }; + skipWhitespace = function skipWhitespace() { + chr = str.charAt(pos); + var result = false; + while (chr === ' ' || chr === '\t' || chr === '\n' || chr === '\r' || chr === '\f') { + result = true; + pos++; + chr = str.charAt(pos); + } + return result; + }; + this.parse = function() { + var res = this.parseSelector(); + if (pos < l) { + throw Error('Rule expected but "' + str.charAt(pos) + '" found.'); + } + return res; + }; + this.parseSelector = function() { + var res; + var selector = res = this.parseSingleSelector(); + chr = str.charAt(pos); + while (chr === ',') { + pos++; + skipWhitespace(); + if (res.type !== 'selectors') { + res = { + type: 'selectors', + selectors: [ selector ] + }; + } + selector = this.parseSingleSelector(); + if (!selector) { + throw Error('Rule expected after ",".'); + } + res.selectors.push(selector); + } + return res; + }; + this.parseSingleSelector = function() { + skipWhitespace(); + var selector = { + type: 'ruleSet' + }; + var rule = this.parseRule(); + if (!rule) { + return null; + } + var currentRule = selector; + while (rule) { + rule.type = 'rule'; + currentRule.rule = rule; + currentRule = rule; + skipWhitespace(); + chr = str.charAt(pos); + if (pos >= l || chr === ',' || chr === ')') { + break; + } + if (ruleNestingOperators[chr]) { + var op = chr; + pos++; + skipWhitespace(); + rule = this.parseRule(); + if (!rule) { + throw Error('Rule expected after "' + op + '".'); + } + rule.nestingOperator = op; + } else { + rule = this.parseRule(); + if (rule) { + rule.nestingOperator = null; + } + } + } + return selector; + }; + this.parseRule = function() { + var rule = null; + while (pos < l) { + chr = str.charAt(pos); + if (chr === '*') { + pos++; + (rule = rule || {}).tagName = '*'; + } else if (isIdentStart(chr) || chr === '\\') { + (rule = rule || {}).tagName = getIdent(); + } else if (chr === '.') { + pos++; + rule = rule || {}; + (rule.classNames = rule.classNames || []).push(getIdent()); + } else if (chr === '#') { + pos++; + (rule = rule || {}).id = getIdent(); + } else if (chr === '[') { + pos++; + skipWhitespace(); + var attr = { + name: getIdent() + }; + skipWhitespace(); + if (chr === ']') { + pos++; + } else { + var operator = ''; + if (attrEqualityMods[chr]) { + operator = chr; + pos++; + chr = str.charAt(pos); + } + if (pos >= l) { + throw Error('Expected "=" but end of file reached.'); + } + if (chr !== '=') { + throw Error('Expected "=" but "' + chr + '" found.'); + } + attr.operator = operator + '='; + pos++; + skipWhitespace(); + var attrValue = ''; + attr.valueType = 'string'; + if (chr === '"') { + attrValue = getStr('"', doubleQuotesEscapeChars); + } else if (chr === '\'') { + attrValue = getStr('\'', singleQuoteEscapeChars); + } else if (substitutesEnabled && chr === '$') { + pos++; + attrValue = getIdent(); + attr.valueType = 'substitute'; + } else { + while (pos < l) { + if (chr === ']') { + break; + } + attrValue += chr; + pos++; + chr = str.charAt(pos); + } + attrValue = attrValue.trim(); + } + skipWhitespace(); + if (pos >= l) { + throw Error('Expected "]" but end of file reached.'); + } + if (chr !== ']') { + throw Error('Expected "]" but "' + chr + '" found.'); + } + pos++; + attr.value = attrValue; + } + rule = rule || {}; + (rule.attrs = rule.attrs || []).push(attr); + } else if (chr === ':') { + pos++; + var pseudoName = getIdent(); + var pseudo = { + name: pseudoName + }; + if (chr === '(') { + pos++; + var value = ''; + skipWhitespace(); + if (pseudos[pseudoName] === 'selector') { + pseudo.valueType = 'selector'; + value = this.parseSelector(); + } else { + pseudo.valueType = pseudos[pseudoName] || 'string'; + if (chr === '"') { + value = getStr('"', doubleQuotesEscapeChars); + } else if (chr === '\'') { + value = getStr('\'', singleQuoteEscapeChars); + } else if (substitutesEnabled && chr === '$') { + pos++; + value = getIdent(); + pseudo.valueType = 'substitute'; + } else { + while (pos < l) { + if (chr === ')') { + break; + } + value += chr; + pos++; + chr = str.charAt(pos); + } + value = value.trim(); + } + skipWhitespace(); + } + if (pos >= l) { + throw Error('Expected ")" but end of file reached.'); + } + if (chr !== ')') { + throw Error('Expected ")" but "' + chr + '" found.'); + } + pos++; + pseudo.value = value; + } + rule = rule || {}; + (rule.pseudos = rule.pseudos || []).push(pseudo); + } else { + break; + } + } + return rule; + }; + return this; + } + CssSelectorParser.prototype.parse = function(str) { + var context = new ParseContext(str, 0, this.pseudos, this.attrEqualityMods, this.ruleNestingOperators, this.substitutesEnabled); + return context.parse(); + }; + CssSelectorParser.prototype.escapeIdentifier = function(s) { + var result = ''; + var i = 0; + var len = s.length; + while (i < len) { + var chr = s.charAt(i); + if (identSpecialChars[chr]) { + result += '\\' + chr; + } else { + if (!(chr === '_' || chr === '-' || chr >= 'A' && chr <= 'Z' || chr >= 'a' && chr <= 'z' || i !== 0 && chr >= '0' && chr <= '9')) { + var charCode = chr.charCodeAt(0); + if ((charCode & 63488) === 55296) { + var extraCharCode = s.charCodeAt(i++); + if ((charCode & 64512) !== 55296 || (extraCharCode & 64512) !== 56320) { + throw Error('UCS-2(decode): illegal sequence'); + } + charCode = ((charCode & 1023) << 10) + (extraCharCode & 1023) + 65536; + } + result += '\\' + charCode.toString(16) + ' '; + } else { + result += chr; + } + } + i++; + } + return result; + }; + CssSelectorParser.prototype.escapeStr = function(s) { + var result = ''; + var i = 0; + var len = s.length; + var chr, replacement; + while (i < len) { + chr = s.charAt(i); + if (chr === '"') { + chr = '\\"'; + } else if (chr === '\\') { + chr = '\\\\'; + } else if (replacement = strReplacementsRev[chr]) { + chr = replacement; + } + result += chr; + i++; + } + return '"' + result + '"'; + }; + CssSelectorParser.prototype.render = function(path) { + return this._renderEntity(path).trim(); + }; + CssSelectorParser.prototype._renderEntity = function(entity) { + var currentEntity, parts, res; + res = ''; + switch (entity.type) { + case 'ruleSet': + currentEntity = entity.rule; + parts = []; + while (currentEntity) { + if (currentEntity.nestingOperator) { + parts.push(currentEntity.nestingOperator); + } + parts.push(this._renderEntity(currentEntity)); + currentEntity = currentEntity.rule; + } + res = parts.join(' '); + break; + + case 'selectors': + res = entity.selectors.map(this._renderEntity, this).join(', '); + break; + + case 'rule': + if (entity.tagName) { + if (entity.tagName === '*') { + res = '*'; + } else { + res = this.escapeIdentifier(entity.tagName); + } + } + if (entity.id) { + res += '#' + this.escapeIdentifier(entity.id); + } + if (entity.classNames) { + res += entity.classNames.map(function(cn) { + return '.' + this.escapeIdentifier(cn); + }, this).join(''); + } + if (entity.attrs) { + res += entity.attrs.map(function(attr) { + if (attr.operator) { + if (attr.valueType === 'substitute') { + return '[' + this.escapeIdentifier(attr.name) + attr.operator + '$' + attr.value + ']'; + } else { + return '[' + this.escapeIdentifier(attr.name) + attr.operator + this.escapeStr(attr.value) + ']'; + } + } else { + return '[' + this.escapeIdentifier(attr.name) + ']'; + } + }, this).join(''); + } + if (entity.pseudos) { + res += entity.pseudos.map(function(pseudo) { + if (pseudo.valueType) { + if (pseudo.valueType === 'selector') { + return ':' + this.escapeIdentifier(pseudo.name) + '(' + this._renderEntity(pseudo.value) + ')'; + } else if (pseudo.valueType === 'substitute') { + return ':' + this.escapeIdentifier(pseudo.name) + '($' + pseudo.value + ')'; + } else if (pseudo.valueType === 'numeric') { + return ':' + this.escapeIdentifier(pseudo.name) + '(' + pseudo.value + ')'; + } else { + return ':' + this.escapeIdentifier(pseudo.name) + '(' + this.escapeIdentifier(pseudo.value) + ')'; + } + } else { + return ':' + this.escapeIdentifier(pseudo.name); + } + }, this).join(''); + } + break; + + default: + throw Error('Unknown entity type: "' + entity.type(+'".')); + } + return res; + }; + var parser = new CssSelectorParser(); + parser.registerNestingOperators('>'); + axe.utils.cssParser = parser; + })(axe); + 'use strict'; + function truncate(str, maxLength) { + maxLength = maxLength || 300; + if (str.length > maxLength) { + var index = str.indexOf('>'); + str = str.substring(0, index + 1); + } + return str; + } + function getSource(element) { + var source = element.outerHTML; + if (!source && typeof XMLSerializer === 'function') { + source = new XMLSerializer().serializeToString(element); + } + return truncate(source || ''); + } + function DqElement(element, options, spec) { + this._fromFrame = !!spec; + this.spec = spec || {}; + if (options && options.absolutePaths) { + this._options = { + toRoot: true + }; + } + this.source = this.spec.source !== undefined ? this.spec.source : getSource(element); + this._element = element; + } + DqElement.prototype = { + get selector() { + return this.spec.selector || [ axe.utils.getSelector(this.element, this._options) ]; + }, + get xpath() { + return this.spec.xpath || [ axe.utils.getXpath(this.element) ]; + }, + get element() { + return this._element; + }, + get fromFrame() { + return this._fromFrame; + }, + toJSON: function toJSON() { + 'use strict'; + return { + selector: this.selector, + source: this.source, + xpath: this.xpath + }; + } + }; + DqElement.fromFrame = function(node, options, frame) { + node.selector.unshift(frame.selector); + node.xpath.unshift(frame.xpath); + return new axe.utils.DqElement(frame.element, options, node); + }; + axe.utils.DqElement = DqElement; + 'use strict'; + axe.utils.matchesSelector = function() { + 'use strict'; + var method; + function getMethod(win) { + var index, candidate, elProto = win.Element.prototype, candidates = [ 'matches', 'matchesSelector', 'mozMatchesSelector', 'webkitMatchesSelector', 'msMatchesSelector' ], length = candidates.length; + for (index = 0; index < length; index++) { + candidate = candidates[index]; + if (elProto[candidate]) { + return candidate; + } + } + } + return function(node, selector) { + if (!method || !node[method]) { + method = getMethod(node.ownerDocument.defaultView); + } + return node[method](selector); + }; + }(); + 'use strict'; + axe.utils.escapeSelector = function(value) { + 'use strict'; + var string = String(value); + var length = string.length; + var index = -1; + var codeUnit; + var result = ''; + var firstCodeUnit = string.charCodeAt(0); + while (++index < length) { + codeUnit = string.charCodeAt(index); + if (codeUnit == 0) { + throw new Error('INVALID_CHARACTER_ERR'); + } + if (codeUnit >= 1 && codeUnit <= 31 || codeUnit >= 127 && codeUnit <= 159 || index == 0 && codeUnit >= 48 && codeUnit <= 57 || index == 1 && codeUnit >= 48 && codeUnit <= 57 && firstCodeUnit == 45) { + result += '\\' + codeUnit.toString(16) + ' '; + continue; + } + if (index == 1 && codeUnit == 45 && firstCodeUnit == 45) { + result += '\\' + string.charAt(index); + continue; + } + if (codeUnit >= 128 || codeUnit == 45 || codeUnit == 95 || codeUnit >= 48 && codeUnit <= 57 || codeUnit >= 65 && codeUnit <= 90 || codeUnit >= 97 && codeUnit <= 122) { + result += string.charAt(index); + continue; + } + result += '\\' + string.charAt(index); + } + return result; + }; + 'use strict'; + axe.utils.extendMetaData = function(to, from) { + Object.assign(to, from); + Object.keys(from).filter(function(prop) { + return typeof from[prop] === 'function'; + }).forEach(function(prop) { + to[prop] = null; + try { + to[prop] = from[prop](to); + } catch (e) {} + }); + }; + 'use strict'; + axe.utils.finalizeRuleResult = function(ruleResult) { + Object.assign(ruleResult, axe.utils.aggregateRule(ruleResult.nodes)); + delete ruleResult.nodes; + return ruleResult; + }; + 'use strict'; + var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj; + }; + axe.utils.findBy = function(array, key, value) { + if (Array.isArray(array)) { + return array.find(function(obj) { + return (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj[key] === value; + }); + } + }; + 'use strict'; + var axe = axe || { + utils: {} + }; + function virtualDOMfromNode(node, shadowId) { + return { + shadowId: shadowId, + children: [], + actualNode: node + }; + } + function getSlotChildren(node) { + var retVal = []; + node = node.firstChild; + while (node) { + retVal.push(node); + node = node.nextSibling; + } + return retVal; + } + axe.utils.getFlattenedTree = function(node, shadowId) { + var retVal, realArray, nodeName; + function reduceShadowDOM(res, child) { + var replacements = axe.utils.getFlattenedTree(child, shadowId); + if (replacements) { + res = res.concat(replacements); + } + return res; + } + if (node.documentElement) { + node = node.documentElement; + } + nodeName = node.nodeName.toLowerCase(); + if (node.shadowRoot && nodeName !== 'marquee') { + shadowId = 'a' + Math.random().toString().substring(2); + realArray = Array.from(node.shadowRoot.childNodes); + return realArray.reduce(reduceShadowDOM, []); + } else { + if (nodeName === 'content') { + realArray = Array.from(node.getDistributedNodes()); + return realArray.reduce(reduceShadowDOM, []); + } else if (nodeName === 'slot') { + realArray = Array.from(node.assignedNodes()); + if (!realArray.length) { + realArray = getSlotChildren(node); + } + var styl = window.getComputedStyle(node); + if (false && styl.display !== 'contents') { + retVal = virtualDOMfromNode(node, shadowId); + retVal.children = realArray.reduce(reduceShadowDOM, []); + return [ retVal ]; + } else { + return realArray.reduce(reduceShadowDOM, []); + } + } else { + if (node.nodeType === 1) { + retVal = virtualDOMfromNode(node, shadowId); + realArray = Array.from(node.childNodes); + retVal.children = realArray.reduce(reduceShadowDOM, []); + return [ retVal ]; + } else if (node.nodeType === 3) { + return [ virtualDOMfromNode(node) ]; + } + return undefined; + } + } + }; + axe.utils.getNodeFromTree = function(vNode, node) { + var found; + vNode.children.forEach(function(candidate) { + var retVal; + if (candidate.actualNode === node) { + found = candidate; + } else { + retVal = axe.utils.getNodeFromTree(candidate, node); + if (retVal) { + found = retVal; + } + } + }); + return found; + }; + 'use strict'; + axe.utils.getAllChecks = function getAllChecks(object) { + 'use strict'; + var result = []; + return result.concat(object.any || []).concat(object.all || []).concat(object.none || []); + }; + 'use strict'; + axe.utils.getCheckOption = function(check, ruleID, options) { + var ruleCheckOption = ((options.rules && options.rules[ruleID] || {}).checks || {})[check.id]; + var checkOption = (options.checks || {})[check.id]; + var enabled = check.enabled; + var opts = check.options; + if (checkOption) { + if (checkOption.hasOwnProperty('enabled')) { + enabled = checkOption.enabled; + } + if (checkOption.hasOwnProperty('options')) { + opts = checkOption.options; + } + } + if (ruleCheckOption) { + if (ruleCheckOption.hasOwnProperty('enabled')) { + enabled = ruleCheckOption.enabled; + } + if (ruleCheckOption.hasOwnProperty('options')) { + opts = ruleCheckOption.options; + } + } + return { + enabled: enabled, + options: opts, + absolutePaths: options.absolutePaths + }; + }; + 'use strict'; + var _slicedToArray = function() { + function sliceIterator(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + if (i && _arr.length === i) { + break; + } + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i['return']) { + _i['return'](); + } + } finally { + if (_d) { + throw _e; + } + } + } + return _arr; + } + return function(arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError('Invalid attempt to destructure non-iterable instance'); + } + }; + }(); + function isMostlyNumbers() { + var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + return str.length !== 0 && (str.match(/[0-9]/g) || '').length >= str.length / 2; + } + function splitString(str, splitIndex) { + return [ str.substring(0, splitIndex), str.substring(splitIndex) ]; + } + function uriParser(url) { + var original = url; + var protocol = '', domain = '', port = '', path = '', query = '', hash = ''; + if (url.includes('#')) { + var _splitString = splitString(url, url.indexOf('#')); + var _splitString2 = _slicedToArray(_splitString, 2); + url = _splitString2[0]; + hash = _splitString2[1]; + } + if (url.includes('?')) { + var _splitString3 = splitString(url, url.indexOf('?')); + var _splitString4 = _slicedToArray(_splitString3, 2); + url = _splitString4[0]; + query = _splitString4[1]; + } + if (url.includes('://')) { + var _url$split = url.split('://'); + var _url$split2 = _slicedToArray(_url$split, 2); + protocol = _url$split2[0]; + url = _url$split2[1]; + var _splitString5 = splitString(url, url.indexOf('/')); + var _splitString6 = _slicedToArray(_splitString5, 2); + domain = _splitString6[0]; + url = _splitString6[1]; + } else if (url.substr(0, 2) === '//') { + url = url.substr(2); + var _splitString7 = splitString(url, url.indexOf('/')); + var _splitString8 = _slicedToArray(_splitString7, 2); + domain = _splitString8[0]; + url = _splitString8[1]; + } + if (domain.substr(0, 4) === 'www.') { + domain = domain.substr(4); + } + if (domain && domain.includes(':')) { + var _splitString9 = splitString(domain, domain.indexOf(':')); + var _splitString10 = _slicedToArray(_splitString9, 2); + domain = _splitString10[0]; + port = _splitString10[1]; + } + path = url; + return { + original: original, + protocol: protocol, + domain: domain, + port: port, + path: path, + query: query, + hash: hash + }; + } + axe.utils.getFriendlyUriEnd = function getFriendlyUriEnd() { + var uri = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (uri.length <= 1 || uri.substr(0, 5) === 'data:' || uri.substr(0, 11) === 'javascript:' || uri.includes('?')) { + return; + } + var currentDomain = options.currentDomain, _options$maxLength = options.maxLength, maxLength = _options$maxLength === undefined ? 25 : _options$maxLength; + var _uriParser = uriParser(uri), path = _uriParser.path, domain = _uriParser.domain, hash = _uriParser.hash; + var pathEnd = path.substr(path.substr(0, path.length - 2).lastIndexOf('/') + 1); + if (hash) { + if (pathEnd && (pathEnd + hash).length <= maxLength) { + return pathEnd + hash; + } else if (pathEnd.length < 2 && hash.length > 2 && hash.length <= maxLength) { + return hash; + } else { + return; + } + } else if (domain && domain.length < maxLength && path.length <= 1) { + return domain + path; + } + if (path === '/' + pathEnd && domain && currentDomain && domain !== currentDomain && (domain + path).length <= maxLength) { + return domain + path; + } + var lastDotIndex = pathEnd.lastIndexOf('.'); + if ((lastDotIndex === -1 || lastDotIndex > 1) && (lastDotIndex !== -1 || pathEnd.length > 2) && pathEnd.length <= maxLength && !pathEnd.match(/index(\.[a-zA-Z]{2-4})?/) && !isMostlyNumbers(pathEnd)) { + return pathEnd; + } + }; + 'use strict'; + function _toConsumableArray(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { + arr2[i] = arr[i]; + } + return arr2; + } else { + return Array.from(arr); + } + } + var escapeSelector = axe.utils.escapeSelector; + function isUncommonClassName(className) { + return ![ 'focus', 'hover', 'hidden', 'visible', 'dirty', 'touched', 'valid', 'disable', 'enable', 'active', 'col-' ].find(function(str) { + return className.includes(str); + }); + } + function getDistinctClassList(elm) { + if (!elm.classList || elm.classList.length === 0) { + return []; + } + var siblings = elm.parentNode && Array.from(elm.parentNode.children || '') || []; + return siblings.reduce(function(classList, childElm) { + if (elm === childElm) { + return classList; + } else { + return classList.filter(function(classItem) { + return !childElm.classList.contains(classItem); + }); + } + }, Array.from(elm.classList).filter(isUncommonClassName)); + } + var commonNodes = [ 'div', 'span', 'p', 'b', 'i', 'u', 'strong', 'em', 'h2', 'h3' ]; + function getNthChildString(elm, selector) { + var siblings = elm.parentNode && Array.from(elm.parentNode.children || '') || []; + var hasMatchingSiblings = siblings.find(function(sibling) { + return sibling !== elm && axe.utils.matchesSelector(sibling, selector); + }); + if (hasMatchingSiblings) { + var nthChild = 1 + siblings.indexOf(elm); + return ':nth-child(' + nthChild + ')'; + } else { + return ''; + } + } + var createSelector = { + getElmId: function getElmId(elm) { + if (!elm.id) { + return; + } + var doc = elm.getRootNode && elm.getRootNode() || document; + var id = '#' + escapeSelector(elm.id || ''); + if (!id.match(/player_uid_/) && doc.querySelectorAll(id).length === 1) { + return id; + } + }, + getCustomElm: function getCustomElm(elm, _ref) { + var isCustomElm = _ref.isCustomElm, nodeName = _ref.nodeName; + if (isCustomElm) { + return nodeName; + } + }, + getElmRoleProp: function getElmRoleProp(elm) { + if (elm.hasAttribute('role')) { + return '[role="' + escapeSelector(elm.getAttribute('role')) + '"]'; + } + }, + getUncommonElm: function getUncommonElm(elm, _ref2) { + var isCommonElm = _ref2.isCommonElm, isCustomElm = _ref2.isCustomElm, nodeName = _ref2.nodeName; + if (!isCommonElm && !isCustomElm) { + nodeName = escapeSelector(nodeName); + if (nodeName === 'input' && elm.hasAttribute('type')) { + nodeName += '[type="' + elm.type + '"]'; + } + return nodeName; + } + }, + getElmNameProp: function getElmNameProp(elm) { + if (!elm.id && elm.name) { + return '[name="' + escapeSelector(elm.name) + '"]'; + } + }, + getDistinctClass: function getDistinctClass(elm, _ref3) { + var distinctClassList = _ref3.distinctClassList; + if (distinctClassList.length > 0 && distinctClassList.length < 3) { + return '.' + distinctClassList.map(escapeSelector).join('.'); + } + }, + getFileRefProp: function getFileRefProp(elm) { + var attr = void 0; + if (elm.hasAttribute('href')) { + attr = 'href'; + } else if (elm.hasAttribute('src')) { + attr = 'src'; + } else { + return; + } + var friendlyUriEnd = axe.utils.getFriendlyUriEnd(elm.getAttribute(attr)); + if (friendlyUriEnd) { + return '[' + attr + '$="' + encodeURI(friendlyUriEnd) + '"]'; + } + }, + getCommonName: function getCommonName(elm, _ref4) { + var nodeName = _ref4.nodeName, isCommonElm = _ref4.isCommonElm; + if (isCommonElm) { + return nodeName; + } + } + }; + function getElmFeatures(elm, featureCount) { + var nodeName = elm.nodeName.toLowerCase(); + var classList = Array.from(elm.classList) || []; + var props = { + nodeName: nodeName, + classList: classList, + isCustomElm: nodeName.includes('-'), + isCommonElm: commonNodes.includes(nodeName), + distinctClassList: getDistinctClassList(elm) + }; + return [ createSelector.getCustomElm, createSelector.getElmRoleProp, createSelector.getUncommonElm, createSelector.getElmNameProp, createSelector.getDistinctClass, createSelector.getFileRefProp, createSelector.getCommonName ].reduce(function(features, func) { + if (features.length === featureCount) { + return features; + } + var feature = func(elm, props); + if (feature) { + if (!feature[0].match(/[a-z]/)) { + features.push(feature); + } else { + features.unshift(feature); + } + } + return features; + }, []); + } + function generateSelector(elm, options, doc) { + var selector = void 0, addParent = void 0; + var _options$isUnique = options.isUnique, isUnique = _options$isUnique === undefined ? false : _options$isUnique; + var idSelector = createSelector.getElmId(elm); + var _options$featureCount = options.featureCount, featureCount = _options$featureCount === undefined ? 2 : _options$featureCount, _options$minDepth = options.minDepth, minDepth = _options$minDepth === undefined ? 1 : _options$minDepth, _options$toRoot = options.toRoot, toRoot = _options$toRoot === undefined ? false : _options$toRoot, _options$childSelecto = options.childSelectors, childSelectors = _options$childSelecto === undefined ? [] : _options$childSelecto; + if (idSelector) { + selector = idSelector; + isUnique = true; + } else { + selector = getElmFeatures(elm, featureCount).join(''); + selector += getNthChildString(elm, selector); + isUnique = options.isUnique || doc.querySelectorAll(selector).length === 1; + if (!isUnique && elm === document.documentElement) { + selector += ':root'; + } + addParent = minDepth !== 0 || !isUnique; + } + var selectorParts = [ selector ].concat(_toConsumableArray(childSelectors)); + if (elm.parentElement && elm.parentElement.nodeType !== 11 && (toRoot || addParent)) { + return generateSelector(elm.parentNode, { + toRoot: toRoot, + isUnique: isUnique, + childSelectors: selectorParts, + featureCount: 1, + minDepth: minDepth - 1 + }, doc); + } else { + return selectorParts.join(' > '); + } + } + axe.utils.getSelector = function createUniqueSelector(elm) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (!elm) { + return ''; + } + var doc = elm.getRootNode && elm.getRootNode() || document; + if (doc.nodeType === 11) { + var stack = []; + while (doc.nodeType === 11) { + stack.push({ + elm: elm, + doc: doc + }); + elm = doc.host; + doc = elm.getRootNode(); + } + stack.push({ + elm: elm, + doc: doc + }); + return stack.reverse().map(function(comp) { + return generateSelector(comp.elm, options, comp.doc); + }); + } else { + return generateSelector(elm, options, doc); + } + }; + 'use strict'; + function getXPathArray(node, path) { + var sibling, count; + if (!node) { + return []; + } + if (!path && node.nodeType === 9) { + path = [ { + str: 'html' + } ]; + return path; + } + path = path || []; + if (node.parentNode && node.parentNode !== node) { + path = getXPathArray(node.parentNode, path); + } + if (node.previousSibling) { + count = 1; + sibling = node.previousSibling; + do { + if (sibling.nodeType === 1 && sibling.nodeName === node.nodeName) { + count++; + } + sibling = sibling.previousSibling; + } while (sibling); + if (count === 1) { + count = null; + } + } else if (node.nextSibling) { + sibling = node.nextSibling; + do { + if (sibling.nodeType === 1 && sibling.nodeName === node.nodeName) { + count = 1; + sibling = null; + } else { + count = null; + sibling = sibling.previousSibling; + } + } while (sibling); + } + if (node.nodeType === 1) { + var element = {}; + element.str = node.nodeName.toLowerCase(); + if (node.getAttribute && node.getAttribute('id') && node.ownerDocument.querySelectorAll('#' + axe.utils.escapeSelector(node.id)).length === 1) { + element.id = node.getAttribute('id'); + } + if (count > 1) { + element.count = count; + } + path.push(element); + } + return path; + } + function xpathToString(xpathArray) { + return xpathArray.reduce(function(str, elm) { + if (elm.id) { + return '/' + elm.str + '[@id=\'' + elm.id + '\']'; + } else { + return str + ('/' + elm.str) + (elm.count > 0 ? '[' + elm.count + ']' : ''); + } + }, ''); + } + axe.utils.getXpath = function getXpath(node) { + var xpathArray = getXPathArray(node); + return xpathToString(xpathArray); + }; + 'use strict'; + var styleSheet; + function injectStyle(style) { + 'use strict'; + if (styleSheet && styleSheet.parentNode) { + if (styleSheet.styleSheet === undefined) { + styleSheet.appendChild(document.createTextNode(style)); + } else { + styleSheet.styleSheet.cssText += style; + } + return styleSheet; + } + if (!style) { + return; + } + var head = document.head || document.getElementsByTagName('head')[0]; + styleSheet = document.createElement('style'); + styleSheet.type = 'text/css'; + if (styleSheet.styleSheet === undefined) { + styleSheet.appendChild(document.createTextNode(style)); + } else { + styleSheet.styleSheet.cssText = style; + } + head.appendChild(styleSheet); + return styleSheet; + } + axe.utils.injectStyle = injectStyle; + 'use strict'; + axe.utils.isHidden = function isHidden(el, recursed) { + 'use strict'; + var parent; + if (el.nodeType === 9) { + return false; + } + if (el.nodeType === 11) { + el = el.host; + } + var style = window.getComputedStyle(el, null); + if (!style || !el.parentNode || style.getPropertyValue('display') === 'none' || !recursed && style.getPropertyValue('visibility') === 'hidden' || el.getAttribute('aria-hidden') === 'true') { + return true; + } + parent = el.assignedSlot ? el.assignedSlot : el.parentNode; + return axe.utils.isHidden(parent, true); + }; + 'use strict'; + function pushFrame(resultSet, options, frameElement, frameSelector) { + 'use strict'; + var frameXpath = axe.utils.getXpath(frameElement); + var frameSpec = { + element: frameElement, + selector: frameSelector, + xpath: frameXpath + }; + resultSet.forEach(function(res) { + res.node = axe.utils.DqElement.fromFrame(res.node, options, frameSpec); + var checks = axe.utils.getAllChecks(res); + if (checks.length) { + checks.forEach(function(check) { + check.relatedNodes = check.relatedNodes.map(function(node) { + return axe.utils.DqElement.fromFrame(node, options, frameSpec); + }); + }); + } + }); + } + function spliceNodes(target, to) { + 'use strict'; + var firstFromFrame = to[0].node, sorterResult, t; + for (var i = 0, l = target.length; i < l; i++) { + t = target[i].node; + sorterResult = axe.utils.nodeSorter({ + actualNode: t.element + }, { + actualNode: firstFromFrame.element + }); + if (sorterResult > 0 || sorterResult === 0 && firstFromFrame.selector.length < t.selector.length) { + target.splice.apply(target, [ i, 0 ].concat(to)); + return; + } + } + target.push.apply(target, to); + } + function normalizeResult(result) { + 'use strict'; + if (!result || !result.results) { + return null; + } + if (!Array.isArray(result.results)) { + return [ result.results ]; + } + if (!result.results.length) { + return null; + } + return result.results; + } + axe.utils.mergeResults = function mergeResults(frameResults, options) { + 'use strict'; + var result = []; + frameResults.forEach(function(frameResult) { + var results = normalizeResult(frameResult); + if (!results || !results.length) { + return; + } + results.forEach(function(ruleResult) { + if (ruleResult.nodes && frameResult.frame) { + pushFrame(ruleResult.nodes, options, frameResult.frameElement, frameResult.frame); + } + var res = axe.utils.findBy(result, 'id', ruleResult.id); + if (!res) { + result.push(ruleResult); + } else { + if (ruleResult.nodes.length) { + spliceNodes(res.nodes, ruleResult.nodes); + } + } + }); + }); + return result; + }; + 'use strict'; + axe.utils.nodeSorter = function nodeSorter(a, b) { + 'use strict'; + if (a.actualNode === b.actualNode) { + return 0; + } + if (a.actualNode.compareDocumentPosition(b.actualNode) & 4) { + return -1; + } + return 1; + }; + 'use strict'; + utils.performanceTimer = function() { + 'use strict'; + function now() { + if (window.performance && window.performance) { + return window.performance.now(); + } + } + var originalTime = null; + var lastRecordedTime = now(); + return { + start: function start() { + this.mark('mark_axe_start'); + }, + end: function end() { + this.mark('mark_axe_end'); + this.measure('axe', 'mark_axe_start', 'mark_axe_end'); + this.logMeasures('axe'); + }, + auditStart: function auditStart() { + this.mark('mark_audit_start'); + }, + auditEnd: function auditEnd() { + this.mark('mark_audit_end'); + this.measure('audit_start_to_end', 'mark_audit_start', 'mark_audit_end'); + this.logMeasures(); + }, + mark: function mark(markName) { + if (window.performance && window.performance.mark !== undefined) { + window.performance.mark(markName); + } + }, + measure: function measure(measureName, startMark, endMark) { + if (window.performance && window.performance.measure !== undefined) { + window.performance.measure(measureName, startMark, endMark); + } + }, + logMeasures: function logMeasures(measureName) { + function log(req) { + axe.log('Measure ' + req.name + ' took ' + req.duration + 'ms'); + } + if (window.performance && window.performance.getEntriesByType !== undefined) { + var measures = window.performance.getEntriesByType('measure'); + for (var i = 0; i < measures.length; ++i) { + var req = measures[i]; + if (req.name === measureName) { + log(req); + return; + } + log(req); + } + } + }, + timeElapsed: function timeElapsed() { + return now() - lastRecordedTime; + }, + reset: function reset() { + if (!originalTime) { + originalTime = now(); + } + lastRecordedTime = now(); + } + }; + }(); + 'use strict'; + if (typeof Object.assign !== 'function') { + (function() { + Object.assign = function(target) { + 'use strict'; + if (target === undefined || target === null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var output = Object(target); + for (var index = 1; index < arguments.length; index++) { + var source = arguments[index]; + if (source !== undefined && source !== null) { + for (var nextKey in source) { + if (source.hasOwnProperty(nextKey)) { + output[nextKey] = source[nextKey]; + } + } + } + } + return output; + }; + })(); + } + if (!Array.prototype.find) { + Array.prototype.find = function(predicate) { + if (this === null) { + throw new TypeError('Array.prototype.find called on null or undefined'); + } + if (typeof predicate !== 'function') { + throw new TypeError('predicate must be a function'); + } + var list = Object(this); + var length = list.length >>> 0; + var thisArg = arguments[1]; + var value; + for (var i = 0; i < length; i++) { + value = list[i]; + if (predicate.call(thisArg, value, i, list)) { + return value; + } + } + return undefined; + }; + } + axe.utils.pollyfillElementsFromPoint = function() { + if (document.elementsFromPoint) { + return document.elementsFromPoint; + } + if (document.msElementsFromPoint) { + return document.msElementsFromPoint; + } + var usePointer = function() { + var element = document.createElement('x'); + element.style.cssText = 'pointer-events:auto'; + return element.style.pointerEvents === 'auto'; + }(); + var cssProp = usePointer ? 'pointer-events' : 'visibility'; + var cssDisableVal = usePointer ? 'none' : 'hidden'; + var style = document.createElement('style'); + style.innerHTML = usePointer ? '* { pointer-events: all }' : '* { visibility: visible }'; + return function(x, y) { + var current, i, d; + var elements = []; + var previousPointerEvents = []; + document.head.appendChild(style); + while ((current = document.elementFromPoint(x, y)) && elements.indexOf(current) === -1) { + elements.push(current); + previousPointerEvents.push({ + value: current.style.getPropertyValue(cssProp), + priority: current.style.getPropertyPriority(cssProp) + }); + current.style.setProperty(cssProp, cssDisableVal, 'important'); + } + for (i = previousPointerEvents.length; !!(d = previousPointerEvents[--i]); ) { + elements[i].style.setProperty(cssProp, d.value ? d.value : '', d.priority); + } + document.head.removeChild(style); + return elements; + }; + }; + if (typeof window.addEventListener === 'function') { + document.elementsFromPoint = axe.utils.pollyfillElementsFromPoint(); + } + if (!Array.prototype.includes) { + Array.prototype.includes = function(searchElement) { + 'use strict'; + var O = Object(this); + var len = parseInt(O.length, 10) || 0; + if (len === 0) { + return false; + } + var n = parseInt(arguments[1], 10) || 0; + var k; + if (n >= 0) { + k = n; + } else { + k = len + n; + if (k < 0) { + k = 0; + } + } + var currentElement; + while (k < len) { + currentElement = O[k]; + if (searchElement === currentElement || searchElement !== searchElement && currentElement !== currentElement) { + return true; + } + k++; + } + return false; + }; + } + if (!Array.prototype.some) { + Array.prototype.some = function(fun) { + 'use strict'; + if (this == null) { + throw new TypeError('Array.prototype.some called on null or undefined'); + } + if (typeof fun !== 'function') { + throw new TypeError(); + } + var t = Object(this); + var len = t.length >>> 0; + var thisArg = arguments.length >= 2 ? arguments[1] : void 0; + for (var i = 0; i < len; i++) { + if (i in t && fun.call(thisArg, t[i], i, t)) { + return true; + } + } + return false; + }; + } + if (!Array.from) { + Array.from = function() { + var toStr = Object.prototype.toString; + var isCallable = function isCallable(fn) { + return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; + }; + var toInteger = function toInteger(value) { + var number = Number(value); + if (isNaN(number)) { + return 0; + } + if (number === 0 || !isFinite(number)) { + return number; + } + return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); + }; + var maxSafeInteger = Math.pow(2, 53) - 1; + var toLength = function toLength(value) { + var len = toInteger(value); + return Math.min(Math.max(len, 0), maxSafeInteger); + }; + return function from(arrayLike) { + var C = this; + var items = Object(arrayLike); + if (arrayLike == null) { + throw new TypeError('Array.from requires an array-like object - not null or undefined'); + } + var mapFn = arguments.length > 1 ? arguments[1] : void undefined; + var T; + if (typeof mapFn !== 'undefined') { + if (!isCallable(mapFn)) { + throw new TypeError('Array.from: when provided, the second argument must be a function'); + } + if (arguments.length > 2) { + T = arguments[2]; + } + } + var len = toLength(items.length); + var A = isCallable(C) ? Object(new C(len)) : new Array(len); + var k = 0; + var kValue; + while (k < len) { + kValue = items[k]; + if (mapFn) { + A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); + } else { + A[k] = kValue; + } + k += 1; + } + A.length = len; + return A; + }; + }(); + } + if (!String.prototype.includes) { + String.prototype.includes = function(search, start) { + if (typeof start !== 'number') { + start = 0; + } + if (start + search.length > this.length) { + return false; + } else { + return this.indexOf(search, start) !== -1; + } + }; + } + 'use strict'; + var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj; + }; + function getIncompleteReason(checkData, messages) { + function getDefaultMsg(messages) { + if (messages.incomplete && messages.incomplete.default) { + return messages.incomplete.default; + } else { + return helpers.incompleteFallbackMessage(); + } + } + if (checkData && checkData.missingData) { + try { + var msg = messages.incomplete[checkData.missingData[0].reason]; + if (!msg) { + throw new Error(); + } + return msg; + } catch (e) { + if (typeof checkData.missingData === 'string') { + return messages.incomplete[checkData.missingData]; + } else { + return getDefaultMsg(messages); + } + } + } else { + return getDefaultMsg(messages); + } + } + function extender(checksData, shouldBeTrue) { + 'use strict'; + return function(check) { + var sourceData = checksData[check.id] || {}; + var messages = sourceData.messages || {}; + var data = Object.assign({}, sourceData); + delete data.messages; + if (check.result === undefined) { + if (_typeof(messages.incomplete) === 'object') { + data.message = function() { + return getIncompleteReason(check.data, messages); + }; + } else { + data.message = messages.incomplete; + } + } else { + data.message = check.result === shouldBeTrue ? messages.pass : messages.fail; + } + axe.utils.extendMetaData(check, data); + }; + } + axe.utils.publishMetaData = function(ruleResult) { + 'use strict'; + var checksData = axe._audit.data.checks || {}; + var rulesData = axe._audit.data.rules || {}; + var rule = axe.utils.findBy(axe._audit.rules, 'id', ruleResult.id) || {}; + ruleResult.tags = axe.utils.clone(rule.tags || []); + var shouldBeTrue = extender(checksData, true); + var shouldBeFalse = extender(checksData, false); + ruleResult.nodes.forEach(function(detail) { + detail.any.forEach(shouldBeTrue); + detail.all.forEach(shouldBeTrue); + detail.none.forEach(shouldBeFalse); + }); + axe.utils.extendMetaData(ruleResult, axe.utils.clone(rulesData[ruleResult.id] || {})); + }; + 'use strict'; + var convertExpressions = function convertExpressions() {}; + var matchExpressions = function matchExpressions() {}; + function matchesTag(node, exp) { + return node.nodeType === 1 && (exp.tag === '*' || node.nodeName.toLowerCase() === exp.tag); + } + function matchesClasses(node, exp) { + return !exp.classes || exp.classes.reduce(function(result, cl) { + return result && node.className && node.className.match(cl.regexp); + }, true); + } + function matchesAttributes(node, exp) { + return !exp.attributes || exp.attributes.reduce(function(result, att) { + var nodeAtt = node.getAttribute(att.key); + return result && nodeAtt !== null && (!att.value || att.test(nodeAtt)); + }, true); + } + function matchesId(node, exp) { + return !exp.id || node.id === exp.id; + } + function matchesPseudos(target, exp) { + if (!exp.pseudos || exp.pseudos.reduce(function(result, pseudo) { + if (pseudo.name === 'not') { + return result && !matchExpressions([ target ], pseudo.expressions, false).length; + } + throw new Error('the pseudo selector ' + pseudo.name + ' has not yet been implemented'); + }, true)) { + return true; + } + return false; + } + function matchSelector(targets, exp, recurse) { + var result = []; + targets = Array.isArray(targets) ? targets : [ targets ]; + targets.forEach(function(target) { + if (matchesTag(target.actualNode, exp) && matchesClasses(target.actualNode, exp) && matchesAttributes(target.actualNode, exp) && matchesId(target.actualNode, exp) && matchesPseudos(target, exp)) { + result.push(target); + } + if (recurse) { + result = result.concat(matchSelector(target.children.filter(function(child) { + return !exp.id || child.shadowId === target.shadowId; + }), exp, recurse)); + } + }); + return result; + } + var escapeRegExp = function() { + /*! Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License */ + var from = /(?=[\-\[\]{}()*+?.\\\^$|,#\s])/g; + var to = '\\'; + return function(string) { + return string.replace(from, to); + }; + }(); + var reUnescape = /\\/g; + function convertAttributes(atts) { + /*! Credit Mootools Copyright Mootools, MIT License */ + if (!atts) { + return; + } + return atts.map(function(att) { + var attributeKey = att.name.replace(reUnescape, ''); + var attributeValue = (att.value || '').replace(reUnescape, ''); + var test, regexp; + switch (att.operator) { + case '^=': + regexp = new RegExp('^' + escapeRegExp(attributeValue)); + break; + + case '$=': + regexp = new RegExp(escapeRegExp(attributeValue) + '$'); + break; + + case '~=': + regexp = new RegExp('(^|\\s)' + escapeRegExp(attributeValue) + '(\\s|$)'); + break; + + case '|=': + regexp = new RegExp('^' + escapeRegExp(attributeValue) + '(-|$)'); + break; + + case '=': + test = function test(value) { + return attributeValue === value; + }; + break; + + case '*=': + test = function test(value) { + return value && value.indexOf(attributeValue) > -1; + }; + break; + + case '!=': + test = function test(value) { + return attributeValue !== value; + }; + break; + + default: + test = function test(value) { + return !!value; + }; + } + if (attributeValue === '' && /^[*$^]=$/.test(att.operator)) { + test = function test() { + return false; + }; + } + if (!test) { + test = function test(value) { + return value && regexp.test(value); + }; + } + return { + key: attributeKey, + value: attributeValue, + test: test + }; + }); + } + function convertClasses(classes) { + if (!classes) { + return; + } + return classes.map(function(className) { + className = className.replace(reUnescape, ''); + return { + value: className, + regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)') + }; + }); + } + function convertPseudos(pseudos) { + if (!pseudos) { + return; + } + return pseudos.map(function(p) { + var expressions; + if (p.name === 'not') { + expressions = axe.utils.cssParser.parse(p.value); + expressions = expressions.selectors ? expressions.selectors : [ expressions ]; + expressions = convertExpressions(expressions); + } + return { + name: p.name, + expressions: expressions, + value: p.value + }; + }); + } + convertExpressions = function convertExpressions(expressions) { + return expressions.map(function(exp) { + var newExp = []; + var rule = exp.rule; + while (rule) { + newExp.push({ + tag: rule.tagName ? rule.tagName.toLowerCase() : '*', + combinator: rule.nestingOperator ? rule.nestingOperator : ' ', + id: rule.id, + attributes: convertAttributes(rule.attrs), + classes: convertClasses(rule.classNames), + pseudos: convertPseudos(rule.pseudos) + }); + rule = rule.rule; + } + return newExp; + }); + }; + matchExpressions = function matchExpressions(domTree, expressions, recurse) { + return expressions.reduce(function(collected, exprArr) { + var candidates = domTree; + exprArr.forEach(function(exp, index) { + recurse = exp.combinator === '>' ? false : recurse; + if ([ ' ', '>' ].indexOf(exp.combinator) === -1) { + throw new Error('axe.utils.querySelectorAll does not support the combinator: ' + exp.combinator); + } + candidates = candidates.reduce(function(result, node) { + return result.concat(matchSelector(index ? node.children : node, exp, recurse)); + }, []); + }); + return collected.concat(candidates); + }, []); + }; + axe.utils.querySelectorAll = function(domTree, selector) { + domTree = Array.isArray(domTree) ? domTree : [ domTree ]; + var expressions = axe.utils.cssParser.parse(selector); + expressions = expressions.selectors ? expressions.selectors : [ expressions ]; + expressions = convertExpressions(expressions); + return matchExpressions(domTree, expressions, true); + }; + 'use strict'; + var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj; + }; + (function() { + 'use strict'; + function noop() {} + function funcGuard(f) { + if (typeof f !== 'function') { + throw new TypeError('Queue methods require functions as arguments'); + } + } + function queue() { + var tasks = []; + var started = 0; + var remaining = 0; + var completeQueue = noop; + var complete = false; + var err; + var defaultFail = function defaultFail(e) { + err = e; + setTimeout(function() { + if (err !== undefined && err !== null) { + axe.log('Uncaught error (of queue)', err); + } + }, 1); + }; + var failed = defaultFail; + function createResolve(i) { + return function(r) { + tasks[i] = r; + remaining -= 1; + if (!remaining && completeQueue !== noop) { + complete = true; + completeQueue(tasks); + } + }; + } + function abort(msg) { + completeQueue = noop; + failed(msg); + return tasks; + } + function pop() { + var length = tasks.length; + for (;started < length; started++) { + var task = tasks[started]; + try { + task.call(null, createResolve(started), abort); + } catch (e) { + abort(e); + } + } + } + var q = { + defer: function defer(fn) { + if ((typeof fn === 'undefined' ? 'undefined' : _typeof(fn)) === 'object' && fn.then && fn.catch) { + var defer = fn; + fn = function fn(resolve, reject) { + defer.then(resolve).catch(reject); + }; + } + funcGuard(fn); + if (err !== undefined) { + return; + } else if (complete) { + throw new Error('Queue already completed'); + } + tasks.push(fn); + ++remaining; + pop(); + return q; + }, + then: function then(fn) { + funcGuard(fn); + if (completeQueue !== noop) { + throw new Error('queue `then` already set'); + } + if (!err) { + completeQueue = fn; + if (!remaining) { + complete = true; + completeQueue(tasks); + } + } + return q; + }, + catch: function _catch(fn) { + funcGuard(fn); + if (failed !== defaultFail) { + throw new Error('queue `catch` already set'); + } + if (!err) { + failed = fn; + } else { + fn(err); + err = null; + } + return q; + }, + abort: abort + }; + return q; + } + axe.utils.queue = queue; + })(); + 'use strict'; + var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj; + }; + (function(exports) { + 'use strict'; + var messages = {}, subscribers = {}; + function _getSource() { + var application = 'axe', version = '', src; + if (typeof axe !== 'undefined' && axe._audit && !axe._audit.application) { + application = axe._audit.application; + } + if (typeof axe !== 'undefined') { + version = axe.version; + } + src = application + '.' + version; + return src; + } + function verify(postedMessage) { + if ((typeof postedMessage === 'undefined' ? 'undefined' : _typeof(postedMessage)) === 'object' && typeof postedMessage.uuid === 'string' && postedMessage._respondable === true) { + var messageSource = _getSource(); + return postedMessage._source === messageSource || postedMessage._source === 'axe.x.y.z' || messageSource === 'axe.x.y.z'; + } + return false; + } + function post(win, topic, message, uuid, keepalive, callback) { + var error; + if (message instanceof Error) { + error = { + name: message.name, + message: message.message, + stack: message.stack + }; + message = undefined; + } + var data = { + uuid: uuid, + topic: topic, + message: message, + error: error, + _respondable: true, + _source: _getSource(), + _keepalive: keepalive + }; + if (typeof callback === 'function') { + messages[uuid] = callback; + } + win.postMessage(JSON.stringify(data), '*'); + } + function respondable(win, topic, message, keepalive, callback) { + var id = uuid.v1(); + post(win, topic, message, id, keepalive, callback); + } + respondable.subscribe = function(topic, callback) { + subscribers[topic] = callback; + }; + respondable.isInFrame = function(win) { + win = win || window; + return !!win.frameElement; + }; + function createResponder(source, topic, uuid) { + return function(message, keepalive, callback) { + post(source, topic, message, uuid, keepalive, callback); + }; + } + function publish(target, data, keepalive) { + var topic = data.topic; + var subscriber = subscribers[topic]; + if (subscriber) { + var responder = createResponder(target, null, data.uuid); + subscriber(data.message, keepalive, responder); + } + } + function buildErrorObject(error) { + var msg = error.message || 'Unknown error occurred'; + var ErrConstructor = window[error.name] || Error; + if (error.stack) { + msg += '\n' + error.stack.replace(error.message, ''); + } + return new ErrConstructor(msg); + } + function parseMessage(dataString) { + var data; + if (typeof dataString !== 'string') { + return; + } + try { + data = JSON.parse(dataString); + } catch (ex) {} + if (!verify(data)) { + return; + } + if (_typeof(data.error) === 'object') { + data.error = buildErrorObject(data.error); + } else { + data.error = undefined; + } + return data; + } + if (typeof window.addEventListener === 'function') { + window.addEventListener('message', function(e) { + var data = parseMessage(e.data); + if (!data) { + return; + } + var uuid = data.uuid; + var keepalive = data._keepalive; + var callback = messages[uuid]; + if (callback) { + var result = data.error || data.message; + var responder = createResponder(e.source, data.topic, uuid); + callback(result, keepalive, responder); + if (!keepalive) { + delete messages[uuid]; + } + } + if (!data.error) { + try { + publish(e.source, data, keepalive); + } catch (err) { + post(e.source, data.topic, err, uuid, false); + } + } + }, false); + } + exports.respondable = respondable; + })(utils); + 'use strict'; + function matchTags(rule, runOnly) { + 'use strict'; + var include, exclude, matching; + var defaultExclude = axe._audit && axe._audit.tagExclude ? axe._audit.tagExclude : []; + if (runOnly.include || runOnly.exclude) { + include = runOnly.include || []; + include = Array.isArray(include) ? include : [ include ]; + exclude = runOnly.exclude || []; + exclude = Array.isArray(exclude) ? exclude : [ exclude ]; + exclude = exclude.concat(defaultExclude.filter(function(tag) { + return include.indexOf(tag) === -1; + })); + } else { + include = Array.isArray(runOnly) ? runOnly : [ runOnly ]; + exclude = defaultExclude.filter(function(tag) { + return include.indexOf(tag) === -1; + }); + } + matching = include.some(function(tag) { + return rule.tags.indexOf(tag) !== -1; + }); + if (matching || include.length === 0 && rule.enabled !== false) { + return exclude.every(function(tag) { + return rule.tags.indexOf(tag) === -1; + }); + } else { + return false; + } + } + axe.utils.ruleShouldRun = function(rule, context, options) { + 'use strict'; + var runOnly = options.runOnly || {}; + var ruleOptions = (options.rules || {})[rule.id]; + if (rule.pageLevel && !context.page) { + return false; + } else if (runOnly.type === 'rule') { + return runOnly.values.indexOf(rule.id) !== -1; + } else if (ruleOptions && typeof ruleOptions.enabled === 'boolean') { + return ruleOptions.enabled; + } else if (runOnly.type === 'tag' && runOnly.values) { + return matchTags(rule, runOnly.values); + } else { + return matchTags(rule, []); + } + }; + 'use strict'; + function getDeepest(collection) { + 'use strict'; + return collection.sort(function(a, b) { + if (axe.utils.contains(a, b)) { + return 1; + } + return -1; + })[0]; + } + function isNodeInContext(node, context) { + 'use strict'; + var include = context.include && getDeepest(context.include.filter(function(candidate) { + return axe.utils.contains(candidate, node); + })); + var exclude = context.exclude && getDeepest(context.exclude.filter(function(candidate) { + return axe.utils.contains(candidate, node); + })); + if (!exclude && include || exclude && axe.utils.contains(exclude, include)) { + return true; + } + return false; + } + function pushNode(result, nodes, context) { + 'use strict'; + for (var i = 0, l = nodes.length; i < l; i++) { + if (!result.find(function(item) { + return item.actualNode === nodes[i].actualNode; + }) && isNodeInContext(nodes[i], context)) { + result.push(nodes[i]); + } + } + } + axe.utils.select = function select(selector, context) { + 'use strict'; + var result = [], candidate; + for (var i = 0, l = context.include.length; i < l; i++) { + candidate = context.include[i]; + if (candidate.actualNode.nodeType === candidate.actualNode.ELEMENT_NODE && axe.utils.matchesSelector(candidate.actualNode, selector)) { + pushNode(result, [ candidate ], context); + } + pushNode(result, axe.utils.querySelectorAll(candidate, selector), context); + } + return result.sort(axe.utils.nodeSorter); + }; + 'use strict'; + axe.utils.toArray = function(thing) { + 'use strict'; + return Array.prototype.slice.call(thing); + }; + 'use strict'; + var uuid; + (function(_global) { + var _rng; + var _crypto = _global.crypto || _global.msCrypto; + if (!_rng && _crypto && _crypto.getRandomValues) { + var _rnds8 = new Uint8Array(16); + _rng = function whatwgRNG() { + _crypto.getRandomValues(_rnds8); + return _rnds8; + }; + } + if (!_rng) { + var _rnds = new Array(16); + _rng = function _rng() { + for (var i = 0, r; i < 16; i++) { + if ((i & 3) === 0) { + r = Math.random() * 4294967296; + } + _rnds[i] = r >>> ((i & 3) << 3) & 255; + } + return _rnds; + }; + } + var BufferClass = typeof _global.Buffer == 'function' ? _global.Buffer : Array; + var _byteToHex = []; + var _hexToByte = {}; + for (var i = 0; i < 256; i++) { + _byteToHex[i] = (i + 256).toString(16).substr(1); + _hexToByte[_byteToHex[i]] = i; + } + function parse(s, buf, offset) { + var i = buf && offset || 0, ii = 0; + buf = buf || []; + s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) { + if (ii < 16) { + buf[i + ii++] = _hexToByte[oct]; + } + }); + while (ii < 16) { + buf[i + ii++] = 0; + } + return buf; + } + function unparse(buf, offset) { + var i = offset || 0, bth = _byteToHex; + return bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]]; + } + var _seedBytes = _rng(); + var _nodeId = [ _seedBytes[0] | 1, _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5] ]; + var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 16383; + var _lastMSecs = 0, _lastNSecs = 0; + function v1(options, buf, offset) { + var i = buf && offset || 0; + var b = buf || []; + options = options || {}; + var clockseq = options.clockseq != null ? options.clockseq : _clockseq; + var msecs = options.msecs != null ? options.msecs : new Date().getTime(); + var nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1; + var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 1e4; + if (dt < 0 && options.clockseq == null) { + clockseq = clockseq + 1 & 16383; + } + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) { + nsecs = 0; + } + if (nsecs >= 1e4) { + throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec'); + } + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; + msecs += 122192928e5; + var tl = ((msecs & 268435455) * 1e4 + nsecs) % 4294967296; + b[i++] = tl >>> 24 & 255; + b[i++] = tl >>> 16 & 255; + b[i++] = tl >>> 8 & 255; + b[i++] = tl & 255; + var tmh = msecs / 4294967296 * 1e4 & 268435455; + b[i++] = tmh >>> 8 & 255; + b[i++] = tmh & 255; + b[i++] = tmh >>> 24 & 15 | 16; + b[i++] = tmh >>> 16 & 255; + b[i++] = clockseq >>> 8 | 128; + b[i++] = clockseq & 255; + var node = options.node || _nodeId; + for (var n = 0; n < 6; n++) { + b[i + n] = node[n]; + } + return buf ? buf : unparse(b); + } + function v4(options, buf, offset) { + var i = buf && offset || 0; + if (typeof options == 'string') { + buf = options == 'binary' ? new BufferClass(16) : null; + options = null; + } + options = options || {}; + var rnds = options.random || (options.rng || _rng)(); + rnds[6] = rnds[6] & 15 | 64; + rnds[8] = rnds[8] & 63 | 128; + if (buf) { + for (var ii = 0; ii < 16; ii++) { + buf[i + ii] = rnds[ii]; + } + } + return buf || unparse(rnds); + } + uuid = v4; + uuid.v1 = v1; + uuid.v4 = v4; + uuid.parse = parse; + uuid.unparse = unparse; + uuid.BufferClass = BufferClass; + })(window); + 'use strict'; + axe._load({ + data: { + rules: { + accesskeys: { + description: 'Ensures every accesskey attribute value is unique', + help: 'accesskey attribute value must be unique' + }, + 'area-alt': { + description: 'Ensures <area> elements of image maps have alternate text', + help: 'Active <area> elements must have alternate text' + }, + 'aria-allowed-attr': { + description: 'Ensures ARIA attributes are allowed for an element\'s role', + help: 'Elements must only use allowed ARIA attributes' + }, + 'aria-hidden-body': { + description: 'Ensures aria-hidden=\'true\' is not present on the document body.', + help: 'aria-hidden=\'true\' must not be present on the document body' + }, + 'aria-required-attr': { + description: 'Ensures elements with ARIA roles have all required ARIA attributes', + help: 'Required ARIA attributes must be provided' + }, + 'aria-required-children': { + description: 'Ensures elements with an ARIA role that require child roles contain them', + help: 'Certain ARIA roles must contain particular children' + }, + 'aria-required-parent': { + description: 'Ensures elements with an ARIA role that require parent roles are contained by them', + help: 'Certain ARIA roles must be contained by particular parents' + }, + 'aria-roles': { + description: 'Ensures all elements with a role attribute use a valid value', + help: 'ARIA roles used must conform to valid values' + }, + 'aria-valid-attr-value': { + description: 'Ensures all ARIA attributes have valid values', + help: 'ARIA attributes must conform to valid values' + }, + 'aria-valid-attr': { + description: 'Ensures attributes that begin with aria- are valid ARIA attributes', + help: 'ARIA attributes must conform to valid names' + }, + 'audio-caption': { + description: 'Ensures <audio> elements have captions', + help: '<audio> elements must have a captions track' + }, + blink: { + description: 'Ensures <blink> elements are not used', + help: '<blink> elements are deprecated and must not be used' + }, + 'button-name': { + description: 'Ensures buttons have discernible text', + help: 'Buttons must have discernible text' + }, + bypass: { + description: 'Ensures each page has at least one mechanism for a user to bypass navigation and jump straight to the content', + help: 'Page must have means to bypass repeated blocks' + }, + checkboxgroup: { + description: 'Ensures related <input type="checkbox"> elements have a group and that that group designation is consistent', + help: 'Checkbox inputs with the same name attribute value must be part of a group' + }, + 'color-contrast': { + description: 'Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds', + help: 'Elements must have sufficient color contrast' + }, + 'definition-list': { + description: 'Ensures <dl> elements are structured correctly', + help: '<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script> or <template> elements' + }, + dlitem: { + description: 'Ensures <dt> and <dd> elements are contained by a <dl>', + help: '<dt> and <dd> elements must be contained by a <dl>' + }, + 'document-title': { + description: 'Ensures each HTML document contains a non-empty <title> element', + help: 'Documents must have <title> element to aid in navigation' + }, + 'duplicate-id': { + description: 'Ensures every id attribute value is unique', + help: 'id attribute value must be unique' + }, + 'empty-heading': { + description: 'Ensures headings have discernible text', + help: 'Headings must not be empty' + }, + 'frame-title-unique': { + description: 'Ensures <iframe> and <frame> elements contain a unique title attribute', + help: 'Frames must have a unique title attribute' + }, + 'frame-title': { + description: 'Ensures <iframe> and <frame> elements contain a non-empty title attribute', + help: 'Frames must have title attribute' + }, + 'heading-order': { + description: 'Ensures the order of headings is semantically correct', + help: 'Heading levels should only increase by one' + }, + 'hidden-content': { + description: 'Informs users about hidden content.', + help: 'Hidden content on the page cannot be analyzed' + }, + 'href-no-hash': { + description: 'Ensures that href values are valid link references to promote only using anchors as links', + help: 'Anchors must only be used as links with valid URLs or URL fragments' + }, + 'html-has-lang': { + description: 'Ensures every HTML document has a lang attribute', + help: '<html> element must have a lang attribute' + }, + 'html-lang-valid': { + description: 'Ensures the lang attribute of the <html> element has a valid value', + help: '<html> element must have a valid value for the lang attribute' + }, + 'image-alt': { + description: 'Ensures <img> elements have alternate text or a role of none or presentation', + help: 'Images must have alternate text' + }, + 'image-redundant-alt': { + description: 'Ensure button and link text is not repeated as image alternative', + help: 'Text of buttons and links should not be repeated in the image alternative' + }, + 'input-image-alt': { + description: 'Ensures <input type="image"> elements have alternate text', + help: 'Image buttons must have alternate text' + }, + 'label-title-only': { + description: 'Ensures that every form element is not solely labeled using the title or aria-describedby attributes', + help: 'Form elements should have a visible label' + }, + label: { + description: 'Ensures every form element has a label', + help: 'Form elements must have labels' + }, + 'layout-table': { + description: 'Ensures presentational <table> elements do not use <th>, <caption> elements or the summary attribute', + help: 'Layout tables must not use data table elements' + }, + 'link-in-text-block': { + description: 'Links can be distinguished without relying on color', + help: 'Links must be distinguished from surrounding text in a way that does not rely on color' + }, + 'link-name': { + description: 'Ensures links have discernible text', + help: 'Links must have discernible text' + }, + list: { + description: 'Ensures that lists are structured correctly', + help: '<ul> and <ol> must only directly contain <li>, <script> or <template> elements' + }, + listitem: { + description: 'Ensures <li> elements are used semantically', + help: '<li> elements must be contained in a <ul> or <ol>' + }, + marquee: { + description: 'Ensures <marquee> elements are not used', + help: '<marquee> elements are deprecated and must not be used' + }, + 'meta-refresh': { + description: 'Ensures <meta http-equiv="refresh"> is not used', + help: 'Timed refresh must not exist' + }, + 'meta-viewport-large': { + description: 'Ensures <meta name="viewport"> can scale a significant amount', + help: 'Users should be able to zoom and scale the text up to 500%' + }, + 'meta-viewport': { + description: 'Ensures <meta name="viewport"> does not disable text scaling and zooming', + help: 'Zooming and scaling must not be disabled' + }, + 'object-alt': { + description: 'Ensures <object> elements have alternate text', + help: '<object> elements must have alternate text' + }, + 'p-as-heading': { + description: 'Ensure p elements are not used to style headings', + help: 'Bold, italic text and font-size are not used to style p elements as a heading' + }, + radiogroup: { + description: 'Ensures related <input type="radio"> elements have a group and that the group designation is consistent', + help: 'Radio inputs with the same name attribute value must be part of a group' + }, + region: { + description: 'Ensures all content is contained within a landmark region', + help: 'Content should be contained in a landmark region' + }, + 'scope-attr-valid': { + description: 'Ensures the scope attribute is used correctly on tables', + help: 'scope attribute should be used correctly' + }, + 'server-side-image-map': { + description: 'Ensures that server-side image maps are not used', + help: 'Server-side image maps must not be used' + }, + 'skip-link': { + description: 'Ensures the first link on the page is a skip link', + help: 'The page should have a skip link as its first link' + }, + tabindex: { + description: 'Ensures tabindex attribute values are not greater than 0', + help: 'Elements should not have tabindex greater than zero' + }, + 'table-duplicate-name': { + description: 'Ensure that tables do not have the same summary and caption', + help: 'The <caption> element should not contain the same text as the summary attribute' + }, + 'table-fake-caption': { + description: 'Ensure that tables with a caption use the <caption> element.', + help: 'Data or header cells should not be used to give caption to a data table.' + }, + 'td-has-header': { + description: 'Ensure that each non-empty data cell in a large table has one or more table headers', + help: 'All non-empty td element in table larger than 3 by 3 must have an associated table header' + }, + 'td-headers-attr': { + description: 'Ensure that each cell in a table using the headers refers to another cell in that table', + help: 'All cells in a table element that use the headers attribute must only refer to other cells of that same table' + }, + 'th-has-data-cells': { + description: 'Ensure that each table header in a data table refers to data cells', + help: 'All th element and elements with role=columnheader/rowheader must data cells which it describes' + }, + 'valid-lang': { + description: 'Ensures lang attributes have valid values', + help: 'lang attribute must have a valid value' + }, + 'video-caption': { + description: 'Ensures <video> elements have captions', + help: '<video> elements must have captions' + }, + 'video-description': { + description: 'Ensures <video> elements have audio descriptions', + help: '<video> elements must have an audio description track' + } + }, + checks: { + accesskeys: { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Accesskey attribute value is unique'; + return out; + }, + fail: function anonymous(it) { + var out = 'Document has multiple elements with the same accesskey'; + return out; + } + } + }, + 'non-empty-alt': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Element has a non-empty alt attribute'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element has no alt attribute or the alt attribute is empty'; + return out; + } + } + }, + 'non-empty-title': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Element has a title attribute'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element has no title attribute or the title attribute is empty'; + return out; + } + } + }, + 'aria-label': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'aria-label attribute exists and is not empty'; + return out; + }, + fail: function anonymous(it) { + var out = 'aria-label attribute does not exist or is empty'; + return out; + } + } + }, + 'aria-labelledby': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'aria-labelledby attribute exists and references elements that are visible to screen readers'; + return out; + }, + fail: function anonymous(it) { + var out = 'aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty or not visible'; + return out; + } + } + }, + 'aria-allowed-attr': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'ARIA attributes are used correctly for the defined role'; + return out; + }, + fail: function anonymous(it) { + var out = 'ARIA attribute' + (it.data && it.data.length > 1 ? 's are' : ' is') + ' not allowed:'; + var arr1 = it.data; + if (arr1) { + var value, i1 = -1, l1 = arr1.length - 1; + while (i1 < l1) { + value = arr1[i1 += 1]; + out += ' ' + value; + } + } + return out; + } + } + }, + 'aria-hidden-body': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'No aria-hidden attribute is present on document body'; + return out; + }, + fail: function anonymous(it) { + var out = 'aria-hidden=true should not be present on the document body'; + return out; + } + } + }, + 'aria-required-attr': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'All required ARIA attributes are present'; + return out; + }, + fail: function anonymous(it) { + var out = 'Required ARIA attribute' + (it.data && it.data.length > 1 ? 's' : '') + ' not present:'; + var arr1 = it.data; + if (arr1) { + var value, i1 = -1, l1 = arr1.length - 1; + while (i1 < l1) { + value = arr1[i1 += 1]; + out += ' ' + value; + } + } + return out; + } + } + }, + 'aria-required-children': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Required ARIA children are present'; + return out; + }, + fail: function anonymous(it) { + var out = 'Required ARIA ' + (it.data && it.data.length > 1 ? 'children' : 'child') + ' role not present:'; + var arr1 = it.data; + if (arr1) { + var value, i1 = -1, l1 = arr1.length - 1; + while (i1 < l1) { + value = arr1[i1 += 1]; + out += ' ' + value; + } + } + return out; + } + } + }, + 'aria-required-parent': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Required ARIA parent role present'; + return out; + }, + fail: function anonymous(it) { + var out = 'Required ARIA parent' + (it.data && it.data.length > 1 ? 's' : '') + ' role not present:'; + var arr1 = it.data; + if (arr1) { + var value, i1 = -1, l1 = arr1.length - 1; + while (i1 < l1) { + value = arr1[i1 += 1]; + out += ' ' + value; + } + } + return out; + } + } + }, + invalidrole: { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'ARIA role is valid'; + return out; + }, + fail: function anonymous(it) { + var out = 'Role must be one of the valid ARIA roles'; + return out; + } + } + }, + abstractrole: { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Abstract roles are not used'; + return out; + }, + fail: function anonymous(it) { + var out = 'Abstract roles cannot be directly used'; + return out; + } + } + }, + 'aria-valid-attr-value': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'ARIA attribute values are valid'; + return out; + }, + fail: function anonymous(it) { + var out = 'Invalid ARIA attribute value' + (it.data && it.data.length > 1 ? 's' : '') + ':'; + var arr1 = it.data; + if (arr1) { + var value, i1 = -1, l1 = arr1.length - 1; + while (i1 < l1) { + value = arr1[i1 += 1]; + out += ' ' + value; + } + } + return out; + } + } + }, + 'aria-valid-attr': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'ARIA attribute name' + (it.data && it.data.length > 1 ? 's' : '') + ' are valid'; + return out; + }, + fail: function anonymous(it) { + var out = 'Invalid ARIA attribute name' + (it.data && it.data.length > 1 ? 's' : '') + ':'; + var arr1 = it.data; + if (arr1) { + var value, i1 = -1, l1 = arr1.length - 1; + while (i1 < l1) { + value = arr1[i1 += 1]; + out += ' ' + value; + } + } + return out; + } + } + }, + caption: { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'The multimedia element has a captions track'; + return out; + }, + fail: function anonymous(it) { + var out = 'The multimedia element does not have a captions track'; + return out; + }, + incomplete: function anonymous(it) { + var out = 'A captions track for this element could not be found'; + return out; + } + } + }, + 'is-on-screen': { + impact: 'minor', + messages: { + pass: function anonymous(it) { + var out = 'Element is not visible'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element is visible'; + return out; + } + } + }, + 'non-empty-if-present': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Element '; + if (it.data) { + out += 'has a non-empty value attribute'; + } else { + out += 'does not have a value attribute'; + } + return out; + }, + fail: function anonymous(it) { + var out = 'Element has a value attribute and the value attribute is empty'; + return out; + } + } + }, + 'non-empty-value': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Element has a non-empty value attribute'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element has no value attribute or the value attribute is empty'; + return out; + } + } + }, + 'button-has-visible-text': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Element has inner text that is visible to screen readers'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element does not have inner text that is visible to screen readers'; + return out; + } + } + }, + 'role-presentation': { + impact: 'moderate', + messages: { + pass: function anonymous(it) { + var out = 'Element\'s default semantics were overriden with role="presentation"'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element\'s default semantics were not overridden with role="presentation"'; + return out; + } + } + }, + 'role-none': { + impact: 'moderate', + messages: { + pass: function anonymous(it) { + var out = 'Element\'s default semantics were overriden with role="none"'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element\'s default semantics were not overridden with role="none"'; + return out; + } + } + }, + 'focusable-no-name': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Element is not in tab order or has accessible text'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element is in tab order and does not have accessible text'; + return out; + } + } + }, + 'internal-link-present': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Valid skip link found'; + return out; + }, + fail: function anonymous(it) { + var out = 'No valid skip link found'; + return out; + } + } + }, + 'header-present': { + impact: 'moderate', + messages: { + pass: function anonymous(it) { + var out = 'Page has a header'; + return out; + }, + fail: function anonymous(it) { + var out = 'Page does not have a header'; + return out; + } + } + }, + landmark: { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Page has a landmark region'; + return out; + }, + fail: function anonymous(it) { + var out = 'Page does not have a landmark region'; + return out; + } + } + }, + 'group-labelledby': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'All elements with the name "' + it.data.name + '" reference the same element with aria-labelledby'; + return out; + }, + fail: function anonymous(it) { + var out = 'All elements with the name "' + it.data.name + '" do not reference the same element with aria-labelledby'; + return out; + } + } + }, + fieldset: { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Element is contained in a fieldset'; + return out; + }, + fail: function anonymous(it) { + var out = ''; + var code = it.data && it.data.failureCode; + if (code === 'no-legend') { + out += 'Fieldset does not have a legend as its first child'; + } else if (code === 'empty-legend') { + out += 'Legend does not have text that is visible to screen readers'; + } else if (code === 'mixed-inputs') { + out += 'Fieldset contains unrelated inputs'; + } else if (code === 'no-group-label') { + out += 'ARIA group does not have aria-label or aria-labelledby'; + } else if (code === 'group-mixed-inputs') { + out += 'ARIA group contains unrelated inputs'; + } else { + out += 'Element does not have a containing fieldset or ARIA group'; + } + return out; + } + } + }, + 'color-contrast': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Element has sufficient color contrast of ' + it.data.contrastRatio; + return out; + }, + fail: function anonymous(it) { + var out = 'Element has insufficient color contrast of ' + it.data.contrastRatio + ' (foreground color: ' + it.data.fgColor + ', background color: ' + it.data.bgColor + ', font size: ' + it.data.fontSize + ', font weight: ' + it.data.fontWeight + ')'; + return out; + }, + incomplete: { + bgImage: 'Element\'s background color could not be determined due to a background image', + bgGradient: 'Element\'s background color could not be determined due to a background gradient', + imgNode: 'Element\'s background color could not be determined because element contains an image node', + bgOverlap: 'Element\'s background color could not be determined because it is overlapped by another element', + fgAlpha: 'Element\'s foreground color could not be determined because of alpha transparency', + elmPartiallyObscured: 'Element\'s background color could not be determined because it\'s partially obscured by another element', + equalRatio: 'Element has a 1:1 contrast ratio with the background', + default: 'Unable to determine contrast ratio' + } + } + }, + 'structured-dlitems': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'When not empty, element has both <dt> and <dd> elements'; + return out; + }, + fail: function anonymous(it) { + var out = 'When not empty, element does not have at least one <dt> element followed by at least one <dd> element'; + return out; + } + } + }, + 'only-dlitems': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'List element only has direct children that are allowed inside <dt> or <dd> elements'; + return out; + }, + fail: function anonymous(it) { + var out = 'List element has direct children that are not allowed inside <dt> or <dd> elements'; + return out; + } + } + }, + dlitem: { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Description list item has a <dl> parent element'; + return out; + }, + fail: function anonymous(it) { + var out = 'Description list item does not have a <dl> parent element'; + return out; + } + } + }, + 'doc-has-title': { + impact: 'moderate', + messages: { + pass: function anonymous(it) { + var out = 'Document has a non-empty <title> element'; + return out; + }, + fail: function anonymous(it) { + var out = 'Document does not have a non-empty <title> element'; + return out; + } + } + }, + 'duplicate-id': { + impact: 'moderate', + messages: { + pass: function anonymous(it) { + var out = 'Document has no elements that share the same id attribute'; + return out; + }, + fail: function anonymous(it) { + var out = 'Document has multiple elements with the same id attribute: ' + it.data; + return out; + } + } + }, + 'has-visible-text': { + impact: 'moderate', + messages: { + pass: function anonymous(it) { + var out = 'Element has text that is visible to screen readers'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element does not have text that is visible to screen readers'; + return out; + } + } + }, + 'unique-frame-title': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Element\'s title attribute is unique'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element\'s title attribute is not unique'; + return out; + } + } + }, + 'heading-order': { + impact: 'minor', + messages: { + pass: function anonymous(it) { + var out = 'Heading order valid'; + return out; + }, + fail: function anonymous(it) { + var out = 'Heading order invalid'; + return out; + } + } + }, + 'hidden-content': { + impact: 'minor', + messages: { + pass: function anonymous(it) { + var out = 'All content on the page has been analyzed.'; + return out; + }, + fail: function anonymous(it) { + var out = 'There were problems analyzing the content on this page.'; + return out; + }, + incomplete: function anonymous(it) { + var out = 'There is hidden content on the page that was not analyzed. You will need to trigger the display of this content in order to analyze it.'; + return out; + } + } + }, + 'href-no-hash': { + impact: 'moderate', + messages: { + pass: function anonymous(it) { + var out = 'Anchor does not have an href value of #'; + return out; + }, + fail: function anonymous(it) { + var out = 'Anchor has an href value of #'; + return out; + } + } + }, + 'has-lang': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'The <html> element has a lang attribute'; + return out; + }, + fail: function anonymous(it) { + var out = 'The <html> element does not have a lang attribute'; + return out; + } + } + }, + 'valid-lang': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Value of lang attribute is included in the list of valid languages'; + return out; + }, + fail: function anonymous(it) { + var out = 'Value of lang attribute not included in the list of valid languages'; + return out; + } + } + }, + 'has-alt': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Element has an alt attribute'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element does not have an alt attribute'; + return out; + } + } + }, + 'duplicate-img-label': { + impact: 'minor', + messages: { + pass: function anonymous(it) { + var out = 'Element does not duplicate existing text in <img> alt text'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element contains <img> element with alt text that duplicates existing text'; + return out; + } + } + }, + 'title-only': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Form element does not solely use title attribute for its label'; + return out; + }, + fail: function anonymous(it) { + var out = 'Only title used to generate label for form element'; + return out; + } + } + }, + 'implicit-label': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Form element has an implicit (wrapped) <label>'; + return out; + }, + fail: function anonymous(it) { + var out = 'Form element does not have an implicit (wrapped) <label>'; + return out; + } + } + }, + 'explicit-label': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Form element has an explicit <label>'; + return out; + }, + fail: function anonymous(it) { + var out = 'Form element does not have an explicit <label>'; + return out; + } + } + }, + 'help-same-as-label': { + impact: 'minor', + messages: { + pass: function anonymous(it) { + var out = 'Help text (title or aria-describedby) does not duplicate label text'; + return out; + }, + fail: function anonymous(it) { + var out = 'Help text (title or aria-describedby) text is the same as the label text'; + return out; + } + } + }, + 'multiple-label': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Form element does not have multiple <label> elements'; + return out; + }, + fail: function anonymous(it) { + var out = 'Form element has multiple <label> elements'; + return out; + } + } + }, + 'has-th': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Layout table does not use <th> elements'; + return out; + }, + fail: function anonymous(it) { + var out = 'Layout table uses <th> elements'; + return out; + } + } + }, + 'has-caption': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Layout table does not use <caption> element'; + return out; + }, + fail: function anonymous(it) { + var out = 'Layout table uses <caption> element'; + return out; + } + } + }, + 'has-summary': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Layout table does not use summary attribute'; + return out; + }, + fail: function anonymous(it) { + var out = 'Layout table uses summary attribute'; + return out; + } + } + }, + 'link-in-text-block': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Links can be distinguished from surrounding text in a way that does not rely on color'; + return out; + }, + fail: function anonymous(it) { + var out = 'Links can not be distinguished from surrounding text in a way that does not rely on color'; + return out; + }, + incomplete: { + bgContrast: 'Element\'s contrast ratio could not be determined. Check for a distinct hover/focus style', + bgImage: 'Element\'s contrast ratio could not be determined due to a background image', + bgGradient: 'Element\'s contrast ratio could not be determined due to a background gradient', + imgNode: 'Element\'s contrast ratio could not be determined because element contains an image node', + bgOverlap: 'Element\'s contrast ratio could not be determined because of element overlap', + default: 'Unable to determine contrast ratio' + } + } + }, + 'only-listitems': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'List element only has direct children that are allowed inside <li> elements'; + return out; + }, + fail: function anonymous(it) { + var out = 'List element has direct children that are not allowed inside <li> elements'; + return out; + } + } + }, + listitem: { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'List item has a <ul>, <ol> or role="list" parent element'; + return out; + }, + fail: function anonymous(it) { + var out = 'List item does not have a <ul>, <ol> or role="list" parent element'; + return out; + } + } + }, + 'meta-refresh': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = '<meta> tag does not immediately refresh the page'; + return out; + }, + fail: function anonymous(it) { + var out = '<meta> tag forces timed refresh of page'; + return out; + } + } + }, + 'meta-viewport-large': { + impact: 'minor', + messages: { + pass: function anonymous(it) { + var out = '<meta> tag does not prevent significant zooming'; + return out; + }, + fail: function anonymous(it) { + var out = '<meta> tag limits zooming'; + return out; + } + } + }, + 'meta-viewport': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = '<meta> tag does not disable zooming'; + return out; + }, + fail: function anonymous(it) { + var out = '<meta> tag disables zooming'; + return out; + } + } + }, + 'p-as-heading': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = '<p> elements are not styled as headings'; + return out; + }, + fail: function anonymous(it) { + var out = 'Heading elements should be used instead of styled p elements'; + return out; + } + } + }, + region: { + impact: 'moderate', + messages: { + pass: function anonymous(it) { + var out = 'Content contained by ARIA landmark'; + return out; + }, + fail: function anonymous(it) { + var out = 'Content not contained by an ARIA landmark'; + return out; + } + } + }, + 'html5-scope': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Scope attribute is only used on table header elements (<th>)'; + return out; + }, + fail: function anonymous(it) { + var out = 'In HTML 5, scope attributes may only be used on table header elements (<th>)'; + return out; + } + } + }, + 'scope-value': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Scope attribute is used correctly'; + return out; + }, + fail: function anonymous(it) { + var out = 'The value of the scope attribute may only be \'row\' or \'col\''; + return out; + } + } + }, + exists: { + impact: 'minor', + messages: { + pass: function anonymous(it) { + var out = 'Element does not exist'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element exists'; + return out; + } + } + }, + 'skip-link': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'Valid skip link found'; + return out; + }, + fail: function anonymous(it) { + var out = 'No valid skip link found'; + return out; + } + } + }, + tabindex: { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'Element does not have a tabindex greater than 0'; + return out; + }, + fail: function anonymous(it) { + var out = 'Element has a tabindex greater than 0'; + return out; + } + } + }, + 'same-caption-summary': { + impact: 'moderate', + messages: { + pass: function anonymous(it) { + var out = 'Content of summary attribute and <caption> are not duplicated'; + return out; + }, + fail: function anonymous(it) { + var out = 'Content of summary attribute and <caption> element are identical'; + return out; + } + } + }, + 'caption-faked': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'The first row of a table is not used as a caption'; + return out; + }, + fail: function anonymous(it) { + var out = 'The first row of the table should be a caption instead of a table cell'; + return out; + } + } + }, + 'td-has-header': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'All non-empty data cells have table headers'; + return out; + }, + fail: function anonymous(it) { + var out = 'Some non-empty data cells do not have table headers'; + return out; + } + } + }, + 'td-headers-attr': { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'The headers attribute is exclusively used to refer to other cells in the table'; + return out; + }, + fail: function anonymous(it) { + var out = 'The headers attribute is not exclusively used to refer to other cells in the table'; + return out; + } + } + }, + 'th-has-data-cells': { + impact: 'critical', + messages: { + pass: function anonymous(it) { + var out = 'All table header cells refer to data cells'; + return out; + }, + fail: function anonymous(it) { + var out = 'Not all table header cells refer to data cells'; + return out; + }, + incomplete: function anonymous(it) { + var out = 'Table data cells are missing or empty'; + return out; + } + } + }, + description: { + impact: 'serious', + messages: { + pass: function anonymous(it) { + var out = 'The multimedia element has an audio description track'; + return out; + }, + fail: function anonymous(it) { + var out = 'The multimedia element does not have an audio description track'; + return out; + }, + incomplete: function anonymous(it) { + var out = 'An audio description track for this element could not be found'; + return out; + } + } + } + }, + failureSummaries: { + any: { + failureMessage: function anonymous(it) { + var out = 'Fix any of the following:'; + var arr1 = it; + if (arr1) { + var value, i1 = -1, l1 = arr1.length - 1; + while (i1 < l1) { + value = arr1[i1 += 1]; + out += '\n ' + value.split('\n').join('\n '); + } + } + return out; + } + }, + none: { + failureMessage: function anonymous(it) { + var out = 'Fix all of the following:'; + var arr1 = it; + if (arr1) { + var value, i1 = -1, l1 = arr1.length - 1; + while (i1 < l1) { + value = arr1[i1 += 1]; + out += '\n ' + value.split('\n').join('\n '); + } + } + return out; + } + } + }, + incompleteFallbackMessage: function anonymous(it) { + var out = 'aXe couldn\'t tell the reason. Time to break out the element inspector!'; + return out; + } + }, + rules: [ { + id: 'accesskeys', + selector: '[accesskey]', + excludeHidden: false, + tags: [ 'wcag2a', 'wcag211', 'cat.keyboard' ], + all: [], + any: [], + none: [ 'accesskeys' ] + }, { + id: 'area-alt', + selector: 'map area[href]', + excludeHidden: false, + tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag111', 'section508', 'section508.22.a' ], + all: [], + any: [ 'non-empty-alt', 'non-empty-title', 'aria-label', 'aria-labelledby' ], + none: [] + }, { + id: 'aria-allowed-attr', + matches: function matches(node) { + var role = node.getAttribute('role'); + if (!role) { + role = axe.commons.aria.implicitRole(node); + } + var allowed = axe.commons.aria.allowedAttr(role); + if (role && allowed) { + var aria = /^aria-/; + if (node.hasAttributes()) { + var attrs = node.attributes; + for (var i = 0, l = attrs.length; i < l; i++) { + if (aria.test(attrs[i].name)) { + return true; + } + } + } + } + return false; + }, + tags: [ 'cat.aria', 'wcag2a', 'wcag411', 'wcag412' ], + all: [], + any: [ 'aria-allowed-attr' ], + none: [] + }, { + id: 'aria-hidden-body', + selector: 'body', + excludeHidden: false, + tags: [ 'cat.aria', 'wcag2a', 'wcag412' ], + all: [], + any: [ 'aria-hidden-body' ], + none: [] + }, { + id: 'aria-required-attr', + selector: '[role]', + tags: [ 'cat.aria', 'wcag2a', 'wcag411', 'wcag412' ], + all: [], + any: [ 'aria-required-attr' ], + none: [] + }, { + id: 'aria-required-children', + selector: '[role]', + tags: [ 'cat.aria', 'wcag2a', 'wcag131' ], + all: [], + any: [ 'aria-required-children' ], + none: [] + }, { + id: 'aria-required-parent', + selector: '[role]', + tags: [ 'cat.aria', 'wcag2a', 'wcag131' ], + all: [], + any: [ 'aria-required-parent' ], + none: [] + }, { + id: 'aria-roles', + selector: '[role]', + tags: [ 'cat.aria', 'wcag2a', 'wcag131', 'wcag411', 'wcag412' ], + all: [], + any: [], + none: [ 'invalidrole', 'abstractrole' ] + }, { + id: 'aria-valid-attr-value', + matches: function matches(node) { + var aria = /^aria-/; + if (node.hasAttributes()) { + var attrs = node.attributes; + for (var i = 0, l = attrs.length; i < l; i++) { + if (aria.test(attrs[i].name)) { + return true; + } + } + } + return false; + }, + tags: [ 'cat.aria', 'wcag2a', 'wcag131', 'wcag411', 'wcag412' ], + all: [], + any: [ { + options: [], + id: 'aria-valid-attr-value' + } ], + none: [] + }, { + id: 'aria-valid-attr', + matches: function matches(node) { + var aria = /^aria-/; + if (node.hasAttributes()) { + var attrs = node.attributes; + for (var i = 0, l = attrs.length; i < l; i++) { + if (aria.test(attrs[i].name)) { + return true; + } + } + } + return false; + }, + tags: [ 'cat.aria', 'wcag2a', 'wcag411' ], + all: [], + any: [ { + options: [], + id: 'aria-valid-attr' + } ], + none: [] + }, { + id: 'audio-caption', + selector: 'audio', + excludeHidden: false, + tags: [ 'cat.time-and-media', 'wcag2a', 'wcag122', 'section508', 'section508.22.a' ], + all: [], + any: [], + none: [ 'caption' ] + }, { + id: 'blink', + selector: 'blink', + excludeHidden: false, + tags: [ 'cat.time-and-media', 'wcag2a', 'wcag222', 'section508', 'section508.22.j' ], + all: [], + any: [], + none: [ 'is-on-screen' ] + }, { + id: 'button-name', + selector: 'button, [role="button"], input[type="button"], input[type="submit"], input[type="reset"]', + tags: [ 'cat.name-role-value', 'wcag2a', 'wcag412', 'section508', 'section508.22.a' ], + all: [], + any: [ 'non-empty-if-present', 'non-empty-value', 'button-has-visible-text', 'aria-label', 'aria-labelledby', 'role-presentation', 'role-none' ], + none: [ 'focusable-no-name' ] + }, { + id: 'bypass', + selector: 'html', + pageLevel: true, + matches: function matches(node) { + return !!node.querySelector('a[href]'); + }, + tags: [ 'cat.keyboard', 'wcag2a', 'wcag241', 'section508', 'section508.22.o' ], + all: [], + any: [ 'internal-link-present', 'header-present', 'landmark' ], + none: [] + }, { + id: 'checkboxgroup', + selector: 'input[type=checkbox][name]', + tags: [ 'cat.forms', 'best-practice' ], + all: [], + any: [ 'group-labelledby', 'fieldset' ], + none: [] + }, { + id: 'color-contrast', + matches: function matches(node) { + var nodeName = node.nodeName.toUpperCase(), nodeType = node.type, doc = document; + if (node.getAttribute('aria-disabled') === 'true' || axe.commons.dom.findUp(node, '[aria-disabled="true"]')) { + return false; + } + if (nodeName === 'INPUT') { + return [ 'hidden', 'range', 'color', 'checkbox', 'radio', 'image' ].indexOf(nodeType) === -1 && !node.disabled; + } + if (nodeName === 'SELECT') { + return !!node.options.length && !node.disabled; + } + if (nodeName === 'TEXTAREA') { + return !node.disabled; + } + if (nodeName === 'OPTION') { + return false; + } + if (nodeName === 'BUTTON' && node.disabled || axe.commons.dom.findUp(node, 'button[disabled]')) { + return false; + } + if (nodeName === 'FIELDSET' && node.disabled || axe.commons.dom.findUp(node, 'fieldset[disabled]')) { + return false; + } + var nodeParentLabel = axe.commons.dom.findUp(node, 'label'); + if (nodeName === 'LABEL' || nodeParentLabel) { + var relevantNode = node; + if (nodeParentLabel) { + relevantNode = nodeParentLabel; + } + var candidate = relevantNode.htmlFor && doc.getElementById(relevantNode.htmlFor); + if (candidate && candidate.disabled) { + return false; + } + var candidate = node.querySelector('input:not([type="hidden"]):not([type="image"])' + ':not([type="button"]):not([type="submit"]):not([type="reset"]), select, textarea'); + if (candidate && candidate.disabled) { + return false; + } + } + if (node.id) { + var candidate = doc.querySelector('[aria-labelledby~=' + axe.commons.utils.escapeSelector(node.id) + ']'); + if (candidate && candidate.disabled) { + return false; + } + } + if (axe.commons.text.visible(node, false, true) === '') { + return false; + } + var range = document.createRange(), childNodes = node.childNodes, length = childNodes.length, child, index; + for (index = 0; index < length; index++) { + child = childNodes[index]; + if (child.nodeType === 3 && axe.commons.text.sanitize(child.nodeValue) !== '') { + range.selectNodeContents(child); + } + } + var rects = range.getClientRects(); + length = rects.length; + for (index = 0; index < length; index++) { + if (axe.commons.dom.visuallyOverlaps(rects[index], node)) { + return true; + } + } + return false; + }, + excludeHidden: false, + options: { + noScroll: false + }, + tags: [ 'cat.color', 'wcag2aa', 'wcag143' ], + all: [], + any: [ 'color-contrast' ], + none: [] + }, { + id: 'definition-list', + selector: 'dl', + matches: function matches(node) { + return !node.getAttribute('role'); + }, + tags: [ 'cat.structure', 'wcag2a', 'wcag131' ], + all: [], + any: [], + none: [ 'structured-dlitems', 'only-dlitems' ] + }, { + id: 'dlitem', + selector: 'dd, dt', + matches: function matches(node) { + return !node.getAttribute('role'); + }, + tags: [ 'cat.structure', 'wcag2a', 'wcag131' ], + all: [], + any: [ 'dlitem' ], + none: [] + }, { + id: 'document-title', + selector: 'html', + matches: function matches(node) { + return node.ownerDocument.defaultView.self === node.ownerDocument.defaultView.top; + }, + tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag242' ], + all: [], + any: [ 'doc-has-title' ], + none: [] + }, { + id: 'duplicate-id', + selector: '[id]', + excludeHidden: false, + tags: [ 'cat.parsing', 'wcag2a', 'wcag411' ], + all: [], + any: [ 'duplicate-id' ], + none: [] + }, { + id: 'empty-heading', + selector: 'h1, h2, h3, h4, h5, h6, [role="heading"]', + enabled: true, + tags: [ 'cat.name-role-value', 'best-practice' ], + all: [], + any: [ 'has-visible-text', 'role-presentation', 'role-none' ], + none: [] + }, { + id: 'frame-title-unique', + selector: 'frame[title], iframe[title]', + matches: function matches(node) { + var title = node.getAttribute('title'); + return !!(title ? axe.commons.text.sanitize(title).trim() : ''); + }, + tags: [ 'cat.text-alternatives', 'best-practice' ], + all: [], + any: [], + none: [ 'unique-frame-title' ] + }, { + id: 'frame-title', + selector: 'frame, iframe', + tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag241', 'section508', 'section508.22.i' ], + all: [], + any: [ 'aria-label', 'aria-labelledby', 'non-empty-title', 'role-presentation', 'role-none' ], + none: [] + }, { + id: 'heading-order', + selector: 'h1,h2,h3,h4,h5,h6,[role=heading]', + enabled: false, + tags: [ 'cat.semantics', 'best-practice' ], + all: [], + any: [ 'heading-order' ], + none: [] + }, { + id: 'hidden-content', + selector: '*', + excludeHidden: false, + tags: [ 'experimental', 'review-item' ], + all: [], + any: [ 'hidden-content' ], + none: [], + enabled: false + }, { + id: 'href-no-hash', + selector: 'a[href]', + enabled: false, + tags: [ 'cat.semantics', 'best-practice' ], + all: [], + any: [ 'href-no-hash' ], + none: [] + }, { + id: 'html-has-lang', + selector: 'html', + tags: [ 'cat.language', 'wcag2a', 'wcag311' ], + all: [], + any: [ 'has-lang' ], + none: [] + }, { + id: 'html-lang-valid', + selector: 'html[lang]', + tags: [ 'cat.language', 'wcag2a', 'wcag311' ], + all: [], + any: [], + none: [ 'valid-lang' ] + }, { + id: 'image-alt', + selector: 'img, [role=\'img\']', + tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag111', 'section508', 'section508.22.a' ], + all: [], + any: [ 'has-alt', 'aria-label', 'aria-labelledby', 'non-empty-title', 'role-presentation', 'role-none' ], + none: [] + }, { + id: 'image-redundant-alt', + selector: 'button, [role="button"], a[href], p, li, td, th', + tags: [ 'cat.text-alternatives', 'best-practice' ], + all: [], + any: [], + none: [ 'duplicate-img-label' ] + }, { + id: 'input-image-alt', + selector: 'input[type="image"]', + tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag111', 'section508', 'section508.22.a' ], + all: [], + any: [ 'non-empty-alt', 'aria-label', 'aria-labelledby', 'non-empty-title' ], + none: [] + }, { + id: 'label-title-only', + selector: 'input, select, textarea', + matches: function matches(node) { + if (node.nodeName.toLowerCase() !== 'input') { + return true; + } + var t = node.getAttribute('type').toLowerCase(); + if (t === 'hidden' || t === 'image' || t === 'button' || t === 'submit' || t === 'reset') { + return false; + } + return true; + }, + enabled: false, + tags: [ 'cat.forms', 'best-practice' ], + all: [], + any: [], + none: [ 'title-only' ] + }, { + id: 'label', + selector: 'input, select, textarea', + matches: function matches(node) { + if (node.nodeName.toLowerCase() !== 'input') { + return true; + } + var t = node.getAttribute('type').toLowerCase(); + if (t === 'hidden' || t === 'image' || t === 'button' || t === 'submit' || t === 'reset') { + return false; + } + return true; + }, + tags: [ 'cat.forms', 'wcag2a', 'wcag332', 'wcag131', 'section508', 'section508.22.n' ], + all: [], + any: [ 'aria-label', 'aria-labelledby', 'implicit-label', 'explicit-label', 'non-empty-title' ], + none: [ 'help-same-as-label', 'multiple-label' ] + }, { + id: 'layout-table', + selector: 'table', + matches: function matches(node) { + return !axe.commons.table.isDataTable(node); + }, + tags: [ 'cat.semantics', 'wcag2a', 'wcag131' ], + all: [], + any: [], + none: [ 'has-th', 'has-caption', 'has-summary' ] + }, { + id: 'link-in-text-block', + selector: 'a[href], *[role=link]', + matches: function matches(node) { + var text = axe.commons.text.sanitize(node.textContent); + var role = node.getAttribute('role'); + if (role && role !== 'link') { + return false; + } + if (!text) { + return false; + } + if (!axe.commons.dom.isVisible(node, false)) { + return false; + } + return axe.commons.dom.isInTextBlock(node); + }, + excludeHidden: false, + tags: [ 'cat.color', 'experimental', 'wcag2a', 'wcag141' ], + all: [ 'link-in-text-block' ], + any: [], + none: [] + }, { + id: 'link-name', + selector: 'a[href], [role=link][href]', + matches: function matches(node) { + return node.getAttribute('role') !== 'button'; + }, + tags: [ 'cat.name-role-value', 'wcag2a', 'wcag111', 'wcag412', 'section508', 'section508.22.a' ], + all: [], + any: [ 'has-visible-text', 'aria-label', 'aria-labelledby', 'role-presentation', 'role-none' ], + none: [ 'focusable-no-name' ] + }, { + id: 'list', + selector: 'ul, ol', + matches: function matches(node) { + return !node.getAttribute('role'); + }, + tags: [ 'cat.structure', 'wcag2a', 'wcag131' ], + all: [], + any: [], + none: [ 'only-listitems' ] + }, { + id: 'listitem', + selector: 'li', + matches: function matches(node) { + return !node.getAttribute('role'); + }, + tags: [ 'cat.structure', 'wcag2a', 'wcag131' ], + all: [], + any: [ 'listitem' ], + none: [] + }, { + id: 'marquee', + selector: 'marquee', + excludeHidden: false, + tags: [ 'cat.parsing', 'wcag2a', 'wcag222' ], + all: [], + any: [], + none: [ 'is-on-screen' ] + }, { + id: 'meta-refresh', + selector: 'meta[http-equiv="refresh"]', + excludeHidden: false, + tags: [ 'cat.time', 'wcag2a', 'wcag2aaa', 'wcag221', 'wcag224', 'wcag325' ], + all: [], + any: [ 'meta-refresh' ], + none: [] + }, { + id: 'meta-viewport-large', + selector: 'meta[name="viewport"]', + excludeHidden: false, + tags: [ 'cat.sensory-and-visual-cues', 'best-practice' ], + all: [], + any: [ { + options: { + scaleMinimum: 5, + lowerBound: 2 + }, + id: 'meta-viewport-large' + } ], + none: [] + }, { + id: 'meta-viewport', + selector: 'meta[name="viewport"]', + excludeHidden: false, + tags: [ 'cat.sensory-and-visual-cues', 'wcag2aa', 'wcag144' ], + all: [], + any: [ { + options: { + scaleMinimum: 2 + }, + id: 'meta-viewport' + } ], + none: [] + }, { + id: 'object-alt', + selector: 'object', + tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag111', 'section508', 'section508.22.a' ], + all: [], + any: [ 'has-visible-text', 'aria-label', 'aria-labelledby', 'non-empty-title' ], + none: [] + }, { + id: 'p-as-heading', + selector: 'p', + matches: function matches(node) { + var children = Array.from(node.parentNode.childNodes); + var nodeText = node.textContent.trim(); + var isSentence = /[.!?:;](?![.!?:;])/g; + if (nodeText.length === 0 || (nodeText.match(isSentence) || []).length >= 2) { + return false; + } + var siblingsAfter = children.slice(children.indexOf(node) + 1).filter(function(elm) { + return elm.nodeName.toUpperCase() === 'P' && elm.textContent.trim() !== ''; + }); + return siblingsAfter.length !== 0; + }, + tags: [ 'cat.semantics', 'wcag2a', 'wcag131', 'experimental' ], + all: [ { + options: { + margins: [ { + weight: 150, + italic: true + }, { + weight: 150, + size: 1.15 + }, { + italic: true, + size: 1.15 + }, { + size: 1.4 + } ] + }, + id: 'p-as-heading' + } ], + any: [], + none: [] + }, { + id: 'radiogroup', + selector: 'input[type=radio][name]', + tags: [ 'cat.forms', 'best-practice' ], + all: [], + any: [ 'group-labelledby', 'fieldset' ], + none: [] + }, { + id: 'region', + selector: 'html', + pageLevel: true, + enabled: false, + tags: [ 'cat.keyboard', 'best-practice' ], + all: [], + any: [ 'region' ], + none: [] + }, { + id: 'scope-attr-valid', + selector: 'td[scope], th[scope]', + enabled: true, + tags: [ 'cat.tables', 'best-practice' ], + all: [ 'html5-scope', 'scope-value' ], + any: [], + none: [] + }, { + id: 'server-side-image-map', + selector: 'img[ismap]', + tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag211', 'section508', 'section508.22.f' ], + all: [], + any: [], + none: [ 'exists' ] + }, { + id: 'skip-link', + selector: 'a[href]', + pageLevel: true, + enabled: false, + tags: [ 'cat.keyboard', 'best-practice' ], + all: [], + any: [ 'skip-link' ], + none: [] + }, { + id: 'tabindex', + selector: '[tabindex]', + tags: [ 'cat.keyboard', 'best-practice' ], + all: [], + any: [ 'tabindex' ], + none: [] + }, { + id: 'table-duplicate-name', + selector: 'table', + tags: [ 'cat.tables', 'best-practice' ], + all: [], + any: [], + none: [ 'same-caption-summary' ] + }, { + id: 'table-fake-caption', + selector: 'table', + matches: function matches(node) { + return axe.commons.table.isDataTable(node); + }, + tags: [ 'cat.tables', 'experimental', 'wcag2a', 'wcag131', 'section508', 'section508.22.g' ], + all: [ 'caption-faked' ], + any: [], + none: [] + }, { + id: 'td-has-header', + selector: 'table', + matches: function matches(node) { + if (axe.commons.table.isDataTable(node)) { + var tableArray = axe.commons.table.toArray(node); + return tableArray.length >= 3 && tableArray[0].length >= 3 && tableArray[1].length >= 3 && tableArray[2].length >= 3; + } + return false; + }, + tags: [ 'cat.tables', 'experimental', 'wcag2a', 'wcag131', 'section508', 'section508.22.g' ], + all: [ 'td-has-header' ], + any: [], + none: [] + }, { + id: 'td-headers-attr', + selector: 'table', + tags: [ 'cat.tables', 'wcag2a', 'wcag131', 'section508', 'section508.22.g' ], + all: [ 'td-headers-attr' ], + any: [], + none: [] + }, { + id: 'th-has-data-cells', + selector: 'table', + matches: function matches(node) { + return axe.commons.table.isDataTable(node); + }, + tags: [ 'cat.tables', 'wcag2a', 'wcag131', 'section508', 'section508.22.g' ], + all: [ 'th-has-data-cells' ], + any: [], + none: [] + }, { + id: 'valid-lang', + selector: '[lang], [xml\\:lang]', + matches: function matches(node) { + return node.nodeName.toLowerCase() !== 'html'; + }, + tags: [ 'cat.language', 'wcag2aa', 'wcag312' ], + all: [], + any: [], + none: [ 'valid-lang' ] + }, { + id: 'video-caption', + selector: 'video', + excludeHidden: false, + tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag122', 'wcag123', 'section508', 'section508.22.a' ], + all: [], + any: [], + none: [ 'caption' ] + }, { + id: 'video-description', + selector: 'video', + excludeHidden: false, + tags: [ 'cat.text-alternatives', 'wcag2aa', 'wcag125', 'section508', 'section508.22.b' ], + all: [], + any: [], + none: [ 'description' ] + } ], + checks: [ { + id: 'abstractrole', + evaluate: function evaluate(node, options) { + return axe.commons.aria.getRoleType(node.getAttribute('role')) === 'abstract'; + } + }, { + id: 'aria-allowed-attr', + evaluate: function evaluate(node, options) { + var invalid = []; + var attr, attrName, allowed, role = node.getAttribute('role'), attrs = node.attributes; + if (!role) { + role = axe.commons.aria.implicitRole(node); + } + allowed = axe.commons.aria.allowedAttr(role); + if (role && allowed) { + for (var i = 0, l = attrs.length; i < l; i++) { + attr = attrs[i]; + attrName = attr.name; + if (axe.commons.aria.validateAttr(attrName) && allowed.indexOf(attrName) === -1) { + invalid.push(attrName + '="' + attr.nodeValue + '"'); + } + } + } + if (invalid.length) { + this.data(invalid); + return false; + } + return true; + } + }, { + id: 'aria-hidden-body', + evaluate: function evaluate(node, options) { + return node.getAttribute('aria-hidden') !== 'true'; + } + }, { + id: 'invalidrole', + evaluate: function evaluate(node, options) { + return !axe.commons.aria.isValidRole(node.getAttribute('role')); + } + }, { + id: 'aria-required-attr', + evaluate: function evaluate(node, options) { + var missing = []; + if (node.hasAttributes()) { + var attr, role = node.getAttribute('role'), required = axe.commons.aria.requiredAttr(role); + if (role && required) { + for (var i = 0, l = required.length; i < l; i++) { + attr = required[i]; + if (!node.getAttribute(attr)) { + missing.push(attr); + } + } + } + } + if (missing.length) { + this.data(missing); + return false; + } + return true; + } + }, { + id: 'aria-required-children', + evaluate: function evaluate(node, options) { + var requiredOwned = axe.commons.aria.requiredOwned, implicitNodes = axe.commons.aria.implicitNodes, matchesSelector = axe.commons.utils.matchesSelector, idrefs = axe.commons.dom.idrefs; + function owns(node, role, ariaOwned) { + if (node === null) { + return false; + } + var implicit = implicitNodes(role), selector = [ '[role="' + role + '"]' ]; + if (implicit) { + selector = selector.concat(implicit); + } + selector = selector.join(','); + return ariaOwned ? matchesSelector(node, selector) || !!node.querySelector(selector) : !!node.querySelector(selector); + } + function ariaOwns(nodes, role) { + var index, length; + for (index = 0, length = nodes.length; index < length; index++) { + if (nodes[index] === null) { + continue; + } + if (owns(nodes[index], role, true)) { + return true; + } + } + return false; + } + function missingRequiredChildren(node, childRoles, all) { + var i, l = childRoles.length, missing = [], ownedElements = idrefs(node, 'aria-owns'); + for (i = 0; i < l; i++) { + var r = childRoles[i]; + if (owns(node, r) || ariaOwns(ownedElements, r)) { + if (!all) { + return null; + } + } else { + if (all) { + missing.push(r); + } + } + } + if (missing.length) { + return missing; + } + if (!all && childRoles.length) { + return childRoles; + } + return null; + } + var role = node.getAttribute('role'); + var required = requiredOwned(role); + if (!required) { + return true; + } + var all = false; + var childRoles = required.one; + if (!childRoles) { + var all = true; + childRoles = required.all; + } + var missing = missingRequiredChildren(node, childRoles, all); + if (!missing) { + return true; + } + this.data(missing); + return false; + } + }, { + id: 'aria-required-parent', + evaluate: function evaluate(node, options) { + function getSelector(role) { + var impliedNative = axe.commons.aria.implicitNodes(role) || []; + return impliedNative.concat('[role="' + role + '"]').join(','); + } + function getMissingContext(element, requiredContext, includeElement) { + var index, length, role = element.getAttribute('role'), missing = []; + if (!requiredContext) { + requiredContext = axe.commons.aria.requiredContext(role); + } + if (!requiredContext) { + return null; + } + for (index = 0, length = requiredContext.length; index < length; index++) { + if (includeElement && axe.utils.matchesSelector(element, getSelector(requiredContext[index]))) { + return null; + } + if (axe.commons.dom.findUp(element, getSelector(requiredContext[index]))) { + return null; + } else { + missing.push(requiredContext[index]); + } + } + return missing; + } + function getAriaOwners(element) { + var owners = [], o = null; + while (element) { + if (element.id) { + o = document.querySelector('[aria-owns~=' + axe.commons.utils.escapeSelector(element.id) + ']'); + if (o) { + owners.push(o); + } + } + element = element.parentNode; + } + return owners.length ? owners : null; + } + var missingParents = getMissingContext(node); + if (!missingParents) { + return true; + } + var owners = getAriaOwners(node); + if (owners) { + for (var i = 0, l = owners.length; i < l; i++) { + missingParents = getMissingContext(owners[i], missingParents, true); + if (!missingParents) { + return true; + } + } + } + this.data(missingParents); + return false; + } + }, { + id: 'aria-valid-attr-value', + evaluate: function evaluate(node, options) { + options = Array.isArray(options) ? options : []; + var invalid = [], aria = /^aria-/; + var attr, attrName, attrs = node.attributes; + for (var i = 0, l = attrs.length; i < l; i++) { + attr = attrs[i]; + attrName = attr.name; + if (options.indexOf(attrName) === -1 && aria.test(attrName) && !axe.commons.aria.validateAttrValue(node, attrName)) { + invalid.push(attrName + '="' + attr.nodeValue + '"'); + } + } + if (invalid.length) { + this.data(invalid); + return false; + } + return true; + }, + options: [] + }, { + id: 'aria-valid-attr', + evaluate: function evaluate(node, options) { + options = Array.isArray(options) ? options : []; + var invalid = [], aria = /^aria-/; + var attr, attrs = node.attributes; + for (var i = 0, l = attrs.length; i < l; i++) { + attr = attrs[i].name; + if (options.indexOf(attr) === -1 && aria.test(attr) && !axe.commons.aria.validateAttr(attr)) { + invalid.push(attr); + } + } + if (invalid.length) { + this.data(invalid); + return false; + } + return true; + }, + options: [] + }, { + id: 'color-contrast', + evaluate: function evaluate(node, options) { + if (!axe.commons.dom.isVisible(node, false)) { + return true; + } + var noScroll = !!(options || {}).noScroll; + var bgNodes = [], bgColor = axe.commons.color.getBackgroundColor(node, bgNodes, noScroll), fgColor = axe.commons.color.getForegroundColor(node, noScroll); + var nodeStyle = window.getComputedStyle(node); + var fontSize = parseFloat(nodeStyle.getPropertyValue('font-size')); + var fontWeight = nodeStyle.getPropertyValue('font-weight'); + var bold = [ 'bold', 'bolder', '600', '700', '800', '900' ].indexOf(fontWeight) !== -1; + var cr = axe.commons.color.hasValidContrastRatio(bgColor, fgColor, fontSize, bold); + var truncatedResult = Math.floor(cr.contrastRatio * 100) / 100; + var missing; + if (bgColor === null) { + missing = axe.commons.color.incompleteData.get('bgColor'); + } + var equalRatio = false; + if (truncatedResult === 1) { + equalRatio = true; + missing = axe.commons.color.incompleteData.set('bgColor', 'equalRatio'); + } + var data = { + fgColor: fgColor ? fgColor.toHexString() : undefined, + bgColor: bgColor ? bgColor.toHexString() : undefined, + contrastRatio: cr ? truncatedResult : undefined, + fontSize: (fontSize * 72 / 96).toFixed(1) + 'pt', + fontWeight: bold ? 'bold' : 'normal', + missingData: missing + }; + this.data(data); + if (!cr.isValid || equalRatio) { + this.relatedNodes(bgNodes); + } + if (fgColor === null || bgColor === null || equalRatio) { + missing = null; + axe.commons.color.incompleteData.clear(); + return undefined; + } + return cr.isValid; + } + }, { + id: 'link-in-text-block', + evaluate: function evaluate(node, options) { + var color = axe.commons.color; + function getContrast(color1, color2) { + var c1lum = color1.getRelativeLuminance(); + var c2lum = color2.getRelativeLuminance(); + return (Math.max(c1lum, c2lum) + .05) / (Math.min(c1lum, c2lum) + .05); + } + var blockLike = [ 'block', 'list-item', 'table', 'flex', 'grid', 'inline-block' ]; + function isBlock(elm) { + var display = window.getComputedStyle(elm).getPropertyValue('display'); + return blockLike.indexOf(display) !== -1 || display.substr(0, 6) === 'table-'; + } + if (isBlock(node)) { + return false; + } + var parentBlock = node.parentNode; + while (parentBlock.nodeType === 1 && !isBlock(parentBlock)) { + parentBlock = parentBlock.parentNode; + } + if (color.elementIsDistinct(node, parentBlock)) { + return true; + } else { + var nodeColor, parentColor; + nodeColor = color.getForegroundColor(node); + parentColor = color.getForegroundColor(parentBlock); + if (!nodeColor || !parentColor) { + return undefined; + } + var contrast = getContrast(nodeColor, parentColor); + if (contrast === 1) { + return true; + } else if (contrast >= 3) { + axe.commons.color.incompleteData.set('fgColor', 'bgContrast'); + this.data({ + missingData: axe.commons.color.incompleteData.get('fgColor') + }); + axe.commons.color.incompleteData.clear(); + return undefined; + } + nodeColor = color.getBackgroundColor(node); + parentColor = color.getBackgroundColor(parentBlock); + if (!nodeColor || !parentColor || getContrast(nodeColor, parentColor) >= 3) { + var reason = void 0; + if (!nodeColor || !parentColor) { + reason = axe.commons.color.incompleteData.get('bgColor'); + } else { + reason = 'bgContrast'; + } + axe.commons.color.incompleteData.set('fgColor', reason); + this.data({ + missingData: axe.commons.color.incompleteData.get('fgColor') + }); + axe.commons.color.incompleteData.clear(); + return undefined; + } + } + return false; + } + }, { + id: 'fieldset', + evaluate: function evaluate(node, options) { + var failureCode, self = this; + function getUnrelatedElements(parent, name) { + return axe.commons.utils.toArray(parent.querySelectorAll('select,textarea,button,input:not([name="' + name + '"]):not([type="hidden"])')); + } + function checkFieldset(group, name) { + var firstNode = group.firstElementChild; + if (!firstNode || firstNode.nodeName.toUpperCase() !== 'LEGEND') { + self.relatedNodes([ group ]); + failureCode = 'no-legend'; + return false; + } + if (!axe.commons.text.accessibleText(firstNode)) { + self.relatedNodes([ firstNode ]); + failureCode = 'empty-legend'; + return false; + } + var otherElements = getUnrelatedElements(group, name); + if (otherElements.length) { + self.relatedNodes(otherElements); + failureCode = 'mixed-inputs'; + return false; + } + return true; + } + function checkARIAGroup(group, name) { + var hasLabelledByText = axe.commons.dom.idrefs(group, 'aria-labelledby').some(function(element) { + return element && axe.commons.text.accessibleText(element); + }); + var ariaLabel = group.getAttribute('aria-label'); + if (!hasLabelledByText && !(ariaLabel && axe.commons.text.sanitize(ariaLabel))) { + self.relatedNodes(group); + failureCode = 'no-group-label'; + return false; + } + var otherElements = getUnrelatedElements(group, name); + if (otherElements.length) { + self.relatedNodes(otherElements); + failureCode = 'group-mixed-inputs'; + return false; + } + return true; + } + function spliceCurrentNode(nodes, current) { + return axe.commons.utils.toArray(nodes).filter(function(candidate) { + return candidate !== current; + }); + } + function runCheck(element) { + var name = axe.commons.utils.escapeSelector(node.name); + var matchingNodes = document.querySelectorAll('input[type="' + axe.commons.utils.escapeSelector(node.type) + '"][name="' + name + '"]'); + if (matchingNodes.length < 2) { + return true; + } + var fieldset = axe.commons.dom.findUp(element, 'fieldset'); + var group = axe.commons.dom.findUp(element, '[role="group"]' + (node.type === 'radio' ? ',[role="radiogroup"]' : '')); + if (!group && !fieldset) { + failureCode = 'no-group'; + self.relatedNodes(spliceCurrentNode(matchingNodes, element)); + return false; + } + return fieldset ? checkFieldset(fieldset, name) : checkARIAGroup(group, name); + } + var data = { + name: node.getAttribute('name'), + type: node.getAttribute('type') + }; + var result = runCheck(node); + if (!result) { + data.failureCode = failureCode; + } + this.data(data); + return result; + }, + after: function after(results, options) { + var seen = {}; + return results.filter(function(result) { + if (result.result) { + return true; + } + var data = result.data; + if (data) { + seen[data.type] = seen[data.type] || {}; + if (!seen[data.type][data.name]) { + seen[data.type][data.name] = [ data ]; + return true; + } + var hasBeenSeen = seen[data.type][data.name].some(function(candidate) { + return candidate.failureCode === data.failureCode; + }); + if (!hasBeenSeen) { + seen[data.type][data.name].push(data); + } + return !hasBeenSeen; + } + return false; + }); + } + }, { + id: 'group-labelledby', + evaluate: function evaluate(node, options) { + this.data({ + name: node.getAttribute('name'), + type: node.getAttribute('type') + }); + var matchingNodes = document.querySelectorAll('input[type="' + axe.commons.utils.escapeSelector(node.type) + '"][name="' + axe.commons.utils.escapeSelector(node.name) + '"]'); + if (matchingNodes.length <= 1) { + return true; + } + return [].map.call(matchingNodes, function(m) { + var l = m.getAttribute('aria-labelledby'); + return l ? l.split(/\s+/) : []; + }).reduce(function(prev, curr) { + return prev.filter(function(n) { + return curr.indexOf(n) !== -1; + }); + }).filter(function(n) { + var labelNode = document.getElementById(n); + return labelNode && axe.commons.text.accessibleText(labelNode); + }).length !== 0; + }, + after: function after(results, options) { + var seen = {}; + return results.filter(function(result) { + var data = result.data; + if (data) { + seen[data.type] = seen[data.type] || {}; + if (!seen[data.type][data.name]) { + seen[data.type][data.name] = true; + return true; + } + } + return false; + }); + } + }, { + id: 'accesskeys', + evaluate: function evaluate(node, options) { + if (axe.commons.dom.isVisible(node, false)) { + this.data(node.getAttribute('accesskey')); + this.relatedNodes([ node ]); + } + return true; + }, + after: function after(results, options) { + var seen = {}; + return results.filter(function(r) { + if (!r.data) { + return false; + } + var key = r.data.toUpperCase(); + if (!seen[key]) { + seen[key] = r; + r.relatedNodes = []; + return true; + } + seen[key].relatedNodes.push(r.relatedNodes[0]); + return false; + }).map(function(r) { + r.result = !!r.relatedNodes.length; + return r; + }); + } + }, { + id: 'focusable-no-name', + evaluate: function evaluate(node, options) { + var tabIndex = node.getAttribute('tabindex'), isFocusable = axe.commons.dom.isFocusable(node) && tabIndex > -1; + if (!isFocusable) { + return false; + } + return !axe.commons.text.accessibleText(node); + } + }, { + id: 'tabindex', + evaluate: function evaluate(node, options) { + return node.tabIndex <= 0; + } + }, { + id: 'duplicate-img-label', + evaluate: function evaluate(node, options) { + var imgs = node.querySelectorAll('img'); + var text = axe.commons.text.visible(node, true).toLowerCase(); + if (text === '') { + return false; + } + for (var i = 0, len = imgs.length; i < len; i++) { + var img = imgs[i]; + var imgAlt = axe.commons.text.accessibleText(img).toLowerCase(); + if (imgAlt === text && img.getAttribute('role') !== 'presentation' && axe.commons.dom.isVisible(img)) { + return true; + } + } + return false; + } + }, { + id: 'explicit-label', + evaluate: function evaluate(node, options) { + if (node.id) { + var label = document.querySelector('label[for="' + axe.commons.utils.escapeSelector(node.id) + '"]'); + if (label) { + return !!axe.commons.text.accessibleText(label); + } + } + return false; + } + }, { + id: 'help-same-as-label', + evaluate: function evaluate(node, options) { + var labelText = axe.commons.text.label(node), check = node.getAttribute('title'); + if (!labelText) { + return false; + } + if (!check) { + check = ''; + if (node.getAttribute('aria-describedby')) { + var ref = axe.commons.dom.idrefs(node, 'aria-describedby'); + check = ref.map(function(thing) { + return thing ? axe.commons.text.accessibleText(thing) : ''; + }).join(''); + } + } + return axe.commons.text.sanitize(check) === axe.commons.text.sanitize(labelText); + }, + enabled: false + }, { + id: 'implicit-label', + evaluate: function evaluate(node, options) { + var label = axe.commons.dom.findUp(node, 'label'); + if (label) { + return !!axe.commons.text.accessibleText(label); + } + return false; + } + }, { + id: 'multiple-label', + evaluate: function evaluate(node, options) { + var labels = [].slice.call(document.querySelectorAll('label[for="' + axe.commons.utils.escapeSelector(node.id) + '"]')), parent = node.parentNode; + if (labels.length) { + labels = labels.filter(function(label, index) { + if (index === 0 && !axe.commons.dom.isVisible(label, true) || axe.commons.dom.isVisible(label, true)) { + return label; + } + }); + } + while (parent) { + if (parent.tagName === 'LABEL' && labels.indexOf(parent) === -1) { + labels.push(parent); + } + parent = parent.parentNode; + } + this.relatedNodes(labels); + return labels.length > 1; + } + }, { + id: 'title-only', + evaluate: function evaluate(node, options) { + var labelText = axe.commons.text.label(node); + return !labelText && !!(node.getAttribute('title') || node.getAttribute('aria-describedby')); + } + }, { + id: 'has-lang', + evaluate: function evaluate(node, options) { + return !!(node.getAttribute('lang') || node.getAttribute('xml:lang') || '').trim(); + } + }, { + id: 'valid-lang', + evaluate: function evaluate(node, options) { + function getBaseLang(lang) { + return lang.trim().split('-')[0].toLowerCase(); + } + var langs, invalid; + langs = (options ? options : axe.commons.utils.validLangs()).map(getBaseLang); + invalid = [ 'lang', 'xml:lang' ].reduce(function(invalid, langAttr) { + var langVal = node.getAttribute(langAttr); + if (typeof langVal !== 'string') { + return invalid; + } + var baselangVal = getBaseLang(langVal); + if (baselangVal !== '' && langs.indexOf(baselangVal) === -1) { + invalid.push(langAttr + '="' + node.getAttribute(langAttr) + '"'); + } + return invalid; + }, []); + if (invalid.length) { + this.data(invalid); + return true; + } + return false; + } + }, { + id: 'dlitem', + evaluate: function evaluate(node, options) { + return node.parentNode.tagName === 'DL'; + } + }, { + id: 'has-listitem', + evaluate: function evaluate(node, options) { + var children = node.children; + if (children.length === 0) { + return true; + } + for (var i = 0; i < children.length; i++) { + if (children[i].nodeName.toUpperCase() === 'LI') { + return false; + } + } + return true; + } + }, { + id: 'listitem', + evaluate: function evaluate(node, options) { + if ([ 'UL', 'OL' ].indexOf(node.parentNode.nodeName.toUpperCase()) !== -1) { + return true; + } + return node.parentNode.getAttribute('role') === 'list'; + } + }, { + id: 'only-dlitems', + evaluate: function evaluate(node, options) { + var child, nodeName, bad = [], children = node.childNodes, permitted = [ 'STYLE', 'META', 'LINK', 'MAP', 'AREA', 'SCRIPT', 'DATALIST', 'TEMPLATE' ], hasNonEmptyTextNode = false; + for (var i = 0; i < children.length; i++) { + child = children[i]; + var nodeName = child.nodeName.toUpperCase(); + if (child.nodeType === 1 && nodeName !== 'DT' && nodeName !== 'DD' && permitted.indexOf(nodeName) === -1) { + bad.push(child); + } else if (child.nodeType === 3 && child.nodeValue.trim() !== '') { + hasNonEmptyTextNode = true; + } + } + if (bad.length) { + this.relatedNodes(bad); + } + var retVal = !!bad.length || hasNonEmptyTextNode; + return retVal; + } + }, { + id: 'only-listitems', + evaluate: function evaluate(node, options) { + var child, nodeName, bad = [], children = node.childNodes, permitted = [ 'STYLE', 'META', 'LINK', 'MAP', 'AREA', 'SCRIPT', 'DATALIST', 'TEMPLATE' ], hasNonEmptyTextNode = false; + for (var i = 0; i < children.length; i++) { + child = children[i]; + nodeName = child.nodeName.toUpperCase(); + if (child.nodeType === 1 && nodeName !== 'LI' && permitted.indexOf(nodeName) === -1) { + bad.push(child); + } else if (child.nodeType === 3 && child.nodeValue.trim() !== '') { + hasNonEmptyTextNode = true; + } + } + if (bad.length) { + this.relatedNodes(bad); + } + return !!bad.length || hasNonEmptyTextNode; + } + }, { + id: 'structured-dlitems', + evaluate: function evaluate(node, options) { + var children = node.children; + if (!children || !children.length) { + return false; + } + var hasDt = false, hasDd = false, nodeName; + for (var i = 0; i < children.length; i++) { + nodeName = children[i].nodeName.toUpperCase(); + if (nodeName === 'DT') { + hasDt = true; + } + if (hasDt && nodeName === 'DD') { + return false; + } + if (nodeName === 'DD') { + hasDd = true; + } + } + return hasDt || hasDd; + } + }, { + id: 'caption', + evaluate: function evaluate(node, options) { + var tracks = node.querySelectorAll('track'); + if (tracks.length) { + for (var i = 0; i < tracks.length; i++) { + var kind = tracks[i].getAttribute('kind'); + if (kind && kind === 'captions') { + return false; + } + } + return true; + } + return undefined; + } + }, { + id: 'description', + evaluate: function evaluate(node, options) { + var tracks = node.querySelectorAll('track'); + if (tracks.length) { + for (var i = 0; i < tracks.length; i++) { + var kind = tracks[i].getAttribute('kind'); + if (kind && kind === 'descriptions') { + return false; + } + } + return true; + } + return undefined; + } + }, { + id: 'meta-viewport-large', + evaluate: function evaluate(node, options) { + options = options || {}; + var params, content = node.getAttribute('content') || '', parsedParams = content.split(/[;,]/), result = {}, minimum = options.scaleMinimum || 2, lowerBound = options.lowerBound || false; + for (var i = 0, l = parsedParams.length; i < l; i++) { + params = parsedParams[i].split('='); + var key = params.shift().toLowerCase(); + if (key && params.length) { + result[key.trim()] = params.shift().trim().toLowerCase(); + } + } + if (lowerBound && result['maximum-scale'] && parseFloat(result['maximum-scale']) < lowerBound) { + return true; + } + if (!lowerBound && result['user-scalable'] === 'no') { + return false; + } + if (result['maximum-scale'] && parseFloat(result['maximum-scale']) < minimum) { + return false; + } + return true; + }, + options: { + scaleMinimum: 5, + lowerBound: 2 + } + }, { + id: 'meta-viewport', + evaluate: function evaluate(node, options) { + options = options || {}; + var params, content = node.getAttribute('content') || '', parsedParams = content.split(/[;,]/), result = {}, minimum = options.scaleMinimum || 2, lowerBound = options.lowerBound || false; + for (var i = 0, l = parsedParams.length; i < l; i++) { + params = parsedParams[i].split('='); + var key = params.shift().toLowerCase(); + if (key && params.length) { + result[key.trim()] = params.shift().trim().toLowerCase(); + } + } + if (lowerBound && result['maximum-scale'] && parseFloat(result['maximum-scale']) < lowerBound) { + return true; + } + if (!lowerBound && result['user-scalable'] === 'no') { + return false; + } + if (result['maximum-scale'] && parseFloat(result['maximum-scale']) < minimum) { + return false; + } + return true; + }, + options: { + scaleMinimum: 2 + } + }, { + id: 'header-present', + evaluate: function evaluate(node, options) { + return !!node.querySelector('h1, h2, h3, h4, h5, h6, [role="heading"]'); + } + }, { + id: 'heading-order', + evaluate: function evaluate(node, options) { + var ariaHeadingLevel = node.getAttribute('aria-level'); + if (ariaHeadingLevel !== null) { + this.data(parseInt(ariaHeadingLevel, 10)); + return true; + } + var headingLevel = node.tagName.match(/H(\d)/); + if (headingLevel) { + this.data(parseInt(headingLevel[1], 10)); + return true; + } + return true; + }, + after: function after(results, options) { + if (results.length < 2) { + return results; + } + var prevLevel = results[0].data; + for (var i = 1; i < results.length; i++) { + if (results[i].result && results[i].data > prevLevel + 1) { + results[i].result = false; + } + prevLevel = results[i].data; + } + return results; + } + }, { + id: 'href-no-hash', + evaluate: function evaluate(node, options) { + var href = node.getAttribute('href'); + if (href === '#') { + return false; + } + return true; + } + }, { + id: 'internal-link-present', + evaluate: function evaluate(node, options) { + return !!node.querySelector('a[href^="#"]'); + } + }, { + id: 'landmark', + evaluate: function evaluate(node, options) { + return node.getElementsByTagName('main').length > 0 || !!node.querySelector('[role="main"]'); + } + }, { + id: 'meta-refresh', + evaluate: function evaluate(node, options) { + var content = node.getAttribute('content') || '', parsedParams = content.split(/[;,]/); + return content === '' || parsedParams[0] === '0'; + } + }, { + id: 'p-as-heading', + evaluate: function evaluate(node, options) { + var siblings = Array.from(node.parentNode.children); + var currentIndex = siblings.indexOf(node); + options = options || {}; + var margins = options.margins || []; + var nextSibling = siblings.slice(currentIndex + 1).find(function(elm) { + return elm.nodeName.toUpperCase() === 'P'; + }); + var prevSibling = siblings.slice(0, currentIndex).reverse().find(function(elm) { + return elm.nodeName.toUpperCase() === 'P'; + }); + function getTextContainer(elm) { + var nextNode = elm; + var outerText = elm.textContent.trim(); + var innerText = outerText; + while (innerText === outerText && nextNode !== undefined) { + var i = -1; + elm = nextNode; + if (elm.children.length === 0) { + return elm; + } + do { + i++; + innerText = elm.children[i].textContent.trim(); + } while (innerText === '' && i + 1 < elm.children.length); + nextNode = elm.children[i]; + } + return elm; + } + function normalizeFontWeight(weight) { + switch (weight) { + case 'lighter': + return 100; + + case 'normal': + return 400; + + case 'bold': + return 700; + + case 'bolder': + return 900; + } + weight = parseInt(weight); + return !isNaN(weight) ? weight : 400; + } + function getStyleValues(node) { + var style = window.getComputedStyle(getTextContainer(node)); + return { + fontWeight: normalizeFontWeight(style.getPropertyValue('font-weight')), + fontSize: parseInt(style.getPropertyValue('font-size')), + isItalic: style.getPropertyValue('font-style') === 'italic' + }; + } + function isHeaderStyle(styleA, styleB, margins) { + return margins.reduce(function(out, margin) { + return out || (!margin.size || styleA.fontSize / margin.size > styleB.fontSize) && (!margin.weight || styleA.fontWeight - margin.weight > styleB.fontWeight) && (!margin.italic || styleA.isItalic && !styleB.isItalic); + }, false); + } + var currStyle = getStyleValues(node); + var nextStyle = nextSibling ? getStyleValues(nextSibling) : null; + var prevStyle = prevSibling ? getStyleValues(prevSibling) : null; + if (!nextStyle || !isHeaderStyle(currStyle, nextStyle, margins)) { + return true; + } + var blockquote = axe.commons.dom.findUp(node, 'blockquote'); + if (blockquote && blockquote.nodeName.toUpperCase() === 'BLOCKQUOTE') { + return undefined; + } + if (prevStyle && !isHeaderStyle(currStyle, prevStyle, margins)) { + return undefined; + } + return false; + }, + options: { + margins: [ { + weight: 150, + italic: true + }, { + weight: 150, + size: 1.15 + }, { + italic: true, + size: 1.15 + }, { + size: 1.4 + } ] + } + }, { + id: 'region', + evaluate: function evaluate(node, options) { + var landmarkRoles = axe.commons.aria.getRolesByType('landmark'), firstLink = node.querySelector('a[href]'); + function isSkipLink(n) { + return firstLink && axe.commons.dom.isFocusable(axe.commons.dom.getElementByReference(firstLink, 'href')) && firstLink === n; + } + function isLandmark(n) { + var role = n.getAttribute('role'); + return role && landmarkRoles.indexOf(role) !== -1; + } + function checkRegion(n) { + if (isLandmark(n)) { + return null; + } + if (isSkipLink(n)) { + return getViolatingChildren(n); + } + if (axe.commons.dom.isVisible(n, true) && (axe.commons.text.visible(n, true, true) || axe.commons.dom.isVisualContent(n))) { + return n; + } + return getViolatingChildren(n); + } + function getViolatingChildren(n) { + var children = axe.commons.utils.toArray(n.children); + if (children.length === 0) { + return []; + } + return children.map(checkRegion).filter(function(c) { + return c !== null; + }).reduce(function(a, b) { + return a.concat(b); + }, []); + } + var v = getViolatingChildren(node); + this.relatedNodes(v); + return !v.length; + }, + after: function after(results, options) { + return [ results[0] ]; + } + }, { + id: 'skip-link', + evaluate: function evaluate(node, options) { + return axe.commons.dom.isFocusable(axe.commons.dom.getElementByReference(node, 'href')); + }, + after: function after(results, options) { + return [ results[0] ]; + } + }, { + id: 'unique-frame-title', + evaluate: function evaluate(node, options) { + var title = axe.commons.text.sanitize(node.title).trim().toLowerCase(); + this.data(title); + return true; + }, + after: function after(results, options) { + var titles = {}; + results.forEach(function(r) { + titles[r.data] = titles[r.data] !== undefined ? ++titles[r.data] : 0; + }); + results.forEach(function(r) { + r.result = !!titles[r.data]; + }); + return results; + } + }, { + id: 'aria-label', + evaluate: function evaluate(node, options) { + var label = node.getAttribute('aria-label'); + return !!(label ? axe.commons.text.sanitize(label).trim() : ''); + } + }, { + id: 'aria-labelledby', + evaluate: function evaluate(node, options) { + var getIdRefs = axe.commons.dom.idrefs; + return getIdRefs(node, 'aria-labelledby').some(function(elm) { + return elm && axe.commons.text.accessibleText(elm, true); + }); + } + }, { + id: 'button-has-visible-text', + evaluate: function evaluate(node, options) { + var nodeName = node.nodeName.toUpperCase(); + var role = node.getAttribute('role'); + var label = void 0; + if (nodeName === 'BUTTON' || role === 'button' && nodeName !== 'INPUT') { + label = axe.commons.text.accessibleText(node); + this.data(label); + return !!label; + } else { + return false; + } + } + }, { + id: 'doc-has-title', + evaluate: function evaluate(node, options) { + var title = document.title; + return !!(title ? axe.commons.text.sanitize(title).trim() : ''); + } + }, { + id: 'duplicate-id', + evaluate: function evaluate(node, options) { + if (!node.id.trim()) { + return true; + } + var matchingNodes = document.querySelectorAll('[id="' + axe.commons.utils.escapeSelector(node.id) + '"]'); + var related = []; + for (var i = 0; i < matchingNodes.length; i++) { + if (matchingNodes[i] !== node) { + related.push(matchingNodes[i]); + } + } + if (related.length) { + this.relatedNodes(related); + } + this.data(node.getAttribute('id')); + return matchingNodes.length <= 1; + }, + after: function after(results, options) { + var uniqueIds = []; + return results.filter(function(r) { + if (uniqueIds.indexOf(r.data) === -1) { + uniqueIds.push(r.data); + return true; + } + return false; + }); + } + }, { + id: 'exists', + evaluate: function evaluate(node, options) { + return true; + } + }, { + id: 'has-alt', + evaluate: function evaluate(node, options) { + var nn = node.nodeName.toLowerCase(); + return node.hasAttribute('alt') && (nn === 'img' || nn === 'input' || nn === 'area'); + } + }, { + id: 'has-visible-text', + evaluate: function evaluate(node, options) { + return axe.commons.text.accessibleText(node).length > 0; + } + }, { + id: 'is-on-screen', + evaluate: function evaluate(node, options) { + return axe.commons.dom.isVisible(node, false) && !axe.commons.dom.isOffscreen(node); + } + }, { + id: 'non-empty-alt', + evaluate: function evaluate(node, options) { + var label = node.getAttribute('alt'); + return !!(label ? axe.commons.text.sanitize(label).trim() : ''); + } + }, { + id: 'non-empty-if-present', + evaluate: function evaluate(node, options) { + var nodeName = node.nodeName.toUpperCase(); + var type = (node.getAttribute('type') || '').toLowerCase(); + var label = node.getAttribute('value'); + this.data(label); + if (nodeName === 'INPUT' && [ 'submit', 'reset' ].indexOf(type) !== -1) { + return label === null; + } + return false; + } + }, { + id: 'non-empty-title', + evaluate: function evaluate(node, options) { + var title = node.getAttribute('title'); + return !!(title ? axe.commons.text.sanitize(title).trim() : ''); + } + }, { + id: 'non-empty-value', + evaluate: function evaluate(node, options) { + var label = node.getAttribute('value'); + return !!(label ? axe.commons.text.sanitize(label).trim() : ''); + } + }, { + id: 'role-none', + evaluate: function evaluate(node, options) { + return node.getAttribute('role') === 'none'; + } + }, { + id: 'role-presentation', + evaluate: function evaluate(node, options) { + return node.getAttribute('role') === 'presentation'; + } + }, { + id: 'caption-faked', + evaluate: function evaluate(node, options) { + var table = axe.commons.table.toGrid(node); + var firstRow = table[0]; + if (table.length <= 1 || firstRow.length <= 1 || node.rows.length <= 1) { + return true; + } + return firstRow.reduce(function(out, curr, i) { + return out || curr !== firstRow[i + 1] && firstRow[i + 1] !== undefined; + }, false); + } + }, { + id: 'has-caption', + evaluate: function evaluate(node, options) { + return !!node.caption; + } + }, { + id: 'has-summary', + evaluate: function evaluate(node, options) { + return !!node.summary; + } + }, { + id: 'has-th', + evaluate: function evaluate(node, options) { + var row, cell, badCells = []; + for (var rowIndex = 0, rowLength = node.rows.length; rowIndex < rowLength; rowIndex++) { + row = node.rows[rowIndex]; + for (var cellIndex = 0, cellLength = row.cells.length; cellIndex < cellLength; cellIndex++) { + cell = row.cells[cellIndex]; + if (cell.nodeName.toUpperCase() === 'TH' || [ 'rowheader', 'columnheader' ].indexOf(cell.getAttribute('role')) !== -1) { + badCells.push(cell); + } + } + } + if (badCells.length) { + this.relatedNodes(badCells); + return true; + } + return false; + } + }, { + id: 'html5-scope', + evaluate: function evaluate(node, options) { + if (!axe.commons.dom.isHTML5(document)) { + return true; + } + return node.nodeName.toUpperCase() === 'TH'; + } + }, { + id: 'same-caption-summary', + evaluate: function evaluate(node, options) { + return !!(node.summary && node.caption) && node.summary === axe.commons.text.accessibleText(node.caption); + } + }, { + id: 'scope-value', + evaluate: function evaluate(node, options) { + options = options || {}; + var value = node.getAttribute('scope').toLowerCase(); + var validVals = [ 'row', 'col', 'rowgroup', 'colgroup' ] || options.values; + return validVals.indexOf(value) !== -1; + } + }, { + id: 'td-has-header', + evaluate: function evaluate(node, options) { + var tableUtils = axe.commons.table; + var badCells = []; + var cells = tableUtils.getAllCells(node); + cells.forEach(function(cell) { + if (axe.commons.dom.hasContent(cell) && tableUtils.isDataCell(cell) && !axe.commons.aria.label(cell)) { + var hasHeaders = tableUtils.getHeaders(cell); + hasHeaders = hasHeaders.reduce(function(hasHeaders, header) { + return hasHeaders || header !== null && !!axe.commons.dom.hasContent(header); + }, false); + if (!hasHeaders) { + badCells.push(cell); + } + } + }); + if (badCells.length) { + this.relatedNodes(badCells); + return false; + } + return true; + } + }, { + id: 'td-headers-attr', + evaluate: function evaluate(node, options) { + var cells = []; + for (var rowIndex = 0, rowLength = node.rows.length; rowIndex < rowLength; rowIndex++) { + var row = node.rows[rowIndex]; + for (var cellIndex = 0, cellLength = row.cells.length; cellIndex < cellLength; cellIndex++) { + cells.push(row.cells[cellIndex]); + } + } + var ids = cells.reduce(function(ids, cell) { + if (cell.id) { + ids.push(cell.id); + } + return ids; + }, []); + var badCells = cells.reduce(function(badCells, cell) { + var isSelf, notOfTable; + var headers = (cell.getAttribute('headers') || '').split(/\s/).reduce(function(headers, header) { + header = header.trim(); + if (header) { + headers.push(header); + } + return headers; + }, []); + if (headers.length !== 0) { + if (cell.id) { + isSelf = headers.indexOf(cell.id.trim()) !== -1; + } + notOfTable = headers.reduce(function(fail, header) { + return fail || ids.indexOf(header) === -1; + }, false); + if (isSelf || notOfTable) { + badCells.push(cell); + } + } + return badCells; + }, []); + if (badCells.length > 0) { + this.relatedNodes(badCells); + return false; + } else { + return true; + } + } + }, { + id: 'th-has-data-cells', + evaluate: function evaluate(node, options) { + var tableUtils = axe.commons.table; + var cells = tableUtils.getAllCells(node); + var checkResult = this; + var reffedHeaders = []; + cells.forEach(function(cell) { + var headers = cell.getAttribute('headers'); + if (headers) { + reffedHeaders = reffedHeaders.concat(headers.split(/\s+/)); + } + var ariaLabel = cell.getAttribute('aria-labelledby'); + if (ariaLabel) { + reffedHeaders = reffedHeaders.concat(ariaLabel.split(/\s+/)); + } + }); + var headers = cells.filter(function(cell) { + if (axe.commons.text.sanitize(cell.textContent) === '') { + return false; + } + return cell.nodeName.toUpperCase() === 'TH' || [ 'rowheader', 'columnheader' ].indexOf(cell.getAttribute('role')) !== -1; + }); + var tableGrid = tableUtils.toGrid(node); + var out = headers.reduce(function(res, header) { + if (header.id && reffedHeaders.indexOf(header.id) !== -1) { + return !res ? res : true; + } + var hasCell = false; + var pos = tableUtils.getCellPosition(header, tableGrid); + if (tableUtils.isColumnHeader(header)) { + hasCell = tableUtils.traverse('down', pos, tableGrid).reduce(function(out, cell) { + return out || axe.commons.dom.hasContent(cell) && !tableUtils.isColumnHeader(cell); + }, false); + } + if (!hasCell && tableUtils.isRowHeader(header)) { + hasCell = tableUtils.traverse('right', pos, tableGrid).reduce(function(out, cell) { + return out || axe.commons.dom.hasContent(cell) && !tableUtils.isRowHeader(cell); + }, false); + } + if (!hasCell) { + checkResult.relatedNodes(header); + } + return res && hasCell; + }, true); + return out ? true : undefined; + } + }, { + id: 'hidden-content', + evaluate: function evaluate(node, options) { + var styles = window.getComputedStyle(node); + var whitelist = [ 'SCRIPT', 'HEAD', 'TITLE', 'NOSCRIPT', 'STYLE', 'TEMPLATE' ]; + if (!whitelist.includes(node.tagName.toUpperCase()) && axe.commons.dom.hasContent(node)) { + if (styles.getPropertyValue('display') === 'none') { + return undefined; + } else if (styles.getPropertyValue('visibility') === 'hidden') { + if (node.parentNode) { + var parentStyle = window.getComputedStyle(node.parentNode); + } + if (!parentStyle || parentStyle.getPropertyValue('visibility') !== 'hidden') { + return undefined; + } + } + } + return true; + } + } ], + commons: function() { + var commons = {}; + var aria = commons.aria = {}, lookupTables = aria._lut = {}; + lookupTables.attributes = { + 'aria-activedescendant': { + type: 'idref' + }, + 'aria-atomic': { + type: 'boolean', + values: [ 'true', 'false' ] + }, + 'aria-autocomplete': { + type: 'nmtoken', + values: [ 'inline', 'list', 'both', 'none' ] + }, + 'aria-busy': { + type: 'boolean', + values: [ 'true', 'false' ] + }, + 'aria-checked': { + type: 'nmtoken', + values: [ 'true', 'false', 'mixed', 'undefined' ] + }, + 'aria-colcount': { + type: 'int' + }, + 'aria-colindex': { + type: 'int' + }, + 'aria-colspan': { + type: 'int' + }, + 'aria-controls': { + type: 'idrefs' + }, + 'aria-current': { + type: 'nmtoken', + values: [ 'page', 'step', 'location', 'date', 'time', 'true', 'false' ] + }, + 'aria-describedby': { + type: 'idrefs' + }, + 'aria-disabled': { + type: 'boolean', + values: [ 'true', 'false' ] + }, + 'aria-dropeffect': { + type: 'nmtokens', + values: [ 'copy', 'move', 'reference', 'execute', 'popup', 'none' ] + }, + 'aria-expanded': { + type: 'nmtoken', + values: [ 'true', 'false', 'undefined' ] + }, + 'aria-flowto': { + type: 'idrefs' + }, + 'aria-grabbed': { + type: 'nmtoken', + values: [ 'true', 'false', 'undefined' ] + }, + 'aria-haspopup': { + type: 'boolean', + values: [ 'true', 'false' ] + }, + 'aria-hidden': { + type: 'boolean', + values: [ 'true', 'false' ] + }, + 'aria-invalid': { + type: 'nmtoken', + values: [ 'true', 'false', 'spelling', 'grammar' ] + }, + 'aria-label': { + type: 'string' + }, + 'aria-labelledby': { + type: 'idrefs' + }, + 'aria-level': { + type: 'int' + }, + 'aria-live': { + type: 'nmtoken', + values: [ 'off', 'polite', 'assertive' ] + }, + 'aria-multiline': { + type: 'boolean', + values: [ 'true', 'false' ] + }, + 'aria-multiselectable': { + type: 'boolean', + values: [ 'true', 'false' ] + }, + 'aria-orientation': { + type: 'nmtoken', + values: [ 'horizontal', 'vertical' ] + }, + 'aria-owns': { + type: 'idrefs' + }, + 'aria-posinset': { + type: 'int' + }, + 'aria-pressed': { + type: 'nmtoken', + values: [ 'true', 'false', 'mixed', 'undefined' ] + }, + 'aria-readonly': { + type: 'boolean', + values: [ 'true', 'false' ] + }, + 'aria-relevant': { + type: 'nmtokens', + values: [ 'additions', 'removals', 'text', 'all' ] + }, + 'aria-required': { + type: 'boolean', + values: [ 'true', 'false' ] + }, + 'aria-rowcount': { + type: 'int' + }, + 'aria-rowindex': { + type: 'int' + }, + 'aria-rowspan': { + type: 'int' + }, + 'aria-selected': { + type: 'nmtoken', + values: [ 'true', 'false', 'undefined' ] + }, + 'aria-setsize': { + type: 'int' + }, + 'aria-sort': { + type: 'nmtoken', + values: [ 'ascending', 'descending', 'other', 'none' ] + }, + 'aria-valuemax': { + type: 'decimal' + }, + 'aria-valuemin': { + type: 'decimal' + }, + 'aria-valuenow': { + type: 'decimal' + }, + 'aria-valuetext': { + type: 'string' + } + }; + lookupTables.globalAttributes = [ 'aria-atomic', 'aria-busy', 'aria-controls', 'aria-current', 'aria-describedby', 'aria-disabled', 'aria-dropeffect', 'aria-flowto', 'aria-grabbed', 'aria-haspopup', 'aria-hidden', 'aria-invalid', 'aria-label', 'aria-labelledby', 'aria-live', 'aria-owns', 'aria-relevant' ]; + lookupTables.role = { + alert: { + type: 'widget', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null + }, + alertdialog: { + type: 'widget', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null + }, + application: { + type: 'landmark', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null + }, + article: { + type: 'structure', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'article' ] + }, + banner: { + type: 'landmark', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'header' ] + }, + button: { + type: 'widget', + attributes: { + allowed: [ 'aria-expanded', 'aria-pressed' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: null, + implicit: [ 'button', 'input[type="button"]', 'input[type="image"]', 'input[type="reset"]', 'input[type="submit"]', 'summary' ] + }, + cell: { + type: 'structure', + attributes: { + allowed: [ 'aria-colindex', 'aria-colspan', 'aria-rowindex', 'aria-rowspan' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: [ 'row' ], + implicit: [ 'td', 'th' ] + }, + checkbox: { + type: 'widget', + attributes: { + required: [ 'aria-checked' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: null, + implicit: [ 'input[type="checkbox"]' ] + }, + columnheader: { + type: 'structure', + attributes: { + allowed: [ 'aria-expanded', 'aria-sort', 'aria-readonly', 'aria-selected', 'aria-required' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: [ 'row' ], + implicit: [ 'th' ] + }, + combobox: { + type: 'composite', + attributes: { + required: [ 'aria-expanded' ], + allowed: [ 'aria-autocomplete', 'aria-required', 'aria-activedescendant' ] + }, + owned: { + all: [ 'listbox', 'textbox' ] + }, + nameFrom: [ 'author' ], + context: null + }, + command: { + nameFrom: [ 'author' ], + type: 'abstract' + }, + complementary: { + type: 'landmark', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'aside' ] + }, + composite: { + nameFrom: [ 'author' ], + type: 'abstract' + }, + contentinfo: { + type: 'landmark', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'footer' ] + }, + definition: { + type: 'structure', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'dd' ] + }, + dialog: { + type: 'widget', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'dialog' ] + }, + directory: { + type: 'structure', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: null + }, + document: { + type: 'structure', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'body' ] + }, + form: { + type: 'landmark', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'form' ] + }, + grid: { + type: 'composite', + attributes: { + allowed: [ 'aria-level', 'aria-multiselectable', 'aria-readonly', 'aria-activedescendant', 'aria-expanded' ] + }, + owned: { + one: [ 'rowgroup', 'row' ] + }, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'table' ] + }, + gridcell: { + type: 'widget', + attributes: { + allowed: [ 'aria-selected', 'aria-readonly', 'aria-expanded', 'aria-required' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: [ 'row' ], + implicit: [ 'td', 'th' ] + }, + group: { + type: 'structure', + attributes: { + allowed: [ 'aria-activedescendant', 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'details', 'optgroup' ] + }, + heading: { + type: 'structure', + attributes: { + allowed: [ 'aria-level', 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: null, + implicit: [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ] + }, + img: { + type: 'structure', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'img' ] + }, + input: { + nameFrom: [ 'author' ], + type: 'abstract' + }, + landmark: { + nameFrom: [ 'author' ], + type: 'abstract' + }, + link: { + type: 'widget', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: null, + implicit: [ 'a[href]' ] + }, + list: { + type: 'structure', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: { + all: [ 'listitem' ] + }, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'ol', 'ul', 'dl' ] + }, + listbox: { + type: 'composite', + attributes: { + allowed: [ 'aria-activedescendant', 'aria-multiselectable', 'aria-required', 'aria-expanded' ] + }, + owned: { + all: [ 'option' ] + }, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'select' ] + }, + listitem: { + type: 'structure', + attributes: { + allowed: [ 'aria-level', 'aria-posinset', 'aria-setsize', 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: [ 'list' ], + implicit: [ 'li', 'dt' ] + }, + log: { + type: 'widget', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null + }, + main: { + type: 'landmark', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'main' ] + }, + marquee: { + type: 'widget', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null + }, + math: { + type: 'structure', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'math' ] + }, + menu: { + type: 'composite', + attributes: { + allowed: [ 'aria-activedescendant', 'aria-expanded' ] + }, + owned: { + one: [ 'menuitem', 'menuitemradio', 'menuitemcheckbox' ] + }, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'menu[type="context"]' ] + }, + menubar: { + type: 'composite', + attributes: { + allowed: [ 'aria-activedescendant', 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null + }, + menuitem: { + type: 'widget', + attributes: null, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: [ 'menu', 'menubar' ], + implicit: [ 'menuitem[type="command"]' ] + }, + menuitemcheckbox: { + type: 'widget', + attributes: { + required: [ 'aria-checked' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: [ 'menu', 'menubar' ], + implicit: [ 'menuitem[type="checkbox"]' ] + }, + menuitemradio: { + type: 'widget', + attributes: { + allowed: [ 'aria-selected', 'aria-posinset', 'aria-setsize' ], + required: [ 'aria-checked' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: [ 'menu', 'menubar' ], + implicit: [ 'menuitem[type="radio"]' ] + }, + navigation: { + type: 'landmark', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'nav' ] + }, + none: { + type: 'structure', + attributes: null, + owned: null, + nameFrom: [ 'author' ], + context: null + }, + note: { + type: 'structure', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null + }, + option: { + type: 'widget', + attributes: { + allowed: [ 'aria-selected', 'aria-posinset', 'aria-setsize', 'aria-checked' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: [ 'listbox' ], + implicit: [ 'option' ] + }, + presentation: { + type: 'structure', + attributes: null, + owned: null, + nameFrom: [ 'author' ], + context: null + }, + progressbar: { + type: 'widget', + attributes: { + allowed: [ 'aria-valuetext', 'aria-valuenow', 'aria-valuemax', 'aria-valuemin' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'progress' ] + }, + radio: { + type: 'widget', + attributes: { + allowed: [ 'aria-selected', 'aria-posinset', 'aria-setsize' ], + required: [ 'aria-checked' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: null, + implicit: [ 'input[type="radio"]' ] + }, + radiogroup: { + type: 'composite', + attributes: { + allowed: [ 'aria-activedescendant', 'aria-required', 'aria-expanded' ] + }, + owned: { + all: [ 'radio' ] + }, + nameFrom: [ 'author' ], + context: null + }, + range: { + nameFrom: [ 'author' ], + type: 'abstract' + }, + region: { + type: 'structure', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'section' ] + }, + roletype: { + type: 'abstract' + }, + row: { + type: 'structure', + attributes: { + allowed: [ 'aria-level', 'aria-selected', 'aria-activedescendant', 'aria-expanded' ] + }, + owned: { + one: [ 'cell', 'columnheader', 'rowheader', 'gridcell' ] + }, + nameFrom: [ 'author', 'contents' ], + context: [ 'rowgroup', 'grid', 'treegrid', 'table' ], + implicit: [ 'tr' ] + }, + rowgroup: { + type: 'structure', + attributes: { + allowed: [ 'aria-activedescendant', 'aria-expanded' ] + }, + owned: { + all: [ 'row' ] + }, + nameFrom: [ 'author', 'contents' ], + context: [ 'grid', 'table' ], + implicit: [ 'tbody', 'thead', 'tfoot' ] + }, + rowheader: { + type: 'structure', + attributes: { + allowed: [ 'aria-sort', 'aria-required', 'aria-readonly', 'aria-expanded', 'aria-selected' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: [ 'row' ], + implicit: [ 'th' ] + }, + scrollbar: { + type: 'widget', + attributes: { + required: [ 'aria-controls', 'aria-orientation', 'aria-valuenow', 'aria-valuemax', 'aria-valuemin' ], + allowed: [ 'aria-valuetext' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null + }, + search: { + type: 'landmark', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null + }, + searchbox: { + type: 'widget', + attributes: { + allowed: [ 'aria-activedescendant', 'aria-autocomplete', 'aria-multiline', 'aria-readonly', 'aria-required' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'input[type="search"]' ] + }, + section: { + nameFrom: [ 'author', 'contents' ], + type: 'abstract' + }, + sectionhead: { + nameFrom: [ 'author', 'contents' ], + type: 'abstract' + }, + select: { + nameFrom: [ 'author' ], + type: 'abstract' + }, + separator: { + type: 'structure', + attributes: { + allowed: [ 'aria-expanded', 'aria-orientation' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'hr' ] + }, + slider: { + type: 'widget', + attributes: { + allowed: [ 'aria-valuetext', 'aria-orientation' ], + required: [ 'aria-valuenow', 'aria-valuemax', 'aria-valuemin' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'input[type="range"]' ] + }, + spinbutton: { + type: 'widget', + attributes: { + allowed: [ 'aria-valuetext', 'aria-required' ], + required: [ 'aria-valuenow', 'aria-valuemax', 'aria-valuemin' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'input[type="number"]' ] + }, + status: { + type: 'widget', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'output' ] + }, + structure: { + type: 'abstract' + }, + switch: { + type: 'widget', + attributes: { + required: [ 'aria-checked' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: null + }, + tab: { + type: 'widget', + attributes: { + allowed: [ 'aria-selected', 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: [ 'tablist' ] + }, + table: { + type: 'structure', + attributes: { + allowed: [ 'aria-colcount', 'aria-rowcount' ] + }, + owned: { + one: [ 'rowgroup', 'row' ] + }, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'table' ] + }, + tablist: { + type: 'composite', + attributes: { + allowed: [ 'aria-activedescendant', 'aria-expanded', 'aria-level', 'aria-multiselectable' ] + }, + owned: { + all: [ 'tab' ] + }, + nameFrom: [ 'author' ], + context: null + }, + tabpanel: { + type: 'widget', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null + }, + text: { + type: 'structure', + owned: null, + nameFrom: [ 'author', 'contents' ], + context: null + }, + textbox: { + type: 'widget', + attributes: { + allowed: [ 'aria-activedescendant', 'aria-autocomplete', 'aria-multiline', 'aria-readonly', 'aria-required' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'input[type="text"]', 'input[type="email"]', 'input[type="password"]', 'input[type="tel"]', 'input[type="url"]', 'input:not([type])', 'textarea' ] + }, + timer: { + type: 'widget', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null + }, + toolbar: { + type: 'structure', + attributes: { + allowed: [ 'aria-activedescendant', 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author' ], + context: null, + implicit: [ 'menu[type="toolbar"]' ] + }, + tooltip: { + type: 'widget', + attributes: { + allowed: [ 'aria-expanded' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: null + }, + tree: { + type: 'composite', + attributes: { + allowed: [ 'aria-activedescendant', 'aria-multiselectable', 'aria-required', 'aria-expanded' ] + }, + owned: { + all: [ 'treeitem' ] + }, + nameFrom: [ 'author' ], + context: null + }, + treegrid: { + type: 'composite', + attributes: { + allowed: [ 'aria-activedescendant', 'aria-expanded', 'aria-level', 'aria-multiselectable', 'aria-readonly', 'aria-required' ] + }, + owned: { + all: [ 'treeitem' ] + }, + nameFrom: [ 'author' ], + context: null + }, + treeitem: { + type: 'widget', + attributes: { + allowed: [ 'aria-checked', 'aria-selected', 'aria-expanded', 'aria-level', 'aria-posinset', 'aria-setsize' ] + }, + owned: null, + nameFrom: [ 'author', 'contents' ], + context: [ 'treegrid', 'tree' ] + }, + widget: { + type: 'abstract' + }, + window: { + nameFrom: [ 'author' ], + type: 'abstract' + } + }; + var color = {}; + commons.color = color; + var dom = commons.dom = {}; + var table = commons.table = {}; + var text = commons.text = {}; + var utils = commons.utils = axe.utils; + aria.requiredAttr = function(role) { + 'use strict'; + var roles = lookupTables.role[role], attr = roles && roles.attributes && roles.attributes.required; + return attr || []; + }; + aria.allowedAttr = function(role) { + 'use strict'; + var roles = lookupTables.role[role], attr = roles && roles.attributes && roles.attributes.allowed || [], requiredAttr = roles && roles.attributes && roles.attributes.required || []; + return attr.concat(lookupTables.globalAttributes).concat(requiredAttr); + }; + aria.validateAttr = function(att) { + 'use strict'; + return !!lookupTables.attributes[att]; + }; + aria.validateAttrValue = function(node, attr) { + 'use strict'; + var matches, list, value = node.getAttribute(attr), attrInfo = lookupTables.attributes[attr]; + var doc = dom.getRootNode(node); + if (!attrInfo) { + return true; + } + switch (attrInfo.type) { + case 'boolean': + case 'nmtoken': + return typeof value === 'string' && attrInfo.values.indexOf(value.toLowerCase()) !== -1; + + case 'nmtokens': + list = axe.utils.tokenList(value); + return list.reduce(function(result, token) { + return result && attrInfo.values.indexOf(token) !== -1; + }, list.length !== 0); + + case 'idref': + return !!(value && doc.getElementById(value)); + + case 'idrefs': + list = axe.utils.tokenList(value); + return list.reduce(function(result, token) { + return !!(result && doc.getElementById(token)); + }, list.length !== 0); + + case 'string': + return true; + + case 'decimal': + matches = value.match(/^[-+]?([0-9]*)\.?([0-9]*)$/); + return !!(matches && (matches[1] || matches[2])); + + case 'int': + return /^[-+]?[0-9]+$/.test(value); + } + }; + aria.label = function(node) { + var ref, candidate; + if (node.actualNode.getAttribute('aria-labelledby')) { + ref = dom.idrefs(node.actualNode, 'aria-labelledby'); + candidate = ref.map(function(thing) { + var vNode = axe.utils.getNodeFromTree(axe._tree[0], thing); + return vNode ? text.visible(vNode, true) : ''; + }).join(' ').trim(); + if (candidate) { + return candidate; + } + } + candidate = node.actualNode.getAttribute('aria-label'); + if (candidate) { + candidate = text.sanitize(candidate).trim(); + if (candidate) { + return candidate; + } + } + return null; + }; + aria.isValidRole = function(role) { + 'use strict'; + if (lookupTables.role[role]) { + return true; + } + return false; + }; + aria.getRolesWithNameFromContents = function() { + return Object.keys(lookupTables.role).filter(function(r) { + return lookupTables.role[r].nameFrom && lookupTables.role[r].nameFrom.indexOf('contents') !== -1; + }); + }; + aria.getRolesByType = function(roleType) { + return Object.keys(lookupTables.role).filter(function(r) { + return lookupTables.role[r].type === roleType; + }); + }; + aria.getRoleType = function(role) { + var r = lookupTables.role[role]; + return r && r.type || null; + }; + aria.requiredOwned = function(role) { + 'use strict'; + var owned = null, roles = lookupTables.role[role]; + if (roles) { + owned = axe.utils.clone(roles.owned); + } + return owned; + }; + aria.requiredContext = function(role) { + 'use strict'; + var context = null, roles = lookupTables.role[role]; + if (roles) { + context = axe.utils.clone(roles.context); + } + return context; + }; + aria.implicitNodes = function(role) { + 'use strict'; + var implicit = null, roles = lookupTables.role[role]; + if (roles && roles.implicit) { + implicit = axe.utils.clone(roles.implicit); + } + return implicit; + }; + aria.implicitRole = function(node) { + 'use strict'; + var isValidImplicitRole = function isValidImplicitRole(set, role) { + var validForNodeType = function validForNodeType(implicitNodeTypeSelector) { + return axe.utils.matchesSelector(node, implicitNodeTypeSelector); + }; + if (role.implicit && role.implicit.some(validForNodeType)) { + set.push(role.name); + } + return set; + }; + var sortRolesByOptimalAriaContext = function sortRolesByOptimalAriaContext(roles, ariaAttributes) { + var getScore = function getScore(role) { + var allowedAriaAttributes = aria.allowedAttr(role); + return allowedAriaAttributes.reduce(function(score, attribute) { + return score + (ariaAttributes.indexOf(attribute) > -1 ? 1 : 0); + }, 0); + }; + var scored = roles.map(function(role) { + return { + score: getScore(role), + name: role + }; + }); + var sorted = scored.sort(function(scoredRoleA, scoredRoleB) { + return scoredRoleB.score - scoredRoleA.score; + }); + return sorted.map(function(sortedRole) { + return sortedRole.name; + }); + }; + var roles = Object.keys(lookupTables.role).map(function(role) { + var lookup = lookupTables.role[role]; + return { + name: role, + implicit: lookup && lookup.implicit + }; + }); + var availableImplicitRoles = roles.reduce(isValidImplicitRole, []); + if (!availableImplicitRoles.length) { + return null; + } + var nodeAttributes = node.attributes; + var ariaAttributes = []; + for (var i = 0, j = nodeAttributes.length; i < j; i++) { + var attr = nodeAttributes[i]; + if (attr.name.match(/^aria-/)) { + ariaAttributes.push(attr.name); + } + } + return sortRolesByOptimalAriaContext(availableImplicitRoles, ariaAttributes).shift(); + }; + color.Color = function(red, green, blue, alpha) { + this.red = red; + this.green = green; + this.blue = blue; + this.alpha = alpha; + this.toHexString = function() { + var redString = Math.round(this.red).toString(16); + var greenString = Math.round(this.green).toString(16); + var blueString = Math.round(this.blue).toString(16); + return '#' + (this.red > 15.5 ? redString : '0' + redString) + (this.green > 15.5 ? greenString : '0' + greenString) + (this.blue > 15.5 ? blueString : '0' + blueString); + }; + var rgbRegex = /^rgb\((\d+), (\d+), (\d+)\)$/; + var rgbaRegex = /^rgba\((\d+), (\d+), (\d+), (\d*(\.\d+)?)\)/; + this.parseRgbString = function(colorString) { + if (colorString === 'transparent') { + this.red = 0; + this.green = 0; + this.blue = 0; + this.alpha = 0; + return; + } + var match = colorString.match(rgbRegex); + if (match) { + this.red = parseInt(match[1], 10); + this.green = parseInt(match[2], 10); + this.blue = parseInt(match[3], 10); + this.alpha = 1; + return; + } + match = colorString.match(rgbaRegex); + if (match) { + this.red = parseInt(match[1], 10); + this.green = parseInt(match[2], 10); + this.blue = parseInt(match[3], 10); + this.alpha = parseFloat(match[4]); + return; + } + }; + this.getRelativeLuminance = function() { + var rSRGB = this.red / 255; + var gSRGB = this.green / 255; + var bSRGB = this.blue / 255; + var r = rSRGB <= .03928 ? rSRGB / 12.92 : Math.pow((rSRGB + .055) / 1.055, 2.4); + var g = gSRGB <= .03928 ? gSRGB / 12.92 : Math.pow((gSRGB + .055) / 1.055, 2.4); + var b = bSRGB <= .03928 ? bSRGB / 12.92 : Math.pow((bSRGB + .055) / 1.055, 2.4); + return .2126 * r + .7152 * g + .0722 * b; + }; + }; + color.flattenColors = function(fgColor, bgColor) { + var alpha = fgColor.alpha; + var r = (1 - alpha) * bgColor.red + alpha * fgColor.red; + var g = (1 - alpha) * bgColor.green + alpha * fgColor.green; + var b = (1 - alpha) * bgColor.blue + alpha * fgColor.blue; + var a = fgColor.alpha + bgColor.alpha * (1 - fgColor.alpha); + return new color.Color(r, g, b, a); + }; + color.getContrast = function(bgColor, fgColor) { + if (!fgColor || !bgColor) { + return null; + } + if (fgColor.alpha < 1) { + fgColor = color.flattenColors(fgColor, bgColor); + } + var bL = bgColor.getRelativeLuminance(); + var fL = fgColor.getRelativeLuminance(); + return (Math.max(fL, bL) + .05) / (Math.min(fL, bL) + .05); + }; + color.hasValidContrastRatio = function(bg, fg, fontSize, isBold) { + var contrast = color.getContrast(bg, fg); + var isSmallFont = isBold && Math.ceil(fontSize * 72) / 96 < 14 || !isBold && Math.ceil(fontSize * 72) / 96 < 18; + return { + isValid: isSmallFont && contrast >= 4.5 || !isSmallFont && contrast >= 3, + contrastRatio: contrast + }; + }; + function _getFonts(style) { + return style.getPropertyValue('font-family').split(/[,;]/g).map(function(font) { + return font.trim().toLowerCase(); + }); + } + function elementIsDistinct(node, ancestorNode) { + var nodeStyle = window.getComputedStyle(node); + if (nodeStyle.getPropertyValue('background-image') !== 'none') { + return true; + } + var hasBorder = [ 'border-bottom', 'border-top', 'outline' ].reduce(function(result, edge) { + var borderClr = new color.Color(); + borderClr.parseRgbString(nodeStyle.getPropertyValue(edge + '-color')); + return result || nodeStyle.getPropertyValue(edge + '-style') !== 'none' && parseFloat(nodeStyle.getPropertyValue(edge + '-width')) > 0 && borderClr.alpha !== 0; + }, false); + if (hasBorder) { + return true; + } + var parentStyle = window.getComputedStyle(ancestorNode); + if (_getFonts(nodeStyle)[0] !== _getFonts(parentStyle)[0]) { + return true; + } + var hasStyle = [ 'text-decoration-line', 'text-decoration-style', 'font-weight', 'font-style', 'font-size' ].reduce(function(result, cssProp) { + return result || nodeStyle.getPropertyValue(cssProp) !== parentStyle.getPropertyValue(cssProp); + }, false); + var tDec = nodeStyle.getPropertyValue('text-decoration'); + if (tDec.split(' ').length < 3) { + hasStyle = hasStyle || tDec !== parentStyle.getPropertyValue('text-decoration'); + } + return hasStyle; + } + color.elementIsDistinct = elementIsDistinct; + var graphicNodes = [ 'IMG', 'CANVAS', 'OBJECT', 'IFRAME', 'VIDEO', 'SVG' ]; + function elmHasImage(elm, style) { + var nodeName = elm.nodeName.toUpperCase(); + if (graphicNodes.includes(nodeName)) { + axe.commons.color.incompleteData.set('bgColor', 'imgNode'); + return true; + } + style = style || window.getComputedStyle(elm); + var bgImageStyle = style.getPropertyValue('background-image'); + var hasBgImage = bgImageStyle !== 'none'; + if (hasBgImage) { + var hasGradient = /gradient/.test(bgImageStyle); + axe.commons.color.incompleteData.set('bgColor', hasGradient ? 'bgGradient' : 'bgImage'); + } + return hasBgImage; + } + function getBgColor(elm, elmStyle) { + elmStyle = elmStyle || window.getComputedStyle(elm); + var bgColor = new color.Color(); + bgColor.parseRgbString(elmStyle.getPropertyValue('background-color')); + if (bgColor.alpha !== 0) { + var opacity = elmStyle.getPropertyValue('opacity'); + bgColor.alpha = bgColor.alpha * opacity; + } + return bgColor; + } + function contentOverlapping(targetElement, bgNode) { + var targetRect = targetElement.getClientRects()[0]; + var obscuringElements = document.elementsFromPoint(targetRect.left, targetRect.top); + if (obscuringElements) { + for (var i = 0; i < obscuringElements.length; i++) { + if (obscuringElements[i] !== targetElement && obscuringElements[i] === bgNode) { + return true; + } + } + } + return false; + } + function calculateObscuringAlpha(elmIndex, elmStack, originalElm) { + var totalAlpha = 0; + if (elmIndex > 0) { + for (var i = elmIndex - 1; i >= 0; i--) { + var bgElm = elmStack[i]; + var bgElmStyle = window.getComputedStyle(bgElm); + var bgColor = getBgColor(bgElm, bgElmStyle); + if (bgColor.alpha && contentOverlapping(originalElm, bgElm)) { + totalAlpha += bgColor.alpha; + } else { + elmStack.splice(i, 1); + } + } + } + return totalAlpha; + } + function elmPartiallyObscured(elm, bgElm, bgColor) { + var obscured = elm !== bgElm && !dom.visuallyContains(elm, bgElm) && bgColor.alpha !== 0; + if (obscured) { + axe.commons.color.incompleteData.set('bgColor', 'elmPartiallyObscured'); + } + return obscured; + } + function includeMissingElements(elmStack, elm) { + var elementMap = { + TD: 'TR', + INPUT: 'LABEL' + }; + var tagArray = elmStack.map(function(elm) { + return elm.tagName; + }); + var bgNodes = elmStack; + for (var candidate in elementMap) { + if (elementMap.hasOwnProperty(candidate)) { + if (elm.tagName === candidate) { + var ancestorMatch = axe.commons.dom.findUp(elm, elementMap[candidate]); + if (ancestorMatch && elmStack.indexOf(ancestorMatch) === -1) { + var overlaps = axe.commons.dom.visuallyOverlaps(elm.getBoundingClientRect(), ancestorMatch); + if (overlaps) { + bgNodes.splice(elmStack.indexOf(elm) + 1, 0, ancestorMatch); + } + } + } + if (elm.tagName === elementMap[candidate] && tagArray.indexOf(elm.tagName) === -1) { + bgNodes.splice(tagArray.indexOf(candidate) + 1, 0, elm); + } + } + } + return bgNodes; + } + function sortPageBackground(elmStack) { + var bodyIndex = elmStack.indexOf(document.body); + var bgNodes = elmStack; + if (bodyIndex > 1 && !elmHasImage(document.documentElement) && getBgColor(document.documentElement).alpha === 0) { + bgNodes.splice(bodyIndex, 1); + bgNodes.splice(elmStack.indexOf(document.documentElement), 1); + bgNodes.push(document.body); + } + return bgNodes; + } + color.getBackgroundStack = function(elm) { + var rect = elm.getBoundingClientRect(); + var x = void 0, y = void 0; + if (rect.left > window.innerWidth) { + return; + } + if (rect.top > window.innerHeight) { + return; + } + x = Math.min(Math.ceil(rect.left + rect.width / 2), window.innerWidth - 1); + y = Math.min(Math.ceil(rect.top + rect.height / 2), window.innerHeight - 1); + var elmStack = document.elementsFromPoint(x, y); + elmStack = includeMissingElements(elmStack, elm); + elmStack = dom.reduceToElementsBelowFloating(elmStack, elm); + elmStack = sortPageBackground(elmStack); + var elmIndex = elmStack.indexOf(elm); + if (calculateObscuringAlpha(elmIndex, elmStack, elm) >= .99) { + axe.commons.color.incompleteData.set('bgColor', 'bgOverlap'); + return null; + } + return elmIndex !== -1 ? elmStack : null; + }; + color.getBackgroundColor = function(elm) { + var bgElms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + var noScroll = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + if (noScroll !== true) { + elm.scrollIntoView(); + } + var bgColors = []; + var elmStack = color.getBackgroundStack(elm); + (elmStack || []).some(function(bgElm) { + var bgElmStyle = window.getComputedStyle(bgElm); + var bgColor = getBgColor(bgElm, bgElmStyle); + if (elmPartiallyObscured(elm, bgElm, bgColor) || elmHasImage(bgElm, bgElmStyle)) { + bgColors = null; + bgElms.push(bgElm); + return true; + } + if (bgColor.alpha !== 0) { + bgElms.push(bgElm); + bgColors.push(bgColor); + return bgColor.alpha === 1; + } else { + return false; + } + }); + if (bgColors !== null && elmStack !== null) { + bgColors.push(new color.Color(255, 255, 255, 1)); + var colors = bgColors.reduce(color.flattenColors); + return colors; + } + return null; + }; + dom.isOpaque = function(node) { + var style = window.getComputedStyle(node); + return elmHasImage(node, style) || getBgColor(node, style).alpha === 1; + }; + color.getForegroundColor = function(node, noScroll) { + var nodeStyle = window.getComputedStyle(node); + var fgColor = new color.Color(); + fgColor.parseRgbString(nodeStyle.getPropertyValue('color')); + var opacity = nodeStyle.getPropertyValue('opacity'); + fgColor.alpha = fgColor.alpha * opacity; + if (fgColor.alpha === 1) { + return fgColor; + } + var bgColor = color.getBackgroundColor(node, [], noScroll); + if (bgColor === null) { + var reason = axe.commons.color.incompleteData.get('bgColor'); + axe.commons.color.incompleteData.set('fgColor', reason); + return null; + } + return color.flattenColors(fgColor, bgColor); + }; + color.incompleteData = function() { + var data = {}; + return { + set: function set(key, reason) { + if (typeof key !== 'string') { + throw new Error('Incomplete data: key must be a string'); + } + if (reason) { + data[key] = reason; + } + return data[key]; + }, + get: function get(key) { + return data[key]; + }, + clear: function clear() { + data = {}; + } + }; + }(); + dom.reduceToElementsBelowFloating = function(elements, targetNode) { + var floatingPositions = [ 'fixed', 'sticky' ], finalElements = [], targetFound = false, index, currentNode, style; + for (index = 0; index < elements.length; ++index) { + currentNode = elements[index]; + if (currentNode === targetNode) { + targetFound = true; + } + style = window.getComputedStyle(currentNode); + if (!targetFound && floatingPositions.indexOf(style.position) !== -1) { + finalElements = []; + continue; + } + finalElements.push(currentNode); + } + return finalElements; + }; + dom.findUp = function(element, target) { + 'use strict'; + var parent, doc = axe.commons.dom.getRootNode(element), matches; + matches = doc.querySelectorAll(target); + matches = axe.utils.toArray(matches); + if (doc === document && !matches.length) { + return null; + } + parent = element.assignedSlot ? element.assignedSlot : element.parentNode; + if (parent.nodeType === 11) { + parent = parent.host; + } + while (parent && matches.indexOf(parent) === -1) { + parent = parent.assignedSlot ? parent.assignedSlot : parent.parentNode; + if (parent && parent.nodeType === 11) { + parent = parent.host; + doc = axe.commons.dom.getRootNode(parent); + matches = doc.querySelectorAll(target); + matches = axe.utils.toArray(matches); + if (doc === document && !matches.length) { + return null; + } + } + } + return parent; + }; + dom.getElementByReference = function(node, attr) { + 'use strict'; + var candidate, fragment = node.getAttribute(attr), doc = document; + if (fragment && fragment.charAt(0) === '#') { + fragment = fragment.substring(1); + candidate = doc.getElementById(fragment); + if (candidate) { + return candidate; + } + candidate = doc.getElementsByName(fragment); + if (candidate.length) { + return candidate[0]; + } + } + return null; + }; + dom.getElementCoordinates = function(element) { + 'use strict'; + var scrollOffset = dom.getScrollOffset(document), xOffset = scrollOffset.left, yOffset = scrollOffset.top, coords = element.getBoundingClientRect(); + return { + top: coords.top + yOffset, + right: coords.right + xOffset, + bottom: coords.bottom + yOffset, + left: coords.left + xOffset, + width: coords.right - coords.left, + height: coords.bottom - coords.top + }; + }; + dom.getRootNode = function(node) { + var doc = node.getRootNode && node.getRootNode() || document; + if (doc === node) { + doc = document; + } + return doc; + }; + dom.getScrollOffset = function(element) { + 'use strict'; + if (!element.nodeType && element.document) { + element = element.document; + } + if (element.nodeType === 9) { + var docElement = element.documentElement, body = element.body; + return { + left: docElement && docElement.scrollLeft || body && body.scrollLeft || 0, + top: docElement && docElement.scrollTop || body && body.scrollTop || 0 + }; + } + return { + left: element.scrollLeft, + top: element.scrollTop + }; + }; + dom.getViewportSize = function(win) { + 'use strict'; + var body, doc = win.document, docElement = doc.documentElement; + if (win.innerWidth) { + return { + width: win.innerWidth, + height: win.innerHeight + }; + } + if (docElement) { + return { + width: docElement.clientWidth, + height: docElement.clientHeight + }; + } + body = doc.body; + return { + width: body.clientWidth, + height: body.clientHeight + }; + }; + dom.hasContent = function hasContent(elm) { + if (elm.actualNode.textContent.trim() || aria.label(elm)) { + return true; + } + var contentElms = axe.utils.querySelectorAll(elm, '*'); + for (var i = 0; i < contentElms.length; i++) { + if (aria.label(contentElms[i]) || dom.isVisualContent(contentElms[i].actualNode)) { + return true; + } + } + return false; + }; + dom.idrefs = function(node, attr) { + 'use strict'; + var index, length, doc = dom.getRootNode(node), result = [], idrefs = node.getAttribute(attr); + if (idrefs) { + idrefs = axe.utils.tokenList(idrefs); + for (index = 0, length = idrefs.length; index < length; index++) { + result.push(doc.getElementById(idrefs[index])); + } + } + return result; + }; + dom.isFocusable = function(el) { + 'use strict'; + if (!el || el.disabled || !dom.isVisible(el) && el.nodeName.toUpperCase() !== 'AREA') { + return false; + } + switch (el.nodeName.toUpperCase()) { + case 'A': + case 'AREA': + if (el.href) { + return true; + } + break; + + case 'INPUT': + return el.type !== 'hidden'; + + case 'TEXTAREA': + case 'SELECT': + case 'DETAILS': + case 'BUTTON': + return true; + } + var tabindex = el.getAttribute('tabindex'); + if (tabindex && !isNaN(parseInt(tabindex, 10))) { + return true; + } + return false; + }; + dom.isHTML5 = function(doc) { + var node = doc.doctype; + if (node === null) { + return false; + } + return node.name === 'html' && !node.publicId && !node.systemId; + }; + function walkDomNode(node, functor) { + 'use strict'; + var shouldWalk = functor(node); + node = node.firstChild; + while (node) { + if (shouldWalk !== false) { + walkDomNode(node, functor); + } + node = node.nextSibling; + } + } + var blockLike = [ 'block', 'list-item', 'table', 'flex', 'grid', 'inline-block' ]; + function isBlock(elm) { + 'use strict'; + var display = window.getComputedStyle(elm).getPropertyValue('display'); + return blockLike.indexOf(display) !== -1 || display.substr(0, 6) === 'table-'; + } + dom.isInTextBlock = function isInTextBlock(node) { + 'use strict'; + if (isBlock(node)) { + return false; + } + var parentBlock = node.parentNode; + while (parentBlock.nodeType === 1 && !isBlock(parentBlock)) { + parentBlock = parentBlock.parentNode; + } + var parentText = ''; + var linkText = ''; + var inBrBlock = 0; + walkDomNode(parentBlock, function(currNode) { + if (inBrBlock === 2) { + return false; + } + if (currNode.nodeType === 3) { + parentText += currNode.nodeValue; + } + if (currNode.nodeType !== 1) { + return; + } + var nodeName = (currNode.nodeName || '').toUpperCase(); + if ([ 'BR', 'HR' ].indexOf(nodeName) !== -1) { + if (inBrBlock === 0) { + parentText = ''; + linkText = ''; + } else { + inBrBlock = 2; + } + } else if (currNode.style.display === 'none' || currNode.style.overflow === 'hidden' || [ '', null, 'none' ].indexOf(currNode.style.float) === -1 || [ '', null, 'relative' ].indexOf(currNode.style.position) === -1) { + return false; + } else if (nodeName === 'A' && currNode.href || (currNode.getAttribute('role') || '').toLowerCase() === 'link') { + if (currNode === node) { + inBrBlock = 1; + } + linkText += currNode.textContent; + return false; + } + }); + parentText = axe.commons.text.sanitize(parentText); + linkText = axe.commons.text.sanitize(linkText); + return parentText.length > linkText.length; + }; + dom.isNode = function(candidate) { + 'use strict'; + return candidate instanceof Node; + }; + dom.isOffscreen = function(element) { + 'use strict'; + var noParentScrolled = function noParentScrolled(element, offset) { + element = element.parentNode; + while (element.nodeName.toLowerCase() !== 'html') { + if (element.scrollTop) { + offset += element.scrollTop; + if (offset >= 0) { + return false; + } + } + element = element.parentNode; + } + return true; + }; + var leftBoundary, docElement = document.documentElement, styl = window.getComputedStyle(element), dir = window.getComputedStyle(document.body || docElement).getPropertyValue('direction'), coords = dom.getElementCoordinates(element); + if (coords.bottom < 0 && (noParentScrolled(element, coords.bottom) || styl.position === 'absolute')) { + return true; + } + if (coords.left === 0 && coords.right === 0) { + return false; + } + if (dir === 'ltr') { + if (coords.right <= 0) { + return true; + } + } else { + leftBoundary = Math.max(docElement.scrollWidth, dom.getViewportSize(window).width); + if (coords.left >= leftBoundary) { + return true; + } + } + return false; + }; + function isClipped(clip) { + 'use strict'; + var matches = clip.match(/rect\s*\(([0-9]+)px,?\s*([0-9]+)px,?\s*([0-9]+)px,?\s*([0-9]+)px\s*\)/); + if (matches && matches.length === 5) { + return matches[3] - matches[1] <= 0 && matches[2] - matches[4] <= 0; + } + return false; + } + dom.isVisible = function(el, screenReader, recursed) { + 'use strict'; + var style, nodeName, parent; + if (el.nodeType === 9) { + return true; + } + if (el.nodeType === 11) { + el = el.host; + } + style = window.getComputedStyle(el, null); + if (style === null) { + return false; + } + nodeName = el.nodeName.toUpperCase(); + if (style.getPropertyValue('display') === 'none' || nodeName.toUpperCase() === 'STYLE' || nodeName.toUpperCase() === 'SCRIPT' || !screenReader && isClipped(style.getPropertyValue('clip')) || !recursed && (style.getPropertyValue('visibility') === 'hidden' || !screenReader && dom.isOffscreen(el)) || screenReader && el.getAttribute('aria-hidden') === 'true') { + return false; + } + parent = el.assignedSlot ? el.assignedSlot : el.parentNode; + if (parent) { + return dom.isVisible(parent, screenReader, true); + } + return false; + }; + var visualRoles = [ 'checkbox', 'img', 'radio', 'range', 'slider', 'spinbutton', 'textbox' ]; + dom.isVisualContent = function(candidate) { + var role = candidate.getAttribute('role'); + if (role) { + return visualRoles.indexOf(role) !== -1; + } + switch (candidate.tagName.toUpperCase()) { + case 'IMG': + case 'IFRAME': + case 'OBJECT': + case 'VIDEO': + case 'AUDIO': + case 'CANVAS': + case 'SVG': + case 'MATH': + case 'BUTTON': + case 'SELECT': + case 'TEXTAREA': + case 'KEYGEN': + case 'PROGRESS': + case 'METER': + return true; + + case 'INPUT': + return candidate.type !== 'hidden'; + + default: + return false; + } + }; + dom.visuallyContains = function(node, parent) { + var rectBound = node.getBoundingClientRect(); + var margin = .01; + var rect = { + top: rectBound.top + margin, + bottom: rectBound.bottom - margin, + left: rectBound.left + margin, + right: rectBound.right - margin + }; + var parentRect = parent.getBoundingClientRect(); + var parentTop = parentRect.top; + var parentLeft = parentRect.left; + var parentScrollArea = { + top: parentTop - parent.scrollTop, + bottom: parentTop - parent.scrollTop + parent.scrollHeight, + left: parentLeft - parent.scrollLeft, + right: parentLeft - parent.scrollLeft + parent.scrollWidth + }; + var style = window.getComputedStyle(parent); + if (style.getPropertyValue('display') === 'inline') { + return true; + } + if (rect.left < parentScrollArea.left && rect.left < parentRect.left || rect.top < parentScrollArea.top && rect.top < parentRect.top || rect.right > parentScrollArea.right && rect.right > parentRect.right || rect.bottom > parentScrollArea.bottom && rect.bottom > parentRect.bottom) { + return false; + } + if (rect.right > parentRect.right || rect.bottom > parentRect.bottom) { + return style.overflow === 'scroll' || style.overflow === 'auto' || style.overflow === 'hidden' || parent instanceof HTMLBodyElement || parent instanceof HTMLHtmlElement; + } + return true; + }; + dom.visuallyOverlaps = function(rect, parent) { + var parentRect = parent.getBoundingClientRect(); + var parentTop = parentRect.top; + var parentLeft = parentRect.left; + var parentScrollArea = { + top: parentTop - parent.scrollTop, + bottom: parentTop - parent.scrollTop + parent.scrollHeight, + left: parentLeft - parent.scrollLeft, + right: parentLeft - parent.scrollLeft + parent.scrollWidth + }; + if (rect.left > parentScrollArea.right && rect.left > parentRect.right || rect.top > parentScrollArea.bottom && rect.top > parentRect.bottom || rect.right < parentScrollArea.left && rect.right < parentRect.left || rect.bottom < parentScrollArea.top && rect.bottom < parentRect.top) { + return false; + } + var style = window.getComputedStyle(parent); + if (rect.left > parentRect.right || rect.top > parentRect.bottom) { + return style.overflow === 'scroll' || style.overflow === 'auto' || parent instanceof HTMLBodyElement || parent instanceof HTMLHtmlElement; + } + return true; + }; + table.getAllCells = function(tableElm) { + var rowIndex, cellIndex, rowLength, cellLength; + var cells = []; + for (rowIndex = 0, rowLength = tableElm.rows.length; rowIndex < rowLength; rowIndex++) { + for (cellIndex = 0, cellLength = tableElm.rows[rowIndex].cells.length; cellIndex < cellLength; cellIndex++) { + cells.push(tableElm.rows[rowIndex].cells[cellIndex]); + } + } + return cells; + }; + table.getCellPosition = function(cell, tableGrid) { + var rowIndex, index; + if (!tableGrid) { + tableGrid = table.toGrid(dom.findUp(cell, 'table')); + } + for (rowIndex = 0; rowIndex < tableGrid.length; rowIndex++) { + if (tableGrid[rowIndex]) { + index = tableGrid[rowIndex].indexOf(cell); + if (index !== -1) { + return { + x: index, + y: rowIndex + }; + } + } + } + }; + table.getHeaders = function(cell) { + if (cell.hasAttribute('headers')) { + return commons.dom.idrefs(cell, 'headers'); + } + var tableGrid = commons.table.toGrid(commons.dom.findUp(cell, 'table')); + var position = commons.table.getCellPosition(cell, tableGrid); + var rowHeaders = table.traverse('left', position, tableGrid).filter(function(cell) { + return table.isRowHeader(cell); + }); + var colHeaders = table.traverse('up', position, tableGrid).filter(function(cell) { + return table.isColumnHeader(cell); + }); + return [].concat(rowHeaders, colHeaders).reverse(); + }; + table.getScope = function(cell) { + var scope = cell.getAttribute('scope'); + var role = cell.getAttribute('role'); + if (cell instanceof Element === false || [ 'TD', 'TH' ].indexOf(cell.nodeName.toUpperCase()) === -1) { + throw new TypeError('Expected TD or TH element'); + } + if (role === 'columnheader') { + return 'col'; + } else if (role === 'rowheader') { + return 'row'; + } else if (scope === 'col' || scope === 'row') { + return scope; + } else if (cell.nodeName.toUpperCase() !== 'TH') { + return false; + } + var tableGrid = table.toGrid(dom.findUp(cell, 'table')); + var pos = table.getCellPosition(cell); + var headerRow = tableGrid[pos.y].reduce(function(headerRow, cell) { + return headerRow && cell.nodeName.toUpperCase() === 'TH'; + }, true); + if (headerRow) { + return 'col'; + } + var headerCol = tableGrid.map(function(col) { + return col[pos.x]; + }).reduce(function(headerCol, cell) { + return headerCol && cell.nodeName.toUpperCase() === 'TH'; + }, true); + if (headerCol) { + return 'row'; + } + return 'auto'; + }; + table.isColumnHeader = function(node) { + return [ 'col', 'auto' ].indexOf(table.getScope(node)) !== -1; + }; + table.isDataCell = function(cell) { + if (!cell.children.length && !cell.textContent.trim()) { + return false; + } + return cell.nodeName.toUpperCase() === 'TD'; + }; + table.isDataTable = function(node) { + var role = node.getAttribute('role'); + if ((role === 'presentation' || role === 'none') && !dom.isFocusable(node)) { + return false; + } + if (node.getAttribute('contenteditable') === 'true' || dom.findUp(node, '[contenteditable="true"]')) { + return true; + } + if (role === 'grid' || role === 'treegrid' || role === 'table') { + return true; + } + if (commons.aria.getRoleType(role) === 'landmark') { + return true; + } + if (node.getAttribute('datatable') === '0') { + return false; + } + if (node.getAttribute('summary')) { + return true; + } + if (node.tHead || node.tFoot || node.caption) { + return true; + } + for (var childIndex = 0, childLength = node.children.length; childIndex < childLength; childIndex++) { + if (node.children[childIndex].nodeName.toUpperCase() === 'COLGROUP') { + return true; + } + } + var cells = 0; + var rowLength = node.rows.length; + var row, cell; + var hasBorder = false; + for (var rowIndex = 0; rowIndex < rowLength; rowIndex++) { + row = node.rows[rowIndex]; + for (var cellIndex = 0, cellLength = row.cells.length; cellIndex < cellLength; cellIndex++) { + cell = row.cells[cellIndex]; + if (cell.nodeName.toUpperCase() === 'TH') { + return true; + } + if (!hasBorder && (cell.offsetWidth !== cell.clientWidth || cell.offsetHeight !== cell.clientHeight)) { + hasBorder = true; + } + if (cell.getAttribute('scope') || cell.getAttribute('headers') || cell.getAttribute('abbr')) { + return true; + } + if ([ 'columnheader', 'rowheader' ].indexOf(cell.getAttribute('role')) !== -1) { + return true; + } + if (cell.children.length === 1 && cell.children[0].nodeName.toUpperCase() === 'ABBR') { + return true; + } + cells++; + } + } + if (node.getElementsByTagName('table').length) { + return false; + } + if (rowLength < 2) { + return false; + } + var sampleRow = node.rows[Math.ceil(rowLength / 2)]; + if (sampleRow.cells.length === 1 && sampleRow.cells[0].colSpan === 1) { + return false; + } + if (sampleRow.cells.length >= 5) { + return true; + } + if (hasBorder) { + return true; + } + var bgColor, bgImage; + for (rowIndex = 0; rowIndex < rowLength; rowIndex++) { + row = node.rows[rowIndex]; + if (bgColor && bgColor !== window.getComputedStyle(row).getPropertyValue('background-color')) { + return true; + } else { + bgColor = window.getComputedStyle(row).getPropertyValue('background-color'); + } + if (bgImage && bgImage !== window.getComputedStyle(row).getPropertyValue('background-image')) { + return true; + } else { + bgImage = window.getComputedStyle(row).getPropertyValue('background-image'); + } + } + if (rowLength >= 20) { + return true; + } + if (dom.getElementCoordinates(node).width > dom.getViewportSize(window).width * .95) { + return false; + } + if (cells < 10) { + return false; + } + if (node.querySelector('object, embed, iframe, applet')) { + return false; + } + return true; + }; + table.isHeader = function(cell) { + if (table.isColumnHeader(cell) || table.isRowHeader(cell)) { + return true; + } + if (cell.id) { + return !!document.querySelector('[headers~="' + axe.utils.escapeSelector(cell.id) + '"]'); + } + return false; + }; + table.isRowHeader = function(node) { + return [ 'row', 'auto' ].indexOf(table.getScope(node)) !== -1; + }; + table.toGrid = function(node) { + var table = []; + var rows = node.rows; + for (var i = 0, rowLength = rows.length; i < rowLength; i++) { + var cells = rows[i].cells; + table[i] = table[i] || []; + var columnIndex = 0; + for (var j = 0, cellLength = cells.length; j < cellLength; j++) { + for (var colSpan = 0; colSpan < cells[j].colSpan; colSpan++) { + for (var rowSpan = 0; rowSpan < cells[j].rowSpan; rowSpan++) { + table[i + rowSpan] = table[i + rowSpan] || []; + while (table[i + rowSpan][columnIndex]) { + columnIndex++; + } + table[i + rowSpan][columnIndex] = cells[j]; + } + columnIndex++; + } + } + } + return table; + }; + table.toArray = table.toGrid; + (function(table) { + var traverseTable = function traverseTable(dir, position, tableGrid, callback) { + var result; + var cell = tableGrid[position.y] ? tableGrid[position.y][position.x] : undefined; + if (!cell) { + return []; + } + if (typeof callback === 'function') { + result = callback(cell, position, tableGrid); + if (result === true) { + return [ cell ]; + } + } + result = traverseTable(dir, { + x: position.x + dir.x, + y: position.y + dir.y + }, tableGrid, callback); + result.unshift(cell); + return result; + }; + table.traverse = function(dir, startPos, tableGrid, callback) { + if (Array.isArray(startPos)) { + callback = tableGrid; + tableGrid = startPos; + startPos = { + x: 0, + y: 0 + }; + } + if (typeof dir === 'string') { + switch (dir) { + case 'left': + dir = { + x: -1, + y: 0 + }; + break; + + case 'up': + dir = { + x: 0, + y: -1 + }; + break; + + case 'right': + dir = { + x: 1, + y: 0 + }; + break; + + case 'down': + dir = { + x: 0, + y: 1 + }; + break; + } + } + return traverseTable(dir, { + x: startPos.x + dir.x, + y: startPos.y + dir.y + }, tableGrid, callback); + }; + })(table); + var defaultButtonValues = { + submit: 'Submit', + reset: 'Reset' + }; + var inputTypes = [ 'text', 'search', 'tel', 'url', 'email', 'date', 'time', 'number', 'range', 'color' ]; + var phrasingElements = [ 'A', 'EM', 'STRONG', 'SMALL', 'MARK', 'ABBR', 'DFN', 'I', 'B', 'S', 'U', 'CODE', 'VAR', 'SAMP', 'KBD', 'SUP', 'SUB', 'Q', 'CITE', 'SPAN', 'BDO', 'BDI', 'BR', 'WBR', 'INS', 'DEL', 'IMG', 'EMBED', 'OBJECT', 'IFRAME', 'MAP', 'AREA', 'SCRIPT', 'NOSCRIPT', 'RUBY', 'VIDEO', 'AUDIO', 'INPUT', 'TEXTAREA', 'SELECT', 'BUTTON', 'LABEL', 'OUTPUT', 'DATALIST', 'KEYGEN', 'PROGRESS', 'COMMAND', 'CANVAS', 'TIME', 'METER' ]; + function findLabel(element) { + var ref = null; + if (element.id) { + ref = document.querySelector('label[for="' + axe.utils.escapeSelector(element.id) + '"]'); + if (ref) { + return ref; + } + } + ref = dom.findUp(element, 'label'); + return ref; + } + function isButton(element) { + return [ 'button', 'reset', 'submit' ].indexOf(element.type) !== -1; + } + function isInput(element) { + var nodeName = element.nodeName.toUpperCase(); + return nodeName === 'TEXTAREA' || nodeName === 'SELECT' || nodeName === 'INPUT' && element.type.toLowerCase() !== 'hidden'; + } + function shouldCheckSubtree(element) { + return [ 'BUTTON', 'SUMMARY', 'A' ].indexOf(element.nodeName.toUpperCase()) !== -1; + } + function shouldNeverCheckSubtree(element) { + return [ 'TABLE', 'FIGURE' ].indexOf(element.nodeName.toUpperCase()) !== -1; + } + function formValueText(element) { + var nodeName = element.nodeName.toUpperCase(); + if (nodeName === 'INPUT') { + if (!element.hasAttribute('type') || inputTypes.indexOf(element.getAttribute('type').toLowerCase()) !== -1 && element.value) { + return element.value; + } + return ''; + } + if (nodeName === 'SELECT') { + var opts = element.options; + if (opts && opts.length) { + var returnText = ''; + for (var i = 0; i < opts.length; i++) { + if (opts[i].selected) { + returnText += ' ' + opts[i].text; + } + } + return text.sanitize(returnText); + } + return ''; + } + if (nodeName === 'TEXTAREA' && element.value) { + return element.value; + } + return ''; + } + function checkDescendant(element, nodeName) { + var candidate = element.querySelector(nodeName.toLowerCase()); + if (candidate) { + return text.accessibleText(candidate); + } + return ''; + } + function isEmbeddedControl(e) { + if (!e) { + return false; + } + switch (e.nodeName.toUpperCase()) { + case 'SELECT': + case 'TEXTAREA': + return true; + + case 'INPUT': + return !e.hasAttribute('type') || inputTypes.indexOf(e.getAttribute('type').toLowerCase()) !== -1; + + default: + return false; + } + } + function shouldCheckAlt(element) { + var nodeName = element.nodeName.toUpperCase(); + return nodeName === 'INPUT' && element.type.toLowerCase() === 'image' || [ 'IMG', 'APPLET', 'AREA' ].indexOf(nodeName) !== -1; + } + function nonEmptyText(t) { + return !!text.sanitize(t); + } + text.accessibleText = function(element, inLabelledByContext) { + var accessibleNameComputation; + var encounteredNodes = []; + function getInnerText(element, inLabelledByContext, inControlContext) { + var nodes = element.childNodes; + var returnText = ''; + var node; + for (var i = 0; i < nodes.length; i++) { + node = nodes[i]; + if (node.nodeType === 3) { + returnText += node.textContent; + } else if (node.nodeType === 1) { + if (phrasingElements.indexOf(node.nodeName.toUpperCase()) === -1) { + returnText += ' '; + } + returnText += accessibleNameComputation(nodes[i], inLabelledByContext, inControlContext); + } + } + return returnText; + } + function checkNative(element, inLabelledByContext, inControlContext) { + var returnText = ''; + var nodeName = element.nodeName.toUpperCase(); + if (shouldCheckSubtree(element)) { + returnText = getInnerText(element, false, false) || ''; + if (nonEmptyText(returnText)) { + return returnText; + } + } + if (nodeName === 'FIGURE') { + returnText = checkDescendant(element, 'figcaption'); + if (nonEmptyText(returnText)) { + return returnText; + } + } + if (nodeName === 'TABLE') { + returnText = checkDescendant(element, 'caption'); + if (nonEmptyText(returnText)) { + return returnText; + } + returnText = element.getAttribute('title') || element.getAttribute('summary') || ''; + if (nonEmptyText(returnText)) { + return returnText; + } + } + if (shouldCheckAlt(element)) { + return element.getAttribute('alt') || ''; + } + if (isInput(element) && !inControlContext) { + if (isButton(element)) { + return element.value || element.title || defaultButtonValues[element.type] || ''; + } + var labelElement = findLabel(element); + if (labelElement) { + return accessibleNameComputation(labelElement, inLabelledByContext, true); + } + } + return ''; + } + function checkARIA(element, inLabelledByContext, inControlContext) { + if (!inLabelledByContext && element.hasAttribute('aria-labelledby')) { + return text.sanitize(dom.idrefs(element, 'aria-labelledby').map(function(l) { + if (element === l) { + encounteredNodes.pop(); + } + return accessibleNameComputation(l, true, element !== l); + }).join(' ')); + } + if (!(inControlContext && isEmbeddedControl(element)) && element.hasAttribute('aria-label')) { + return text.sanitize(element.getAttribute('aria-label')); + } + return ''; + } + accessibleNameComputation = function accessibleNameComputation(element, inLabelledByContext, inControlContext) { + 'use strict'; + var returnText; + if (element === null || encounteredNodes.indexOf(element) !== -1) { + return ''; + } else if (!inLabelledByContext && !dom.isVisible(element, true)) { + return ''; + } + encounteredNodes.push(element); + var role = element.getAttribute('role'); + returnText = checkARIA(element, inLabelledByContext, inControlContext); + if (nonEmptyText(returnText)) { + return returnText; + } + returnText = checkNative(element, inLabelledByContext, inControlContext); + if (nonEmptyText(returnText)) { + return returnText; + } + if (inControlContext) { + returnText = formValueText(element); + if (nonEmptyText(returnText)) { + return returnText; + } + } + if (!shouldNeverCheckSubtree(element) && (!role || aria.getRolesWithNameFromContents().indexOf(role) !== -1)) { + returnText = getInnerText(element, inLabelledByContext, inControlContext); + if (nonEmptyText(returnText)) { + return returnText; + } + } + if (element.hasAttribute('title')) { + return element.getAttribute('title'); + } + return ''; + }; + return text.sanitize(accessibleNameComputation(element, inLabelledByContext)); + }; + text.label = function(node) { + var ref, candidate, doc; + candidate = aria.label(node); + if (candidate) { + return candidate; + } + if (node.actualNode.id) { + doc = axe.commons.dom.getRootNode(node.actualNode); + ref = doc.querySelector('label[for="' + axe.utils.escapeSelector(node.actualNode.id) + '"]'); + ref = axe.utils.getNodeFromTree(axe._tree[0], ref); + candidate = ref && text.visible(ref, true); + if (candidate) { + return candidate; + } + } + ref = dom.findUp(node.actualNode, 'label'); + ref = axe.utils.getNodeFromTree(axe._tree[0], ref); + candidate = ref && text.visible(ref, true); + if (candidate) { + return candidate; + } + return null; + }; + text.sanitize = function(str) { + 'use strict'; + return str.replace(/\r\n/g, '\n').replace(/\u00A0/g, ' ').replace(/[\s]{2,}/g, ' ').trim(); + }; + text.visible = function(element, screenReader, noRecursing) { + 'use strict'; + var index, child, nodeValue, childNodes = element.children, length = childNodes.length, result = ''; + for (index = 0; index < length; index++) { + child = childNodes[index]; + if (child.actualNode.nodeType === 3) { + nodeValue = child.actualNode.nodeValue; + if (nodeValue && dom.isVisible(element.actualNode, screenReader)) { + result += nodeValue; + } + } else if (!noRecursing) { + result += text.visible(child, screenReader); + } + } + return text.sanitize(result); + }; + axe.utils.toArray = function(thing) { + 'use strict'; + return Array.prototype.slice.call(thing); + }; + axe.utils.tokenList = function(str) { + 'use strict'; + return str.trim().replace(/\s{2,}/g, ' ').split(' '); + }; + var langs = [ 'aa', 'ab', 'ae', 'af', 'ak', 'am', 'an', 'ar', 'as', 'av', 'ay', 'az', 'ba', 'be', 'bg', 'bh', 'bi', 'bm', 'bn', 'bo', 'br', 'bs', 'ca', 'ce', 'ch', 'co', 'cr', 'cs', 'cu', 'cv', 'cy', 'da', 'de', 'dv', 'dz', 'ee', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fa', 'ff', 'fi', 'fj', 'fo', 'fr', 'fy', 'ga', 'gd', 'gl', 'gn', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hr', 'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ii', 'ik', 'in', 'io', 'is', 'it', 'iu', 'iw', 'ja', 'ji', 'jv', 'jw', 'ka', 'kg', 'ki', 'kj', 'kk', 'kl', 'km', 'kn', 'ko', 'kr', 'ks', 'ku', 'kv', 'kw', 'ky', 'la', 'lb', 'lg', 'li', 'ln', 'lo', 'lt', 'lu', 'lv', 'mg', 'mh', 'mi', 'mk', 'ml', 'mn', 'mo', 'mr', 'ms', 'mt', 'my', 'na', 'nb', 'nd', 'ne', 'ng', 'nl', 'nn', 'no', 'nr', 'nv', 'ny', 'oc', 'oj', 'om', 'or', 'os', 'pa', 'pi', 'pl', 'ps', 'pt', 'qu', 'rm', 'rn', 'ro', 'ru', 'rw', 'sa', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sk', 'sl', 'sm', 'sn', 'so', 'sq', 'sr', 'ss', 'st', 'su', 'sv', 'sw', 'ta', 'te', 'tg', 'th', 'ti', 'tk', 'tl', 'tn', 'to', 'tr', 'ts', 'tt', 'tw', 'ty', 'ug', 'uk', 'ur', 'uz', 've', 'vi', 'vo', 'wa', 'wo', 'xh', 'yi', 'yo', 'za', 'zh', 'zu', 'aaa', 'aab', 'aac', 'aad', 'aae', 'aaf', 'aag', 'aah', 'aai', 'aak', 'aal', 'aam', 'aan', 'aao', 'aap', 'aaq', 'aas', 'aat', 'aau', 'aav', 'aaw', 'aax', 'aaz', 'aba', 'abb', 'abc', 'abd', 'abe', 'abf', 'abg', 'abh', 'abi', 'abj', 'abl', 'abm', 'abn', 'abo', 'abp', 'abq', 'abr', 'abs', 'abt', 'abu', 'abv', 'abw', 'abx', 'aby', 'abz', 'aca', 'acb', 'acd', 'ace', 'acf', 'ach', 'aci', 'ack', 'acl', 'acm', 'acn', 'acp', 'acq', 'acr', 'acs', 'act', 'acu', 'acv', 'acw', 'acx', 'acy', 'acz', 'ada', 'adb', 'add', 'ade', 'adf', 'adg', 'adh', 'adi', 'adj', 'adl', 'adn', 'ado', 'adp', 'adq', 'adr', 'ads', 'adt', 'adu', 'adw', 'adx', 'ady', 'adz', 'aea', 'aeb', 'aec', 'aed', 'aee', 'aek', 'ael', 'aem', 'aen', 'aeq', 'aer', 'aes', 'aeu', 'aew', 'aey', 'aez', 'afa', 'afb', 'afd', 'afe', 'afg', 'afh', 'afi', 'afk', 'afn', 'afo', 'afp', 'afs', 'aft', 'afu', 'afz', 'aga', 'agb', 'agc', 'agd', 'age', 'agf', 'agg', 'agh', 'agi', 'agj', 'agk', 'agl', 'agm', 'agn', 'ago', 'agp', 'agq', 'agr', 'ags', 'agt', 'agu', 'agv', 'agw', 'agx', 'agy', 'agz', 'aha', 'ahb', 'ahg', 'ahh', 'ahi', 'ahk', 'ahl', 'ahm', 'ahn', 'aho', 'ahp', 'ahr', 'ahs', 'aht', 'aia', 'aib', 'aic', 'aid', 'aie', 'aif', 'aig', 'aih', 'aii', 'aij', 'aik', 'ail', 'aim', 'ain', 'aio', 'aip', 'aiq', 'air', 'ais', 'ait', 'aiw', 'aix', 'aiy', 'aja', 'ajg', 'aji', 'ajn', 'ajp', 'ajt', 'aju', 'ajw', 'ajz', 'akb', 'akc', 'akd', 'ake', 'akf', 'akg', 'akh', 'aki', 'akj', 'akk', 'akl', 'akm', 'ako', 'akp', 'akq', 'akr', 'aks', 'akt', 'aku', 'akv', 'akw', 'akx', 'aky', 'akz', 'ala', 'alc', 'ald', 'ale', 'alf', 'alg', 'alh', 'ali', 'alj', 'alk', 'all', 'alm', 'aln', 'alo', 'alp', 'alq', 'alr', 'als', 'alt', 'alu', 'alv', 'alw', 'alx', 'aly', 'alz', 'ama', 'amb', 'amc', 'ame', 'amf', 'amg', 'ami', 'amj', 'amk', 'aml', 'amm', 'amn', 'amo', 'amp', 'amq', 'amr', 'ams', 'amt', 'amu', 'amv', 'amw', 'amx', 'amy', 'amz', 'ana', 'anb', 'anc', 'and', 'ane', 'anf', 'ang', 'anh', 'ani', 'anj', 'ank', 'anl', 'anm', 'ann', 'ano', 'anp', 'anq', 'anr', 'ans', 'ant', 'anu', 'anv', 'anw', 'anx', 'any', 'anz', 'aoa', 'aob', 'aoc', 'aod', 'aoe', 'aof', 'aog', 'aoh', 'aoi', 'aoj', 'aok', 'aol', 'aom', 'aon', 'aor', 'aos', 'aot', 'aou', 'aox', 'aoz', 'apa', 'apb', 'apc', 'apd', 'ape', 'apf', 'apg', 'aph', 'api', 'apj', 'apk', 'apl', 'apm', 'apn', 'apo', 'app', 'apq', 'apr', 'aps', 'apt', 'apu', 'apv', 'apw', 'apx', 'apy', 'apz', 'aqa', 'aqc', 'aqd', 'aqg', 'aql', 'aqm', 'aqn', 'aqp', 'aqr', 'aqt', 'aqz', 'arb', 'arc', 'ard', 'are', 'arh', 'ari', 'arj', 'ark', 'arl', 'arn', 'aro', 'arp', 'arq', 'arr', 'ars', 'art', 'aru', 'arv', 'arw', 'arx', 'ary', 'arz', 'asa', 'asb', 'asc', 'asd', 'ase', 'asf', 'asg', 'ash', 'asi', 'asj', 'ask', 'asl', 'asn', 'aso', 'asp', 'asq', 'asr', 'ass', 'ast', 'asu', 'asv', 'asw', 'asx', 'asy', 'asz', 'ata', 'atb', 'atc', 'atd', 'ate', 'atg', 'ath', 'ati', 'atj', 'atk', 'atl', 'atm', 'atn', 'ato', 'atp', 'atq', 'atr', 'ats', 'att', 'atu', 'atv', 'atw', 'atx', 'aty', 'atz', 'aua', 'aub', 'auc', 'aud', 'aue', 'auf', 'aug', 'auh', 'aui', 'auj', 'auk', 'aul', 'aum', 'aun', 'auo', 'aup', 'auq', 'aur', 'aus', 'aut', 'auu', 'auw', 'aux', 'auy', 'auz', 'avb', 'avd', 'avi', 'avk', 'avl', 'avm', 'avn', 'avo', 'avs', 'avt', 'avu', 'avv', 'awa', 'awb', 'awc', 'awd', 'awe', 'awg', 'awh', 'awi', 'awk', 'awm', 'awn', 'awo', 'awr', 'aws', 'awt', 'awu', 'awv', 'aww', 'awx', 'awy', 'axb', 'axe', 'axg', 'axk', 'axl', 'axm', 'axx', 'aya', 'ayb', 'ayc', 'ayd', 'aye', 'ayg', 'ayh', 'ayi', 'ayk', 'ayl', 'ayn', 'ayo', 'ayp', 'ayq', 'ayr', 'ays', 'ayt', 'ayu', 'ayx', 'ayy', 'ayz', 'aza', 'azb', 'azc', 'azd', 'azg', 'azj', 'azm', 'azn', 'azo', 'azt', 'azz', 'baa', 'bab', 'bac', 'bad', 'bae', 'baf', 'bag', 'bah', 'bai', 'baj', 'bal', 'ban', 'bao', 'bap', 'bar', 'bas', 'bat', 'bau', 'bav', 'baw', 'bax', 'bay', 'baz', 'bba', 'bbb', 'bbc', 'bbd', 'bbe', 'bbf', 'bbg', 'bbh', 'bbi', 'bbj', 'bbk', 'bbl', 'bbm', 'bbn', 'bbo', 'bbp', 'bbq', 'bbr', 'bbs', 'bbt', 'bbu', 'bbv', 'bbw', 'bbx', 'bby', 'bbz', 'bca', 'bcb', 'bcc', 'bcd', 'bce', 'bcf', 'bcg', 'bch', 'bci', 'bcj', 'bck', 'bcl', 'bcm', 'bcn', 'bco', 'bcp', 'bcq', 'bcr', 'bcs', 'bct', 'bcu', 'bcv', 'bcw', 'bcy', 'bcz', 'bda', 'bdb', 'bdc', 'bdd', 'bde', 'bdf', 'bdg', 'bdh', 'bdi', 'bdj', 'bdk', 'bdl', 'bdm', 'bdn', 'bdo', 'bdp', 'bdq', 'bdr', 'bds', 'bdt', 'bdu', 'bdv', 'bdw', 'bdx', 'bdy', 'bdz', 'bea', 'beb', 'bec', 'bed', 'bee', 'bef', 'beg', 'beh', 'bei', 'bej', 'bek', 'bem', 'beo', 'bep', 'beq', 'ber', 'bes', 'bet', 'beu', 'bev', 'bew', 'bex', 'bey', 'bez', 'bfa', 'bfb', 'bfc', 'bfd', 'bfe', 'bff', 'bfg', 'bfh', 'bfi', 'bfj', 'bfk', 'bfl', 'bfm', 'bfn', 'bfo', 'bfp', 'bfq', 'bfr', 'bfs', 'bft', 'bfu', 'bfw', 'bfx', 'bfy', 'bfz', 'bga', 'bgb', 'bgc', 'bgd', 'bge', 'bgf', 'bgg', 'bgi', 'bgj', 'bgk', 'bgl', 'bgm', 'bgn', 'bgo', 'bgp', 'bgq', 'bgr', 'bgs', 'bgt', 'bgu', 'bgv', 'bgw', 'bgx', 'bgy', 'bgz', 'bha', 'bhb', 'bhc', 'bhd', 'bhe', 'bhf', 'bhg', 'bhh', 'bhi', 'bhj', 'bhk', 'bhl', 'bhm', 'bhn', 'bho', 'bhp', 'bhq', 'bhr', 'bhs', 'bht', 'bhu', 'bhv', 'bhw', 'bhx', 'bhy', 'bhz', 'bia', 'bib', 'bic', 'bid', 'bie', 'bif', 'big', 'bij', 'bik', 'bil', 'bim', 'bin', 'bio', 'bip', 'biq', 'bir', 'bit', 'biu', 'biv', 'biw', 'bix', 'biy', 'biz', 'bja', 'bjb', 'bjc', 'bjd', 'bje', 'bjf', 'bjg', 'bjh', 'bji', 'bjj', 'bjk', 'bjl', 'bjm', 'bjn', 'bjo', 'bjp', 'bjq', 'bjr', 'bjs', 'bjt', 'bju', 'bjv', 'bjw', 'bjx', 'bjy', 'bjz', 'bka', 'bkb', 'bkc', 'bkd', 'bkf', 'bkg', 'bkh', 'bki', 'bkj', 'bkk', 'bkl', 'bkm', 'bkn', 'bko', 'bkp', 'bkq', 'bkr', 'bks', 'bkt', 'bku', 'bkv', 'bkw', 'bkx', 'bky', 'bkz', 'bla', 'blb', 'blc', 'bld', 'ble', 'blf', 'blg', 'blh', 'bli', 'blj', 'blk', 'bll', 'blm', 'bln', 'blo', 'blp', 'blq', 'blr', 'bls', 'blt', 'blv', 'blw', 'blx', 'bly', 'blz', 'bma', 'bmb', 'bmc', 'bmd', 'bme', 'bmf', 'bmg', 'bmh', 'bmi', 'bmj', 'bmk', 'bml', 'bmm', 'bmn', 'bmo', 'bmp', 'bmq', 'bmr', 'bms', 'bmt', 'bmu', 'bmv', 'bmw', 'bmx', 'bmy', 'bmz', 'bna', 'bnb', 'bnc', 'bnd', 'bne', 'bnf', 'bng', 'bni', 'bnj', 'bnk', 'bnl', 'bnm', 'bnn', 'bno', 'bnp', 'bnq', 'bnr', 'bns', 'bnt', 'bnu', 'bnv', 'bnw', 'bnx', 'bny', 'bnz', 'boa', 'bob', 'boe', 'bof', 'bog', 'boh', 'boi', 'boj', 'bok', 'bol', 'bom', 'bon', 'boo', 'bop', 'boq', 'bor', 'bot', 'bou', 'bov', 'bow', 'box', 'boy', 'boz', 'bpa', 'bpb', 'bpd', 'bpg', 'bph', 'bpi', 'bpj', 'bpk', 'bpl', 'bpm', 'bpn', 'bpo', 'bpp', 'bpq', 'bpr', 'bps', 'bpt', 'bpu', 'bpv', 'bpw', 'bpx', 'bpy', 'bpz', 'bqa', 'bqb', 'bqc', 'bqd', 'bqf', 'bqg', 'bqh', 'bqi', 'bqj', 'bqk', 'bql', 'bqm', 'bqn', 'bqo', 'bqp', 'bqq', 'bqr', 'bqs', 'bqt', 'bqu', 'bqv', 'bqw', 'bqx', 'bqy', 'bqz', 'bra', 'brb', 'brc', 'brd', 'brf', 'brg', 'brh', 'bri', 'brj', 'brk', 'brl', 'brm', 'brn', 'bro', 'brp', 'brq', 'brr', 'brs', 'brt', 'bru', 'brv', 'brw', 'brx', 'bry', 'brz', 'bsa', 'bsb', 'bsc', 'bse', 'bsf', 'bsg', 'bsh', 'bsi', 'bsj', 'bsk', 'bsl', 'bsm', 'bsn', 'bso', 'bsp', 'bsq', 'bsr', 'bss', 'bst', 'bsu', 'bsv', 'bsw', 'bsx', 'bsy', 'bta', 'btb', 'btc', 'btd', 'bte', 'btf', 'btg', 'bth', 'bti', 'btj', 'btk', 'btl', 'btm', 'btn', 'bto', 'btp', 'btq', 'btr', 'bts', 'btt', 'btu', 'btv', 'btw', 'btx', 'bty', 'btz', 'bua', 'bub', 'buc', 'bud', 'bue', 'buf', 'bug', 'buh', 'bui', 'buj', 'buk', 'bum', 'bun', 'buo', 'bup', 'buq', 'bus', 'but', 'buu', 'buv', 'buw', 'bux', 'buy', 'buz', 'bva', 'bvb', 'bvc', 'bvd', 'bve', 'bvf', 'bvg', 'bvh', 'bvi', 'bvj', 'bvk', 'bvl', 'bvm', 'bvn', 'bvo', 'bvp', 'bvq', 'bvr', 'bvt', 'bvu', 'bvv', 'bvw', 'bvx', 'bvy', 'bvz', 'bwa', 'bwb', 'bwc', 'bwd', 'bwe', 'bwf', 'bwg', 'bwh', 'bwi', 'bwj', 'bwk', 'bwl', 'bwm', 'bwn', 'bwo', 'bwp', 'bwq', 'bwr', 'bws', 'bwt', 'bwu', 'bww', 'bwx', 'bwy', 'bwz', 'bxa', 'bxb', 'bxc', 'bxd', 'bxe', 'bxf', 'bxg', 'bxh', 'bxi', 'bxj', 'bxk', 'bxl', 'bxm', 'bxn', 'bxo', 'bxp', 'bxq', 'bxr', 'bxs', 'bxu', 'bxv', 'bxw', 'bxx', 'bxz', 'bya', 'byb', 'byc', 'byd', 'bye', 'byf', 'byg', 'byh', 'byi', 'byj', 'byk', 'byl', 'bym', 'byn', 'byo', 'byp', 'byq', 'byr', 'bys', 'byt', 'byv', 'byw', 'byx', 'byy', 'byz', 'bza', 'bzb', 'bzc', 'bzd', 'bze', 'bzf', 'bzg', 'bzh', 'bzi', 'bzj', 'bzk', 'bzl', 'bzm', 'bzn', 'bzo', 'bzp', 'bzq', 'bzr', 'bzs', 'bzt', 'bzu', 'bzv', 'bzw', 'bzx', 'bzy', 'bzz', 'caa', 'cab', 'cac', 'cad', 'cae', 'caf', 'cag', 'cah', 'cai', 'caj', 'cak', 'cal', 'cam', 'can', 'cao', 'cap', 'caq', 'car', 'cas', 'cau', 'cav', 'caw', 'cax', 'cay', 'caz', 'cba', 'cbb', 'cbc', 'cbd', 'cbe', 'cbg', 'cbh', 'cbi', 'cbj', 'cbk', 'cbl', 'cbn', 'cbo', 'cbq', 'cbr', 'cbs', 'cbt', 'cbu', 'cbv', 'cbw', 'cby', 'cca', 'ccc', 'ccd', 'cce', 'ccg', 'cch', 'ccj', 'ccl', 'ccm', 'ccn', 'cco', 'ccp', 'ccq', 'ccr', 'ccs', 'cda', 'cdc', 'cdd', 'cde', 'cdf', 'cdg', 'cdh', 'cdi', 'cdj', 'cdm', 'cdn', 'cdo', 'cdr', 'cds', 'cdy', 'cdz', 'cea', 'ceb', 'ceg', 'cek', 'cel', 'cen', 'cet', 'cfa', 'cfd', 'cfg', 'cfm', 'cga', 'cgc', 'cgg', 'cgk', 'chb', 'chc', 'chd', 'chf', 'chg', 'chh', 'chj', 'chk', 'chl', 'chm', 'chn', 'cho', 'chp', 'chq', 'chr', 'cht', 'chw', 'chx', 'chy', 'chz', 'cia', 'cib', 'cic', 'cid', 'cie', 'cih', 'cik', 'cim', 'cin', 'cip', 'cir', 'ciw', 'ciy', 'cja', 'cje', 'cjh', 'cji', 'cjk', 'cjm', 'cjn', 'cjo', 'cjp', 'cjr', 'cjs', 'cjv', 'cjy', 'cka', 'ckb', 'ckh', 'ckl', 'ckn', 'cko', 'ckq', 'ckr', 'cks', 'ckt', 'cku', 'ckv', 'ckx', 'cky', 'ckz', 'cla', 'clc', 'cld', 'cle', 'clh', 'cli', 'clj', 'clk', 'cll', 'clm', 'clo', 'clt', 'clu', 'clw', 'cly', 'cma', 'cmc', 'cme', 'cmg', 'cmi', 'cmk', 'cml', 'cmm', 'cmn', 'cmo', 'cmr', 'cms', 'cmt', 'cna', 'cnb', 'cnc', 'cng', 'cnh', 'cni', 'cnk', 'cnl', 'cno', 'cns', 'cnt', 'cnu', 'cnw', 'cnx', 'coa', 'cob', 'coc', 'cod', 'coe', 'cof', 'cog', 'coh', 'coj', 'cok', 'col', 'com', 'con', 'coo', 'cop', 'coq', 'cot', 'cou', 'cov', 'cow', 'cox', 'coy', 'coz', 'cpa', 'cpb', 'cpc', 'cpe', 'cpf', 'cpg', 'cpi', 'cpn', 'cpo', 'cpp', 'cps', 'cpu', 'cpx', 'cpy', 'cqd', 'cqu', 'cra', 'crb', 'crc', 'crd', 'crf', 'crg', 'crh', 'cri', 'crj', 'crk', 'crl', 'crm', 'crn', 'cro', 'crp', 'crq', 'crr', 'crs', 'crt', 'crv', 'crw', 'crx', 'cry', 'crz', 'csa', 'csb', 'csc', 'csd', 'cse', 'csf', 'csg', 'csh', 'csi', 'csj', 'csk', 'csl', 'csm', 'csn', 'cso', 'csq', 'csr', 'css', 'cst', 'csu', 'csv', 'csw', 'csy', 'csz', 'cta', 'ctc', 'ctd', 'cte', 'ctg', 'cth', 'ctl', 'ctm', 'ctn', 'cto', 'ctp', 'cts', 'ctt', 'ctu', 'ctz', 'cua', 'cub', 'cuc', 'cug', 'cuh', 'cui', 'cuj', 'cuk', 'cul', 'cum', 'cuo', 'cup', 'cuq', 'cur', 'cus', 'cut', 'cuu', 'cuv', 'cuw', 'cux', 'cvg', 'cvn', 'cwa', 'cwb', 'cwd', 'cwe', 'cwg', 'cwt', 'cya', 'cyb', 'cyo', 'czh', 'czk', 'czn', 'czo', 'czt', 'daa', 'dac', 'dad', 'dae', 'daf', 'dag', 'dah', 'dai', 'daj', 'dak', 'dal', 'dam', 'dao', 'dap', 'daq', 'dar', 'das', 'dau', 'dav', 'daw', 'dax', 'day', 'daz', 'dba', 'dbb', 'dbd', 'dbe', 'dbf', 'dbg', 'dbi', 'dbj', 'dbl', 'dbm', 'dbn', 'dbo', 'dbp', 'dbq', 'dbr', 'dbt', 'dbu', 'dbv', 'dbw', 'dby', 'dcc', 'dcr', 'dda', 'ddd', 'dde', 'ddg', 'ddi', 'ddj', 'ddn', 'ddo', 'ddr', 'dds', 'ddw', 'dec', 'ded', 'dee', 'def', 'deg', 'deh', 'dei', 'dek', 'del', 'dem', 'den', 'dep', 'deq', 'der', 'des', 'dev', 'dez', 'dga', 'dgb', 'dgc', 'dgd', 'dge', 'dgg', 'dgh', 'dgi', 'dgk', 'dgl', 'dgn', 'dgo', 'dgr', 'dgs', 'dgt', 'dgu', 'dgw', 'dgx', 'dgz', 'dha', 'dhd', 'dhg', 'dhi', 'dhl', 'dhm', 'dhn', 'dho', 'dhr', 'dhs', 'dhu', 'dhv', 'dhw', 'dhx', 'dia', 'dib', 'dic', 'did', 'dif', 'dig', 'dih', 'dii', 'dij', 'dik', 'dil', 'dim', 'din', 'dio', 'dip', 'diq', 'dir', 'dis', 'dit', 'diu', 'diw', 'dix', 'diy', 'diz', 'dja', 'djb', 'djc', 'djd', 'dje', 'djf', 'dji', 'djj', 'djk', 'djl', 'djm', 'djn', 'djo', 'djr', 'dju', 'djw', 'dka', 'dkk', 'dkl', 'dkr', 'dks', 'dkx', 'dlg', 'dlk', 'dlm', 'dln', 'dma', 'dmb', 'dmc', 'dmd', 'dme', 'dmg', 'dmk', 'dml', 'dmm', 'dmn', 'dmo', 'dmr', 'dms', 'dmu', 'dmv', 'dmw', 'dmx', 'dmy', 'dna', 'dnd', 'dne', 'dng', 'dni', 'dnj', 'dnk', 'dnn', 'dnr', 'dnt', 'dnu', 'dnv', 'dnw', 'dny', 'doa', 'dob', 'doc', 'doe', 'dof', 'doh', 'doi', 'dok', 'dol', 'don', 'doo', 'dop', 'doq', 'dor', 'dos', 'dot', 'dov', 'dow', 'dox', 'doy', 'doz', 'dpp', 'dra', 'drb', 'drc', 'drd', 'dre', 'drg', 'drh', 'dri', 'drl', 'drn', 'dro', 'drq', 'drr', 'drs', 'drt', 'dru', 'drw', 'dry', 'dsb', 'dse', 'dsh', 'dsi', 'dsl', 'dsn', 'dso', 'dsq', 'dta', 'dtb', 'dtd', 'dth', 'dti', 'dtk', 'dtm', 'dtn', 'dto', 'dtp', 'dtr', 'dts', 'dtt', 'dtu', 'dty', 'dua', 'dub', 'duc', 'dud', 'due', 'duf', 'dug', 'duh', 'dui', 'duj', 'duk', 'dul', 'dum', 'dun', 'duo', 'dup', 'duq', 'dur', 'dus', 'duu', 'duv', 'duw', 'dux', 'duy', 'duz', 'dva', 'dwa', 'dwl', 'dwr', 'dws', 'dwu', 'dww', 'dwy', 'dya', 'dyb', 'dyd', 'dyg', 'dyi', 'dym', 'dyn', 'dyo', 'dyu', 'dyy', 'dza', 'dzd', 'dze', 'dzg', 'dzl', 'dzn', 'eaa', 'ebg', 'ebk', 'ebo', 'ebr', 'ebu', 'ecr', 'ecs', 'ecy', 'eee', 'efa', 'efe', 'efi', 'ega', 'egl', 'ego', 'egx', 'egy', 'ehu', 'eip', 'eit', 'eiv', 'eja', 'eka', 'ekc', 'eke', 'ekg', 'eki', 'ekk', 'ekl', 'ekm', 'eko', 'ekp', 'ekr', 'eky', 'ele', 'elh', 'eli', 'elk', 'elm', 'elo', 'elp', 'elu', 'elx', 'ema', 'emb', 'eme', 'emg', 'emi', 'emk', 'emm', 'emn', 'emo', 'emp', 'ems', 'emu', 'emw', 'emx', 'emy', 'ena', 'enb', 'enc', 'end', 'enf', 'enh', 'enl', 'enm', 'enn', 'eno', 'enq', 'enr', 'enu', 'env', 'enw', 'enx', 'eot', 'epi', 'era', 'erg', 'erh', 'eri', 'erk', 'ero', 'err', 'ers', 'ert', 'erw', 'ese', 'esg', 'esh', 'esi', 'esk', 'esl', 'esm', 'esn', 'eso', 'esq', 'ess', 'esu', 'esx', 'esy', 'etb', 'etc', 'eth', 'etn', 'eto', 'etr', 'ets', 'ett', 'etu', 'etx', 'etz', 'euq', 'eve', 'evh', 'evn', 'ewo', 'ext', 'eya', 'eyo', 'eza', 'eze', 'faa', 'fab', 'fad', 'faf', 'fag', 'fah', 'fai', 'faj', 'fak', 'fal', 'fam', 'fan', 'fap', 'far', 'fat', 'fau', 'fax', 'fay', 'faz', 'fbl', 'fcs', 'fer', 'ffi', 'ffm', 'fgr', 'fia', 'fie', 'fil', 'fip', 'fir', 'fit', 'fiu', 'fiw', 'fkk', 'fkv', 'fla', 'flh', 'fli', 'fll', 'fln', 'flr', 'fly', 'fmp', 'fmu', 'fnb', 'fng', 'fni', 'fod', 'foi', 'fom', 'fon', 'for', 'fos', 'fox', 'fpe', 'fqs', 'frc', 'frd', 'frk', 'frm', 'fro', 'frp', 'frq', 'frr', 'frs', 'frt', 'fse', 'fsl', 'fss', 'fub', 'fuc', 'fud', 'fue', 'fuf', 'fuh', 'fui', 'fuj', 'fum', 'fun', 'fuq', 'fur', 'fut', 'fuu', 'fuv', 'fuy', 'fvr', 'fwa', 'fwe', 'gaa', 'gab', 'gac', 'gad', 'gae', 'gaf', 'gag', 'gah', 'gai', 'gaj', 'gak', 'gal', 'gam', 'gan', 'gao', 'gap', 'gaq', 'gar', 'gas', 'gat', 'gau', 'gav', 'gaw', 'gax', 'gay', 'gaz', 'gba', 'gbb', 'gbc', 'gbd', 'gbe', 'gbf', 'gbg', 'gbh', 'gbi', 'gbj', 'gbk', 'gbl', 'gbm', 'gbn', 'gbo', 'gbp', 'gbq', 'gbr', 'gbs', 'gbu', 'gbv', 'gbw', 'gbx', 'gby', 'gbz', 'gcc', 'gcd', 'gce', 'gcf', 'gcl', 'gcn', 'gcr', 'gct', 'gda', 'gdb', 'gdc', 'gdd', 'gde', 'gdf', 'gdg', 'gdh', 'gdi', 'gdj', 'gdk', 'gdl', 'gdm', 'gdn', 'gdo', 'gdq', 'gdr', 'gds', 'gdt', 'gdu', 'gdx', 'gea', 'geb', 'gec', 'ged', 'geg', 'geh', 'gei', 'gej', 'gek', 'gel', 'gem', 'geq', 'ges', 'gev', 'gew', 'gex', 'gey', 'gez', 'gfk', 'gft', 'gfx', 'gga', 'ggb', 'ggd', 'gge', 'ggg', 'ggk', 'ggl', 'ggn', 'ggo', 'ggr', 'ggt', 'ggu', 'ggw', 'gha', 'ghc', 'ghe', 'ghh', 'ghk', 'ghl', 'ghn', 'gho', 'ghr', 'ghs', 'ght', 'gia', 'gib', 'gic', 'gid', 'gie', 'gig', 'gih', 'gil', 'gim', 'gin', 'gio', 'gip', 'giq', 'gir', 'gis', 'git', 'giu', 'giw', 'gix', 'giy', 'giz', 'gji', 'gjk', 'gjm', 'gjn', 'gjr', 'gju', 'gka', 'gke', 'gkn', 'gko', 'gkp', 'gku', 'glc', 'gld', 'glh', 'gli', 'glj', 'glk', 'gll', 'glo', 'glr', 'glu', 'glw', 'gly', 'gma', 'gmb', 'gmd', 'gme', 'gmg', 'gmh', 'gml', 'gmm', 'gmn', 'gmq', 'gmu', 'gmv', 'gmw', 'gmx', 'gmy', 'gmz', 'gna', 'gnb', 'gnc', 'gnd', 'gne', 'gng', 'gnh', 'gni', 'gnk', 'gnl', 'gnm', 'gnn', 'gno', 'gnq', 'gnr', 'gnt', 'gnu', 'gnw', 'gnz', 'goa', 'gob', 'goc', 'god', 'goe', 'gof', 'gog', 'goh', 'goi', 'goj', 'gok', 'gol', 'gom', 'gon', 'goo', 'gop', 'goq', 'gor', 'gos', 'got', 'gou', 'gow', 'gox', 'goy', 'goz', 'gpa', 'gpe', 'gpn', 'gqa', 'gqi', 'gqn', 'gqr', 'gqu', 'gra', 'grb', 'grc', 'grd', 'grg', 'grh', 'gri', 'grj', 'grk', 'grm', 'gro', 'grq', 'grr', 'grs', 'grt', 'gru', 'grv', 'grw', 'grx', 'gry', 'grz', 'gse', 'gsg', 'gsl', 'gsm', 'gsn', 'gso', 'gsp', 'gss', 'gsw', 'gta', 'gti', 'gtu', 'gua', 'gub', 'guc', 'gud', 'gue', 'guf', 'gug', 'guh', 'gui', 'guk', 'gul', 'gum', 'gun', 'guo', 'gup', 'guq', 'gur', 'gus', 'gut', 'guu', 'guv', 'guw', 'gux', 'guz', 'gva', 'gvc', 'gve', 'gvf', 'gvj', 'gvl', 'gvm', 'gvn', 'gvo', 'gvp', 'gvr', 'gvs', 'gvy', 'gwa', 'gwb', 'gwc', 'gwd', 'gwe', 'gwf', 'gwg', 'gwi', 'gwj', 'gwm', 'gwn', 'gwr', 'gwt', 'gwu', 'gww', 'gwx', 'gxx', 'gya', 'gyb', 'gyd', 'gye', 'gyf', 'gyg', 'gyi', 'gyl', 'gym', 'gyn', 'gyr', 'gyy', 'gza', 'gzi', 'gzn', 'haa', 'hab', 'hac', 'had', 'hae', 'haf', 'hag', 'hah', 'hai', 'haj', 'hak', 'hal', 'ham', 'han', 'hao', 'hap', 'haq', 'har', 'has', 'hav', 'haw', 'hax', 'hay', 'haz', 'hba', 'hbb', 'hbn', 'hbo', 'hbu', 'hca', 'hch', 'hdn', 'hds', 'hdy', 'hea', 'hed', 'heg', 'heh', 'hei', 'hem', 'hgm', 'hgw', 'hhi', 'hhr', 'hhy', 'hia', 'hib', 'hid', 'hif', 'hig', 'hih', 'hii', 'hij', 'hik', 'hil', 'him', 'hio', 'hir', 'hit', 'hiw', 'hix', 'hji', 'hka', 'hke', 'hkk', 'hks', 'hla', 'hlb', 'hld', 'hle', 'hlt', 'hlu', 'hma', 'hmb', 'hmc', 'hmd', 'hme', 'hmf', 'hmg', 'hmh', 'hmi', 'hmj', 'hmk', 'hml', 'hmm', 'hmn', 'hmp', 'hmq', 'hmr', 'hms', 'hmt', 'hmu', 'hmv', 'hmw', 'hmx', 'hmy', 'hmz', 'hna', 'hnd', 'hne', 'hnh', 'hni', 'hnj', 'hnn', 'hno', 'hns', 'hnu', 'hoa', 'hob', 'hoc', 'hod', 'hoe', 'hoh', 'hoi', 'hoj', 'hok', 'hol', 'hom', 'hoo', 'hop', 'hor', 'hos', 'hot', 'hov', 'how', 'hoy', 'hoz', 'hpo', 'hps', 'hra', 'hrc', 'hre', 'hrk', 'hrm', 'hro', 'hrp', 'hrr', 'hrt', 'hru', 'hrw', 'hrx', 'hrz', 'hsb', 'hsh', 'hsl', 'hsn', 'hss', 'hti', 'hto', 'hts', 'htu', 'htx', 'hub', 'huc', 'hud', 'hue', 'huf', 'hug', 'huh', 'hui', 'huj', 'huk', 'hul', 'hum', 'huo', 'hup', 'huq', 'hur', 'hus', 'hut', 'huu', 'huv', 'huw', 'hux', 'huy', 'huz', 'hvc', 'hve', 'hvk', 'hvn', 'hvv', 'hwa', 'hwc', 'hwo', 'hya', 'hyx', 'iai', 'ian', 'iap', 'iar', 'iba', 'ibb', 'ibd', 'ibe', 'ibg', 'ibh', 'ibi', 'ibl', 'ibm', 'ibn', 'ibr', 'ibu', 'iby', 'ica', 'ich', 'icl', 'icr', 'ida', 'idb', 'idc', 'idd', 'ide', 'idi', 'idr', 'ids', 'idt', 'idu', 'ifa', 'ifb', 'ife', 'iff', 'ifk', 'ifm', 'ifu', 'ify', 'igb', 'ige', 'igg', 'igl', 'igm', 'ign', 'igo', 'igs', 'igw', 'ihb', 'ihi', 'ihp', 'ihw', 'iin', 'iir', 'ijc', 'ije', 'ijj', 'ijn', 'ijo', 'ijs', 'ike', 'iki', 'ikk', 'ikl', 'iko', 'ikp', 'ikr', 'iks', 'ikt', 'ikv', 'ikw', 'ikx', 'ikz', 'ila', 'ilb', 'ilg', 'ili', 'ilk', 'ill', 'ilm', 'ilo', 'ilp', 'ils', 'ilu', 'ilv', 'ilw', 'ima', 'ime', 'imi', 'iml', 'imn', 'imo', 'imr', 'ims', 'imy', 'inb', 'inc', 'ine', 'ing', 'inh', 'inj', 'inl', 'inm', 'inn', 'ino', 'inp', 'ins', 'int', 'inz', 'ior', 'iou', 'iow', 'ipi', 'ipo', 'iqu', 'iqw', 'ira', 'ire', 'irh', 'iri', 'irk', 'irn', 'iro', 'irr', 'iru', 'irx', 'iry', 'isa', 'isc', 'isd', 'ise', 'isg', 'ish', 'isi', 'isk', 'ism', 'isn', 'iso', 'isr', 'ist', 'isu', 'itb', 'itc', 'itd', 'ite', 'iti', 'itk', 'itl', 'itm', 'ito', 'itr', 'its', 'itt', 'itv', 'itw', 'itx', 'ity', 'itz', 'ium', 'ivb', 'ivv', 'iwk', 'iwm', 'iwo', 'iws', 'ixc', 'ixl', 'iya', 'iyo', 'iyx', 'izh', 'izi', 'izr', 'izz', 'jaa', 'jab', 'jac', 'jad', 'jae', 'jaf', 'jah', 'jaj', 'jak', 'jal', 'jam', 'jan', 'jao', 'jaq', 'jar', 'jas', 'jat', 'jau', 'jax', 'jay', 'jaz', 'jbe', 'jbi', 'jbj', 'jbk', 'jbn', 'jbo', 'jbr', 'jbt', 'jbu', 'jbw', 'jcs', 'jct', 'jda', 'jdg', 'jdt', 'jeb', 'jee', 'jeg', 'jeh', 'jei', 'jek', 'jel', 'jen', 'jer', 'jet', 'jeu', 'jgb', 'jge', 'jgk', 'jgo', 'jhi', 'jhs', 'jia', 'jib', 'jic', 'jid', 'jie', 'jig', 'jih', 'jii', 'jil', 'jim', 'jio', 'jiq', 'jit', 'jiu', 'jiv', 'jiy', 'jje', 'jjr', 'jka', 'jkm', 'jko', 'jkp', 'jkr', 'jku', 'jle', 'jls', 'jma', 'jmb', 'jmc', 'jmd', 'jmi', 'jml', 'jmn', 'jmr', 'jms', 'jmw', 'jmx', 'jna', 'jnd', 'jng', 'jni', 'jnj', 'jnl', 'jns', 'job', 'jod', 'jog', 'jor', 'jos', 'jow', 'jpa', 'jpr', 'jpx', 'jqr', 'jra', 'jrb', 'jrr', 'jrt', 'jru', 'jsl', 'jua', 'jub', 'juc', 'jud', 'juh', 'jui', 'juk', 'jul', 'jum', 'jun', 'juo', 'jup', 'jur', 'jus', 'jut', 'juu', 'juw', 'juy', 'jvd', 'jvn', 'jwi', 'jya', 'jye', 'jyy', 'kaa', 'kab', 'kac', 'kad', 'kae', 'kaf', 'kag', 'kah', 'kai', 'kaj', 'kak', 'kam', 'kao', 'kap', 'kaq', 'kar', 'kav', 'kaw', 'kax', 'kay', 'kba', 'kbb', 'kbc', 'kbd', 'kbe', 'kbf', 'kbg', 'kbh', 'kbi', 'kbj', 'kbk', 'kbl', 'kbm', 'kbn', 'kbo', 'kbp', 'kbq', 'kbr', 'kbs', 'kbt', 'kbu', 'kbv', 'kbw', 'kbx', 'kby', 'kbz', 'kca', 'kcb', 'kcc', 'kcd', 'kce', 'kcf', 'kcg', 'kch', 'kci', 'kcj', 'kck', 'kcl', 'kcm', 'kcn', 'kco', 'kcp', 'kcq', 'kcr', 'kcs', 'kct', 'kcu', 'kcv', 'kcw', 'kcx', 'kcy', 'kcz', 'kda', 'kdc', 'kdd', 'kde', 'kdf', 'kdg', 'kdh', 'kdi', 'kdj', 'kdk', 'kdl', 'kdm', 'kdn', 'kdo', 'kdp', 'kdq', 'kdr', 'kdt', 'kdu', 'kdv', 'kdw', 'kdx', 'kdy', 'kdz', 'kea', 'keb', 'kec', 'ked', 'kee', 'kef', 'keg', 'keh', 'kei', 'kej', 'kek', 'kel', 'kem', 'ken', 'keo', 'kep', 'keq', 'ker', 'kes', 'ket', 'keu', 'kev', 'kew', 'kex', 'key', 'kez', 'kfa', 'kfb', 'kfc', 'kfd', 'kfe', 'kff', 'kfg', 'kfh', 'kfi', 'kfj', 'kfk', 'kfl', 'kfm', 'kfn', 'kfo', 'kfp', 'kfq', 'kfr', 'kfs', 'kft', 'kfu', 'kfv', 'kfw', 'kfx', 'kfy', 'kfz', 'kga', 'kgb', 'kgc', 'kgd', 'kge', 'kgf', 'kgg', 'kgh', 'kgi', 'kgj', 'kgk', 'kgl', 'kgm', 'kgn', 'kgo', 'kgp', 'kgq', 'kgr', 'kgs', 'kgt', 'kgu', 'kgv', 'kgw', 'kgx', 'kgy', 'kha', 'khb', 'khc', 'khd', 'khe', 'khf', 'khg', 'khh', 'khi', 'khj', 'khk', 'khl', 'khn', 'kho', 'khp', 'khq', 'khr', 'khs', 'kht', 'khu', 'khv', 'khw', 'khx', 'khy', 'khz', 'kia', 'kib', 'kic', 'kid', 'kie', 'kif', 'kig', 'kih', 'kii', 'kij', 'kil', 'kim', 'kio', 'kip', 'kiq', 'kis', 'kit', 'kiu', 'kiv', 'kiw', 'kix', 'kiy', 'kiz', 'kja', 'kjb', 'kjc', 'kjd', 'kje', 'kjf', 'kjg', 'kjh', 'kji', 'kjj', 'kjk', 'kjl', 'kjm', 'kjn', 'kjo', 'kjp', 'kjq', 'kjr', 'kjs', 'kjt', 'kju', 'kjv', 'kjx', 'kjy', 'kjz', 'kka', 'kkb', 'kkc', 'kkd', 'kke', 'kkf', 'kkg', 'kkh', 'kki', 'kkj', 'kkk', 'kkl', 'kkm', 'kkn', 'kko', 'kkp', 'kkq', 'kkr', 'kks', 'kkt', 'kku', 'kkv', 'kkw', 'kkx', 'kky', 'kkz', 'kla', 'klb', 'klc', 'kld', 'kle', 'klf', 'klg', 'klh', 'kli', 'klj', 'klk', 'kll', 'klm', 'kln', 'klo', 'klp', 'klq', 'klr', 'kls', 'klt', 'klu', 'klv', 'klw', 'klx', 'kly', 'klz', 'kma', 'kmb', 'kmc', 'kmd', 'kme', 'kmf', 'kmg', 'kmh', 'kmi', 'kmj', 'kmk', 'kml', 'kmm', 'kmn', 'kmo', 'kmp', 'kmq', 'kmr', 'kms', 'kmt', 'kmu', 'kmv', 'kmw', 'kmx', 'kmy', 'kmz', 'kna', 'knb', 'knc', 'knd', 'kne', 'knf', 'kng', 'kni', 'knj', 'knk', 'knl', 'knm', 'knn', 'kno', 'knp', 'knq', 'knr', 'kns', 'knt', 'knu', 'knv', 'knw', 'knx', 'kny', 'knz', 'koa', 'koc', 'kod', 'koe', 'kof', 'kog', 'koh', 'koi', 'koj', 'kok', 'kol', 'koo', 'kop', 'koq', 'kos', 'kot', 'kou', 'kov', 'kow', 'kox', 'koy', 'koz', 'kpa', 'kpb', 'kpc', 'kpd', 'kpe', 'kpf', 'kpg', 'kph', 'kpi', 'kpj', 'kpk', 'kpl', 'kpm', 'kpn', 'kpo', 'kpp', 'kpq', 'kpr', 'kps', 'kpt', 'kpu', 'kpv', 'kpw', 'kpx', 'kpy', 'kpz', 'kqa', 'kqb', 'kqc', 'kqd', 'kqe', 'kqf', 'kqg', 'kqh', 'kqi', 'kqj', 'kqk', 'kql', 'kqm', 'kqn', 'kqo', 'kqp', 'kqq', 'kqr', 'kqs', 'kqt', 'kqu', 'kqv', 'kqw', 'kqx', 'kqy', 'kqz', 'kra', 'krb', 'krc', 'krd', 'kre', 'krf', 'krh', 'kri', 'krj', 'krk', 'krl', 'krm', 'krn', 'kro', 'krp', 'krr', 'krs', 'krt', 'kru', 'krv', 'krw', 'krx', 'kry', 'krz', 'ksa', 'ksb', 'ksc', 'ksd', 'kse', 'ksf', 'ksg', 'ksh', 'ksi', 'ksj', 'ksk', 'ksl', 'ksm', 'ksn', 'kso', 'ksp', 'ksq', 'ksr', 'kss', 'kst', 'ksu', 'ksv', 'ksw', 'ksx', 'ksy', 'ksz', 'kta', 'ktb', 'ktc', 'ktd', 'kte', 'ktf', 'ktg', 'kth', 'kti', 'ktj', 'ktk', 'ktl', 'ktm', 'ktn', 'kto', 'ktp', 'ktq', 'ktr', 'kts', 'ktt', 'ktu', 'ktv', 'ktw', 'ktx', 'kty', 'ktz', 'kub', 'kuc', 'kud', 'kue', 'kuf', 'kug', 'kuh', 'kui', 'kuj', 'kuk', 'kul', 'kum', 'kun', 'kuo', 'kup', 'kuq', 'kus', 'kut', 'kuu', 'kuv', 'kuw', 'kux', 'kuy', 'kuz', 'kva', 'kvb', 'kvc', 'kvd', 'kve', 'kvf', 'kvg', 'kvh', 'kvi', 'kvj', 'kvk', 'kvl', 'kvm', 'kvn', 'kvo', 'kvp', 'kvq', 'kvr', 'kvs', 'kvt', 'kvu', 'kvv', 'kvw', 'kvx', 'kvy', 'kvz', 'kwa', 'kwb', 'kwc', 'kwd', 'kwe', 'kwf', 'kwg', 'kwh', 'kwi', 'kwj', 'kwk', 'kwl', 'kwm', 'kwn', 'kwo', 'kwp', 'kwq', 'kwr', 'kws', 'kwt', 'kwu', 'kwv', 'kww', 'kwx', 'kwy', 'kwz', 'kxa', 'kxb', 'kxc', 'kxd', 'kxe', 'kxf', 'kxh', 'kxi', 'kxj', 'kxk', 'kxl', 'kxm', 'kxn', 'kxo', 'kxp', 'kxq', 'kxr', 'kxs', 'kxt', 'kxu', 'kxv', 'kxw', 'kxx', 'kxy', 'kxz', 'kya', 'kyb', 'kyc', 'kyd', 'kye', 'kyf', 'kyg', 'kyh', 'kyi', 'kyj', 'kyk', 'kyl', 'kym', 'kyn', 'kyo', 'kyp', 'kyq', 'kyr', 'kys', 'kyt', 'kyu', 'kyv', 'kyw', 'kyx', 'kyy', 'kyz', 'kza', 'kzb', 'kzc', 'kzd', 'kze', 'kzf', 'kzg', 'kzh', 'kzi', 'kzj', 'kzk', 'kzl', 'kzm', 'kzn', 'kzo', 'kzp', 'kzq', 'kzr', 'kzs', 'kzt', 'kzu', 'kzv', 'kzw', 'kzx', 'kzy', 'kzz', 'laa', 'lab', 'lac', 'lad', 'lae', 'laf', 'lag', 'lah', 'lai', 'laj', 'lak', 'lal', 'lam', 'lan', 'lap', 'laq', 'lar', 'las', 'lau', 'law', 'lax', 'lay', 'laz', 'lba', 'lbb', 'lbc', 'lbe', 'lbf', 'lbg', 'lbi', 'lbj', 'lbk', 'lbl', 'lbm', 'lbn', 'lbo', 'lbq', 'lbr', 'lbs', 'lbt', 'lbu', 'lbv', 'lbw', 'lbx', 'lby', 'lbz', 'lcc', 'lcd', 'lce', 'lcf', 'lch', 'lcl', 'lcm', 'lcp', 'lcq', 'lcs', 'lda', 'ldb', 'ldd', 'ldg', 'ldh', 'ldi', 'ldj', 'ldk', 'ldl', 'ldm', 'ldn', 'ldo', 'ldp', 'ldq', 'lea', 'leb', 'lec', 'led', 'lee', 'lef', 'leg', 'leh', 'lei', 'lej', 'lek', 'lel', 'lem', 'len', 'leo', 'lep', 'leq', 'ler', 'les', 'let', 'leu', 'lev', 'lew', 'lex', 'ley', 'lez', 'lfa', 'lfn', 'lga', 'lgb', 'lgg', 'lgh', 'lgi', 'lgk', 'lgl', 'lgm', 'lgn', 'lgq', 'lgr', 'lgt', 'lgu', 'lgz', 'lha', 'lhh', 'lhi', 'lhl', 'lhm', 'lhn', 'lhp', 'lhs', 'lht', 'lhu', 'lia', 'lib', 'lic', 'lid', 'lie', 'lif', 'lig', 'lih', 'lii', 'lij', 'lik', 'lil', 'lio', 'lip', 'liq', 'lir', 'lis', 'liu', 'liv', 'liw', 'lix', 'liy', 'liz', 'lja', 'lje', 'lji', 'ljl', 'ljp', 'ljw', 'ljx', 'lka', 'lkb', 'lkc', 'lkd', 'lke', 'lkh', 'lki', 'lkj', 'lkl', 'lkm', 'lkn', 'lko', 'lkr', 'lks', 'lkt', 'lku', 'lky', 'lla', 'llb', 'llc', 'lld', 'lle', 'llf', 'llg', 'llh', 'lli', 'llj', 'llk', 'lll', 'llm', 'lln', 'llo', 'llp', 'llq', 'lls', 'llu', 'llx', 'lma', 'lmb', 'lmc', 'lmd', 'lme', 'lmf', 'lmg', 'lmh', 'lmi', 'lmj', 'lmk', 'lml', 'lmm', 'lmn', 'lmo', 'lmp', 'lmq', 'lmr', 'lmu', 'lmv', 'lmw', 'lmx', 'lmy', 'lmz', 'lna', 'lnb', 'lnd', 'lng', 'lnh', 'lni', 'lnj', 'lnl', 'lnm', 'lnn', 'lno', 'lns', 'lnu', 'lnw', 'lnz', 'loa', 'lob', 'loc', 'loe', 'lof', 'log', 'loh', 'loi', 'loj', 'lok', 'lol', 'lom', 'lon', 'loo', 'lop', 'loq', 'lor', 'los', 'lot', 'lou', 'lov', 'low', 'lox', 'loy', 'loz', 'lpa', 'lpe', 'lpn', 'lpo', 'lpx', 'lra', 'lrc', 'lre', 'lrg', 'lri', 'lrk', 'lrl', 'lrm', 'lrn', 'lro', 'lrr', 'lrt', 'lrv', 'lrz', 'lsa', 'lsd', 'lse', 'lsg', 'lsh', 'lsi', 'lsl', 'lsm', 'lso', 'lsp', 'lsr', 'lss', 'lst', 'lsy', 'ltc', 'ltg', 'lth', 'lti', 'ltn', 'lto', 'lts', 'ltu', 'lua', 'luc', 'lud', 'lue', 'luf', 'lui', 'luj', 'luk', 'lul', 'lum', 'lun', 'luo', 'lup', 'luq', 'lur', 'lus', 'lut', 'luu', 'luv', 'luw', 'luy', 'luz', 'lva', 'lvk', 'lvs', 'lvu', 'lwa', 'lwe', 'lwg', 'lwh', 'lwl', 'lwm', 'lwo', 'lwt', 'lwu', 'lww', 'lya', 'lyg', 'lyn', 'lzh', 'lzl', 'lzn', 'lzz', 'maa', 'mab', 'mad', 'mae', 'maf', 'mag', 'mai', 'maj', 'mak', 'mam', 'man', 'map', 'maq', 'mas', 'mat', 'mau', 'mav', 'maw', 'max', 'maz', 'mba', 'mbb', 'mbc', 'mbd', 'mbe', 'mbf', 'mbh', 'mbi', 'mbj', 'mbk', 'mbl', 'mbm', 'mbn', 'mbo', 'mbp', 'mbq', 'mbr', 'mbs', 'mbt', 'mbu', 'mbv', 'mbw', 'mbx', 'mby', 'mbz', 'mca', 'mcb', 'mcc', 'mcd', 'mce', 'mcf', 'mcg', 'mch', 'mci', 'mcj', 'mck', 'mcl', 'mcm', 'mcn', 'mco', 'mcp', 'mcq', 'mcr', 'mcs', 'mct', 'mcu', 'mcv', 'mcw', 'mcx', 'mcy', 'mcz', 'mda', 'mdb', 'mdc', 'mdd', 'mde', 'mdf', 'mdg', 'mdh', 'mdi', 'mdj', 'mdk', 'mdl', 'mdm', 'mdn', 'mdp', 'mdq', 'mdr', 'mds', 'mdt', 'mdu', 'mdv', 'mdw', 'mdx', 'mdy', 'mdz', 'mea', 'meb', 'mec', 'med', 'mee', 'mef', 'meg', 'meh', 'mei', 'mej', 'mek', 'mel', 'mem', 'men', 'meo', 'mep', 'meq', 'mer', 'mes', 'met', 'meu', 'mev', 'mew', 'mey', 'mez', 'mfa', 'mfb', 'mfc', 'mfd', 'mfe', 'mff', 'mfg', 'mfh', 'mfi', 'mfj', 'mfk', 'mfl', 'mfm', 'mfn', 'mfo', 'mfp', 'mfq', 'mfr', 'mfs', 'mft', 'mfu', 'mfv', 'mfw', 'mfx', 'mfy', 'mfz', 'mga', 'mgb', 'mgc', 'mgd', 'mge', 'mgf', 'mgg', 'mgh', 'mgi', 'mgj', 'mgk', 'mgl', 'mgm', 'mgn', 'mgo', 'mgp', 'mgq', 'mgr', 'mgs', 'mgt', 'mgu', 'mgv', 'mgw', 'mgx', 'mgy', 'mgz', 'mha', 'mhb', 'mhc', 'mhd', 'mhe', 'mhf', 'mhg', 'mhh', 'mhi', 'mhj', 'mhk', 'mhl', 'mhm', 'mhn', 'mho', 'mhp', 'mhq', 'mhr', 'mhs', 'mht', 'mhu', 'mhw', 'mhx', 'mhy', 'mhz', 'mia', 'mib', 'mic', 'mid', 'mie', 'mif', 'mig', 'mih', 'mii', 'mij', 'mik', 'mil', 'mim', 'min', 'mio', 'mip', 'miq', 'mir', 'mis', 'mit', 'miu', 'miw', 'mix', 'miy', 'miz', 'mja', 'mjb', 'mjc', 'mjd', 'mje', 'mjg', 'mjh', 'mji', 'mjj', 'mjk', 'mjl', 'mjm', 'mjn', 'mjo', 'mjp', 'mjq', 'mjr', 'mjs', 'mjt', 'mju', 'mjv', 'mjw', 'mjx', 'mjy', 'mjz', 'mka', 'mkb', 'mkc', 'mke', 'mkf', 'mkg', 'mkh', 'mki', 'mkj', 'mkk', 'mkl', 'mkm', 'mkn', 'mko', 'mkp', 'mkq', 'mkr', 'mks', 'mkt', 'mku', 'mkv', 'mkw', 'mkx', 'mky', 'mkz', 'mla', 'mlb', 'mlc', 'mld', 'mle', 'mlf', 'mlh', 'mli', 'mlj', 'mlk', 'mll', 'mlm', 'mln', 'mlo', 'mlp', 'mlq', 'mlr', 'mls', 'mlu', 'mlv', 'mlw', 'mlx', 'mlz', 'mma', 'mmb', 'mmc', 'mmd', 'mme', 'mmf', 'mmg', 'mmh', 'mmi', 'mmj', 'mmk', 'mml', 'mmm', 'mmn', 'mmo', 'mmp', 'mmq', 'mmr', 'mmt', 'mmu', 'mmv', 'mmw', 'mmx', 'mmy', 'mmz', 'mna', 'mnb', 'mnc', 'mnd', 'mne', 'mnf', 'mng', 'mnh', 'mni', 'mnj', 'mnk', 'mnl', 'mnm', 'mnn', 'mno', 'mnp', 'mnq', 'mnr', 'mns', 'mnt', 'mnu', 'mnv', 'mnw', 'mnx', 'mny', 'mnz', 'moa', 'moc', 'mod', 'moe', 'mof', 'mog', 'moh', 'moi', 'moj', 'mok', 'mom', 'moo', 'mop', 'moq', 'mor', 'mos', 'mot', 'mou', 'mov', 'mow', 'mox', 'moy', 'moz', 'mpa', 'mpb', 'mpc', 'mpd', 'mpe', 'mpg', 'mph', 'mpi', 'mpj', 'mpk', 'mpl', 'mpm', 'mpn', 'mpo', 'mpp', 'mpq', 'mpr', 'mps', 'mpt', 'mpu', 'mpv', 'mpw', 'mpx', 'mpy', 'mpz', 'mqa', 'mqb', 'mqc', 'mqe', 'mqf', 'mqg', 'mqh', 'mqi', 'mqj', 'mqk', 'mql', 'mqm', 'mqn', 'mqo', 'mqp', 'mqq', 'mqr', 'mqs', 'mqt', 'mqu', 'mqv', 'mqw', 'mqx', 'mqy', 'mqz', 'mra', 'mrb', 'mrc', 'mrd', 'mre', 'mrf', 'mrg', 'mrh', 'mrj', 'mrk', 'mrl', 'mrm', 'mrn', 'mro', 'mrp', 'mrq', 'mrr', 'mrs', 'mrt', 'mru', 'mrv', 'mrw', 'mrx', 'mry', 'mrz', 'msb', 'msc', 'msd', 'mse', 'msf', 'msg', 'msh', 'msi', 'msj', 'msk', 'msl', 'msm', 'msn', 'mso', 'msp', 'msq', 'msr', 'mss', 'mst', 'msu', 'msv', 'msw', 'msx', 'msy', 'msz', 'mta', 'mtb', 'mtc', 'mtd', 'mte', 'mtf', 'mtg', 'mth', 'mti', 'mtj', 'mtk', 'mtl', 'mtm', 'mtn', 'mto', 'mtp', 'mtq', 'mtr', 'mts', 'mtt', 'mtu', 'mtv', 'mtw', 'mtx', 'mty', 'mua', 'mub', 'muc', 'mud', 'mue', 'mug', 'muh', 'mui', 'muj', 'muk', 'mul', 'mum', 'mun', 'muo', 'mup', 'muq', 'mur', 'mus', 'mut', 'muu', 'muv', 'mux', 'muy', 'muz', 'mva', 'mvb', 'mvd', 'mve', 'mvf', 'mvg', 'mvh', 'mvi', 'mvk', 'mvl', 'mvm', 'mvn', 'mvo', 'mvp', 'mvq', 'mvr', 'mvs', 'mvt', 'mvu', 'mvv', 'mvw', 'mvx', 'mvy', 'mvz', 'mwa', 'mwb', 'mwc', 'mwd', 'mwe', 'mwf', 'mwg', 'mwh', 'mwi', 'mwj', 'mwk', 'mwl', 'mwm', 'mwn', 'mwo', 'mwp', 'mwq', 'mwr', 'mws', 'mwt', 'mwu', 'mwv', 'mww', 'mwx', 'mwy', 'mwz', 'mxa', 'mxb', 'mxc', 'mxd', 'mxe', 'mxf', 'mxg', 'mxh', 'mxi', 'mxj', 'mxk', 'mxl', 'mxm', 'mxn', 'mxo', 'mxp', 'mxq', 'mxr', 'mxs', 'mxt', 'mxu', 'mxv', 'mxw', 'mxx', 'mxy', 'mxz', 'myb', 'myc', 'myd', 'mye', 'myf', 'myg', 'myh', 'myi', 'myj', 'myk', 'myl', 'mym', 'myn', 'myo', 'myp', 'myq', 'myr', 'mys', 'myt', 'myu', 'myv', 'myw', 'myx', 'myy', 'myz', 'mza', 'mzb', 'mzc', 'mzd', 'mze', 'mzg', 'mzh', 'mzi', 'mzj', 'mzk', 'mzl', 'mzm', 'mzn', 'mzo', 'mzp', 'mzq', 'mzr', 'mzs', 'mzt', 'mzu', 'mzv', 'mzw', 'mzx', 'mzy', 'mzz', 'naa', 'nab', 'nac', 'nad', 'nae', 'naf', 'nag', 'nah', 'nai', 'naj', 'nak', 'nal', 'nam', 'nan', 'nao', 'nap', 'naq', 'nar', 'nas', 'nat', 'naw', 'nax', 'nay', 'naz', 'nba', 'nbb', 'nbc', 'nbd', 'nbe', 'nbf', 'nbg', 'nbh', 'nbi', 'nbj', 'nbk', 'nbm', 'nbn', 'nbo', 'nbp', 'nbq', 'nbr', 'nbs', 'nbt', 'nbu', 'nbv', 'nbw', 'nbx', 'nby', 'nca', 'ncb', 'ncc', 'ncd', 'nce', 'ncf', 'ncg', 'nch', 'nci', 'ncj', 'nck', 'ncl', 'ncm', 'ncn', 'nco', 'ncp', 'ncq', 'ncr', 'ncs', 'nct', 'ncu', 'ncx', 'ncz', 'nda', 'ndb', 'ndc', 'ndd', 'ndf', 'ndg', 'ndh', 'ndi', 'ndj', 'ndk', 'ndl', 'ndm', 'ndn', 'ndp', 'ndq', 'ndr', 'nds', 'ndt', 'ndu', 'ndv', 'ndw', 'ndx', 'ndy', 'ndz', 'nea', 'neb', 'nec', 'ned', 'nee', 'nef', 'neg', 'neh', 'nei', 'nej', 'nek', 'nem', 'nen', 'neo', 'neq', 'ner', 'nes', 'net', 'neu', 'nev', 'new', 'nex', 'ney', 'nez', 'nfa', 'nfd', 'nfl', 'nfr', 'nfu', 'nga', 'ngb', 'ngc', 'ngd', 'nge', 'ngf', 'ngg', 'ngh', 'ngi', 'ngj', 'ngk', 'ngl', 'ngm', 'ngn', 'ngo', 'ngp', 'ngq', 'ngr', 'ngs', 'ngt', 'ngu', 'ngv', 'ngw', 'ngx', 'ngy', 'ngz', 'nha', 'nhb', 'nhc', 'nhd', 'nhe', 'nhf', 'nhg', 'nhh', 'nhi', 'nhk', 'nhm', 'nhn', 'nho', 'nhp', 'nhq', 'nhr', 'nht', 'nhu', 'nhv', 'nhw', 'nhx', 'nhy', 'nhz', 'nia', 'nib', 'nic', 'nid', 'nie', 'nif', 'nig', 'nih', 'nii', 'nij', 'nik', 'nil', 'nim', 'nin', 'nio', 'niq', 'nir', 'nis', 'nit', 'niu', 'niv', 'niw', 'nix', 'niy', 'niz', 'nja', 'njb', 'njd', 'njh', 'nji', 'njj', 'njl', 'njm', 'njn', 'njo', 'njr', 'njs', 'njt', 'nju', 'njx', 'njy', 'njz', 'nka', 'nkb', 'nkc', 'nkd', 'nke', 'nkf', 'nkg', 'nkh', 'nki', 'nkj', 'nkk', 'nkm', 'nkn', 'nko', 'nkp', 'nkq', 'nkr', 'nks', 'nkt', 'nku', 'nkv', 'nkw', 'nkx', 'nkz', 'nla', 'nlc', 'nle', 'nlg', 'nli', 'nlj', 'nlk', 'nll', 'nln', 'nlo', 'nlq', 'nlr', 'nlu', 'nlv', 'nlw', 'nlx', 'nly', 'nlz', 'nma', 'nmb', 'nmc', 'nmd', 'nme', 'nmf', 'nmg', 'nmh', 'nmi', 'nmj', 'nmk', 'nml', 'nmm', 'nmn', 'nmo', 'nmp', 'nmq', 'nmr', 'nms', 'nmt', 'nmu', 'nmv', 'nmw', 'nmx', 'nmy', 'nmz', 'nna', 'nnb', 'nnc', 'nnd', 'nne', 'nnf', 'nng', 'nnh', 'nni', 'nnj', 'nnk', 'nnl', 'nnm', 'nnn', 'nnp', 'nnq', 'nnr', 'nns', 'nnt', 'nnu', 'nnv', 'nnw', 'nnx', 'nny', 'nnz', 'noa', 'noc', 'nod', 'noe', 'nof', 'nog', 'noh', 'noi', 'noj', 'nok', 'nol', 'nom', 'non', 'noo', 'nop', 'noq', 'nos', 'not', 'nou', 'nov', 'now', 'noy', 'noz', 'npa', 'npb', 'npg', 'nph', 'npi', 'npl', 'npn', 'npo', 'nps', 'npu', 'npx', 'npy', 'nqg', 'nqk', 'nql', 'nqm', 'nqn', 'nqo', 'nqq', 'nqy', 'nra', 'nrb', 'nrc', 'nre', 'nrf', 'nrg', 'nri', 'nrk', 'nrl', 'nrm', 'nrn', 'nrp', 'nrr', 'nrt', 'nru', 'nrx', 'nrz', 'nsa', 'nsc', 'nsd', 'nse', 'nsf', 'nsg', 'nsh', 'nsi', 'nsk', 'nsl', 'nsm', 'nsn', 'nso', 'nsp', 'nsq', 'nsr', 'nss', 'nst', 'nsu', 'nsv', 'nsw', 'nsx', 'nsy', 'nsz', 'ntd', 'nte', 'ntg', 'nti', 'ntj', 'ntk', 'ntm', 'nto', 'ntp', 'ntr', 'nts', 'ntu', 'ntw', 'ntx', 'nty', 'ntz', 'nua', 'nub', 'nuc', 'nud', 'nue', 'nuf', 'nug', 'nuh', 'nui', 'nuj', 'nuk', 'nul', 'num', 'nun', 'nuo', 'nup', 'nuq', 'nur', 'nus', 'nut', 'nuu', 'nuv', 'nuw', 'nux', 'nuy', 'nuz', 'nvh', 'nvm', 'nvo', 'nwa', 'nwb', 'nwc', 'nwe', 'nwg', 'nwi', 'nwm', 'nwo', 'nwr', 'nwx', 'nwy', 'nxa', 'nxd', 'nxe', 'nxg', 'nxi', 'nxk', 'nxl', 'nxm', 'nxn', 'nxo', 'nxq', 'nxr', 'nxu', 'nxx', 'nyb', 'nyc', 'nyd', 'nye', 'nyf', 'nyg', 'nyh', 'nyi', 'nyj', 'nyk', 'nyl', 'nym', 'nyn', 'nyo', 'nyp', 'nyq', 'nyr', 'nys', 'nyt', 'nyu', 'nyv', 'nyw', 'nyx', 'nyy', 'nza', 'nzb', 'nzi', 'nzk', 'nzm', 'nzs', 'nzu', 'nzy', 'nzz', 'oaa', 'oac', 'oar', 'oav', 'obi', 'obk', 'obl', 'obm', 'obo', 'obr', 'obt', 'obu', 'oca', 'och', 'oco', 'ocu', 'oda', 'odk', 'odt', 'odu', 'ofo', 'ofs', 'ofu', 'ogb', 'ogc', 'oge', 'ogg', 'ogo', 'ogu', 'oht', 'ohu', 'oia', 'oin', 'ojb', 'ojc', 'ojg', 'ojp', 'ojs', 'ojv', 'ojw', 'oka', 'okb', 'okd', 'oke', 'okg', 'okh', 'oki', 'okj', 'okk', 'okl', 'okm', 'okn', 'oko', 'okr', 'oks', 'oku', 'okv', 'okx', 'ola', 'old', 'ole', 'olk', 'olm', 'olo', 'olr', 'olt', 'olu', 'oma', 'omb', 'omc', 'ome', 'omg', 'omi', 'omk', 'oml', 'omn', 'omo', 'omp', 'omq', 'omr', 'omt', 'omu', 'omv', 'omw', 'omx', 'ona', 'onb', 'one', 'ong', 'oni', 'onj', 'onk', 'onn', 'ono', 'onp', 'onr', 'ons', 'ont', 'onu', 'onw', 'onx', 'ood', 'oog', 'oon', 'oor', 'oos', 'opa', 'opk', 'opm', 'opo', 'opt', 'opy', 'ora', 'orc', 'ore', 'org', 'orh', 'orn', 'oro', 'orr', 'ors', 'ort', 'oru', 'orv', 'orw', 'orx', 'ory', 'orz', 'osa', 'osc', 'osi', 'oso', 'osp', 'ost', 'osu', 'osx', 'ota', 'otb', 'otd', 'ote', 'oti', 'otk', 'otl', 'otm', 'otn', 'oto', 'otq', 'otr', 'ots', 'ott', 'otu', 'otw', 'otx', 'oty', 'otz', 'oua', 'oub', 'oue', 'oui', 'oum', 'oun', 'ovd', 'owi', 'owl', 'oyb', 'oyd', 'oym', 'oyy', 'ozm', 'paa', 'pab', 'pac', 'pad', 'pae', 'paf', 'pag', 'pah', 'pai', 'pak', 'pal', 'pam', 'pao', 'pap', 'paq', 'par', 'pas', 'pat', 'pau', 'pav', 'paw', 'pax', 'pay', 'paz', 'pbb', 'pbc', 'pbe', 'pbf', 'pbg', 'pbh', 'pbi', 'pbl', 'pbn', 'pbo', 'pbp', 'pbr', 'pbs', 'pbt', 'pbu', 'pbv', 'pby', 'pbz', 'pca', 'pcb', 'pcc', 'pcd', 'pce', 'pcf', 'pcg', 'pch', 'pci', 'pcj', 'pck', 'pcl', 'pcm', 'pcn', 'pcp', 'pcr', 'pcw', 'pda', 'pdc', 'pdi', 'pdn', 'pdo', 'pdt', 'pdu', 'pea', 'peb', 'ped', 'pee', 'pef', 'peg', 'peh', 'pei', 'pej', 'pek', 'pel', 'pem', 'peo', 'pep', 'peq', 'pes', 'pev', 'pex', 'pey', 'pez', 'pfa', 'pfe', 'pfl', 'pga', 'pgd', 'pgg', 'pgi', 'pgk', 'pgl', 'pgn', 'pgs', 'pgu', 'pgy', 'pgz', 'pha', 'phd', 'phg', 'phh', 'phi', 'phk', 'phl', 'phm', 'phn', 'pho', 'phq', 'phr', 'pht', 'phu', 'phv', 'phw', 'pia', 'pib', 'pic', 'pid', 'pie', 'pif', 'pig', 'pih', 'pii', 'pij', 'pil', 'pim', 'pin', 'pio', 'pip', 'pir', 'pis', 'pit', 'piu', 'piv', 'piw', 'pix', 'piy', 'piz', 'pjt', 'pka', 'pkb', 'pkc', 'pkg', 'pkh', 'pkn', 'pko', 'pkp', 'pkr', 'pks', 'pkt', 'pku', 'pla', 'plb', 'plc', 'pld', 'ple', 'plf', 'plg', 'plh', 'plj', 'plk', 'pll', 'pln', 'plo', 'plp', 'plq', 'plr', 'pls', 'plt', 'plu', 'plv', 'plw', 'ply', 'plz', 'pma', 'pmb', 'pmc', 'pmd', 'pme', 'pmf', 'pmh', 'pmi', 'pmj', 'pmk', 'pml', 'pmm', 'pmn', 'pmo', 'pmq', 'pmr', 'pms', 'pmt', 'pmu', 'pmw', 'pmx', 'pmy', 'pmz', 'pna', 'pnb', 'pnc', 'pne', 'png', 'pnh', 'pni', 'pnj', 'pnk', 'pnl', 'pnm', 'pnn', 'pno', 'pnp', 'pnq', 'pnr', 'pns', 'pnt', 'pnu', 'pnv', 'pnw', 'pnx', 'pny', 'pnz', 'poc', 'pod', 'poe', 'pof', 'pog', 'poh', 'poi', 'pok', 'pom', 'pon', 'poo', 'pop', 'poq', 'pos', 'pot', 'pov', 'pow', 'pox', 'poy', 'poz', 'ppa', 'ppe', 'ppi', 'ppk', 'ppl', 'ppm', 'ppn', 'ppo', 'ppp', 'ppq', 'ppr', 'pps', 'ppt', 'ppu', 'pqa', 'pqe', 'pqm', 'pqw', 'pra', 'prb', 'prc', 'prd', 'pre', 'prf', 'prg', 'prh', 'pri', 'prk', 'prl', 'prm', 'prn', 'pro', 'prp', 'prq', 'prr', 'prs', 'prt', 'pru', 'prw', 'prx', 'pry', 'prz', 'psa', 'psc', 'psd', 'pse', 'psg', 'psh', 'psi', 'psl', 'psm', 'psn', 'pso', 'psp', 'psq', 'psr', 'pss', 'pst', 'psu', 'psw', 'psy', 'pta', 'pth', 'pti', 'ptn', 'pto', 'ptp', 'ptq', 'ptr', 'ptt', 'ptu', 'ptv', 'ptw', 'pty', 'pua', 'pub', 'puc', 'pud', 'pue', 'puf', 'pug', 'pui', 'puj', 'puk', 'pum', 'puo', 'pup', 'puq', 'pur', 'put', 'puu', 'puw', 'pux', 'puy', 'puz', 'pwa', 'pwb', 'pwg', 'pwi', 'pwm', 'pwn', 'pwo', 'pwr', 'pww', 'pxm', 'pye', 'pym', 'pyn', 'pys', 'pyu', 'pyx', 'pyy', 'pzn', 'qaa..qtz', 'qua', 'qub', 'quc', 'qud', 'quf', 'qug', 'quh', 'qui', 'quk', 'qul', 'qum', 'qun', 'qup', 'quq', 'qur', 'qus', 'quv', 'quw', 'qux', 'quy', 'quz', 'qva', 'qvc', 'qve', 'qvh', 'qvi', 'qvj', 'qvl', 'qvm', 'qvn', 'qvo', 'qvp', 'qvs', 'qvw', 'qvy', 'qvz', 'qwa', 'qwc', 'qwe', 'qwh', 'qwm', 'qws', 'qwt', 'qxa', 'qxc', 'qxh', 'qxl', 'qxn', 'qxo', 'qxp', 'qxq', 'qxr', 'qxs', 'qxt', 'qxu', 'qxw', 'qya', 'qyp', 'raa', 'rab', 'rac', 'rad', 'raf', 'rag', 'rah', 'rai', 'raj', 'rak', 'ral', 'ram', 'ran', 'rao', 'rap', 'raq', 'rar', 'ras', 'rat', 'rau', 'rav', 'raw', 'rax', 'ray', 'raz', 'rbb', 'rbk', 'rbl', 'rbp', 'rcf', 'rdb', 'rea', 'reb', 'ree', 'reg', 'rei', 'rej', 'rel', 'rem', 'ren', 'rer', 'res', 'ret', 'rey', 'rga', 'rge', 'rgk', 'rgn', 'rgr', 'rgs', 'rgu', 'rhg', 'rhp', 'ria', 'rie', 'rif', 'ril', 'rim', 'rin', 'rir', 'rit', 'riu', 'rjg', 'rji', 'rjs', 'rka', 'rkb', 'rkh', 'rki', 'rkm', 'rkt', 'rkw', 'rma', 'rmb', 'rmc', 'rmd', 'rme', 'rmf', 'rmg', 'rmh', 'rmi', 'rmk', 'rml', 'rmm', 'rmn', 'rmo', 'rmp', 'rmq', 'rmr', 'rms', 'rmt', 'rmu', 'rmv', 'rmw', 'rmx', 'rmy', 'rmz', 'rna', 'rnd', 'rng', 'rnl', 'rnn', 'rnp', 'rnr', 'rnw', 'roa', 'rob', 'roc', 'rod', 'roe', 'rof', 'rog', 'rol', 'rom', 'roo', 'rop', 'ror', 'rou', 'row', 'rpn', 'rpt', 'rri', 'rro', 'rrt', 'rsb', 'rsi', 'rsl', 'rsm', 'rtc', 'rth', 'rtm', 'rts', 'rtw', 'rub', 'ruc', 'rue', 'ruf', 'rug', 'ruh', 'rui', 'ruk', 'ruo', 'rup', 'ruq', 'rut', 'ruu', 'ruy', 'ruz', 'rwa', 'rwk', 'rwm', 'rwo', 'rwr', 'rxd', 'rxw', 'ryn', 'rys', 'ryu', 'rzh', 'saa', 'sab', 'sac', 'sad', 'sae', 'saf', 'sah', 'sai', 'saj', 'sak', 'sal', 'sam', 'sao', 'sap', 'saq', 'sar', 'sas', 'sat', 'sau', 'sav', 'saw', 'sax', 'say', 'saz', 'sba', 'sbb', 'sbc', 'sbd', 'sbe', 'sbf', 'sbg', 'sbh', 'sbi', 'sbj', 'sbk', 'sbl', 'sbm', 'sbn', 'sbo', 'sbp', 'sbq', 'sbr', 'sbs', 'sbt', 'sbu', 'sbv', 'sbw', 'sbx', 'sby', 'sbz', 'sca', 'scb', 'sce', 'scf', 'scg', 'sch', 'sci', 'sck', 'scl', 'scn', 'sco', 'scp', 'scq', 'scs', 'sct', 'scu', 'scv', 'scw', 'scx', 'sda', 'sdb', 'sdc', 'sde', 'sdf', 'sdg', 'sdh', 'sdj', 'sdk', 'sdl', 'sdm', 'sdn', 'sdo', 'sdp', 'sdr', 'sds', 'sdt', 'sdu', 'sdv', 'sdx', 'sdz', 'sea', 'seb', 'sec', 'sed', 'see', 'sef', 'seg', 'seh', 'sei', 'sej', 'sek', 'sel', 'sem', 'sen', 'seo', 'sep', 'seq', 'ser', 'ses', 'set', 'seu', 'sev', 'sew', 'sey', 'sez', 'sfb', 'sfe', 'sfm', 'sfs', 'sfw', 'sga', 'sgb', 'sgc', 'sgd', 'sge', 'sgg', 'sgh', 'sgi', 'sgj', 'sgk', 'sgl', 'sgm', 'sgn', 'sgo', 'sgp', 'sgr', 'sgs', 'sgt', 'sgu', 'sgw', 'sgx', 'sgy', 'sgz', 'sha', 'shb', 'shc', 'shd', 'she', 'shg', 'shh', 'shi', 'shj', 'shk', 'shl', 'shm', 'shn', 'sho', 'shp', 'shq', 'shr', 'shs', 'sht', 'shu', 'shv', 'shw', 'shx', 'shy', 'shz', 'sia', 'sib', 'sid', 'sie', 'sif', 'sig', 'sih', 'sii', 'sij', 'sik', 'sil', 'sim', 'sio', 'sip', 'siq', 'sir', 'sis', 'sit', 'siu', 'siv', 'siw', 'six', 'siy', 'siz', 'sja', 'sjb', 'sjd', 'sje', 'sjg', 'sjk', 'sjl', 'sjm', 'sjn', 'sjo', 'sjp', 'sjr', 'sjs', 'sjt', 'sju', 'sjw', 'ska', 'skb', 'skc', 'skd', 'ske', 'skf', 'skg', 'skh', 'ski', 'skj', 'skk', 'skm', 'skn', 'sko', 'skp', 'skq', 'skr', 'sks', 'skt', 'sku', 'skv', 'skw', 'skx', 'sky', 'skz', 'sla', 'slc', 'sld', 'sle', 'slf', 'slg', 'slh', 'sli', 'slj', 'sll', 'slm', 'sln', 'slp', 'slq', 'slr', 'sls', 'slt', 'slu', 'slw', 'slx', 'sly', 'slz', 'sma', 'smb', 'smc', 'smd', 'smf', 'smg', 'smh', 'smi', 'smj', 'smk', 'sml', 'smm', 'smn', 'smp', 'smq', 'smr', 'sms', 'smt', 'smu', 'smv', 'smw', 'smx', 'smy', 'smz', 'snb', 'snc', 'sne', 'snf', 'sng', 'snh', 'sni', 'snj', 'snk', 'snl', 'snm', 'snn', 'sno', 'snp', 'snq', 'snr', 'sns', 'snu', 'snv', 'snw', 'snx', 'sny', 'snz', 'soa', 'sob', 'soc', 'sod', 'soe', 'sog', 'soh', 'soi', 'soj', 'sok', 'sol', 'son', 'soo', 'sop', 'soq', 'sor', 'sos', 'sou', 'sov', 'sow', 'sox', 'soy', 'soz', 'spb', 'spc', 'spd', 'spe', 'spg', 'spi', 'spk', 'spl', 'spm', 'spn', 'spo', 'spp', 'spq', 'spr', 'sps', 'spt', 'spu', 'spv', 'spx', 'spy', 'sqa', 'sqh', 'sqj', 'sqk', 'sqm', 'sqn', 'sqo', 'sqq', 'sqr', 'sqs', 'sqt', 'squ', 'sra', 'srb', 'src', 'sre', 'srf', 'srg', 'srh', 'sri', 'srk', 'srl', 'srm', 'srn', 'sro', 'srq', 'srr', 'srs', 'srt', 'sru', 'srv', 'srw', 'srx', 'sry', 'srz', 'ssa', 'ssb', 'ssc', 'ssd', 'sse', 'ssf', 'ssg', 'ssh', 'ssi', 'ssj', 'ssk', 'ssl', 'ssm', 'ssn', 'sso', 'ssp', 'ssq', 'ssr', 'sss', 'sst', 'ssu', 'ssv', 'ssx', 'ssy', 'ssz', 'sta', 'stb', 'std', 'ste', 'stf', 'stg', 'sth', 'sti', 'stj', 'stk', 'stl', 'stm', 'stn', 'sto', 'stp', 'stq', 'str', 'sts', 'stt', 'stu', 'stv', 'stw', 'sty', 'sua', 'sub', 'suc', 'sue', 'sug', 'sui', 'suj', 'suk', 'sul', 'sum', 'suq', 'sur', 'sus', 'sut', 'suv', 'suw', 'sux', 'suy', 'suz', 'sva', 'svb', 'svc', 'sve', 'svk', 'svm', 'svr', 'svs', 'svx', 'swb', 'swc', 'swf', 'swg', 'swh', 'swi', 'swj', 'swk', 'swl', 'swm', 'swn', 'swo', 'swp', 'swq', 'swr', 'sws', 'swt', 'swu', 'swv', 'sww', 'swx', 'swy', 'sxb', 'sxc', 'sxe', 'sxg', 'sxk', 'sxl', 'sxm', 'sxn', 'sxo', 'sxr', 'sxs', 'sxu', 'sxw', 'sya', 'syb', 'syc', 'syd', 'syi', 'syk', 'syl', 'sym', 'syn', 'syo', 'syr', 'sys', 'syw', 'syx', 'syy', 'sza', 'szb', 'szc', 'szd', 'sze', 'szg', 'szl', 'szn', 'szp', 'szs', 'szv', 'szw', 'taa', 'tab', 'tac', 'tad', 'tae', 'taf', 'tag', 'tai', 'taj', 'tak', 'tal', 'tan', 'tao', 'tap', 'taq', 'tar', 'tas', 'tau', 'tav', 'taw', 'tax', 'tay', 'taz', 'tba', 'tbb', 'tbc', 'tbd', 'tbe', 'tbf', 'tbg', 'tbh', 'tbi', 'tbj', 'tbk', 'tbl', 'tbm', 'tbn', 'tbo', 'tbp', 'tbq', 'tbr', 'tbs', 'tbt', 'tbu', 'tbv', 'tbw', 'tbx', 'tby', 'tbz', 'tca', 'tcb', 'tcc', 'tcd', 'tce', 'tcf', 'tcg', 'tch', 'tci', 'tck', 'tcl', 'tcm', 'tcn', 'tco', 'tcp', 'tcq', 'tcs', 'tct', 'tcu', 'tcw', 'tcx', 'tcy', 'tcz', 'tda', 'tdb', 'tdc', 'tdd', 'tde', 'tdf', 'tdg', 'tdh', 'tdi', 'tdj', 'tdk', 'tdl', 'tdm', 'tdn', 'tdo', 'tdq', 'tdr', 'tds', 'tdt', 'tdu', 'tdv', 'tdx', 'tdy', 'tea', 'teb', 'tec', 'ted', 'tee', 'tef', 'teg', 'teh', 'tei', 'tek', 'tem', 'ten', 'teo', 'tep', 'teq', 'ter', 'tes', 'tet', 'teu', 'tev', 'tew', 'tex', 'tey', 'tfi', 'tfn', 'tfo', 'tfr', 'tft', 'tga', 'tgb', 'tgc', 'tgd', 'tge', 'tgf', 'tgg', 'tgh', 'tgi', 'tgj', 'tgn', 'tgo', 'tgp', 'tgq', 'tgr', 'tgs', 'tgt', 'tgu', 'tgv', 'tgw', 'tgx', 'tgy', 'tgz', 'thc', 'thd', 'the', 'thf', 'thh', 'thi', 'thk', 'thl', 'thm', 'thn', 'thp', 'thq', 'thr', 'ths', 'tht', 'thu', 'thv', 'thw', 'thx', 'thy', 'thz', 'tia', 'tic', 'tid', 'tie', 'tif', 'tig', 'tih', 'tii', 'tij', 'tik', 'til', 'tim', 'tin', 'tio', 'tip', 'tiq', 'tis', 'tit', 'tiu', 'tiv', 'tiw', 'tix', 'tiy', 'tiz', 'tja', 'tjg', 'tji', 'tjl', 'tjm', 'tjn', 'tjo', 'tjs', 'tju', 'tjw', 'tka', 'tkb', 'tkd', 'tke', 'tkf', 'tkg', 'tkk', 'tkl', 'tkm', 'tkn', 'tkp', 'tkq', 'tkr', 'tks', 'tkt', 'tku', 'tkv', 'tkw', 'tkx', 'tkz', 'tla', 'tlb', 'tlc', 'tld', 'tlf', 'tlg', 'tlh', 'tli', 'tlj', 'tlk', 'tll', 'tlm', 'tln', 'tlo', 'tlp', 'tlq', 'tlr', 'tls', 'tlt', 'tlu', 'tlv', 'tlw', 'tlx', 'tly', 'tma', 'tmb', 'tmc', 'tmd', 'tme', 'tmf', 'tmg', 'tmh', 'tmi', 'tmj', 'tmk', 'tml', 'tmm', 'tmn', 'tmo', 'tmp', 'tmq', 'tmr', 'tms', 'tmt', 'tmu', 'tmv', 'tmw', 'tmy', 'tmz', 'tna', 'tnb', 'tnc', 'tnd', 'tne', 'tnf', 'tng', 'tnh', 'tni', 'tnk', 'tnl', 'tnm', 'tnn', 'tno', 'tnp', 'tnq', 'tnr', 'tns', 'tnt', 'tnu', 'tnv', 'tnw', 'tnx', 'tny', 'tnz', 'tob', 'toc', 'tod', 'toe', 'tof', 'tog', 'toh', 'toi', 'toj', 'tol', 'tom', 'too', 'top', 'toq', 'tor', 'tos', 'tou', 'tov', 'tow', 'tox', 'toy', 'toz', 'tpa', 'tpc', 'tpe', 'tpf', 'tpg', 'tpi', 'tpj', 'tpk', 'tpl', 'tpm', 'tpn', 'tpo', 'tpp', 'tpq', 'tpr', 'tpt', 'tpu', 'tpv', 'tpw', 'tpx', 'tpy', 'tpz', 'tqb', 'tql', 'tqm', 'tqn', 'tqo', 'tqp', 'tqq', 'tqr', 'tqt', 'tqu', 'tqw', 'tra', 'trb', 'trc', 'trd', 'tre', 'trf', 'trg', 'trh', 'tri', 'trj', 'trk', 'trl', 'trm', 'trn', 'tro', 'trp', 'trq', 'trr', 'trs', 'trt', 'tru', 'trv', 'trw', 'trx', 'try', 'trz', 'tsa', 'tsb', 'tsc', 'tsd', 'tse', 'tsf', 'tsg', 'tsh', 'tsi', 'tsj', 'tsk', 'tsl', 'tsm', 'tsp', 'tsq', 'tsr', 'tss', 'tst', 'tsu', 'tsv', 'tsw', 'tsx', 'tsy', 'tsz', 'tta', 'ttb', 'ttc', 'ttd', 'tte', 'ttf', 'ttg', 'tth', 'tti', 'ttj', 'ttk', 'ttl', 'ttm', 'ttn', 'tto', 'ttp', 'ttq', 'ttr', 'tts', 'ttt', 'ttu', 'ttv', 'ttw', 'tty', 'ttz', 'tua', 'tub', 'tuc', 'tud', 'tue', 'tuf', 'tug', 'tuh', 'tui', 'tuj', 'tul', 'tum', 'tun', 'tuo', 'tup', 'tuq', 'tus', 'tut', 'tuu', 'tuv', 'tuw', 'tux', 'tuy', 'tuz', 'tva', 'tvd', 'tve', 'tvk', 'tvl', 'tvm', 'tvn', 'tvo', 'tvs', 'tvt', 'tvu', 'tvw', 'tvy', 'twa', 'twb', 'twc', 'twd', 'twe', 'twf', 'twg', 'twh', 'twl', 'twm', 'twn', 'two', 'twp', 'twq', 'twr', 'twt', 'twu', 'tww', 'twx', 'twy', 'txa', 'txb', 'txc', 'txe', 'txg', 'txh', 'txi', 'txj', 'txm', 'txn', 'txo', 'txq', 'txr', 'txs', 'txt', 'txu', 'txx', 'txy', 'tya', 'tye', 'tyh', 'tyi', 'tyj', 'tyl', 'tyn', 'typ', 'tyr', 'tys', 'tyt', 'tyu', 'tyv', 'tyx', 'tyz', 'tza', 'tzh', 'tzj', 'tzl', 'tzm', 'tzn', 'tzo', 'tzx', 'uam', 'uan', 'uar', 'uba', 'ubi', 'ubl', 'ubr', 'ubu', 'uby', 'uda', 'ude', 'udg', 'udi', 'udj', 'udl', 'udm', 'udu', 'ues', 'ufi', 'uga', 'ugb', 'uge', 'ugn', 'ugo', 'ugy', 'uha', 'uhn', 'uis', 'uiv', 'uji', 'uka', 'ukg', 'ukh', 'ukk', 'ukl', 'ukp', 'ukq', 'uks', 'uku', 'ukw', 'uky', 'ula', 'ulb', 'ulc', 'ule', 'ulf', 'uli', 'ulk', 'ull', 'ulm', 'uln', 'ulu', 'ulw', 'uma', 'umb', 'umc', 'umd', 'umg', 'umi', 'umm', 'umn', 'umo', 'ump', 'umr', 'ums', 'umu', 'una', 'und', 'une', 'ung', 'unk', 'unm', 'unn', 'unp', 'unr', 'unu', 'unx', 'unz', 'uok', 'upi', 'upv', 'ura', 'urb', 'urc', 'ure', 'urf', 'urg', 'urh', 'uri', 'urj', 'urk', 'url', 'urm', 'urn', 'uro', 'urp', 'urr', 'urt', 'uru', 'urv', 'urw', 'urx', 'ury', 'urz', 'usa', 'ush', 'usi', 'usk', 'usp', 'usu', 'uta', 'ute', 'utp', 'utr', 'utu', 'uum', 'uun', 'uur', 'uuu', 'uve', 'uvh', 'uvl', 'uwa', 'uya', 'uzn', 'uzs', 'vaa', 'vae', 'vaf', 'vag', 'vah', 'vai', 'vaj', 'val', 'vam', 'van', 'vao', 'vap', 'var', 'vas', 'vau', 'vav', 'vay', 'vbb', 'vbk', 'vec', 'ved', 'vel', 'vem', 'veo', 'vep', 'ver', 'vgr', 'vgt', 'vic', 'vid', 'vif', 'vig', 'vil', 'vin', 'vis', 'vit', 'viv', 'vka', 'vki', 'vkj', 'vkk', 'vkl', 'vkm', 'vko', 'vkp', 'vkt', 'vku', 'vlp', 'vls', 'vma', 'vmb', 'vmc', 'vmd', 'vme', 'vmf', 'vmg', 'vmh', 'vmi', 'vmj', 'vmk', 'vml', 'vmm', 'vmp', 'vmq', 'vmr', 'vms', 'vmu', 'vmv', 'vmw', 'vmx', 'vmy', 'vmz', 'vnk', 'vnm', 'vnp', 'vor', 'vot', 'vra', 'vro', 'vrs', 'vrt', 'vsi', 'vsl', 'vsv', 'vto', 'vum', 'vun', 'vut', 'vwa', 'waa', 'wab', 'wac', 'wad', 'wae', 'waf', 'wag', 'wah', 'wai', 'waj', 'wak', 'wal', 'wam', 'wan', 'wao', 'wap', 'waq', 'war', 'was', 'wat', 'wau', 'wav', 'waw', 'wax', 'way', 'waz', 'wba', 'wbb', 'wbe', 'wbf', 'wbh', 'wbi', 'wbj', 'wbk', 'wbl', 'wbm', 'wbp', 'wbq', 'wbr', 'wbs', 'wbt', 'wbv', 'wbw', 'wca', 'wci', 'wdd', 'wdg', 'wdj', 'wdk', 'wdu', 'wdy', 'wea', 'wec', 'wed', 'weg', 'weh', 'wei', 'wem', 'wen', 'weo', 'wep', 'wer', 'wes', 'wet', 'weu', 'wew', 'wfg', 'wga', 'wgb', 'wgg', 'wgi', 'wgo', 'wgu', 'wgw', 'wgy', 'wha', 'whg', 'whk', 'whu', 'wib', 'wic', 'wie', 'wif', 'wig', 'wih', 'wii', 'wij', 'wik', 'wil', 'wim', 'win', 'wir', 'wit', 'wiu', 'wiv', 'wiw', 'wiy', 'wja', 'wji', 'wka', 'wkb', 'wkd', 'wkl', 'wku', 'wkw', 'wky', 'wla', 'wlc', 'wle', 'wlg', 'wli', 'wlk', 'wll', 'wlm', 'wlo', 'wlr', 'wls', 'wlu', 'wlv', 'wlw', 'wlx', 'wly', 'wma', 'wmb', 'wmc', 'wmd', 'wme', 'wmh', 'wmi', 'wmm', 'wmn', 'wmo', 'wms', 'wmt', 'wmw', 'wmx', 'wnb', 'wnc', 'wnd', 'wne', 'wng', 'wni', 'wnk', 'wnm', 'wnn', 'wno', 'wnp', 'wnu', 'wnw', 'wny', 'woa', 'wob', 'woc', 'wod', 'woe', 'wof', 'wog', 'woi', 'wok', 'wom', 'won', 'woo', 'wor', 'wos', 'wow', 'woy', 'wpc', 'wra', 'wrb', 'wrd', 'wrg', 'wrh', 'wri', 'wrk', 'wrl', 'wrm', 'wrn', 'wro', 'wrp', 'wrr', 'wrs', 'wru', 'wrv', 'wrw', 'wrx', 'wry', 'wrz', 'wsa', 'wsg', 'wsi', 'wsk', 'wsr', 'wss', 'wsu', 'wsv', 'wtf', 'wth', 'wti', 'wtk', 'wtm', 'wtw', 'wua', 'wub', 'wud', 'wuh', 'wul', 'wum', 'wun', 'wur', 'wut', 'wuu', 'wuv', 'wux', 'wuy', 'wwa', 'wwb', 'wwo', 'wwr', 'www', 'wxa', 'wxw', 'wya', 'wyb', 'wyi', 'wym', 'wyr', 'wyy', 'xaa', 'xab', 'xac', 'xad', 'xae', 'xag', 'xai', 'xaj', 'xak', 'xal', 'xam', 'xan', 'xao', 'xap', 'xaq', 'xar', 'xas', 'xat', 'xau', 'xav', 'xaw', 'xay', 'xba', 'xbb', 'xbc', 'xbd', 'xbe', 'xbg', 'xbi', 'xbj', 'xbm', 'xbn', 'xbo', 'xbp', 'xbr', 'xbw', 'xbx', 'xby', 'xcb', 'xcc', 'xce', 'xcg', 'xch', 'xcl', 'xcm', 'xcn', 'xco', 'xcr', 'xct', 'xcu', 'xcv', 'xcw', 'xcy', 'xda', 'xdc', 'xdk', 'xdm', 'xdo', 'xdy', 'xeb', 'xed', 'xeg', 'xel', 'xem', 'xep', 'xer', 'xes', 'xet', 'xeu', 'xfa', 'xga', 'xgb', 'xgd', 'xgf', 'xgg', 'xgi', 'xgl', 'xgm', 'xgn', 'xgr', 'xgu', 'xgw', 'xha', 'xhc', 'xhd', 'xhe', 'xhr', 'xht', 'xhu', 'xhv', 'xia', 'xib', 'xii', 'xil', 'xin', 'xip', 'xir', 'xis', 'xiv', 'xiy', 'xjb', 'xjt', 'xka', 'xkb', 'xkc', 'xkd', 'xke', 'xkf', 'xkg', 'xkh', 'xki', 'xkj', 'xkk', 'xkl', 'xkn', 'xko', 'xkp', 'xkq', 'xkr', 'xks', 'xkt', 'xku', 'xkv', 'xkw', 'xkx', 'xky', 'xkz', 'xla', 'xlb', 'xlc', 'xld', 'xle', 'xlg', 'xli', 'xln', 'xlo', 'xlp', 'xls', 'xlu', 'xly', 'xma', 'xmb', 'xmc', 'xmd', 'xme', 'xmf', 'xmg', 'xmh', 'xmj', 'xmk', 'xml', 'xmm', 'xmn', 'xmo', 'xmp', 'xmq', 'xmr', 'xms', 'xmt', 'xmu', 'xmv', 'xmw', 'xmx', 'xmy', 'xmz', 'xna', 'xnb', 'xnd', 'xng', 'xnh', 'xni', 'xnk', 'xnn', 'xno', 'xnr', 'xns', 'xnt', 'xnu', 'xny', 'xnz', 'xoc', 'xod', 'xog', 'xoi', 'xok', 'xom', 'xon', 'xoo', 'xop', 'xor', 'xow', 'xpa', 'xpc', 'xpe', 'xpg', 'xpi', 'xpj', 'xpk', 'xpm', 'xpn', 'xpo', 'xpp', 'xpq', 'xpr', 'xps', 'xpt', 'xpu', 'xpy', 'xqa', 'xqt', 'xra', 'xrb', 'xrd', 'xre', 'xrg', 'xri', 'xrm', 'xrn', 'xrq', 'xrr', 'xrt', 'xru', 'xrw', 'xsa', 'xsb', 'xsc', 'xsd', 'xse', 'xsh', 'xsi', 'xsj', 'xsl', 'xsm', 'xsn', 'xso', 'xsp', 'xsq', 'xsr', 'xss', 'xsu', 'xsv', 'xsy', 'xta', 'xtb', 'xtc', 'xtd', 'xte', 'xtg', 'xth', 'xti', 'xtj', 'xtl', 'xtm', 'xtn', 'xto', 'xtp', 'xtq', 'xtr', 'xts', 'xtt', 'xtu', 'xtv', 'xtw', 'xty', 'xtz', 'xua', 'xub', 'xud', 'xug', 'xuj', 'xul', 'xum', 'xun', 'xuo', 'xup', 'xur', 'xut', 'xuu', 'xve', 'xvi', 'xvn', 'xvo', 'xvs', 'xwa', 'xwc', 'xwd', 'xwe', 'xwg', 'xwj', 'xwk', 'xwl', 'xwo', 'xwr', 'xwt', 'xww', 'xxb', 'xxk', 'xxm', 'xxr', 'xxt', 'xya', 'xyb', 'xyj', 'xyk', 'xyl', 'xyt', 'xyy', 'xzh', 'xzm', 'xzp', 'yaa', 'yab', 'yac', 'yad', 'yae', 'yaf', 'yag', 'yah', 'yai', 'yaj', 'yak', 'yal', 'yam', 'yan', 'yao', 'yap', 'yaq', 'yar', 'yas', 'yat', 'yau', 'yav', 'yaw', 'yax', 'yay', 'yaz', 'yba', 'ybb', 'ybd', 'ybe', 'ybh', 'ybi', 'ybj', 'ybk', 'ybl', 'ybm', 'ybn', 'ybo', 'ybx', 'yby', 'ych', 'ycl', 'ycn', 'ycp', 'yda', 'ydd', 'yde', 'ydg', 'ydk', 'yds', 'yea', 'yec', 'yee', 'yei', 'yej', 'yel', 'yen', 'yer', 'yes', 'yet', 'yeu', 'yev', 'yey', 'yga', 'ygi', 'ygl', 'ygm', 'ygp', 'ygr', 'ygs', 'ygu', 'ygw', 'yha', 'yhd', 'yhl', 'yhs', 'yia', 'yif', 'yig', 'yih', 'yii', 'yij', 'yik', 'yil', 'yim', 'yin', 'yip', 'yiq', 'yir', 'yis', 'yit', 'yiu', 'yiv', 'yix', 'yiy', 'yiz', 'yka', 'ykg', 'yki', 'ykk', 'ykl', 'ykm', 'ykn', 'yko', 'ykr', 'ykt', 'yku', 'yky', 'yla', 'ylb', 'yle', 'ylg', 'yli', 'yll', 'ylm', 'yln', 'ylo', 'ylr', 'ylu', 'yly', 'yma', 'ymb', 'ymc', 'ymd', 'yme', 'ymg', 'ymh', 'ymi', 'ymk', 'yml', 'ymm', 'ymn', 'ymo', 'ymp', 'ymq', 'ymr', 'yms', 'ymt', 'ymx', 'ymz', 'yna', 'ynd', 'yne', 'yng', 'ynh', 'ynk', 'ynl', 'ynn', 'yno', 'ynq', 'yns', 'ynu', 'yob', 'yog', 'yoi', 'yok', 'yol', 'yom', 'yon', 'yos', 'yot', 'yox', 'yoy', 'ypa', 'ypb', 'ypg', 'yph', 'ypk', 'ypm', 'ypn', 'ypo', 'ypp', 'ypz', 'yra', 'yrb', 'yre', 'yri', 'yrk', 'yrl', 'yrm', 'yrn', 'yro', 'yrs', 'yrw', 'yry', 'ysc', 'ysd', 'ysg', 'ysl', 'ysn', 'yso', 'ysp', 'ysr', 'yss', 'ysy', 'yta', 'ytl', 'ytp', 'ytw', 'yty', 'yua', 'yub', 'yuc', 'yud', 'yue', 'yuf', 'yug', 'yui', 'yuj', 'yuk', 'yul', 'yum', 'yun', 'yup', 'yuq', 'yur', 'yut', 'yuu', 'yuw', 'yux', 'yuy', 'yuz', 'yva', 'yvt', 'ywa', 'ywg', 'ywl', 'ywn', 'ywq', 'ywr', 'ywt', 'ywu', 'yww', 'yxa', 'yxg', 'yxl', 'yxm', 'yxu', 'yxy', 'yyr', 'yyu', 'yyz', 'yzg', 'yzk', 'zaa', 'zab', 'zac', 'zad', 'zae', 'zaf', 'zag', 'zah', 'zai', 'zaj', 'zak', 'zal', 'zam', 'zao', 'zap', 'zaq', 'zar', 'zas', 'zat', 'zau', 'zav', 'zaw', 'zax', 'zay', 'zaz', 'zbc', 'zbe', 'zbl', 'zbt', 'zbw', 'zca', 'zch', 'zdj', 'zea', 'zeg', 'zeh', 'zen', 'zga', 'zgb', 'zgh', 'zgm', 'zgn', 'zgr', 'zhb', 'zhd', 'zhi', 'zhn', 'zhw', 'zhx', 'zia', 'zib', 'zik', 'zil', 'zim', 'zin', 'zir', 'ziw', 'ziz', 'zka', 'zkb', 'zkd', 'zkg', 'zkh', 'zkk', 'zkn', 'zko', 'zkp', 'zkr', 'zkt', 'zku', 'zkv', 'zkz', 'zle', 'zlj', 'zlm', 'zln', 'zlq', 'zls', 'zlw', 'zma', 'zmb', 'zmc', 'zmd', 'zme', 'zmf', 'zmg', 'zmh', 'zmi', 'zmj', 'zmk', 'zml', 'zmm', 'zmn', 'zmo', 'zmp', 'zmq', 'zmr', 'zms', 'zmt', 'zmu', 'zmv', 'zmw', 'zmx', 'zmy', 'zmz', 'zna', 'znd', 'zne', 'zng', 'znk', 'zns', 'zoc', 'zoh', 'zom', 'zoo', 'zoq', 'zor', 'zos', 'zpa', 'zpb', 'zpc', 'zpd', 'zpe', 'zpf', 'zpg', 'zph', 'zpi', 'zpj', 'zpk', 'zpl', 'zpm', 'zpn', 'zpo', 'zpp', 'zpq', 'zpr', 'zps', 'zpt', 'zpu', 'zpv', 'zpw', 'zpx', 'zpy', 'zpz', 'zqe', 'zra', 'zrg', 'zrn', 'zro', 'zrp', 'zrs', 'zsa', 'zsk', 'zsl', 'zsm', 'zsr', 'zsu', 'zte', 'ztg', 'ztl', 'ztm', 'ztn', 'ztp', 'ztq', 'zts', 'ztt', 'ztu', 'ztx', 'zty', 'zua', 'zuh', 'zum', 'zun', 'zuy', 'zwa', 'zxx', 'zyb', 'zyg', 'zyj', 'zyn', 'zyp', 'zza', 'zzj' ]; + axe.utils.validLangs = function() { + 'use strict'; + return langs; + }; + return commons; + }() + }); +})(typeof window === 'object' ? window : this); \ No newline at end of file
diff --git a/third_party/axe-core/axe.min.js b/third_party/axe-core/axe.min.js new file mode 100644 index 0000000..1cb6219 --- /dev/null +++ b/third_party/axe-core/axe.min.js
@@ -0,0 +1,42 @@ +/*! aXe v2.3.1 + * Copyright (c) 2017 Deque Systems, Inc. + * + * Your use of this Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This entire copyright notice must appear in every copy of this file you + * distribute or in any file that contains substantial portions of this source + * code. + */ +!function a(window){function b(a){this.name="SupportError",this.cause=a.cause,this.message="`"+a.cause+"` - feature unsupported in your environment.",a.ruleId&&(this.ruleId=a.ruleId,this.message+=" Skipping "+this.ruleId+" rule."),this.stack=(new Error).stack}function c(a){"use strict";var b;return a?(b=axe.utils.clone(a),b.commons=a.commons):b={},b.reporter=b.reporter||null,b.rules=b.rules||[],b.checks=b.checks||[],b.data=Object.assign({checks:{},rules:{}},b.data),b}function d(a,b,c){"use strict";var d,e;for(d=0,e=a.length;d<e;d++)b[c](a[d])}function e(a){this.brand="axe",this.application="axeAPI",this.tagExclude=["experimental"],this.defaultConfig=a,this._init()}function f(a,b,c){var d=a.brand,e=a.application;return axe.constants.helpUrlBase+d+"/"+(c||axe.version.substring(0,axe.version.lastIndexOf(".")))+"/"+b+"?application="+e}function g(a){"use strict";this.id=a.id,this.data=null,this.relatedNodes=[],this.result=null}function h(a){"use strict";return"string"==typeof a?new Function("return "+a+";")():a}function i(a){a&&(this.id=a.id,this.configure(a))}function j(a,b){"use strict";if(!axe.utils.isHidden(b)){axe.utils.findBy(a,"node",b)||a.push({node:b,include:[],exclude:[]})}}function k(a,b,c){"use strict";a.frames=a.frames||[];var d,e,f=document.querySelectorAll(c.shift());a:for(var g=0,h=f.length;g<h;g++){e=f[g];for(var i=0,j=a.frames.length;i<j;i++)if(a.frames[i].node===e){a.frames[i][b].push(c);break a}d={node:e,include:[],exclude:[]},c&&d[b].push(c),a.frames.push(d)}}function l(a){"use strict";if(a&&"object"===(void 0===a?"undefined":qa(a))||a instanceof NodeList){if(a instanceof Node)return{include:[a],exclude:[]};if(a.hasOwnProperty("include")||a.hasOwnProperty("exclude"))return{include:a.include&&+a.include.length?a.include:[document],exclude:a.exclude||[]};if(a.length===+a.length)return{include:a,exclude:[]}}return"string"==typeof a?{include:[a],exclude:[]}:{include:[document],exclude:[]}}function m(a,b){"use strict";for(var c,d,e=[],f=0,g=a[b].length;f<g;f++){if("string"==typeof(c=a[b][f])){d=Array.from(document.querySelectorAll(c)),e=e.concat(d.map(function(a){return axe.utils.getFlattenedTree(a)[0]}));break}!c||!c.length||c instanceof Node?c instanceof Node&&e.push(axe.utils.getFlattenedTree(c)[0]):c.length>1?k(a,b,c):(d=Array.from(document.querySelectorAll(c[0])),e=e.concat(d.map(function(a){return axe.utils.getFlattenedTree(a)[0]})))}return e.filter(function(a){return a})}function n(a){"use strict";if(0===a.include.length){if(0===a.frames.length){var b=axe.utils.respondable.isInFrame()?"frame":"page";return new Error("No elements found for include in "+b+" Context")}a.frames.forEach(function(a,b){if(0===a.include.length)return new Error("No elements found for include in Context of frame "+b)})}}function o(a){"use strict";var b=this;this.frames=[],this.initiator=!a||"boolean"!=typeof a.initiator||a.initiator,this.page=!1,a=l(a),this.exclude=a.exclude,this.include=a.include,this.include=m(this,"include"),this.exclude=m(this,"exclude"),axe.utils.select("frame, iframe",this).forEach(function(a){oa(a,b)&&j(b.frames,a.actualNode)}),1===this.include.length&&this.include[0].actualNode===document.documentElement&&(this.page=!0);var c=n(this);if(c instanceof Error)throw c}function p(a){"use strict";this.id=a.id,this.result=axe.constants.NA,this.pageLevel=a.pageLevel,this.impact=null,this.nodes=[]}function q(a,b){"use strict";this._audit=b,this.id=a.id,this.selector=a.selector||"*",this.excludeHidden="boolean"!=typeof a.excludeHidden||a.excludeHidden,this.enabled="boolean"!=typeof a.enabled||a.enabled,this.pageLevel="boolean"==typeof a.pageLevel&&a.pageLevel,this.any=a.any||[],this.all=a.all||[],this.none=a.none||[],this.tags=a.tags||[],a.matches&&(this.matches=h(a.matches))}function r(a){"use strict";return axe.utils.getAllChecks(a).map(function(b){var c=a._audit.checks[b.id||b];return c&&"function"==typeof c.after?c:null}).filter(Boolean)}function s(a,b){"use strict";var c=[];return a.forEach(function(a){axe.utils.getAllChecks(a).forEach(function(a){a.id===b&&c.push(a)})}),c}function t(a){"use strict";return a.filter(function(a){return!0!==a.filtered})}function u(a){"use strict";var b=["any","all","none"],c=a.nodes.filter(function(a){var c=0;return b.forEach(function(b){a[b]=t(a[b]),c+=a[b].length}),c>0});return a.pageLevel&&c.length&&(c=[c.reduce(function(a,c){if(a)return b.forEach(function(b){a[b].push.apply(a[b],c[b])}),a})]),c}function v(a,b){"use strict";if(!axe._audit)throw new Error("No audit configured");var c=axe.utils.queue(),d=[];Object.keys(axe.plugins).forEach(function(a){c.defer(function(b){var c=function(a){d.push(a),b()};try{axe.plugins[a].cleanup(b,c)}catch(a){c(a)}})}),axe.utils.toArray(document.querySelectorAll("frame, iframe")).forEach(function(a){c.defer(function(b,c){return axe.utils.sendCommandToFrame(a,{command:"cleanup-plugin"},b,c)})}),c.then(function(c){0===d.length?a(c):b(d)}).catch(b)}function w(a){"use strict";var b;if(!(b=axe._audit))throw new Error("No audit configured");a.reporter&&("function"==typeof a.reporter||ta[a.reporter])&&(b.reporter=a.reporter),a.checks&&a.checks.forEach(function(a){b.addCheck(a)}),a.rules&&a.rules.forEach(function(a){b.addRule(a)}),void 0!==a.branding?b.setBranding(a.branding):b._constructHelpUrls(),a.tagExclude&&(b.tagExclude=a.tagExclude)}function x(a,b,c){"use strict";var d=c,e=function(a){a instanceof Error==!1&&(a=new Error(a)),c(a)},f=a&&a.context||{};f.include&&!f.include.length&&(f.include=[document]);var g=a&&a.options||{};switch(a.command){case"rules":return A(f,g,d,e);case"cleanup-plugin":return v(d,e);default:if(axe._audit&&axe._audit.commands&&axe._audit.commands[a.command])return axe._audit.commands[a.command](a,c)}}function y(a){"use strict";this._run=a.run,this._collect=a.collect,this._registry={},a.commands.forEach(function(a){axe._audit.registerCommand(a)})}function z(){"use strict";var a=axe._audit;if(!a)throw new Error("No audit configured");a.resetRulesAndChecks()}function A(a,b,c,d){"use strict";try{a=new o(a)}catch(a){return d(a)}var e=axe.utils.queue(),f=axe._audit;b.performanceTimer&&axe.utils.performanceTimer.auditStart(),a.frames.length&&!1!==b.iframes&&e.defer(function(c,d){axe.utils.collectResultsFromFrames(a,b,"rules",null,c,d)}),e.defer(function(c,d){f.run(a,b,c,d)}),e.then(function(e){try{b.performanceTimer&&axe.utils.performanceTimer.auditEnd();var g=axe.utils.mergeResults(e.map(function(a){return{results:a}}));a.initiator&&(g=f.after(g,b),g.forEach(axe.utils.publishMetaData),g=g.map(axe.utils.finalizeRuleResult));try{c(g)}catch(a){axe.log(a)}}catch(a){d(a)}}).catch(d)}function B(a){"use strict";switch(!0){case"string"==typeof a:case Array.isArray(a):case Node&&a instanceof Node:case NodeList&&a instanceof NodeList:return!0;case"object"!==(void 0===a?"undefined":qa(a)):return!1;case void 0!==a.include:case void 0!==a.exclude:case"number"==typeof a.length:return!0;default:return!1}}function C(a,b,c){"use strict";var d=new TypeError("axe.run arguments are invalid");if(!B(a)){if(void 0!==c)throw d;c=b,b=a,a=document}if("object"!==(void 0===b?"undefined":qa(b))){if(void 0!==c)throw d;c=b,b={}}if("function"!=typeof c&&void 0!==c)throw d;return{context:a,options:b,callback:c||ua}}function D(a,b){"use strict";["any","all","none"].forEach(function(c){Array.isArray(a[c])&&a[c].filter(function(a){return Array.isArray(a.relatedNodes)}).forEach(function(a){a.relatedNodes=a.relatedNodes.map(function(a){var c={html:a.source};return b.elementRef&&!a.fromFrame&&(c.element=a.element),(!1!==b.selectors||a.fromFrame)&&(c.target=a.selector),b.xpath&&(c.xpath=a.xpath),c})})})}function E(a,b){return xa.reduce(function(c,d){return c[d]=(a[d]||[]).map(function(a){return b(a,d)}),c},{})}function F(a,b,c){var d=Object.assign({},b);d.nodes=(d[c]||[]).concat(),axe.constants.resultGroups.forEach(function(a){delete d[a]}),a[c].push(d)}function G(a,b,c){"use strict";var d=window.getComputedStyle(a,null),e=!1;return!!d&&(b.forEach(function(a){d.getPropertyValue(a.property)===a.value&&(e=!0)}),!!e||!(a.nodeName.toUpperCase()===c.toUpperCase()||!a.parentNode)&&G(a.parentNode,b,c))}function H(a,b){"use strict";return new Error(a+": "+axe.utils.getSelector(b))}function I(a,b,c,d,e,f){"use strict";var g=axe.utils.queue();a.frames.forEach(function(e){var f={options:b,command:c,parameter:d,context:{initiator:!1,page:a.page,include:e.include||[],exclude:e.exclude||[]}};g.defer(function(a,b){var c=e.node;axe.utils.sendCommandToFrame(c,f,function(b){if(b)return a({results:b,frameElement:c,frame:axe.utils.getSelector(c)});a(null)},b)})}),g.then(function(a){e(axe.utils.mergeResults(a,b))}).catch(f)}function J(a,b){if(b=b||300,a.length>b){var c=a.indexOf(">");a=a.substring(0,c+1)}return a}function K(a){var b=a.outerHTML;return b||"function"!=typeof XMLSerializer||(b=(new XMLSerializer).serializeToString(a)),J(b||"")}function L(a,b,c){this._fromFrame=!!c,this.spec=c||{},b&&b.absolutePaths&&(this._options={toRoot:!0}),this.source=void 0!==this.spec.source?this.spec.source:K(a),this._element=a}function M(a,b){return{shadowId:b,children:[],actualNode:a}}function N(a){var b=[];for(a=a.firstChild;a;)b.push(a),a=a.nextSibling;return b}function O(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return 0!==a.length&&(a.match(/[0-9]/g)||"").length>=a.length/2}function P(a,b){return[a.substring(0,b),a.substring(b)]}function Q(a){var b=a,c="",d="",e="",f="",g="",h="";if(a.includes("#")){var i=P(a,a.indexOf("#")),j=ya(i,2);a=j[0],h=j[1]}if(a.includes("?")){var k=P(a,a.indexOf("?")),l=ya(k,2);a=l[0],g=l[1]}if(a.includes("://")){var m=a.split("://"),n=ya(m,2);c=n[0],a=n[1];var o=P(a,a.indexOf("/")),p=ya(o,2);d=p[0],a=p[1]}else if("//"===a.substr(0,2)){a=a.substr(2);var q=P(a,a.indexOf("/")),r=ya(q,2);d=r[0],a=r[1]}if("www."===d.substr(0,4)&&(d=d.substr(4)),d&&d.includes(":")){var s=P(d,d.indexOf(":")),t=ya(s,2);d=t[0],e=t[1]}return f=a,{original:b,protocol:c,domain:d,port:e,path:f,query:g,hash:h}}function R(a){if(Array.isArray(a)){for(var b=0,c=Array(a.length);b<a.length;b++)c[b]=a[b];return c}return Array.from(a)}function S(a){return!["focus","hover","hidden","visible","dirty","touched","valid","disable","enable","active","col-"].find(function(b){return a.includes(b)})}function T(a){return a.classList&&0!==a.classList.length?(a.parentNode&&Array.from(a.parentNode.children||"")||[]).reduce(function(b,c){return a===c?b:b.filter(function(a){return!c.classList.contains(a)})},Array.from(a.classList).filter(S)):[]}function U(a,b){var c=a.parentNode&&Array.from(a.parentNode.children||"")||[];if(c.find(function(c){return c!==a&&axe.utils.matchesSelector(c,b)}))return":nth-child("+(1+c.indexOf(a))+")";return""}function V(a,b){var c=a.nodeName.toLowerCase(),d=Array.from(a.classList)||[],e={nodeName:c,classList:d,isCustomElm:c.includes("-"),isCommonElm:Aa.includes(c),distinctClassList:T(a)};return[Ba.getCustomElm,Ba.getElmRoleProp,Ba.getUncommonElm,Ba.getElmNameProp,Ba.getDistinctClass,Ba.getFileRefProp,Ba.getCommonName].reduce(function(c,d){if(c.length===b)return c;var f=d(a,e);return f&&(f[0].match(/[a-z]/)?c.unshift(f):c.push(f)),c},[])}function W(a,b,c){var d=void 0,e=void 0,f=b.isUnique,g=void 0!==f&&f,h=Ba.getElmId(a),i=b.featureCount,j=void 0===i?2:i,k=b.minDepth,l=void 0===k?1:k,m=b.toRoot,n=void 0!==m&&m,o=b.childSelectors,p=void 0===o?[]:o;h?(d=h,g=!0):(d=V(a,j).join(""),d+=U(a,d),g=b.isUnique||1===c.querySelectorAll(d).length,g||a!==document.documentElement||(d+=":root"),e=0!==l||!g);var q=[d].concat(R(p));return a.parentElement&&11!==a.parentElement.nodeType&&(n||e)?W(a.parentNode,{toRoot:n,isUnique:g,childSelectors:q,featureCount:1,minDepth:l-1},c):q.join(" > ")}function X(a,b){var c,d;if(!a)return[];if(!b&&9===a.nodeType)return b=[{str:"html"}];if(b=b||[],a.parentNode&&a.parentNode!==a&&(b=X(a.parentNode,b)),a.previousSibling){d=1,c=a.previousSibling;do{1===c.nodeType&&c.nodeName===a.nodeName&&d++,c=c.previousSibling}while(c);1===d&&(d=null)}else if(a.nextSibling){c=a.nextSibling;do{1===c.nodeType&&c.nodeName===a.nodeName?(d=1,c=null):(d=null,c=c.previousSibling)}while(c)}if(1===a.nodeType){var e={};e.str=a.nodeName.toLowerCase(),a.getAttribute&&a.getAttribute("id")&&1===a.ownerDocument.querySelectorAll("#"+axe.utils.escapeSelector(a.id)).length&&(e.id=a.getAttribute("id")),d>1&&(e.count=d),b.push(e)}return b}function Y(a){return a.reduce(function(a,b){return b.id?"/"+b.str+"[@id='"+b.id+"']":a+"/"+b.str+(b.count>0?"["+b.count+"]":"")},"")}function Z(a){"use strict";if(Ca&&Ca.parentNode)return void 0===Ca.styleSheet?Ca.appendChild(document.createTextNode(a)):Ca.styleSheet.cssText+=a,Ca;if(a){var b=document.head||document.getElementsByTagName("head")[0];return Ca=document.createElement("style"),Ca.type="text/css",void 0===Ca.styleSheet?Ca.appendChild(document.createTextNode(a)):Ca.styleSheet.cssText=a,b.appendChild(Ca),Ca}}function $(a,b,c,d){"use strict";var e=axe.utils.getXpath(c),f={element:c,selector:d,xpath:e};a.forEach(function(a){a.node=axe.utils.DqElement.fromFrame(a.node,b,f);var c=axe.utils.getAllChecks(a);c.length&&c.forEach(function(a){a.relatedNodes=a.relatedNodes.map(function(a){return axe.utils.DqElement.fromFrame(a,b,f)})})})}function _(a,b){"use strict";for(var c,d,e=b[0].node,f=0,g=a.length;f<g;f++)if(d=a[f].node,(c=axe.utils.nodeSorter({actualNode:d.element},{actualNode:e.element}))>0||0===c&&e.selector.length<d.selector.length)return void a.splice.apply(a,[f,0].concat(b));a.push.apply(a,b)}function aa(a){"use strict";return a&&a.results?Array.isArray(a.results)?a.results.length?a.results:null:[a.results]:null}function ba(a,b){function c(a){return a.incomplete&&a.incomplete.default?a.incomplete.default:ra.incompleteFallbackMessage()}if(!a||!a.missingData)return c(b);try{var d=b.incomplete[a.missingData[0].reason];if(!d)throw new Error;return d}catch(d){return"string"==typeof a.missingData?b.incomplete[a.missingData]:c(b)}}function ca(a,b){"use strict";return function(c){var d=a[c.id]||{},e=d.messages||{},f=Object.assign({},d);delete f.messages,void 0===c.result?"object"===qa(e.incomplete)?f.message=function(){return ba(c.data,e)}:f.message=e.incomplete:f.message=c.result===b?e.pass:e.fail,axe.utils.extendMetaData(c,f)}}function da(a,b){return 1===a.nodeType&&("*"===b.tag||a.nodeName.toLowerCase()===b.tag)}function ea(a,b){return!b.classes||b.classes.reduce(function(b,c){return b&&a.className&&a.className.match(c.regexp)},!0)}function fa(a,b){return!b.attributes||b.attributes.reduce(function(b,c){var d=a.getAttribute(c.key);return b&&null!==d&&(!c.value||c.test(d))},!0)}function ga(a,b){return!b.id||a.id===b.id}function ha(a,b){return!(b.pseudos&&!b.pseudos.reduce(function(b,c){if("not"===c.name)return b&&!Ea([a],c.expressions,!1).length;throw new Error("the pseudo selector "+c.name+" has not yet been implemented")},!0))}function ia(a,b,c){var d=[];return a=Array.isArray(a)?a:[a],a.forEach(function(a){da(a.actualNode,b)&&ea(a.actualNode,b)&&fa(a.actualNode,b)&&ga(a.actualNode,b)&&ha(a,b)&&d.push(a),c&&(d=d.concat(ia(a.children.filter(function(c){return!b.id||c.shadowId===a.shadowId}),b,c)))}),d}function ja(a){/*! Credit Mootools Copyright Mootools, MIT License */ +if(a)return a.map(function(a){var b,c,d=a.name.replace(Ga,""),e=(a.value||"").replace(Ga,"");switch(a.operator){case"^=":c=new RegExp("^"+Fa(e));break;case"$=":c=new RegExp(Fa(e)+"$");break;case"~=":c=new RegExp("(^|\\s)"+Fa(e)+"(\\s|$)");break;case"|=":c=new RegExp("^"+Fa(e)+"(-|$)");break;case"=":b=function(a){return e===a};break;case"*=":b=function(a){return a&&a.indexOf(e)>-1};break;case"!=":b=function(a){return e!==a};break;default:b=function(a){return!!a}}return""===e&&/^[*$^]=$/.test(a.operator)&&(b=function(){return!1}),b||(b=function(a){return a&&c.test(a)}),{key:d,value:e,test:b}})}function ka(a){if(a)return a.map(function(a){return a=a.replace(Ga,""),{value:a,regexp:new RegExp("(^|\\s)"+Fa(a)+"(\\s|$)")}})}function la(a){if(a)return a.map(function(a){var b;return"not"===a.name&&(b=axe.utils.cssParser.parse(a.value),b=b.selectors?b.selectors:[b],b=Da(b)),{name:a.name,expressions:b,value:a.value}})}function ma(a,b){"use strict";var c,d,e=axe._audit&&axe._audit.tagExclude?axe._audit.tagExclude:[];return b.include||b.exclude?(c=b.include||[],c=Array.isArray(c)?c:[c],d=b.exclude||[],d=Array.isArray(d)?d:[d],d=d.concat(e.filter(function(a){return-1===c.indexOf(a)}))):(c=Array.isArray(b)?b:[b],d=e.filter(function(a){return-1===c.indexOf(a)})),!!(c.some(function(b){return-1!==a.tags.indexOf(b)})||0===c.length&&!1!==a.enabled)&&d.every(function(b){return-1===a.tags.indexOf(b)})}function na(a){"use strict";return a.sort(function(a,b){return axe.utils.contains(a,b)?1:-1})[0]}function oa(a,b){"use strict";var c=b.include&&na(b.include.filter(function(b){return axe.utils.contains(b,a)})),d=b.exclude&&na(b.exclude.filter(function(b){return axe.utils.contains(b,a)}));return!!(!d&&c||d&&axe.utils.contains(d,c))}function pa(a,b,c){"use strict";for(var d=0,e=b.length;d<e;d++)!a.find(function(a){return a.actualNode===b[d].actualNode})&&oa(b[d],c)&&a.push(b[d])}var document=window.document,qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},axe=axe||{};axe.version="2.3.1","function"==typeof define&&define.amd&&define([],function(){"use strict";return axe}),"object"===("undefined"==typeof module?"undefined":qa(module))&&module.exports&&"function"==typeof a.toString&&(axe.source="("+a.toString()+')(typeof window === "object" ? window : this);',module.exports=axe),"function"==typeof window.getComputedStyle&&(window.axe=axe);var commons;b.prototype=Object.create(Error.prototype),b.prototype.constructor=b;var utils=axe.utils={},ra={},qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};e.prototype._init=function(){var a=c(this.defaultConfig);axe.commons=commons=a.commons,this.reporter=a.reporter,this.commands={},this.rules=[],this.checks={},d(a.rules,this,"addRule"),d(a.checks,this,"addCheck"),this.data={},this.data.checks=a.data&&a.data.checks||{},this.data.rules=a.data&&a.data.rules||{},this.data.failureSummaries=a.data&&a.data.failureSummaries||{},this.data.incompleteFallbackMessage=a.data&&a.data.incompleteFallbackMessage||"",this._constructHelpUrls()},e.prototype.registerCommand=function(a){"use strict";this.commands[a.id]=a.callback},e.prototype.addRule=function(a){"use strict";a.metadata&&(this.data.rules[a.id]=a.metadata);var b=this.getRule(a.id);b?b.configure(a):this.rules.push(new q(a,this))},e.prototype.addCheck=function(a){"use strict";var b=a.metadata;"object"===(void 0===b?"undefined":qa(b))&&(this.data.checks[a.id]=b,"object"===qa(b.messages)&&Object.keys(b.messages).filter(function(a){return b.messages.hasOwnProperty(a)&&"string"==typeof b.messages[a]}).forEach(function(a){0===b.messages[a].indexOf("function")&&(b.messages[a]=new Function("return "+b.messages[a]+";")())})),this.checks[a.id]?this.checks[a.id].configure(a):this.checks[a.id]=new i(a)},e.prototype.run=function(a,b,c,d){"use strict";this.validateOptions(b),axe._tree=axe.utils.getFlattenedTree(document.body);var e=axe.utils.queue();this.rules.forEach(function(c){if(axe.utils.ruleShouldRun(c,a,b)){if(b.performanceTimer){var d="mark_rule_end_"+c.id,f="mark_rule_start_"+c.id;axe.utils.performanceTimer.mark(f)}e.defer(function(e,g){c.run(a,b,function(a){b.performanceTimer&&(axe.utils.performanceTimer.mark(d),axe.utils.performanceTimer.measure("rule_"+c.id,f,d)),e(a)},function(a){if(b.debug)g(a);else{var d=Object.assign(new p(c),{result:axe.constants.CANTTELL,description:"An error occured while running this rule",message:a.message,help:a.stack||a.message,error:a});e(d)}})})}}),e.then(function(a){axe._tree=void 0,c(a.filter(function(a){return!!a}))}).catch(d)},e.prototype.after=function(a,b){"use strict";var c=this.rules;return a.map(function(a){return axe.utils.findBy(c,"id",a.id).after(a,b)})},e.prototype.getRule=function(a){return this.rules.find(function(b){return b.id===a})},e.prototype.validateOptions=function(a){"use strict";var b=this;if("object"===qa(a.runOnly)){var c=a.runOnly;if("rule"===c.type&&Array.isArray(c.value))c.value.forEach(function(a){if(!b.getRule(a))throw new Error("unknown rule `"+a+"` in options.runOnly")});else if(Array.isArray(c.value)&&c.value.length>0){var d=[].concat(c.value);if(b.rules.forEach(function(a){var b,c,e;if(d)for(c=0,e=a.tags.length;c<e;c++)-1!==(b=d.indexOf(a.tags[c]))&&d.splice(b,1)}),0!==d.length)throw new Error("could not find tags `"+d.join("`, `")+"`")}}return"object"===qa(a.rules)&&Object.keys(a.rules).forEach(function(a){if(!b.getRule(a))throw new Error("unknown rule `"+a+"` in options.rules")}),a},e.prototype.setBranding=function(a){"use strict";var b={brand:this.brand,application:this.application};a&&a.hasOwnProperty("brand")&&a.brand&&"string"==typeof a.brand&&(this.brand=a.brand),a&&a.hasOwnProperty("application")&&a.application&&"string"==typeof a.application&&(this.application=a.application),this._constructHelpUrls(b)},e.prototype._constructHelpUrls=function(){var a=this,b=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,c=axe.version.substring(0,axe.version.lastIndexOf("."));this.rules.forEach(function(d){a.data.rules[d.id]||(a.data.rules[d.id]={});var e=a.data.rules[d.id];("string"!=typeof e.helpUrl||b&&e.helpUrl===f(b,d.id,c))&&(e.helpUrl=f(a,d.id,c))})},e.prototype.resetRulesAndChecks=function(){"use strict";this._init()},i.prototype.enabled=!0,i.prototype.run=function(a,b,c,d){"use strict";b=b||{};var e=b.hasOwnProperty("enabled")?b.enabled:this.enabled,f=b.options||this.options;if(e){var h,i=new g(this),j=axe.utils.checkHelper(i,b,c,d);try{h=this.evaluate.call(j,a.actualNode,f,a)}catch(a){return void d(a)}j.isAsync||(i.result=h,setTimeout(function(){c(i)},0))}else c(null)},i.prototype.configure=function(a){var b=this;["options","enabled"].filter(function(b){return a.hasOwnProperty(b)}).forEach(function(c){return b[c]=a[c]}),["evaluate","after"].filter(function(b){return a.hasOwnProperty(b)}).forEach(function(c){return b[c]=h(a[c])})};var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};q.prototype.matches=function(){"use strict";return!0},q.prototype.gather=function(a){"use strict";var b=axe.utils.select(this.selector,a);return this.excludeHidden?b.filter(function(a){return!axe.utils.isHidden(a.actualNode)}):b},q.prototype.runChecks=function(a,b,c,d,e){"use strict";var f=this,g=axe.utils.queue();this[a].forEach(function(a){var d=f._audit.checks[a.id||a],e=axe.utils.getCheckOption(d,f.id,c);g.defer(function(a,c){d.run(b,e,a,c)})}),g.then(function(b){b=b.filter(function(a){return a}),d({type:a,results:b})}).catch(e)},q.prototype.run=function(a,c,d,e){var f=this,g=axe.utils.queue(),h=new p(this),i=void 0;try{i=this.gather(a).filter(function(a){return f.matches(a.actualNode)})}catch(a){return void e(new b({cause:a,ruleId:this.id}))}c.performanceTimer&&axe.log("gather (",i.length,"):",axe.utils.performanceTimer.timeElapsed()+"ms"),i.forEach(function(a){g.defer(function(b,d){var e=axe.utils.queue();e.defer(function(b,d){f.runChecks("any",a,c,b,d)}),e.defer(function(b,d){f.runChecks("all",a,c,b,d)}),e.defer(function(b,d){f.runChecks("none",a,c,b,d)}),e.then(function(d){if(d.length){var e=!1,f={};d.forEach(function(a){var b=a.results.filter(function(a){return a});f[a.type]=b,b.length&&(e=!0)}),e&&(f.node=new axe.utils.DqElement(a.actualNode,c),h.nodes.push(f))}b()}).catch(function(a){return d(a)})})}),g.then(function(){return d(h)}).catch(function(a){return e(a)})},q.prototype.after=function(a,b){"use strict";var c=r(this),d=this.id;return c.forEach(function(c){var e=s(a.nodes,c.id),f=axe.utils.getCheckOption(c,d,b),g=c.after(e,f);e.forEach(function(a){-1===g.indexOf(a)&&(a.filtered=!0)})}),a.nodes=u(a),a},q.prototype.configure=function(a){"use strict";a.hasOwnProperty("selector")&&(this.selector=a.selector),a.hasOwnProperty("excludeHidden")&&(this.excludeHidden="boolean"!=typeof a.excludeHidden||a.excludeHidden),a.hasOwnProperty("enabled")&&(this.enabled="boolean"!=typeof a.enabled||a.enabled),a.hasOwnProperty("pageLevel")&&(this.pageLevel="boolean"==typeof a.pageLevel&&a.pageLevel),a.hasOwnProperty("any")&&(this.any=a.any),a.hasOwnProperty("all")&&(this.all=a.all),a.hasOwnProperty("none")&&(this.none=a.none),a.hasOwnProperty("tags")&&(this.tags=a.tags),a.hasOwnProperty("matches")&&("string"==typeof a.matches?this.matches=new Function("return "+a.matches+";")():this.matches=a.matches)},function(axe){var a=[{name:"NA",value:"inapplicable",priority:0,group:"inapplicable"},{name:"PASS",value:"passed",priority:1,group:"passes"},{name:"CANTTELL",value:"cantTell",priority:2,group:"incomplete"},{name:"FAIL",value:"failed",priority:3,group:"violations"}],b={helpUrlBase:"https://dequeuniversity.com/rules/",results:[],resultGroups:[],resultGroupMap:{},impact:Object.freeze(["minor","moderate","serious","critical"])};a.forEach(function(a){var c=a.name,d=a.value,e=a.priority,f=a.group;b[c]=d,b[c+"_PRIO"]=e,b[c+"_GROUP"]=f,b.results[e]=d,b.resultGroups[e]=f,b.resultGroupMap[d]=f}),Object.freeze(b.results),Object.freeze(b.resultGroups),Object.freeze(b.resultGroupMap),Object.freeze(b),Object.defineProperty(axe,"constants",{value:b,enumerable:!0,configurable:!1,writable:!1})}(axe);var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};axe.log=function(){"use strict";"object"===("undefined"==typeof console?"undefined":qa(console))&&console.log&&Function.prototype.apply.call(console.log,console,arguments)};var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};axe.a11yCheck=function(a,b,c){"use strict";"function"==typeof b&&(c=b,b={}),b&&"object"===(void 0===b?"undefined":qa(b))||(b={});var d=axe._audit;if(!d)throw new Error("No audit configured");b.reporter=b.reporter||d.reporter||"v2",b.performanceTimer&&axe.utils.performanceTimer.start();var e=axe.getReporter(b.reporter);axe._runRules(a,b,function(a){var d=e(a,b,c);void 0!==d&&(b.performanceTimer&&axe.utils.performanceTimer.end(),c(d))},axe.log)},axe.cleanup=v,axe.configure=w,axe.getRules=function(a){"use strict";a=a||[];var b=a.length?axe._audit.rules.filter(function(b){return!!a.filter(function(a){return-1!==b.tags.indexOf(a)}).length}):axe._audit.rules,c=axe._audit.data.rules||{};return b.map(function(a){var b=c[a.id]||{};return{ruleId:a.id,description:b.description,help:b.help,helpUrl:b.helpUrl,tags:a.tags}})},axe._load=function(a){"use strict";axe.utils.respondable.subscribe("axe.ping",function(a,b,c){c({axe:!0})}),axe.utils.respondable.subscribe("axe.start",x),axe._audit=new e(a)};var axe=axe||{};axe.plugins={},y.prototype.run=function(){"use strict";return this._run.apply(this,arguments)},y.prototype.collect=function(){"use strict";return this._collect.apply(this,arguments)},y.prototype.cleanup=function(a){"use strict";var b=axe.utils.queue(),c=this;Object.keys(this._registry).forEach(function(a){b.defer(function(b){c._registry[a].cleanup(b)})}),b.then(function(){a()})},y.prototype.add=function(a){"use strict";this._registry[a.id]=a},axe.registerPlugin=function(a){"use strict";axe.plugins[a.id]=new y(a)};var sa,ta={};axe.getReporter=function(a){"use strict";return"string"==typeof a&&ta[a]?ta[a]:"function"==typeof a?a:sa},axe.addReporter=function(a,b,c){"use strict";ta[a]=b,c&&(sa=b)},axe.reset=z,axe._runRules=A;var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},ua=function(){};axe.run=function(a,b,c){"use strict";if(!axe._audit)throw new Error("No audit configured");var d=C(a,b,c);a=d.context,b=d.options,c=d.callback,b.reporter=b.reporter||axe._audit.reporter||"v1",b.performanceTimer&&axe.utils.performanceTimer.start();var e=void 0,f=ua,g=ua;return window.Promise&&c===ua&&(e=new Promise(function(a,b){f=b,g=a})),axe._runRules(a,b,function(a){var d=function(a){try{c(null,a)}catch(a){axe.log(a)}g(a)};b.performanceTimer&&axe.utils.performanceTimer.end();try{var e=axe.getReporter(b.reporter),h=e(a,b,d);void 0!==h&&d(h)}catch(a){c(a),f(a)}},function(a){c(a),f(a)}),e},ra.failureSummary=function(a){"use strict";var b={};return b.none=a.none.concat(a.all),b.any=a.any,Object.keys(b).map(function(a){if(b[a].length){var c=axe._audit.data.failureSummaries[a];return c&&"function"==typeof c.failureMessage?c.failureMessage(b[a].map(function(a){return a.message||""})):void 0}}).filter(function(a){return void 0!==a}).join("\n\n")},ra.incompleteFallbackMessage=function(){"use strict";return axe._audit.data.incompleteFallbackMessage()};var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},va=axe.constants.resultGroups;ra.processAggregate=function(a,b){var c=axe.utils.aggregateResult(a);return c.timestamp=(new Date).toISOString(),c.url=window.location.href,va.forEach(function(a){c[a]=(c[a]||[]).map(function(a){return a=Object.assign({},a),Array.isArray(a.nodes)&&a.nodes.length>0&&(a.nodes=a.nodes.map(function(a){return"object"===qa(a.node)&&(a.html=a.node.source,b.elementRef&&!a.node.fromFrame&&(a.element=a.node.element),(!1!==b.selectors||a.node.fromFrame)&&(a.target=a.node.selector),b.xpath&&(a.xpath=a.node.xpath)),delete a.result,delete a.node,D(a,b),a})),va.forEach(function(b){return delete a[b]}),delete a.pageLevel,delete a.result,a})}),c},axe.addReporter("na",function(a,b,c){"use strict";"function"==typeof b&&(c=b,b={});var d=ra.processAggregate(a,b);c({violations:d.violations,passes:d.passes,incomplete:d.incomplete,inapplicable:d.inapplicable,timestamp:d.timestamp,url:d.url})}),axe.addReporter("no-passes",function(a,b,c){"use strict";"function"==typeof b&&(c=b,b={});var d=ra.processAggregate(a,b);c({violations:d.violations,timestamp:d.timestamp,url:d.url})}),axe.addReporter("raw",function(a,b,c){"use strict";"function"==typeof b&&(c=b,b={}),c(a)}),axe.addReporter("v1",function(a,b,c){"use strict";"function"==typeof b&&(c=b,b={});var d=ra.processAggregate(a,b);d.violations.forEach(function(a){return a.nodes.forEach(function(a){a.failureSummary=ra.failureSummary(a)})}),c({violations:d.violations,passes:d.passes,incomplete:d.incomplete,inapplicable:d.inapplicable,timestamp:d.timestamp,url:d.url})}),axe.addReporter("v2",function(a,b,c){"use strict";"function"==typeof b&&(c=b,b={});var d=ra.processAggregate(a,b);c({violations:d.violations,passes:d.passes,incomplete:d.incomplete,inapplicable:d.inapplicable,timestamp:d.timestamp,url:d.url})},!0),axe.utils.aggregate=function(a,b,c){b=b.slice(),c&&b.push(c);var d=b.map(function(b){return a.indexOf(b)}).sort();return a[d.pop()]};var wa=[];wa[axe.constants.PASS_PRIO]=!0,wa[axe.constants.CANTTELL_PRIO]=null,wa[axe.constants.FAIL_PRIO]=!1;var xa=["any","all","none"];axe.utils.aggregateChecks=function(a){var b=Object.assign({},a);E(b,function(a,b){var c=wa.indexOf(a.result);a.priority=-1!==c?c:axe.constants.CANTTELL_PRIO,"none"===b&&(a.priority=4-a.priority)});var c=E(b,function(a){return a.priority});b.priority=Math.max(c.all.reduce(function(a,b){return Math.max(a,b)},0),c.none.reduce(function(a,b){return Math.max(a,b)},0),c.any.reduce(function(a,b){return Math.min(a,b)},4)%4);var d=[];return xa.forEach(function(a){b[a]=b[a].filter(function(a){return a.priority===b.priority}),b[a].forEach(function(a){return d.push(a.impact)})}),b.priority===axe.constants.FAIL_PRIO?b.impact=axe.utils.aggregate(axe.constants.impact,d):b.impact=null,E(b,function(a){delete a.result,delete a.priority}),b.result=axe.constants.results[b.priority],delete b.priority,b},axe.utils.aggregateResult=function(a){var b={};return axe.constants.resultGroups.forEach(function(a){return b[a]=[]}),a.forEach(function(a){a.error?F(b,a,axe.constants.CANTTELL_GROUP):a.result===axe.constants.NA?F(b,a,axe.constants.NA_GROUP):axe.constants.resultGroups.forEach(function(c){Array.isArray(a[c])&&a[c].length>0&&F(b,a,c)})}),b},function(){axe.utils.aggregateRule=function(a){var b={};a=a.map(function(a){if(a.any&&a.all&&a.none)return axe.utils.aggregateChecks(a);if(Array.isArray(a.node))return axe.utils.finalizeRuleResult(a);throw new TypeError("Invalid Result type")});var c=a.map(function(a){return a.result});b.result=axe.utils.aggregate(axe.constants.results,c,b.result),axe.constants.resultGroups.forEach(function(a){return b[a]=[]}),a.forEach(function(a){var c=axe.constants.resultGroupMap[a.result];b[c].push(a)});var d=axe.constants.FAIL_GROUP;if(b[d].length>0){var e=b[d].map(function(a){return a.impact});b.impact=axe.utils.aggregate(axe.constants.impact,e)||null}else b.impact=null;return b}}(),axe.utils.areStylesSet=G,axe.utils.checkHelper=function(a,b,c,d){"use strict";return{isAsync:!1,async:function(){return this.isAsync=!0,function(b){b instanceof Error==!1?(a.value=b,c(a)):d(b)}},data:function(b){a.data=b},relatedNodes:function(c){c=c instanceof Node?[c]:axe.utils.toArray(c),a.relatedNodes=c.map(function(a){return new axe.utils.DqElement(a,b)})}}};var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};axe.utils.clone=function(a){"use strict";var b,c,d=a;if(null!==a&&"object"===(void 0===a?"undefined":qa(a)))if(Array.isArray(a))for(d=[],b=0,c=a.length;b<c;b++)d[b]=axe.utils.clone(a[b]);else{d={};for(b in a)d[b]=axe.utils.clone(a[b])}return d},axe.utils.sendCommandToFrame=function(a,b,c,d){"use strict";var e=a.contentWindow;if(!e)return axe.log("Frame does not have a content window",a),void c(null);var f=setTimeout(function(){f=setTimeout(function(){var e=H("No response from frame",a);b.debug?d(e):(axe.log(e),c(null))},0)},500);axe.utils.respondable(e,"axe.ping",null,void 0,function(){clearTimeout(f),f=setTimeout(function(){d(H("Axe in frame timed out",a))},3e4),axe.utils.respondable(e,"axe.start",b,void 0,function(a){clearTimeout(f),a instanceof Error==!1?c(a):d(a)})})},axe.utils.collectResultsFromFrames=I,axe.utils.contains=function(a,b){"use strict";function c(a,b){return a.shadowId===b.shadowId||!!a.children.find(function(a){return c(a,b)})}return a.shadowId||b.shadowId?c(a,b):"function"==typeof a.actualNode.contains?a.actualNode.contains(b.actualNode):!!(16&a.actualNode.compareDocumentPosition(b.actualNode))},function(axe){/*! + * The copyright below covers the code within this function block only + * + * Copyright (c) 2013 Dulin Marat + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +function a(){this.pseudos={},this.attrEqualityMods={},this.ruleNestingOperators={},this.substitutesEnabled=!1}function b(a){return a>="a"&&a<="z"||a>="A"&&a<="Z"||"-"===a||"_"===a}function c(a){return a>="a"&&a<="z"||a>="A"&&a<="Z"||a>="0"&&a<="9"||"-"===a||"_"===a}function d(a){return a>="a"&&a<="f"||a>="A"&&a<="F"||a>="0"&&a<="9"}function e(a,e,g,j,k,l){var m,n,o,p,q;return p=a.length,m=null,o=function(b,c){var f,g,h;for(h="",e++,m=a.charAt(e);e<p;){if(m===b)return e++,h;if("\\"===m)if(e++,(m=a.charAt(e))===b)h+=b;else if(f=c[m])h+=f;else{if(d(m)){for(g=m,e++,m=a.charAt(e);d(m);)g+=m,e++,m=a.charAt(e);" "===m&&(e++,m=a.charAt(e)),h+=String.fromCharCode(parseInt(g,16));continue}h+=m}else h+=m;e++,m=a.charAt(e)}return h},n=function(){var b="";for(m=a.charAt(e);e<p;){if(c(m))b+=m;else{if("\\"!==m)return b;if(++e>=p)throw Error("Expected symbol but end of file reached.");if(m=a.charAt(e),f[m])b+=m;else{if(d(m)){var g=m;for(e++,m=a.charAt(e);d(m);)g+=m,e++,m=a.charAt(e);" "===m&&(e++,m=a.charAt(e)),b+=String.fromCharCode(parseInt(g,16));continue}b+=m}}e++,m=a.charAt(e)}return b},q=function(){m=a.charAt(e);for(var b=!1;" "===m||"\t"===m||"\n"===m||"\r"===m||"\f"===m;)b=!0,e++,m=a.charAt(e);return b},this.parse=function(){var b=this.parseSelector();if(e<p)throw Error('Rule expected but "'+a.charAt(e)+'" found.');return b},this.parseSelector=function(){var b,c=b=this.parseSingleSelector();for(m=a.charAt(e);","===m;){if(e++,q(),"selectors"!==b.type&&(b={type:"selectors",selectors:[c]}),!(c=this.parseSingleSelector()))throw Error('Rule expected after ",".');b.selectors.push(c)}return b},this.parseSingleSelector=function(){q();var b={type:"ruleSet"},c=this.parseRule();if(!c)return null;for(var d=b;c&&(c.type="rule",d.rule=c,d=c,q(),m=a.charAt(e),!(e>=p||","===m||")"===m));)if(k[m]){var f=m;if(e++,q(),!(c=this.parseRule()))throw Error('Rule expected after "'+f+'".');c.nestingOperator=f}else(c=this.parseRule())&&(c.nestingOperator=null);return b},this.parseRule=function(){for(var c=null;e<p;)if("*"===(m=a.charAt(e)))e++,(c=c||{}).tagName="*";else if(b(m)||"\\"===m)(c=c||{}).tagName=n();else if("."===m)e++,c=c||{},(c.classNames=c.classNames||[]).push(n());else if("#"===m)e++,(c=c||{}).id=n();else if("["===m){e++,q();var d={name:n()};if(q(),"]"===m)e++;else{var f="";if(j[m]&&(f=m,e++,m=a.charAt(e)),e>=p)throw Error('Expected "=" but end of file reached.');if("="!==m)throw Error('Expected "=" but "'+m+'" found.');d.operator=f+"=",e++,q();var k="";if(d.valueType="string",'"'===m)k=o('"',i);else if("'"===m)k=o("'",h);else if(l&&"$"===m)e++,k=n(),d.valueType="substitute";else{for(;e<p&&"]"!==m;)k+=m,e++,m=a.charAt(e);k=k.trim()}if(q(),e>=p)throw Error('Expected "]" but end of file reached.');if("]"!==m)throw Error('Expected "]" but "'+m+'" found.');e++,d.value=k}c=c||{},(c.attrs=c.attrs||[]).push(d)}else{if(":"!==m)break;e++;var r=n(),s={name:r};if("("===m){e++;var t="";if(q(),"selector"===g[r])s.valueType="selector",t=this.parseSelector();else{if(s.valueType=g[r]||"string",'"'===m)t=o('"',i);else if("'"===m)t=o("'",h);else if(l&&"$"===m)e++,t=n(),s.valueType="substitute";else{for(;e<p&&")"!==m;)t+=m,e++,m=a.charAt(e);t=t.trim()}q()}if(e>=p)throw Error('Expected ")" but end of file reached.');if(")"!==m)throw Error('Expected ")" but "'+m+'" found.');e++,s.value=t}c=c||{},(c.pseudos=c.pseudos||[]).push(s)}return c},this}a.prototype.registerSelectorPseudos=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],this.pseudos[a]="selector";return this},a.prototype.unregisterSelectorPseudos=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],delete this.pseudos[a];return this},a.prototype.registerNumericPseudos=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],this.pseudos[a]="numeric";return this},a.prototype.unregisterNumericPseudos=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],delete this.pseudos[a];return this},a.prototype.registerNestingOperators=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],this.ruleNestingOperators[a]=!0;return this},a.prototype.unregisterNestingOperators=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],delete this.ruleNestingOperators[a];return this},a.prototype.registerAttrEqualityMods=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],this.attrEqualityMods[a]=!0;return this},a.prototype.unregisterAttrEqualityMods=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],delete this.attrEqualityMods[a];return this},a.prototype.enableSubstitutes=function(){return this.substitutesEnabled=!0,this},a.prototype.disableSubstitutes=function(){return this.substitutesEnabled=!1,this};var f={"!":!0,'"':!0,"#":!0,$:!0,"%":!0,"&":!0,"'":!0,"(":!0,")":!0,"*":!0,"+":!0,",":!0,".":!0,"/":!0,";":!0,"<":!0,"=":!0,">":!0,"?":!0,"@":!0,"[":!0,"\\":!0,"]":!0,"^":!0,"`":!0,"{":!0,"|":!0,"}":!0,"~":!0},g={"\n":"\\n","\r":"\\r","\t":"\\t","\f":"\\f","\v":"\\v"},h={n:"\n",r:"\r",t:"\t",f:"\f","\\":"\\","'":"'"},i={n:"\n",r:"\r",t:"\t",f:"\f","\\":"\\",'"':'"'};a.prototype.parse=function(a){return new e(a,0,this.pseudos,this.attrEqualityMods,this.ruleNestingOperators,this.substitutesEnabled).parse()},a.prototype.escapeIdentifier=function(a){for(var b="",c=0,d=a.length;c<d;){var e=a.charAt(c);if(f[e])b+="\\"+e;else if("_"===e||"-"===e||e>="A"&&e<="Z"||e>="a"&&e<="z"||0!==c&&e>="0"&&e<="9")b+=e;else{var g=e.charCodeAt(0);if(55296==(63488&g)){var h=a.charCodeAt(c++);if(55296!=(64512&g)||56320!=(64512&h))throw Error("UCS-2(decode): illegal sequence");g=((1023&g)<<10)+(1023&h)+65536}b+="\\"+g.toString(16)+" "}c++}return b},a.prototype.escapeStr=function(a){for(var b,c,d="",e=0,f=a.length;e<f;)b=a.charAt(e),'"'===b?b='\\"':"\\"===b?b="\\\\":(c=g[b])&&(b=c),d+=b,e++;return'"'+d+'"'},a.prototype.render=function(a){return this._renderEntity(a).trim()},a.prototype._renderEntity=function(a){var b,c,d;switch(d="",a.type){case"ruleSet":for(b=a.rule,c=[];b;)b.nestingOperator&&c.push(b.nestingOperator),c.push(this._renderEntity(b)),b=b.rule;d=c.join(" ");break;case"selectors":d=a.selectors.map(this._renderEntity,this).join(", ");break;case"rule":a.tagName&&(d="*"===a.tagName?"*":this.escapeIdentifier(a.tagName)),a.id&&(d+="#"+this.escapeIdentifier(a.id)),a.classNames&&(d+=a.classNames.map(function(a){return"."+this.escapeIdentifier(a)},this).join("")),a.attrs&&(d+=a.attrs.map(function(a){return a.operator?"substitute"===a.valueType?"["+this.escapeIdentifier(a.name)+a.operator+"$"+a.value+"]":"["+this.escapeIdentifier(a.name)+a.operator+this.escapeStr(a.value)+"]":"["+this.escapeIdentifier(a.name)+"]"},this).join("")),a.pseudos&&(d+=a.pseudos.map(function(a){return a.valueType?"selector"===a.valueType?":"+this.escapeIdentifier(a.name)+"("+this._renderEntity(a.value)+")":"substitute"===a.valueType?":"+this.escapeIdentifier(a.name)+"($"+a.value+")":"numeric"===a.valueType?":"+this.escapeIdentifier(a.name)+"("+a.value+")":":"+this.escapeIdentifier(a.name)+"("+this.escapeIdentifier(a.value)+")":":"+this.escapeIdentifier(a.name)},this).join(""));break;default:throw Error('Unknown entity type: "'+a.type(NaN))}return d};var j=new a;j.registerNestingOperators(">"),axe.utils.cssParser=j}(axe),L.prototype={get selector(){return this.spec.selector||[axe.utils.getSelector(this.element,this._options)]},get xpath(){return this.spec.xpath||[axe.utils.getXpath(this.element)]},get element(){return this._element},get fromFrame(){return this._fromFrame},toJSON:function(){"use strict";return{selector:this.selector,source:this.source,xpath:this.xpath}}},L.fromFrame=function(a,b,c){return a.selector.unshift(c.selector),a.xpath.unshift(c.xpath),new axe.utils.DqElement(c.element,b,a)},axe.utils.DqElement=L,axe.utils.matchesSelector=function(){"use strict";function a(a){var b,c,d=a.Element.prototype,e=["matches","matchesSelector","mozMatchesSelector","webkitMatchesSelector","msMatchesSelector"],f=e.length;for(b=0;b<f;b++)if(c=e[b],d[c])return c}var b;return function(c,d){return b&&c[b]||(b=a(c.ownerDocument.defaultView)),c[b](d)}}(),axe.utils.escapeSelector=function(a){"use strict";for(var b,c=String(a),d=c.length,e=-1,f="",g=c.charCodeAt(0);++e<d;){if(0==(b=c.charCodeAt(e)))throw new Error("INVALID_CHARACTER_ERR");b>=1&&b<=31||b>=127&&b<=159||0==e&&b>=48&&b<=57||1==e&&b>=48&&b<=57&&45==g?f+="\\"+b.toString(16)+" ":f+=(1!=e||45!=b||45!=g)&&(b>=128||45==b||95==b||b>=48&&b<=57||b>=65&&b<=90||b>=97&&b<=122)?c.charAt(e):"\\"+c.charAt(e)}return f},axe.utils.extendMetaData=function(a,b){Object.assign(a,b),Object.keys(b).filter(function(a){return"function"==typeof b[a]}).forEach(function(c){a[c]=null;try{a[c]=b[c](a)}catch(a){}})},axe.utils.finalizeRuleResult=function(a){return Object.assign(a,axe.utils.aggregateRule(a.nodes)),delete a.nodes,a};var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};axe.utils.findBy=function(a,b,c){if(Array.isArray(a))return a.find(function(a){return"object"===(void 0===a?"undefined":qa(a))&&a[b]===c})};var axe=axe||{utils:{}};axe.utils.getFlattenedTree=function(a,b){function c(a,c){var d=axe.utils.getFlattenedTree(c,b);return d&&(a=a.concat(d)),a}var d,e,f;if(a.documentElement&&(a=a.documentElement),f=a.nodeName.toLowerCase(),a.shadowRoot&&"marquee"!==f)return b="a"+Math.random().toString().substring(2),e=Array.from(a.shadowRoot.childNodes),e.reduce(c,[]);if("content"===f)return e=Array.from(a.getDistributedNodes()),e.reduce(c,[]);if("slot"===f){e=Array.from(a.assignedNodes()),e.length||(e=N(a));window.getComputedStyle(a);return e.reduce(c,[])}return 1===a.nodeType?(d=M(a,b),e=Array.from(a.childNodes),d.children=e.reduce(c,[]),[d]):3===a.nodeType?[M(a)]:void 0},axe.utils.getNodeFromTree=function(a,b){var c;return a.children.forEach(function(a){var d;a.actualNode===b?c=a:(d=axe.utils.getNodeFromTree(a,b))&&(c=d)}),c},axe.utils.getAllChecks=function(a){"use strict";return[].concat(a.any||[]).concat(a.all||[]).concat(a.none||[])},axe.utils.getCheckOption=function(a,b,c){var d=((c.rules&&c.rules[b]||{}).checks||{})[a.id],e=(c.checks||{})[a.id],f=a.enabled,g=a.options;return e&&(e.hasOwnProperty("enabled")&&(f=e.enabled),e.hasOwnProperty("options")&&(g=e.options)),d&&(d.hasOwnProperty("enabled")&&(f=d.enabled),d.hasOwnProperty("options")&&(g=d.options)),{enabled:f,options:g,absolutePaths:c.absolutePaths}};var ya=function(){function a(a,b){var c=[],d=!0,e=!1,f=void 0;try{for(var g,h=a[Symbol.iterator]();!(d=(g=h.next()).done)&&(c.push(g.value),!b||c.length!==b);d=!0);}catch(a){e=!0,f=a}finally{try{!d&&h.return&&h.return()}finally{if(e)throw f}}return c}return function(b,c){if(Array.isArray(b))return b;if(Symbol.iterator in Object(b))return a(b,c);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();axe.utils.getFriendlyUriEnd=function(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(a.length<=1||"data:"===a.substr(0,5)||"javascript:"===a.substr(0,11)||a.includes("?"))){var c=b.currentDomain,d=b.maxLength,e=void 0===d?25:d,f=Q(a),g=f.path,h=f.domain,i=f.hash,j=g.substr(g.substr(0,g.length-2).lastIndexOf("/")+1);if(i)return j&&(j+i).length<=e?j+i:j.length<2&&i.length>2&&i.length<=e?i:void 0;if(h&&h.length<e&&g.length<=1)return h+g;if(g==="/"+j&&h&&c&&h!==c&&(h+g).length<=e)return h+g;var k=j.lastIndexOf(".");return(-1===k||k>1)&&(-1!==k||j.length>2)&&j.length<=e&&!j.match(/index(\.[a-zA-Z]{2-4})?/)&&!O(j)?j:void 0}};var za=axe.utils.escapeSelector,Aa=["div","span","p","b","i","u","strong","em","h2","h3"],Ba={getElmId:function(a){if(a.id){var b=a.getRootNode&&a.getRootNode()||document,c="#"+za(a.id||"");return c.match(/player_uid_/)||1!==b.querySelectorAll(c).length?void 0:c}},getCustomElm:function(a,b){var c=b.isCustomElm,d=b.nodeName;if(c)return d},getElmRoleProp:function(a){if(a.hasAttribute("role"))return'[role="'+za(a.getAttribute("role"))+'"]'},getUncommonElm:function(a,b){var c=b.isCommonElm,d=b.isCustomElm,e=b.nodeName;if(!c&&!d)return e=za(e),"input"===e&&a.hasAttribute("type")&&(e+='[type="'+a.type+'"]'),e},getElmNameProp:function(a){if(!a.id&&a.name)return'[name="'+za(a.name)+'"]'},getDistinctClass:function(a,b){var c=b.distinctClassList;if(c.length>0&&c.length<3)return"."+c.map(za).join(".")},getFileRefProp:function(a){var b=void 0;if(a.hasAttribute("href"))b="href";else{if(!a.hasAttribute("src"))return;b="src"}var c=axe.utils.getFriendlyUriEnd(a.getAttribute(b));if(c)return"["+b+'$="'+encodeURI(c)+'"]'},getCommonName:function(a,b){var c=b.nodeName;if(b.isCommonElm)return c}};axe.utils.getSelector=function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!a)return"";var c=a.getRootNode&&a.getRootNode()||document;if(11===c.nodeType){for(var d=[];11===c.nodeType;)d.push({elm:a,doc:c}),a=c.host,c=a.getRootNode();return d.push({elm:a,doc:c}),d.reverse().map(function(a){return W(a.elm,b,a.doc)})}return W(a,b,c)},axe.utils.getXpath=function(a){return Y(X(a))};var Ca;axe.utils.injectStyle=Z,axe.utils.isHidden=function(a,b){"use strict";var c;if(9===a.nodeType)return!1;11===a.nodeType&&(a=a.host);var d=window.getComputedStyle(a,null);return!d||!a.parentNode||"none"===d.getPropertyValue("display")||!b&&"hidden"===d.getPropertyValue("visibility")||"true"===a.getAttribute("aria-hidden")||(c=a.assignedSlot?a.assignedSlot:a.parentNode,axe.utils.isHidden(c,!0))},axe.utils.mergeResults=function(a,b){"use strict";var c=[];return a.forEach(function(a){var d=aa(a);d&&d.length&&d.forEach(function(d){d.nodes&&a.frame&&$(d.nodes,b,a.frameElement,a.frame);var e=axe.utils.findBy(c,"id",d.id);e?d.nodes.length&&_(e.nodes,d.nodes):c.push(d)})}),c},axe.utils.nodeSorter=function(a,b){"use strict";return a.actualNode===b.actualNode?0:4&a.actualNode.compareDocumentPosition(b.actualNode)?-1:1},utils.performanceTimer=function(){"use strict";function a(){if(window.performance&&window.performance)return window.performance.now()}var b=null,c=a();return{start:function(){this.mark("mark_axe_start")},end:function(){this.mark("mark_axe_end"),this.measure("axe","mark_axe_start","mark_axe_end"),this.logMeasures("axe")},auditStart:function(){this.mark("mark_audit_start")},auditEnd:function(){this.mark("mark_audit_end"),this.measure("audit_start_to_end","mark_audit_start","mark_audit_end"),this.logMeasures()},mark:function(a){window.performance&&void 0!==window.performance.mark&&window.performance.mark(a)},measure:function(a,b,c){window.performance&&void 0!==window.performance.measure&&window.performance.measure(a,b,c)},logMeasures:function(a){function b(a){axe.log("Measure "+a.name+" took "+a.duration+"ms")}if(window.performance&&void 0!==window.performance.getEntriesByType)for(var c=window.performance.getEntriesByType("measure"),d=0;d<c.length;++d){var e=c[d];if(e.name===a)return void b(e);b(e)}},timeElapsed:function(){return a()-c},reset:function(){b||(b=a()),c=a()}}}(),"function"!=typeof Object.assign&&function(){Object.assign=function(a){"use strict";if(void 0===a||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)d.hasOwnProperty(e)&&(b[e]=d[e])}return b}}(),Array.prototype.find||(Array.prototype.find=function(a){if(null===this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof a)throw new TypeError("predicate must be a function");for(var b,c=Object(this),d=c.length>>>0,e=arguments[1],f=0;f<d;f++)if(b=c[f],a.call(e,b,f,c))return b}),axe.utils.pollyfillElementsFromPoint=function(){if(document.elementsFromPoint)return document.elementsFromPoint;if(document.msElementsFromPoint)return document.msElementsFromPoint;var a=function(){var a=document.createElement("x");return a.style.cssText="pointer-events:auto","auto"===a.style.pointerEvents}(),b=a?"pointer-events":"visibility",c=a?"none":"hidden",d=document.createElement("style");return d.innerHTML=a?"* { pointer-events: all }":"* { visibility: visible }",function(a,e){var f,g,h,i=[],j=[];for(document.head.appendChild(d);(f=document.elementFromPoint(a,e))&&-1===i.indexOf(f);)i.push(f),j.push({value:f.style.getPropertyValue(b),priority:f.style.getPropertyPriority(b)}),f.style.setProperty(b,c,"important");for(g=j.length;h=j[--g];)i[g].style.setProperty(b,h.value?h.value:"",h.priority);return document.head.removeChild(d),i}},"function"==typeof window.addEventListener&&(document.elementsFromPoint=axe.utils.pollyfillElementsFromPoint()),Array.prototype.includes||(Array.prototype.includes=function(a){"use strict";var b=Object(this),c=parseInt(b.length,10)||0;if(0===c)return!1;var d,e=parseInt(arguments[1],10)||0;e>=0?d=e:(d=c+e)<0&&(d=0);for(var f;d<c;){if(f=b[d],a===f||a!==a&&f!==f)return!0;d++}return!1}),Array.prototype.some||(Array.prototype.some=function(a){"use strict";if(null==this)throw new TypeError("Array.prototype.some called on null or undefined");if("function"!=typeof a)throw new TypeError;for(var b=Object(this),c=b.length>>>0,d=arguments.length>=2?arguments[1]:void 0,e=0;e<c;e++)if(e in b&&a.call(d,b[e],e,b))return!0;return!1}),Array.from||(Array.from=function(){var a=Object.prototype.toString,b=function(b){return"function"==typeof b||"[object Function]"===a.call(b)},c=function(a){var b=Number(a);return isNaN(b)?0:0!==b&&isFinite(b)?(b>0?1:-1)*Math.floor(Math.abs(b)):b},d=Math.pow(2,53)-1,e=function(a){var b=c(a);return Math.min(Math.max(b,0),d)};return function(a){var c=this,d=Object(a);if(null==a)throw new TypeError("Array.from requires an array-like object - not null or undefined");var f,g=arguments.length>1?arguments[1]:void 0;if(void 0!==g){if(!b(g))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(f=arguments[2])}for(var h,i=e(d.length),j=b(c)?Object(new c(i)):new Array(i),k=0;k<i;)h=d[k],j[k]=g?void 0===f?g(h,k):g.call(f,h,k):h,k+=1;return j.length=i,j}}()),String.prototype.includes||(String.prototype.includes=function(a,b){return"number"!=typeof b&&(b=0),!(b+a.length>this.length)&&-1!==this.indexOf(a,b)});var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};axe.utils.publishMetaData=function(a){"use strict";var b=axe._audit.data.checks||{},c=axe._audit.data.rules||{},d=axe.utils.findBy(axe._audit.rules,"id",a.id)||{};a.tags=axe.utils.clone(d.tags||[]);var e=ca(b,!0),f=ca(b,!1);a.nodes.forEach(function(a){a.any.forEach(e),a.all.forEach(e),a.none.forEach(f)}),axe.utils.extendMetaData(a,axe.utils.clone(c[a.id]||{}))};var Da=function(){},Ea=function(){},Fa=function(){/*! Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License */ +var a=/(?=[\-\[\]{}()*+?.\\\^$|,#\s])/g;return function(b){return b.replace(a,"\\")}}(),Ga=/\\/g;Da=function(a){return a.map(function(a){for(var b=[],c=a.rule;c;)b.push({tag:c.tagName?c.tagName.toLowerCase():"*",combinator:c.nestingOperator?c.nestingOperator:" ",id:c.id,attributes:ja(c.attrs),classes:ka(c.classNames),pseudos:la(c.pseudos)}),c=c.rule;return b})},Ea=function(a,b,c){return b.reduce(function(b,d){var e=a;return d.forEach(function(a,b){if(c=">"!==a.combinator&&c,-1===[" ",">"].indexOf(a.combinator))throw new Error("axe.utils.querySelectorAll does not support the combinator: "+a.combinator);e=e.reduce(function(d,e){return d.concat(ia(b?e.children:e,a,c))},[])}),b.concat(e)},[])},axe.utils.querySelectorAll=function(a,b){a=Array.isArray(a)?a:[a];var c=axe.utils.cssParser.parse(b);return c=c.selectors?c.selectors:[c],c=Da(c),Ea(a,c,!0)};var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};!function(){"use strict";function a(){}function b(a){if("function"!=typeof a)throw new TypeError("Queue methods require functions as arguments")}function c(){function c(b){return function(c){g[b]=c,(i-=1)||j===a||(k=!0,j(g))}}function d(b){return j=a,m(b),g}function e(){for(var a=g.length;h<a;h++){var b=g[h];try{b.call(null,c(h),d)}catch(a){d(a)}}}var f,g=[],h=0,i=0,j=a,k=!1,l=function(a){f=a,setTimeout(function(){void 0!==f&&null!==f&&axe.log("Uncaught error (of queue)",f)},1)},m=l,n={defer:function(a){if("object"===(void 0===a?"undefined":qa(a))&&a.then&&a.catch){var c=a;a=function(a,b){c.then(a).catch(b)}}if(b(a),void 0===f){if(k)throw new Error("Queue already completed");return g.push(a),++i,e(),n}},then:function(c){if(b(c),j!==a)throw new Error("queue `then` already set");return f||(j=c,i||(k=!0,j(g))),n},catch:function(a){if(b(a),m!==l)throw new Error("queue `catch` already set");return f?(a(f),f=null):m=a,n},abort:d};return n}axe.utils.queue=c}();var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};!function(a){"use strict";function b(){var a="axe",b="";return void 0!==axe&&axe._audit&&!axe._audit.application&&(a=axe._audit.application),void 0!==axe&&(b=axe.version),a+"."+b}function c(a){if("object"===(void 0===a?"undefined":qa(a))&&"string"==typeof a.uuid&&!0===a._respondable){var c=b();return a._source===c||"axe.x.y.z"===a._source||"axe.x.y.z"===c}return!1}function d(a,c,d,e,f,g){var h;d instanceof Error&&(h={name:d.name,message:d.message,stack:d.stack},d=void 0);var i={uuid:e,topic:c,message:d,error:h,_respondable:!0,_source:b(),_keepalive:f};"function"==typeof g&&(j[e]=g),a.postMessage(JSON.stringify(i),"*")}function e(a,b,c,e,f){d(a,b,c,Ha.v1(),e,f)}function f(a,b,c){return function(e,f,g){d(a,b,e,c,f,g)}}function g(a,b,c){var d=b.topic,e=k[d];if(e){var g=f(a,null,b.uuid);e(b.message,c,g)}}function h(a){var b=a.message||"Unknown error occurred",c=window[a.name]||Error;return a.stack&&(b+="\n"+a.stack.replace(a.message,"")),new c(b)}function i(a){var b;if("string"==typeof a){try{b=JSON.parse(a)}catch(a){}if(c(b))return"object"===qa(b.error)?b.error=h(b.error):b.error=void 0,b}}var j={},k={};e.subscribe=function(a,b){k[a]=b},e.isInFrame=function(a){return a=a||window,!!a.frameElement},"function"==typeof window.addEventListener&&window.addEventListener("message",function(a){var b=i(a.data);if(b){var c=b.uuid,e=b._keepalive,h=j[c];if(h){h(b.error||b.message,e,f(a.source,b.topic,c)),e||delete j[c]}if(!b.error)try{g(a.source,b,e)}catch(e){d(a.source,b.topic,e,c,!1)}}},!1),a.respondable=e}(utils),axe.utils.ruleShouldRun=function(a,b,c){"use strict";var d=c.runOnly||{},e=(c.rules||{})[a.id];return!(a.pageLevel&&!b.page)&&("rule"===d.type?-1!==d.values.indexOf(a.id):e&&"boolean"==typeof e.enabled?e.enabled:"tag"===d.type&&d.values?ma(a,d.values):ma(a,[]))},axe.utils.select=function(a,b){"use strict";for(var c,d=[],e=0,f=b.include.length;e<f;e++)c=b.include[e],c.actualNode.nodeType===c.actualNode.ELEMENT_NODE&&axe.utils.matchesSelector(c.actualNode,a)&&pa(d,[c],b),pa(d,axe.utils.querySelectorAll(c,a),b);return d.sort(axe.utils.nodeSorter)},axe.utils.toArray=function(a){"use strict";return Array.prototype.slice.call(a)};var Ha;!function(a){function b(a,b,c){var d=b&&c||0,e=0;for(b=b||[],a.toLowerCase().replace(/[0-9a-f]{2}/g,function(a){e<16&&(b[d+e++]=l[a])});e<16;)b[d+e++]=0;return b}function c(a,b){var c=b||0,d=k;return d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]}function d(a,b,d){var e=b&&d||0,f=b||[];a=a||{};var g=null!=a.clockseq?a.clockseq:p,h=null!=a.msecs?a.msecs:(new Date).getTime(),i=null!=a.nsecs?a.nsecs:r+1,j=h-q+(i-r)/1e4;if(j<0&&null==a.clockseq&&(g=g+1&16383),(j<0||h>q)&&null==a.nsecs&&(i=0),i>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");q=h,r=i,p=g,h+=122192928e5;var k=(1e4*(268435455&h)+i)%4294967296;f[e++]=k>>>24&255,f[e++]=k>>>16&255,f[e++]=k>>>8&255,f[e++]=255&k;var l=h/4294967296*1e4&268435455;f[e++]=l>>>8&255,f[e++]=255&l,f[e++]=l>>>24&15|16,f[e++]=l>>>16&255,f[e++]=g>>>8|128,f[e++]=255&g;for(var m=a.node||o,n=0;n<6;n++)f[e+n]=m[n];return b||c(f)}function e(a,b,d){var e=b&&d||0;"string"==typeof a&&(b="binary"==a?new j(16):null,a=null),a=a||{};var g=a.random||(a.rng||f)();if(g[6]=15&g[6]|64,g[8]=63&g[8]|128,b)for(var h=0;h<16;h++)b[e+h]=g[h];return b||c(g)}var f,g=a.crypto||a.msCrypto;if(!f&&g&&g.getRandomValues){var h=new Uint8Array(16);f=function(){return g.getRandomValues(h),h}}if(!f){var i=new Array(16);f=function(){for(var a,b=0;b<16;b++)0==(3&b)&&(a=4294967296*Math.random()),i[b]=a>>>((3&b)<<3)&255;return i}}for(var j="function"==typeof a.Buffer?a.Buffer:Array,k=[],l={},m=0;m<256;m++)k[m]=(m+256).toString(16).substr(1),l[k[m]]=m;var n=f(),o=[1|n[0],n[1],n[2],n[3],n[4],n[5]],p=16383&(n[6]<<8|n[7]),q=0,r=0;Ha=e,Ha.v1=d,Ha.v4=e,Ha.parse=b,Ha.unparse=c,Ha.BufferClass=j}(window),axe._load({data:{rules:{accesskeys:{description:"Ensures every accesskey attribute value is unique",help:"accesskey attribute value must be unique"},"area-alt":{description:"Ensures <area> elements of image maps have alternate text",help:"Active <area> elements must have alternate text"},"aria-allowed-attr":{description:"Ensures ARIA attributes are allowed for an element's role",help:"Elements must only use allowed ARIA attributes"},"aria-hidden-body":{description:"Ensures aria-hidden='true' is not present on the document body.",help:"aria-hidden='true' must not be present on the document body"},"aria-required-attr":{description:"Ensures elements with ARIA roles have all required ARIA attributes",help:"Required ARIA attributes must be provided"},"aria-required-children":{description:"Ensures elements with an ARIA role that require child roles contain them",help:"Certain ARIA roles must contain particular children"},"aria-required-parent":{description:"Ensures elements with an ARIA role that require parent roles are contained by them",help:"Certain ARIA roles must be contained by particular parents"},"aria-roles":{description:"Ensures all elements with a role attribute use a valid value",help:"ARIA roles used must conform to valid values"},"aria-valid-attr-value":{description:"Ensures all ARIA attributes have valid values",help:"ARIA attributes must conform to valid values"},"aria-valid-attr":{description:"Ensures attributes that begin with aria- are valid ARIA attributes",help:"ARIA attributes must conform to valid names"},"audio-caption":{description:"Ensures <audio> elements have captions",help:"<audio> elements must have a captions track"},blink:{description:"Ensures <blink> elements are not used",help:"<blink> elements are deprecated and must not be used"},"button-name":{description:"Ensures buttons have discernible text",help:"Buttons must have discernible text"},bypass:{description:"Ensures each page has at least one mechanism for a user to bypass navigation and jump straight to the content",help:"Page must have means to bypass repeated blocks"},checkboxgroup:{description:'Ensures related <input type="checkbox"> elements have a group and that that group designation is consistent',help:"Checkbox inputs with the same name attribute value must be part of a group"},"color-contrast":{description:"Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds",help:"Elements must have sufficient color contrast"},"definition-list":{description:"Ensures <dl> elements are structured correctly",help:"<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script> or <template> elements"},dlitem:{description:"Ensures <dt> and <dd> elements are contained by a <dl>",help:"<dt> and <dd> elements must be contained by a <dl>"},"document-title":{description:"Ensures each HTML document contains a non-empty <title> element",help:"Documents must have <title> element to aid in navigation"},"duplicate-id":{description:"Ensures every id attribute value is unique",help:"id attribute value must be unique"},"empty-heading":{description:"Ensures headings have discernible text",help:"Headings must not be empty"},"frame-title-unique":{description:"Ensures <iframe> and <frame> elements contain a unique title attribute",help:"Frames must have a unique title attribute"},"frame-title":{description:"Ensures <iframe> and <frame> elements contain a non-empty title attribute",help:"Frames must have title attribute"},"heading-order":{description:"Ensures the order of headings is semantically correct",help:"Heading levels should only increase by one"},"hidden-content":{description:"Informs users about hidden content.",help:"Hidden content on the page cannot be analyzed"},"href-no-hash":{description:"Ensures that href values are valid link references to promote only using anchors as links",help:"Anchors must only be used as links with valid URLs or URL fragments"},"html-has-lang":{description:"Ensures every HTML document has a lang attribute",help:"<html> element must have a lang attribute"},"html-lang-valid":{description:"Ensures the lang attribute of the <html> element has a valid value",help:"<html> element must have a valid value for the lang attribute"},"image-alt":{description:"Ensures <img> elements have alternate text or a role of none or presentation",help:"Images must have alternate text"},"image-redundant-alt":{description:"Ensure button and link text is not repeated as image alternative",help:"Text of buttons and links should not be repeated in the image alternative"},"input-image-alt":{description:'Ensures <input type="image"> elements have alternate text',help:"Image buttons must have alternate text"},"label-title-only":{description:"Ensures that every form element is not solely labeled using the title or aria-describedby attributes",help:"Form elements should have a visible label"},label:{description:"Ensures every form element has a label",help:"Form elements must have labels"},"layout-table":{description:"Ensures presentational <table> elements do not use <th>, <caption> elements or the summary attribute",help:"Layout tables must not use data table elements"},"link-in-text-block":{description:"Links can be distinguished without relying on color",help:"Links must be distinguished from surrounding text in a way that does not rely on color"},"link-name":{description:"Ensures links have discernible text",help:"Links must have discernible text"},list:{description:"Ensures that lists are structured correctly",help:"<ul> and <ol> must only directly contain <li>, <script> or <template> elements"},listitem:{description:"Ensures <li> elements are used semantically",help:"<li> elements must be contained in a <ul> or <ol>"},marquee:{description:"Ensures <marquee> elements are not used",help:"<marquee> elements are deprecated and must not be used"},"meta-refresh":{description:'Ensures <meta http-equiv="refresh"> is not used',help:"Timed refresh must not exist"},"meta-viewport-large":{description:'Ensures <meta name="viewport"> can scale a significant amount',help:"Users should be able to zoom and scale the text up to 500%"},"meta-viewport":{description:'Ensures <meta name="viewport"> does not disable text scaling and zooming',help:"Zooming and scaling must not be disabled"},"object-alt":{description:"Ensures <object> elements have alternate text",help:"<object> elements must have alternate text"},"p-as-heading":{description:"Ensure p elements are not used to style headings",help:"Bold, italic text and font-size are not used to style p elements as a heading"},radiogroup:{description:'Ensures related <input type="radio"> elements have a group and that the group designation is consistent',help:"Radio inputs with the same name attribute value must be part of a group"},region:{description:"Ensures all content is contained within a landmark region",help:"Content should be contained in a landmark region"},"scope-attr-valid":{description:"Ensures the scope attribute is used correctly on tables",help:"scope attribute should be used correctly"},"server-side-image-map":{description:"Ensures that server-side image maps are not used",help:"Server-side image maps must not be used"},"skip-link":{description:"Ensures the first link on the page is a skip link",help:"The page should have a skip link as its first link"},tabindex:{description:"Ensures tabindex attribute values are not greater than 0",help:"Elements should not have tabindex greater than zero"},"table-duplicate-name":{description:"Ensure that tables do not have the same summary and caption",help:"The <caption> element should not contain the same text as the summary attribute"},"table-fake-caption":{description:"Ensure that tables with a caption use the <caption> element.",help:"Data or header cells should not be used to give caption to a data table."},"td-has-header":{description:"Ensure that each non-empty data cell in a large table has one or more table headers",help:"All non-empty td element in table larger than 3 by 3 must have an associated table header"},"td-headers-attr":{description:"Ensure that each cell in a table using the headers refers to another cell in that table",help:"All cells in a table element that use the headers attribute must only refer to other cells of that same table"},"th-has-data-cells":{description:"Ensure that each table header in a data table refers to data cells",help:"All th element and elements with role=columnheader/rowheader must data cells which it describes"},"valid-lang":{description:"Ensures lang attributes have valid values",help:"lang attribute must have a valid value"},"video-caption":{description:"Ensures <video> elements have captions",help:"<video> elements must have captions"},"video-description":{description:"Ensures <video> elements have audio descriptions",help:"<video> elements must have an audio description track"}},checks:{accesskeys:{impact:"critical",messages:{pass:function(a){return"Accesskey attribute value is unique"},fail:function(a){return"Document has multiple elements with the same accesskey"}}},"non-empty-alt":{impact:"critical",messages:{pass:function(a){return"Element has a non-empty alt attribute"},fail:function(a){return"Element has no alt attribute or the alt attribute is empty"}}},"non-empty-title":{impact:"critical",messages:{pass:function(a){return"Element has a title attribute"},fail:function(a){return"Element has no title attribute or the title attribute is empty"}}},"aria-label":{impact:"critical",messages:{pass:function(a){return"aria-label attribute exists and is not empty"},fail:function(a){return"aria-label attribute does not exist or is empty"}}},"aria-labelledby":{impact:"critical",messages:{pass:function(a){return"aria-labelledby attribute exists and references elements that are visible to screen readers"},fail:function(a){return"aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty or not visible"}}},"aria-allowed-attr":{impact:"critical",messages:{pass:function(a){return"ARIA attributes are used correctly for the defined role"},fail:function(a){var b="ARIA attribute"+(a.data&&a.data.length>1?"s are":" is")+" not allowed:",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=" "+d;return b}}},"aria-hidden-body":{impact:"critical",messages:{pass:function(a){return"No aria-hidden attribute is present on document body"},fail:function(a){return"aria-hidden=true should not be present on the document body"}}},"aria-required-attr":{impact:"critical",messages:{pass:function(a){return"All required ARIA attributes are present"},fail:function(a){var b="Required ARIA attribute"+(a.data&&a.data.length>1?"s":"")+" not present:",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=" "+d;return b}}},"aria-required-children":{impact:"critical",messages:{pass:function(a){return"Required ARIA children are present"},fail:function(a){var b="Required ARIA "+(a.data&&a.data.length>1?"children":"child")+" role not present:",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=" "+d;return b}}},"aria-required-parent":{impact:"critical",messages:{pass:function(a){return"Required ARIA parent role present"},fail:function(a){var b="Required ARIA parent"+(a.data&&a.data.length>1?"s":"")+" role not present:",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=" "+d;return b}}},invalidrole:{impact:"critical",messages:{pass:function(a){return"ARIA role is valid"},fail:function(a){return"Role must be one of the valid ARIA roles"}}},abstractrole:{impact:"serious",messages:{pass:function(a){return"Abstract roles are not used"},fail:function(a){return"Abstract roles cannot be directly used"}}},"aria-valid-attr-value":{impact:"critical",messages:{pass:function(a){return"ARIA attribute values are valid"},fail:function(a){var b="Invalid ARIA attribute value"+(a.data&&a.data.length>1?"s":"")+":",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=" "+d;return b}}},"aria-valid-attr":{impact:"critical",messages:{pass:function(a){return"ARIA attribute name"+(a.data&&a.data.length>1?"s":"")+" are valid"},fail:function(a){var b="Invalid ARIA attribute name"+(a.data&&a.data.length>1?"s":"")+":",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=" "+d;return b}}},caption:{impact:"critical",messages:{pass:function(a){return"The multimedia element has a captions track"},fail:function(a){return"The multimedia element does not have a captions track"},incomplete:function(a){return"A captions track for this element could not be found"}}},"is-on-screen":{impact:"minor",messages:{pass:function(a){return"Element is not visible"},fail:function(a){return"Element is visible"}}},"non-empty-if-present":{impact:"critical",messages:{pass:function(a){var b="Element ";return a.data?b+="has a non-empty value attribute":b+="does not have a value attribute",b},fail:function(a){return"Element has a value attribute and the value attribute is empty"}}},"non-empty-value":{impact:"critical",messages:{pass:function(a){return"Element has a non-empty value attribute"},fail:function(a){return"Element has no value attribute or the value attribute is empty"}}},"button-has-visible-text":{impact:"critical",messages:{pass:function(a){return"Element has inner text that is visible to screen readers"},fail:function(a){return"Element does not have inner text that is visible to screen readers"}}},"role-presentation":{impact:"moderate",messages:{pass:function(a){return'Element\'s default semantics were overriden with role="presentation"'},fail:function(a){return'Element\'s default semantics were not overridden with role="presentation"'}}},"role-none":{impact:"moderate",messages:{pass:function(a){return'Element\'s default semantics were overriden with role="none"'},fail:function(a){return'Element\'s default semantics were not overridden with role="none"'}}},"focusable-no-name":{impact:"serious",messages:{pass:function(a){return"Element is not in tab order or has accessible text"},fail:function(a){return"Element is in tab order and does not have accessible text"}}},"internal-link-present":{impact:"critical",messages:{pass:function(a){return"Valid skip link found"},fail:function(a){return"No valid skip link found"}}},"header-present":{impact:"moderate",messages:{pass:function(a){return"Page has a header"},fail:function(a){return"Page does not have a header"}}},landmark:{impact:"serious",messages:{pass:function(a){return"Page has a landmark region"},fail:function(a){return"Page does not have a landmark region"}}},"group-labelledby":{impact:"critical",messages:{pass:function(a){return'All elements with the name "'+a.data.name+'" reference the same element with aria-labelledby'},fail:function(a){return'All elements with the name "'+a.data.name+'" do not reference the same element with aria-labelledby'}}},fieldset:{impact:"critical",messages:{pass:function(a){return"Element is contained in a fieldset"},fail:function(a){var b="",c=a.data&&a.data.failureCode;return b+="no-legend"===c?"Fieldset does not have a legend as its first child":"empty-legend"===c?"Legend does not have text that is visible to screen readers":"mixed-inputs"===c?"Fieldset contains unrelated inputs":"no-group-label"===c?"ARIA group does not have aria-label or aria-labelledby":"group-mixed-inputs"===c?"ARIA group contains unrelated inputs":"Element does not have a containing fieldset or ARIA group"}}},"color-contrast":{impact:"serious",messages:{pass:function(a){return"Element has sufficient color contrast of "+a.data.contrastRatio},fail:function(a){return"Element has insufficient color contrast of "+a.data.contrastRatio+" (foreground color: "+a.data.fgColor+", background color: "+a.data.bgColor+", font size: "+a.data.fontSize+", font weight: "+a.data.fontWeight+")"},incomplete:{bgImage:"Element's background color could not be determined due to a background image",bgGradient:"Element's background color could not be determined due to a background gradient",imgNode:"Element's background color could not be determined because element contains an image node",bgOverlap:"Element's background color could not be determined because it is overlapped by another element",fgAlpha:"Element's foreground color could not be determined because of alpha transparency",elmPartiallyObscured:"Element's background color could not be determined because it's partially obscured by another element",equalRatio:"Element has a 1:1 contrast ratio with the background",default:"Unable to determine contrast ratio"}}},"structured-dlitems":{impact:"serious",messages:{pass:function(a){return"When not empty, element has both <dt> and <dd> elements"},fail:function(a){return"When not empty, element does not have at least one <dt> element followed by at least one <dd> element"}}},"only-dlitems":{impact:"serious",messages:{pass:function(a){return"List element only has direct children that are allowed inside <dt> or <dd> elements"},fail:function(a){return"List element has direct children that are not allowed inside <dt> or <dd> elements"}}},dlitem:{impact:"serious",messages:{pass:function(a){return"Description list item has a <dl> parent element"},fail:function(a){return"Description list item does not have a <dl> parent element"}}},"doc-has-title":{impact:"moderate",messages:{pass:function(a){return"Document has a non-empty <title> element"},fail:function(a){return"Document does not have a non-empty <title> element"}}},"duplicate-id":{impact:"moderate",messages:{pass:function(a){return"Document has no elements that share the same id attribute"},fail:function(a){return"Document has multiple elements with the same id attribute: "+a.data}}},"has-visible-text":{impact:"moderate",messages:{pass:function(a){return"Element has text that is visible to screen readers"},fail:function(a){return"Element does not have text that is visible to screen readers"}}},"unique-frame-title":{impact:"serious",messages:{pass:function(a){return"Element's title attribute is unique"},fail:function(a){return"Element's title attribute is not unique"}}},"heading-order":{impact:"minor",messages:{pass:function(a){return"Heading order valid"},fail:function(a){return"Heading order invalid"}}},"hidden-content":{impact:"minor",messages:{pass:function(a){return"All content on the page has been analyzed."},fail:function(a){return"There were problems analyzing the content on this page."},incomplete:function(a){return"There is hidden content on the page that was not analyzed. You will need to trigger the display of this content in order to analyze it."}}},"href-no-hash":{impact:"moderate",messages:{pass:function(a){return"Anchor does not have an href value of #"},fail:function(a){return"Anchor has an href value of #"}}},"has-lang":{impact:"serious",messages:{pass:function(a){return"The <html> element has a lang attribute"},fail:function(a){return"The <html> element does not have a lang attribute"}}},"valid-lang":{impact:"serious",messages:{pass:function(a){return"Value of lang attribute is included in the list of valid languages"},fail:function(a){return"Value of lang attribute not included in the list of valid languages"}}},"has-alt":{impact:"critical",messages:{pass:function(a){return"Element has an alt attribute"},fail:function(a){return"Element does not have an alt attribute"}}},"duplicate-img-label":{impact:"minor",messages:{pass:function(a){return"Element does not duplicate existing text in <img> alt text"},fail:function(a){return"Element contains <img> element with alt text that duplicates existing text"}}},"title-only":{impact:"serious",messages:{pass:function(a){return"Form element does not solely use title attribute for its label"},fail:function(a){return"Only title used to generate label for form element"}}},"implicit-label":{impact:"critical",messages:{pass:function(a){return"Form element has an implicit (wrapped) <label>"},fail:function(a){return"Form element does not have an implicit (wrapped) <label>"}}},"explicit-label":{impact:"critical",messages:{pass:function(a){return"Form element has an explicit <label>"},fail:function(a){return"Form element does not have an explicit <label>"}}},"help-same-as-label":{impact:"minor",messages:{pass:function(a){return"Help text (title or aria-describedby) does not duplicate label text"},fail:function(a){return"Help text (title or aria-describedby) text is the same as the label text"}}},"multiple-label":{impact:"serious",messages:{pass:function(a){return"Form element does not have multiple <label> elements"},fail:function(a){return"Form element has multiple <label> elements"}}},"has-th":{impact:"serious",messages:{pass:function(a){return"Layout table does not use <th> elements"},fail:function(a){return"Layout table uses <th> elements"}}},"has-caption":{impact:"serious",messages:{pass:function(a){return"Layout table does not use <caption> element"},fail:function(a){return"Layout table uses <caption> element"}}},"has-summary":{impact:"serious",messages:{pass:function(a){return"Layout table does not use summary attribute"},fail:function(a){return"Layout table uses summary attribute"}}},"link-in-text-block":{impact:"critical",messages:{pass:function(a){return"Links can be distinguished from surrounding text in a way that does not rely on color"},fail:function(a){return"Links can not be distinguished from surrounding text in a way that does not rely on color"},incomplete:{bgContrast:"Element's contrast ratio could not be determined. Check for a distinct hover/focus style",bgImage:"Element's contrast ratio could not be determined due to a background image",bgGradient:"Element's contrast ratio could not be determined due to a background gradient",imgNode:"Element's contrast ratio could not be determined because element contains an image node",bgOverlap:"Element's contrast ratio could not be determined because of element overlap",default:"Unable to determine contrast ratio"}}},"only-listitems":{impact:"serious",messages:{pass:function(a){return"List element only has direct children that are allowed inside <li> elements"},fail:function(a){return"List element has direct children that are not allowed inside <li> elements"}}},listitem:{impact:"critical",messages:{pass:function(a){return'List item has a <ul>, <ol> or role="list" parent element'},fail:function(a){return'List item does not have a <ul>, <ol> or role="list" parent element'}}},"meta-refresh":{impact:"critical",messages:{pass:function(a){return"<meta> tag does not immediately refresh the page"},fail:function(a){return"<meta> tag forces timed refresh of page"}}},"meta-viewport-large":{impact:"minor",messages:{pass:function(a){return"<meta> tag does not prevent significant zooming"},fail:function(a){return"<meta> tag limits zooming"}}},"meta-viewport":{impact:"critical",messages:{pass:function(a){return"<meta> tag does not disable zooming"},fail:function(a){return"<meta> tag disables zooming"}}},"p-as-heading":{impact:"critical",messages:{pass:function(a){return"<p> elements are not styled as headings"},fail:function(a){return"Heading elements should be used instead of styled p elements"}}},region:{impact:"moderate",messages:{pass:function(a){return"Content contained by ARIA landmark"},fail:function(a){return"Content not contained by an ARIA landmark"}}},"html5-scope":{impact:"serious",messages:{pass:function(a){return"Scope attribute is only used on table header elements (<th>)"},fail:function(a){return"In HTML 5, scope attributes may only be used on table header elements (<th>)"}}},"scope-value":{impact:"critical",messages:{pass:function(a){return"Scope attribute is used correctly"},fail:function(a){return"The value of the scope attribute may only be 'row' or 'col'"}}},exists:{impact:"minor",messages:{pass:function(a){return"Element does not exist"},fail:function(a){return"Element exists"}}},"skip-link":{impact:"critical",messages:{pass:function(a){return"Valid skip link found"},fail:function(a){return"No valid skip link found"}}},tabindex:{impact:"serious",messages:{pass:function(a){return"Element does not have a tabindex greater than 0"},fail:function(a){return"Element has a tabindex greater than 0"}}},"same-caption-summary":{impact:"moderate",messages:{pass:function(a){return"Content of summary attribute and <caption> are not duplicated"},fail:function(a){return"Content of summary attribute and <caption> element are identical"}}},"caption-faked":{impact:"critical",messages:{pass:function(a){return"The first row of a table is not used as a caption"},fail:function(a){return"The first row of the table should be a caption instead of a table cell"}}},"td-has-header":{impact:"critical",messages:{pass:function(a){return"All non-empty data cells have table headers"},fail:function(a){return"Some non-empty data cells do not have table headers"}}},"td-headers-attr":{impact:"serious",messages:{pass:function(a){return"The headers attribute is exclusively used to refer to other cells in the table"},fail:function(a){return"The headers attribute is not exclusively used to refer to other cells in the table"}}},"th-has-data-cells":{impact:"critical",messages:{pass:function(a){return"All table header cells refer to data cells"},fail:function(a){return"Not all table header cells refer to data cells"},incomplete:function(a){return"Table data cells are missing or empty"}}},description:{impact:"serious",messages:{pass:function(a){return"The multimedia element has an audio description track"},fail:function(a){return"The multimedia element does not have an audio description track"},incomplete:function(a){return"An audio description track for this element could not be found"}}}},failureSummaries:{any:{failureMessage:function(a){var b="Fix any of the following:",c=a;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+="\n "+d.split("\n").join("\n ");return b}},none:{failureMessage:function(a){ +var b="Fix all of the following:",c=a;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+="\n "+d.split("\n").join("\n ");return b}}},incompleteFallbackMessage:function(a){return"aXe couldn't tell the reason. Time to break out the element inspector!"}},rules:[{id:"accesskeys",selector:"[accesskey]",excludeHidden:!1,tags:["wcag2a","wcag211","cat.keyboard"],all:[],any:[],none:["accesskeys"]},{id:"area-alt",selector:"map area[href]",excludeHidden:!1,tags:["cat.text-alternatives","wcag2a","wcag111","section508","section508.22.a"],all:[],any:["non-empty-alt","non-empty-title","aria-label","aria-labelledby"],none:[]},{id:"aria-allowed-attr",matches:function(a){var b=a.getAttribute("role");b||(b=axe.commons.aria.implicitRole(a));var c=axe.commons.aria.allowedAttr(b);if(b&&c){var d=/^aria-/;if(a.hasAttributes())for(var e=a.attributes,f=0,g=e.length;f<g;f++)if(d.test(e[f].name))return!0}return!1},tags:["cat.aria","wcag2a","wcag411","wcag412"],all:[],any:["aria-allowed-attr"],none:[]},{id:"aria-hidden-body",selector:"body",excludeHidden:!1,tags:["cat.aria","wcag2a","wcag412"],all:[],any:["aria-hidden-body"],none:[]},{id:"aria-required-attr",selector:"[role]",tags:["cat.aria","wcag2a","wcag411","wcag412"],all:[],any:["aria-required-attr"],none:[]},{id:"aria-required-children",selector:"[role]",tags:["cat.aria","wcag2a","wcag131"],all:[],any:["aria-required-children"],none:[]},{id:"aria-required-parent",selector:"[role]",tags:["cat.aria","wcag2a","wcag131"],all:[],any:["aria-required-parent"],none:[]},{id:"aria-roles",selector:"[role]",tags:["cat.aria","wcag2a","wcag131","wcag411","wcag412"],all:[],any:[],none:["invalidrole","abstractrole"]},{id:"aria-valid-attr-value",matches:function(a){var b=/^aria-/;if(a.hasAttributes())for(var c=a.attributes,d=0,e=c.length;d<e;d++)if(b.test(c[d].name))return!0;return!1},tags:["cat.aria","wcag2a","wcag131","wcag411","wcag412"],all:[],any:[{options:[],id:"aria-valid-attr-value"}],none:[]},{id:"aria-valid-attr",matches:function(a){var b=/^aria-/;if(a.hasAttributes())for(var c=a.attributes,d=0,e=c.length;d<e;d++)if(b.test(c[d].name))return!0;return!1},tags:["cat.aria","wcag2a","wcag411"],all:[],any:[{options:[],id:"aria-valid-attr"}],none:[]},{id:"audio-caption",selector:"audio",excludeHidden:!1,tags:["cat.time-and-media","wcag2a","wcag122","section508","section508.22.a"],all:[],any:[],none:["caption"]},{id:"blink",selector:"blink",excludeHidden:!1,tags:["cat.time-and-media","wcag2a","wcag222","section508","section508.22.j"],all:[],any:[],none:["is-on-screen"]},{id:"button-name",selector:'button, [role="button"], input[type="button"], input[type="submit"], input[type="reset"]',tags:["cat.name-role-value","wcag2a","wcag412","section508","section508.22.a"],all:[],any:["non-empty-if-present","non-empty-value","button-has-visible-text","aria-label","aria-labelledby","role-presentation","role-none"],none:["focusable-no-name"]},{id:"bypass",selector:"html",pageLevel:!0,matches:function(a){return!!a.querySelector("a[href]")},tags:["cat.keyboard","wcag2a","wcag241","section508","section508.22.o"],all:[],any:["internal-link-present","header-present","landmark"],none:[]},{id:"checkboxgroup",selector:"input[type=checkbox][name]",tags:["cat.forms","best-practice"],all:[],any:["group-labelledby","fieldset"],none:[]},{id:"color-contrast",matches:function(a){var b=a.nodeName.toUpperCase(),c=a.type,d=document;if("true"===a.getAttribute("aria-disabled")||axe.commons.dom.findUp(a,'[aria-disabled="true"]'))return!1;if("INPUT"===b)return-1===["hidden","range","color","checkbox","radio","image"].indexOf(c)&&!a.disabled;if("SELECT"===b)return!!a.options.length&&!a.disabled;if("TEXTAREA"===b)return!a.disabled;if("OPTION"===b)return!1;if("BUTTON"===b&&a.disabled||axe.commons.dom.findUp(a,"button[disabled]"))return!1;if("FIELDSET"===b&&a.disabled||axe.commons.dom.findUp(a,"fieldset[disabled]"))return!1;var e=axe.commons.dom.findUp(a,"label");if("LABEL"===b||e){var f=a;e&&(f=e);var g=f.htmlFor&&d.getElementById(f.htmlFor);if(g&&g.disabled)return!1;var g=a.querySelector('input:not([type="hidden"]):not([type="image"]):not([type="button"]):not([type="submit"]):not([type="reset"]), select, textarea');if(g&&g.disabled)return!1}if(a.id){var g=d.querySelector("[aria-labelledby~="+axe.commons.utils.escapeSelector(a.id)+"]");if(g&&g.disabled)return!1}if(""===axe.commons.text.visible(a,!1,!0))return!1;var h,i,j=document.createRange(),k=a.childNodes,l=k.length;for(i=0;i<l;i++)h=k[i],3===h.nodeType&&""!==axe.commons.text.sanitize(h.nodeValue)&&j.selectNodeContents(h);var m=j.getClientRects();for(l=m.length,i=0;i<l;i++)if(axe.commons.dom.visuallyOverlaps(m[i],a))return!0;return!1},excludeHidden:!1,options:{noScroll:!1},tags:["cat.color","wcag2aa","wcag143"],all:[],any:["color-contrast"],none:[]},{id:"definition-list",selector:"dl",matches:function(a){return!a.getAttribute("role")},tags:["cat.structure","wcag2a","wcag131"],all:[],any:[],none:["structured-dlitems","only-dlitems"]},{id:"dlitem",selector:"dd, dt",matches:function(a){return!a.getAttribute("role")},tags:["cat.structure","wcag2a","wcag131"],all:[],any:["dlitem"],none:[]},{id:"document-title",selector:"html",matches:function(a){return a.ownerDocument.defaultView.self===a.ownerDocument.defaultView.top},tags:["cat.text-alternatives","wcag2a","wcag242"],all:[],any:["doc-has-title"],none:[]},{id:"duplicate-id",selector:"[id]",excludeHidden:!1,tags:["cat.parsing","wcag2a","wcag411"],all:[],any:["duplicate-id"],none:[]},{id:"empty-heading",selector:'h1, h2, h3, h4, h5, h6, [role="heading"]',enabled:!0,tags:["cat.name-role-value","best-practice"],all:[],any:["has-visible-text","role-presentation","role-none"],none:[]},{id:"frame-title-unique",selector:"frame[title], iframe[title]",matches:function(a){var b=a.getAttribute("title");return!!(b?axe.commons.text.sanitize(b).trim():"")},tags:["cat.text-alternatives","best-practice"],all:[],any:[],none:["unique-frame-title"]},{id:"frame-title",selector:"frame, iframe",tags:["cat.text-alternatives","wcag2a","wcag241","section508","section508.22.i"],all:[],any:["aria-label","aria-labelledby","non-empty-title","role-presentation","role-none"],none:[]},{id:"heading-order",selector:"h1,h2,h3,h4,h5,h6,[role=heading]",enabled:!1,tags:["cat.semantics","best-practice"],all:[],any:["heading-order"],none:[]},{id:"hidden-content",selector:"*",excludeHidden:!1,tags:["experimental","review-item"],all:[],any:["hidden-content"],none:[],enabled:!1},{id:"href-no-hash",selector:"a[href]",enabled:!1,tags:["cat.semantics","best-practice"],all:[],any:["href-no-hash"],none:[]},{id:"html-has-lang",selector:"html",tags:["cat.language","wcag2a","wcag311"],all:[],any:["has-lang"],none:[]},{id:"html-lang-valid",selector:"html[lang]",tags:["cat.language","wcag2a","wcag311"],all:[],any:[],none:["valid-lang"]},{id:"image-alt",selector:"img, [role='img']",tags:["cat.text-alternatives","wcag2a","wcag111","section508","section508.22.a"],all:[],any:["has-alt","aria-label","aria-labelledby","non-empty-title","role-presentation","role-none"],none:[]},{id:"image-redundant-alt",selector:'button, [role="button"], a[href], p, li, td, th',tags:["cat.text-alternatives","best-practice"],all:[],any:[],none:["duplicate-img-label"]},{id:"input-image-alt",selector:'input[type="image"]',tags:["cat.text-alternatives","wcag2a","wcag111","section508","section508.22.a"],all:[],any:["non-empty-alt","aria-label","aria-labelledby","non-empty-title"],none:[]},{id:"label-title-only",selector:"input, select, textarea",matches:function(a){if("input"!==a.nodeName.toLowerCase())return!0;var b=a.getAttribute("type").toLowerCase();return"hidden"!==b&&"image"!==b&&"button"!==b&&"submit"!==b&&"reset"!==b},enabled:!1,tags:["cat.forms","best-practice"],all:[],any:[],none:["title-only"]},{id:"label",selector:"input, select, textarea",matches:function(a){if("input"!==a.nodeName.toLowerCase())return!0;var b=a.getAttribute("type").toLowerCase();return"hidden"!==b&&"image"!==b&&"button"!==b&&"submit"!==b&&"reset"!==b},tags:["cat.forms","wcag2a","wcag332","wcag131","section508","section508.22.n"],all:[],any:["aria-label","aria-labelledby","implicit-label","explicit-label","non-empty-title"],none:["help-same-as-label","multiple-label"]},{id:"layout-table",selector:"table",matches:function(a){return!axe.commons.table.isDataTable(a)},tags:["cat.semantics","wcag2a","wcag131"],all:[],any:[],none:["has-th","has-caption","has-summary"]},{id:"link-in-text-block",selector:"a[href], *[role=link]",matches:function(a){var b=axe.commons.text.sanitize(a.textContent),c=a.getAttribute("role");return(!c||"link"===c)&&(!!b&&(!!axe.commons.dom.isVisible(a,!1)&&axe.commons.dom.isInTextBlock(a)))},excludeHidden:!1,tags:["cat.color","experimental","wcag2a","wcag141"],all:["link-in-text-block"],any:[],none:[]},{id:"link-name",selector:"a[href], [role=link][href]",matches:function(a){return"button"!==a.getAttribute("role")},tags:["cat.name-role-value","wcag2a","wcag111","wcag412","section508","section508.22.a"],all:[],any:["has-visible-text","aria-label","aria-labelledby","role-presentation","role-none"],none:["focusable-no-name"]},{id:"list",selector:"ul, ol",matches:function(a){return!a.getAttribute("role")},tags:["cat.structure","wcag2a","wcag131"],all:[],any:[],none:["only-listitems"]},{id:"listitem",selector:"li",matches:function(a){return!a.getAttribute("role")},tags:["cat.structure","wcag2a","wcag131"],all:[],any:["listitem"],none:[]},{id:"marquee",selector:"marquee",excludeHidden:!1,tags:["cat.parsing","wcag2a","wcag222"],all:[],any:[],none:["is-on-screen"]},{id:"meta-refresh",selector:'meta[http-equiv="refresh"]',excludeHidden:!1,tags:["cat.time","wcag2a","wcag2aaa","wcag221","wcag224","wcag325"],all:[],any:["meta-refresh"],none:[]},{id:"meta-viewport-large",selector:'meta[name="viewport"]',excludeHidden:!1,tags:["cat.sensory-and-visual-cues","best-practice"],all:[],any:[{options:{scaleMinimum:5,lowerBound:2},id:"meta-viewport-large"}],none:[]},{id:"meta-viewport",selector:'meta[name="viewport"]',excludeHidden:!1,tags:["cat.sensory-and-visual-cues","wcag2aa","wcag144"],all:[],any:[{options:{scaleMinimum:2},id:"meta-viewport"}],none:[]},{id:"object-alt",selector:"object",tags:["cat.text-alternatives","wcag2a","wcag111","section508","section508.22.a"],all:[],any:["has-visible-text","aria-label","aria-labelledby","non-empty-title"],none:[]},{id:"p-as-heading",selector:"p",matches:function(a){var b=Array.from(a.parentNode.childNodes),c=a.textContent.trim(),d=/[.!?:;](?![.!?:;])/g;return!(0===c.length||(c.match(d)||[]).length>=2)&&0!==b.slice(b.indexOf(a)+1).filter(function(a){return"P"===a.nodeName.toUpperCase()&&""!==a.textContent.trim()}).length},tags:["cat.semantics","wcag2a","wcag131","experimental"],all:[{options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]},id:"p-as-heading"}],any:[],none:[]},{id:"radiogroup",selector:"input[type=radio][name]",tags:["cat.forms","best-practice"],all:[],any:["group-labelledby","fieldset"],none:[]},{id:"region",selector:"html",pageLevel:!0,enabled:!1,tags:["cat.keyboard","best-practice"],all:[],any:["region"],none:[]},{id:"scope-attr-valid",selector:"td[scope], th[scope]",enabled:!0,tags:["cat.tables","best-practice"],all:["html5-scope","scope-value"],any:[],none:[]},{id:"server-side-image-map",selector:"img[ismap]",tags:["cat.text-alternatives","wcag2a","wcag211","section508","section508.22.f"],all:[],any:[],none:["exists"]},{id:"skip-link",selector:"a[href]",pageLevel:!0,enabled:!1,tags:["cat.keyboard","best-practice"],all:[],any:["skip-link"],none:[]},{id:"tabindex",selector:"[tabindex]",tags:["cat.keyboard","best-practice"],all:[],any:["tabindex"],none:[]},{id:"table-duplicate-name",selector:"table",tags:["cat.tables","best-practice"],all:[],any:[],none:["same-caption-summary"]},{id:"table-fake-caption",selector:"table",matches:function(a){return axe.commons.table.isDataTable(a)},tags:["cat.tables","experimental","wcag2a","wcag131","section508","section508.22.g"],all:["caption-faked"],any:[],none:[]},{id:"td-has-header",selector:"table",matches:function(a){if(axe.commons.table.isDataTable(a)){var b=axe.commons.table.toArray(a);return b.length>=3&&b[0].length>=3&&b[1].length>=3&&b[2].length>=3}return!1},tags:["cat.tables","experimental","wcag2a","wcag131","section508","section508.22.g"],all:["td-has-header"],any:[],none:[]},{id:"td-headers-attr",selector:"table",tags:["cat.tables","wcag2a","wcag131","section508","section508.22.g"],all:["td-headers-attr"],any:[],none:[]},{id:"th-has-data-cells",selector:"table",matches:function(a){return axe.commons.table.isDataTable(a)},tags:["cat.tables","wcag2a","wcag131","section508","section508.22.g"],all:["th-has-data-cells"],any:[],none:[]},{id:"valid-lang",selector:"[lang], [xml\\:lang]",matches:function(a){return"html"!==a.nodeName.toLowerCase()},tags:["cat.language","wcag2aa","wcag312"],all:[],any:[],none:["valid-lang"]},{id:"video-caption",selector:"video",excludeHidden:!1,tags:["cat.text-alternatives","wcag2a","wcag122","wcag123","section508","section508.22.a"],all:[],any:[],none:["caption"]},{id:"video-description",selector:"video",excludeHidden:!1,tags:["cat.text-alternatives","wcag2aa","wcag125","section508","section508.22.b"],all:[],any:[],none:["description"]}],checks:[{id:"abstractrole",evaluate:function(a,b){return"abstract"===axe.commons.aria.getRoleType(a.getAttribute("role"))}},{id:"aria-allowed-attr",evaluate:function(a,b){var c,d,e,f=[],g=a.getAttribute("role"),h=a.attributes;if(g||(g=axe.commons.aria.implicitRole(a)),e=axe.commons.aria.allowedAttr(g),g&&e)for(var i=0,j=h.length;i<j;i++)c=h[i],d=c.name,axe.commons.aria.validateAttr(d)&&-1===e.indexOf(d)&&f.push(d+'="'+c.nodeValue+'"');return!f.length||(this.data(f),!1)}},{id:"aria-hidden-body",evaluate:function(a,b){return"true"!==a.getAttribute("aria-hidden")}},{id:"invalidrole",evaluate:function(a,b){return!axe.commons.aria.isValidRole(a.getAttribute("role"))}},{id:"aria-required-attr",evaluate:function(a,b){var c=[];if(a.hasAttributes()){var d,e=a.getAttribute("role"),f=axe.commons.aria.requiredAttr(e);if(e&&f)for(var g=0,h=f.length;g<h;g++)d=f[g],a.getAttribute(d)||c.push(d)}return!c.length||(this.data(c),!1)}},{id:"aria-required-children",evaluate:function(a,b){function c(a,b,c){if(null===a)return!1;var d=f(b),e=['[role="'+b+'"]'];return d&&(e=e.concat(d)),e=e.join(","),c?g(a,e)||!!a.querySelector(e):!!a.querySelector(e)}function d(a,b){var d,e;for(d=0,e=a.length;d<e;d++)if(null!==a[d]&&c(a[d],b,!0))return!0;return!1}var e=axe.commons.aria.requiredOwned,f=axe.commons.aria.implicitNodes,g=axe.commons.utils.matchesSelector,h=axe.commons.dom.idrefs,i=a.getAttribute("role"),j=e(i);if(!j)return!0;var k=!1,l=j.one;if(!l){var k=!0;l=j.all}var m=function(a,b,e){var f,g=b.length,i=[],j=h(a,"aria-owns");for(f=0;f<g;f++){var k=b[f];if(c(a,k)||d(j,k)){if(!e)return null}else e&&i.push(k)}return i.length?i:!e&&b.length?b:null}(a,l,k);return!m||(this.data(m),!1)}},{id:"aria-required-parent",evaluate:function(a,b){function c(a){return(axe.commons.aria.implicitNodes(a)||[]).concat('[role="'+a+'"]').join(",")}function d(a,b,d){var e,f,g=a.getAttribute("role"),h=[];if(b||(b=axe.commons.aria.requiredContext(g)),!b)return null;for(e=0,f=b.length;e<f;e++){if(d&&axe.utils.matchesSelector(a,c(b[e])))return null;if(axe.commons.dom.findUp(a,c(b[e])))return null;h.push(b[e])}return h}var e=d(a);if(!e)return!0;var f=function(a){for(var b=[],c=null;a;)a.id&&(c=document.querySelector("[aria-owns~="+axe.commons.utils.escapeSelector(a.id)+"]"))&&b.push(c),a=a.parentNode;return b.length?b:null}(a);if(f)for(var g=0,h=f.length;g<h;g++)if(!(e=d(f[g],e,!0)))return!0;return this.data(e),!1}},{id:"aria-valid-attr-value",evaluate:function(a,b){b=Array.isArray(b)?b:[];for(var c,d,e=[],f=/^aria-/,g=a.attributes,h=0,i=g.length;h<i;h++)c=g[h],d=c.name,-1===b.indexOf(d)&&f.test(d)&&!axe.commons.aria.validateAttrValue(a,d)&&e.push(d+'="'+c.nodeValue+'"');return!e.length||(this.data(e),!1)},options:[]},{id:"aria-valid-attr",evaluate:function(a,b){b=Array.isArray(b)?b:[];for(var c,d=[],e=/^aria-/,f=a.attributes,g=0,h=f.length;g<h;g++)c=f[g].name,-1===b.indexOf(c)&&e.test(c)&&!axe.commons.aria.validateAttr(c)&&d.push(c);return!d.length||(this.data(d),!1)},options:[]},{id:"color-contrast",evaluate:function(a,b){if(!axe.commons.dom.isVisible(a,!1))return!0;var c,d=!!(b||{}).noScroll,e=[],f=axe.commons.color.getBackgroundColor(a,e,d),g=axe.commons.color.getForegroundColor(a,d),h=window.getComputedStyle(a),i=parseFloat(h.getPropertyValue("font-size")),j=h.getPropertyValue("font-weight"),k=-1!==["bold","bolder","600","700","800","900"].indexOf(j),l=axe.commons.color.hasValidContrastRatio(f,g,i,k),m=Math.floor(100*l.contrastRatio)/100;null===f&&(c=axe.commons.color.incompleteData.get("bgColor"));var n=!1;1===m&&(n=!0,c=axe.commons.color.incompleteData.set("bgColor","equalRatio"));var o={fgColor:g?g.toHexString():void 0,bgColor:f?f.toHexString():void 0,contrastRatio:l?m:void 0,fontSize:(72*i/96).toFixed(1)+"pt",fontWeight:k?"bold":"normal",missingData:c};return this.data(o),l.isValid&&!n||this.relatedNodes(e),null===g||null===f||n?(c=null,void axe.commons.color.incompleteData.clear()):l.isValid}},{id:"link-in-text-block",evaluate:function(a,b){function c(a,b){var c=a.getRelativeLuminance(),d=b.getRelativeLuminance();return(Math.max(c,d)+.05)/(Math.min(c,d)+.05)}function d(a){var b=window.getComputedStyle(a).getPropertyValue("display");return-1!==f.indexOf(b)||"table-"===b.substr(0,6)}var e=axe.commons.color,f=["block","list-item","table","flex","grid","inline-block"];if(d(a))return!1;for(var g=a.parentNode;1===g.nodeType&&!d(g);)g=g.parentNode;if(e.elementIsDistinct(a,g))return!0;var h,i;if(h=e.getForegroundColor(a),i=e.getForegroundColor(g),h&&i){var j=c(h,i);if(1===j)return!0;if(j>=3)return axe.commons.color.incompleteData.set("fgColor","bgContrast"),this.data({missingData:axe.commons.color.incompleteData.get("fgColor")}),void axe.commons.color.incompleteData.clear();if(h=e.getBackgroundColor(a),i=e.getBackgroundColor(g),!h||!i||c(h,i)>=3){var k=void 0;return k=h&&i?"bgContrast":axe.commons.color.incompleteData.get("bgColor"),axe.commons.color.incompleteData.set("fgColor",k),this.data({missingData:axe.commons.color.incompleteData.get("fgColor")}),void axe.commons.color.incompleteData.clear()}return!1}}},{id:"fieldset",evaluate:function(a,b){function c(a,b){return axe.commons.utils.toArray(a.querySelectorAll('select,textarea,button,input:not([name="'+b+'"]):not([type="hidden"])'))}function d(a,b){var d=a.firstElementChild;if(!d||"LEGEND"!==d.nodeName.toUpperCase())return h.relatedNodes([a]),g="no-legend",!1;if(!axe.commons.text.accessibleText(d))return h.relatedNodes([d]),g="empty-legend",!1;var e=c(a,b);return!e.length||(h.relatedNodes(e),g="mixed-inputs",!1)}function e(a,b){var d=axe.commons.dom.idrefs(a,"aria-labelledby").some(function(a){return a&&axe.commons.text.accessibleText(a)}),e=a.getAttribute("aria-label");if(!(d||e&&axe.commons.text.sanitize(e)))return h.relatedNodes(a),g="no-group-label",!1;var f=c(a,b);return!f.length||(h.relatedNodes(f),g="group-mixed-inputs",!1)}function f(a,b){return axe.commons.utils.toArray(a).filter(function(a){return a!==b})}var g,h=this,i={name:a.getAttribute("name"),type:a.getAttribute("type")},j=function(b){var c=axe.commons.utils.escapeSelector(a.name),i=document.querySelectorAll('input[type="'+axe.commons.utils.escapeSelector(a.type)+'"][name="'+c+'"]');if(i.length<2)return!0;var j=axe.commons.dom.findUp(b,"fieldset"),k=axe.commons.dom.findUp(b,'[role="group"]'+("radio"===a.type?',[role="radiogroup"]':""));return k||j?j?d(j,c):e(k,c):(g="no-group",h.relatedNodes(f(i,b)),!1)}(a);return j||(i.failureCode=g),this.data(i),j},after:function(a,b){var c={};return a.filter(function(a){if(a.result)return!0;var b=a.data;if(b){if(c[b.type]=c[b.type]||{},!c[b.type][b.name])return c[b.type][b.name]=[b],!0;var d=c[b.type][b.name].some(function(a){return a.failureCode===b.failureCode});return d||c[b.type][b.name].push(b),!d}return!1})}},{id:"group-labelledby",evaluate:function(a,b){this.data({name:a.getAttribute("name"),type:a.getAttribute("type")});var c=document.querySelectorAll('input[type="'+axe.commons.utils.escapeSelector(a.type)+'"][name="'+axe.commons.utils.escapeSelector(a.name)+'"]');return c.length<=1||0!==[].map.call(c,function(a){var b=a.getAttribute("aria-labelledby");return b?b.split(/\s+/):[]}).reduce(function(a,b){return a.filter(function(a){return-1!==b.indexOf(a)})}).filter(function(a){var b=document.getElementById(a);return b&&axe.commons.text.accessibleText(b)}).length},after:function(a,b){var c={};return a.filter(function(a){var b=a.data;return!(!b||(c[b.type]=c[b.type]||{},c[b.type][b.name]))&&(c[b.type][b.name]=!0,!0)})}},{id:"accesskeys",evaluate:function(a,b){return axe.commons.dom.isVisible(a,!1)&&(this.data(a.getAttribute("accesskey")),this.relatedNodes([a])),!0},after:function(a,b){var c={};return a.filter(function(a){if(!a.data)return!1;var b=a.data.toUpperCase();return c[b]?(c[b].relatedNodes.push(a.relatedNodes[0]),!1):(c[b]=a,a.relatedNodes=[],!0)}).map(function(a){return a.result=!!a.relatedNodes.length,a})}},{id:"focusable-no-name",evaluate:function(a,b){var c=a.getAttribute("tabindex");return!!(axe.commons.dom.isFocusable(a)&&c>-1)&&!axe.commons.text.accessibleText(a)}},{id:"tabindex",evaluate:function(a,b){return a.tabIndex<=0}},{id:"duplicate-img-label",evaluate:function(a,b){var c=a.querySelectorAll("img"),d=axe.commons.text.visible(a,!0).toLowerCase();if(""===d)return!1;for(var e=0,f=c.length;e<f;e++){var g=c[e];if(axe.commons.text.accessibleText(g).toLowerCase()===d&&"presentation"!==g.getAttribute("role")&&axe.commons.dom.isVisible(g))return!0}return!1}},{id:"explicit-label",evaluate:function(a,b){if(a.id){var c=document.querySelector('label[for="'+axe.commons.utils.escapeSelector(a.id)+'"]');if(c)return!!axe.commons.text.accessibleText(c)}return!1}},{id:"help-same-as-label",evaluate:function(a,b){var c=axe.commons.text.label(a),d=a.getAttribute("title");if(!c)return!1;if(!d&&(d="",a.getAttribute("aria-describedby"))){d=axe.commons.dom.idrefs(a,"aria-describedby").map(function(a){return a?axe.commons.text.accessibleText(a):""}).join("")}return axe.commons.text.sanitize(d)===axe.commons.text.sanitize(c)},enabled:!1},{id:"implicit-label",evaluate:function(a,b){var c=axe.commons.dom.findUp(a,"label");return!!c&&!!axe.commons.text.accessibleText(c)}},{id:"multiple-label",evaluate:function(a,b){var c=[].slice.call(document.querySelectorAll('label[for="'+axe.commons.utils.escapeSelector(a.id)+'"]')),d=a.parentNode;for(c.length&&(c=c.filter(function(a,b){if(0===b&&!axe.commons.dom.isVisible(a,!0)||axe.commons.dom.isVisible(a,!0))return a}));d;)"LABEL"===d.tagName&&-1===c.indexOf(d)&&c.push(d),d=d.parentNode;return this.relatedNodes(c),c.length>1}},{id:"title-only",evaluate:function(a,b){return!(axe.commons.text.label(a)||!a.getAttribute("title")&&!a.getAttribute("aria-describedby"))}},{id:"has-lang",evaluate:function(a,b){return!!(a.getAttribute("lang")||a.getAttribute("xml:lang")||"").trim()}},{id:"valid-lang",evaluate:function(a,b){function c(a){return a.trim().split("-")[0].toLowerCase()}var d,e;return d=(b||axe.commons.utils.validLangs()).map(c),e=["lang","xml:lang"].reduce(function(b,e){var f=a.getAttribute(e);if("string"!=typeof f)return b;var g=c(f);return""!==g&&-1===d.indexOf(g)&&b.push(e+'="'+a.getAttribute(e)+'"'),b},[]),!!e.length&&(this.data(e),!0)}},{id:"dlitem",evaluate:function(a,b){return"DL"===a.parentNode.tagName}},{id:"has-listitem",evaluate:function(a,b){var c=a.children;if(0===c.length)return!0;for(var d=0;d<c.length;d++)if("LI"===c[d].nodeName.toUpperCase())return!1;return!0}},{id:"listitem",evaluate:function(a,b){return-1!==["UL","OL"].indexOf(a.parentNode.nodeName.toUpperCase())||"list"===a.parentNode.getAttribute("role")}},{id:"only-dlitems",evaluate:function(a,b){for(var c,d,e=[],f=a.childNodes,g=["STYLE","META","LINK","MAP","AREA","SCRIPT","DATALIST","TEMPLATE"],h=!1,i=0;i<f.length;i++){c=f[i];var d=c.nodeName.toUpperCase();1===c.nodeType&&"DT"!==d&&"DD"!==d&&-1===g.indexOf(d)?e.push(c):3===c.nodeType&&""!==c.nodeValue.trim()&&(h=!0)}return e.length&&this.relatedNodes(e),!!e.length||h}},{id:"only-listitems",evaluate:function(a,b){for(var c,d,e=[],f=a.childNodes,g=["STYLE","META","LINK","MAP","AREA","SCRIPT","DATALIST","TEMPLATE"],h=!1,i=0;i<f.length;i++)c=f[i],d=c.nodeName.toUpperCase(),1===c.nodeType&&"LI"!==d&&-1===g.indexOf(d)?e.push(c):3===c.nodeType&&""!==c.nodeValue.trim()&&(h=!0);return e.length&&this.relatedNodes(e),!!e.length||h}},{id:"structured-dlitems",evaluate:function(a,b){var c=a.children;if(!c||!c.length)return!1;for(var d,e=!1,f=!1,g=0;g<c.length;g++){if(d=c[g].nodeName.toUpperCase(),"DT"===d&&(e=!0),e&&"DD"===d)return!1;"DD"===d&&(f=!0)}return e||f}},{id:"caption",evaluate:function(a,b){var c=a.querySelectorAll("track");if(c.length){for(var d=0;d<c.length;d++){var e=c[d].getAttribute("kind");if(e&&"captions"===e)return!1}return!0}}},{id:"description",evaluate:function(a,b){var c=a.querySelectorAll("track");if(c.length){for(var d=0;d<c.length;d++){var e=c[d].getAttribute("kind");if(e&&"descriptions"===e)return!1}return!0}}},{id:"meta-viewport-large",evaluate:function(a,b){b=b||{};for(var c,d=a.getAttribute("content")||"",e=d.split(/[;,]/),f={},g=b.scaleMinimum||2,h=b.lowerBound||!1,i=0,j=e.length;i<j;i++){c=e[i].split("=");var k=c.shift().toLowerCase();k&&c.length&&(f[k.trim()]=c.shift().trim().toLowerCase())}return!!(h&&f["maximum-scale"]&&parseFloat(f["maximum-scale"])<h)||!(!h&&"no"===f["user-scalable"])&&!(f["maximum-scale"]&&parseFloat(f["maximum-scale"])<g)},options:{scaleMinimum:5,lowerBound:2}},{id:"meta-viewport",evaluate:function(a,b){b=b||{};for(var c,d=a.getAttribute("content")||"",e=d.split(/[;,]/),f={},g=b.scaleMinimum||2,h=b.lowerBound||!1,i=0,j=e.length;i<j;i++){c=e[i].split("=");var k=c.shift().toLowerCase();k&&c.length&&(f[k.trim()]=c.shift().trim().toLowerCase())}return!!(h&&f["maximum-scale"]&&parseFloat(f["maximum-scale"])<h)||!(!h&&"no"===f["user-scalable"])&&!(f["maximum-scale"]&&parseFloat(f["maximum-scale"])<g)},options:{scaleMinimum:2}},{id:"header-present",evaluate:function(a,b){return!!a.querySelector('h1, h2, h3, h4, h5, h6, [role="heading"]')}},{id:"heading-order",evaluate:function(a,b){var c=a.getAttribute("aria-level");if(null!==c)return this.data(parseInt(c,10)),!0;var d=a.tagName.match(/H(\d)/);return!d||(this.data(parseInt(d[1],10)),!0)},after:function(a,b){if(a.length<2)return a;for(var c=a[0].data,d=1;d<a.length;d++)a[d].result&&a[d].data>c+1&&(a[d].result=!1),c=a[d].data;return a}},{id:"href-no-hash",evaluate:function(a,b){return"#"!==a.getAttribute("href")}},{id:"internal-link-present",evaluate:function(a,b){return!!a.querySelector('a[href^="#"]')}},{id:"landmark",evaluate:function(a,b){return a.getElementsByTagName("main").length>0||!!a.querySelector('[role="main"]')}},{id:"meta-refresh",evaluate:function(a,b){var c=a.getAttribute("content")||"",d=c.split(/[;,]/);return""===c||"0"===d[0]}},{id:"p-as-heading",evaluate:function(a,b){function c(a){for(var b=a,c=a.textContent.trim(),d=c;d===c&&void 0!==b;){var e=-1;if(a=b,0===a.children.length)return a;do{e++,d=a.children[e].textContent.trim()}while(""===d&&e+1<a.children.length);b=a.children[e]}return a}function d(a){switch(a){case"lighter":return 100;case"normal":return 400;case"bold":return 700;case"bolder":return 900}return a=parseInt(a),isNaN(a)?400:a}function e(a){var b=window.getComputedStyle(c(a));return{fontWeight:d(b.getPropertyValue("font-weight")),fontSize:parseInt(b.getPropertyValue("font-size")),isItalic:"italic"===b.getPropertyValue("font-style")}}function f(a,b,c){return c.reduce(function(c,d){return c||(!d.size||a.fontSize/d.size>b.fontSize)&&(!d.weight||a.fontWeight-d.weight>b.fontWeight)&&(!d.italic||a.isItalic&&!b.isItalic)},!1)}var g=Array.from(a.parentNode.children),h=g.indexOf(a);b=b||{};var i=b.margins||[],j=g.slice(h+1).find(function(a){return"P"===a.nodeName.toUpperCase()}),k=g.slice(0,h).reverse().find(function(a){return"P"===a.nodeName.toUpperCase()}),l=e(a),m=j?e(j):null,n=k?e(k):null;if(!m||!f(l,m,i))return!0;var o=axe.commons.dom.findUp(a,"blockquote");return!!(o&&"BLOCKQUOTE"===o.nodeName.toUpperCase()||n&&!f(l,n,i))&&void 0},options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]}},{id:"region",evaluate:function(a,b){function c(a){return h&&axe.commons.dom.isFocusable(axe.commons.dom.getElementByReference(h,"href"))&&h===a}function d(a){var b=a.getAttribute("role");return b&&-1!==g.indexOf(b)}function e(a){return d(a)?null:c(a)?f(a):axe.commons.dom.isVisible(a,!0)&&(axe.commons.text.visible(a,!0,!0)||axe.commons.dom.isVisualContent(a))?a:f(a)}function f(a){var b=axe.commons.utils.toArray(a.children);return 0===b.length?[]:b.map(e).filter(function(a){return null!==a}).reduce(function(a,b){return a.concat(b)},[])}var g=axe.commons.aria.getRolesByType("landmark"),h=a.querySelector("a[href]"),i=f(a);return this.relatedNodes(i),!i.length},after:function(a,b){return[a[0]]}},{id:"skip-link",evaluate:function(a,b){return axe.commons.dom.isFocusable(axe.commons.dom.getElementByReference(a,"href"))},after:function(a,b){return[a[0]]}},{id:"unique-frame-title",evaluate:function(a,b){var c=axe.commons.text.sanitize(a.title).trim().toLowerCase();return this.data(c),!0},after:function(a,b){var c={};return a.forEach(function(a){c[a.data]=void 0!==c[a.data]?++c[a.data]:0}),a.forEach(function(a){a.result=!!c[a.data]}),a}},{id:"aria-label",evaluate:function(a,b){var c=a.getAttribute("aria-label");return!!(c?axe.commons.text.sanitize(c).trim():"")}},{id:"aria-labelledby",evaluate:function(a,b){return(0,axe.commons.dom.idrefs)(a,"aria-labelledby").some(function(a){return a&&axe.commons.text.accessibleText(a,!0)})}},{id:"button-has-visible-text",evaluate:function(a,b){var c=a.nodeName.toUpperCase(),d=a.getAttribute("role"),e=void 0;return("BUTTON"===c||"button"===d&&"INPUT"!==c)&&(e=axe.commons.text.accessibleText(a),this.data(e),!!e)}},{id:"doc-has-title",evaluate:function(a,b){var c=document.title;return!!(c?axe.commons.text.sanitize(c).trim():"")}},{id:"duplicate-id",evaluate:function(a,b){if(!a.id.trim())return!0;for(var c=document.querySelectorAll('[id="'+axe.commons.utils.escapeSelector(a.id)+'"]'),d=[],e=0;e<c.length;e++)c[e]!==a&&d.push(c[e]);return d.length&&this.relatedNodes(d),this.data(a.getAttribute("id")),c.length<=1},after:function(a,b){var c=[];return a.filter(function(a){return-1===c.indexOf(a.data)&&(c.push(a.data),!0)})}},{id:"exists",evaluate:function(a,b){return!0}},{id:"has-alt",evaluate:function(a,b){var c=a.nodeName.toLowerCase();return a.hasAttribute("alt")&&("img"===c||"input"===c||"area"===c)}},{id:"has-visible-text",evaluate:function(a,b){return axe.commons.text.accessibleText(a).length>0}},{id:"is-on-screen",evaluate:function(a,b){return axe.commons.dom.isVisible(a,!1)&&!axe.commons.dom.isOffscreen(a)}},{id:"non-empty-alt",evaluate:function(a,b){var c=a.getAttribute("alt");return!!(c?axe.commons.text.sanitize(c).trim():"")}},{id:"non-empty-if-present",evaluate:function(a,b){var c=a.nodeName.toUpperCase(),d=(a.getAttribute("type")||"").toLowerCase(),e=a.getAttribute("value");return this.data(e),"INPUT"===c&&-1!==["submit","reset"].indexOf(d)&&null===e}},{id:"non-empty-title",evaluate:function(a,b){var c=a.getAttribute("title");return!!(c?axe.commons.text.sanitize(c).trim():"")}},{id:"non-empty-value",evaluate:function(a,b){var c=a.getAttribute("value");return!!(c?axe.commons.text.sanitize(c).trim():"")}},{id:"role-none",evaluate:function(a,b){return"none"===a.getAttribute("role")}},{id:"role-presentation",evaluate:function(a,b){return"presentation"===a.getAttribute("role")}},{id:"caption-faked",evaluate:function(a,b){var c=axe.commons.table.toGrid(a),d=c[0];return c.length<=1||d.length<=1||a.rows.length<=1||d.reduce(function(a,b,c){return a||b!==d[c+1]&&void 0!==d[c+1]},!1)}},{id:"has-caption",evaluate:function(a,b){return!!a.caption}},{id:"has-summary",evaluate:function(a,b){ +return!!a.summary}},{id:"has-th",evaluate:function(a,b){for(var c,d,e=[],f=0,g=a.rows.length;f<g;f++){c=a.rows[f];for(var h=0,i=c.cells.length;h<i;h++)d=c.cells[h],"TH"!==d.nodeName.toUpperCase()&&-1===["rowheader","columnheader"].indexOf(d.getAttribute("role"))||e.push(d)}return!!e.length&&(this.relatedNodes(e),!0)}},{id:"html5-scope",evaluate:function(a,b){return!axe.commons.dom.isHTML5(document)||"TH"===a.nodeName.toUpperCase()}},{id:"same-caption-summary",evaluate:function(a,b){return!(!a.summary||!a.caption)&&a.summary===axe.commons.text.accessibleText(a.caption)}},{id:"scope-value",evaluate:function(a,b){b=b||{};var c=a.getAttribute("scope").toLowerCase();return-1!==(["row","col","rowgroup","colgroup"]||b.values).indexOf(c)}},{id:"td-has-header",evaluate:function(a,b){var c=axe.commons.table,d=[];return c.getAllCells(a).forEach(function(a){if(axe.commons.dom.hasContent(a)&&c.isDataCell(a)&&!axe.commons.aria.label(a)){var b=c.getHeaders(a);(b=b.reduce(function(a,b){return a||null!==b&&!!axe.commons.dom.hasContent(b)},!1))||d.push(a)}}),!d.length||(this.relatedNodes(d),!1)}},{id:"td-headers-attr",evaluate:function(a,b){for(var c=[],d=0,e=a.rows.length;d<e;d++)for(var f=a.rows[d],g=0,h=f.cells.length;g<h;g++)c.push(f.cells[g]);var i=c.reduce(function(a,b){return b.id&&a.push(b.id),a},[]),j=c.reduce(function(a,b){var c,d,e=(b.getAttribute("headers")||"").split(/\s/).reduce(function(a,b){return b=b.trim(),b&&a.push(b),a},[]);return 0!==e.length&&(b.id&&(c=-1!==e.indexOf(b.id.trim())),d=e.reduce(function(a,b){return a||-1===i.indexOf(b)},!1),(c||d)&&a.push(b)),a},[]);return!(j.length>0)||(this.relatedNodes(j),!1)}},{id:"th-has-data-cells",evaluate:function(a,b){var c=axe.commons.table,d=c.getAllCells(a),e=this,f=[];d.forEach(function(a){var b=a.getAttribute("headers");b&&(f=f.concat(b.split(/\s+/)));var c=a.getAttribute("aria-labelledby");c&&(f=f.concat(c.split(/\s+/)))});var g=d.filter(function(a){return""!==axe.commons.text.sanitize(a.textContent)&&("TH"===a.nodeName.toUpperCase()||-1!==["rowheader","columnheader"].indexOf(a.getAttribute("role")))}),h=c.toGrid(a);return!!g.reduce(function(a,b){if(b.id&&-1!==f.indexOf(b.id))return!!a||a;var d=!1,g=c.getCellPosition(b,h);return c.isColumnHeader(b)&&(d=c.traverse("down",g,h).reduce(function(a,b){return a||axe.commons.dom.hasContent(b)&&!c.isColumnHeader(b)},!1)),!d&&c.isRowHeader(b)&&(d=c.traverse("right",g,h).reduce(function(a,b){return a||axe.commons.dom.hasContent(b)&&!c.isRowHeader(b)},!1)),d||e.relatedNodes(b),a&&d},!0)||void 0}},{id:"hidden-content",evaluate:function(a,b){var c=window.getComputedStyle(a);if(!["SCRIPT","HEAD","TITLE","NOSCRIPT","STYLE","TEMPLATE"].includes(a.tagName.toUpperCase())&&axe.commons.dom.hasContent(a)){if("none"===c.getPropertyValue("display"))return;if("hidden"===c.getPropertyValue("visibility")){if(a.parentNode)var d=window.getComputedStyle(a.parentNode);if(!d||"hidden"!==d.getPropertyValue("visibility"))return}}return!0}}],commons:function(){function a(a){return a.getPropertyValue("font-family").split(/[,;]/g).map(function(a){return a.trim().toLowerCase()})}function b(b,c){var d=window.getComputedStyle(b);if("none"!==d.getPropertyValue("background-image"))return!0;if(["border-bottom","border-top","outline"].reduce(function(a,b){var c=new y.Color;return c.parseRgbString(d.getPropertyValue(b+"-color")),a||"none"!==d.getPropertyValue(b+"-style")&&parseFloat(d.getPropertyValue(b+"-width"))>0&&0!==c.alpha},!1))return!0;var e=window.getComputedStyle(c);if(a(d)[0]!==a(e)[0])return!0;var f=["text-decoration-line","text-decoration-style","font-weight","font-style","font-size"].reduce(function(a,b){return a||d.getPropertyValue(b)!==e.getPropertyValue(b)},!1),g=d.getPropertyValue("text-decoration");return g.split(" ").length<3&&(f=f||g!==e.getPropertyValue("text-decoration")),f}function c(a,b){var c=a.nodeName.toUpperCase();if(C.includes(c))return axe.commons.color.incompleteData.set("bgColor","imgNode"),!0;b=b||window.getComputedStyle(a);var d=b.getPropertyValue("background-image"),e="none"!==d;if(e){var f=/gradient/.test(d);axe.commons.color.incompleteData.set("bgColor",f?"bgGradient":"bgImage")}return e}function d(a,b){b=b||window.getComputedStyle(a);var c=new y.Color;if(c.parseRgbString(b.getPropertyValue("background-color")),0!==c.alpha){var d=b.getPropertyValue("opacity");c.alpha=c.alpha*d}return c}function e(a,b){var c=a.getClientRects()[0],d=document.elementsFromPoint(c.left,c.top);if(d)for(var e=0;e<d.length;e++)if(d[e]!==a&&d[e]===b)return!0;return!1}function f(a,b,c){var f=0;if(a>0)for(var g=a-1;g>=0;g--){var h=b[g],i=window.getComputedStyle(h),j=d(h,i);j.alpha&&e(c,h)?f+=j.alpha:b.splice(g,1)}return f}function g(a,b,c){var d=a!==b&&!z.visuallyContains(a,b)&&0!==c.alpha;return d&&axe.commons.color.incompleteData.set("bgColor","elmPartiallyObscured"),d}function h(a,b){var c={TD:"TR",INPUT:"LABEL"},d=a.map(function(a){return a.tagName}),e=a;for(var f in c)if(c.hasOwnProperty(f)){if(b.tagName===f){var g=axe.commons.dom.findUp(b,c[f]);if(g&&-1===a.indexOf(g)){var h=axe.commons.dom.visuallyOverlaps(b.getBoundingClientRect(),g);h&&e.splice(a.indexOf(b)+1,0,g)}}b.tagName===c[f]&&-1===d.indexOf(b.tagName)&&e.splice(d.indexOf(f)+1,0,b)}return e}function i(a){var b=a.indexOf(document.body),e=a;return b>1&&!c(document.documentElement)&&0===d(document.documentElement).alpha&&(e.splice(b,1),e.splice(a.indexOf(document.documentElement),1),e.push(document.body)),e}function j(a,b){"use strict";var c=b(a);for(a=a.firstChild;a;)!1!==c&&j(a,b),a=a.nextSibling}function k(a){"use strict";var b=window.getComputedStyle(a).getPropertyValue("display");return-1!==D.indexOf(b)||"table-"===b.substr(0,6)}function l(a){"use strict";var b=a.match(/rect\s*\(([0-9]+)px,?\s*([0-9]+)px,?\s*([0-9]+)px,?\s*([0-9]+)px\s*\)/);return!(!b||5!==b.length)&&(b[3]-b[1]<=0&&b[2]-b[4]<=0)}function m(a){var b=null;return a.id&&(b=document.querySelector('label[for="'+axe.utils.escapeSelector(a.id)+'"]'))?b:b=z.findUp(a,"label")}function n(a){return-1!==["button","reset","submit"].indexOf(a.type)}function o(a){var b=a.nodeName.toUpperCase();return"TEXTAREA"===b||"SELECT"===b||"INPUT"===b&&"hidden"!==a.type.toLowerCase()}function p(a){return-1!==["BUTTON","SUMMARY","A"].indexOf(a.nodeName.toUpperCase())}function q(a){return-1!==["TABLE","FIGURE"].indexOf(a.nodeName.toUpperCase())}function r(a){var b=a.nodeName.toUpperCase();if("INPUT"===b)return!a.hasAttribute("type")||-1!==G.indexOf(a.getAttribute("type").toLowerCase())&&a.value?a.value:"";if("SELECT"===b){var c=a.options;if(c&&c.length){for(var d="",e=0;e<c.length;e++)c[e].selected&&(d+=" "+c[e].text);return B.sanitize(d)}return""}return"TEXTAREA"===b&&a.value?a.value:""}function s(a,b){var c=a.querySelector(b.toLowerCase());return c?B.accessibleText(c):""}function t(a){if(!a)return!1;switch(a.nodeName.toUpperCase()){case"SELECT":case"TEXTAREA":return!0;case"INPUT":return!a.hasAttribute("type")||-1!==G.indexOf(a.getAttribute("type").toLowerCase());default:return!1}}function u(a){var b=a.nodeName.toUpperCase();return"INPUT"===b&&"image"===a.type.toLowerCase()||-1!==["IMG","APPLET","AREA"].indexOf(b)}function v(a){return!!B.sanitize(a)}var commons={},w=commons.aria={},x=w._lut={};x.attributes={"aria-activedescendant":{type:"idref"},"aria-atomic":{type:"boolean",values:["true","false"]},"aria-autocomplete":{type:"nmtoken",values:["inline","list","both","none"]},"aria-busy":{type:"boolean",values:["true","false"]},"aria-checked":{type:"nmtoken",values:["true","false","mixed","undefined"]},"aria-colcount":{type:"int"},"aria-colindex":{type:"int"},"aria-colspan":{type:"int"},"aria-controls":{type:"idrefs"},"aria-current":{type:"nmtoken",values:["page","step","location","date","time","true","false"]},"aria-describedby":{type:"idrefs"},"aria-disabled":{type:"boolean",values:["true","false"]},"aria-dropeffect":{type:"nmtokens",values:["copy","move","reference","execute","popup","none"]},"aria-expanded":{type:"nmtoken",values:["true","false","undefined"]},"aria-flowto":{type:"idrefs"},"aria-grabbed":{type:"nmtoken",values:["true","false","undefined"]},"aria-haspopup":{type:"boolean",values:["true","false"]},"aria-hidden":{type:"boolean",values:["true","false"]},"aria-invalid":{type:"nmtoken",values:["true","false","spelling","grammar"]},"aria-label":{type:"string"},"aria-labelledby":{type:"idrefs"},"aria-level":{type:"int"},"aria-live":{type:"nmtoken",values:["off","polite","assertive"]},"aria-multiline":{type:"boolean",values:["true","false"]},"aria-multiselectable":{type:"boolean",values:["true","false"]},"aria-orientation":{type:"nmtoken",values:["horizontal","vertical"]},"aria-owns":{type:"idrefs"},"aria-posinset":{type:"int"},"aria-pressed":{type:"nmtoken",values:["true","false","mixed","undefined"]},"aria-readonly":{type:"boolean",values:["true","false"]},"aria-relevant":{type:"nmtokens",values:["additions","removals","text","all"]},"aria-required":{type:"boolean",values:["true","false"]},"aria-rowcount":{type:"int"},"aria-rowindex":{type:"int"},"aria-rowspan":{type:"int"},"aria-selected":{type:"nmtoken",values:["true","false","undefined"]},"aria-setsize":{type:"int"},"aria-sort":{type:"nmtoken",values:["ascending","descending","other","none"]},"aria-valuemax":{type:"decimal"},"aria-valuemin":{type:"decimal"},"aria-valuenow":{type:"decimal"},"aria-valuetext":{type:"string"}},x.globalAttributes=["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-disabled","aria-dropeffect","aria-flowto","aria-grabbed","aria-haspopup","aria-hidden","aria-invalid","aria-label","aria-labelledby","aria-live","aria-owns","aria-relevant"],x.role={alert:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},alertdialog:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},application:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},article:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["article"]},banner:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["header"]},button:{type:"widget",attributes:{allowed:["aria-expanded","aria-pressed"]},owned:null,nameFrom:["author","contents"],context:null,implicit:["button",'input[type="button"]','input[type="image"]','input[type="reset"]','input[type="submit"]',"summary"]},cell:{type:"structure",attributes:{allowed:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan"]},owned:null,nameFrom:["author","contents"],context:["row"],implicit:["td","th"]},checkbox:{type:"widget",attributes:{required:["aria-checked"]},owned:null,nameFrom:["author","contents"],context:null,implicit:['input[type="checkbox"]']},columnheader:{type:"structure",attributes:{allowed:["aria-expanded","aria-sort","aria-readonly","aria-selected","aria-required"]},owned:null,nameFrom:["author","contents"],context:["row"],implicit:["th"]},combobox:{type:"composite",attributes:{required:["aria-expanded"],allowed:["aria-autocomplete","aria-required","aria-activedescendant"]},owned:{all:["listbox","textbox"]},nameFrom:["author"],context:null},command:{nameFrom:["author"],type:"abstract"},complementary:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["aside"]},composite:{nameFrom:["author"],type:"abstract"},contentinfo:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["footer"]},definition:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["dd"]},dialog:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["dialog"]},directory:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author","contents"],context:null},document:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["body"]},form:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["form"]},grid:{type:"composite",attributes:{allowed:["aria-level","aria-multiselectable","aria-readonly","aria-activedescendant","aria-expanded"]},owned:{one:["rowgroup","row"]},nameFrom:["author"],context:null,implicit:["table"]},gridcell:{type:"widget",attributes:{allowed:["aria-selected","aria-readonly","aria-expanded","aria-required"]},owned:null,nameFrom:["author","contents"],context:["row"],implicit:["td","th"]},group:{type:"structure",attributes:{allowed:["aria-activedescendant","aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["details","optgroup"]},heading:{type:"structure",attributes:{allowed:["aria-level","aria-expanded"]},owned:null,nameFrom:["author","contents"],context:null,implicit:["h1","h2","h3","h4","h5","h6"]},img:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["img"]},input:{nameFrom:["author"],type:"abstract"},landmark:{nameFrom:["author"],type:"abstract"},link:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author","contents"],context:null,implicit:["a[href]"]},list:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:{all:["listitem"]},nameFrom:["author"],context:null,implicit:["ol","ul","dl"]},listbox:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-multiselectable","aria-required","aria-expanded"]},owned:{all:["option"]},nameFrom:["author"],context:null,implicit:["select"]},listitem:{type:"structure",attributes:{allowed:["aria-level","aria-posinset","aria-setsize","aria-expanded"]},owned:null,nameFrom:["author","contents"],context:["list"],implicit:["li","dt"]},log:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},main:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["main"]},marquee:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},math:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["math"]},menu:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-expanded"]},owned:{one:["menuitem","menuitemradio","menuitemcheckbox"]},nameFrom:["author"],context:null,implicit:['menu[type="context"]']},menubar:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-expanded"]},owned:null,nameFrom:["author"],context:null},menuitem:{type:"widget",attributes:null,owned:null,nameFrom:["author","contents"],context:["menu","menubar"],implicit:['menuitem[type="command"]']},menuitemcheckbox:{type:"widget",attributes:{required:["aria-checked"]},owned:null,nameFrom:["author","contents"],context:["menu","menubar"],implicit:['menuitem[type="checkbox"]']},menuitemradio:{type:"widget",attributes:{allowed:["aria-selected","aria-posinset","aria-setsize"],required:["aria-checked"]},owned:null,nameFrom:["author","contents"],context:["menu","menubar"],implicit:['menuitem[type="radio"]']},navigation:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["nav"]},none:{type:"structure",attributes:null,owned:null,nameFrom:["author"],context:null},note:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},option:{type:"widget",attributes:{allowed:["aria-selected","aria-posinset","aria-setsize","aria-checked"]},owned:null,nameFrom:["author","contents"],context:["listbox"],implicit:["option"]},presentation:{type:"structure",attributes:null,owned:null,nameFrom:["author"],context:null},progressbar:{type:"widget",attributes:{allowed:["aria-valuetext","aria-valuenow","aria-valuemax","aria-valuemin"]},owned:null,nameFrom:["author"],context:null,implicit:["progress"]},radio:{type:"widget",attributes:{allowed:["aria-selected","aria-posinset","aria-setsize"],required:["aria-checked"]},owned:null,nameFrom:["author","contents"],context:null,implicit:['input[type="radio"]']},radiogroup:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-required","aria-expanded"]},owned:{all:["radio"]},nameFrom:["author"],context:null},range:{nameFrom:["author"],type:"abstract"},region:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["section"]},roletype:{type:"abstract"},row:{type:"structure",attributes:{allowed:["aria-level","aria-selected","aria-activedescendant","aria-expanded"]},owned:{one:["cell","columnheader","rowheader","gridcell"]},nameFrom:["author","contents"],context:["rowgroup","grid","treegrid","table"],implicit:["tr"]},rowgroup:{type:"structure",attributes:{allowed:["aria-activedescendant","aria-expanded"]},owned:{all:["row"]},nameFrom:["author","contents"],context:["grid","table"],implicit:["tbody","thead","tfoot"]},rowheader:{type:"structure",attributes:{allowed:["aria-sort","aria-required","aria-readonly","aria-expanded","aria-selected"]},owned:null,nameFrom:["author","contents"],context:["row"],implicit:["th"]},scrollbar:{type:"widget",attributes:{required:["aria-controls","aria-orientation","aria-valuenow","aria-valuemax","aria-valuemin"],allowed:["aria-valuetext"]},owned:null,nameFrom:["author"],context:null},search:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},searchbox:{type:"widget",attributes:{allowed:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-readonly","aria-required"]},owned:null,nameFrom:["author"],context:null,implicit:['input[type="search"]']},section:{nameFrom:["author","contents"],type:"abstract"},sectionhead:{nameFrom:["author","contents"],type:"abstract"},select:{nameFrom:["author"],type:"abstract"},separator:{type:"structure",attributes:{allowed:["aria-expanded","aria-orientation"]},owned:null,nameFrom:["author"],context:null,implicit:["hr"]},slider:{type:"widget",attributes:{allowed:["aria-valuetext","aria-orientation"],required:["aria-valuenow","aria-valuemax","aria-valuemin"]},owned:null,nameFrom:["author"],context:null,implicit:['input[type="range"]']},spinbutton:{type:"widget",attributes:{allowed:["aria-valuetext","aria-required"],required:["aria-valuenow","aria-valuemax","aria-valuemin"]},owned:null,nameFrom:["author"],context:null,implicit:['input[type="number"]']},status:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["output"]},structure:{type:"abstract"},switch:{type:"widget",attributes:{required:["aria-checked"]},owned:null,nameFrom:["author","contents"],context:null},tab:{type:"widget",attributes:{allowed:["aria-selected","aria-expanded"]},owned:null,nameFrom:["author","contents"],context:["tablist"]},table:{type:"structure",attributes:{allowed:["aria-colcount","aria-rowcount"]},owned:{one:["rowgroup","row"]},nameFrom:["author"],context:null,implicit:["table"]},tablist:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-expanded","aria-level","aria-multiselectable"]},owned:{all:["tab"]},nameFrom:["author"],context:null},tabpanel:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},text:{type:"structure",owned:null,nameFrom:["author","contents"],context:null},textbox:{type:"widget",attributes:{allowed:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-readonly","aria-required"]},owned:null,nameFrom:["author"],context:null,implicit:['input[type="text"]','input[type="email"]','input[type="password"]','input[type="tel"]','input[type="url"]',"input:not([type])","textarea"]},timer:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},toolbar:{type:"structure",attributes:{allowed:["aria-activedescendant","aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:['menu[type="toolbar"]']},tooltip:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author","contents"],context:null},tree:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-multiselectable","aria-required","aria-expanded"]},owned:{all:["treeitem"]},nameFrom:["author"],context:null},treegrid:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-expanded","aria-level","aria-multiselectable","aria-readonly","aria-required"]},owned:{all:["treeitem"]},nameFrom:["author"],context:null},treeitem:{type:"widget",attributes:{allowed:["aria-checked","aria-selected","aria-expanded","aria-level","aria-posinset","aria-setsize"]},owned:null,nameFrom:["author","contents"],context:["treegrid","tree"]},widget:{type:"abstract"},window:{nameFrom:["author"],type:"abstract"}};var y={};commons.color=y;var z=commons.dom={},A=commons.table={},B=commons.text={};commons.utils=axe.utils;w.requiredAttr=function(a){"use strict";var b=x.role[a];return b&&b.attributes&&b.attributes.required||[]},w.allowedAttr=function(a){"use strict";var b=x.role[a],c=b&&b.attributes&&b.attributes.allowed||[],d=b&&b.attributes&&b.attributes.required||[];return c.concat(x.globalAttributes).concat(d)},w.validateAttr=function(a){"use strict";return!!x.attributes[a]},w.validateAttrValue=function(a,b){"use strict";var c,d,e=a.getAttribute(b),f=x.attributes[b],g=z.getRootNode(a);if(!f)return!0;switch(f.type){case"boolean":case"nmtoken":return"string"==typeof e&&-1!==f.values.indexOf(e.toLowerCase());case"nmtokens":return d=axe.utils.tokenList(e),d.reduce(function(a,b){return a&&-1!==f.values.indexOf(b)},0!==d.length);case"idref":return!(!e||!g.getElementById(e));case"idrefs":return d=axe.utils.tokenList(e),d.reduce(function(a,b){return!(!a||!g.getElementById(b))},0!==d.length);case"string":return!0;case"decimal":return!(!(c=e.match(/^[-+]?([0-9]*)\.?([0-9]*)$/))||!c[1]&&!c[2]);case"int":return/^[-+]?[0-9]+$/.test(e)}},w.label=function(a){var b,c;return a.actualNode.getAttribute("aria-labelledby")&&(b=z.idrefs(a.actualNode,"aria-labelledby"),c=b.map(function(a){var b=axe.utils.getNodeFromTree(axe._tree[0],a);return b?B.visible(b,!0):""}).join(" ").trim())?c:(c=a.actualNode.getAttribute("aria-label"),c&&(c=B.sanitize(c).trim())?c:null)},w.isValidRole=function(a){"use strict";return!!x.role[a]},w.getRolesWithNameFromContents=function(){return Object.keys(x.role).filter(function(a){return x.role[a].nameFrom&&-1!==x.role[a].nameFrom.indexOf("contents")})},w.getRolesByType=function(a){return Object.keys(x.role).filter(function(b){return x.role[b].type===a})},w.getRoleType=function(a){var b=x.role[a];return b&&b.type||null},w.requiredOwned=function(a){"use strict";var b=null,c=x.role[a];return c&&(b=axe.utils.clone(c.owned)),b},w.requiredContext=function(a){"use strict";var b=null,c=x.role[a];return c&&(b=axe.utils.clone(c.context)),b},w.implicitNodes=function(a){"use strict";var b=null,c=x.role[a];return c&&c.implicit&&(b=axe.utils.clone(c.implicit)),b},w.implicitRole=function(a){"use strict";var b=function(b,c){var d=function(b){return axe.utils.matchesSelector(a,b)};return c.implicit&&c.implicit.some(d)&&b.push(c.name),b},c=Object.keys(x.role).map(function(a){var b=x.role[a];return{name:a,implicit:b&&b.implicit}}),d=c.reduce(b,[]);if(!d.length)return null;for(var e=a.attributes,f=[],g=0,h=e.length;g<h;g++){var i=e[g];i.name.match(/^aria-/)&&f.push(i.name)}return function(a,b){var c=function(a){return w.allowedAttr(a).reduce(function(a,c){return a+(b.indexOf(c)>-1?1:0)},0)};return a.map(function(a){return{score:c(a),name:a}}).sort(function(a,b){return b.score-a.score}).map(function(a){return a.name})}(d,f).shift()},y.Color=function(a,b,c,d){this.red=a,this.green=b,this.blue=c,this.alpha=d,this.toHexString=function(){var a=Math.round(this.red).toString(16),b=Math.round(this.green).toString(16),c=Math.round(this.blue).toString(16);return"#"+(this.red>15.5?a:"0"+a)+(this.green>15.5?b:"0"+b)+(this.blue>15.5?c:"0"+c)};var e=/^rgb\((\d+), (\d+), (\d+)\)$/,f=/^rgba\((\d+), (\d+), (\d+), (\d*(\.\d+)?)\)/;this.parseRgbString=function(a){if("transparent"===a)return this.red=0,this.green=0,this.blue=0,void(this.alpha=0);var b=a.match(e);return b?(this.red=parseInt(b[1],10),this.green=parseInt(b[2],10),this.blue=parseInt(b[3],10),void(this.alpha=1)):(b=a.match(f),b?(this.red=parseInt(b[1],10),this.green=parseInt(b[2],10),this.blue=parseInt(b[3],10),void(this.alpha=parseFloat(b[4]))):void 0)},this.getRelativeLuminance=function(){var a=this.red/255,b=this.green/255,c=this.blue/255;return.2126*(a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4))+.7152*(b<=.03928?b/12.92:Math.pow((b+.055)/1.055,2.4))+.0722*(c<=.03928?c/12.92:Math.pow((c+.055)/1.055,2.4))}},y.flattenColors=function(a,b){var c=a.alpha,d=(1-c)*b.red+c*a.red,e=(1-c)*b.green+c*a.green,f=(1-c)*b.blue+c*a.blue,g=a.alpha+b.alpha*(1-a.alpha);return new y.Color(d,e,f,g)},y.getContrast=function(a,b){if(!b||!a)return null;b.alpha<1&&(b=y.flattenColors(b,a));var c=a.getRelativeLuminance(),d=b.getRelativeLuminance();return(Math.max(d,c)+.05)/(Math.min(d,c)+.05)},y.hasValidContrastRatio=function(a,b,c,d){var e=y.getContrast(a,b),f=d&&Math.ceil(72*c)/96<14||!d&&Math.ceil(72*c)/96<18;return{isValid:f&&e>=4.5||!f&&e>=3,contrastRatio:e}},y.elementIsDistinct=b;var C=["IMG","CANVAS","OBJECT","IFRAME","VIDEO","SVG"];y.getBackgroundStack=function(a){var b=a.getBoundingClientRect(),c=void 0,d=void 0;if(!(b.left>window.innerWidth||b.top>window.innerHeight)){c=Math.min(Math.ceil(b.left+b.width/2),window.innerWidth-1),d=Math.min(Math.ceil(b.top+b.height/2),window.innerHeight-1);var e=document.elementsFromPoint(c,d);e=h(e,a),e=z.reduceToElementsBelowFloating(e,a),e=i(e);var g=e.indexOf(a);return f(g,e,a)>=.99?(axe.commons.color.incompleteData.set("bgColor","bgOverlap"),null):-1!==g?e:null}},y.getBackgroundColor=function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];!0!==(arguments.length>2&&void 0!==arguments[2]&&arguments[2])&&a.scrollIntoView();var e=[],f=y.getBackgroundStack(a);if((f||[]).some(function(f){var h=window.getComputedStyle(f),i=d(f,h);return g(a,f,i)||c(f,h)?(e=null,b.push(f),!0):0!==i.alpha&&(b.push(f),e.push(i),1===i.alpha)}),null!==e&&null!==f){e.push(new y.Color(255,255,255,1));return e.reduce(y.flattenColors)}return null},z.isOpaque=function(a){var b=window.getComputedStyle(a);return c(a,b)||1===d(a,b).alpha},y.getForegroundColor=function(a,b){var c=window.getComputedStyle(a),d=new y.Color;d.parseRgbString(c.getPropertyValue("color"));var e=c.getPropertyValue("opacity");if(d.alpha=d.alpha*e,1===d.alpha)return d;var f=y.getBackgroundColor(a,[],b);if(null===f){var g=axe.commons.color.incompleteData.get("bgColor");return axe.commons.color.incompleteData.set("fgColor",g),null}return y.flattenColors(d,f)},y.incompleteData=function(){var a={};return{set:function(b,c){if("string"!=typeof b)throw new Error("Incomplete data: key must be a string");return c&&(a[b]=c),a[b]},get:function(b){return a[b]},clear:function(){a={}}}}(),z.reduceToElementsBelowFloating=function(a,b){var c,d,e,f=["fixed","sticky"],g=[],h=!1;for(c=0;c<a.length;++c)d=a[c],d===b&&(h=!0),e=window.getComputedStyle(d),h||-1===f.indexOf(e.position)?g.push(d):g=[];return g},z.findUp=function(a,b){"use strict";var c,d,e=axe.commons.dom.getRootNode(a);if(d=e.querySelectorAll(b),d=axe.utils.toArray(d),e===document&&!d.length)return null;for(c=a.assignedSlot?a.assignedSlot:a.parentNode,11===c.nodeType&&(c=c.host);c&&-1===d.indexOf(c);)if((c=c.assignedSlot?c.assignedSlot:c.parentNode)&&11===c.nodeType&&(c=c.host,e=axe.commons.dom.getRootNode(c),d=e.querySelectorAll(b),d=axe.utils.toArray(d),e===document&&!d.length))return null;return c},z.getElementByReference=function(a,b){"use strict";var c,d=a.getAttribute(b),e=document;if(d&&"#"===d.charAt(0)){if(d=d.substring(1),c=e.getElementById(d))return c;if(c=e.getElementsByName(d),c.length)return c[0]}return null},z.getElementCoordinates=function(a){"use strict";var b=z.getScrollOffset(document),c=b.left,d=b.top,e=a.getBoundingClientRect();return{top:e.top+d,right:e.right+c,bottom:e.bottom+d,left:e.left+c,width:e.right-e.left,height:e.bottom-e.top}},z.getRootNode=function(a){var b=a.getRootNode&&a.getRootNode()||document;return b===a&&(b=document),b},z.getScrollOffset=function(a){"use strict";if(!a.nodeType&&a.document&&(a=a.document),9===a.nodeType){var b=a.documentElement,c=a.body;return{left:b&&b.scrollLeft||c&&c.scrollLeft||0,top:b&&b.scrollTop||c&&c.scrollTop||0}}return{left:a.scrollLeft,top:a.scrollTop}},z.getViewportSize=function(a){"use strict";var b,c=a.document,d=c.documentElement;return a.innerWidth?{width:a.innerWidth,height:a.innerHeight}:d?{width:d.clientWidth,height:d.clientHeight}:(b=c.body,{width:b.clientWidth,height:b.clientHeight})},z.hasContent=function(a){if(a.actualNode.textContent.trim()||w.label(a))return!0;for(var b=axe.utils.querySelectorAll(a,"*"),c=0;c<b.length;c++)if(w.label(b[c])||z.isVisualContent(b[c].actualNode))return!0;return!1},z.idrefs=function(a,b){"use strict";var c,d,e=z.getRootNode(a),f=[],g=a.getAttribute(b);if(g)for(g=axe.utils.tokenList(g),c=0,d=g.length;c<d;c++)f.push(e.getElementById(g[c]));return f},z.isFocusable=function(a){"use strict";if(!a||a.disabled||!z.isVisible(a)&&"AREA"!==a.nodeName.toUpperCase())return!1;switch(a.nodeName.toUpperCase()){case"A":case"AREA":if(a.href)return!0;break;case"INPUT":return"hidden"!==a.type;case"TEXTAREA":case"SELECT":case"DETAILS":case"BUTTON":return!0}var b=a.getAttribute("tabindex");return!(!b||isNaN(parseInt(b,10)))},z.isHTML5=function(a){var b=a.doctype;return null!==b&&("html"===b.name&&!b.publicId&&!b.systemId)};var D=["block","list-item","table","flex","grid","inline-block"];z.isInTextBlock=function(a){"use strict";if(k(a))return!1;for(var b=a.parentNode;1===b.nodeType&&!k(b);)b=b.parentNode;var c="",d="",e=0;return j(b,function(b){if(2===e)return!1;if(3===b.nodeType&&(c+=b.nodeValue),1===b.nodeType){var f=(b.nodeName||"").toUpperCase();if(-1!==["BR","HR"].indexOf(f))0===e?(c="",d=""):e=2;else{if("none"===b.style.display||"hidden"===b.style.overflow||-1===["",null,"none"].indexOf(b.style.float)||-1===["",null,"relative"].indexOf(b.style.position))return!1;if("A"===f&&b.href||"link"===(b.getAttribute("role")||"").toLowerCase())return b===a&&(e=1),d+=b.textContent,!1}}}),c=axe.commons.text.sanitize(c),d=axe.commons.text.sanitize(d),c.length>d.length},z.isNode=function(a){"use strict";return a instanceof Node},z.isOffscreen=function(a){"use strict";var b,c=document.documentElement,d=window.getComputedStyle(a),e=window.getComputedStyle(document.body||c).getPropertyValue("direction"),f=z.getElementCoordinates(a);if(f.bottom<0&&(function(a,b){for(a=a.parentNode;"html"!==a.nodeName.toLowerCase();){if(a.scrollTop&&(b+=a.scrollTop)>=0)return!1;a=a.parentNode}return!0}(a,f.bottom)||"absolute"===d.position))return!0;if(0===f.left&&0===f.right)return!1;if("ltr"===e){if(f.right<=0)return!0}else if(b=Math.max(c.scrollWidth,z.getViewportSize(window).width),f.left>=b)return!0;return!1},z.isVisible=function(a,b,c){"use strict";var d,e,f;return 9===a.nodeType||(11===a.nodeType&&(a=a.host),null!==(d=window.getComputedStyle(a,null))&&(e=a.nodeName.toUpperCase(),!("none"===d.getPropertyValue("display")||"STYLE"===e.toUpperCase()||"SCRIPT"===e.toUpperCase()||!b&&l(d.getPropertyValue("clip"))||!c&&("hidden"===d.getPropertyValue("visibility")||!b&&z.isOffscreen(a))||b&&"true"===a.getAttribute("aria-hidden"))&&(!!(f=a.assignedSlot?a.assignedSlot:a.parentNode)&&z.isVisible(f,b,!0))))};var E=["checkbox","img","radio","range","slider","spinbutton","textbox"];z.isVisualContent=function(a){var b=a.getAttribute("role");if(b)return-1!==E.indexOf(b);switch(a.tagName.toUpperCase()){case"IMG":case"IFRAME":case"OBJECT":case"VIDEO":case"AUDIO":case"CANVAS":case"SVG":case"MATH":case"BUTTON":case"SELECT":case"TEXTAREA":case"KEYGEN":case"PROGRESS":case"METER":return!0;case"INPUT":return"hidden"!==a.type;default:return!1}}, +z.visuallyContains=function(a,b){var c=a.getBoundingClientRect(),d={top:c.top+.01,bottom:c.bottom-.01,left:c.left+.01,right:c.right-.01},e=b.getBoundingClientRect(),f=e.top,g=e.left,h={top:f-b.scrollTop,bottom:f-b.scrollTop+b.scrollHeight,left:g-b.scrollLeft,right:g-b.scrollLeft+b.scrollWidth},i=window.getComputedStyle(b);return"inline"===i.getPropertyValue("display")||!(d.left<h.left&&d.left<e.left||d.top<h.top&&d.top<e.top||d.right>h.right&&d.right>e.right||d.bottom>h.bottom&&d.bottom>e.bottom)&&(!(d.right>e.right||d.bottom>e.bottom)||("scroll"===i.overflow||"auto"===i.overflow||"hidden"===i.overflow||b instanceof HTMLBodyElement||b instanceof HTMLHtmlElement))},z.visuallyOverlaps=function(a,b){var c=b.getBoundingClientRect(),d=c.top,e=c.left,f={top:d-b.scrollTop,bottom:d-b.scrollTop+b.scrollHeight,left:e-b.scrollLeft,right:e-b.scrollLeft+b.scrollWidth};if(a.left>f.right&&a.left>c.right||a.top>f.bottom&&a.top>c.bottom||a.right<f.left&&a.right<c.left||a.bottom<f.top&&a.bottom<c.top)return!1;var g=window.getComputedStyle(b);return!(a.left>c.right||a.top>c.bottom)||("scroll"===g.overflow||"auto"===g.overflow||b instanceof HTMLBodyElement||b instanceof HTMLHtmlElement)},A.getAllCells=function(a){var b,c,d,e,f=[];for(b=0,d=a.rows.length;b<d;b++)for(c=0,e=a.rows[b].cells.length;c<e;c++)f.push(a.rows[b].cells[c]);return f},A.getCellPosition=function(a,b){var c,d;for(b||(b=A.toGrid(z.findUp(a,"table"))),c=0;c<b.length;c++)if(b[c]&&-1!==(d=b[c].indexOf(a)))return{x:d,y:c}},A.getHeaders=function(a){if(a.hasAttribute("headers"))return commons.dom.idrefs(a,"headers");var b=commons.table.toGrid(commons.dom.findUp(a,"table")),c=commons.table.getCellPosition(a,b);return[].concat(A.traverse("left",c,b).filter(function(a){return A.isRowHeader(a)}),A.traverse("up",c,b).filter(function(a){return A.isColumnHeader(a)})).reverse()},A.getScope=function(a){var b=a.getAttribute("scope"),c=a.getAttribute("role");if(a instanceof Element==!1||-1===["TD","TH"].indexOf(a.nodeName.toUpperCase()))throw new TypeError("Expected TD or TH element");if("columnheader"===c)return"col";if("rowheader"===c)return"row";if("col"===b||"row"===b)return b;if("TH"!==a.nodeName.toUpperCase())return!1;var d=A.toGrid(z.findUp(a,"table")),e=A.getCellPosition(a);return d[e.y].reduce(function(a,b){return a&&"TH"===b.nodeName.toUpperCase()},!0)?"col":d.map(function(a){return a[e.x]}).reduce(function(a,b){return a&&"TH"===b.nodeName.toUpperCase()},!0)?"row":"auto"},A.isColumnHeader=function(a){return-1!==["col","auto"].indexOf(A.getScope(a))},A.isDataCell=function(a){return!(!a.children.length&&!a.textContent.trim())&&"TD"===a.nodeName.toUpperCase()},A.isDataTable=function(a){var b=a.getAttribute("role");if(("presentation"===b||"none"===b)&&!z.isFocusable(a))return!1;if("true"===a.getAttribute("contenteditable")||z.findUp(a,'[contenteditable="true"]'))return!0;if("grid"===b||"treegrid"===b||"table"===b)return!0;if("landmark"===commons.aria.getRoleType(b))return!0;if("0"===a.getAttribute("datatable"))return!1;if(a.getAttribute("summary"))return!0;if(a.tHead||a.tFoot||a.caption)return!0;for(var c=0,d=a.children.length;c<d;c++)if("COLGROUP"===a.children[c].nodeName.toUpperCase())return!0;for(var e,f,g=0,h=a.rows.length,i=!1,j=0;j<h;j++){e=a.rows[j];for(var k=0,l=e.cells.length;k<l;k++){if(f=e.cells[k],"TH"===f.nodeName.toUpperCase())return!0;if(i||f.offsetWidth===f.clientWidth&&f.offsetHeight===f.clientHeight||(i=!0),f.getAttribute("scope")||f.getAttribute("headers")||f.getAttribute("abbr"))return!0;if(-1!==["columnheader","rowheader"].indexOf(f.getAttribute("role")))return!0;if(1===f.children.length&&"ABBR"===f.children[0].nodeName.toUpperCase())return!0;g++}}if(a.getElementsByTagName("table").length)return!1;if(h<2)return!1;var m=a.rows[Math.ceil(h/2)];if(1===m.cells.length&&1===m.cells[0].colSpan)return!1;if(m.cells.length>=5)return!0;if(i)return!0;var n,o;for(j=0;j<h;j++){if(e=a.rows[j],n&&n!==window.getComputedStyle(e).getPropertyValue("background-color"))return!0;if(n=window.getComputedStyle(e).getPropertyValue("background-color"),o&&o!==window.getComputedStyle(e).getPropertyValue("background-image"))return!0;o=window.getComputedStyle(e).getPropertyValue("background-image")}return h>=20||!(z.getElementCoordinates(a).width>.95*z.getViewportSize(window).width)&&(!(g<10)&&!a.querySelector("object, embed, iframe, applet"))},A.isHeader=function(a){return!(!A.isColumnHeader(a)&&!A.isRowHeader(a))||!!a.id&&!!document.querySelector('[headers~="'+axe.utils.escapeSelector(a.id)+'"]')},A.isRowHeader=function(a){return-1!==["row","auto"].indexOf(A.getScope(a))},A.toGrid=function(a){for(var b=[],c=a.rows,d=0,e=c.length;d<e;d++){var f=c[d].cells;b[d]=b[d]||[];for(var g=0,h=0,i=f.length;h<i;h++)for(var j=0;j<f[h].colSpan;j++){for(var k=0;k<f[h].rowSpan;k++){for(b[d+k]=b[d+k]||[];b[d+k][g];)g++;b[d+k][g]=f[h]}g++}}return b},A.toArray=A.toGrid,function(a){var b=function a(b,c,d,e){var f,g=d[c.y]?d[c.y][c.x]:void 0;return g?"function"==typeof e&&!0===(f=e(g,c,d))?[g]:(f=a(b,{x:c.x+b.x,y:c.y+b.y},d,e),f.unshift(g),f):[]};a.traverse=function(a,c,d,e){if(Array.isArray(c)&&(e=d,d=c,c={x:0,y:0}),"string"==typeof a)switch(a){case"left":a={x:-1,y:0};break;case"up":a={x:0,y:-1};break;case"right":a={x:1,y:0};break;case"down":a={x:0,y:1}}return b(a,{x:c.x+a.x,y:c.y+a.y},d,e)}}(A);var F={submit:"Submit",reset:"Reset"},G=["text","search","tel","url","email","date","time","number","range","color"],H=["A","EM","STRONG","SMALL","MARK","ABBR","DFN","I","B","S","U","CODE","VAR","SAMP","KBD","SUP","SUB","Q","CITE","SPAN","BDO","BDI","BR","WBR","INS","DEL","IMG","EMBED","OBJECT","IFRAME","MAP","AREA","SCRIPT","NOSCRIPT","RUBY","VIDEO","AUDIO","INPUT","TEXTAREA","SELECT","BUTTON","LABEL","OUTPUT","DATALIST","KEYGEN","PROGRESS","COMMAND","CANVAS","TIME","METER"];B.accessibleText=function(a,b){function c(a,b,c){for(var d,e=a.childNodes,g="",h=0;h<e.length;h++)d=e[h],3===d.nodeType?g+=d.textContent:1===d.nodeType&&(-1===H.indexOf(d.nodeName.toUpperCase())&&(g+=" "),g+=f(e[h],b,c));return g}function d(a,b,d){var e="",g=a.nodeName.toUpperCase();if(p(a)&&(e=c(a,!1,!1)||"",v(e)))return e;if("FIGURE"===g&&(e=s(a,"figcaption"),v(e)))return e;if("TABLE"===g){if(e=s(a,"caption"),v(e))return e;if(e=a.getAttribute("title")||a.getAttribute("summary")||"",v(e))return e}if(u(a))return a.getAttribute("alt")||"";if(o(a)&&!d){if(n(a))return a.value||a.title||F[a.type]||"";var h=m(a);if(h)return f(h,b,!0)}return""}function e(a,b,c){return!b&&a.hasAttribute("aria-labelledby")?B.sanitize(z.idrefs(a,"aria-labelledby").map(function(b){return a===b&&g.pop(),f(b,!0,a!==b)}).join(" ")):c&&t(a)||!a.hasAttribute("aria-label")?"":B.sanitize(a.getAttribute("aria-label"))}var f,g=[];return f=function(a,b,f){"use strict";var h;if(null===a||-1!==g.indexOf(a))return"";if(!b&&!z.isVisible(a,!0))return"";g.push(a);var i=a.getAttribute("role");return h=e(a,b,f),v(h)?h:(h=d(a,b,f),v(h)?h:f&&(h=r(a),v(h))?h:q(a)||i&&-1===w.getRolesWithNameFromContents().indexOf(i)||(h=c(a,b,f),!v(h))?a.hasAttribute("title")?a.getAttribute("title"):"":h)},B.sanitize(f(a,b))},B.label=function(a){var b,c,d;return(c=w.label(a))?c:a.actualNode.id&&(d=axe.commons.dom.getRootNode(a.actualNode),b=d.querySelector('label[for="'+axe.utils.escapeSelector(a.actualNode.id)+'"]'),b=axe.utils.getNodeFromTree(axe._tree[0],b),c=b&&B.visible(b,!0))?c:(b=z.findUp(a.actualNode,"label"),b=axe.utils.getNodeFromTree(axe._tree[0],b),(c=b&&B.visible(b,!0))||null)},B.sanitize=function(a){"use strict";return a.replace(/\r\n/g,"\n").replace(/\u00A0/g," ").replace(/[\s]{2,}/g," ").trim()},B.visible=function(a,b,c){"use strict";var d,e,f,g=a.children,h=g.length,i="";for(d=0;d<h;d++)e=g[d],3===e.actualNode.nodeType?(f=e.actualNode.nodeValue)&&z.isVisible(a.actualNode,b)&&(i+=f):c||(i+=B.visible(e,b));return B.sanitize(i)},axe.utils.toArray=function(a){"use strict";return Array.prototype.slice.call(a)},axe.utils.tokenList=function(a){"use strict";return a.trim().replace(/\s{2,}/g," ").split(" ")} +;var I=["aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","ba","be","bg","bh","bi","bm","bn","bo","br","bs","ca","ce","ch","co","cr","cs","cu","cv","cy","da","de","dv","dz","ee","el","en","eo","es","et","eu","fa","ff","fi","fj","fo","fr","fy","ga","gd","gl","gn","gu","gv","ha","he","hi","ho","hr","ht","hu","hy","hz","ia","id","ie","ig","ii","ik","in","io","is","it","iu","iw","ja","ji","jv","jw","ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","la","lb","lg","li","ln","lo","lt","lu","lv","mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","oc","oj","om","or","os","pa","pi","pl","ps","pt","qu","rm","rn","ro","ru","rw","sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","ug","uk","ur","uz","ve","vi","vo","wa","wo","xh","yi","yo","za","zh","zu","aaa","aab","aac","aad","aae","aaf","aag","aah","aai","aak","aal","aam","aan","aao","aap","aaq","aas","aat","aau","aav","aaw","aax","aaz","aba","abb","abc","abd","abe","abf","abg","abh","abi","abj","abl","abm","abn","abo","abp","abq","abr","abs","abt","abu","abv","abw","abx","aby","abz","aca","acb","acd","ace","acf","ach","aci","ack","acl","acm","acn","acp","acq","acr","acs","act","acu","acv","acw","acx","acy","acz","ada","adb","add","ade","adf","adg","adh","adi","adj","adl","adn","ado","adp","adq","adr","ads","adt","adu","adw","adx","ady","adz","aea","aeb","aec","aed","aee","aek","ael","aem","aen","aeq","aer","aes","aeu","aew","aey","aez","afa","afb","afd","afe","afg","afh","afi","afk","afn","afo","afp","afs","aft","afu","afz","aga","agb","agc","agd","age","agf","agg","agh","agi","agj","agk","agl","agm","agn","ago","agp","agq","agr","ags","agt","agu","agv","agw","agx","agy","agz","aha","ahb","ahg","ahh","ahi","ahk","ahl","ahm","ahn","aho","ahp","ahr","ahs","aht","aia","aib","aic","aid","aie","aif","aig","aih","aii","aij","aik","ail","aim","ain","aio","aip","aiq","air","ais","ait","aiw","aix","aiy","aja","ajg","aji","ajn","ajp","ajt","aju","ajw","ajz","akb","akc","akd","ake","akf","akg","akh","aki","akj","akk","akl","akm","ako","akp","akq","akr","aks","akt","aku","akv","akw","akx","aky","akz","ala","alc","ald","ale","alf","alg","alh","ali","alj","alk","all","alm","aln","alo","alp","alq","alr","als","alt","alu","alv","alw","alx","aly","alz","ama","amb","amc","ame","amf","amg","ami","amj","amk","aml","amm","amn","amo","amp","amq","amr","ams","amt","amu","amv","amw","amx","amy","amz","ana","anb","anc","and","ane","anf","ang","anh","ani","anj","ank","anl","anm","ann","ano","anp","anq","anr","ans","ant","anu","anv","anw","anx","any","anz","aoa","aob","aoc","aod","aoe","aof","aog","aoh","aoi","aoj","aok","aol","aom","aon","aor","aos","aot","aou","aox","aoz","apa","apb","apc","apd","ape","apf","apg","aph","api","apj","apk","apl","apm","apn","apo","app","apq","apr","aps","apt","apu","apv","apw","apx","apy","apz","aqa","aqc","aqd","aqg","aql","aqm","aqn","aqp","aqr","aqt","aqz","arb","arc","ard","are","arh","ari","arj","ark","arl","arn","aro","arp","arq","arr","ars","art","aru","arv","arw","arx","ary","arz","asa","asb","asc","asd","ase","asf","asg","ash","asi","asj","ask","asl","asn","aso","asp","asq","asr","ass","ast","asu","asv","asw","asx","asy","asz","ata","atb","atc","atd","ate","atg","ath","ati","atj","atk","atl","atm","atn","ato","atp","atq","atr","ats","att","atu","atv","atw","atx","aty","atz","aua","aub","auc","aud","aue","auf","aug","auh","aui","auj","auk","aul","aum","aun","auo","aup","auq","aur","aus","aut","auu","auw","aux","auy","auz","avb","avd","avi","avk","avl","avm","avn","avo","avs","avt","avu","avv","awa","awb","awc","awd","awe","awg","awh","awi","awk","awm","awn","awo","awr","aws","awt","awu","awv","aww","awx","awy","axb","axe","axg","axk","axl","axm","axx","aya","ayb","ayc","ayd","aye","ayg","ayh","ayi","ayk","ayl","ayn","ayo","ayp","ayq","ayr","ays","ayt","ayu","ayx","ayy","ayz","aza","azb","azc","azd","azg","azj","azm","azn","azo","azt","azz","baa","bab","bac","bad","bae","baf","bag","bah","bai","baj","bal","ban","bao","bap","bar","bas","bat","bau","bav","baw","bax","bay","baz","bba","bbb","bbc","bbd","bbe","bbf","bbg","bbh","bbi","bbj","bbk","bbl","bbm","bbn","bbo","bbp","bbq","bbr","bbs","bbt","bbu","bbv","bbw","bbx","bby","bbz","bca","bcb","bcc","bcd","bce","bcf","bcg","bch","bci","bcj","bck","bcl","bcm","bcn","bco","bcp","bcq","bcr","bcs","bct","bcu","bcv","bcw","bcy","bcz","bda","bdb","bdc","bdd","bde","bdf","bdg","bdh","bdi","bdj","bdk","bdl","bdm","bdn","bdo","bdp","bdq","bdr","bds","bdt","bdu","bdv","bdw","bdx","bdy","bdz","bea","beb","bec","bed","bee","bef","beg","beh","bei","bej","bek","bem","beo","bep","beq","ber","bes","bet","beu","bev","bew","bex","bey","bez","bfa","bfb","bfc","bfd","bfe","bff","bfg","bfh","bfi","bfj","bfk","bfl","bfm","bfn","bfo","bfp","bfq","bfr","bfs","bft","bfu","bfw","bfx","bfy","bfz","bga","bgb","bgc","bgd","bge","bgf","bgg","bgi","bgj","bgk","bgl","bgm","bgn","bgo","bgp","bgq","bgr","bgs","bgt","bgu","bgv","bgw","bgx","bgy","bgz","bha","bhb","bhc","bhd","bhe","bhf","bhg","bhh","bhi","bhj","bhk","bhl","bhm","bhn","bho","bhp","bhq","bhr","bhs","bht","bhu","bhv","bhw","bhx","bhy","bhz","bia","bib","bic","bid","bie","bif","big","bij","bik","bil","bim","bin","bio","bip","biq","bir","bit","biu","biv","biw","bix","biy","biz","bja","bjb","bjc","bjd","bje","bjf","bjg","bjh","bji","bjj","bjk","bjl","bjm","bjn","bjo","bjp","bjq","bjr","bjs","bjt","bju","bjv","bjw","bjx","bjy","bjz","bka","bkb","bkc","bkd","bkf","bkg","bkh","bki","bkj","bkk","bkl","bkm","bkn","bko","bkp","bkq","bkr","bks","bkt","bku","bkv","bkw","bkx","bky","bkz","bla","blb","blc","bld","ble","blf","blg","blh","bli","blj","blk","bll","blm","bln","blo","blp","blq","blr","bls","blt","blv","blw","blx","bly","blz","bma","bmb","bmc","bmd","bme","bmf","bmg","bmh","bmi","bmj","bmk","bml","bmm","bmn","bmo","bmp","bmq","bmr","bms","bmt","bmu","bmv","bmw","bmx","bmy","bmz","bna","bnb","bnc","bnd","bne","bnf","bng","bni","bnj","bnk","bnl","bnm","bnn","bno","bnp","bnq","bnr","bns","bnt","bnu","bnv","bnw","bnx","bny","bnz","boa","bob","boe","bof","bog","boh","boi","boj","bok","bol","bom","bon","boo","bop","boq","bor","bot","bou","bov","bow","box","boy","boz","bpa","bpb","bpd","bpg","bph","bpi","bpj","bpk","bpl","bpm","bpn","bpo","bpp","bpq","bpr","bps","bpt","bpu","bpv","bpw","bpx","bpy","bpz","bqa","bqb","bqc","bqd","bqf","bqg","bqh","bqi","bqj","bqk","bql","bqm","bqn","bqo","bqp","bqq","bqr","bqs","bqt","bqu","bqv","bqw","bqx","bqy","bqz","bra","brb","brc","brd","brf","brg","brh","bri","brj","brk","brl","brm","brn","bro","brp","brq","brr","brs","brt","bru","brv","brw","brx","bry","brz","bsa","bsb","bsc","bse","bsf","bsg","bsh","bsi","bsj","bsk","bsl","bsm","bsn","bso","bsp","bsq","bsr","bss","bst","bsu","bsv","bsw","bsx","bsy","bta","btb","btc","btd","bte","btf","btg","bth","bti","btj","btk","btl","btm","btn","bto","btp","btq","btr","bts","btt","btu","btv","btw","btx","bty","btz","bua","bub","buc","bud","bue","buf","bug","buh","bui","buj","buk","bum","bun","buo","bup","buq","bus","but","buu","buv","buw","bux","buy","buz","bva","bvb","bvc","bvd","bve","bvf","bvg","bvh","bvi","bvj","bvk","bvl","bvm","bvn","bvo","bvp","bvq","bvr","bvt","bvu","bvv","bvw","bvx","bvy","bvz","bwa","bwb","bwc","bwd","bwe","bwf","bwg","bwh","bwi","bwj","bwk","bwl","bwm","bwn","bwo","bwp","bwq","bwr","bws","bwt","bwu","bww","bwx","bwy","bwz","bxa","bxb","bxc","bxd","bxe","bxf","bxg","bxh","bxi","bxj","bxk","bxl","bxm","bxn","bxo","bxp","bxq","bxr","bxs","bxu","bxv","bxw","bxx","bxz","bya","byb","byc","byd","bye","byf","byg","byh","byi","byj","byk","byl","bym","byn","byo","byp","byq","byr","bys","byt","byv","byw","byx","byy","byz","bza","bzb","bzc","bzd","bze","bzf","bzg","bzh","bzi","bzj","bzk","bzl","bzm","bzn","bzo","bzp","bzq","bzr","bzs","bzt","bzu","bzv","bzw","bzx","bzy","bzz","caa","cab","cac","cad","cae","caf","cag","cah","cai","caj","cak","cal","cam","can","cao","cap","caq","car","cas","cau","cav","caw","cax","cay","caz","cba","cbb","cbc","cbd","cbe","cbg","cbh","cbi","cbj","cbk","cbl","cbn","cbo","cbq","cbr","cbs","cbt","cbu","cbv","cbw","cby","cca","ccc","ccd","cce","ccg","cch","ccj","ccl","ccm","ccn","cco","ccp","ccq","ccr","ccs","cda","cdc","cdd","cde","cdf","cdg","cdh","cdi","cdj","cdm","cdn","cdo","cdr","cds","cdy","cdz","cea","ceb","ceg","cek","cel","cen","cet","cfa","cfd","cfg","cfm","cga","cgc","cgg","cgk","chb","chc","chd","chf","chg","chh","chj","chk","chl","chm","chn","cho","chp","chq","chr","cht","chw","chx","chy","chz","cia","cib","cic","cid","cie","cih","cik","cim","cin","cip","cir","ciw","ciy","cja","cje","cjh","cji","cjk","cjm","cjn","cjo","cjp","cjr","cjs","cjv","cjy","cka","ckb","ckh","ckl","ckn","cko","ckq","ckr","cks","ckt","cku","ckv","ckx","cky","ckz","cla","clc","cld","cle","clh","cli","clj","clk","cll","clm","clo","clt","clu","clw","cly","cma","cmc","cme","cmg","cmi","cmk","cml","cmm","cmn","cmo","cmr","cms","cmt","cna","cnb","cnc","cng","cnh","cni","cnk","cnl","cno","cns","cnt","cnu","cnw","cnx","coa","cob","coc","cod","coe","cof","cog","coh","coj","cok","col","com","con","coo","cop","coq","cot","cou","cov","cow","cox","coy","coz","cpa","cpb","cpc","cpe","cpf","cpg","cpi","cpn","cpo","cpp","cps","cpu","cpx","cpy","cqd","cqu","cra","crb","crc","crd","crf","crg","crh","cri","crj","crk","crl","crm","crn","cro","crp","crq","crr","crs","crt","crv","crw","crx","cry","crz","csa","csb","csc","csd","cse","csf","csg","csh","csi","csj","csk","csl","csm","csn","cso","csq","csr","css","cst","csu","csv","csw","csy","csz","cta","ctc","ctd","cte","ctg","cth","ctl","ctm","ctn","cto","ctp","cts","ctt","ctu","ctz","cua","cub","cuc","cug","cuh","cui","cuj","cuk","cul","cum","cuo","cup","cuq","cur","cus","cut","cuu","cuv","cuw","cux","cvg","cvn","cwa","cwb","cwd","cwe","cwg","cwt","cya","cyb","cyo","czh","czk","czn","czo","czt","daa","dac","dad","dae","daf","dag","dah","dai","daj","dak","dal","dam","dao","dap","daq","dar","das","dau","dav","daw","dax","day","daz","dba","dbb","dbd","dbe","dbf","dbg","dbi","dbj","dbl","dbm","dbn","dbo","dbp","dbq","dbr","dbt","dbu","dbv","dbw","dby","dcc","dcr","dda","ddd","dde","ddg","ddi","ddj","ddn","ddo","ddr","dds","ddw","dec","ded","dee","def","deg","deh","dei","dek","del","dem","den","dep","deq","der","des","dev","dez","dga","dgb","dgc","dgd","dge","dgg","dgh","dgi","dgk","dgl","dgn","dgo","dgr","dgs","dgt","dgu","dgw","dgx","dgz","dha","dhd","dhg","dhi","dhl","dhm","dhn","dho","dhr","dhs","dhu","dhv","dhw","dhx","dia","dib","dic","did","dif","dig","dih","dii","dij","dik","dil","dim","din","dio","dip","diq","dir","dis","dit","diu","diw","dix","diy","diz","dja","djb","djc","djd","dje","djf","dji","djj","djk","djl","djm","djn","djo","djr","dju","djw","dka","dkk","dkl","dkr","dks","dkx","dlg","dlk","dlm","dln","dma","dmb","dmc","dmd","dme","dmg","dmk","dml","dmm","dmn","dmo","dmr","dms","dmu","dmv","dmw","dmx","dmy","dna","dnd","dne","dng","dni","dnj","dnk","dnn","dnr","dnt","dnu","dnv","dnw","dny","doa","dob","doc","doe","dof","doh","doi","dok","dol","don","doo","dop","doq","dor","dos","dot","dov","dow","dox","doy","doz","dpp","dra","drb","drc","drd","dre","drg","drh","dri","drl","drn","dro","drq","drr","drs","drt","dru","drw","dry","dsb","dse","dsh","dsi","dsl","dsn","dso","dsq","dta","dtb","dtd","dth","dti","dtk","dtm","dtn","dto","dtp","dtr","dts","dtt","dtu","dty","dua","dub","duc","dud","due","duf","dug","duh","dui","duj","duk","dul","dum","dun","duo","dup","duq","dur","dus","duu","duv","duw","dux","duy","duz","dva","dwa","dwl","dwr","dws","dwu","dww","dwy","dya","dyb","dyd","dyg","dyi","dym","dyn","dyo","dyu","dyy","dza","dzd","dze","dzg","dzl","dzn","eaa","ebg","ebk","ebo","ebr","ebu","ecr","ecs","ecy","eee","efa","efe","efi","ega","egl","ego","egx","egy","ehu","eip","eit","eiv","eja","eka","ekc","eke","ekg","eki","ekk","ekl","ekm","eko","ekp","ekr","eky","ele","elh","eli","elk","elm","elo","elp","elu","elx","ema","emb","eme","emg","emi","emk","emm","emn","emo","emp","ems","emu","emw","emx","emy","ena","enb","enc","end","enf","enh","enl","enm","enn","eno","enq","enr","enu","env","enw","enx","eot","epi","era","erg","erh","eri","erk","ero","err","ers","ert","erw","ese","esg","esh","esi","esk","esl","esm","esn","eso","esq","ess","esu","esx","esy","etb","etc","eth","etn","eto","etr","ets","ett","etu","etx","etz","euq","eve","evh","evn","ewo","ext","eya","eyo","eza","eze","faa","fab","fad","faf","fag","fah","fai","faj","fak","fal","fam","fan","fap","far","fat","fau","fax","fay","faz","fbl","fcs","fer","ffi","ffm","fgr","fia","fie","fil","fip","fir","fit","fiu","fiw","fkk","fkv","fla","flh","fli","fll","fln","flr","fly","fmp","fmu","fnb","fng","fni","fod","foi","fom","fon","for","fos","fox","fpe","fqs","frc","frd","frk","frm","fro","frp","frq","frr","frs","frt","fse","fsl","fss","fub","fuc","fud","fue","fuf","fuh","fui","fuj","fum","fun","fuq","fur","fut","fuu","fuv","fuy","fvr","fwa","fwe","gaa","gab","gac","gad","gae","gaf","gag","gah","gai","gaj","gak","gal","gam","gan","gao","gap","gaq","gar","gas","gat","gau","gav","gaw","gax","gay","gaz","gba","gbb","gbc","gbd","gbe","gbf","gbg","gbh","gbi","gbj","gbk","gbl","gbm","gbn","gbo","gbp","gbq","gbr","gbs","gbu","gbv","gbw","gbx","gby","gbz","gcc","gcd","gce","gcf","gcl","gcn","gcr","gct","gda","gdb","gdc","gdd","gde","gdf","gdg","gdh","gdi","gdj","gdk","gdl","gdm","gdn","gdo","gdq","gdr","gds","gdt","gdu","gdx","gea","geb","gec","ged","geg","geh","gei","gej","gek","gel","gem","geq","ges","gev","gew","gex","gey","gez","gfk","gft","gfx","gga","ggb","ggd","gge","ggg","ggk","ggl","ggn","ggo","ggr","ggt","ggu","ggw","gha","ghc","ghe","ghh","ghk","ghl","ghn","gho","ghr","ghs","ght","gia","gib","gic","gid","gie","gig","gih","gil","gim","gin","gio","gip","giq","gir","gis","git","giu","giw","gix","giy","giz","gji","gjk","gjm","gjn","gjr","gju","gka","gke","gkn","gko","gkp","gku","glc","gld","glh","gli","glj","glk","gll","glo","glr","glu","glw","gly","gma","gmb","gmd","gme","gmg","gmh","gml","gmm","gmn","gmq","gmu","gmv","gmw","gmx","gmy","gmz","gna","gnb","gnc","gnd","gne","gng","gnh","gni","gnk","gnl","gnm","gnn","gno","gnq","gnr","gnt","gnu","gnw","gnz","goa","gob","goc","god","goe","gof","gog","goh","goi","goj","gok","gol","gom","gon","goo","gop","goq","gor","gos","got","gou","gow","gox","goy","goz","gpa","gpe","gpn","gqa","gqi","gqn","gqr","gqu","gra","grb","grc","grd","grg","grh","gri","grj","grk","grm","gro","grq","grr","grs","grt","gru","grv","grw","grx","gry","grz","gse","gsg","gsl","gsm","gsn","gso","gsp","gss","gsw","gta","gti","gtu","gua","gub","guc","gud","gue","guf","gug","guh","gui","guk","gul","gum","gun","guo","gup","guq","gur","gus","gut","guu","guv","guw","gux","guz","gva","gvc","gve","gvf","gvj","gvl","gvm","gvn","gvo","gvp","gvr","gvs","gvy","gwa","gwb","gwc","gwd","gwe","gwf","gwg","gwi","gwj","gwm","gwn","gwr","gwt","gwu","gww","gwx","gxx","gya","gyb","gyd","gye","gyf","gyg","gyi","gyl","gym","gyn","gyr","gyy","gza","gzi","gzn","haa","hab","hac","had","hae","haf","hag","hah","hai","haj","hak","hal","ham","han","hao","hap","haq","har","has","hav","haw","hax","hay","haz","hba","hbb","hbn","hbo","hbu","hca","hch","hdn","hds","hdy","hea","hed","heg","heh","hei","hem","hgm","hgw","hhi","hhr","hhy","hia","hib","hid","hif","hig","hih","hii","hij","hik","hil","him","hio","hir","hit","hiw","hix","hji","hka","hke","hkk","hks","hla","hlb","hld","hle","hlt","hlu","hma","hmb","hmc","hmd","hme","hmf","hmg","hmh","hmi","hmj","hmk","hml","hmm","hmn","hmp","hmq","hmr","hms","hmt","hmu","hmv","hmw","hmx","hmy","hmz","hna","hnd","hne","hnh","hni","hnj","hnn","hno","hns","hnu","hoa","hob","hoc","hod","hoe","hoh","hoi","hoj","hok","hol","hom","hoo","hop","hor","hos","hot","hov","how","hoy","hoz","hpo","hps","hra","hrc","hre","hrk","hrm","hro","hrp","hrr","hrt","hru","hrw","hrx","hrz","hsb","hsh","hsl","hsn","hss","hti","hto","hts","htu","htx","hub","huc","hud","hue","huf","hug","huh","hui","huj","huk","hul","hum","huo","hup","huq","hur","hus","hut","huu","huv","huw","hux","huy","huz","hvc","hve","hvk","hvn","hvv","hwa","hwc","hwo","hya","hyx","iai","ian","iap","iar","iba","ibb","ibd","ibe","ibg","ibh","ibi","ibl","ibm","ibn","ibr","ibu","iby","ica","ich","icl","icr","ida","idb","idc","idd","ide","idi","idr","ids","idt","idu","ifa","ifb","ife","iff","ifk","ifm","ifu","ify","igb","ige","igg","igl","igm","ign","igo","igs","igw","ihb","ihi","ihp","ihw","iin","iir","ijc","ije","ijj","ijn","ijo","ijs","ike","iki","ikk","ikl","iko","ikp","ikr","iks","ikt","ikv","ikw","ikx","ikz","ila","ilb","ilg","ili","ilk","ill","ilm","ilo","ilp","ils","ilu","ilv","ilw","ima","ime","imi","iml","imn","imo","imr","ims","imy","inb","inc","ine","ing","inh","inj","inl","inm","inn","ino","inp","ins","int","inz","ior","iou","iow","ipi","ipo","iqu","iqw","ira","ire","irh","iri","irk","irn","iro","irr","iru","irx","iry","isa","isc","isd","ise","isg","ish","isi","isk","ism","isn","iso","isr","ist","isu","itb","itc","itd","ite","iti","itk","itl","itm","ito","itr","its","itt","itv","itw","itx","ity","itz","ium","ivb","ivv","iwk","iwm","iwo","iws","ixc","ixl","iya","iyo","iyx","izh","izi","izr","izz","jaa","jab","jac","jad","jae","jaf","jah","jaj","jak","jal","jam","jan","jao","jaq","jar","jas","jat","jau","jax","jay","jaz","jbe","jbi","jbj","jbk","jbn","jbo","jbr","jbt","jbu","jbw","jcs","jct","jda","jdg","jdt","jeb","jee","jeg","jeh","jei","jek","jel","jen","jer","jet","jeu","jgb","jge","jgk","jgo","jhi","jhs","jia","jib","jic","jid","jie","jig","jih","jii","jil","jim","jio","jiq","jit","jiu","jiv","jiy","jje","jjr","jka","jkm","jko","jkp","jkr","jku","jle","jls","jma","jmb","jmc","jmd","jmi","jml","jmn","jmr","jms","jmw","jmx","jna","jnd","jng","jni","jnj","jnl","jns","job","jod","jog","jor","jos","jow","jpa","jpr","jpx","jqr","jra","jrb","jrr","jrt","jru","jsl","jua","jub","juc","jud","juh","jui","juk","jul","jum","jun","juo","jup","jur","jus","jut","juu","juw","juy","jvd","jvn","jwi","jya","jye","jyy","kaa","kab","kac","kad","kae","kaf","kag","kah","kai","kaj","kak","kam","kao","kap","kaq","kar","kav","kaw","kax","kay","kba","kbb","kbc","kbd","kbe","kbf","kbg","kbh","kbi","kbj","kbk","kbl","kbm","kbn","kbo","kbp","kbq","kbr","kbs","kbt","kbu","kbv","kbw","kbx","kby","kbz","kca","kcb","kcc","kcd","kce","kcf","kcg","kch","kci","kcj","kck","kcl","kcm","kcn","kco","kcp","kcq","kcr","kcs","kct","kcu","kcv","kcw","kcx","kcy","kcz","kda","kdc","kdd","kde","kdf","kdg","kdh","kdi","kdj","kdk","kdl","kdm","kdn","kdo","kdp","kdq","kdr","kdt","kdu","kdv","kdw","kdx","kdy","kdz","kea","keb","kec","ked","kee","kef","keg","keh","kei","kej","kek","kel","kem","ken","keo","kep","keq","ker","kes","ket","keu","kev","kew","kex","key","kez","kfa","kfb","kfc","kfd","kfe","kff","kfg","kfh","kfi","kfj","kfk","kfl","kfm","kfn","kfo","kfp","kfq","kfr","kfs","kft","kfu","kfv","kfw","kfx","kfy","kfz","kga","kgb","kgc","kgd","kge","kgf","kgg","kgh","kgi","kgj","kgk","kgl","kgm","kgn","kgo","kgp","kgq","kgr","kgs","kgt","kgu","kgv","kgw","kgx","kgy","kha","khb","khc","khd","khe","khf","khg","khh","khi","khj","khk","khl","khn","kho","khp","khq","khr","khs","kht","khu","khv","khw","khx","khy","khz","kia","kib","kic","kid","kie","kif","kig","kih","kii","kij","kil","kim","kio","kip","kiq","kis","kit","kiu","kiv","kiw","kix","kiy","kiz","kja","kjb","kjc","kjd","kje","kjf","kjg","kjh","kji","kjj","kjk","kjl","kjm","kjn","kjo","kjp","kjq","kjr","kjs","kjt","kju","kjv","kjx","kjy","kjz","kka","kkb","kkc","kkd","kke","kkf","kkg","kkh","kki","kkj","kkk","kkl","kkm","kkn","kko","kkp","kkq","kkr","kks","kkt","kku","kkv","kkw","kkx","kky","kkz","kla","klb","klc","kld","kle","klf","klg","klh","kli","klj","klk","kll","klm","kln","klo","klp","klq","klr","kls","klt","klu","klv","klw","klx","kly","klz","kma","kmb","kmc","kmd","kme","kmf","kmg","kmh","kmi","kmj","kmk","kml","kmm","kmn","kmo","kmp","kmq","kmr","kms","kmt","kmu","kmv","kmw","kmx","kmy","kmz","kna","knb","knc","knd","kne","knf","kng","kni","knj","knk","knl","knm","knn","kno","knp","knq","knr","kns","knt","knu","knv","knw","knx","kny","knz","koa","koc","kod","koe","kof","kog","koh","koi","koj","kok","kol","koo","kop","koq","kos","kot","kou","kov","kow","kox","koy","koz","kpa","kpb","kpc","kpd","kpe","kpf","kpg","kph","kpi","kpj","kpk","kpl","kpm","kpn","kpo","kpp","kpq","kpr","kps","kpt","kpu","kpv","kpw","kpx","kpy","kpz","kqa","kqb","kqc","kqd","kqe","kqf","kqg","kqh","kqi","kqj","kqk","kql","kqm","kqn","kqo","kqp","kqq","kqr","kqs","kqt","kqu","kqv","kqw","kqx","kqy","kqz","kra","krb","krc","krd","kre","krf","krh","kri","krj","krk","krl","krm","krn","kro","krp","krr","krs","krt","kru","krv","krw","krx","kry","krz","ksa","ksb","ksc","ksd","kse","ksf","ksg","ksh","ksi","ksj","ksk","ksl","ksm","ksn","kso","ksp","ksq","ksr","kss","kst","ksu","ksv","ksw","ksx","ksy","ksz","kta","ktb","ktc","ktd","kte","ktf","ktg","kth","kti","ktj","ktk","ktl","ktm","ktn","kto","ktp","ktq","ktr","kts","ktt","ktu","ktv","ktw","ktx","kty","ktz","kub","kuc","kud","kue","kuf","kug","kuh","kui","kuj","kuk","kul","kum","kun","kuo","kup","kuq","kus","kut","kuu","kuv","kuw","kux","kuy","kuz","kva","kvb","kvc","kvd","kve","kvf","kvg","kvh","kvi","kvj","kvk","kvl","kvm","kvn","kvo","kvp","kvq","kvr","kvs","kvt","kvu","kvv","kvw","kvx","kvy","kvz","kwa","kwb","kwc","kwd","kwe","kwf","kwg","kwh","kwi","kwj","kwk","kwl","kwm","kwn","kwo","kwp","kwq","kwr","kws","kwt","kwu","kwv","kww","kwx","kwy","kwz","kxa","kxb","kxc","kxd","kxe","kxf","kxh","kxi","kxj","kxk","kxl","kxm","kxn","kxo","kxp","kxq","kxr","kxs","kxt","kxu","kxv","kxw","kxx","kxy","kxz","kya","kyb","kyc","kyd","kye","kyf","kyg","kyh","kyi","kyj","kyk","kyl","kym","kyn","kyo","kyp","kyq","kyr","kys","kyt","kyu","kyv","kyw","kyx","kyy","kyz","kza","kzb","kzc","kzd","kze","kzf","kzg","kzh","kzi","kzj","kzk","kzl","kzm","kzn","kzo","kzp","kzq","kzr","kzs","kzt","kzu","kzv","kzw","kzx","kzy","kzz","laa","lab","lac","lad","lae","laf","lag","lah","lai","laj","lak","lal","lam","lan","lap","laq","lar","las","lau","law","lax","lay","laz","lba","lbb","lbc","lbe","lbf","lbg","lbi","lbj","lbk","lbl","lbm","lbn","lbo","lbq","lbr","lbs","lbt","lbu","lbv","lbw","lbx","lby","lbz","lcc","lcd","lce","lcf","lch","lcl","lcm","lcp","lcq","lcs","lda","ldb","ldd","ldg","ldh","ldi","ldj","ldk","ldl","ldm","ldn","ldo","ldp","ldq","lea","leb","lec","led","lee","lef","leg","leh","lei","lej","lek","lel","lem","len","leo","lep","leq","ler","les","let","leu","lev","lew","lex","ley","lez","lfa","lfn","lga","lgb","lgg","lgh","lgi","lgk","lgl","lgm","lgn","lgq","lgr","lgt","lgu","lgz","lha","lhh","lhi","lhl","lhm","lhn","lhp","lhs","lht","lhu","lia","lib","lic","lid","lie","lif","lig","lih","lii","lij","lik","lil","lio","lip","liq","lir","lis","liu","liv","liw","lix","liy","liz","lja","lje","lji","ljl","ljp","ljw","ljx","lka","lkb","lkc","lkd","lke","lkh","lki","lkj","lkl","lkm","lkn","lko","lkr","lks","lkt","lku","lky","lla","llb","llc","lld","lle","llf","llg","llh","lli","llj","llk","lll","llm","lln","llo","llp","llq","lls","llu","llx","lma","lmb","lmc","lmd","lme","lmf","lmg","lmh","lmi","lmj","lmk","lml","lmm","lmn","lmo","lmp","lmq","lmr","lmu","lmv","lmw","lmx","lmy","lmz","lna","lnb","lnd","lng","lnh","lni","lnj","lnl","lnm","lnn","lno","lns","lnu","lnw","lnz","loa","lob","loc","loe","lof","log","loh","loi","loj","lok","lol","lom","lon","loo","lop","loq","lor","los","lot","lou","lov","low","lox","loy","loz","lpa","lpe","lpn","lpo","lpx","lra","lrc","lre","lrg","lri","lrk","lrl","lrm","lrn","lro","lrr","lrt","lrv","lrz","lsa","lsd","lse","lsg","lsh","lsi","lsl","lsm","lso","lsp","lsr","lss","lst","lsy","ltc","ltg","lth","lti","ltn","lto","lts","ltu","lua","luc","lud","lue","luf","lui","luj","luk","lul","lum","lun","luo","lup","luq","lur","lus","lut","luu","luv","luw","luy","luz","lva","lvk","lvs","lvu","lwa","lwe","lwg","lwh","lwl","lwm","lwo","lwt","lwu","lww","lya","lyg","lyn","lzh","lzl","lzn","lzz","maa","mab","mad","mae","maf","mag","mai","maj","mak","mam","man","map","maq","mas","mat","mau","mav","maw","max","maz","mba","mbb","mbc","mbd","mbe","mbf","mbh","mbi","mbj","mbk","mbl","mbm","mbn","mbo","mbp","mbq","mbr","mbs","mbt","mbu","mbv","mbw","mbx","mby","mbz","mca","mcb","mcc","mcd","mce","mcf","mcg","mch","mci","mcj","mck","mcl","mcm","mcn","mco","mcp","mcq","mcr","mcs","mct","mcu","mcv","mcw","mcx","mcy","mcz","mda","mdb","mdc","mdd","mde","mdf","mdg","mdh","mdi","mdj","mdk","mdl","mdm","mdn","mdp","mdq","mdr","mds","mdt","mdu","mdv","mdw","mdx","mdy","mdz","mea","meb","mec","med","mee","mef","meg","meh","mei","mej","mek","mel","mem","men","meo","mep","meq","mer","mes","met","meu","mev","mew","mey","mez","mfa","mfb","mfc","mfd","mfe","mff","mfg","mfh","mfi","mfj","mfk","mfl","mfm","mfn","mfo","mfp","mfq","mfr","mfs","mft","mfu","mfv","mfw","mfx","mfy","mfz","mga","mgb","mgc","mgd","mge","mgf","mgg","mgh","mgi","mgj","mgk","mgl","mgm","mgn","mgo","mgp","mgq","mgr","mgs","mgt","mgu","mgv","mgw","mgx","mgy","mgz","mha","mhb","mhc","mhd","mhe","mhf","mhg","mhh","mhi","mhj","mhk","mhl","mhm","mhn","mho","mhp","mhq","mhr","mhs","mht","mhu","mhw","mhx","mhy","mhz","mia","mib","mic","mid","mie","mif","mig","mih","mii","mij","mik","mil","mim","min","mio","mip","miq","mir","mis","mit","miu","miw","mix","miy","miz","mja","mjb","mjc","mjd","mje","mjg","mjh","mji","mjj","mjk","mjl","mjm","mjn","mjo","mjp","mjq","mjr","mjs","mjt","mju","mjv","mjw","mjx","mjy","mjz","mka","mkb","mkc","mke","mkf","mkg","mkh","mki","mkj","mkk","mkl","mkm","mkn","mko","mkp","mkq","mkr","mks","mkt","mku","mkv","mkw","mkx","mky","mkz","mla","mlb","mlc","mld","mle","mlf","mlh","mli","mlj","mlk","mll","mlm","mln","mlo","mlp","mlq","mlr","mls","mlu","mlv","mlw","mlx","mlz","mma","mmb","mmc","mmd","mme","mmf","mmg","mmh","mmi","mmj","mmk","mml","mmm","mmn","mmo","mmp","mmq","mmr","mmt","mmu","mmv","mmw","mmx","mmy","mmz","mna","mnb","mnc","mnd","mne","mnf","mng","mnh","mni","mnj","mnk","mnl","mnm","mnn","mno","mnp","mnq","mnr","mns","mnt","mnu","mnv","mnw","mnx","mny","mnz","moa","moc","mod","moe","mof","mog","moh","moi","moj","mok","mom","moo","mop","moq","mor","mos","mot","mou","mov","mow","mox","moy","moz","mpa","mpb","mpc","mpd","mpe","mpg","mph","mpi","mpj","mpk","mpl","mpm","mpn","mpo","mpp","mpq","mpr","mps","mpt","mpu","mpv","mpw","mpx","mpy","mpz","mqa","mqb","mqc","mqe","mqf","mqg","mqh","mqi","mqj","mqk","mql","mqm","mqn","mqo","mqp","mqq","mqr","mqs","mqt","mqu","mqv","mqw","mqx","mqy","mqz","mra","mrb","mrc","mrd","mre","mrf","mrg","mrh","mrj","mrk","mrl","mrm","mrn","mro","mrp","mrq","mrr","mrs","mrt","mru","mrv","mrw","mrx","mry","mrz","msb","msc","msd","mse","msf","msg","msh","msi","msj","msk","msl","msm","msn","mso","msp","msq","msr","mss","mst","msu","msv","msw","msx","msy","msz","mta","mtb","mtc","mtd","mte","mtf","mtg","mth","mti","mtj","mtk","mtl","mtm","mtn","mto","mtp","mtq","mtr","mts","mtt","mtu","mtv","mtw","mtx","mty","mua","mub","muc","mud","mue","mug","muh","mui","muj","muk","mul","mum","mun","muo","mup","muq","mur","mus","mut","muu","muv","mux","muy","muz","mva","mvb","mvd","mve","mvf","mvg","mvh","mvi","mvk","mvl","mvm","mvn","mvo","mvp","mvq","mvr","mvs","mvt","mvu","mvv","mvw","mvx","mvy","mvz","mwa","mwb","mwc","mwd","mwe","mwf","mwg","mwh","mwi","mwj","mwk","mwl","mwm","mwn","mwo","mwp","mwq","mwr","mws","mwt","mwu","mwv","mww","mwx","mwy","mwz","mxa","mxb","mxc","mxd","mxe","mxf","mxg","mxh","mxi","mxj","mxk","mxl","mxm","mxn","mxo","mxp","mxq","mxr","mxs","mxt","mxu","mxv","mxw","mxx","mxy","mxz","myb","myc","myd","mye","myf","myg","myh","myi","myj","myk","myl","mym","myn","myo","myp","myq","myr","mys","myt","myu","myv","myw","myx","myy","myz","mza","mzb","mzc","mzd","mze","mzg","mzh","mzi","mzj","mzk","mzl","mzm","mzn","mzo","mzp","mzq","mzr","mzs","mzt","mzu","mzv","mzw","mzx","mzy","mzz","naa","nab","nac","nad","nae","naf","nag","nah","nai","naj","nak","nal","nam","nan","nao","nap","naq","nar","nas","nat","naw","nax","nay","naz","nba","nbb","nbc","nbd","nbe","nbf","nbg","nbh","nbi","nbj","nbk","nbm","nbn","nbo","nbp","nbq","nbr","nbs","nbt","nbu","nbv","nbw","nbx","nby","nca","ncb","ncc","ncd","nce","ncf","ncg","nch","nci","ncj","nck","ncl","ncm","ncn","nco","ncp","ncq","ncr","ncs","nct","ncu","ncx","ncz","nda","ndb","ndc","ndd","ndf","ndg","ndh","ndi","ndj","ndk","ndl","ndm","ndn","ndp","ndq","ndr","nds","ndt","ndu","ndv","ndw","ndx","ndy","ndz","nea","neb","nec","ned","nee","nef","neg","neh","nei","nej","nek","nem","nen","neo","neq","ner","nes","net","neu","nev","new","nex","ney","nez","nfa","nfd","nfl","nfr","nfu","nga","ngb","ngc","ngd","nge","ngf","ngg","ngh","ngi","ngj","ngk","ngl","ngm","ngn","ngo","ngp","ngq","ngr","ngs","ngt","ngu","ngv","ngw","ngx","ngy","ngz","nha","nhb","nhc","nhd","nhe","nhf","nhg","nhh","nhi","nhk","nhm","nhn","nho","nhp","nhq","nhr","nht","nhu","nhv","nhw","nhx","nhy","nhz","nia","nib","nic","nid","nie","nif","nig","nih","nii","nij","nik","nil","nim","nin","nio","niq","nir","nis","nit","niu","niv","niw","nix","niy","niz","nja","njb","njd","njh","nji","njj","njl","njm","njn","njo","njr","njs","njt","nju","njx","njy","njz","nka","nkb","nkc","nkd","nke","nkf","nkg","nkh","nki","nkj","nkk","nkm","nkn","nko","nkp","nkq","nkr","nks","nkt","nku","nkv","nkw","nkx","nkz","nla","nlc","nle","nlg","nli","nlj","nlk","nll","nln","nlo","nlq","nlr","nlu","nlv","nlw","nlx","nly","nlz","nma","nmb","nmc","nmd","nme","nmf","nmg","nmh","nmi","nmj","nmk","nml","nmm","nmn","nmo","nmp","nmq","nmr","nms","nmt","nmu","nmv","nmw","nmx","nmy","nmz","nna","nnb","nnc","nnd","nne","nnf","nng","nnh","nni","nnj","nnk","nnl","nnm","nnn","nnp","nnq","nnr","nns","nnt","nnu","nnv","nnw","nnx","nny","nnz","noa","noc","nod","noe","nof","nog","noh","noi","noj","nok","nol","nom","non","noo","nop","noq","nos","not","nou","nov","now","noy","noz","npa","npb","npg","nph","npi","npl","npn","npo","nps","npu","npx","npy","nqg","nqk","nql","nqm","nqn","nqo","nqq","nqy","nra","nrb","nrc","nre","nrf","nrg","nri","nrk","nrl","nrm","nrn","nrp","nrr","nrt","nru","nrx","nrz","nsa","nsc","nsd","nse","nsf","nsg","nsh","nsi","nsk","nsl","nsm","nsn","nso","nsp","nsq","nsr","nss","nst","nsu","nsv","nsw","nsx","nsy","nsz","ntd","nte","ntg","nti","ntj","ntk","ntm","nto","ntp","ntr","nts","ntu","ntw","ntx","nty","ntz","nua","nub","nuc","nud","nue","nuf","nug","nuh","nui","nuj","nuk","nul","num","nun","nuo","nup","nuq","nur","nus","nut","nuu","nuv","nuw","nux","nuy","nuz","nvh","nvm","nvo","nwa","nwb","nwc","nwe","nwg","nwi","nwm","nwo","nwr","nwx","nwy","nxa","nxd","nxe","nxg","nxi","nxk","nxl","nxm","nxn","nxo","nxq","nxr","nxu","nxx","nyb","nyc","nyd","nye","nyf","nyg","nyh","nyi","nyj","nyk","nyl","nym","nyn","nyo","nyp","nyq","nyr","nys","nyt","nyu","nyv","nyw","nyx","nyy","nza","nzb","nzi","nzk","nzm","nzs","nzu","nzy","nzz","oaa","oac","oar","oav","obi","obk","obl","obm","obo","obr","obt","obu","oca","och","oco","ocu","oda","odk","odt","odu","ofo","ofs","ofu","ogb","ogc","oge","ogg","ogo","ogu","oht","ohu","oia","oin","ojb","ojc","ojg","ojp","ojs","ojv","ojw","oka","okb","okd","oke","okg","okh","oki","okj","okk","okl","okm","okn","oko","okr","oks","oku","okv","okx","ola","old","ole","olk","olm","olo","olr","olt","olu","oma","omb","omc","ome","omg","omi","omk","oml","omn","omo","omp","omq","omr","omt","omu","omv","omw","omx","ona","onb","one","ong","oni","onj","onk","onn","ono","onp","onr","ons","ont","onu","onw","onx","ood","oog","oon","oor","oos","opa","opk","opm","opo","opt","opy","ora","orc","ore","org","orh","orn","oro","orr","ors","ort","oru","orv","orw","orx","ory","orz","osa","osc","osi","oso","osp","ost","osu","osx","ota","otb","otd","ote","oti","otk","otl","otm","otn","oto","otq","otr","ots","ott","otu","otw","otx","oty","otz","oua","oub","oue","oui","oum","oun","ovd","owi","owl","oyb","oyd","oym","oyy","ozm","paa","pab","pac","pad","pae","paf","pag","pah","pai","pak","pal","pam","pao","pap","paq","par","pas","pat","pau","pav","paw","pax","pay","paz","pbb","pbc","pbe","pbf","pbg","pbh","pbi","pbl","pbn","pbo","pbp","pbr","pbs","pbt","pbu","pbv","pby","pbz","pca","pcb","pcc","pcd","pce","pcf","pcg","pch","pci","pcj","pck","pcl","pcm","pcn","pcp","pcr","pcw","pda","pdc","pdi","pdn","pdo","pdt","pdu","pea","peb","ped","pee","pef","peg","peh","pei","pej","pek","pel","pem","peo","pep","peq","pes","pev","pex","pey","pez","pfa","pfe","pfl","pga","pgd","pgg","pgi","pgk","pgl","pgn","pgs","pgu","pgy","pgz","pha","phd","phg","phh","phi","phk","phl","phm","phn","pho","phq","phr","pht","phu","phv","phw","pia","pib","pic","pid","pie","pif","pig","pih","pii","pij","pil","pim","pin","pio","pip","pir","pis","pit","piu","piv","piw","pix","piy","piz","pjt","pka","pkb","pkc","pkg","pkh","pkn","pko","pkp","pkr","pks","pkt","pku","pla","plb","plc","pld","ple","plf","plg","plh","plj","plk","pll","pln","plo","plp","plq","plr","pls","plt","plu","plv","plw","ply","plz","pma","pmb","pmc","pmd","pme","pmf","pmh","pmi","pmj","pmk","pml","pmm","pmn","pmo","pmq","pmr","pms","pmt","pmu","pmw","pmx","pmy","pmz","pna","pnb","pnc","pne","png","pnh","pni","pnj","pnk","pnl","pnm","pnn","pno","pnp","pnq","pnr","pns","pnt","pnu","pnv","pnw","pnx","pny","pnz","poc","pod","poe","pof","pog","poh","poi","pok","pom","pon","poo","pop","poq","pos","pot","pov","pow","pox","poy","poz","ppa","ppe","ppi","ppk","ppl","ppm","ppn","ppo","ppp","ppq","ppr","pps","ppt","ppu","pqa","pqe","pqm","pqw","pra","prb","prc","prd","pre","prf","prg","prh","pri","prk","prl","prm","prn","pro","prp","prq","prr","prs","prt","pru","prw","prx","pry","prz","psa","psc","psd","pse","psg","psh","psi","psl","psm","psn","pso","psp","psq","psr","pss","pst","psu","psw","psy","pta","pth","pti","ptn","pto","ptp","ptq","ptr","ptt","ptu","ptv","ptw","pty","pua","pub","puc","pud","pue","puf","pug","pui","puj","puk","pum","puo","pup","puq","pur","put","puu","puw","pux","puy","puz","pwa","pwb","pwg","pwi","pwm","pwn","pwo","pwr","pww","pxm","pye","pym","pyn","pys","pyu","pyx","pyy","pzn","qaa..qtz","qua","qub","quc","qud","quf","qug","quh","qui","quk","qul","qum","qun","qup","quq","qur","qus","quv","quw","qux","quy","quz","qva","qvc","qve","qvh","qvi","qvj","qvl","qvm","qvn","qvo","qvp","qvs","qvw","qvy","qvz","qwa","qwc","qwe","qwh","qwm","qws","qwt","qxa","qxc","qxh","qxl","qxn","qxo","qxp","qxq","qxr","qxs","qxt","qxu","qxw","qya","qyp","raa","rab","rac","rad","raf","rag","rah","rai","raj","rak","ral","ram","ran","rao","rap","raq","rar","ras","rat","rau","rav","raw","rax","ray","raz","rbb","rbk","rbl","rbp","rcf","rdb","rea","reb","ree","reg","rei","rej","rel","rem","ren","rer","res","ret","rey","rga","rge","rgk","rgn","rgr","rgs","rgu","rhg","rhp","ria","rie","rif","ril","rim","rin","rir","rit","riu","rjg","rji","rjs","rka","rkb","rkh","rki","rkm","rkt","rkw","rma","rmb","rmc","rmd","rme","rmf","rmg","rmh","rmi","rmk","rml","rmm","rmn","rmo","rmp","rmq","rmr","rms","rmt","rmu","rmv","rmw","rmx","rmy","rmz","rna","rnd","rng","rnl","rnn","rnp","rnr","rnw","roa","rob","roc","rod","roe","rof","rog","rol","rom","roo","rop","ror","rou","row","rpn","rpt","rri","rro","rrt","rsb","rsi","rsl","rsm","rtc","rth","rtm","rts","rtw","rub","ruc","rue","ruf","rug","ruh","rui","ruk","ruo","rup","ruq","rut","ruu","ruy","ruz","rwa","rwk","rwm","rwo","rwr","rxd","rxw","ryn","rys","ryu","rzh","saa","sab","sac","sad","sae","saf","sah","sai","saj","sak","sal","sam","sao","sap","saq","sar","sas","sat","sau","sav","saw","sax","say","saz","sba","sbb","sbc","sbd","sbe","sbf","sbg","sbh","sbi","sbj","sbk","sbl","sbm","sbn","sbo","sbp","sbq","sbr","sbs","sbt","sbu","sbv","sbw","sbx","sby","sbz","sca","scb","sce","scf","scg","sch","sci","sck","scl","scn","sco","scp","scq","scs","sct","scu","scv","scw","scx","sda","sdb","sdc","sde","sdf","sdg","sdh","sdj","sdk","sdl","sdm","sdn","sdo","sdp","sdr","sds","sdt","sdu","sdv","sdx","sdz","sea","seb","sec","sed","see","sef","seg","seh","sei","sej","sek","sel","sem","sen","seo","sep","seq","ser","ses","set","seu","sev","sew","sey","sez","sfb","sfe","sfm","sfs","sfw","sga","sgb","sgc","sgd","sge","sgg","sgh","sgi","sgj","sgk","sgl","sgm","sgn","sgo","sgp","sgr","sgs","sgt","sgu","sgw","sgx","sgy","sgz","sha","shb","shc","shd","she","shg","shh","shi","shj","shk","shl","shm","shn","sho","shp","shq","shr","shs","sht","shu","shv","shw","shx","shy","shz","sia","sib","sid","sie","sif","sig","sih","sii","sij","sik","sil","sim","sio","sip","siq","sir","sis","sit","siu","siv","siw","six","siy","siz","sja","sjb","sjd","sje","sjg","sjk","sjl","sjm","sjn","sjo","sjp","sjr","sjs","sjt","sju","sjw","ska","skb","skc","skd","ske","skf","skg","skh","ski","skj","skk","skm","skn","sko","skp","skq","skr","sks","skt","sku","skv","skw","skx","sky","skz","sla","slc","sld","sle","slf","slg","slh","sli","slj","sll","slm","sln","slp","slq","slr","sls","slt","slu","slw","slx","sly","slz","sma","smb","smc","smd","smf","smg","smh","smi","smj","smk","sml","smm","smn","smp","smq","smr","sms","smt","smu","smv","smw","smx","smy","smz","snb","snc","sne","snf","sng","snh","sni","snj","snk","snl","snm","snn","sno","snp","snq","snr","sns","snu","snv","snw","snx","sny","snz","soa","sob","soc","sod","soe","sog","soh","soi","soj","sok","sol","son","soo","sop","soq","sor","sos","sou","sov","sow","sox","soy","soz","spb","spc","spd","spe","spg","spi","spk","spl","spm","spn","spo","spp","spq","spr","sps","spt","spu","spv","spx","spy","sqa","sqh","sqj","sqk","sqm","sqn","sqo","sqq","sqr","sqs","sqt","squ","sra","srb","src","sre","srf","srg","srh","sri","srk","srl","srm","srn","sro","srq","srr","srs","srt","sru","srv","srw","srx","sry","srz","ssa","ssb","ssc","ssd","sse","ssf","ssg","ssh","ssi","ssj","ssk","ssl","ssm","ssn","sso","ssp","ssq","ssr","sss","sst","ssu","ssv","ssx","ssy","ssz","sta","stb","std","ste","stf","stg","sth","sti","stj","stk","stl","stm","stn","sto","stp","stq","str","sts","stt","stu","stv","stw","sty","sua","sub","suc","sue","sug","sui","suj","suk","sul","sum","suq","sur","sus","sut","suv","suw","sux","suy","suz","sva","svb","svc","sve","svk","svm","svr","svs","svx","swb","swc","swf","swg","swh","swi","swj","swk","swl","swm","swn","swo","swp","swq","swr","sws","swt","swu","swv","sww","swx","swy","sxb","sxc","sxe","sxg","sxk","sxl","sxm","sxn","sxo","sxr","sxs","sxu","sxw","sya","syb","syc","syd","syi","syk","syl","sym","syn","syo","syr","sys","syw","syx","syy","sza","szb","szc","szd","sze","szg","szl","szn","szp","szs","szv","szw","taa","tab","tac","tad","tae","taf","tag","tai","taj","tak","tal","tan","tao","tap","taq","tar","tas","tau","tav","taw","tax","tay","taz","tba","tbb","tbc","tbd","tbe","tbf","tbg","tbh","tbi","tbj","tbk","tbl","tbm","tbn","tbo","tbp","tbq","tbr","tbs","tbt","tbu","tbv","tbw","tbx","tby","tbz","tca","tcb","tcc","tcd","tce","tcf","tcg","tch","tci","tck","tcl","tcm","tcn","tco","tcp","tcq","tcs","tct","tcu","tcw","tcx","tcy","tcz","tda","tdb","tdc","tdd","tde","tdf","tdg","tdh","tdi","tdj","tdk","tdl","tdm","tdn","tdo","tdq","tdr","tds","tdt","tdu","tdv","tdx","tdy","tea","teb","tec","ted","tee","tef","teg","teh","tei","tek","tem","ten","teo","tep","teq","ter","tes","tet","teu","tev","tew","tex","tey","tfi","tfn","tfo","tfr","tft","tga","tgb","tgc","tgd","tge","tgf","tgg","tgh","tgi","tgj","tgn","tgo","tgp","tgq","tgr","tgs","tgt","tgu","tgv","tgw","tgx","tgy","tgz","thc","thd","the","thf","thh","thi","thk","thl","thm","thn","thp","thq","thr","ths","tht","thu","thv","thw","thx","thy","thz","tia","tic","tid","tie","tif","tig","tih","tii","tij","tik","til","tim","tin","tio","tip","tiq","tis","tit","tiu","tiv","tiw","tix","tiy","tiz","tja","tjg","tji","tjl","tjm","tjn","tjo","tjs","tju","tjw","tka","tkb","tkd","tke","tkf","tkg","tkk","tkl","tkm","tkn","tkp","tkq","tkr","tks","tkt","tku","tkv","tkw","tkx","tkz","tla","tlb","tlc","tld","tlf","tlg","tlh","tli","tlj","tlk","tll","tlm","tln","tlo","tlp","tlq","tlr","tls","tlt","tlu","tlv","tlw","tlx","tly","tma","tmb","tmc","tmd","tme","tmf","tmg","tmh","tmi","tmj","tmk","tml","tmm","tmn","tmo","tmp","tmq","tmr","tms","tmt","tmu","tmv","tmw","tmy","tmz","tna","tnb","tnc","tnd","tne","tnf","tng","tnh","tni","tnk","tnl","tnm","tnn","tno","tnp","tnq","tnr","tns","tnt","tnu","tnv","tnw","tnx","tny","tnz","tob","toc","tod","toe","tof","tog","toh","toi","toj","tol","tom","too","top","toq","tor","tos","tou","tov","tow","tox","toy","toz","tpa","tpc","tpe","tpf","tpg","tpi","tpj","tpk","tpl","tpm","tpn","tpo","tpp","tpq","tpr","tpt","tpu","tpv","tpw","tpx","tpy","tpz","tqb","tql","tqm","tqn","tqo","tqp","tqq","tqr","tqt","tqu","tqw","tra","trb","trc","trd","tre","trf","trg","trh","tri","trj","trk","trl","trm","trn","tro","trp","trq","trr","trs","trt","tru","trv","trw","trx","try","trz","tsa","tsb","tsc","tsd","tse","tsf","tsg","tsh","tsi","tsj","tsk","tsl","tsm","tsp","tsq","tsr","tss","tst","tsu","tsv","tsw","tsx","tsy","tsz","tta","ttb","ttc","ttd","tte","ttf","ttg","tth","tti","ttj","ttk","ttl","ttm","ttn","tto","ttp","ttq","ttr","tts","ttt","ttu","ttv","ttw","tty","ttz","tua","tub","tuc","tud","tue","tuf","tug","tuh","tui","tuj","tul","tum","tun","tuo","tup","tuq","tus","tut","tuu","tuv","tuw","tux","tuy","tuz","tva","tvd","tve","tvk","tvl","tvm","tvn","tvo","tvs","tvt","tvu","tvw","tvy","twa","twb","twc","twd","twe","twf","twg","twh","twl","twm","twn","two","twp","twq","twr","twt","twu","tww","twx","twy","txa","txb","txc","txe","txg","txh","txi","txj","txm","txn","txo","txq","txr","txs","txt","txu","txx","txy","tya","tye","tyh","tyi","tyj","tyl","tyn","typ","tyr","tys","tyt","tyu","tyv","tyx","tyz","tza","tzh","tzj","tzl","tzm","tzn","tzo","tzx","uam","uan","uar","uba","ubi","ubl","ubr","ubu","uby","uda","ude","udg","udi","udj","udl","udm","udu","ues","ufi","uga","ugb","uge","ugn","ugo","ugy","uha","uhn","uis","uiv","uji","uka","ukg","ukh","ukk","ukl","ukp","ukq","uks","uku","ukw","uky","ula","ulb","ulc","ule","ulf","uli","ulk","ull","ulm","uln","ulu","ulw","uma","umb","umc","umd","umg","umi","umm","umn","umo","ump","umr","ums","umu","una","und","une","ung","unk","unm","unn","unp","unr","unu","unx","unz","uok","upi","upv","ura","urb","urc","ure","urf","urg","urh","uri","urj","urk","url","urm","urn","uro","urp","urr","urt","uru","urv","urw","urx","ury","urz","usa","ush","usi","usk","usp","usu","uta","ute","utp","utr","utu","uum","uun","uur","uuu","uve","uvh","uvl","uwa","uya","uzn","uzs","vaa","vae","vaf","vag","vah","vai","vaj","val","vam","van","vao","vap","var","vas","vau","vav","vay","vbb","vbk","vec","ved","vel","vem","veo","vep","ver","vgr","vgt","vic","vid","vif","vig","vil","vin","vis","vit","viv","vka","vki","vkj","vkk","vkl","vkm","vko","vkp","vkt","vku","vlp","vls","vma","vmb","vmc","vmd","vme","vmf","vmg","vmh","vmi","vmj","vmk","vml","vmm","vmp","vmq","vmr","vms","vmu","vmv","vmw","vmx","vmy","vmz","vnk","vnm","vnp","vor","vot","vra","vro","vrs","vrt","vsi","vsl","vsv","vto","vum","vun","vut","vwa","waa","wab","wac","wad","wae","waf","wag","wah","wai","waj","wak","wal","wam","wan","wao","wap","waq","war","was","wat","wau","wav","waw","wax","way","waz","wba","wbb","wbe","wbf","wbh","wbi","wbj","wbk","wbl","wbm","wbp","wbq","wbr","wbs","wbt","wbv","wbw","wca","wci","wdd","wdg","wdj","wdk","wdu","wdy","wea","wec","wed","weg","weh","wei","wem","wen","weo","wep","wer","wes","wet","weu","wew","wfg","wga","wgb","wgg","wgi","wgo","wgu","wgw","wgy","wha","whg","whk","whu","wib","wic","wie","wif","wig","wih","wii","wij","wik","wil","wim","win","wir","wit","wiu","wiv","wiw","wiy","wja","wji","wka","wkb","wkd","wkl","wku","wkw","wky","wla","wlc","wle","wlg","wli","wlk","wll","wlm","wlo","wlr","wls","wlu","wlv","wlw","wlx","wly","wma","wmb","wmc","wmd","wme","wmh","wmi","wmm","wmn","wmo","wms","wmt","wmw","wmx","wnb","wnc","wnd","wne","wng","wni","wnk","wnm","wnn","wno","wnp","wnu","wnw","wny","woa","wob","woc","wod","woe","wof","wog","woi","wok","wom","won","woo","wor","wos","wow","woy","wpc","wra","wrb","wrd","wrg","wrh","wri","wrk","wrl","wrm","wrn","wro","wrp","wrr","wrs","wru","wrv","wrw","wrx","wry","wrz","wsa","wsg","wsi","wsk","wsr","wss","wsu","wsv","wtf","wth","wti","wtk","wtm","wtw","wua","wub","wud","wuh","wul","wum","wun","wur","wut","wuu","wuv","wux","wuy","wwa","wwb","wwo","wwr","www","wxa","wxw","wya","wyb","wyi","wym","wyr","wyy","xaa","xab","xac","xad","xae","xag","xai","xaj","xak","xal","xam","xan","xao","xap","xaq","xar","xas","xat","xau","xav","xaw","xay","xba","xbb","xbc","xbd","xbe","xbg","xbi","xbj","xbm","xbn","xbo","xbp","xbr","xbw","xbx","xby","xcb","xcc","xce","xcg","xch","xcl","xcm","xcn","xco","xcr","xct","xcu","xcv","xcw","xcy","xda","xdc","xdk","xdm","xdo","xdy","xeb","xed","xeg","xel","xem","xep","xer","xes","xet","xeu","xfa","xga","xgb","xgd","xgf","xgg","xgi","xgl","xgm","xgn","xgr","xgu","xgw","xha","xhc","xhd","xhe","xhr","xht","xhu","xhv","xia","xib","xii","xil","xin","xip","xir","xis","xiv","xiy","xjb","xjt","xka","xkb","xkc","xkd","xke","xkf","xkg","xkh","xki","xkj","xkk","xkl","xkn","xko","xkp","xkq","xkr","xks","xkt","xku","xkv","xkw","xkx","xky","xkz","xla","xlb","xlc","xld","xle","xlg","xli","xln","xlo","xlp","xls","xlu","xly","xma","xmb","xmc","xmd","xme","xmf","xmg","xmh","xmj","xmk","xml","xmm","xmn","xmo","xmp","xmq","xmr","xms","xmt","xmu","xmv","xmw","xmx","xmy","xmz","xna","xnb","xnd","xng","xnh","xni","xnk","xnn","xno","xnr","xns","xnt","xnu","xny","xnz","xoc","xod","xog","xoi","xok","xom","xon","xoo","xop","xor","xow","xpa","xpc","xpe","xpg","xpi","xpj","xpk","xpm","xpn","xpo","xpp","xpq","xpr","xps","xpt","xpu","xpy","xqa","xqt","xra","xrb","xrd","xre","xrg","xri","xrm","xrn","xrq","xrr","xrt","xru","xrw","xsa","xsb","xsc","xsd","xse","xsh","xsi","xsj","xsl","xsm","xsn","xso","xsp","xsq","xsr","xss","xsu","xsv","xsy","xta","xtb","xtc","xtd","xte","xtg","xth","xti","xtj","xtl","xtm","xtn","xto","xtp","xtq","xtr","xts","xtt","xtu","xtv","xtw","xty","xtz","xua","xub","xud","xug","xuj","xul","xum","xun","xuo","xup","xur","xut","xuu","xve","xvi","xvn","xvo","xvs","xwa","xwc","xwd","xwe","xwg","xwj","xwk","xwl","xwo","xwr","xwt","xww","xxb","xxk","xxm","xxr","xxt","xya","xyb","xyj","xyk","xyl","xyt","xyy","xzh","xzm","xzp","yaa","yab","yac","yad","yae","yaf","yag","yah","yai","yaj","yak","yal","yam","yan","yao","yap","yaq","yar","yas","yat","yau","yav","yaw","yax","yay","yaz","yba","ybb","ybd","ybe","ybh","ybi","ybj","ybk","ybl","ybm","ybn","ybo","ybx","yby","ych","ycl","ycn","ycp","yda","ydd","yde","ydg","ydk","yds","yea","yec","yee","yei","yej","yel","yen","yer","yes","yet","yeu","yev","yey","yga","ygi","ygl","ygm","ygp","ygr","ygs","ygu","ygw","yha","yhd","yhl","yhs","yia","yif","yig","yih","yii","yij","yik","yil","yim","yin","yip","yiq","yir","yis","yit","yiu","yiv","yix","yiy","yiz","yka","ykg","yki","ykk","ykl","ykm","ykn","yko","ykr","ykt","yku","yky","yla","ylb","yle","ylg","yli","yll","ylm","yln","ylo","ylr","ylu","yly","yma","ymb","ymc","ymd","yme","ymg","ymh","ymi","ymk","yml","ymm","ymn","ymo","ymp","ymq","ymr","yms","ymt","ymx","ymz","yna","ynd","yne","yng","ynh","ynk","ynl","ynn","yno","ynq","yns","ynu","yob","yog","yoi","yok","yol","yom","yon","yos","yot","yox","yoy","ypa","ypb","ypg","yph","ypk","ypm","ypn","ypo","ypp","ypz","yra","yrb","yre","yri","yrk","yrl","yrm","yrn","yro","yrs","yrw","yry","ysc","ysd","ysg","ysl","ysn","yso","ysp","ysr","yss","ysy","yta","ytl","ytp","ytw","yty","yua","yub","yuc","yud","yue","yuf","yug","yui","yuj","yuk","yul","yum","yun","yup","yuq","yur","yut","yuu","yuw","yux","yuy","yuz","yva","yvt","ywa","ywg","ywl","ywn","ywq","ywr","ywt","ywu","yww","yxa","yxg","yxl","yxm","yxu","yxy","yyr","yyu","yyz","yzg","yzk","zaa","zab","zac","zad","zae","zaf","zag","zah","zai","zaj","zak","zal","zam","zao","zap","zaq","zar","zas","zat","zau","zav","zaw","zax","zay","zaz","zbc","zbe","zbl","zbt","zbw","zca","zch","zdj","zea","zeg","zeh","zen","zga","zgb","zgh","zgm","zgn","zgr","zhb","zhd","zhi","zhn","zhw","zhx","zia","zib","zik","zil","zim","zin","zir","ziw","ziz","zka","zkb","zkd","zkg","zkh","zkk","zkn","zko","zkp","zkr","zkt","zku","zkv","zkz","zle","zlj","zlm","zln","zlq","zls","zlw","zma","zmb","zmc","zmd","zme","zmf","zmg","zmh","zmi","zmj","zmk","zml","zmm","zmn","zmo","zmp","zmq","zmr","zms","zmt","zmu","zmv","zmw","zmx","zmy","zmz","zna","znd","zne","zng","znk","zns","zoc","zoh","zom","zoo","zoq","zor","zos","zpa","zpb","zpc","zpd","zpe","zpf","zpg","zph","zpi","zpj","zpk","zpl","zpm","zpn","zpo","zpp","zpq","zpr","zps","zpt","zpu","zpv","zpw","zpx","zpy","zpz","zqe","zra","zrg","zrn","zro","zrp","zrs","zsa","zsk","zsl","zsm","zsr","zsu","zte","ztg","ztl","ztm","ztn","ztp","ztq","zts","ztt","ztu","ztx","zty","zua","zuh","zum","zun","zuy","zwa","zxx","zyb","zyg","zyj","zyn","zyp","zza","zzj"] +;return axe.utils.validLangs=function(){"use strict";return I},commons}()})}("object"==typeof window?window:this); \ No newline at end of file
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 89cb5203..fc2f227 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -114,12 +114,13 @@ 'Chromium Linux32 Goma Canary (clobber)': 'release_bot_x86', 'Chromium Mac 10.10 MacViews': 'mac_views_browser_release_bot', 'Chromium Mac 10.11': 'release_bot', - 'Chromium Mac 10.11 Force Mac Toolchain': 'release_bot_mac_hermetic', + 'Chromium Mac 10.11 Force Mac Toolchain': 'release_bot_mac_new_sdk', 'Chromium Mac 10.9 Goma Canary': 'release_bot', 'Chromium Mac 10.9 Goma Canary (clobber)': 'release_bot', 'Chromium Mac 10.9 Goma Canary (dbg)': 'debug_bot', 'Chromium Mac 10.9 Goma Canary (dbg)(clobber)': 'debug_bot', 'Chromium Mac Goma Canary LocalOutputCache': 'release_bot', + 'Chromium Win 10 GCE Tests': 'release_bot_x86_minimal_symbols', 'Chromium Win PGO Builder': { '1': 'official_optimize_chrome_pgo_phase_1_x86', '2': 'official_optimize_chrome_pgo_phase_2_x86', @@ -1432,8 +1433,8 @@ 'release_bot', 'chrome_with_codecs', ], - 'release_bot_mac_hermetic': [ - 'release_bot', 'mac_hermetic_toolchain', + 'release_bot_mac_new_sdk': [ + 'release_bot', 'mac_new_sdk', ], 'release_bot_mac_strip': [ @@ -1775,8 +1776,8 @@ 'mixins': ['chrome_with_codecs'], }, - 'mac_hermetic_toolchain': { - 'gn_args': 'use_system_xcode=false', + 'mac_new_sdk': { + 'gn_args': 'mac_sdk_min=10.12', }, 'headless': {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index b732eff..692bb60 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -18061,6 +18061,15 @@ <int value="1" label="Google CAPTCHA solved"/> </enum> +<enum name="GoogleFaviconServerRequestStatus"> + <int value="0" label="Success"/> + <int value="1" label="Failure (connection error, no HTTP response)"/> + <int value="2" label="Failure (HTTP error)"/> + <int value="3" label="Failure (previous HTTP error cached)"/> + <int value="4" label="Failure (on write to database)"/> + <int value="5" label="Failure (invalid request)"/> +</enum> + <enum name="GoogleNowCardTypeId"> <summary> Represents a card type ID. See cardTypeId in @@ -22721,6 +22730,7 @@ <int value="-867087281" label="enable-virtual-keyboard"/> <int value="-866993841" label="OfflinePagesCTV2:disabled"/> <int value="-864266073" label="cros-regions-mode"/> + <int value="-864234985" label="UseDdljsonApi:enabled"/> <int value="-864205629" label="enable-offline-load-stale-cache"/> <int value="-861678473" label="disable-offer-upload-credit-cards"/> <int value="-861343291" label="ChromeHome:disabled"/> @@ -22858,6 +22868,7 @@ <int value="-353182790" label="ConsistentOmniboxGeolocation:disabled"/> <int value="-351552989" label="disable-hosted-apps-in-windows"/> <int value="-351127770" label="enable-offline-pages-as-bookmarks"/> + <int value="-349437334" label="UseDdljsonApi:disabled"/> <int value="-349057743" label="extensions-on-chrome-urls"/> <int value="-345838366" label="enable-hosted-apps-in-windows"/> <int value="-345324571" label="enable-quirks-client"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 40eaa90..b29ad08 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -22761,6 +22761,9 @@ <histogram name="GCM.DataMessageReceivedHasRegisteredApp" enum="BooleanRegistered"> + <obsolete> + No longer used starting with Chrome 61 as the check was removed. + </obsolete> <owner>peter@chromium.org</owner> <summary> Records whether a matching registration was found for each received @@ -45257,15 +45260,49 @@ </histogram> <histogram base="true" + name="NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger" units="ms"> + <owner>jkrcal@chromium.org</owner> + <summary> + Android: The time since the last fetch, recorded upon the first on-shown + fetch trigger. The first on-shown trigger does not necessarily cause a fetch + (if it comes before the end of the respective scheduling interval). This + metric is recorded at most once after each fetch (and additionaly at most + once after each startup of Chrome before the next fetch). This is used to + understand how changing scheduling intervals will impact traffic of + background fetches. + </summary> +</histogram> + +<histogram base="true" name="NewTabPage.ContentSuggestions.TimeUntilFirstSoftTrigger" units="ms"> + <obsolete> + Deprecated as of July 2017, in favor of + NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger and + NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger. + </obsolete> <owner>jkrcal@chromium.org</owner> <summary> Android: The time since the last fetch, recorded upon the first soft fetch trigger. The first soft trigger does not necessarily cause a fetch (if it comes before the end of the respective scheduling interval). This metric is - recorded at most once (per lifetime of a Chrome instance) after each fetch. - This is used to understand how changing scheduling intervals will impact - traffic of background fetches. + recorded at most once after each fetch (and additionaly at most once after + each startup of Chrome before the next fetch). This is used to understand + how changing scheduling intervals will impact traffic of background fetches. + </summary> +</histogram> + +<histogram base="true" + name="NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger" + units="ms"> + <owner>jkrcal@chromium.org</owner> + <summary> + Android: The time since the last fetch, recorded upon the first startup + fetch trigger. The first startup trigger does not necessarily cause a fetch + (if it comes before the end of the respective scheduling interval). This + metric is recorded at most once after each fetch (and additionaly at most + once after each startup of Chrome before the next fetch). This is used to + understand how changing scheduling intervals will impact traffic of + background fetches. </summary> </histogram> @@ -46372,6 +46409,16 @@ </summary> </histogram> +<histogram name="NewTabPage.TileFaviconFetchStatus.Server" + enum="GoogleFaviconServerRequestStatus"> + <owner>jkrcal@chromium.org</owner> + <summary> + Mobile only. The result of fetching a favicon for a tile on the New Tab + Page. This is recorded for each gray MostVisited tile on the New Tab Page + once per impression of the tile. + </summary> +</histogram> + <histogram name="NewTabPage.TileFaviconFetchSuccess.Popular" enum="BooleanSuccess"> <owner>jkrcal@chromium.org</owner> @@ -46384,6 +46431,9 @@ <histogram name="NewTabPage.TileFaviconFetchSuccess.Server" enum="BooleanSuccess"> + <obsolete> + Deprecated 06/2017. Replaced by NewTabPage.TileFaviconFetchStatus.Server. + </obsolete> <owner>jkrcal@chromium.org</owner> <summary> Mobile only. The result of fetching a favicon for a tile on the New Tab @@ -80489,6 +80539,10 @@ <histogram name="UMA.FileMetricsProvider.EmbeddedProfile.DroppedFileAge" units="minutes"> + <obsolete> + Deprecated 07/2017. Was only for short-term analysis. About 95% of dropped + files were less than 1 day old. + </obsolete> <owner>asvitkine@chromium.org</owner> <owner>bcwhite@chromium.org</owner> <summary> @@ -97560,11 +97614,21 @@ </histogram_suffixes> <histogram_suffixes name="UserClasses" separator="."> + <affected-histogram + name="NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger"/> <suffix name="RareNTPUser" label="Rare NTP user"/> <suffix name="ActiveNTPUser" label="Active NTP user"/> <suffix name="ActiveSuggestionsConsumer" label="Active suggestions consumer"/> <affected-histogram - name="NewTabPage.ContentSuggestions.TimeUntilFirstSoftTrigger"/> + name="NewTabPage.ContentSuggestions.TimeUntilFirstSoftTrigger"> + <obsolete> + Deprecated as of July 2017, in favor of + NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger and + NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger. + </obsolete> + </affected-histogram> + <affected-histogram + name="NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger"/> <affected-histogram name="NewTabPage.ContentSuggestions.TimeUntilPersistentFetch"/> <affected-histogram name="NewTabPage.ContentSuggestions.TimeUntilSoftFetch"/>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index d9cb199..3994165 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -489,6 +489,55 @@ <metric name="AudioVideo.SRC"/> </event> +<event name="Memory.Experimental"> + <owner>erikchen@chromium.org</owner> + <summary> + Metrics associated with memory consumption, in MB. + </summary> + <metric name="BlinkGC"> + <summary> + Measure of memory consumed by Oilpan. + </summary> + </metric> + <metric name="CommandBuffer"> + <summary> + Measure of memory consumed by GL command buffer. + </summary> + </metric> + <metric name="Malloc"> + <summary> + Measure of memory allocated by malloc. + </summary> + </metric> + <metric name="PartitionAlloc"> + <summary> + Measure of memory allocated by PartitionAlloc. + </summary> + </metric> + <metric name="PrivateMemoryFootprint"> + <summary> + Measure of total memory consumed by process. + </summary> + </metric> + <metric name="ProcessType"> + <summary> + Type of process (e.g. browser, renderer, GPU --- see + services/resource_coordinator/public/interfaces/memory_instrumentation/memory_instrumentation.mojom) + of associated metrics. + </summary> + </metric> + <metric name="Resident"> + <summary> + Size of process' working set. + </summary> + </metric> + <metric name="V8"> + <summary> + Measure of memory consumed by V8. + </summary> + </metric> +</event> + <event name="PageDomainInfo"> <owner>uthakore@chromium.org</owner> <summary>
diff --git a/tools/perf/page_sets/system_health/expectations.py b/tools/perf/page_sets/system_health/expectations.py index 93b3b4c..3a4248d 100644 --- a/tools/perf/page_sets/system_health/expectations.py +++ b/tools/perf/page_sets/system_health/expectations.py
@@ -28,9 +28,6 @@ [expectations.ALL_WIN], 'crbug.com/728152') self.DisableStory('browse:news:cnn', [expectations.ALL_MAC], 'crbug.com/728576') - self.DisableStory('browse:media:flickr_infinite_scroll', - [expectations.ALL], - 'crbug.com/728785') class SystemHealthDesktopMemoryExpectations(expectations.StoryExpectations): @@ -59,9 +56,8 @@ [expectations.ALL_WIN], 'crbug.com/728152') self.DisableStory('browse:news:cnn', [expectations.ALL_MAC], 'crbug.com/728576') - self.DisableStory('browse:media:flickr_infinite_scroll', - [expectations.ALL], - 'crbug.com/728785') + self.DisableStory('browse:social:twitter_infinite_scroll', + [expectations.ALL_WIN], 'crbug.com/728464') class SystemHealthMobileCommonExpectations(expectations.StoryExpectations): @@ -82,8 +78,6 @@ 'crbug.com/728081') self.DisableStory('browse:social:facebook_infinite_scroll', [expectations.ALL], 'crbug.com/728152') - self.DisableStory('browse:media:flickr_infinite_scroll', - [expectations.ALL], 'crbug.com/728785') self.DisableStory( 'load:tools:drive', [expectations.ANDROID_NEXUS5X, expectations.ANDROID_WEBVIEW], @@ -122,8 +116,6 @@ 'crbug.com/728081') self.DisableStory('browse:social:facebook_infinite_scroll', [expectations.ALL], 'crbug.com/728152') - self.DisableStory('browse:media:flickr_infinite_scroll', - [expectations.ALL], 'crbug.com/728785') self.DisableStory( 'load:tools:drive', [expectations.ANDROID_NEXUS5X, expectations.ANDROID_WEBVIEW], @@ -163,9 +155,6 @@ [expectations.ALL_MAC], 'crbug.com/728576') self.DisableStory('browse:social:twitter_infinite_scroll', [expectations.ALL], 'crbug.com/728464') - self.DisableStory('browse:media:flickr_infinite_scroll', - [expectations.ALL, expectations.ALL_WIN], - 'crbug.com/728785') # Should only include browse:*:* stories. class V8BrowsingMobileExpecations(expectations.StoryExpectations): @@ -178,8 +167,6 @@ 'crbug.com/728081') self.DisableStory('browse:social:facebook_infinite_scroll', [expectations.ALL], 'crbug.com/728152') - self.DisableStory('browse:media:flickr_infinite_scroll', - [expectations.ALL], 'crbug.com/728785') # TODO(rnephew): This disabling should move to CanRunOnBrowser. self.DisableStory('browse:chrome:omnibox', [expectations.ANDROID_WEBVIEW],
diff --git a/tools/win/pe_summarize.py b/tools/win/pe_summarize.py index 3fbb9207..13e4a4b2 100644 --- a/tools/win/pe_summarize.py +++ b/tools/win/pe_summarize.py
@@ -57,6 +57,13 @@ import sys +def _FindSection(section_list, section_name): + for i in range(len(section_list)): + if section_name == section_list[i][0]: + return i + return -1 + + def main(): if len(sys.argv) < 2: print r'Usage: %s PEFileName [OtherPeFileNames...]' % sys.argv[0] @@ -119,16 +126,25 @@ print 'Memory size change from %s to %s' % (last_pe_path, pe_path) total_delta = 0 for i in range(len(results)): - # Make sure the current/last section names match or else the deltas - # will be meaningless. Mismatches can occur when comparing 32-bit and - # 64-bit binaries. - if results[i][0] != last_results[i][0]: - print "Names for section[%d] don't match. Aborting." % i - return 0 - delta = results[i][1] - last_results[i][1] + section_name = results[i][0] + # Find a matching section name. Mismatches can occur when comparing + # 32-bit and 64-bit binaries. They can also occur when one of the + # binaries pulls in code that defines custom sections such as .rodata. + last_i = _FindSection(last_results, section_name) + delta = results[i][1] + if last_i >= 0: + delta -= last_results[last_i][1] total_delta += delta if delta: - print '%12s: %7d bytes change' % (results[i][0], delta) + print '%12s: %7d bytes change' % (section_name, delta) + for last_i in range(len(last_results)): + section_name = last_results[last_i][0] + # Find sections that exist only in last_results. + i = _FindSection(results, section_name) + if i < 0: + delta = -last_results[last_i][1] + total_delta += delta + print '%12s: %7d bytes change' % (section_name, delta) print 'Total change: %7d bytes' % total_delta last_pe_filepart = pe_filepart last_pe_path = pe_path
diff --git a/ui/app_list/views/apps_grid_view.cc b/ui/app_list/views/apps_grid_view.cc index ae1bb11..00c3387 100644 --- a/ui/app_list/views/apps_grid_view.cc +++ b/ui/app_list/views/apps_grid_view.cc
@@ -962,14 +962,10 @@ SetSelectedItemByIndex(Index(target_page, target_slot)); } -void AppsGridView::CalculateIdealBounds() { +const gfx::Vector2d AppsGridView::CalculateTransitionOffset( + int page_of_view) const { gfx::Size grid_size = GetTileGridSize(); - // Page size including padding pixels. A tile.x + page_width means the same - // tile slot in the next page; similarly for tile.y + page_height. - const int page_width = grid_size.width() + kPagePadding; - const int page_height = grid_size.height() + kPagePadding; - // If there is a transition, calculates offset for current and target page. const int current_page = pagination_model_.selected_page(); const PaginationModel::Transition& transition = @@ -979,6 +975,44 @@ // Transition to previous page means negative offset. const int dir = transition.target_page > current_page ? -1 : 1; + int x_offset = 0; + int y_offset = 0; + + if (pagination_controller_->scroll_axis() == + PaginationController::SCROLL_AXIS_HORIZONTAL) { + // Page size including padding pixels. A tile.x + page_width means the same + // tile slot in the next page. + const int page_width = grid_size.width() + kPagePadding; + if (page_of_view < current_page) + x_offset = -page_width; + else if (page_of_view > current_page) + x_offset = page_width; + + if (is_valid) { + if (page_of_view == current_page || + page_of_view == transition.target_page) { + x_offset += transition.progress * page_width * dir; + } + } + } else { + const int page_height = grid_size.height() + kPagePadding; + if (page_of_view < current_page) + y_offset = -page_height; + else if (page_of_view > current_page) + y_offset = page_height; + + if (is_valid) { + if (page_of_view == current_page || + page_of_view == transition.target_page) { + y_offset += transition.progress * page_height * dir; + } + } + } + + return gfx::Vector2d(x_offset, y_offset); +} + +void AppsGridView::CalculateIdealBounds() { const int total_views = view_model_.view_size() + pulsing_blocks_model_.view_size(); int slot_index = 0; @@ -994,41 +1028,11 @@ view_index = GetIndexFromModelIndex(slot_index); } - // Decide the x or y offset for current item. - int x_offset = 0; - int y_offset = 0; - - if (pagination_controller_->scroll_axis() == - PaginationController::SCROLL_AXIS_HORIZONTAL) { - if (view_index.page < current_page) - x_offset = -page_width; - else if (view_index.page > current_page) - x_offset = page_width; - - if (is_valid) { - if (view_index.page == current_page || - view_index.page == transition.target_page) { - x_offset += transition.progress * page_width * dir; - } - } - } else { - if (view_index.page < current_page) - y_offset = -page_height; - else if (view_index.page > current_page) - y_offset = page_height; - - if (is_valid) { - if (view_index.page == current_page || - view_index.page == transition.target_page) { - y_offset += transition.progress * page_height * dir; - } - } - } - const int row = view_index.slot / cols_; const int col = view_index.slot % cols_; gfx::Rect tile_slot = GetExpectedTileBounds(row, col); - tile_slot.Offset(x_offset, y_offset); + const gfx::Vector2d offset = CalculateTransitionOffset(view_index.page); + tile_slot.Offset(offset.x(), offset.y()); if (i < view_model_.view_size()) { view_model_.set_ideal_bounds(i, tile_slot); } else {
diff --git a/ui/app_list/views/apps_grid_view.h b/ui/app_list/views/apps_grid_view.h index 932f3c9..0c8512c 100644 --- a/ui/app_list/views/apps_grid_view.h +++ b/ui/app_list/views/apps_grid_view.h
@@ -276,6 +276,10 @@ void MoveSelected(int page_delta, int slot_x_delta, int slot_y_delta); + // Calculates the offset for |page_of_view| based on current page and + // transition target page. + const gfx::Vector2d CalculateTransitionOffset(int page_of_view) const; + void CalculateIdealBounds(); void AnimateToIdealBounds();
diff --git a/ui/base/accelerators/accelerator.cc b/ui/base/accelerators/accelerator.cc index 8b8d14e..7bbddf42 100644 --- a/ui/base/accelerators/accelerator.cc +++ b/ui/base/accelerators/accelerator.cc
@@ -42,19 +42,22 @@ KeyState key_state) : key_code_(key_code), key_state_(key_state), - modifiers_(modifiers & kInterestingFlagsMask) {} + modifiers_(modifiers & kInterestingFlagsMask), + interrupted_by_mouse_event_(false) {} Accelerator::Accelerator(const KeyEvent& key_event) : key_code_(key_event.key_code()), key_state_(key_event.type() == ET_KEY_PRESSED ? KeyState::PRESSED : KeyState::RELEASED), // |modifiers_| may include the repeat flag. - modifiers_(key_event.flags() & kInterestingFlagsMask) {} + modifiers_(key_event.flags() & kInterestingFlagsMask), + interrupted_by_mouse_event_(false) {} Accelerator::Accelerator(const Accelerator& accelerator) { key_code_ = accelerator.key_code_; key_state_ = accelerator.key_state_; modifiers_ = accelerator.modifiers_; + interrupted_by_mouse_event_ = accelerator.interrupted_by_mouse_event_; if (accelerator.platform_accelerator_) platform_accelerator_ = accelerator.platform_accelerator_->CreateCopy(); } @@ -72,6 +75,7 @@ key_code_ = accelerator.key_code_; key_state_ = accelerator.key_state_; modifiers_ = accelerator.modifiers_; + interrupted_by_mouse_event_ = accelerator.interrupted_by_mouse_event_; if (accelerator.platform_accelerator_) platform_accelerator_ = accelerator.platform_accelerator_->CreateCopy(); else @@ -94,7 +98,8 @@ bool Accelerator::operator ==(const Accelerator& rhs) const { return (key_code_ == rhs.key_code_) && (key_state_ == rhs.key_state_) && (MaskOutKeyEventFlags(modifiers_) == - MaskOutKeyEventFlags(rhs.modifiers_)); + MaskOutKeyEventFlags(rhs.modifiers_)) && + interrupted_by_mouse_event_ == rhs.interrupted_by_mouse_event_; } bool Accelerator::operator !=(const Accelerator& rhs) const {
diff --git a/ui/base/accelerators/accelerator.h b/ui/base/accelerators/accelerator.h index f5ee417..3d6b422 100644 --- a/ui/base/accelerators/accelerator.h +++ b/ui/base/accelerators/accelerator.h
@@ -89,6 +89,14 @@ return platform_accelerator_.get(); } + void set_interrupted_by_mouse_event(bool interrupted_by_mouse_event) { + interrupted_by_mouse_event_ = interrupted_by_mouse_event; + } + + bool interrupted_by_mouse_event() const { + return interrupted_by_mouse_event_; + } + private: // The keycode (VK_...). KeyboardCode key_code_; @@ -102,6 +110,13 @@ // TODO: this is only used in Mac code and should be removed from here. // http://crbug.com/702823. std::unique_ptr<PlatformAccelerator> platform_accelerator_; + + // Whether the accelerator is interrupted by a mouse press/release. This is + // optionally used by AcceleratorController. Even this is set to true, the + // accelerator may still be handled successfully. (Currently only + // TOGGLE_APP_LIST is disabled when mouse press/release occurs between + // search key down and up. See crbug.com/665897) + bool interrupted_by_mouse_event_; }; // An interface that classes that want to register for keyboard accelerators
diff --git a/ui/base/accelerators/accelerator_history.cc b/ui/base/accelerators/accelerator_history.cc index 94e78da2..e4fbc81 100644 --- a/ui/base/accelerators/accelerator_history.cc +++ b/ui/base/accelerators/accelerator_history.cc
@@ -31,4 +31,11 @@ } } +void AcceleratorHistory::InterruptCurrentAccelerator() { + if (current_accelerator_.key_state() == Accelerator::KeyState::PRESSED) { + // Only interrupts pressed keys. + current_accelerator_.set_interrupted_by_mouse_event(true); + } +} + } // namespace ui
diff --git a/ui/base/accelerators/accelerator_history.h b/ui/base/accelerators/accelerator_history.h index ee63a572..bc944cc 100644 --- a/ui/base/accelerators/accelerator_history.h +++ b/ui/base/accelerators/accelerator_history.h
@@ -35,6 +35,8 @@ // stored one. void StoreCurrentAccelerator(const Accelerator& accelerator); + void InterruptCurrentAccelerator(); + private: Accelerator current_accelerator_; Accelerator previous_accelerator_;
diff --git a/ui/compositor/DEPS b/ui/compositor/DEPS index 567f270..1db43fd 100644 --- a/ui/compositor/DEPS +++ b/ui/compositor/DEPS
@@ -1,6 +1,7 @@ include_rules = [ "+cc", "-cc/blink", + "+components/viz/common/quads", "+components/viz/host", "+gpu/command_buffer/client/gles2_interface.h", "+services/ui/public/cpp",
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc index d851a9b..513fba2 100644 --- a/ui/compositor/compositor.cc +++ b/ui/compositor/compositor.cc
@@ -15,6 +15,7 @@ #include "base/message_loop/message_loop.h" #include "base/metrics/histogram_macros.h" #include "base/stl_util.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/sys_info.h" @@ -34,6 +35,7 @@ #include "cc/surfaces/local_surface_id_allocator.h" #include "cc/trees/layer_tree_host.h" #include "cc/trees/layer_tree_settings.h" +#include "components/viz/common/quads/resource_format.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/compositor/compositor_observer.h" #include "ui/compositor/compositor_switches.h" @@ -84,6 +86,15 @@ refresh_rate_ = context_factory_->GetRefreshRate(); settings.main_frame_before_activation_enabled = false; + if (command_line->HasSwitch(switches::kLimitFps)) { + std::string fps_str = + command_line->GetSwitchValueASCII(switches::kLimitFps); + double fps; + if (base::StringToDouble(fps_str, &fps) && fps > 0) { + forced_refresh_rate_ = fps; + } + } + if (command_line->HasSwitch(cc::switches::kUIShowCompositedLayerBorders)) { std::string layer_borders_string = command_line->GetSwitchValueASCII( cc::switches::kUIShowCompositedLayerBorders); @@ -141,7 +152,7 @@ settings.use_partial_raster = !settings.use_zero_copy; if (command_line->HasSwitch(switches::kUIEnableRGBA4444Textures)) - settings.preferred_tile_format = cc::RGBA_4444; + settings.preferred_tile_format = viz::RGBA_4444; settings.resource_settings = context_factory_->GetResourceSettings(); settings.gpu_memory_policy.bytes_limit_when_visible = 512 * 1024 * 1024; @@ -372,6 +383,10 @@ void Compositor::SetDisplayVSyncParameters(base::TimeTicks timebase, base::TimeDelta interval) { + if (forced_refresh_rate_) { + timebase = base::TimeTicks(); + interval = base::TimeDelta::FromSeconds(1) / forced_refresh_rate_; + } if (interval.is_zero()) { // TODO(brianderson): We should not be receiving 0 intervals. interval = cc::BeginFrameArgs::DefaultInterval();
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h index 292d734..7a1b0a9 100644 --- a/ui/compositor/compositor.h +++ b/ui/compositor/compositor.h
@@ -404,6 +404,9 @@ // Current vsync refresh rate per second. float refresh_rate_ = 0.f; + // If nonzero, this is the refresh rate forced from the command-line. + double forced_refresh_rate_ = 0.f; + // A map from child id to parent id. std::unordered_set<cc::FrameSinkId, cc::FrameSinkIdHash> child_frame_sinks_; bool widget_valid_ = false;
diff --git a/ui/compositor/compositor_switches.cc b/ui/compositor/compositor_switches.cc index 2a999a8..991aba5 100644 --- a/ui/compositor/compositor_switches.cc +++ b/ui/compositor/compositor_switches.cc
@@ -17,6 +17,10 @@ // Forces tests to produce pixel output when they normally wouldn't. const char kEnablePixelOutputInTests[] = "enable-pixel-output-in-tests"; +// Limits the compositor to output a certain number of frames per second, +// maximum. +const char kLimitFps[] = "limit-fps"; + // Disable partial swap which is needed for some OpenGL drivers / emulators. const char kUIDisablePartialSwap[] = "ui-disable-partial-swap";
diff --git a/ui/compositor/compositor_switches.h b/ui/compositor/compositor_switches.h index 0cc31be97..54fc33542 100644 --- a/ui/compositor/compositor_switches.h +++ b/ui/compositor/compositor_switches.h
@@ -11,6 +11,7 @@ COMPOSITOR_EXPORT extern const char kEnableHardwareOverlays[]; COMPOSITOR_EXPORT extern const char kEnablePixelOutputInTests[]; +COMPOSITOR_EXPORT extern const char kLimitFps[]; COMPOSITOR_EXPORT extern const char kUIDisablePartialSwap[]; COMPOSITOR_EXPORT extern const char kUIEnableRGBA4444Textures[]; COMPOSITOR_EXPORT extern const char kUIEnableZeroCopy[];
diff --git a/ui/gfx/render_text.cc b/ui/gfx/render_text.cc index ebae2fb..041c9f2 100644 --- a/ui/gfx/render_text.cc +++ b/ui/gfx/render_text.cc
@@ -105,11 +105,11 @@ // Creates a SkShader to fade the text, with |left_part| specifying the left // fade effect, if any, and |right_part| specifying the right fade effect. -std::unique_ptr<cc::PaintShader> CreateFadeShader(const FontList& font_list, - const Rect& text_rect, - const Rect& left_part, - const Rect& right_part, - SkColor color) { +sk_sp<cc::PaintShader> CreateFadeShader(const FontList& font_list, + const Rect& text_rect, + const Rect& left_part, + const Rect& right_part, + SkColor color) { // The shader should only specify transparency of the fade itself, not the // original transparency, which will be applied by the actual renderer. DCHECK_EQ(SkColorGetA(color), static_cast<uint8_t>(0xff)); @@ -224,7 +224,7 @@ flags_.setColor(foreground); } -void SkiaTextRenderer::SetShader(std::unique_ptr<cc::PaintShader> shader) { +void SkiaTextRenderer::SetShader(sk_sp<cc::PaintShader> shader) { flags_.setShader(std::move(shader)); }
diff --git a/ui/gfx/render_text.h b/ui/gfx/render_text.h index d912882..24ea3d4 100644 --- a/ui/gfx/render_text.h +++ b/ui/gfx/render_text.h
@@ -62,7 +62,7 @@ void SetTypeface(sk_sp<SkTypeface> typeface); void SetTextSize(SkScalar size); void SetForegroundColor(SkColor foreground); - void SetShader(std::unique_ptr<cc::PaintShader> shader); + void SetShader(sk_sp<cc::PaintShader> shader); void DrawSelection(const std::vector<Rect>& selection, SkColor color); virtual void DrawPosText(const SkPoint* pos, const uint16_t* glyphs,
diff --git a/ui/gfx/skia_paint_util.cc b/ui/gfx/skia_paint_util.cc index 6bbe1ca..c18fbd1 100644 --- a/ui/gfx/skia_paint_util.cc +++ b/ui/gfx/skia_paint_util.cc
@@ -13,15 +13,14 @@ namespace gfx { -std::unique_ptr<cc::PaintShader> CreateImageRepShader( - const gfx::ImageSkiaRep& image_rep, - SkShader::TileMode tile_mode, - const SkMatrix& local_matrix) { +sk_sp<cc::PaintShader> CreateImageRepShader(const gfx::ImageSkiaRep& image_rep, + SkShader::TileMode tile_mode, + const SkMatrix& local_matrix) { return CreateImageRepShaderForScale(image_rep, tile_mode, local_matrix, image_rep.scale()); } -std::unique_ptr<cc::PaintShader> CreateImageRepShaderForScale( +sk_sp<cc::PaintShader> CreateImageRepShaderForScale( const gfx::ImageSkiaRep& image_rep, SkShader::TileMode tile_mode, const SkMatrix& local_matrix, @@ -43,10 +42,10 @@ &shader_scale); } -std::unique_ptr<cc::PaintShader> CreateGradientShader(int start_point, - int end_point, - SkColor start_color, - SkColor end_color) { +sk_sp<cc::PaintShader> CreateGradientShader(int start_point, + int end_point, + SkColor start_color, + SkColor end_color) { SkColor grad_colors[2] = {start_color, end_color}; SkPoint grad_points[2]; grad_points[0].iset(0, start_point);
diff --git a/ui/gfx/skia_paint_util.h b/ui/gfx/skia_paint_util.h index 1d163437..f76fc23 100644 --- a/ui/gfx/skia_paint_util.h +++ b/ui/gfx/skia_paint_util.h
@@ -26,13 +26,13 @@ // TODO(pkotwicz): Allow shader's local matrix to be changed after the shader // is created. // -GFX_EXPORT std::unique_ptr<cc::PaintShader> CreateImageRepShader( +GFX_EXPORT sk_sp<cc::PaintShader> CreateImageRepShader( const gfx::ImageSkiaRep& image_rep, SkShader::TileMode tile_mode, const SkMatrix& local_matrix); // Creates a bitmap shader for the image rep with the passed in scale factor. -GFX_EXPORT std::unique_ptr<cc::PaintShader> CreateImageRepShaderForScale( +GFX_EXPORT sk_sp<cc::PaintShader> CreateImageRepShaderForScale( const gfx::ImageSkiaRep& image_rep, SkShader::TileMode tile_mode, const SkMatrix& local_matrix, @@ -40,11 +40,10 @@ // Creates a vertical gradient shader. The caller owns the shader. // Example usage to avoid leaks: -GFX_EXPORT std::unique_ptr<cc::PaintShader> CreateGradientShader( - int start_point, - int end_point, - SkColor start_color, - SkColor end_color); +GFX_EXPORT sk_sp<cc::PaintShader> CreateGradientShader(int start_point, + int end_point, + SkColor start_color, + SkColor end_color); // Creates a draw looper to generate |shadows|. The caller owns the draw looper. // NULL is returned if |shadows| is empty since no draw looper is needed in
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc index 8bd0a54..05bb656 100644 --- a/ui/keyboard/keyboard_controller.cc +++ b/ui/keyboard/keyboard_controller.cc
@@ -8,12 +8,9 @@ #include "base/bind.h" #include "base/command_line.h" -#include "base/location.h" #include "base/macros.h" #include "base/metrics/histogram_macros.h" -#include "base/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" -#include "build/build_config.h" #include "ui/aura/env.h" #include "ui/aura/window.h" #include "ui/aura/window_delegate.h" @@ -27,7 +24,6 @@ #include "ui/display/types/display_constants.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/path.h" -#include "ui/gfx/skia_util.h" #include "ui/keyboard/keyboard_controller_observer.h" #include "ui/keyboard/keyboard_layout_manager.h" #include "ui/keyboard/keyboard_ui.h"
diff --git a/ui/keyboard/keyboard_controller.h b/ui/keyboard/keyboard_controller.h index a62890e3..5fd0028 100644 --- a/ui/keyboard/keyboard_controller.h +++ b/ui/keyboard/keyboard_controller.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/event_types.h" #include "base/macros.h" #include "base/observer_list.h" #include "ui/aura/window_observer.h"
diff --git a/ui/keyboard/keyboard_controller_unittest.cc b/ui/keyboard/keyboard_controller_unittest.cc index 8a3c096..b3f2dea 100644 --- a/ui/keyboard/keyboard_controller_unittest.cc +++ b/ui/keyboard/keyboard_controller_unittest.cc
@@ -6,18 +6,15 @@ #include <memory> -#include "base/bind.h" #include "base/command_line.h" #include "base/macros.h" #include "base/run_loop.h" #include "base/test/scoped_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/aura/client/focus_client.h" -#include "ui/aura/layout_manager.h" #include "ui/aura/test/aura_test_helper.h" #include "ui/aura/test/test_window_delegate.h" #include "ui/aura/window.h" -#include "ui/aura/window_event_dispatcher.h" #include "ui/base/ime/dummy_text_input_client.h" #include "ui/base/ime/input_method.h" #include "ui/base/ime/input_method_factory.h" @@ -28,7 +25,6 @@ #include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/compositor/test/context_factories_for_test.h" #include "ui/compositor/test/layer_animator_test_controller.h" -#include "ui/events/event_utils.h" #include "ui/events/test/event_generator.h" #include "ui/gfx/geometry/rect.h" #include "ui/keyboard/keyboard_controller_observer.h"
diff --git a/ui/keyboard/keyboard_util.h b/ui/keyboard/keyboard_util.h index f0089a4..1caa1b3a 100644 --- a/ui/keyboard/keyboard_util.h +++ b/ui/keyboard/keyboard_util.h
@@ -7,14 +7,17 @@ #include <string> -// TODO(beng): replace with forward decl once RootWindow is renamed. -#include "ui/aura/window.h" +#include "base/strings/string16.h" #include "ui/keyboard/keyboard_export.h" namespace aura { class WindowTreeHost; } +namespace gfx { +class Rect; +}; + class GURL; namespace keyboard {
diff --git a/ui/views/win/fullscreen_handler.cc b/ui/views/win/fullscreen_handler.cc index c35bad52..6cbe30a 100644 --- a/ui/views/win/fullscreen_handler.cc +++ b/ui/views/win/fullscreen_handler.cc
@@ -90,7 +90,8 @@ HRESULT hr = ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&task_bar_list_)); - CHECK(SUCCEEDED(hr)); + if (SUCCEEDED(hr) && FAILED(task_bar_list_->HrInit())) + task_bar_list_ = nullptr; } // As per MSDN marking the window as fullscreen should ensure that the @@ -98,7 +99,8 @@ // is activated. If the window is not fullscreen, the Shell falls back to // heuristics to determine how the window should be treated, which means // that it could still consider the window as fullscreen. :( - task_bar_list_->MarkFullscreenWindow(hwnd_, !!fullscreen); + if (task_bar_list_) + task_bar_list_->MarkFullscreenWindow(hwnd_, !!fullscreen); } } // namespace views
diff --git a/ui/wm/core/accelerator_filter.cc b/ui/wm/core/accelerator_filter.cc index 03ea898..21f10d5 100644 --- a/ui/wm/core/accelerator_filter.cc +++ b/ui/wm/core/accelerator_filter.cc
@@ -46,4 +46,11 @@ event->StopPropagation(); } +void AcceleratorFilter::OnMouseEvent(ui::MouseEvent* event) { + if (event->type() == ui::ET_MOUSE_PRESSED || + event->type() == ui::ET_MOUSE_RELEASED) { + accelerator_history_->InterruptCurrentAccelerator(); + } +} + } // namespace wm
diff --git a/ui/wm/core/accelerator_filter.h b/ui/wm/core/accelerator_filter.h index 492ab6c..86bdf77e2 100644 --- a/ui/wm/core/accelerator_filter.h +++ b/ui/wm/core/accelerator_filter.h
@@ -30,6 +30,7 @@ // Overridden from ui::EventHandler: void OnKeyEvent(ui::KeyEvent* event) override; + void OnMouseEvent(ui::MouseEvent* event) override; private: std::unique_ptr<AcceleratorDelegate> delegate_;