diff --git a/DEPS b/DEPS index beb8ae4..9b085fb 100644 --- a/DEPS +++ b/DEPS
@@ -138,11 +138,11 @@ # 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': '084fa1b52f30c1b1e349b809deda5f240b90b039', + 'skia_revision': 'ef787f79e54ef601b1a1ed4e9ebd39febd5f8b66', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'e619ed57592ca2e2a69ab8fe2c463c810e8a7bc0', + 'v8_revision': '1ee54f572c4d5f2dae933bc782731c34daff7164', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -150,7 +150,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': 'd187d45ede29369025595c53c7fe3ffed0688870', + 'angle_revision': 'b08d53d3c1c6488369b595ff5b31274d4d2b3855', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -269,7 +269,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'shaderc_revision': 'c6cb20db2cb35045f82a7976badc989af0469e6f', + 'shaderc_revision': 'b988e6b4506343ad323a963d655341f09d4e6322', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -277,7 +277,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'quiche_revision': '3451f6e595c1f518ab741c24bc36a1f02d038376', + 'quiche_revision': '3a1bb80f575f6335621c4bcc01513d12ec77d327', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ios_webkit # and whatever else without interference from each other. @@ -807,7 +807,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'bbe067f8952c0e9f230ab853561d7d59291ac619', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'df99659bac9c6a2e84f17ad2444ccf6192440e5e', 'condition': 'checkout_linux', }, @@ -832,7 +832,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '374a1289773dd638090d7cba48e4f56130978775', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'a74bd78e9ccd242af225629c3a105e209f5bf400', 'src/third_party/devtools-node-modules': Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'), @@ -901,7 +901,7 @@ }, 'src/third_party/glslang/src': - Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + '9866ad9195cec8f266f16191fb4ec2ce4896e5c0', + Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + '96ee92f09b7c24a6016f69a9df2a0f94957e9e83', 'src/third_party/google_toolbox_for_mac/src': { 'url': Var('chromium_git') + '/external/github.com/google/google-toolbox-for-mac.git' + '@' + Var('google_toolbox_for_mac_revision'), @@ -1187,7 +1187,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '91d1a33b6c734c657ffc2e318a73344bef48eb6f', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '710e17039085f6cf75e8d41a5e689090ea1861ca', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1355,7 +1355,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '6f0b34abee8dba611c253738d955c59f703c147a', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '35c26284a9e170127f39492768a74f4b93833806', + Var('webrtc_git') + '/src.git' + '@' + '5894b6aad4b107418cfa34482a220ecc5f516c0c', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d', @@ -1396,7 +1396,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@bca80c27bae8dcf30893c38b6c6a29d5190c55f0', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@22b387d76825b093a67b4d787c0ffba230e8e06f', 'condition': 'checkout_src_internal', },
diff --git a/WATCHLISTS b/WATCHLISTS index 803f596..a914257 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -1232,10 +1232,6 @@ '|chromeos/services/secure_channel/'\ '|ui/webui/resources/cr_components/chromeos/multidevice_setup/' }, - 'mus': { - 'filepath': 'services/ws/'\ - '|mojo/gpu/', - }, 'nacl': { 'filepath': 'chrome/nacl/|chrome/test/nacl/|'\ 'chrome/browser/nacl_host/|chrome/common/nacl|'\ @@ -2423,7 +2419,6 @@ 'jordynass+watch-multidevice@chromium.org', 'khorimoto+watch-multidevice@chromium.org', 'nohle+watch-multidevice@chromium.org'], - 'mus': ['rjkroege@chromium.org'], 'nacl': ['native-client-reviews@googlegroups.com'], 'native_client_sdk': ['binji+watch@chromium.org', 'sbc@chromium.org'],
diff --git a/android_webview/docs/test-instructions.md b/android_webview/docs/test-instructions.md index 09afbc42..03fb770 100644 --- a/android_webview/docs/test-instructions.md +++ b/android_webview/docs/test-instructions.md
@@ -35,6 +35,26 @@ the chromium test runner understands either syntax. *** +### Java unittests + +These tests live under `//android_webview/junit/` and use Robolectric. + +```sh +# Build +$ autoninja -C out/Default android_webview_junit_tests + +# Run tests (any of these commands): +$ out/Default/bin/run_android_webview_junit_tests # All tests +$ out/Default/bin/run_android_webview_junit_tests -f *FindAddressTest#* # Same glob patterns work here +``` + +*** note +For junit tests, filter (`-f`) arguments require fully qualified class names +(e.g. `org.chromium.android_webview.robolectric.FindAddressTest`), but replacing +the package name with a glob wildcard (`*`), as in the example above, will work +if the class name is unique. +*** + ### Native unittests These are any `*_test.cc` or `*_unittest.cc` test under `//android_webview/`.
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwLayoutSizerTest.java b/android_webview/junit/src/org/chromium/android_webview/robolectric/AwLayoutSizerTest.java similarity index 97% rename from android_webview/javatests/src/org/chromium/android_webview/test/AwLayoutSizerTest.java rename to android_webview/junit/src/org/chromium/android_webview/robolectric/AwLayoutSizerTest.java index 34bdc85..44f813f 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwLayoutSizerTest.java +++ b/android_webview/junit/src/org/chromium/android_webview/robolectric/AwLayoutSizerTest.java
@@ -2,9 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.android_webview.test; - -import static org.chromium.android_webview.test.OnlyRunIn.ProcessMode.SINGLE_PROCESS; +package org.chromium.android_webview.robolectric; import android.support.test.filters.SmallTest; import android.view.View; @@ -13,15 +11,14 @@ import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; import org.chromium.android_webview.AwLayoutSizer; import org.chromium.base.test.util.Feature; +import org.chromium.testing.local.LocalRobolectricTestRunner; -/** - * Unittests for the AwLayoutSizer class. - */ -@RunWith(AwJUnit4ClassRunner.class) -@OnlyRunIn(SINGLE_PROCESS) +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) public class AwLayoutSizerTest { static class LayoutSizerDelegate implements AwLayoutSizer.Delegate { public int requestLayoutCallCount; @@ -468,10 +465,9 @@ Assert.assertFalse(delegate.forceZeroHeight); - layoutSizer.onMeasure( - MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), + layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); layoutSizer.onSizeChanged(AT_MOST_MEASURE_SIZE, AT_MOST_MEASURE_SIZE, 0, 0); Assert.assertFalse(delegate.forceZeroHeight); } -} +} \ No newline at end of file
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwScrollOffsetManagerTest.java b/android_webview/junit/src/org/chromium/android_webview/robolectric/AwScrollOffsetManagerTest.java similarity index 95% rename from android_webview/javatests/src/org/chromium/android_webview/test/AwScrollOffsetManagerTest.java rename to android_webview/junit/src/org/chromium/android_webview/robolectric/AwScrollOffsetManagerTest.java index e7d1932..49c2597 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwScrollOffsetManagerTest.java +++ b/android_webview/junit/src/org/chromium/android_webview/robolectric/AwScrollOffsetManagerTest.java
@@ -2,9 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.android_webview.test; - -import static org.chromium.android_webview.test.OnlyRunIn.ProcessMode.SINGLE_PROCESS; +package org.chromium.android_webview.robolectric; import android.graphics.Rect; import android.support.test.filters.SmallTest; @@ -12,15 +10,17 @@ import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; import org.chromium.android_webview.AwScrollOffsetManager; import org.chromium.base.test.util.Feature; +import org.chromium.testing.local.LocalRobolectricTestRunner; /** * Integration tests for ScrollOffsetManager. */ -@RunWith(AwJUnit4ClassRunner.class) -@OnlyRunIn(SINGLE_PROCESS) +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) public class AwScrollOffsetManagerTest { private static class TestScrollOffsetManagerDelegate implements AwScrollOffsetManager.Delegate { private int mOverScrollDeltaX; @@ -100,8 +100,7 @@ } @Override - public void cancelFling() { - } + public void cancelFling() {} @Override public void smoothScroll(int targetX, int targetY, long durationMs) {} @@ -120,8 +119,8 @@ offsetManager.onContainerViewOverScrolled(scrollX, scrollY, false, false); } - private void simlateOverScrollPropagation(AwScrollOffsetManager offsetManager, - TestScrollOffsetManagerDelegate delegate) { + private void simlateOverScrollPropagation( + AwScrollOffsetManager offsetManager, TestScrollOffsetManagerDelegate delegate) { Assert.assertTrue(delegate.getOverScrollCallCount() > 0); offsetManager.onContainerViewOverScrolled( @@ -369,8 +368,8 @@ offsetManager.setMaxScrollOffset(MAX_HORIZONTAL_OFFSET, MAX_VERTICAL_OFFSET); offsetManager.setContainerViewSize(VIEW_WIDTH, VIEW_HEIGHT); - offsetManager.requestChildRectangleOnScreen(0, 0, - new Rect(0, 0, VIEW_WIDTH / 4, VIEW_HEIGHT / 4), true); + offsetManager.requestChildRectangleOnScreen( + 0, 0, new Rect(0, 0, VIEW_WIDTH / 4, VIEW_HEIGHT / 4), true); Assert.assertEquals(0, delegate.getOverScrollDeltaX()); Assert.assertEquals(0, delegate.getOverScrollDeltaY()); Assert.assertEquals(0, delegate.getScrollX()); @@ -441,11 +440,11 @@ offsetManager.setMaxScrollOffset(MAX_HORIZONTAL_OFFSET, MAX_VERTICAL_OFFSET); offsetManager.setContainerViewSize(VIEW_WIDTH, VIEW_HEIGHT); - simulateScrolling(offsetManager, delegate, - CONTENT_WIDTH - VIEW_WIDTH, CONTENT_HEIGHT - VIEW_HEIGHT); + simulateScrolling( + offsetManager, delegate, CONTENT_WIDTH - VIEW_WIDTH, CONTENT_HEIGHT - VIEW_HEIGHT); - offsetManager.requestChildRectangleOnScreen(0, 0, - new Rect(0, 0, rectWidth, rectHeight), true); + offsetManager.requestChildRectangleOnScreen( + 0, 0, new Rect(0, 0, rectWidth, rectHeight), true); simlateOverScrollPropagation(offsetManager, delegate); Assert.assertEquals(-CONTENT_WIDTH + VIEW_WIDTH, delegate.getOverScrollDeltaX()); Assert.assertEquals(-CONTENT_HEIGHT + VIEW_HEIGHT, delegate.getOverScrollDeltaY());
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/FindAddressTest.java b/android_webview/junit/src/org/chromium/android_webview/robolectric/FindAddressTest.java similarity index 98% rename from android_webview/javatests/src/org/chromium/android_webview/test/FindAddressTest.java rename to android_webview/junit/src/org/chromium/android_webview/robolectric/FindAddressTest.java index e3314b4..b5916a2 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/FindAddressTest.java +++ b/android_webview/junit/src/org/chromium/android_webview/robolectric/FindAddressTest.java
@@ -2,23 +2,26 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.android_webview.test; +package org.chromium.android_webview.robolectric; import android.support.test.filters.SmallTest; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; import org.chromium.android_webview.FindAddress; import org.chromium.base.test.util.Feature; +import org.chromium.testing.local.LocalRobolectricTestRunner; import java.util.regex.MatchResult; /** * Tests for FindAddress implementation. */ -@RunWith(AwJUnit4ClassRunner.class) +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) public class FindAddressTest { private void assertExpectedMatch(MatchResult match, String exptectedMatch) { Assert.assertNotNull(match);
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn index d062602a..5a6ea43e 100644 --- a/android_webview/test/BUILD.gn +++ b/android_webview/test/BUILD.gn
@@ -12,6 +12,7 @@ group("test") { deps = [ + ":android_webview_junit_tests", ":android_webview_unittests", ":webview_instrumentation_test_apk", ] @@ -208,13 +209,11 @@ "../javatests/src/org/chromium/android_webview/test/AwFormDatabaseTest.java", "../javatests/src/org/chromium/android_webview/test/AwImeTest.java", "../javatests/src/org/chromium/android_webview/test/AwJavaBridgeTest.java", - "../javatests/src/org/chromium/android_webview/test/AwLayoutSizerTest.java", "../javatests/src/org/chromium/android_webview/test/AwLegacyQuirksTest.java", "../javatests/src/org/chromium/android_webview/test/AwNetworkConfigurationTest.java", "../javatests/src/org/chromium/android_webview/test/AwPermissionManagerTest.java", "../javatests/src/org/chromium/android_webview/test/AwProxyControllerTest.java", "../javatests/src/org/chromium/android_webview/test/AwQuotaManagerBridgeTest.java", - "../javatests/src/org/chromium/android_webview/test/AwScrollOffsetManagerTest.java", "../javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java", "../javatests/src/org/chromium/android_webview/test/AwServiceWorkerClientTest.java", "../javatests/src/org/chromium/android_webview/test/AwSettingsTest.java", @@ -235,7 +234,6 @@ "../javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java", "../javatests/src/org/chromium/android_webview/test/CookieManagerTest.java", "../javatests/src/org/chromium/android_webview/test/DisableHardwareAccelerationForTest.java", - "../javatests/src/org/chromium/android_webview/test/FindAddressTest.java", "../javatests/src/org/chromium/android_webview/test/FullScreenVideoTestAwContentsClient.java", "../javatests/src/org/chromium/android_webview/test/GeolocationTest.java", "../javatests/src/org/chromium/android_webview/test/GetTitleTest.java", @@ -381,3 +379,21 @@ "../unittestjava/src/org/chromium/android_webview/unittest/MockAwContentsClientBridge.java", ] } + +# robolectric tests +junit_binary("android_webview_junit_tests") { + java_files = [ + "../junit/src/org/chromium/android_webview/robolectric/AwLayoutSizerTest.java", + "../junit/src/org/chromium/android_webview/robolectric/FindAddressTest.java", + "../junit/src/org/chromium/android_webview/robolectric/AwScrollOffsetManagerTest.java", + ] + + deps = [ + "//android_webview:android_webview_java", + "//base:base_java_test_support", + "//content/public/test/android:content_java_test_support", + "//third_party/android_support_test_runner:runner_java", + ] + + package_name = "org.chromium.android_webview.robolectric" +}
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 81616ef..3cbc9cd 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -606,6 +606,10 @@ "system/accessibility/autoclick_menu_bubble_controller.h", "system/accessibility/autoclick_menu_view.cc", "system/accessibility/autoclick_menu_view.h", + "system/accessibility/autoclick_scroll_bubble_controller.cc", + "system/accessibility/autoclick_scroll_bubble_controller.h", + "system/accessibility/autoclick_scroll_view.cc", + "system/accessibility/autoclick_scroll_view.h", "system/accessibility/dictation_button_tray.cc", "system/accessibility/dictation_button_tray.h", "system/accessibility/select_to_speak_tray.cc",
diff --git a/ash/DEPS b/ash/DEPS index 865e3259..0df7aaf 100644 --- a/ash/DEPS +++ b/ash/DEPS
@@ -32,7 +32,6 @@ "+services/preferences/public", "+services/service_manager/public", "+services/viz/public", - "+services/ws", "+skia/ext", "+third_party/cros_system_api", "+third_party/icu",
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc index 70b52915..c816a9c 100644 --- a/ash/accelerators/accelerator_controller_impl.cc +++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -92,8 +92,8 @@ #include "ui/display/display.h" #include "ui/display/manager/managed_display_info.h" #include "ui/display/screen.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/input_device.h" -#include "ui/events/devices/input_device_manager.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/message_center/message_center.h" @@ -679,7 +679,7 @@ base::UserMetricsAction("VoiceInteraction.Started.Search_Space")); } else if (accelerator.IsCmdDown() && accelerator.key_code() == ui::VKEY_A) { // Search+A shortcut is disabled on device with an assistant key. - if (ui::DeviceUsesKeyboardLayout2()) + if (ui::DeviceKeyboardHasAssistantKey()) return; base::RecordAction( @@ -705,7 +705,7 @@ l10n_util::GetStringUTF16( IDS_ASH_VOICE_INTERACTION_LOCALE_UNSUPPORTED_TOAST_MESSAGE)); return; - case mojom::AssistantAllowedState::DISALLOWED_BY_ARC_POLICY: + case mojom::AssistantAllowedState::DISALLOWED_BY_POLICY: // Show a toast if voice interaction is disabled due to enterprise policy. ShowToast(kVoiceInteractionErrorToastId, l10n_util::GetStringUTF16( @@ -725,12 +725,24 @@ l10n_util::GetStringUTF16( IDS_ASH_VOICE_INTERACTION_DISABLED_IN_DEMO_MODE_MESSAGE)); return; - case mojom::AssistantAllowedState::DISALLOWED_BY_ARC_DISALLOWED: case mojom::AssistantAllowedState::DISALLOWED_BY_FLAG: + ShowToast(kVoiceInteractionErrorToastId, + l10n_util::GetStringUTF16( + IDS_ASH_VOICE_INTERACTION_DISABLED_MESSAGE)); + return; case mojom::AssistantAllowedState::DISALLOWED_BY_SUPERVISED_USER: + // supervised user is deprecated, wait for the code clean up. + NOTREACHED(); + return; case mojom::AssistantAllowedState::DISALLOWED_BY_INCOGNITO: + ShowToast(kVoiceInteractionErrorToastId, + l10n_util::GetStringUTF16( + IDS_ASH_VOICE_INTERACTION_DISABLED_IN_GUEST_MESSAGE)); + return; case mojom::AssistantAllowedState::DISALLOWED_BY_ACCOUNT_TYPE: - // TODO(xiaohuic): show a specific toast. + ShowToast(kVoiceInteractionErrorToastId, + l10n_util::GetStringUTF16( + IDS_ASH_VOICE_INTERACTION_DISABLED_BY_ACCOUNT_MESSAGE)); return; case mojom::AssistantAllowedState::ALLOWED: // Nothing need to do if allowed. @@ -1963,7 +1975,7 @@ return false; for (const ui::InputDevice& keyboard : - ui::InputDeviceManager::GetInstance()->GetKeyboardDevices()) { + ui::DeviceDataManager::GetInstance()->GetKeyboardDevices()) { if (keyboard.type == ui::InputDeviceType::INPUT_DEVICE_INTERNAL && keyboard.id == source_device_id) { return true; @@ -1971,7 +1983,7 @@ } for (const ui::InputDevice& uncategorized_device : - ui::InputDeviceManager::GetInstance()->GetUncategorizedDevices()) { + ui::DeviceDataManager::GetInstance()->GetUncategorizedDevices()) { if (uncategorized_device.id == source_device_id && uncategorized_device.type == ui::InputDeviceType::INPUT_DEVICE_INTERNAL) {
diff --git a/ash/accelerators/accelerator_table.cc b/ash/accelerators/accelerator_table.cc index b0232dd..558f95c 100644 --- a/ash/accelerators/accelerator_table.cc +++ b/ash/accelerators/accelerator_table.cc
@@ -153,6 +153,9 @@ KEYBOARD_BRIGHTNESS_UP, MAGNIFIER_ZOOM_IN, // Control+F7 MAGNIFIER_ZOOM_OUT, // Control+F6 + MEDIA_NEXT_TRACK, + MEDIA_PLAY_PAUSE, + MEDIA_PREV_TRACK, PRINT_UI_HIERARCHIES, ROTATE_SCREEN, SCALE_UI_DOWN,
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc index c9b3642..f9fe6febd 100644 --- a/ash/app_list/app_list_controller_impl.cc +++ b/ash/app_list/app_list_controller_impl.cc
@@ -961,6 +961,10 @@ "chips."; app_list::RecordSearchResultOpenTypeHistogram( launched_from, app_list::ASSISTANT_OMNIBOX_RESULT, IsTabletMode()); + if (!GetLastQueryLength()) { + app_list::RecordZeroStateSuggestionOpenTypeHistogram( + app_list::ASSISTANT_OMNIBOX_RESULT); + } Shell::Get()->assistant_controller()->ui_controller()->ShowUi( AssistantEntryPoint::kLauncherSearchResult); Shell::Get()->assistant_controller()->OpenUrl(
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc index b2f7b8e..341c92a1 100644 --- a/ash/app_list/views/apps_grid_view.cc +++ b/ash/app_list/views/apps_grid_view.cc
@@ -3198,8 +3198,7 @@ // Start animation. TopIconAnimationView* animation_view = new TopIconAnimationView( - drag_item->icon(), base::UTF8ToUTF16(drag_item->GetDisplayName()), - target_bounds, false, true); + drag_item->icon(), base::string16(), target_bounds, false, true); AddChildView(animation_view); animation_view->SetBoundsRect(source_bounds); animation_view->AddObserver(
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index f3a9b667..6f7b8fb3 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -494,6 +494,21 @@ <message name="IDS_ASH_AUTOCLICK_OPTION_CHANGE_POSITION" desc="The tooltip text for a menu option for automatic clicks menu that results in the menu changing position on the screen. The menu will toggle through several pre-set positions."> Toggle menu position </message> + <message name="IDS_ASH_AUTOCLICK_SCROLL_UP" desc="The tooltip text for the automatic clicks menu option that results in the active area being scrolled up."> + Scroll up + </message> + <message name="IDS_ASH_AUTOCLICK_SCROLL_DOWN" desc="The tooltip text for the automatic clicks menu option that results in the active area being scrolled down."> + Scroll down + </message> + <message name="IDS_ASH_AUTOCLICK_SCROLL_LEFT" desc="The tooltip text for the automatic clicks menu option that results in the active area being scrolled left."> + Scroll left + </message> + <message name="IDS_ASH_AUTOCLICK_SCROLL_RIGHT" desc="The tooltip text for the automatic clicks menu option that results in the active area being scrolled right."> + Scroll right + </message> + <message name="IDS_ASH_AUTOCLICK_SCROLL_CLOSE" desc="The tooltip text for the automatic clicks menu option that results in the scrolling menu being closed."> + Close + </message> <message name="IDS_ASH_AUTOCLICK_DISABLE_CONFIRMATION_TITLE" desc="The title for the modal dialog shown when the user disables automatic clicks, to confirm they meant to disable the feature."> Turn off automatic clicks </message> @@ -664,6 +679,15 @@ <message name="IDS_ASH_VOICE_INTERACTION_DISABLED_IN_PUBLIC_SESSION_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed in a public session, which does not support voice interaction."> The Google Assistant is not available in a public session. </message> + <message name="IDS_ASH_VOICE_INTERACTION_DISABLED_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed while the feature is disabled."> + The Google Assistant is disabled on this device. + </message> + <message name="IDS_ASH_VOICE_INTERACTION_DISABLED_IN_GUEST_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed in a guest session, which does not support voice interaction."> + The Google Assistant is not available in a guest session. + </message> + <message name="IDS_ASH_VOICE_INTERACTION_DISABLED_BY_ACCOUNT_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed but current logged in user account does not support voice interaction."> + The Google Assistant is not available for current user account. + </message> <message name="IDS_ASH_TOAST_DISMISS_BUTTON" desc="The text button shown in toasts to close the toast immediately without waiting timeout."> DISMISS
diff --git a/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_CLOSE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_CLOSE.png.sha1 new file mode 100644 index 0000000..671c208 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_CLOSE.png.sha1
@@ -0,0 +1 @@ +da590fde09a2af2fc5d204086f36485baf262b51 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_DOWN.png.sha1 b/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_DOWN.png.sha1 new file mode 100644 index 0000000..671c208 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_DOWN.png.sha1
@@ -0,0 +1 @@ +da590fde09a2af2fc5d204086f36485baf262b51 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_LEFT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_LEFT.png.sha1 new file mode 100644 index 0000000..671c208 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_LEFT.png.sha1
@@ -0,0 +1 @@ +da590fde09a2af2fc5d204086f36485baf262b51 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_RIGHT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_RIGHT.png.sha1 new file mode 100644 index 0000000..671c208 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_RIGHT.png.sha1
@@ -0,0 +1 @@ +da590fde09a2af2fc5d204086f36485baf262b51 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_UP.png.sha1 b/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_UP.png.sha1 new file mode 100644 index 0000000..671c208 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_AUTOCLICK_SCROLL_UP.png.sha1
@@ -0,0 +1 @@ +da590fde09a2af2fc5d204086f36485baf262b51 \ No newline at end of file
diff --git a/ash/autoclick/autoclick_controller.cc b/ash/autoclick/autoclick_controller.cc index 35d73fb..864978d 100644 --- a/ash/autoclick/autoclick_controller.cc +++ b/ash/autoclick/autoclick_controller.cc
@@ -185,6 +185,7 @@ InitializeScrollLocation(); UpdateScrollPosition(scroll_location_); } else { + over_scroll_button_ = false; HideScrollPosition(); } @@ -252,6 +253,19 @@ ignore_result(host->event_sink()->OnEventFromSource(&wheel)); } +void AutoclickController::OnEnteredScrollButton() { + if (start_gesture_timer_) + start_gesture_timer_->Stop(); + if (autoclick_timer_) + autoclick_timer_->Stop(); + autoclick_ring_handler_->StopGesture(); + over_scroll_button_ = true; +} + +void AutoclickController::OnExitedScrollButton() { + over_scroll_button_ = false; +} + void AutoclickController::UpdateAutoclickMenuBoundsIfNeeded() { if (menu_bubble_controller_) menu_bubble_controller_->SetPosition(menu_position_); @@ -314,11 +328,16 @@ if (in_progress_event_type == mojom::AutoclickEventType::kScroll) { // A dwell during a scroll. - // TODO(katie): Check if the event is over the scroll bubble controller, - // and if it is, click on the scroll bubble. - // TODO(katie): Move the scroll bubble closer to the new scroll location. - scroll_location_ = gesture_anchor_location_; - UpdateScrollPosition(scroll_location_); + // Check if the event is over the scroll bubble controller, and if it is, + // click on the scroll bubble. + if (AutoclickScrollContainsPoint(gesture_anchor_location_)) { + menu_bubble_controller_->ClickOnScrollBubble(gesture_anchor_location_, + mouse_event_flags_); + } else { + // TODO(katie): Move the scroll bubble closer to the new scroll location. + scroll_location_ = gesture_anchor_location_; + UpdateScrollPosition(scroll_location_); + } return; } @@ -514,6 +533,12 @@ menu_bubble_controller_->ContainsPointInScreen(point); } +bool AutoclickController::AutoclickScrollContainsPoint( + const gfx::Point& point) const { + return menu_bubble_controller_ && + menu_bubble_controller_->ScrollBubbleContainsPointInScreen(point); +} + void AutoclickController::RecordUserAction( mojom::AutoclickEventType event_type) const { switch (event_type) { @@ -551,6 +576,8 @@ if (event->type() == ui::ET_MOUSE_CAPTURE_CHANGED) return; last_mouse_location_ = event->target()->GetScreenLocation(*event); + if (over_scroll_button_) + return; if (!(event->flags() & ui::EF_IS_SYNTHESIZED) && (event->type() == ui::ET_MOUSE_MOVED || (event->type() == ui::ET_MOUSE_DRAGGED &&
diff --git a/ash/autoclick/autoclick_controller.h b/ash/autoclick/autoclick_controller.h index 5c1513c..4f981eea7 100644 --- a/ash/autoclick/autoclick_controller.h +++ b/ash/autoclick/autoclick_controller.h
@@ -80,6 +80,12 @@ // Performs the given ScrollPadAction at the current scrolling point. void DoScrollAction(ScrollPadAction action); + // The cursor is over a scroll (up/down/left/right) button. + void OnEnteredScrollButton(); + + // The cursor has exited a scroll (up/down/left/right) button. + void OnExitedScrollButton(); + // Update the bubble menu bounds if necessary to avoid system UI. void UpdateAutoclickMenuBoundsIfNeeded(); @@ -128,6 +134,7 @@ bool DragInProgress() const; void CreateMenuBubbleController(); bool AutoclickMenuContainsPoint(const gfx::Point& point) const; + bool AutoclickScrollContainsPoint(const gfx::Point& point) const; // ui::EventHandler overrides: void OnMouseEvent(ui::MouseEvent* event) override; @@ -179,6 +186,10 @@ // The point at which the next scroll event will occur. gfx::Point scroll_location_{-kDefaultAutoclickMovementThreshold, -kDefaultAutoclickMovementThreshold}; + // Whether the cursor is currently over a scroll button. If true, new gestures + // will not be started. This ensures the autoclick ring is not drawn over + // the scroll position buttons, and extra clicks will not be generated there. + bool over_scroll_button_ = false; // The widget containing the autoclick ring. std::unique_ptr<views::Widget> ring_widget_;
diff --git a/ash/autoclick/autoclick_unittest.cc b/ash/autoclick/autoclick_unittest.cc index d34be8e..e3bebba 100644 --- a/ash/autoclick/autoclick_unittest.cc +++ b/ash/autoclick/autoclick_unittest.cc
@@ -9,6 +9,8 @@ #include "ash/system/accessibility/accessibility_feature_disable_dialog.h" #include "ash/system/accessibility/autoclick_menu_bubble_controller.h" #include "ash/system/accessibility/autoclick_menu_view.h" +#include "ash/system/accessibility/autoclick_scroll_bubble_controller.h" +#include "ash/system/accessibility/autoclick_scroll_view.h" #include "ash/system/unified/unified_system_tray.h" #include "ash/test/ash_test_base.h" #include "ash/wm/collision_detection/collision_detection_utils.h" @@ -173,6 +175,14 @@ ->menu_view_; } + AutoclickScrollView* GetAutoclickScrollView() { + AutoclickScrollBubbleController* controller = + GetAutoclickController() + ->GetMenuBubbleControllerForTesting() + ->scroll_bubble_controller_.get(); + return controller ? controller->scroll_view_ : nullptr; + } + views::Widget* GetAutoclickBubbleWidget() { return GetAutoclickController() ->GetMenuBubbleControllerForTesting() @@ -186,6 +196,13 @@ return menu_view->GetViewByID(static_cast<int>(view_id)); } + views::View* GetScrollButton(AutoclickScrollView::ButtonId view_id) { + AutoclickScrollView* scroll_view = GetAutoclickScrollView(); + if (!scroll_view) + return nullptr; + return scroll_view->GetViewByID(static_cast<int>(view_id)); + } + void ClearMouseEvents() { mouse_event_capturer_.Reset(); } const std::vector<ui::MouseEvent>& GetMouseEvents() { @@ -1199,4 +1216,100 @@ EXPECT_TRUE(GetAutoclickBubbleWidget()->IsVisible()); } +TEST_F(AutoclickTest, ScrollClosesWhenHoveredOverScrollButton) { + EnableExperimentalAutoclickFlag(true); + GetAutoclickController()->SetEnabled(true, false /* do not show dialog */); + GetAutoclickController()->SetAutoclickEventType( + mojom::AutoclickEventType::kLeftClick); + EXPECT_FALSE(GetAutoclickScrollView()); + + // Enable scroll. + GetAutoclickController()->SetAutoclickEventType( + mojom::AutoclickEventType::kScroll); + ASSERT_TRUE(GetAutoclickScrollView()); + views::View* close_button = + GetScrollButton(AutoclickScrollView::ButtonId::kCloseScroll); + ASSERT_TRUE(close_button); + + gfx::Point button_location = close_button->GetBoundsInScreen().CenterPoint(); + GetEventGenerator()->MoveMouseTo(button_location); + // No mouse event. + std::vector<ui::MouseEvent> events = WaitForMouseEvents(); + EXPECT_EQ(0u, events.size()); + + // Reset to left click and scroll view is gone. + EXPECT_EQ(mojom::AutoclickEventType::kLeftClick, + Shell::Get()->accessibility_controller()->GetAutoclickEventType()); + EXPECT_FALSE(GetAutoclickScrollView()); + + EnableExperimentalAutoclickFlag(false); +} + +TEST_F(AutoclickTest, ScrollOccursWhenHoveredOverScrollButtons) { + UpdateDisplay("800x600"); + EnableExperimentalAutoclickFlag(true); + GetAutoclickController()->SetEnabled(true, false /* do not show dialog */); + + // Enable scroll. + GetAutoclickController()->SetAutoclickEventType( + mojom::AutoclickEventType::kScroll); + ASSERT_TRUE(GetAutoclickScrollView()); + + // TODO: Do for all four buttons, wait a few scrolls each. + const struct { + AutoclickScrollView::ButtonId button_id; + int scroll_x; + int scroll_y; + } kTestCases[] = { + {AutoclickScrollView::ButtonId::kScrollUp, 0, + ui::MouseWheelEvent::kWheelDelta}, + {AutoclickScrollView::ButtonId::kScrollDown, 0, + -ui::MouseWheelEvent::kWheelDelta}, + {AutoclickScrollView::ButtonId::kScrollLeft, + ui::MouseWheelEvent::kWheelDelta, 0}, + {AutoclickScrollView::ButtonId::kScrollRight, + -ui::MouseWheelEvent::kWheelDelta, 0}, + }; + for (auto& test : kTestCases) { + views::View* button = GetScrollButton(test.button_id); + ASSERT_TRUE(button); + + gfx::Point button_location = button->GetBoundsInScreen().CenterPoint(); + GetEventGenerator()->MoveMouseTo(button_location); + // No mouse event during hover, no wheel events yet. + FastForwardBy(AutoclickScrollView::kAutoclickScrollDelayMs - 1); + std::vector<ui::MouseEvent> events = GetMouseEvents(); + EXPECT_EQ(0u, events.size()); + std::vector<ui::MouseWheelEvent> wheel_events = GetMouseWheelEvents(); + EXPECT_EQ(0u, wheel_events.size()); + + // But we should get a scroll event after kAutoclickScrollDelayMs. + FastForwardBy(2); + wheel_events = GetMouseWheelEvents(); + EXPECT_EQ(1u, wheel_events.size()); + EXPECT_EQ(gfx::Point(400, 300), wheel_events[0].location()); + EXPECT_EQ(test.scroll_x, wheel_events[0].x_offset()); + EXPECT_EQ(test.scroll_y, wheel_events[0].y_offset()); + // No other events expected. + events = GetMouseEvents(); + EXPECT_EQ(0u, events.size()); + ClearMouseEvents(); + + // Wait until another kAutoclickScrollDelayMs has elapsed and expect another + // scroll to have occurred. + FastForwardBy(AutoclickScrollView::kAutoclickScrollDelayMs); + wheel_events = GetMouseWheelEvents(); + EXPECT_EQ(1u, wheel_events.size()); + EXPECT_EQ(gfx::Point(400, 300), wheel_events[0].location()); + EXPECT_EQ(test.scroll_x, wheel_events[0].x_offset()); + EXPECT_EQ(test.scroll_y, wheel_events[0].y_offset()); + // No other events expected. + events = GetMouseEvents(); + EXPECT_EQ(0u, events.size()); + ClearMouseEvents(); + } + + EnableExperimentalAutoclickFlag(false); +} + } // namespace ash
diff --git a/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc b/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc index 8f3baacf..6411c6b 100644 --- a/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc +++ b/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
@@ -13,7 +13,7 @@ #include "base/strings/utf_string_conversions.h" #include "ui/base/l10n/l10n_util.h" #include "ui/chromeos/events/keyboard_layout_util.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/event_constants.h" #include "ui/events/keycodes/dom/dom_code.h" #include "ui/events/keycodes/dom/dom_codes.h" @@ -63,9 +63,9 @@ msg_id = IDS_KSV_MODIFIER_SHIFT; break; case ui::VKEY_COMMAND: - // DeviceUsesKeyboardLayout2() relies on InputDeviceManager. - DCHECK(ui::InputDeviceManager::HasInstance()); - DCHECK(ui::InputDeviceManager::GetInstance()->AreDeviceListsComplete()); + // DeviceUsesKeyboardLayout2() relies on DeviceDataManager. + DCHECK(ui::DeviceDataManager::HasInstance()); + DCHECK(ui::DeviceDataManager::GetInstance()->AreDeviceListsComplete()); msg_id = ui::DeviceUsesKeyboardLayout2() ? IDS_KSV_MODIFIER_LAUNCHER : IDS_KSV_MODIFIER_SEARCH; break;
diff --git a/ash/display/touch_calibrator_controller.cc b/ash/display/touch_calibrator_controller.cc index 17c0aaf..075fb90 100644 --- a/ash/display/touch_calibrator_controller.cc +++ b/ash/display/touch_calibrator_controller.cc
@@ -17,7 +17,7 @@ #include "ui/aura/window_tree_host.h" #include "ui/display/manager/touch_device_manager.h" #include "ui/display/screen.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/event.h" #include "ui/events/event_constants.h" #include "ui/gfx/geometry/size_conversions.h" @@ -28,7 +28,7 @@ void InitInternalTouchDeviceIds(std::set<int>& internal_touch_device_ids) { internal_touch_device_ids.clear(); const std::vector<ui::TouchscreenDevice>& device_list = - ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices(); + ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices(); for (const auto& touchscreen_device : device_list) { if (touchscreen_device.type == ui::InputDeviceType::INPUT_DEVICE_INTERNAL) internal_touch_device_ids.insert(touchscreen_device.id); @@ -42,7 +42,7 @@ const display::DisplayManager* display_manager = Shell::Get()->display_manager(); const std::vector<ui::TouchscreenDevice>& device_list = - ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices(); + ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices(); auto device_it = std::find_if( device_list.begin(), device_list.end(), @@ -173,7 +173,7 @@ display::TouchDeviceIdentifier::GetFallbackTouchDeviceIdentifier(); const std::vector<ui::TouchscreenDevice>& device_list = - ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices(); + ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices(); for (const auto& device : device_list) { if (device.id == touch_device_id_) { touch_device_identifier =
diff --git a/ash/display/touch_calibrator_controller_unittest.cc b/ash/display/touch_calibrator_controller_unittest.cc index 97e683b..36c441b2 100644 --- a/ash/display/touch_calibrator_controller_unittest.cc +++ b/ash/display/touch_calibrator_controller_unittest.cc
@@ -177,7 +177,7 @@ touch_device_transform.device_id = touchdevice.id; transforms.push_back(touch_device_transform); - // This makes touchscreen target displays valid for |ui::InputDeviceManager| + // This makes touchscreen target displays valid for ui::DeviceDataManager. test::TouchTransformControllerTestApi( Shell::Get()->touch_transformer_controller()) .touch_transform_setter()
diff --git a/ash/keyboard/virtual_keyboard_controller.cc b/ash/keyboard/virtual_keyboard_controller.cc index 2f4afc9d..1f6a917 100644 --- a/ash/keyboard/virtual_keyboard_controller.cc +++ b/ash/keyboard/virtual_keyboard_controller.cc
@@ -26,8 +26,8 @@ #include "ui/base/emoji/emoji_panel_helper.h" #include "ui/display/display.h" #include "ui/display/screen.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/input_device.h" -#include "ui/events/devices/input_device_manager.h" #include "ui/events/devices/touchscreen_device.h" namespace ash { @@ -66,7 +66,7 @@ ignore_external_keyboard_(false) { Shell::Get()->tablet_mode_controller()->AddObserver(this); Shell::Get()->session_controller()->AddObserver(this); - ui::InputDeviceManager::GetInstance()->AddObserver(this); + ui::DeviceDataManager::GetInstance()->AddObserver(this); UpdateDevices(); // Set callback to show the emoji panel @@ -90,7 +90,7 @@ Shell::Get()->tablet_mode_controller()->RemoveObserver(this); if (Shell::Get()->session_controller()) Shell::Get()->session_controller()->RemoveObserver(this); - ui::InputDeviceManager::GetInstance()->RemoveObserver(this); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); // Reset the emoji panel callback ui::SetShowEmojiKeyboardCallback(base::DoNothing()); @@ -159,8 +159,8 @@ } void VirtualKeyboardController::UpdateDevices() { - ui::InputDeviceManager* device_data_manager = - ui::InputDeviceManager::GetInstance(); + ui::DeviceDataManager* device_data_manager = + ui::DeviceDataManager::GetInstance(); // Checks for touchscreens. has_touchscreen_ = device_data_manager->GetTouchscreenDevices().size() > 0;
diff --git a/ash/kiosk_next/kiosk_next_home_controller.cc b/ash/kiosk_next/kiosk_next_home_controller.cc index c881428..dbf867b 100644 --- a/ash/kiosk_next/kiosk_next_home_controller.cc +++ b/ash/kiosk_next/kiosk_next_home_controller.cc
@@ -131,9 +131,6 @@ } void KioskNextHomeController::OnGestureEvent(ui::GestureEvent* event) { - if (event->type() != ui::EventType::ET_GESTURE_SCROLL_BEGIN) - return; - aura::Window* target = static_cast<aura::Window*>(event->target()); int component = wm::GetNonClientComponent(target, event->location()); @@ -143,16 +140,23 @@ if (new_target) target = new_target; - if (target != home_screen_container_ && target != home_screen_window_) + if (!(target == home_screen_window_ || started_handling_events_)) return; - if (component == HTCLIENT) { - event->SetHandled(); - event->StopPropagation(); - + if (component == HTCLIENT && event->type() == ui::ET_GESTURE_SCROLL_BEGIN) { auto* overview_controller = Shell::Get()->overview_controller(); if (!overview_controller->InOverviewSession()) overview_controller->ToggleOverview(); + started_handling_events_ = true; + } + + if (started_handling_events_) { + event->SetHandled(); + event->StopPropagation(); + + if (event->type() == ui::EventType::ET_GESTURE_SCROLL_END || + event->type() == ui::EventType::ET_GESTURE_END) + started_handling_events_ = false; } }
diff --git a/ash/kiosk_next/kiosk_next_home_controller.h b/ash/kiosk_next/kiosk_next_home_controller.h index 6aec00c..2c24d7f 100644 --- a/ash/kiosk_next/kiosk_next_home_controller.h +++ b/ash/kiosk_next/kiosk_next_home_controller.h
@@ -55,6 +55,7 @@ void OnGestureEvent(ui::GestureEvent* event) override; private: + bool started_handling_events_ = false; aura::Window* home_screen_container_ = nullptr; aura::Window* home_screen_window_ = nullptr;
diff --git a/ash/media/media_controller_impl.cc b/ash/media/media_controller_impl.cc index 73c40f0..5f352c9f 100644 --- a/ash/media/media_controller_impl.cc +++ b/ash/media/media_controller_impl.cc
@@ -4,6 +4,7 @@ #include "ash/media/media_controller_impl.h" +#include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_pref_names.h" #include "ash/public/cpp/media_client.h" #include "ash/session/session_controller_impl.h" @@ -12,6 +13,7 @@ #include "base/feature_list.h" #include "base/metrics/histogram_macros.h" #include "components/prefs/pref_registry_simple.h" +#include "components/prefs/pref_service.h" #include "media/base/media_switches.h" #include "services/media_session/public/mojom/constants.mojom.h" #include "services/media_session/public/mojom/media_session.mojom.h" @@ -48,6 +50,14 @@ PrefRegistry::PUBLIC); } +// static +bool MediaControllerImpl::AreLockScreenMediaKeysEnabled() { + PrefService* prefs = + Shell::Get()->session_controller()->GetPrimaryUserPrefService(); + return prefs->GetBoolean(prefs::kLockScreenMediaKeysEnabled) && + base::FeatureList::IsEnabled(features::kLockScreenMediaKeys); +} + void MediaControllerImpl::AddObserver(MediaCaptureObserver* observer) { observers_.AddObserver(observer); } @@ -75,8 +85,10 @@ } void MediaControllerImpl::HandleMediaPlayPause() { - if (Shell::Get()->session_controller()->IsScreenLocked()) + if (Shell::Get()->session_controller()->IsScreenLocked() && + !AreLockScreenMediaKeysEnabled()) { return; + } // If the |client_| is force handling the keys then we should forward them. if (client_ && force_media_client_key_handling_) { @@ -111,8 +123,10 @@ } void MediaControllerImpl::HandleMediaNextTrack() { - if (Shell::Get()->session_controller()->IsScreenLocked()) + if (Shell::Get()->session_controller()->IsScreenLocked() && + !AreLockScreenMediaKeysEnabled()) { return; + } ui::RecordMediaHardwareKeyAction(ui::MediaHardwareKeyAction::kNextTrack); @@ -134,8 +148,10 @@ } void MediaControllerImpl::HandleMediaPrevTrack() { - if (Shell::Get()->session_controller()->IsScreenLocked()) + if (Shell::Get()->session_controller()->IsScreenLocked() && + !AreLockScreenMediaKeysEnabled()) { return; + } ui::RecordMediaHardwareKeyAction(ui::MediaHardwareKeyAction::kPreviousTrack);
diff --git a/ash/media/media_controller_impl.h b/ash/media/media_controller_impl.h index 4dde6f15..97ba832 100644 --- a/ash/media/media_controller_impl.h +++ b/ash/media/media_controller_impl.h
@@ -47,6 +47,10 @@ static void RegisterProfilePrefs(PrefRegistrySimple* registry); + // Determine if lock screen media keys are enabled based on feature flag and + // user preference. + static bool AreLockScreenMediaKeysEnabled(); + void AddObserver(MediaCaptureObserver* observer); void RemoveObserver(MediaCaptureObserver* observer);
diff --git a/ash/media/media_controller_unittest.cc b/ash/media/media_controller_unittest.cc index 7797bb6b..4548b3cdf 100644 --- a/ash/media/media_controller_unittest.cc +++ b/ash/media/media_controller_unittest.cc
@@ -6,10 +6,14 @@ #include <memory> +#include "ash/public/cpp/ash_features.h" +#include "ash/public/cpp/ash_pref_names.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "base/macros.h" +#include "base/test/scoped_feature_list.h" +#include "components/prefs/testing_pref_service.h" #include "services/media_session/public/cpp/test/test_media_controller.h" namespace ash { @@ -65,58 +69,107 @@ Shell::Get()->media_controller()->FlushForTesting(); } + void HandleMediaKeys() { + Shell::Get()->media_controller()->HandleMediaPlayPause(); + Flush(); + Shell::Get()->media_controller()->HandleMediaPrevTrack(); + Flush(); + Shell::Get()->media_controller()->HandleMediaNextTrack(); + Flush(); + } + private: std::unique_ptr<media_session::test::TestMediaController> controller_; DISALLOW_COPY_AND_ASSIGN(MediaControllerTest); }; -TEST_F(MediaControllerTest, DisablePlayPauseWhenLocked) { +TEST_F(MediaControllerTest, EnableMediaKeysWhenUnlocked) { EXPECT_EQ(0, controller()->suspend_count()); - - Shell::Get()->media_controller()->HandleMediaPlayPause(); - Flush(); - - EXPECT_EQ(1, controller()->suspend_count()); - - SimulateSessionLock(); - - Shell::Get()->media_controller()->HandleMediaPlayPause(); - Flush(); - - EXPECT_EQ(1, controller()->suspend_count()); -} - -TEST_F(MediaControllerTest, DisablePreviousTrackWhenLocked) { EXPECT_EQ(0, controller()->previous_track_count()); - - Shell::Get()->media_controller()->HandleMediaPrevTrack(); - Flush(); - - EXPECT_EQ(1, controller()->previous_track_count()); - - SimulateSessionLock(); - - Shell::Get()->media_controller()->HandleMediaPrevTrack(); - Flush(); - - EXPECT_EQ(1, controller()->previous_track_count()); -} - -TEST_F(MediaControllerTest, DisableNextTrackWhenLocked) { EXPECT_EQ(0, controller()->next_track_count()); - Shell::Get()->media_controller()->HandleMediaNextTrack(); - Flush(); + HandleMediaKeys(); + EXPECT_EQ(1, controller()->suspend_count()); + EXPECT_EQ(1, controller()->previous_track_count()); EXPECT_EQ(1, controller()->next_track_count()); +} + +TEST_F(MediaControllerTest, EnableLockScreenMediaKeys) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(features::kLockScreenMediaKeys); + + PrefService* prefs = + Shell::Get()->session_controller()->GetLastActiveUserPrefService(); + prefs->SetBoolean(prefs::kLockScreenMediaKeysEnabled, true); + + EXPECT_TRUE(MediaControllerImpl::AreLockScreenMediaKeysEnabled()); +} + +TEST_F(MediaControllerTest, DisableLockScreenMediaKeysIfFeatureDisabled) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature(features::kLockScreenMediaKeys); + + PrefService* prefs = + Shell::Get()->session_controller()->GetPrimaryUserPrefService(); + prefs->SetBoolean(prefs::kLockScreenMediaKeysEnabled, true); + + EXPECT_FALSE(MediaControllerImpl::AreLockScreenMediaKeysEnabled()); + + prefs->SetBoolean(prefs::kLockScreenMediaKeysEnabled, false); + + EXPECT_FALSE(MediaControllerImpl::AreLockScreenMediaKeysEnabled()); +} + +TEST_F(MediaControllerTest, DisableLockScreenMediaKeysIfPreferenceDisabled) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(features::kLockScreenMediaKeys); + + PrefService* prefs = + Shell::Get()->session_controller()->GetPrimaryUserPrefService(); + prefs->SetBoolean(prefs::kLockScreenMediaKeysEnabled, false); + + EXPECT_FALSE(MediaControllerImpl::AreLockScreenMediaKeysEnabled()); +} + +TEST_F(MediaControllerTest, EnableMediaKeysWhenLockedAndKeysEnabled) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(features::kLockScreenMediaKeys); + + PrefService* prefs = + Shell::Get()->session_controller()->GetPrimaryUserPrefService(); + prefs->SetBoolean(prefs::kLockScreenMediaKeysEnabled, true); + + EXPECT_EQ(0, controller()->suspend_count()); + EXPECT_EQ(0, controller()->previous_track_count()); + EXPECT_EQ(0, controller()->next_track_count()); SimulateSessionLock(); - Shell::Get()->media_controller()->HandleMediaNextTrack(); - Flush(); + HandleMediaKeys(); + EXPECT_EQ(1, controller()->suspend_count()); + EXPECT_EQ(1, controller()->previous_track_count()); EXPECT_EQ(1, controller()->next_track_count()); } +TEST_F(MediaControllerTest, DisableMediaKeysWhenLockedAndKeysDisabled) { + PrefService* prefs = + Shell::Get()->session_controller()->GetPrimaryUserPrefService(); + prefs->SetBoolean(prefs::kLockScreenMediaKeysEnabled, false); + + EXPECT_EQ(0, controller()->suspend_count()); + EXPECT_EQ(0, controller()->previous_track_count()); + EXPECT_EQ(0, controller()->next_track_count()); + + SimulateSessionLock(); + + HandleMediaKeys(); + + EXPECT_EQ(0, controller()->suspend_count()); + EXPECT_EQ(0, controller()->previous_track_count()); + EXPECT_EQ(0, controller()->next_track_count()); +} + } // namespace ash
diff --git a/ash/public/cpp/stylus_utils.cc b/ash/public/cpp/stylus_utils.cc index 084573d..cfd9010 100644 --- a/ash/public/cpp/stylus_utils.cc +++ b/ash/public/cpp/stylus_utils.cc
@@ -7,7 +7,7 @@ #include "ash/public/cpp/ash_switches.h" #include "base/command_line.h" #include "ui/display/display.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/touchscreen_device.h" #include "ui/gfx/geometry/point.h" @@ -36,7 +36,7 @@ // Check to see if the hardware reports it is stylus capable. for (const ui::TouchscreenDevice& device : - ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices()) { + ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices()) { if (device.has_stylus && device.type == ui::InputDeviceType::INPUT_DEVICE_INTERNAL) { return true;
diff --git a/ash/public/interfaces/voice_interaction_controller.mojom b/ash/public/interfaces/voice_interaction_controller.mojom index efc163d..5c09282 100644 --- a/ash/public/interfaces/voice_interaction_controller.mojom +++ b/ash/public/interfaces/voice_interaction_controller.mojom
@@ -25,12 +25,8 @@ enum AssistantAllowedState { // Assistant feature is allowed. ALLOWED = 0, - // Disallowed because ARC++ is disallowed. There could be many specific - // reasones why ARC++ is disallowed. This enum is a catch all. Some enums - // below will show specific reasons. - DISALLOWED_BY_ARC_DISALLOWED, - // Disallowed because ARC++ is disabled by policy. - DISALLOWED_BY_ARC_POLICY, + // Disallowed because search and assistant is disabled by policy. + DISALLOWED_BY_POLICY, // Disallowed because user's locale is not compatible. DISALLOWED_BY_LOCALE, // Disallowed because the feature flag is off.
diff --git a/ash/system/accessibility/autoclick_menu_bubble_controller.cc b/ash/system/accessibility/autoclick_menu_bubble_controller.cc index c6cb458bc..6c2c0f6 100644 --- a/ash/system/accessibility/autoclick_menu_bubble_controller.cc +++ b/ash/system/accessibility/autoclick_menu_bubble_controller.cc
@@ -8,6 +8,7 @@ #include "ash/public/cpp/shell_window_ids.h" #include "ash/shelf/shelf.h" #include "ash/shell.h" +#include "ash/system/accessibility/autoclick_scroll_bubble_controller.h" #include "ash/system/tray/tray_background_view.h" #include "ash/system/tray/tray_constants.h" #include "ash/system/unified/unified_system_tray_view.h" @@ -21,6 +22,7 @@ #include "ui/compositor/layer.h" #include "ui/compositor/scoped_layer_animation_settings.h" #include "ui/events/event_utils.h" +#include "ui/views/bubble/bubble_border.h" namespace ash { @@ -29,6 +31,42 @@ const int kAutoclickMenuWidth = 321; const int kAutoclickMenuWidthWithScroll = 371; const int kAutoclickMenuHeight = 64; + +mojom::AutoclickMenuPosition DefaultSystemPosition() { + return base::i18n::IsRTL() ? mojom::AutoclickMenuPosition::kBottomLeft + : mojom::AutoclickMenuPosition::kBottomRight; +} + +views::BubbleBorder::Arrow GetScrollAnchorAlignmentForPosition( + mojom::AutoclickMenuPosition position) { + // If this is the default system position, pick the position based on the + // language direction. + if (position == mojom::AutoclickMenuPosition::kSystemDefault) { + position = DefaultSystemPosition(); + } + // Mirror arrow in RTL languages so that it always stays near the screen + // edge. + switch (position) { + case mojom::AutoclickMenuPosition::kBottomLeft: + return base::i18n::IsRTL() ? views::BubbleBorder::Arrow::TOP_RIGHT + : views::BubbleBorder::Arrow::TOP_LEFT; + case mojom::AutoclickMenuPosition::kTopLeft: + return base::i18n::IsRTL() ? views::BubbleBorder::Arrow::BOTTOM_RIGHT + : views::BubbleBorder::Arrow::BOTTOM_LEFT; + case mojom::AutoclickMenuPosition::kBottomRight: + return base::i18n::IsRTL() ? views::BubbleBorder::Arrow::TOP_LEFT + : views::BubbleBorder::Arrow::TOP_RIGHT; + case mojom::AutoclickMenuPosition::kTopRight: + return base::i18n::IsRTL() ? views::BubbleBorder::Arrow::BOTTOM_LEFT + : views::BubbleBorder::Arrow::BOTTOM_RIGHT; + case mojom::AutoclickMenuPosition::kSystemDefault: + // It's not possible for position to be kSystemDefault here because we've + // set it via DefaultSystemPosition() above if it was kSystemDefault. + NOTREACHED(); + return views::BubbleBorder::Arrow::TOP_LEFT; + } +} + } // namespace AutoclickMenuBubbleController::AutoclickMenuBubbleController() { @@ -39,6 +77,7 @@ if (bubble_widget_ && !bubble_widget_->IsClosed()) bubble_widget_->CloseNow(); Shell::Get()->locale_update_controller()->RemoveObserver(this); + scroll_bubble_controller_.reset(); } void AutoclickMenuBubbleController::SetEventType( @@ -46,6 +85,22 @@ if (menu_view_) { menu_view_->UpdateEventType(type); } + + if (type == mojom::AutoclickEventType::kScroll) { + // If the type is scroll, show the scroll bubble using the + // scroll_bubble_controller_. + if (!scroll_bubble_controller_) { + scroll_bubble_controller_ = + std::make_unique<AutoclickScrollBubbleController>(); + } + gfx::Rect anchor_rect = bubble_view_->GetBoundsInScreen(); + anchor_rect.Inset(-kCollisionWindowWorkAreaInsetsDp, + -kCollisionWindowWorkAreaInsetsDp); + scroll_bubble_controller_->ShowBubble( + anchor_rect, GetScrollAnchorAlignmentForPosition(position_)); + } else { + scroll_bubble_controller_ = nullptr; + } } void AutoclickMenuBubbleController::SetPosition( @@ -64,9 +119,7 @@ // If this is the default system position, pick the position based on the // language direction. if (new_position == mojom::AutoclickMenuPosition::kSystemDefault) { - new_position = base::i18n::IsRTL() - ? mojom::AutoclickMenuPosition::kBottomLeft - : mojom::AutoclickMenuPosition::kBottomRight; + new_position = DefaultSystemPosition(); } // Calculates the ideal bounds. @@ -123,6 +176,13 @@ settings.SetPreemptionStrategy( ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); bubble_widget_->SetBounds(resting_bounds); + + if (!scroll_bubble_controller_) + return; + + // Position the scroll bubble with respect to the menu. + scroll_bubble_controller_->UpdateAnchorRect( + resting_bounds, GetScrollAnchorAlignmentForPosition(new_position)); } void AutoclickMenuBubbleController::ShowBubble( @@ -188,6 +248,10 @@ bubble_widget_->Show(); else bubble_widget_->Hide(); + + if (!scroll_bubble_controller_) + return; + scroll_bubble_controller_->SetBubbleVisibility(is_visible); } void AutoclickMenuBubbleController::ClickOnBubble(gfx::Point location_in_dips, @@ -213,11 +277,26 @@ bubble_widget_->GetRootView()->OnMouseReleased(release_event); } +void AutoclickMenuBubbleController::ClickOnScrollBubble( + gfx::Point location_in_dips, + int mouse_event_flags) { + if (!scroll_bubble_controller_) + return; + + scroll_bubble_controller_->ClickOnBubble(location_in_dips, mouse_event_flags); +} + bool AutoclickMenuBubbleController::ContainsPointInScreen( const gfx::Point& point) { return bubble_view_ && bubble_view_->GetBoundsInScreen().Contains(point); } +bool AutoclickMenuBubbleController::ScrollBubbleContainsPointInScreen( + const gfx::Point& point) { + return scroll_bubble_controller_ && + scroll_bubble_controller_->ContainsPointInScreen(point); +} + void AutoclickMenuBubbleController::BubbleViewDestroyed() { bubble_view_ = nullptr; bubble_widget_ = nullptr;
diff --git a/ash/system/accessibility/autoclick_menu_bubble_controller.h b/ash/system/accessibility/autoclick_menu_bubble_controller.h index bab525f5..ff470c1 100644 --- a/ash/system/accessibility/autoclick_menu_bubble_controller.h +++ b/ash/system/accessibility/autoclick_menu_bubble_controller.h
@@ -12,6 +12,8 @@ namespace ash { +class AutoclickScrollBubbleController; + // Manages the bubble which contains an AutoclickMenuView. class AutoclickMenuBubbleController : public TrayBubbleView::Delegate, public LocaleChangeObserver { @@ -36,10 +38,16 @@ // Performs a mouse event on the bubble at the given location in DIPs. void ClickOnBubble(gfx::Point location_in_dips, int mouse_event_flags); + // Performs a mouse event on the scroll bubble at the given location in DIPs. + void ClickOnScrollBubble(gfx::Point location_in_dips, int mouse_event_flags); + // Whether the the bubble, if the bubble exists, contains the given screen // point. bool ContainsPointInScreen(const gfx::Point& point); + // Whether the scroll bubble exists and contains the given screen point. + bool ScrollBubbleContainsPointInScreen(const gfx::Point& point); + // TrayBubbleView::Delegate: void BubbleViewDestroyed() override; @@ -57,6 +65,11 @@ views::Widget* bubble_widget_ = nullptr; + // The controller for the scroll bubble. Only exists during a scroll. Owned + // by this class so that positioning calculations can take place using both + // classes at once. + std::unique_ptr<AutoclickScrollBubbleController> scroll_bubble_controller_; + DISALLOW_COPY_AND_ASSIGN(AutoclickMenuBubbleController); };
diff --git a/ash/system/accessibility/autoclick_menu_bubble_controller_unittest.cc b/ash/system/accessibility/autoclick_menu_bubble_controller_unittest.cc index 4b97b257..bc80c52 100644 --- a/ash/system/accessibility/autoclick_menu_bubble_controller_unittest.cc +++ b/ash/system/accessibility/autoclick_menu_bubble_controller_unittest.cc
@@ -8,7 +8,10 @@ #include "ash/autoclick/autoclick_controller.h" #include "ash/shelf/shelf.h" #include "ash/shell.h" +#include "ash/system/accessibility/autoclick_scroll_bubble_controller.h" #include "ash/test/ash_test_base.h" +#include "base/command_line.h" +#include "ui/accessibility/accessibility_switches.h" namespace ash { @@ -34,6 +37,8 @@ // testing::Test: void SetUp() override { + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kEnableExperimentalAccessibilityAutoclick); AshTestBase::SetUp(); Shell::Get()->accessibility_controller()->SetAutoclickEnabled(true); } @@ -61,6 +66,27 @@ : gfx::Rect(-kMenuViewBoundsBuffer, -kMenuViewBoundsBuffer); } + AutoclickScrollView* GetScrollView() { + return GetBubbleController()->scroll_bubble_controller_ + ? GetBubbleController()->scroll_bubble_controller_->scroll_view_ + : nullptr; + } + + views::View* GetScrollButton(AutoclickScrollView::ButtonId view_id) { + AutoclickScrollView* scroll_view = GetScrollView(); + if (!scroll_view) + return nullptr; + return scroll_view->GetViewByID(static_cast<int>(view_id)); + } + + gfx::Rect GetScrollViewBounds() { + return GetBubbleController()->scroll_bubble_controller_ + ? GetBubbleController() + ->scroll_bubble_controller_->scroll_view_ + ->GetBoundsInScreen() + : gfx::Rect(-kMenuViewBoundsBuffer, -kMenuViewBoundsBuffer); + } + private: DISALLOW_COPY_AND_ASSIGN(AutoclickMenuBubbleControllerTest); }; @@ -96,6 +122,8 @@ mojom::AutoclickEventType::kDoubleClick}, {AutoclickMenuView::ButtonId::kDragAndDrop, mojom::AutoclickEventType::kDragAndDrop}, + {AutoclickMenuView::ButtonId::kScroll, + mojom::AutoclickEventType::kScroll}, {AutoclickMenuView::ButtonId::kPause, mojom::AutoclickEventType::kNoAction}, }; @@ -128,12 +156,13 @@ {mojom::AutoclickEventType::kLeftClick}, {mojom::AutoclickEventType::kDoubleClick}, {mojom::AutoclickEventType::kDragAndDrop}, + {mojom::AutoclickEventType::kScroll}, }; for (const auto& test : kTestCases) { controller->SetAutoclickEventType(test.event_type); - // First tap pauses + // First tap pauses. pause_button->OnGestureEvent(&event); EXPECT_EQ(mojom::AutoclickEventType::kNoAction, controller->GetAutoclickEventType()); @@ -212,4 +241,74 @@ kMenuViewBoundsBuffer); } +TEST_F(AutoclickMenuBubbleControllerTest, ScrollBubbleShowsAndCloses) { + AccessibilityController* controller = + Shell::Get()->accessibility_controller(); + controller->SetAutoclickEventType(mojom::AutoclickEventType::kLeftClick); + // No scroll view yet. + EXPECT_FALSE(GetScrollView()); + + // Scroll type should cause the scroll view to be shown. + controller->SetAutoclickEventType(mojom::AutoclickEventType::kScroll); + EXPECT_TRUE(GetScrollView()); + + // Clicking the scroll close button resets to left click. + views::View* close_button = + GetScrollButton(AutoclickScrollView::ButtonId::kCloseScroll); + ui::GestureEvent event = CreateTapEvent(); + close_button->OnGestureEvent(&event); + EXPECT_FALSE(GetScrollView()); + EXPECT_EQ(mojom::AutoclickEventType::kLeftClick, + controller->GetAutoclickEventType()); +} + +TEST_F(AutoclickMenuBubbleControllerTest, ScrollBubblePositioning) { + AccessibilityController* controller = + Shell::Get()->accessibility_controller(); + controller->SetAutoclickEventType(mojom::AutoclickEventType::kScroll); + + const struct { bool is_RTL; } kTestCases[] = {{true}, {false}}; + for (auto& test : kTestCases) { + // These positions should be relative to the corners of the screen + // whether we are in RTL or LTR. + base::i18n::SetRTLForTesting(test.is_RTL); + + // When the menu is in the top right, the scroll view should be directly + // under it and along the right side of the screen. + controller->SetAutoclickMenuPosition( + mojom::AutoclickMenuPosition::kTopRight); + EXPECT_LT(GetScrollViewBounds().ManhattanDistanceToPoint( + GetMenuViewBounds().bottom_center()), + kMenuViewBoundsBuffer); + EXPECT_EQ(GetScrollViewBounds().right(), GetMenuViewBounds().right()); + + // When the menu is in the bottom right, the scroll view is directly above + // it and along the right side of the screen. + controller->SetAutoclickMenuPosition( + mojom::AutoclickMenuPosition::kBottomRight); + EXPECT_LT(GetScrollViewBounds().ManhattanDistanceToPoint( + GetMenuViewBounds().top_center()), + kMenuViewBoundsBuffer); + EXPECT_EQ(GetScrollViewBounds().right(), GetMenuViewBounds().right()); + + // When the menu is on the bottom left, the scroll view is directly above it + // and along the left side of the screen. + controller->SetAutoclickMenuPosition( + mojom::AutoclickMenuPosition::kBottomLeft); + EXPECT_LT(GetScrollViewBounds().ManhattanDistanceToPoint( + GetMenuViewBounds().top_center()), + kMenuViewBoundsBuffer); + EXPECT_EQ(GetScrollViewBounds().x(), GetMenuViewBounds().x()); + + // When the menu is on the top left, the scroll view is directly below it + // and along the left side of the screen. + controller->SetAutoclickMenuPosition( + mojom::AutoclickMenuPosition::kTopLeft); + EXPECT_LT(GetScrollViewBounds().ManhattanDistanceToPoint( + GetMenuViewBounds().bottom_center()), + kMenuViewBoundsBuffer); + EXPECT_EQ(GetScrollViewBounds().x(), GetMenuViewBounds().x()); + } +} + } // namespace ash
diff --git a/ash/system/accessibility/autoclick_scroll_bubble_controller.cc b/ash/system/accessibility/autoclick_scroll_bubble_controller.cc new file mode 100644 index 0000000..1fd3cec --- /dev/null +++ b/ash/system/accessibility/autoclick_scroll_bubble_controller.cc
@@ -0,0 +1,139 @@ +// Copyright 2019 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 "ash/system/accessibility/autoclick_scroll_bubble_controller.h" + +#include "ash/public/cpp/app_list/app_list_features.h" +#include "ash/public/cpp/shell_window_ids.h" +#include "ash/shelf/shelf.h" +#include "ash/shell.h" +#include "ash/system/tray/tray_background_view.h" +#include "ash/system/tray/tray_constants.h" +#include "ash/system/unified/unified_system_tray_view.h" +#include "ash/wm/collision_detection/collision_detection_utils.h" +#include "ash/wm/work_area_insets.h" +#include "ash/wm/workspace/workspace_layout_manager.h" +#include "ash/wm/workspace_controller.h" +#include "ui/aura/window_tree_host.h" +#include "ui/events/event_utils.h" + +namespace ash { + +namespace { +// Autoclick scroll menu constants. +int kAutoclickScrollMenuSizeDips = 250; +} // namespace + +AutoclickScrollBubbleController::AutoclickScrollBubbleController() {} + +AutoclickScrollBubbleController::~AutoclickScrollBubbleController() { + if (bubble_widget_ && !bubble_widget_->IsClosed()) + bubble_widget_->CloseNow(); +} + +void AutoclickScrollBubbleController::UpdateAnchorRect( + gfx::Rect rect, + views::BubbleBorder::Arrow alignment) { + bubble_view_->SetArrow(alignment); + bubble_view_->UpdateAnchorRect(rect); +} + +void AutoclickScrollBubbleController::ShowBubble( + gfx::Rect anchor_rect, + views::BubbleBorder::Arrow alignment) { + // Ignore if bubble widget already exists. + if (bubble_widget_) + return; + + DCHECK(!bubble_view_); + + TrayBubbleView::InitParams init_params; + init_params.delegate = this; + // Anchor within the overlay container. + init_params.parent_window = Shell::GetContainer( + Shell::GetPrimaryRootWindow(), kShellWindowId_AutoclickContainer); + init_params.anchor_mode = TrayBubbleView::AnchorMode::kRect; + init_params.anchor_rect = anchor_rect; + init_params.insets = gfx::Insets(kUnifiedMenuPadding, kUnifiedMenuPadding, + kUnifiedMenuPadding, kUnifiedMenuPadding); + init_params.min_width = kAutoclickScrollMenuSizeDips; + init_params.max_width = kAutoclickScrollMenuSizeDips; + init_params.max_height = kAutoclickScrollMenuSizeDips; + init_params.corner_radius = kUnifiedTrayCornerRadius; + init_params.has_shadow = false; + bubble_view_ = new AutoclickScrollBubbleView(init_params); + bubble_view_->SetArrow(alignment); + + scroll_view_ = new AutoclickScrollView(); + scroll_view_->SetBackground(UnifiedSystemTrayView::CreateBackground()); + scroll_view_->SetBorder( + views::CreateEmptyBorder(kUnifiedTopShortcutSpacing, 0, 0, 0)); + bubble_view_->AddChildView(scroll_view_); + bubble_view_->set_color(SK_ColorTRANSPARENT); + bubble_view_->layer()->SetFillsBoundsOpaquely(false); + + bubble_widget_ = views::BubbleDialogDelegateView::CreateBubble(bubble_view_); + TrayBackgroundView::InitializeBubbleAnimations(bubble_widget_); + CollisionDetectionUtils::MarkWindowPriorityForCollisionDetection( + bubble_widget_->GetNativeWindow(), + CollisionDetectionUtils::RelativePriority::kAutomaticClicksMenu); + bubble_view_->InitializeAndShowBubble(); + + if (app_list_features::IsBackgroundBlurEnabled()) { + bubble_widget_->client_view()->layer()->SetBackgroundBlur( + kUnifiedMenuBackgroundBlur); + } +} + +void AutoclickScrollBubbleController::CloseBubble() { + if (!bubble_widget_ || bubble_widget_->IsClosed()) + return; + bubble_widget_->Close(); +} + +void AutoclickScrollBubbleController::SetBubbleVisibility(bool is_visible) { + if (!bubble_widget_) + return; + + if (is_visible) + bubble_widget_->Show(); + else + bubble_widget_->Hide(); +} + +void AutoclickScrollBubbleController::ClickOnBubble(gfx::Point location_in_dips, + int mouse_event_flags) { + if (!bubble_widget_) + return; + + // Change the event location bounds to be relative to the menu bubble. + location_in_dips -= bubble_view_->GetBoundsInScreen().OffsetFromOrigin(); + + // Generate synthesized mouse events for the click. + const ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, location_in_dips, + location_in_dips, ui::EventTimeForNow(), + mouse_event_flags | ui::EF_LEFT_MOUSE_BUTTON, + ui::EF_LEFT_MOUSE_BUTTON); + const ui::MouseEvent release_event( + ui::ET_MOUSE_RELEASED, location_in_dips, location_in_dips, + ui::EventTimeForNow(), mouse_event_flags | ui::EF_LEFT_MOUSE_BUTTON, + ui::EF_LEFT_MOUSE_BUTTON); + + // Send the press/release events to the widget's root view for processing. + bubble_widget_->GetRootView()->OnMousePressed(press_event); + bubble_widget_->GetRootView()->OnMouseReleased(release_event); +} + +bool AutoclickScrollBubbleController::ContainsPointInScreen( + const gfx::Point& point) { + return bubble_view_ && bubble_view_->GetBoundsInScreen().Contains(point); +} + +void AutoclickScrollBubbleController::BubbleViewDestroyed() { + bubble_view_ = nullptr; + bubble_widget_ = nullptr; + scroll_view_ = nullptr; +} + +} // namespace ash
diff --git a/ash/system/accessibility/autoclick_scroll_bubble_controller.h b/ash/system/accessibility/autoclick_scroll_bubble_controller.h new file mode 100644 index 0000000..0aa6108 --- /dev/null +++ b/ash/system/accessibility/autoclick_scroll_bubble_controller.h
@@ -0,0 +1,53 @@ +// Copyright 2019 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 ASH_SYSTEM_ACCESSIBILITY_AUTOCLICK_SCROLL_BUBBLE_CONTROLLER_H_ +#define ASH_SYSTEM_ACCESSIBILITY_AUTOCLICK_SCROLL_BUBBLE_CONTROLLER_H_ + +#include "ash/public/cpp/ash_constants.h" +#include "ash/system/accessibility/autoclick_scroll_view.h" +#include "ash/system/tray/tray_bubble_view.h" +#include "ui/views/bubble/bubble_border.h" + +namespace ash { + +// Manages the bubble which contains an AutoclickScrollView. +class AutoclickScrollBubbleController : public TrayBubbleView::Delegate { + public: + AutoclickScrollBubbleController(); + ~AutoclickScrollBubbleController() override; + + void UpdateAnchorRect(gfx::Rect rect, views::BubbleBorder::Arrow alignment); + + void ShowBubble(gfx::Rect anchor_rect, views::BubbleBorder::Arrow alignment); + void CloseBubble(); + + // Shows or hides the bubble. + void SetBubbleVisibility(bool is_visible); + + // Performs the mouse events on the bubble. at the given location in DIPs. + void ClickOnBubble(gfx::Point location_in_dips, int mouse_event_flags); + + // Whether the tray button or the bubble, if the bubble exists, contain + // the given screen point. + bool ContainsPointInScreen(const gfx::Point& point); + + // TrayBubbleView::Delegate: + void BubbleViewDestroyed() override; + + private: + friend class AutoclickMenuBubbleControllerTest; + friend class AutoclickTest; + + // Owned by views hierarchy. + AutoclickScrollBubbleView* bubble_view_ = nullptr; + AutoclickScrollView* scroll_view_ = nullptr; + views::Widget* bubble_widget_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(AutoclickScrollBubbleController); +}; + +} // namespace ash + +#endif // ASH_SYSTEM_ACCESSIBILITY_AUTOCLICK_SCROLL_BUBBLE_CONTROLLER_H_
diff --git a/ash/system/accessibility/autoclick_scroll_view.cc b/ash/system/accessibility/autoclick_scroll_view.cc new file mode 100644 index 0000000..5e2b96f --- /dev/null +++ b/ash/system/accessibility/autoclick_scroll_view.cc
@@ -0,0 +1,165 @@ +// Copyright 2019 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 "ash/system/accessibility/autoclick_scroll_view.h" + +#include "ash/autoclick/autoclick_controller.h" +#include "ash/shell.h" +#include "ash/strings/grit/ash_strings.h" +#include "ash/system/unified/top_shortcut_button.h" +#include "base/timer/timer.h" +#include "ui/compositor/scoped_layer_animation_settings.h" +#include "ui/views/layout/box_layout.h" + +namespace ash { + +// The close button for the automatic clicks scroll bubble. +class AutoclickScrollCloseButton : public TopShortcutButton, + public views::ButtonListener { + public: + explicit AutoclickScrollCloseButton() + : TopShortcutButton(this, IDS_ASH_AUTOCLICK_SCROLL_CLOSE) { + views::View::SetID( + static_cast<int>(AutoclickScrollView::ButtonId::kCloseScroll)); + EnableCanvasFlippingForRTLUI(false); + SetPreferredSize(gfx::Size(48, 48)); + // TODO(katie): set size and icon when spec is available. + } + + ~AutoclickScrollCloseButton() override = default; + + // views::ButtonListener: + void ButtonPressed(views::Button* sender, const ui::Event& event) override { + Shell::Get()->autoclick_controller()->DoScrollAction( + AutoclickController::ScrollPadAction::kScrollClose); + } + + private: + DISALLOW_COPY_AND_ASSIGN(AutoclickScrollCloseButton); +}; + +// A single scroll button (up/down/left/right) for automatic clicks scroll +// bubble. +// TODO(katie): Implement custom UI instead of TopShortcutButton. +class AutoclickScrollButton : public TopShortcutButton, + public views::ButtonListener { + public: + AutoclickScrollButton(AutoclickController::ScrollPadAction action, + int accessible_name_id, + AutoclickScrollView::ButtonId id) + : TopShortcutButton(this, accessible_name_id), action_(action) { + views::View::SetID(static_cast<int>(id)); + // Disable canvas flipping, as scroll left should always be left no matter + // the language orientation. + EnableCanvasFlippingForRTLUI(false); + scroll_hover_timer_ = std::make_unique<base::RetainingOneShotTimer>( + FROM_HERE, + base::TimeDelta::FromMilliseconds( + int64_t{AutoclickScrollView::kAutoclickScrollDelayMs}), + base::BindRepeating(&AutoclickScrollButton::DoScrollAction, + base::Unretained(this))); + } + + ~AutoclickScrollButton() override { + Shell::Get()->autoclick_controller()->OnExitedScrollButton(); + } + + void ProcessAction(AutoclickController::ScrollPadAction action) { + Shell::Get()->autoclick_controller()->DoScrollAction(action); + // TODO(katie): Log UMA for scroll user action. + } + + void DoScrollAction() { + ProcessAction(action_); + // Reset the timer to continue to do the action as long as we are hovering. + scroll_hover_timer_->Reset(); + } + + // views::ButtonListener: + void ButtonPressed(views::Button* sender, const ui::Event& event) override { + ProcessAction(action_); + } + + // views::View: + void OnMouseEntered(const ui::MouseEvent& event) override { + // For the four scroll buttons, set the button to a hovered/active state + // when this happens. Also tell something (autoclick controller? autoclick + // scroll controller?) to start the timer that will cause a lot of scrolls + // to occur, "clicking" on itself multiple times or otherwise. + scroll_hover_timer_->Reset(); + Shell::Get()->autoclick_controller()->OnEnteredScrollButton(); + } + + // TODO(katie): Determine if this is reliable enough, or if it might not fire + // in some cases. + void OnMouseExited(const ui::MouseEvent& event) override { + // For the four scroll buttons, unset the hover state when this happens. + if (scroll_hover_timer_->IsRunning()) + scroll_hover_timer_->Stop(); + + // Allow the Autoclick timer and widget to restart. + Shell::Get()->autoclick_controller()->OnExitedScrollButton(); + } + + private: + const AutoclickController::ScrollPadAction action_; + std::unique_ptr<base::RetainingOneShotTimer> scroll_hover_timer_; + + DISALLOW_COPY_AND_ASSIGN(AutoclickScrollButton); +}; + +// ------ AutoclickScrollBubbleView ------ // + +AutoclickScrollBubbleView::AutoclickScrollBubbleView( + TrayBubbleView::InitParams init_params) + : TrayBubbleView(init_params) {} + +AutoclickScrollBubbleView::~AutoclickScrollBubbleView() {} + +void AutoclickScrollBubbleView::UpdateAnchorRect(const gfx::Rect& rect) { + ui::ScopedLayerAnimationSettings settings( + GetWidget()->GetLayer()->GetAnimator()); + settings.SetPreemptionStrategy( + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); + SetAnchorRect(rect); +} + +bool AutoclickScrollBubbleView::IsAnchoredToStatusArea() const { + return false; +} + +const char* AutoclickScrollBubbleView::GetClassName() const { + return "AutoclickScrollBubbleView"; +} + +// ------ AutoclickScrollView ------ // + +AutoclickScrollView::AutoclickScrollView() { + AutoclickScrollButton* scroll_up_button = new AutoclickScrollButton( + AutoclickController::ScrollPadAction::kScrollUp, + IDS_ASH_AUTOCLICK_SCROLL_UP, ButtonId::kScrollUp); + + AutoclickScrollButton* scroll_down_button = new AutoclickScrollButton( + AutoclickController::ScrollPadAction::kScrollDown, + IDS_ASH_AUTOCLICK_SCROLL_DOWN, ButtonId::kScrollDown); + AutoclickScrollButton* scroll_left_button = new AutoclickScrollButton( + AutoclickController::ScrollPadAction::kScrollLeft, + IDS_ASH_AUTOCLICK_SCROLL_LEFT, ButtonId::kScrollLeft); + AutoclickScrollButton* scroll_right_button = new AutoclickScrollButton( + AutoclickController::ScrollPadAction::kScrollRight, + IDS_ASH_AUTOCLICK_SCROLL_RIGHT, ButtonId::kScrollRight); + AutoclickScrollCloseButton* close_scroll_button = + new AutoclickScrollCloseButton(); + // TODO(katie): Layout to match spec. + auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>( + views::BoxLayout::kHorizontal, gfx::Insets(), 0)); + layout->set_cross_axis_alignment(views::BoxLayout::CrossAxisAlignment::kEnd); + AddChildView(scroll_up_button); + AddChildView(scroll_down_button); + AddChildView(scroll_left_button); + AddChildView(scroll_right_button); + AddChildView(close_scroll_button); +} + +} // namespace ash
diff --git a/ash/system/accessibility/autoclick_scroll_view.h b/ash/system/accessibility/autoclick_scroll_view.h new file mode 100644 index 0000000..62a4a60 --- /dev/null +++ b/ash/system/accessibility/autoclick_scroll_view.h
@@ -0,0 +1,61 @@ +// Copyright 2019 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 ASH_SYSTEM_ACCESSIBILITY_AUTOCLICK_SCROLL_VIEW_H_ +#define ASH_SYSTEM_ACCESSIBILITY_AUTOCLICK_SCROLL_VIEW_H_ + +#include "ash/autoclick/autoclick_controller.h" +#include "ash/system/tray/tray_bubble_view.h" +#include "ui/views/controls/button/button.h" + +namespace ash { + +// View for the Automatic Clicks scroll bubble, which holds the Automatic Clicks +// scroll menu. +class AutoclickScrollBubbleView : public TrayBubbleView { + public: + explicit AutoclickScrollBubbleView(TrayBubbleView::InitParams init_params); + ~AutoclickScrollBubbleView() override; + + void UpdateAnchorRect(const gfx::Rect& rect); + + // TrayBubbleView: + bool IsAnchoredToStatusArea() const override; + + // views::View: + const char* GetClassName() const override; + + private: + DISALLOW_COPY_AND_ASSIGN(AutoclickScrollBubbleView); +}; + +// View for the Automatic Clicks scroll menu, which creates and manages +// individual buttons to control Automatic Clicks scrolling. +class AutoclickScrollView : public views::View { + public: + // Used for testing. Start at 1 because a view IDs should not be 0. + enum class ButtonId { + kScrollUp = 1, + kScrollDown, + kScrollLeft, + kScrollRight, + kCloseScroll, + }; + + // The amount of time to wait during a hover over a scroll pad button before + // requesting that Autoclick Controller perform a scroll. Decreasing this + // below about 100 causes a smooth scroll due to the amount of time scroll + // animation takes. Visible for tests. + const static int kAutoclickScrollDelayMs = 250; + + AutoclickScrollView(); + ~AutoclickScrollView() override = default; + + private: + DISALLOW_COPY_AND_ASSIGN(AutoclickScrollView); +}; + +} // namespace ash + +#endif // ASH_SYSTEM_ACCESSIBILITY_AUTOCLICK_SCROLL_VIEW_H_
diff --git a/ash/system/night_light/night_light_controller_unittest.cc b/ash/system/night_light/night_light_controller_unittest.cc index d425c49b..16e5b43 100644 --- a/ash/system/night_light/night_light_controller_unittest.cc +++ b/ash/system/night_light/night_light_controller_unittest.cc
@@ -886,7 +886,7 @@ } void TearDown() override { - // DisplayChangeObserver access InputDeviceManager in its destructor, so + // DisplayChangeObserver access DeviceDataManager in its destructor, so // destroy it first. display_change_observer_ = nullptr; NightLightTest::TearDown();
diff --git a/ash/system/palette/palette_tray.cc b/ash/system/palette/palette_tray.cc index f1998614b..4211274ef 100644 --- a/ash/system/palette/palette_tray.cc +++ b/ash/system/palette/palette_tray.cc
@@ -37,7 +37,7 @@ #include "ui/base/resource/resource_bundle.h" #include "ui/display/display.h" #include "ui/display/screen.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/stylus_state.h" #include "ui/events/event_constants.h" #include "ui/gfx/color_palette.h" @@ -204,7 +204,7 @@ if (bubble_) bubble_->bubble_view()->ResetDelegate(); - ui::InputDeviceManager::GetInstance()->RemoveObserver(this); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); Shell::Get()->RemoveShellObserver(this); } @@ -435,7 +435,7 @@ void PaletteTray::Initialize() { TrayBackgroundView::Initialize(); - ui::InputDeviceManager::GetInstance()->AddObserver(this); + ui::DeviceDataManager::GetInstance()->AddObserver(this); } bool PaletteTray::PerformAction(const ui::Event& event) {
diff --git a/ash/system/palette/tools/metalayer_unittest.cc b/ash/system/palette/tools/metalayer_unittest.cc index f55e501..1e2b7c3 100644 --- a/ash/system/palette/tools/metalayer_unittest.cc +++ b/ash/system/palette/tools/metalayer_unittest.cc
@@ -68,8 +68,7 @@ mojom::VoiceInteractionState::RUNNING}; const mojom::AssistantAllowedState kAllowedStates[] = { mojom::AssistantAllowedState::ALLOWED, - mojom::AssistantAllowedState::DISALLOWED_BY_ARC_DISALLOWED, - mojom::AssistantAllowedState::DISALLOWED_BY_ARC_POLICY, + mojom::AssistantAllowedState::DISALLOWED_BY_POLICY, mojom::AssistantAllowedState::DISALLOWED_BY_LOCALE, mojom::AssistantAllowedState::DISALLOWED_BY_FLAG, mojom::AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER,
diff --git a/ash/system/power/backlights_forced_off_setter_unittest.cc b/ash/system/power/backlights_forced_off_setter_unittest.cc index fcf7537..9bcc7d0 100644 --- a/ash/system/power/backlights_forced_off_setter_unittest.cc +++ b/ash/system/power/backlights_forced_off_setter_unittest.cc
@@ -234,7 +234,7 @@ touch_device_transform.device_id = internal_touchdevice.id; transforms.push_back(touch_device_transform); - // Initialize the transforms and the InputDeviceManager. + // Initialize the transforms and the DeviceDataManager. display::test::TouchTransformControllerTestApi( ash::Shell::Get()->touch_transformer_controller()) .touch_transform_setter() @@ -273,7 +273,7 @@ touch_device_transform.device_id = internal_touchdevice.id; transforms.push_back(touch_device_transform); - // Initialize the transforms and the InputDeviceManager. + // Initialize the transforms and the DeviceDataManager. display::test::TouchTransformControllerTestApi( ash::Shell::Get()->touch_transformer_controller()) .touch_transform_setter()
diff --git a/ash/system/power/peripheral_battery_notifier.cc b/ash/system/power/peripheral_battery_notifier.cc index b9db95d..3024b10 100644 --- a/ash/system/power/peripheral_battery_notifier.cc +++ b/ash/system/power/peripheral_battery_notifier.cc
@@ -22,7 +22,7 @@ #include "third_party/re2/src/re2/re2.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/touchscreen_device.h" #include "ui/gfx/image/image.h" #include "ui/message_center/message_center.h" @@ -107,7 +107,7 @@ bool IsStylusDevice(const std::string& path, const std::string& model_name) { std::string identifier = ExtractIdentifier(path); for (const ui::TouchscreenDevice& device : - ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices()) { + ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices()) { if (device.has_stylus && (device.name == model_name || device.name.find(model_name) != std::string::npos) &&
diff --git a/ash/system/power/power_button_controller.cc b/ash/system/power/power_button_controller.cc index 6bcda10..302a24c 100644 --- a/ash/system/power/power_button_controller.cc +++ b/ash/system/power/power_button_controller.cc
@@ -9,6 +9,9 @@ #include <utility> #include "ash/accelerators/accelerator_controller_impl.h" +#include "ash/display/window_tree_host_manager.h" +#include "ash/home_screen/home_screen_controller.h" +#include "ash/kiosk_next/kiosk_next_shell_controller_impl.h" #include "ash/public/cpp/ash_switches.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/session/session_controller_impl.h" @@ -84,6 +87,15 @@ return menu_widget; } +bool ShouldGoHomeOnScreenOn() { + return Shell::Get()->kiosk_next_shell_controller()->IsEnabled(); +} + +void GoHome() { + int64_t primary_display_id = WindowTreeHostManager::GetPrimaryDisplayId(); + Shell::Get()->home_screen_controller()->GoHome(primary_display_id); +} + } // namespace constexpr base::TimeDelta PowerButtonController::kScreenStateChangeDelay; @@ -259,6 +271,10 @@ (menu_shown_when_power_button_down_ && pre_shutdown_timer_was_running)) { display_controller_->SetBacklightsForcedOff(true); + + if (ShouldGoHomeOnScreenOn()) + GoHome(); + LockScreenIfRequired(); } }
diff --git a/ash/system/power/power_button_controller_unittest.cc b/ash/system/power/power_button_controller_unittest.cc index 48c732a7..eb693deb 100644 --- a/ash/system/power/power_button_controller_unittest.cc +++ b/ash/system/power/power_button_controller_unittest.cc
@@ -8,7 +8,11 @@ #include "ash/accessibility/test_accessibility_controller_client.h" #include "ash/display/screen_orientation_controller.h" #include "ash/display/screen_orientation_controller_test_api.h" +#include "ash/kiosk_next/kiosk_next_shell_controller_impl.h" +#include "ash/kiosk_next/kiosk_next_shell_test_util.h" +#include "ash/kiosk_next/mock_kiosk_next_shell_client.h" #include "ash/media/media_controller_impl.h" +#include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_switches.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" @@ -24,11 +28,13 @@ #include "ash/wm/window_util.h" #include "base/command_line.h" #include "base/json/json_writer.h" +#include "base/macros.h" #include "base/run_loop.h" #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_tick_clock.h" #include "chromeos/dbus/power/fake_power_manager_client.h" #include "chromeos/dbus/power_manager/suspend.pb.h" +#include "ui/aura/window.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/display/test/display_manager_test_api.h" #include "ui/events/event.h" @@ -1402,4 +1408,72 @@ PowerButtonPosition::TOP, PowerButtonPosition::BOTTOM)); +class KioskNextPowerButtonTest : public PowerButtonControllerTest { + public: + KioskNextPowerButtonTest() { + scoped_feature_list_.InitAndEnableFeature(features::kKioskNextShell); + } + + void SetUp() override { + set_start_session(false); + PowerButtonControllerTest::SetUp(); + client_ = std::make_unique<MockKioskNextShellClient>(); + } + + void TearDown() override { + client_.reset(); + home_screen_window_.reset(); + PowerButtonControllerTest::TearDown(); + } + + void SetUpHomeWindow() { + home_screen_window_ = CreateTestWindow(); + home_screen_window_->set_owned_by_parent(false); + Shell::GetContainer(Shell::GetPrimaryRootWindow(), + kShellWindowId_HomeScreenContainer) + ->AddChild(home_screen_window_.get()); + + wm::ActivateWindow(home_screen_window_.get()); + } + + protected: + std::unique_ptr<aura::Window> home_screen_window_; + std::unique_ptr<MockKioskNextShellClient> client_; + base::test::ScopedFeatureList scoped_feature_list_; + + DISALLOW_COPY_AND_ASSIGN(KioskNextPowerButtonTest); +}; + +TEST_F(KioskNextPowerButtonTest, FocusKioskNextHome) { + LogInKioskNextUser(GetSessionControllerClient()); + SetUpHomeWindow(); + EXPECT_TRUE(home_screen_window_->HasFocus()); + + std::unique_ptr<aura::Window> window = CreateTestWindow(); + wm::ActivateWindow(window.get()); + EXPECT_FALSE(home_screen_window_->HasFocus()); + + PressPowerButton(); + ReleasePowerButton(); + EXPECT_TRUE(home_screen_window_->HasFocus()); +} + +TEST_F(KioskNextPowerButtonTest, KioskNextHomeNotFocusedWhenPowerMenuShown) { + LogInKioskNextUser(GetSessionControllerClient()); + SetUpHomeWindow(); + std::unique_ptr<aura::Window> window = CreateTestWindow(); + wm::ActivateWindow(window.get()); + + EXPECT_TRUE(window->HasFocus()); + EXPECT_FALSE(home_screen_window_->HasFocus()); + + OpenPowerButtonMenu(); + EXPECT_FALSE(window->HasFocus()); + EXPECT_FALSE(home_screen_window_->HasFocus()); + TapToDismissPowerButtonMenu(); + + EXPECT_TRUE(window->HasFocus()); + EXPECT_FALSE(home_screen_window_->HasFocus()); +} + } // namespace ash
diff --git a/ash/system/power/power_button_display_controller.cc b/ash/system/power/power_button_display_controller.cc index 513d008..594de01 100644 --- a/ash/system/power/power_button_display_controller.cc +++ b/ash/system/power/power_button_display_controller.cc
@@ -11,7 +11,7 @@ #include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "base/time/tick_clock.h" #include "chromeos/dbus/power/power_policy_controller.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/stylus_state.h" #include "ui/events/event.h" @@ -37,7 +37,7 @@ tick_clock_(tick_clock), weak_ptr_factory_(this) { chromeos::PowerManagerClient::Get()->AddObserver(this); - ui::InputDeviceManager::GetInstance()->AddObserver(this); + ui::DeviceDataManager::GetInstance()->AddObserver(this); Shell::Get()->AddPreTargetHandler(this, ui::EventTarget::Priority::kSystem); backlights_forced_off_observer_.Add(backlights_forced_off_setter_); @@ -45,7 +45,7 @@ PowerButtonDisplayController::~PowerButtonDisplayController() { Shell::Get()->RemovePreTargetHandler(this); - ui::InputDeviceManager::GetInstance()->RemoveObserver(this); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); chromeos::PowerManagerClient::Get()->RemoveObserver(this); }
diff --git a/ash/tray_action/tray_action.cc b/ash/tray_action/tray_action.cc index bb8c7f9..e82c3e6 100644 --- a/ash/tray_action/tray_action.cc +++ b/ash/tray_action/tray_action.cc
@@ -11,7 +11,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/logging.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/stylus_state.h" namespace ash { @@ -19,7 +19,7 @@ TrayAction::TrayAction(BacklightsForcedOffSetter* backlights_forced_off_setter) : backlights_forced_off_setter_(backlights_forced_off_setter), stylus_observer_(this) { - stylus_observer_.Add(ui::InputDeviceManager::GetInstance()); + stylus_observer_.Add(ui::DeviceDataManager::GetInstance()); } TrayAction::~TrayAction() = default;
diff --git a/ash/tray_action/tray_action.h b/ash/tray_action/tray_action.h index 28e8986f..b1f6c181 100644 --- a/ash/tray_action/tray_action.h +++ b/ash/tray_action/tray_action.h
@@ -16,7 +16,7 @@ #include "ui/events/devices/input_device_event_observer.h" namespace ui { -class InputDeviceManager; +class DeviceDataManager; enum class StylusState; } // namespace ui @@ -97,7 +97,7 @@ mojom::TrayActionClientPtr tray_action_client_; - ScopedObserver<ui::InputDeviceManager, ui::InputDeviceEventObserver> + ScopedObserver<ui::DeviceDataManager, ui::InputDeviceEventObserver> stylus_observer_; DISALLOW_COPY_AND_ASSIGN(TrayAction);
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc index 72cadb99..6a7d8ea 100644 --- a/ash/wm/splitview/split_view_controller.cc +++ b/ash/wm/splitview/split_view_controller.cc
@@ -1896,15 +1896,6 @@ // |desired_snap_position| in overview. SnapWindow(window, desired_snap_position, /*use_divider_spawn_animation=*/!initiator_window); - // Reapply the bounds update because the bounds might have been - // modified by dragging operation. - // TODO(oshima): WindowState already gets notified when drag ends. Refactor - // WindowState so that each state implementation can take action when - // drag ends. - const wm::WMEvent event(desired_snap_position == SplitViewController::LEFT - ? wm::WM_EVENT_SNAP_LEFT - : wm::WM_EVENT_SNAP_RIGHT); - wm::GetWindowState(window)->OnWMEvent(&event); if (!was_splitview_active) { // If splitview mode was not active before snapping the dragged
diff --git a/ash/wm/tablet_mode/internal_input_devices_event_blocker.cc b/ash/wm/tablet_mode/internal_input_devices_event_blocker.cc index c787d75d..76164708 100644 --- a/ash/wm/tablet_mode/internal_input_devices_event_blocker.cc +++ b/ash/wm/tablet_mode/internal_input_devices_event_blocker.cc
@@ -7,8 +7,8 @@ #include "ash/shell.h" #include "ash/shell_delegate.h" #include "ash/touch/touch_devices_controller.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/input_device.h" -#include "ui/events/devices/input_device_manager.h" #include "ui/events/keycodes/dom/dom_code.h" #include "ui/ozone/public/input_controller.h" #include "ui/ozone/public/ozone_platform.h" @@ -16,11 +16,11 @@ namespace ash { InternalInputDevicesEventBlocker::InternalInputDevicesEventBlocker() { - ui::InputDeviceManager::GetInstance()->AddObserver(this); + ui::DeviceDataManager::GetInstance()->AddObserver(this); } InternalInputDevicesEventBlocker::~InternalInputDevicesEventBlocker() { - ui::InputDeviceManager::GetInstance()->RemoveObserver(this); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); if (should_be_blocked_) UpdateInternalInputDevices(/*should_block=*/false); } @@ -45,7 +45,7 @@ bool InternalInputDevicesEventBlocker::HasInternalTouchpad() { for (const ui::InputDevice& touchpad : - ui::InputDeviceManager::GetInstance()->GetTouchpadDevices()) { + ui::DeviceDataManager::GetInstance()->GetTouchpadDevices()) { if (touchpad.type == ui::INPUT_DEVICE_INTERNAL) return true; } @@ -54,7 +54,7 @@ bool InternalInputDevicesEventBlocker::HasInternalKeyboard() { for (const ui::InputDevice& keyboard : - ui::InputDeviceManager::GetInstance()->GetKeyboardDevices()) { + ui::DeviceDataManager::GetInstance()->GetKeyboardDevices()) { if (keyboard.type == ui::INPUT_DEVICE_INTERNAL) return true; }
diff --git a/ash/wm/tablet_mode/tablet_mode_controller.cc b/ash/wm/tablet_mode/tablet_mode_controller.cc index 76639c2..4c863ff 100644 --- a/ash/wm/tablet_mode/tablet_mode_controller.cc +++ b/ash/wm/tablet_mode/tablet_mode_controller.cc
@@ -38,8 +38,8 @@ #include "ui/compositor/layer_animation_sequence.h" #include "ui/display/display.h" #include "ui/display/manager/display_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/input_device.h" -#include "ui/events/devices/input_device_manager.h" #include "ui/events/event.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/gfx/geometry/vector3d_f.h" @@ -216,7 +216,7 @@ if (ShouldInitTabletModeController()) { Shell::Get()->window_tree_host_manager()->AddObserver(this); AccelerometerReader::GetInstance()->AddObserver(this); - ui::InputDeviceManager::GetInstance()->AddObserver(this); + ui::DeviceDataManager::GetInstance()->AddObserver(this); bluetooth_devices_observer_ = std::make_unique<BluetoothDevicesObserver>(base::BindRepeating( &TabletModeController::OnBluetoothAdapterOrDeviceChanged, @@ -252,7 +252,7 @@ if (ShouldInitTabletModeController()) { Shell::Get()->window_tree_host_manager()->RemoveObserver(this); AccelerometerReader::GetInstance()->RemoveObserver(this); - ui::InputDeviceManager::GetInstance()->RemoveObserver(this); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); } chromeos::PowerManagerClient::Get()->RemoveObserver(this); @@ -555,7 +555,7 @@ // input devices may be removed during suspend and cause the device enter/exit // tablet mode unexpectedly. if (ShouldInitTabletModeController()) { - ui::InputDeviceManager::GetInstance()->RemoveObserver(this); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); bluetooth_devices_observer_.reset(); } } @@ -570,10 +570,10 @@ std::make_unique<BluetoothDevicesObserver>(base::BindRepeating( &TabletModeController::OnBluetoothAdapterOrDeviceChanged, base::Unretained(this))); - ui::InputDeviceManager::GetInstance()->AddObserver(this); + ui::DeviceDataManager::GetInstance()->AddObserver(this); // Call HandlePointingDeviceAddedOrRemoved() to iterate all available input // devices just in case we have missed all the notifications from - // InputDeviceManager and BluetoothDevicesObserver when SuspendDone() is + // DeviceDataManager and BluetoothDevicesObserver when SuspendDone() is // called. HandlePointingDeviceAddedOrRemoved(); } @@ -809,7 +809,7 @@ bool has_external_pointing_device = false; // Check if there is an external mouse device. for (const ui::InputDevice& mouse : - ui::InputDeviceManager::GetInstance()->GetMouseDevices()) { + ui::DeviceDataManager::GetInstance()->GetMouseDevices()) { if (mouse.type == ui::INPUT_DEVICE_USB || (mouse.type == ui::INPUT_DEVICE_BLUETOOTH && bluetooth_devices_observer_->IsConnectedBluetoothDevice(mouse))) { @@ -820,7 +820,7 @@ // Check if there is an external touchpad device. if (!has_external_pointing_device) { for (const ui::InputDevice& touch_pad : - ui::InputDeviceManager::GetInstance()->GetTouchpadDevices()) { + ui::DeviceDataManager::GetInstance()->GetTouchpadDevices()) { if (touch_pad.type == ui::INPUT_DEVICE_USB || (touch_pad.type == ui::INPUT_DEVICE_BLUETOOTH && bluetooth_devices_observer_->IsConnectedBluetoothDevice(
diff --git a/ash/wm/window_cycle_list.cc b/ash/wm/window_cycle_list.cc index efbb5dd..8c75c47 100644 --- a/ash/wm/window_cycle_list.cc +++ b/ash/wm/window_cycle_list.cc
@@ -15,6 +15,7 @@ #include "ash/wm/window_preview_view.h" #include "ash/wm/window_state.h" #include "ash/wm/window_util.h" +#include "base/numerics/ranges.h" #include "ui/accessibility/ax_node_data.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/window.h" @@ -59,6 +60,14 @@ // The font delta of the window title. constexpr int kLabelFontDelta = 2; +// All previews are the same height (this is achieved via a combination of +// scaling and padding). +constexpr int kFixedPreviewHeightDp = 256; + +// The min and max width size are in relation to the fixed height. +constexpr int kMinPreviewWidthDp = kFixedPreviewHeightDp / 2; +constexpr int kMaxPreviewWidthDp = kFixedPreviewHeightDp * 2; + // This background paints a |Painter| but fills the view's layer's size rather // than the view's size. class LayerFillBackgroundPainter : public views::Background { @@ -183,22 +192,18 @@ } private: - // The maximum width of a window preview. - static const int kMaxPreviewWidth = 512; - // All previews are the same height (this is achieved via a combination of - // scaling and padding). - static const int kFixedPreviewHeight = 256; // Returns the size for the mirror view, scaled to fit within the max bounds. // Scaling is always 1:1 and we only scale down, never up. gfx::Size GetMirrorViewScaledSize() const { gfx::Size mirror_pref_size = preview_view_->GetPreferredSize(); - if (mirror_pref_size.width() > kMaxPreviewWidth || - mirror_pref_size.height() > kFixedPreviewHeight) { - float scale = std::min( - kMaxPreviewWidth / static_cast<float>(mirror_pref_size.width()), - kFixedPreviewHeight / static_cast<float>(mirror_pref_size.height())); + if (mirror_pref_size.width() > kMaxPreviewWidthDp || + mirror_pref_size.height() > kFixedPreviewHeightDp) { + const float scale = std::min( + kMaxPreviewWidthDp / static_cast<float>(mirror_pref_size.width()), + kFixedPreviewHeightDp / + static_cast<float>(mirror_pref_size.height())); mirror_pref_size = gfx::ScaleToFlooredSize(mirror_pref_size, scale, scale); } @@ -209,23 +214,19 @@ // Returns the size for the entire preview area (mirror view and additional // padding). All previews will be the same height, so if the mirror view isn't // tall enough we will add top and bottom padding. Previews can range in width - // from kMaxPreviewWidth down to half that value. Again, padding will be added + // from half to double of kFixedPreviewHeightDp. Again, padding will be added // to the sides to achieve this if the preview is too narrow. gfx::Size GetSizeForPreviewArea() const { - gfx::Size mirror_size = GetMirrorViewScaledSize(); - float aspect_ratio = - static_cast<float>(mirror_size.width()) / mirror_size.height(); - gfx::Size preview_size = mirror_size; - // Very narrow windows get vertical bars of padding on the sides. - if (aspect_ratio < 0.5f) - preview_size.set_width(mirror_size.height() / 2); + gfx::Size preview_size = GetMirrorViewScaledSize(); // All previews are the same height (this may add padding on top and // bottom). - preview_size.set_height(kFixedPreviewHeight); - // Previews should never be narrower than half their max width (128dip). - preview_size.set_width( - std::max(preview_size.width(), kMaxPreviewWidth / 2)); + preview_size.set_height(kFixedPreviewHeightDp); + + // Previews should never be narrower than half or wider than double their + // fixed height. + preview_size.set_width(base::ClampToRange( + preview_size.width(), kMinPreviewWidthDp, kMaxPreviewWidthDp)); return preview_size; }
diff --git a/base/profiler/stack_sampler_impl_unittest.cc b/base/profiler/stack_sampler_impl_unittest.cc index 694b783..9884e59c 100644 --- a/base/profiler/stack_sampler_impl_unittest.cc +++ b/base/profiler/stack_sampler_impl_unittest.cc
@@ -596,7 +596,7 @@ module_cache.InjectModuleForTesting(std::make_unique<TestModule>(1u, 1u)); FakeTestUnwinder aux_unwinder( - {{{UnwindResult::UNRECOGNIZED_FRAME, {1u}}, {false}}}); + {{UnwindResult::UNRECOGNIZED_FRAME, {1u}}, false}); FakeTestUnwinder native_unwinder({{UnwindResult::COMPLETED, {2u}}}); std::vector<Frame> stack = StackSamplerImpl::WalkStackForTesting(
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java index a115817..0b4cbd6 100644 --- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java +++ b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java
@@ -157,7 +157,7 @@ return false; } try { - mConnectedCondition.awaitNanos(timeoutNs); + timeoutNs = mConnectedCondition.awaitNanos(timeoutNs); } catch (InterruptedException ie) { Log.e(TAG, "Interrupted while waiting for connection."); }
diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py index 6a0dcbd..4225b57 100755 --- a/build/vs_toolchain.py +++ b/build/vs_toolchain.py
@@ -419,9 +419,9 @@ to build with.""" env_version = GetVisualStudioVersion() if env_version == '2017': - # VS 2017 Update 9 (15.9.3) with 10.0.17763.132 SDK, 10.0.17134 version of + # VS 2017 Update 9 (15.9.12) with 10.0.18362.0 SDK, 10.0.17134 version of # d3dcompiler_47.dll, with ARM64 libraries. - toolchain_hash = '818a152b3f1da991c1725d85be19a0f27af6bab4' + toolchain_hash = 'b83892920cc15ef223a1b81cc64d98e1197d3678' # Third parties that do not have access to the canonical toolchain can map # canonical toolchain version to their own toolchain versions. toolchain_hash_mapping_key = 'GYP_MSVS_HASH_%s' % toolchain_hash
diff --git a/cc/trees/layer_tree_host_pixeltest_filters.cc b/cc/trees/layer_tree_host_pixeltest_filters.cc index 3e08e35e..9a66fe86 100644 --- a/cc/trees/layer_tree_host_pixeltest_filters.cc +++ b/cc/trees/layer_tree_host_pixeltest_filters.cc
@@ -198,14 +198,17 @@ } TEST_P(LayerTreeHostFiltersPixelTestGPU, BackdropFilterBlurOutsets) { + if (renderer_type() == RENDERER_SKIA_GL || + renderer_type() == RENDERER_SKIA_VK) { + // TODO(973696): Implement bounds clipping in skia_renderer. + return; + } scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer( gfx::Rect(200, 200), SK_ColorWHITE); - // The green border is outside the layer with backdrop blur, but the - // backdrop blur should use pixels from outside its layer borders, up to the - // radius of the blur effect. So the border should be blurred underneath the - // top layer causing the green to bleed under the transparent layer, but not - // in the 1px region between the transparent layer and the green border. + // The green border is outside the layer with backdrop blur, so the backdrop + // blur should not include pixels from outside its layer borders. So the + // interior region of the transparent layer should be perfectly white. scoped_refptr<SolidColorLayer> green_border = CreateSolidColorLayerWithBorder( gfx::Rect(1, 1, 198, 198), SK_ColorWHITE, 10, kCSSGreen); scoped_refptr<SolidColorLayer> blur = CreateSolidColorLayer( @@ -1071,11 +1074,12 @@ float device_scale_factor_ = 1; }; +// TODO(973699): This test is broken in software_renderer. Re-enable this test +// when fixed. INSTANTIATE_TEST_SUITE_P(, BackdropFilterWithDeviceScaleFactorTest, ::testing::Values(LayerTreeTest::RENDERER_GL, - LayerTreeTest::RENDERER_SKIA_GL, - LayerTreeTest::RENDERER_SOFTWARE + LayerTreeTest::RENDERER_SKIA_GL #if defined(ENABLE_CC_VULKAN_TESTS) , LayerTreeTest::RENDERER_SKIA_VK
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index 0e3a63f..a91bc6cd 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -296,8 +296,13 @@ "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuTitleView.java", "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuUi.java", "java/src/org/chromium/chrome/browser/contextmenu/PlatformContextMenuUi.java", - "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuController.java", - "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuListAdapter.java", + "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java", + "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java", + "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java", + "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderProperties.java", + "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderViewBinder.java", + "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuItemProperties.java", + "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuItemViewBinder.java", "java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuListView.java", "java/src/org/chromium/chrome/browser/contextmenu/ShareContextMenuItem.java", "java/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuListAdapter.java",
diff --git a/chrome/android/features/autofill_assistant/BUILD.gn b/chrome/android/features/autofill_assistant/BUILD.gn index 7c872566..2a07c04 100644 --- a/chrome/android/features/autofill_assistant/BUILD.gn +++ b/chrome/android/features/autofill_assistant/BUILD.gn
@@ -154,6 +154,7 @@ testonly = true java_files = [ + "javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java", "javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInfoBoxUiTest.java", "javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPaymentRequestTestHelper.java", "javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPaymentRequestUiTest.java", @@ -173,6 +174,7 @@ "//third_party/android_deps:com_android_support_design_java", "//third_party/android_deps:com_android_support_recyclerview_v7_java", "//third_party/android_support_test_runner:runner_java", + "//third_party/espresso:espresso_all_java", "//third_party/hamcrest:hamcrest_java", "//third_party/junit", "//third_party/mockito:mockito_java",
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java new file mode 100644 index 0000000..45b0594a --- /dev/null +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java
@@ -0,0 +1,180 @@ +// Copyright 2019 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.chrome.browser.autofill_assistant; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.swipeRight; +import static android.support.test.espresso.assertion.PositionAssertions.isRightOf; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withText; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.allOf; + +import android.support.design.widget.CoordinatorLayout; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.MediumTest; +import android.support.v7.widget.DefaultItemAnimator; +import android.view.Gravity; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.ThreadUtils; +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.chrome.browser.ChromeSwitches; +import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantActionsCarouselCoordinator; +import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantCarouselModel; +import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip; +import org.chromium.chrome.browser.customtabs.CustomTabActivity; +import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; +import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.content_public.browser.test.util.TestThreadUtils; + +import java.util.concurrent.ExecutionException; + +/** + * Tests for the autofill assistant actions carousel. + */ +@RunWith(ChromeJUnit4ClassRunner.class) +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) +public class AutofillAssistantActionsCarouselUiTest { + @Rule + public CustomTabActivityTestRule mCustomTabActivityTestRule = new CustomTabActivityTestRule(); + + @Before + public void setUp() throws Exception { + mCustomTabActivityTestRule.startCustomTabActivityWithIntent( + CustomTabsTestUtils.createMinimalCustomTabIntent( + InstrumentationRegistry.getTargetContext(), "about:blank")); + } + + private CustomTabActivity getActivity() { + return mCustomTabActivityTestRule.getActivity(); + } + + /** Creates a coordinator for use in UI tests, and adds it to the global view hierarchy. */ + private AssistantActionsCarouselCoordinator createCoordinator(AssistantCarouselModel model) { + ThreadUtils.assertOnUiThread(); + AssistantActionsCarouselCoordinator coordinator = new AssistantActionsCarouselCoordinator( + InstrumentationRegistry.getTargetContext(), model); + + // Note: apparently, we need an intermediate container for this coordinator's view, + // otherwise the view will be invisible. + // @TODO(crbug.com/806868) figure out why this is the case. + LinearLayout container = new LinearLayout(InstrumentationRegistry.getTargetContext()); + container.addView(coordinator.getView()); + + CoordinatorLayout.LayoutParams lp = new CoordinatorLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + lp.gravity = Gravity.BOTTOM; + + ViewGroup chromeCoordinatorView = + getActivity().findViewById(org.chromium.chrome.autofill_assistant.R.id.coordinator); + chromeCoordinatorView.addView(container, lp); + + return coordinator; + } + + /** Tests assumptions about the initial state of the carousel. */ + @Test + @MediumTest + public void testInitialState() { + TestThreadUtils.runOnUiThreadBlocking(() -> { + AssistantCarouselModel model = new AssistantCarouselModel(); + AssistantActionsCarouselCoordinator coordinator = createCoordinator(model); + + assertThat(((DefaultItemAnimator) coordinator.getView().getItemAnimator()) + .getSupportsChangeAnimations(), + is(false)); + assertThat(model.getChipsModel().size(), is(0)); + assertThat(coordinator.getView().getAdapter().getItemCount(), is(0)); + }); + } + + /** Adds a single chip and tests assumptions about the view state after the change. */ + @Test + @MediumTest + public void testAddSingleChip() throws ExecutionException { + AssistantCarouselModel model = new AssistantCarouselModel(); + AssistantActionsCarouselCoordinator coordinator = + TestThreadUtils.runOnUiThreadBlocking(() -> createCoordinator(model)); + + TestThreadUtils.runOnUiThreadBlocking( + () + -> model.getChipsModel().add( + new AssistantChip(AssistantChip.Type.BUTTON_HAIRLINE, + AssistantChip.Icon.NONE, "Test", false, true, null))); + + // Chip was created and is displayed on the screen. + onView(is(coordinator.getView())) + .check(matches(hasDescendant(allOf(withText("Test"), isDisplayed())))); + + // TODO(crbug.com/806868): test that single chip is center aligned. + } + + /** Adds multiple chips and tests assumptions about the view state after the change. */ + @Test + @MediumTest + public void testAddMultipleChips() throws ExecutionException { + AssistantCarouselModel model = new AssistantCarouselModel(); + AssistantActionsCarouselCoordinator coordinator = + TestThreadUtils.runOnUiThreadBlocking(() -> createCoordinator(model)); + + // Note: this should be a small number that fits on screen without scrolling. + int numChips = 3; + TestThreadUtils.runOnUiThreadBlocking(() -> { + for (int i = 0; i < numChips; i++) { + model.getChipsModel().add(new AssistantChip(AssistantChip.Type.BUTTON_HAIRLINE, + AssistantChip.Icon.NONE, "T" + i, false, false, null)); + } + model.getChipsModel().add(new AssistantChip(AssistantChip.Type.BUTTON_HAIRLINE, + AssistantChip.Icon.NONE, "X", false, true, null)); + }); + + // Cancel chip is displayed to the user. + onView(withText("X")).check(matches(isDisplayed())); + + // All chips are to the right of the cancel chip. + for (int i = 0; i < numChips; i++) { + onView(withText("T" + i)).check(isRightOf(withText("X"))); + } + } + + /** Adds many chips and tests that the cancel chip is always visible. */ + @Test + @MediumTest + public void testCancelChipAlwaysVisible() throws ExecutionException { + AssistantCarouselModel model = new AssistantCarouselModel(); + AssistantActionsCarouselCoordinator coordinator = + TestThreadUtils.runOnUiThreadBlocking(() -> createCoordinator(model)); + + // Note: this should be a large number that does not fit on screen without scrolling. + int numChips = 30; + TestThreadUtils.runOnUiThreadBlocking(() -> { + for (int i = 0; i < numChips; i++) { + model.getChipsModel().add(new AssistantChip(AssistantChip.Type.BUTTON_HAIRLINE, + AssistantChip.Icon.NONE, "Test" + i, false, false, null)); + } + model.getChipsModel().add(new AssistantChip(AssistantChip.Type.BUTTON_HAIRLINE, + AssistantChip.Icon.NONE, "Cancel", false, true, null)); + }); + + // Cancel chip is initially displayed to the user. + onView(withText("Cancel")).check(matches(isDisplayed())); + + // Scroll right, check that cancel is still visible. + onView(is(coordinator.getView())).perform(swipeRight()); + onView(withText("Cancel")).check(matches(isDisplayed())); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java index 952e38c..20c3416 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -138,6 +138,12 @@ private ContentCaptureConsumer mContentCaptureConsumer; /** + * Last MOVE MotionEvent dispatched to this object for a currently active gesture. If there is + * no active gesture, this is null. + */ + private @Nullable MotionEvent mLastMoveEvent; + + /** * This view is created on demand to display debugging information. */ private static class DebugOverlay extends View { @@ -237,6 +243,37 @@ public void onContentChanged(Tab tab) { CompositorViewHolder.this.onContentChanged(); } + + @Override + public void onWebContentsSwapped(Tab tab, boolean didStartLoad, boolean didFinishLoad) { + /** + * After swapping web contents, any gesture active in the old ContentView is + * cancelled. We still want to continue a previously running gesture in the new + * ContentView, so we synthetically dispatch a new ACTION_DOWN MotionEvent with the + * coordinates of where we estimate the pointer currently is (the coordinates of + * the last ACTION_MOVE MotionEvent received before the swap). + * + * We wait for layout to happen as the newly created ContentView currently has a + * width and height of zero, which would result in the event not being dispatched. + */ + mView.addOnLayoutChangeListener(new OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + v.removeOnLayoutChangeListener(this); + if (mLastMoveEvent == null) return; + MotionEvent downEvent = MotionEvent.obtain(mLastMoveEvent); + downEvent.setAction(MotionEvent.ACTION_DOWN); + CompositorViewHolder.this.dispatchTouchEvent(downEvent); + for (int i = 1; i < mLastMoveEvent.getPointerCount(); i++) { + MotionEvent pointerDownEvent = MotionEvent.obtain(mLastMoveEvent); + pointerDownEvent.setAction(MotionEvent.ACTION_POINTER_DOWN + | (i << MotionEvent.ACTION_POINTER_INDEX_SHIFT)); + CompositorViewHolder.this.dispatchTouchEvent(pointerDownEvent); + } + } + }); + } }; addOnLayoutChangeListener(new OnLayoutChangeListener() { @@ -558,6 +595,22 @@ return ret; } + @Override + public boolean dispatchTouchEvent(MotionEvent e) { + updateLastMoveEvent(e); + return super.dispatchTouchEvent(e); + } + + private void updateLastMoveEvent(MotionEvent e) { + if (e.getActionMasked() == MotionEvent.ACTION_MOVE) { + mLastMoveEvent = e; + } + if (e.getActionMasked() == MotionEvent.ACTION_CANCEL + || e.getActionMasked() == MotionEvent.ACTION_UP) { + mLastMoveEvent = null; + } + } + /** * @return The {@link LayoutManager} associated with this view. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java index 862a82e..684e216 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java
@@ -23,8 +23,6 @@ import org.chromium.base.task.PostTask; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeFeatureList; -import org.chromium.chrome.browser.favicon.LargeIconBridge; -import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.share.ShareHelper; import org.chromium.chrome.browser.share.ShareParams; import org.chromium.content_public.browser.UiThreadTaskTraits; @@ -134,19 +132,14 @@ return; } - final RevampedContextMenuController menuController = - new RevampedContextMenuController(topContentOffsetPx); - menuController.displayMenu(mActivity, mCurrentContextMenuParams, items, mCallback, + final RevampedContextMenuCoordinator menuCoordinator = + new RevampedContextMenuCoordinator(topContentOffsetPx); + menuCoordinator.displayMenu(mActivity, mCurrentContextMenuParams, items, mCallback, mOnMenuShown, mOnMenuClosed); - // TODO(sinansahin): This could be pushed in to the menuController. + // TODO(sinansahin): This could be pushed in to the header mediator. if (mCurrentContextMenuParams.isImage()) { - getThumbnail(menuController, menuController::onImageThumbnailRetrieved); - } else { - LargeIconBridge iconBridge = new LargeIconBridge(Profile.getLastUsedProfile()); - iconBridge.getLargeIconForUrl(mCurrentContextMenuParams.getUrl(), - getActivity().getResources().getDimensionPixelSize( - R.dimen.default_favicon_size), - menuController::onFaviconAvailable); + getThumbnail( + menuCoordinator, menuCoordinator.getOnImageThumbnailRetrievedReference()); } return; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuController.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuController.java deleted file mode 100644 index 184a3115..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuController.java +++ /dev/null
@@ -1,215 +0,0 @@ -// Copyright 2019 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.chrome.browser.contextmenu; - -import android.app.Activity; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Matrix; -import android.graphics.Paint; -import android.graphics.Shader; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.support.annotation.ColorInt; -import android.support.annotation.IntDef; -import android.support.annotation.Nullable; -import android.support.v7.app.AlertDialog; -import android.text.SpannableString; -import android.text.TextUtils; -import android.util.Pair; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.AdapterView; - -import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.base.Callback; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeBaseAppCompatActivity; -import org.chromium.chrome.browser.favicon.IconType; -import org.chromium.chrome.browser.night_mode.GlobalNightModeStateProviderHolder; -import org.chromium.chrome.browser.omnibox.OmniboxUrlEmphasizer; -import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.chrome.browser.widget.ContextMenuDialog; -import org.chromium.components.security_state.ConnectionSecurityLevel; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; -import java.util.List; - -/** - * A customized context menu that displays the options in a list with the first item being - * the header and represents the the options in groups. - */ -public class RevampedContextMenuController - implements ContextMenuUi, AdapterView.OnItemClickListener { - @Retention(RetentionPolicy.SOURCE) - @IntDef({ListItemType.DIVIDER, ListItemType.HEADER, ListItemType.CONTEXT_MENU_ITEM}) - public @interface ListItemType { - int DIVIDER = 0; - int HEADER = 1; - int CONTEXT_MENU_ITEM = 2; - - // Keep this up-to-date - int NUM_ENTRIES = 3; - } - - private ContextMenuDialog mContextMenuDialog; - private RevampedContextMenuListAdapter mListAdapter; - private Callback<Integer> mItemClickCallback; - private float mTopContentOffsetPx; - private String mPlainUrl; - - /** - * Constructor that also sets the content offset. - * - * @param topContentOffsetPx content offset from the top. - */ - RevampedContextMenuController(float topContentOffsetPx) { - mTopContentOffsetPx = topContentOffsetPx; - } - - @Override - public void displayMenu(final Activity activity, ContextMenuParams params, - List<Pair<Integer, List<ContextMenuItem>>> items, Callback<Integer> onItemClicked, - final Runnable onMenuShown, final Runnable onMenuClosed) { - mItemClickCallback = onItemClicked; - final Resources resources = activity.getResources(); - final float density = resources.getDisplayMetrics().density; - final float touchPointXPx = params.getTriggeringTouchXDp() * density; - final float touchPointYPx = params.getTriggeringTouchYDp() * density; - - final View view = - LayoutInflater.from(activity).inflate(R.layout.revamped_context_menu, null); - mContextMenuDialog = createContextMenuDialog(activity, view, touchPointXPx, touchPointYPx); - mContextMenuDialog.setOnShowListener(dialogInterface -> onMenuShown.run()); - mContextMenuDialog.setOnDismissListener(dialogInterface -> onMenuClosed.run()); - - // Integer here indicates if the item is the header, a divider, or a row (selectable option) - List<Pair<Integer, ContextMenuItem>> itemList = new ArrayList<>(); - itemList.add(new Pair<>(ListItemType.HEADER, null)); - - for (Pair<Integer, List<ContextMenuItem>> group : items) { - // Add a divider - itemList.add(new Pair<>(ListItemType.DIVIDER, null)); - - for (ContextMenuItem item : group.second) { - itemList.add(new Pair<>(ListItemType.CONTEXT_MENU_ITEM, item)); - } - } - - String headerTitle = params.getTitleText(); - if (TextUtils.isEmpty(headerTitle)) { - headerTitle = params.getLinkText(); - } - - mPlainUrl = params.getUrl(); - CharSequence url = params.getUrl(); - if (!TextUtils.isEmpty(url)) { - boolean useDarkColors = - !GlobalNightModeStateProviderHolder.getInstance().isInNightMode(); - if (activity instanceof ChromeBaseAppCompatActivity) { - useDarkColors = !((ChromeBaseAppCompatActivity) activity) - .getNightModeStateProvider() - .isInNightMode(); - } - - SpannableString spannableUrl = - new SpannableString(ChromeContextMenuPopulator.createUrlText(params)); - OmniboxUrlEmphasizer.emphasizeUrl(spannableUrl, resources, Profile.getLastUsedProfile(), - ConnectionSecurityLevel.NONE, false, useDarkColors, false); - url = spannableUrl; - } - - mListAdapter = new RevampedContextMenuListAdapter(activity, itemList); - mListAdapter.setHeaderTitle(headerTitle); - mListAdapter.setHeaderUrl(url); - RevampedContextMenuListView listView = view.findViewById(R.id.context_menu_list_view); - listView.setAdapter(mListAdapter); - listView.setOnItemClickListener(this); - - mContextMenuDialog.show(); - } - - /** - * Returns the fully complete dialog based off the params and the itemGroups. - * - * @param activity Used to inflate the dialog. - * @param view The inflated view that contains the list view. - * @param touchPointYPx The x-coordinate of the touch that triggered the context menu. - * @param touchPointXPx The y-coordinate of the touch that triggered the context menu. - * @return Returns a final dialog that does not have a background can be displayed using - * {@link AlertDialog#show()}. - */ - private ContextMenuDialog createContextMenuDialog( - Activity activity, View view, float touchPointXPx, float touchPointYPx) { - View listView = view.findViewById(R.id.context_menu_list_view); - final ContextMenuDialog dialog = - new ContextMenuDialog(activity, R.style.Theme_Chromium_DialogWhenLarge, - touchPointXPx, touchPointYPx, mTopContentOffsetPx, listView); - dialog.setContentView(view); - - return dialog; - } - - /** - * This adds a checkerboard style background to the image. - * It is useful for the transparent PNGs. - * @return The given image with the checkerboard pattern in the background. - */ - static Bitmap getImageWithCheckerBackground(Resources res, Bitmap image) { - // 1. Create a bitmap for the checkerboard pattern. - Drawable drawable = ApiCompatibilityUtils.getDrawable( - res, org.chromium.chrome.R.drawable.checkerboard_background); - Bitmap tileBitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), - drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); - Canvas tileCanvas = new Canvas(tileBitmap); - drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); - drawable.draw(tileCanvas); - - // 2. Create a BitmapDrawable using the checkerboard pattern bitmap. - BitmapDrawable bitmapDrawable = new BitmapDrawable(res, tileBitmap); - bitmapDrawable.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); - bitmapDrawable.setBounds(0, 0, image.getWidth(), image.getHeight()); - - // 3. Create a bitmap-backed canvas for the final image. - Bitmap bitmap = - Bitmap.createBitmap(image.getWidth(), image.getHeight(), Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); - - // 4. Paint the checkerboard background into the final canvas - bitmapDrawable.draw(canvas); - - // 5. Draw the image on top. - Paint paint = new Paint(); - paint.setAntiAlias(true); - canvas.drawBitmap(image, new Matrix(), paint); - - return bitmap; - } - - /** - * This is called when the thumbnail is fetched and ready to display. - * @param thumbnail The bitmap received that will be displayed as the header image. - */ - void onImageThumbnailRetrieved(Bitmap thumbnail) { - mListAdapter.onImageThumbnailRetrieved(thumbnail); - } - - /** - * See {@link org.chromium.chrome.browser.favicon.LargeIconBridge#getLargeIconForUrl} - */ - void onFaviconAvailable(@Nullable Bitmap icon, @ColorInt int fallbackColor, - boolean isColorDefault, @IconType int iconType) { - mListAdapter.onFaviconAvailable(icon, fallbackColor, mPlainUrl); - } - - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - mContextMenuDialog.dismiss(); - mItemClickCallback.onResult((int) id); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java new file mode 100644 index 0000000..57bfae8 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java
@@ -0,0 +1,180 @@ +// Copyright 2019 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.chrome.browser.contextmenu; + +import android.app.Activity; +import android.graphics.Bitmap; +import android.support.annotation.IntDef; +import android.support.v7.app.AlertDialog; +import android.util.Pair; +import android.view.LayoutInflater; +import android.view.View; + +import org.chromium.base.Callback; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.widget.ContextMenuDialog; +import org.chromium.ui.modelutil.ModelListAdapter; +import org.chromium.ui.modelutil.PropertyModel; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; +import java.util.List; + +/** + * The main coordinator for the Revamped Context Menu, responsible for creating the context menu in + * general and the header component. + */ +public class RevampedContextMenuCoordinator implements ContextMenuUi { + @Retention(RetentionPolicy.SOURCE) + @IntDef({ListItemType.DIVIDER, ListItemType.HEADER, ListItemType.CONTEXT_MENU_ITEM}) + public @interface ListItemType { + int DIVIDER = 0; + int HEADER = 1; + int CONTEXT_MENU_ITEM = 2; + } + + private static final int INVALID_ITEM_ID = -1; + + private RevampedContextMenuHeaderCoordinator mHeaderCoordinator; + + private float mTopContentOffsetPx; + + /** + * Constructor that also sets the content offset. + * + * @param topContentOffsetPx content offset from the top. + */ + RevampedContextMenuCoordinator(float topContentOffsetPx) { + mTopContentOffsetPx = topContentOffsetPx; + } + + @Override + public void displayMenu(final Activity activity, ContextMenuParams params, + List<Pair<Integer, List<ContextMenuItem>>> items, Callback<Integer> onItemClicked, + final Runnable onMenuShown, final Runnable onMenuClosed) { + final float density = activity.getResources().getDisplayMetrics().density; + final float touchPointXPx = params.getTriggeringTouchXDp() * density; + final float touchPointYPx = params.getTriggeringTouchYDp() * density; + + final View view = + LayoutInflater.from(activity).inflate(R.layout.revamped_context_menu, null); + ContextMenuDialog dialog = + createContextMenuDialog(activity, view, touchPointXPx, touchPointYPx); + dialog.setOnShowListener(dialogInterface -> onMenuShown.run()); + dialog.setOnDismissListener(dialogInterface -> onMenuClosed.run()); + + mHeaderCoordinator = new RevampedContextMenuHeaderCoordinator( + activity, params, params.getUrl(), params.isImage()); + + ModelListAdapter adapter = new ModelListAdapter(activity) { + @Override + public boolean areAllItemsEnabled() { + return false; + } + + @Override + public boolean isEnabled(int position) { + return getItemViewType(position) == ListItemType.CONTEXT_MENU_ITEM; + } + + @Override + public long getItemId(int position) { + if (getItemViewType(position) == ListItemType.CONTEXT_MENU_ITEM) { + return ((Pair<Integer, PropertyModel>) getItem(position)) + .second.get(RevampedContextMenuItemProperties.MENU_ID); + } + return INVALID_ITEM_ID; + } + }; + + RevampedContextMenuListView listView = view.findViewById(R.id.context_menu_list_view); + listView.setAdapter(adapter); + + // Note: clang-format does a bad job formatting lambdas so we turn it off here. + // clang-format off + adapter.registerType( + ListItemType.HEADER, + mHeaderCoordinator::getView, + RevampedContextMenuHeaderViewBinder::bind); + adapter.registerType( + ListItemType.DIVIDER, + () -> LayoutInflater.from(listView.getContext()) + .inflate(R.layout.context_menu_divider, null), + (m, v, p) -> {}); + adapter.registerType( + ListItemType.CONTEXT_MENU_ITEM, + () -> LayoutInflater.from(listView.getContext()) + .inflate(R.layout.revamped_context_menu_row, null), + RevampedContextMenuItemViewBinder::bind); + // clang-format on + + // The Integer here specifies the {@link ListItemType}. + List<Pair<Integer, PropertyModel>> itemList = getItemList(activity, items); + + adapter.updateModels(itemList); + listView.setOnItemClickListener((p, v, pos, id) -> { + assert id != INVALID_ITEM_ID; + + dialog.dismiss(); + onItemClicked.onResult((int) id); + }); + + dialog.show(); + } + + /** + * Returns the fully complete dialog based off the params and the itemGroups. + * + * @param activity Used to inflate the dialog. + * @param view The inflated view that contains the list view. + * @param touchPointYPx The x-coordinate of the touch that triggered the context menu. + * @param touchPointXPx The y-coordinate of the touch that triggered the context menu. + * @return Returns a final dialog that does not have a background can be displayed using + * {@link AlertDialog#show()}. + */ + private ContextMenuDialog createContextMenuDialog( + Activity activity, View view, float touchPointXPx, float touchPointYPx) { + View listView = view.findViewById(R.id.context_menu_list_view); + // TODO(sinansahin): Refactor ContextMenuDialog as well. + final ContextMenuDialog dialog = + new ContextMenuDialog(activity, R.style.Theme_Chromium_DialogWhenLarge, + touchPointXPx, touchPointYPx, mTopContentOffsetPx, listView); + dialog.setContentView(view); + + return dialog; + } + + private List<Pair<Integer, PropertyModel>> getItemList( + Activity activity, List<Pair<Integer, List<ContextMenuItem>>> items) { + List<Pair<Integer, PropertyModel>> itemList = new ArrayList<>(); + + // TODO(sinansahin): We should be able to remove this conversion once we can get the items + // in the desired format. + itemList.add(new Pair<>(ListItemType.HEADER, mHeaderCoordinator.getModel())); + + for (Pair<Integer, List<ContextMenuItem>> group : items) { + // Add a divider + itemList.add(new Pair<>(ListItemType.DIVIDER, new PropertyModel())); + + for (ContextMenuItem item : group.second) { + PropertyModel itemModel = + new PropertyModel.Builder(RevampedContextMenuItemProperties.ALL_KEYS) + .with(RevampedContextMenuItemProperties.MENU_ID, item.getMenuId()) + .with(RevampedContextMenuItemProperties.TEXT, + item.getTitle(activity)) + .build(); + + itemList.add(new Pair<>(ListItemType.CONTEXT_MENU_ITEM, itemModel)); + } + } + + return itemList; + } + + Callback<Bitmap> getOnImageThumbnailRetrievedReference() { + return mHeaderCoordinator.getOnImageThumbnailRetrievedReference(); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java new file mode 100644 index 0000000..98299fc --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java
@@ -0,0 +1,94 @@ +// Copyright 2019 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.chrome.browser.contextmenu; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Bitmap; +import android.text.SpannableString; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; + +import org.chromium.base.Callback; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.ChromeBaseAppCompatActivity; +import org.chromium.chrome.browser.night_mode.GlobalNightModeStateProviderHolder; +import org.chromium.chrome.browser.omnibox.OmniboxUrlEmphasizer; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.components.security_state.ConnectionSecurityLevel; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.modelutil.PropertyModelChangeProcessor; + +class RevampedContextMenuHeaderCoordinator { + private PropertyModel mModel; + private RevampedContextMenuHeaderMediator mMediator; + + private Context mContext; + + RevampedContextMenuHeaderCoordinator( + Activity activity, ContextMenuParams params, String plainUrl, boolean isImage) { + mContext = activity; + mModel = buildModel(getTitle(params), getUrl(activity, params)); + mMediator = new RevampedContextMenuHeaderMediator(activity, mModel, plainUrl, isImage); + } + + private PropertyModel buildModel(String title, CharSequence url) { + return new PropertyModel.Builder(RevampedContextMenuHeaderProperties.ALL_KEYS) + .with(RevampedContextMenuHeaderProperties.TITLE, title) + .with(RevampedContextMenuHeaderProperties.TITLE_MAX_LINES, + TextUtils.isEmpty(url) ? 2 : 1) + .with(RevampedContextMenuHeaderProperties.URL, url) + .with(RevampedContextMenuHeaderProperties.URL_MAX_LINES, + TextUtils.isEmpty(title) ? 2 : 1) + .with(RevampedContextMenuHeaderProperties.IMAGE, null) + .with(RevampedContextMenuHeaderProperties.CIRCLE_BG_VISIBLE, false) + .build(); + } + + private String getTitle(ContextMenuParams params) { + return TextUtils.isEmpty(params.getTitleText()) ? params.getLinkText() + : params.getTitleText(); + } + + private CharSequence getUrl(Activity activity, ContextMenuParams params) { + CharSequence url = params.getUrl(); + if (!TextUtils.isEmpty(url)) { + boolean useDarkColors = + !GlobalNightModeStateProviderHolder.getInstance().isInNightMode(); + if (activity instanceof ChromeBaseAppCompatActivity) { + useDarkColors = !((ChromeBaseAppCompatActivity) activity) + .getNightModeStateProvider() + .isInNightMode(); + } + + SpannableString spannableUrl = + new SpannableString(ChromeContextMenuPopulator.createUrlText(params)); + OmniboxUrlEmphasizer.emphasizeUrl(spannableUrl, activity.getResources(), + Profile.getLastUsedProfile(), ConnectionSecurityLevel.NONE, false, + useDarkColors, false); + url = spannableUrl; + } + return url; + } + + Callback<Bitmap> getOnImageThumbnailRetrievedReference() { + return mMediator::onImageThumbnailRetrieved; + } + + PropertyModel getModel() { + return mModel; + } + + View getView() { + View view = + LayoutInflater.from(mContext).inflate(R.layout.revamped_context_menu_header, null); + // TODO(sinansahin): Remove the work around code when the ModelListAdapter is updated. + view.setTag(org.chromium.ui.R.id.view_model, mModel); + PropertyModelChangeProcessor.create( + mModel, view, RevampedContextMenuHeaderViewBinder::bind); + return view; + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java new file mode 100644 index 0000000..684d77e7 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java
@@ -0,0 +1,151 @@ +// Copyright 2019 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.chrome.browser.contextmenu; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Shader; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.support.annotation.ColorInt; +import android.support.annotation.Nullable; +import android.text.TextUtils; +import android.view.View; + +import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.favicon.IconType; +import org.chromium.chrome.browser.favicon.LargeIconBridge; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.widget.RoundedIconGenerator; +import org.chromium.ui.modelutil.PropertyModel; + +class RevampedContextMenuHeaderMediator implements View.OnClickListener { + private PropertyModel mModel; + + private Context mContext; + private String mPlainUrl; + + RevampedContextMenuHeaderMediator( + Context context, PropertyModel model, String plainUrl, boolean isImage) { + mContext = context; + mPlainUrl = plainUrl; + mModel = model; + mModel.set(RevampedContextMenuHeaderProperties.URL_CLICK_LISTENER, this); + + if (!isImage) { + LargeIconBridge iconBridge = new LargeIconBridge(Profile.getLastUsedProfile()); + iconBridge.getLargeIconForUrl(mPlainUrl, + context.getResources().getDimensionPixelSize(R.dimen.default_favicon_min_size), + this::onFaviconAvailable); + } + } + + /** + * This is called when the thumbnail is fetched and ready to display. + * @param thumbnail The bitmap received that will be displayed as the header image. + */ + void onImageThumbnailRetrieved(Bitmap thumbnail) { + if (thumbnail != null) { + setHeaderImage(getImageWithCheckerBackground(mContext.getResources(), thumbnail), true); + } + // TODO(sinansahin): Handle the case where the retrieval of the thumbnail fails. + } + + /** + * See {@link org.chromium.chrome.browser.favicon.LargeIconBridge#getLargeIconForUrl} + */ + private void onFaviconAvailable(@Nullable Bitmap icon, @ColorInt int fallbackColor, + boolean isColorDefault, @IconType int iconType) { + // If we didn't get a favicon, generate a monogram instead + if (icon == null) { + final RoundedIconGenerator iconGenerator = createRoundedIconGenerator(fallbackColor); + icon = iconGenerator.generateIconForUrl(mPlainUrl); + } + + final int size = mContext.getResources().getDimensionPixelSize( + R.dimen.revamped_context_menu_header_monogram_size); + + icon = Bitmap.createScaledBitmap(icon, size, size, true); + + setHeaderImage(icon, false); + } + + /** + * This is called when the url text is clicked. So, we can expand or shrink the url here. + * @param v The url text view. + */ + @Override + public void onClick(View v) { + if (mModel.get(RevampedContextMenuHeaderProperties.URL_MAX_LINES) == Integer.MAX_VALUE) { + boolean isEmpty = + TextUtils.isEmpty(mModel.get(RevampedContextMenuHeaderProperties.TITLE)); + mModel.set(RevampedContextMenuHeaderProperties.URL_MAX_LINES, isEmpty ? 2 : 1); + } else { + mModel.set(RevampedContextMenuHeaderProperties.URL_MAX_LINES, Integer.MAX_VALUE); + } + } + + /** + * This adds a checkerboard style background to the image. + * It is useful for the transparent PNGs. + * @return The given image with the checkerboard pattern in the background. + */ + private static Bitmap getImageWithCheckerBackground(Resources res, Bitmap image) { + // 1. Create a bitmap for the checkerboard pattern. + Drawable drawable = + ApiCompatibilityUtils.getDrawable(res, R.drawable.checkerboard_background); + Bitmap tileBitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), + drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + Canvas tileCanvas = new Canvas(tileBitmap); + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + drawable.draw(tileCanvas); + + // 2. Create a BitmapDrawable using the checkerboard pattern bitmap. + BitmapDrawable bitmapDrawable = new BitmapDrawable(res, tileBitmap); + bitmapDrawable.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); + bitmapDrawable.setBounds(0, 0, image.getWidth(), image.getHeight()); + + // 3. Create a bitmap-backed canvas for the final image. + Bitmap bitmap = + Bitmap.createBitmap(image.getWidth(), image.getHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + + // 4. Paint the checkerboard background into the final canvas + bitmapDrawable.draw(canvas); + + // 5. Draw the image on top. + Paint paint = new Paint(); + paint.setAntiAlias(true); + canvas.drawBitmap(image, new Matrix(), paint); + + return bitmap; + } + + private void setHeaderImage(Bitmap bitmap, boolean isThumbnail) { + if (isThumbnail) { + mModel.set(RevampedContextMenuHeaderProperties.IMAGE, bitmap); + return; + } + + mModel.set(RevampedContextMenuHeaderProperties.CIRCLE_BG_VISIBLE, true); + mModel.set(RevampedContextMenuHeaderProperties.IMAGE, bitmap); + } + + private RoundedIconGenerator createRoundedIconGenerator(@ColorInt int iconColor) { + final Resources resources = mContext.getResources(); + final int iconSize = + resources.getDimensionPixelSize(R.dimen.revamped_context_menu_header_monogram_size); + final int cornerRadius = iconSize / 2; + final int textSize = resources.getDimensionPixelSize( + R.dimen.revamped_context_menu_header_monogram_text_size); + + return new RoundedIconGenerator(iconSize, iconSize, cornerRadius, iconColor, textSize); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderProperties.java new file mode 100644 index 0000000..be9ef2d --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderProperties.java
@@ -0,0 +1,29 @@ +// Copyright 2019 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.chrome.browser.contextmenu; + +import android.graphics.Bitmap; +import android.view.View; + +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey; +import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey; + +class RevampedContextMenuHeaderProperties { + public static final WritableObjectPropertyKey<String> TITLE = new WritableObjectPropertyKey<>(); + public static final WritableIntPropertyKey TITLE_MAX_LINES = new WritableIntPropertyKey(); + public static final WritableObjectPropertyKey<CharSequence> URL = + new WritableObjectPropertyKey<>(); + public static final WritableObjectPropertyKey<View.OnClickListener> URL_CLICK_LISTENER = + new WritableObjectPropertyKey<>(); + public static final WritableIntPropertyKey URL_MAX_LINES = new WritableIntPropertyKey(); + public static final WritableObjectPropertyKey<Bitmap> IMAGE = new WritableObjectPropertyKey<>(); + public static final PropertyModel.WritableBooleanPropertyKey CIRCLE_BG_VISIBLE = + new PropertyModel.WritableBooleanPropertyKey(); + + public static final PropertyKey[] ALL_KEYS = {TITLE, TITLE_MAX_LINES, URL, URL_CLICK_LISTENER, + URL_MAX_LINES, IMAGE, CIRCLE_BG_VISIBLE}; +} \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderViewBinder.java new file mode 100644 index 0000000..1470c4d6 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderViewBinder.java
@@ -0,0 +1,64 @@ +// Copyright 2019 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.chrome.browser.contextmenu; + +import android.graphics.Bitmap; +import android.text.TextUtils; +import android.view.View; +import android.widget.TextView; + +import org.chromium.chrome.R; +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.widget.RoundedCornerImageView; + +class RevampedContextMenuHeaderViewBinder { + public static void bind(PropertyModel model, View view, PropertyKey propertyKey) { + if (propertyKey == RevampedContextMenuHeaderProperties.TITLE) { + TextView titleText = view.findViewById(R.id.menu_header_title); + titleText.setText(model.get(RevampedContextMenuHeaderProperties.TITLE)); + titleText.setVisibility( + TextUtils.isEmpty(model.get(RevampedContextMenuHeaderProperties.TITLE)) + ? View.GONE + : View.VISIBLE); + } else if (propertyKey == RevampedContextMenuHeaderProperties.TITLE_MAX_LINES) { + final int maxLines = model.get(RevampedContextMenuHeaderProperties.TITLE_MAX_LINES); + ((TextView) view.findViewById(R.id.menu_header_title)).setMaxLines(maxLines); + } else if (propertyKey == RevampedContextMenuHeaderProperties.URL) { + TextView urlText = view.findViewById(R.id.menu_header_url); + urlText.setText(model.get(RevampedContextMenuHeaderProperties.URL)); + urlText.setVisibility( + TextUtils.isEmpty(model.get(RevampedContextMenuHeaderProperties.URL)) + ? View.GONE + : View.VISIBLE); + } else if (propertyKey == RevampedContextMenuHeaderProperties.URL_CLICK_LISTENER) { + view.findViewById(R.id.menu_header_url) + .setOnClickListener( + model.get(RevampedContextMenuHeaderProperties.URL_CLICK_LISTENER)); + } else if (propertyKey == RevampedContextMenuHeaderProperties.URL_MAX_LINES) { + final int maxLines = model.get(RevampedContextMenuHeaderProperties.URL_MAX_LINES); + final TextView urlText = view.findViewById(R.id.menu_header_url); + urlText.setMaxLines(maxLines); + if (maxLines == Integer.MAX_VALUE) { + urlText.setEllipsize(null); + } else { + urlText.setEllipsize(TextUtils.TruncateAt.END); + } + } else if (propertyKey == RevampedContextMenuHeaderProperties.IMAGE) { + Bitmap bitmap = model.get(RevampedContextMenuHeaderProperties.IMAGE); + if (bitmap != null) { + RoundedCornerImageView imageView = view.findViewById(R.id.menu_header_image); + // Clear the loading background color now that we have the real image. + imageView.setRoundedFillColor(android.R.color.transparent); + imageView.setImageBitmap(bitmap); + } + } else if (propertyKey == RevampedContextMenuHeaderProperties.CIRCLE_BG_VISIBLE) { + final boolean isVisible = + model.get(RevampedContextMenuHeaderProperties.CIRCLE_BG_VISIBLE); + view.findViewById(R.id.circle_background) + .setVisibility(isVisible ? View.VISIBLE : View.INVISIBLE); + } + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuItemProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuItemProperties.java new file mode 100644 index 0000000..7fa7395 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuItemProperties.java
@@ -0,0 +1,17 @@ +// Copyright 2019 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.chrome.browser.contextmenu; + +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey; +import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey; + +class RevampedContextMenuItemProperties { + public static final WritableObjectPropertyKey<CharSequence> TEXT = + new WritableObjectPropertyKey<>(); + public static final WritableIntPropertyKey MENU_ID = new WritableIntPropertyKey(); + + public static final PropertyKey[] ALL_KEYS = {TEXT, MENU_ID}; +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuItemViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuItemViewBinder.java new file mode 100644 index 0000000..cac6094 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuItemViewBinder.java
@@ -0,0 +1,20 @@ +// Copyright 2019 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.chrome.browser.contextmenu; + +import android.view.View; +import android.widget.TextView; + +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; + +class RevampedContextMenuItemViewBinder { + public static void bind(PropertyModel model, View view, PropertyKey propertyKey) { + if (propertyKey == RevampedContextMenuItemProperties.TEXT) { + ((TextView) view).setText(model.get(RevampedContextMenuItemProperties.TEXT)); + } else if (propertyKey == RevampedContextMenuItemProperties.MENU_ID) { + } + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuListAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuListAdapter.java deleted file mode 100644 index 0f5a5a8ac..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuListAdapter.java +++ /dev/null
@@ -1,216 +0,0 @@ -// Copyright 2019 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.chrome.browser.contextmenu; - -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.support.annotation.ColorInt; -import android.support.annotation.Nullable; -import android.text.TextUtils; -import android.util.Pair; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.TextView; - -import org.chromium.chrome.R; -import org.chromium.chrome.browser.widget.RoundedIconGenerator; -import org.chromium.ui.widget.RoundedCornerImageView; - -import java.util.List; - -// TODO(sinansahin): Convert ContextMenuItem to a PropertyModel. This will include changes to -// setHeaderTitle(), setHeaderUrl(), and getHeaderImage() -class RevampedContextMenuListAdapter extends BaseAdapter { - private final List<Pair<Integer, ContextMenuItem>> mMenuItems; - - private String mHeaderTitle; - private CharSequence mHeaderUrl; - private RoundedCornerImageView mHeaderImage; - private Bitmap mHeaderBitmap; - - private boolean mIsHeaderImageThumbnail; - - private Context mContext; - - public RevampedContextMenuListAdapter( - Context context, List<Pair<Integer, ContextMenuItem>> menuItems) { - mContext = context; - mMenuItems = menuItems; - } - - @Override - public Pair<Integer, ContextMenuItem> getItem(int position) { - return mMenuItems.get(position); - } - - @Override - public int getCount() { - return mMenuItems.size(); - } - - @Override - public long getItemId(int position) { - if (mMenuItems.get(position).first - == RevampedContextMenuController.ListItemType.CONTEXT_MENU_ITEM) { - return mMenuItems.get(position).second.getMenuId(); - } - return 0; - } - - @Override - public int getViewTypeCount() { - return RevampedContextMenuController.ListItemType.NUM_ENTRIES; - } - - @Override - public int getItemViewType(int position) { - return mMenuItems.get(position).first; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - int layout; - - if (position == 0) { - layout = R.layout.revamped_context_menu_header; - convertView = LayoutInflater.from(parent.getContext()).inflate(layout, null); - - mHeaderImage = convertView.findViewById(R.id.menu_header_image); - - // We should've cached the bitmap if the header wasn't ready when we received a - // thumbnail, favicon, or monogram. We can set the image to the cached bitmap here. - if (mHeaderBitmap != null) { - setHeaderImage(mHeaderBitmap); - } - - TextView titleText = convertView.findViewById(R.id.menu_header_title); - titleText.setText(mHeaderTitle); - - TextView urlText = convertView.findViewById(R.id.menu_header_url); - urlText.setText(mHeaderUrl); - - if (TextUtils.isEmpty(mHeaderTitle)) { - titleText.setVisibility(View.GONE); - urlText.setMaxLines(2); - } - - if (TextUtils.isEmpty(mHeaderUrl)) { - urlText.setVisibility(View.GONE); - titleText.setMaxLines(2); - } else { - // Expand or shrink the URL on click - urlText.setOnClickListener(view -> { - if (urlText.getMaxLines() == Integer.MAX_VALUE) { - urlText.setMaxLines(TextUtils.isEmpty(mHeaderTitle) ? 2 : 1); - urlText.setEllipsize(TextUtils.TruncateAt.END); - } else { - urlText.setMaxLines(Integer.MAX_VALUE); - urlText.setEllipsize(null); - } - }); - } - } else if (getItem(position).first - == RevampedContextMenuController.ListItemType.DIVIDER) { - layout = R.layout.context_menu_divider; - convertView = LayoutInflater.from(parent.getContext()).inflate(layout, null); - } else { - layout = R.layout.revamped_context_menu_row; - convertView = LayoutInflater.from(parent.getContext()).inflate(layout, null); - - TextView rowText = (TextView) convertView; - rowText.setText(getItem(position).second.getTitle(parent.getContext())); - } - } - - return convertView; - } - - public void setHeaderTitle(String headerTitle) { - mHeaderTitle = headerTitle; - } - - public void setHeaderUrl(CharSequence headerUrl) { - mHeaderUrl = headerUrl; - } - - /** - * This is called when the thumbnail is fetched and ready to display. - * @param thumbnail The bitmap received that will be displayed as the header image. - */ - void onImageThumbnailRetrieved(Bitmap thumbnail) { - mIsHeaderImageThumbnail = true; - if (thumbnail != null) { - setHeaderImage(RevampedContextMenuController.getImageWithCheckerBackground( - mContext.getResources(), thumbnail)); - } - // TODO(sinansahin): Handle the case where the retrieval of the thumbnail fails. - } - - void onFaviconAvailable(@Nullable Bitmap icon, @ColorInt int fallbackColor, String iconUrl) { - // If we didn't get a favicon, generate a monogram instead - if (icon == null) { - RoundedIconGenerator iconGenerator = createRoundedIconGenerator(fallbackColor); - icon = iconGenerator.generateIconForUrl(iconUrl); - } - - mIsHeaderImageThumbnail = false; - final int size = mContext.getResources().getDimensionPixelSize( - R.dimen.revamped_context_menu_header_monogram_size); - - if (icon.getWidth() > size) { - icon = Bitmap.createScaledBitmap(icon, size, size, true); - } - - setHeaderImage(icon); - } - - private void setHeaderImage(Bitmap bitmap) { - // If the HeaderImage hasn't been inflated by the time we receive the bitmap, - // cache the bitmap received to be set in #getView later. - if (mHeaderImage == null) { - mHeaderBitmap = bitmap; - return; - } - - // Clear the loading background color now that we have the real image. - mHeaderImage.setRoundedFillColor(android.R.color.transparent); - - if (mIsHeaderImageThumbnail) { - mHeaderImage.setImageBitmap(bitmap); - return; - } - - ((View) mHeaderImage.getParent()) - .findViewById(R.id.circle_background) - .setVisibility(View.VISIBLE); - mHeaderImage.setImageBitmap(bitmap); - } - - private RoundedIconGenerator createRoundedIconGenerator(@ColorInt int iconColor) { - final Resources resources = mContext.getResources(); - final int iconSize = - resources.getDimensionPixelSize(R.dimen.revamped_context_menu_header_monogram_size); - final int cornerRadius = iconSize / 2; - final int textSize = resources.getDimensionPixelSize( - R.dimen.revamped_context_menu_header_monogram_text_size); - - return new RoundedIconGenerator(iconSize, iconSize, cornerRadius, iconColor, textSize); - } - - @Override - public boolean areAllItemsEnabled() { - return false; - } - - @Override - public boolean isEnabled(int position) { - return getItem(position).first - == RevampedContextMenuController.ListItemType.CONTEXT_MENU_ITEM; - } -}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/portals/PortalsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/portals/PortalsTest.java index d1bfab8..166fb957 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/portals/PortalsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/portals/PortalsTest.java
@@ -6,6 +6,7 @@ import android.support.test.InstrumentationRegistry; import android.support.test.filters.MediumTest; +import android.view.View; import org.junit.After; import org.junit.Assert; @@ -24,14 +25,17 @@ import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.content_public.browser.WebContents; +import org.chromium.content_public.browser.test.util.Coordinates; import org.chromium.content_public.browser.test.util.JavaScriptUtils; +import org.chromium.content_public.browser.test.util.TouchCommon; import org.chromium.net.test.EmbeddedTestServer; /** * Tests for the chrome/ layer support of the HTML portal element. */ @RunWith(ChromeJUnit4ClassRunner.class) -@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=Portals"}) +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=Portals", + "enable-blink-features=OverscrollCustomization"}) public class PortalsTest { @Rule public ChromeActivityTestRule<ChromeActivity> mActivityTestRule = @@ -66,6 +70,35 @@ } } + /** + * Used to observe and wait for the first layout after the tab's WebContents is swapped. + */ + private class LayoutAfterTabContentsSwappedObserver + extends EmptyTabObserver implements View.OnLayoutChangeListener { + private final CallbackHelper mCallbackHelper; + + public LayoutAfterTabContentsSwappedObserver(Tab tab) { + tab.addObserver(this); + mCallbackHelper = new CallbackHelper(); + } + + @Override + public void onWebContentsSwapped(Tab tab, boolean didStartLoad, boolean didFinishLoad) { + tab.getContentView().addOnLayoutChangeListener(this); + } + + public CallbackHelper getCallbackHelper() { + return mCallbackHelper; + } + + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, + int oldTop, int oldRight, int oldBottom) { + v.removeOnLayoutChangeListener(this); + mCallbackHelper.notifyCalled(); + } + } + private void executeScriptAndAwaitSwap(Tab tab, String code) throws Exception { TabContentsSwapObserver swapObserver = new TabContentsSwapObserver(); CallbackHelper swapWaiter = swapObserver.getCallbackHelper(); @@ -164,4 +197,46 @@ executeScriptAndAwaitSwap(tab, "reactivatePredecessor();"); JavaScriptUtils.executeJavaScriptAndWaitForResult(tab.getWebContents(), "removePortal();"); } + + /** + * Tests that a drag that started in the predecessor page causes a scroll in the activated page + * after a scroll triggered activation. + */ + @Test + @MediumTest + @Feature({"Portals"}) + public void testTouchTransfer() throws Exception { + mActivityTestRule.startMainActivityWithURL( + mTestServer.getURL("/chrome/test/data/android/portals/touch-transfer.html")); + + ChromeActivity activity = mActivityTestRule.getActivity(); + Tab tab = activity.getActivityTab(); + View contentView = tab.getContentView(); + LayoutAfterTabContentsSwappedObserver layoutObserver = + new LayoutAfterTabContentsSwappedObserver(tab); + CallbackHelper layoutWaiter = layoutObserver.getCallbackHelper(); + int currLayoutCount = layoutWaiter.getCallCount(); + + int dragStartX = 30; + int dragStartY = contentView.getHeight() / 2; + int dragPauseY = dragStartY - 30; + int dragEndX = dragStartX; + int dragEndY = 30; + long downTime = System.currentTimeMillis(); + + // Initial drag to trigger activation. + TouchCommon.dragStart(activity, dragStartX, dragStartY, downTime); + TouchCommon.dragTo(activity, dragStartX, dragEndX, dragStartY, dragPauseY, 100, downTime); + + // Wait for the first layout after tab contents are swapped. This is needed as touch events + // sent before the first layout are dropped. + layoutWaiter.waitForCallback(currLayoutCount, 1); + + // Continue and finish drag. + TouchCommon.dragTo(activity, dragStartX, dragEndX, dragPauseY, dragEndY, 100, downTime); + TouchCommon.dragEnd(activity, dragEndX, dragEndY, downTime); + + WebContents contents = mActivityTestRule.getWebContents(); + Assert.assertTrue(Coordinates.createFor(contents).getScrollYPixInt() > 0); + } }
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java index cbbe04a..c15d905 100644 --- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java +++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java
@@ -189,7 +189,8 @@ .with(TouchlessDialogProperties.ACTION_NAMES, names) .with(TouchlessDialogProperties.CANCEL_ACTION, (v) -> closeTouchlessContextMenu()) .with(TouchlessDialogProperties.LIST_MODELS, menuItems) - .with(TouchlessDialogProperties.PRIORITY, TouchlessDialogProperties.Priority.HIGH); + .with(TouchlessDialogProperties.PRIORITY, TouchlessDialogProperties.Priority.HIGH) + .with(TouchlessDialogProperties.FORCE_SINGLE_LINE_TITLE, true); if (title != null) { builder.with(ModalDialogProperties.TITLE, title); }
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogPresenter.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogPresenter.java index 359947d..e2ad00e 100644 --- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogPresenter.java +++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogPresenter.java
@@ -166,6 +166,11 @@ modelPairs.add(Pair.create(0, models[i])); } optionsAdapter.updateModels(modelPairs); + } else if (TouchlessDialogProperties.FORCE_SINGLE_LINE_TITLE == propertyKey) { + TextView textView = dialogView.findViewById(R.id.touchless_dialog_title); + textView.setMaxLines(model.get(TouchlessDialogProperties.FORCE_SINGLE_LINE_TITLE) + ? 1 + : Integer.MAX_VALUE); } }
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogProperties.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogProperties.java index f5ce3e8..77be679 100644 --- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogProperties.java +++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogProperties.java
@@ -124,11 +124,15 @@ /** The priority for this set of properties. */ public static final WritableIntPropertyKey PRIORITY = new WritableIntPropertyKey(); + /** Force the title to be a single line and truncate with an ellipsis. */ + public static final WritableBooleanPropertyKey FORCE_SINGLE_LINE_TITLE = + new WritableBooleanPropertyKey(); + public static final PropertyKey[] MINIMAL_DIALOG_KEYS = { ModalDialogProperties.TITLE, ACTION_NAMES, CANCEL_ACTION, ALT_ACTION, PRIORITY}; public static final PropertyKey[] ALL_DIALOG_KEYS = PropertyModel.concatKeys(ModalDialogProperties.ALL_KEYS, new PropertyKey[] {ACTION_NAMES, CANCEL_ACTION, ALT_ACTION, PRIORITY, - IS_FULLSCREEN, LIST_MODELS}); + IS_FULLSCREEN, LIST_MODELS, FORCE_SINGLE_LINE_TITLE}); }
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java index 4df2885..f896e9f 100644 --- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java +++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java
@@ -390,6 +390,7 @@ if (startedActivityExtras != null) { relaunchIntent.putExtras(startedActivityExtras); } + relaunchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mAppContext.startActivity(relaunchIntent); continue; }
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 815a6003..57758860 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -486,6 +486,8 @@ "external_protocol/external_protocol_observer.h", "favicon/chrome_favicon_client.cc", "favicon/chrome_favicon_client.h", + "favicon/favicon_request_handler_factory.cc", + "favicon/favicon_request_handler_factory.h", "favicon/favicon_service_factory.cc", "favicon/favicon_service_factory.h", "favicon/favicon_utils.cc", @@ -3038,6 +3040,8 @@ "memory/swap_thrashing_monitor_delegate.h", "memory/swap_thrashing_monitor_delegate_win.cc", "memory/swap_thrashing_monitor_delegate_win.h", + "metrics/desktop_platform_features_metrics_provider.cc", + "metrics/desktop_platform_features_metrics_provider.h", "metrics/desktop_session_duration/audible_contents_tracker.cc", "metrics/desktop_session_duration/audible_contents_tracker.h", "metrics/desktop_session_duration/chrome_visibility_observer.cc",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index 84b5578..48cd7fc 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -230,4 +230,8 @@ "input_method_manager_impl.cc": [ "+ash/keyboard/ui/keyboard_controller.h", ], + "chrome_browsing_data_remover_delegate_unittest.cc": [ + "+services/network/network_context.h", + "+services/network/network_service.h", + ], }
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index b6747f0d..feab02c0 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1944,6 +1944,10 @@ flag_descriptions::kOnTheFlyMhtmlHashComputationName, flag_descriptions::kOnTheFlyMhtmlHashComputationDescription, kOsAndroid, FEATURE_VALUE_TYPE(offline_pages::kOnTheFlyMhtmlHashComputationFeature)}, + {"android-picture-in-picture-api", + flag_descriptions::kAndroidPictureInPictureAPIName, + flag_descriptions::kAndroidPictureInPictureAPIDescription, kOsAndroid, + FEATURE_VALUE_TYPE(media::kPictureInPictureAPI)}, #endif // OS_ANDROID {"disallow-doc-written-script-loads", flag_descriptions::kDisallowDocWrittenScriptsUiName,
diff --git a/chrome/browser/android/favicon_helper.cc b/chrome/browser/android/favicon_helper.cc index 72cc16cf..b253ac0b 100644 --- a/chrome/browser/android/favicon_helper.cc +++ b/chrome/browser/android/favicon_helper.cc
@@ -16,8 +16,8 @@ #include "base/bind.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "chrome/browser/favicon/favicon_request_handler_factory.h" #include "chrome/browser/favicon/favicon_service_factory.h" -#include "chrome/browser/favicon/large_icon_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_android.h" #include "chrome/browser/sync/profile_sync_service_factory.h" @@ -80,17 +80,14 @@ env, j_availability_callback, newly_available); } -sync_sessions::OpenTabsUIDelegate* GetOpenTabsUIDelegate(Profile* profile) { - sync_sessions::SessionSyncService* session_sync_service = - SessionSyncServiceFactory::GetInstance()->GetForProfile(profile); - DCHECK(session_sync_service); - return session_sync_service->GetOpenTabsUIDelegate(); -} - scoped_refptr<base::RefCountedMemory> GetSyncedFaviconForPageURL( Profile* profile, const GURL& page_url) { - sync_sessions::OpenTabsUIDelegate* open_tabs = GetOpenTabsUIDelegate(profile); + sync_sessions::SessionSyncService* session_sync_service = + SessionSyncServiceFactory::GetInstance()->GetForProfile(profile); + DCHECK(session_sync_service); + sync_sessions::OpenTabsUIDelegate* open_tabs = + session_sync_service->GetOpenTabsUIDelegate(); return open_tabs ? open_tabs->GetSyncedFaviconForPageURL(page_url.spec()) : nullptr; } @@ -173,17 +170,22 @@ GURL page_url(ConvertJavaStringToUTF8(env, j_page_url)); - sync_sessions::OpenTabsUIDelegate* open_tabs = GetOpenTabsUIDelegate(profile); - // TODO(victorvianna): Consider passing icon types to the API. - favicon_request_handler_.GetRawFaviconForPageURL( + sync_sessions::SessionSyncService* session_sync_service = + SessionSyncServiceFactory::GetInstance()->GetForProfile(profile); + DCHECK(session_sync_service); + sync_sessions::OpenTabsUIDelegate* open_tabs = + session_sync_service->GetOpenTabsUIDelegate(); + favicon::FaviconRequestHandler* favicon_request_handler = + FaviconRequestHandlerFactory::GetForBrowserContext(profile); + // Can be null in tests. + if (!favicon_request_handler) + return false; + favicon_request_handler->GetRawFaviconForPageURL( page_url, static_cast<int>(j_desired_size_in_pixel), base::BindOnce(&OnFaviconBitmapResultAvailable, ScopedJavaGlobalRef<jobject>(j_favicon_image_callback)), favicon::FaviconRequestOrigin::RECENTLY_CLOSED_TABS, favicon::FaviconRequestPlatform::kMobile, - FaviconServiceFactory::GetForProfile(profile, - ServiceAccessType::EXPLICIT_ACCESS), - LargeIconServiceFactory::GetForBrowserContext(profile), /*icon_url_for_uma=*/ open_tabs ? open_tabs->GetIconUrlForPageUrl(page_url) : GURL(), base::BindOnce(&GetSyncedFaviconForPageURL, profile),
diff --git a/chrome/browser/android/favicon_helper.h b/chrome/browser/android/favicon_helper.h index 3964211..e6054d6 100644 --- a/chrome/browser/android/favicon_helper.h +++ b/chrome/browser/android/favicon_helper.h
@@ -13,7 +13,6 @@ #include "base/gtest_prod_util.h" #include "base/macros.h" #include "base/task/cancelable_task_tracker.h" -#include "components/favicon/core/favicon_request_handler.h" #include "components/favicon_base/favicon_types.h" #include "url/gurl.h" @@ -84,8 +83,6 @@ static size_t GetLargestSizeIndex(const std::vector<gfx::Size>& sizes); - favicon::FaviconRequestHandler favicon_request_handler_; - std::unique_ptr<base::CancelableTaskTracker> cancelable_task_tracker_; virtual ~FaviconHelper();
diff --git a/chrome/browser/autofill/automated_tests/cache_replayer.cc b/chrome/browser/autofill/automated_tests/cache_replayer.cc index e165fa6a..b855ecbb 100644 --- a/chrome/browser/autofill/automated_tests/cache_replayer.cc +++ b/chrome/browser/autofill/automated_tests/cache_replayer.cc
@@ -14,6 +14,7 @@ #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" #include "base/test/bind_test_util.h" #include "base/values.h" #include "services/network/public/cpp/data_element.h" @@ -153,6 +154,24 @@ return true; } +// TODO(crbug/958125): Add the possibility to retrieve nodes with different +// Query URLs. +// Finds the Autofill server Query node in dictionary node. Gives nullptr if +// cannot find the node or |domain_dict| is invalid. +const base::Value* FindAutofillQueryNodeInDomainDict( + const base::Value& domain_dict) { + if (!domain_dict.is_dict()) { + return nullptr; + } + for (const auto& pair : domain_dict.DictItems()) { + if (pair.first.find("https://clients1.google.com/tbproxy/af/query") != + std::string::npos) { + return &pair.second; + } + } + return nullptr; +} + // Populates the cache mapping request keys to their corresponding compressed // response. bool PopulateCacheFromJSONFile(const base::FilePath& json_file_path, @@ -194,11 +213,11 @@ root_node = std::move(value_with_error.value.value()); } + // TODO(crbug/958136): It should tolerate a cache with no Queries. // Get requests node and populate the cache. { - const base::Value* requests_node = - root_node.FindPath({"Requests", "clients1.google.com", - "https://clients1.google.com/tbproxy/af/query?"}); + const base::Value* requests_node = FindAutofillQueryNodeInDomainDict( + *root_node.FindPath({"Requests", "clients1.google.com"})); if (!CheckNodeValidity(requests_node, "Requests->clients1.google.com->https://" "clients1.google.com/tbproxy/af/query?", @@ -213,6 +232,15 @@ return true; } +// Gets a hexadecimal representation of a string. +std::string GetHexString(const std::string& input) { + std::string output("0x"); + for (auto byte : input) { + base::StringAppendF(&output, "%02x", static_cast<unsigned char>(byte)); + } + return output; +} + // Decompressed HTTP response read from WPR capture file. Will set // |decompressed_http| to "" and return false if there is an error. bool DecompressHTTPResponse(const std::string& http_text, @@ -226,7 +254,7 @@ // Look if there is a body to decompress, if not just return HTTP text as is. if (header_and_body.second == "") { *decompressed_http = http_text; - VLOG(1) << "There is no HTTP body to decompress: " << http_text; + VLOG(1) << "There is no HTTP body to decompress" << http_text; return true; } // TODO(crbug.com/945925): Add compression format detection, return an @@ -236,7 +264,7 @@ if (!compression::GzipUncompress(header_and_body.second, &decompressed_body)) { VLOG(1) << "Could not gzip decompress HTTP response: " - << header_and_body.second; + << GetHexString(header_and_body.second); return false; } // Rebuild the response HTTP text by using the new decompressed body. @@ -293,7 +321,10 @@ ServerCacheReplayer::ServerCacheReplayer(const base::FilePath& json_file_path, int options) { - DCHECK(PopulateCacheFromJSONFile(json_file_path, options, &cache_)) + // Using CHECK is fine here since ServerCacheReplayer will only be used for + // testing and we prefer the test to crash than being in an inconsistent state + // when the cache could not be properly populated from the JSON file. + CHECK(PopulateCacheFromJSONFile(json_file_path, options, &cache_)) << "could not populate cache from invalid json"; } @@ -317,7 +348,7 @@ // mutation done when there is concurrency. const std::string& http_response = const_cache_.at(key); if (!DecompressHTTPResponse(http_response, &decompressed_http_response)) { - VLOG(1) << "Could not decompress " << http_response; + VLOG(1) << "Could not decompress http response"; return false; } *http_text = decompressed_http_response; @@ -331,7 +362,10 @@ [&](content::URLLoaderInterceptor::RequestParams* params) -> bool { return InterceptAutofillRequest(params); })) { - DCHECK(cache_replayer_ != nullptr); + // Using CHECK is fine here since ServerCacheReplayer will only be used for + // testing and we prefer the test to crash with a CHECK rather than + // segfaulting with a stack trace that can be hard to read. + CHECK(cache_replayer_); } ServerUrlLoader::~ServerUrlLoader() {} @@ -351,14 +385,32 @@ // Parse HTTP request body to proto. VLOG(1) << "Intercepted in-flight request to Autofill Server: " << resource_request.url.spec(); + + // TODO(crbug/958158): Extract URL content for GET Query requests. + // Look if the body has data. + if (resource_request.request_body == nullptr) { + constexpr char kNoBodyHTTPErrorHeaders[] = "HTTP/2.0 400 Bad Request"; + constexpr char kNoBodyHTTPErrorBody[] = + "there is no body data in the request"; + VLOG(1) << "Served Autofill error response: " << kNoBodyHTTPErrorBody; + content::URLLoaderInterceptor::WriteResponse( + std::string(kNoBodyHTTPErrorHeaders), std::string(kNoBodyHTTPErrorBody), + params->client.get()); + return true; + } + std::string http_body = GetStringFromDataElements(resource_request.request_body->elements()); AutofillQueryContents query_request; - query_request.ParseFromString(http_body); - DCHECK(query_request.ParseFromString(http_body)) + // Using CHECK is fine here since ServerCacheReplayer will only be used for + // testing and we prefer the test to crash rather than missing the cache + // because the HTTP body could not be parsed back to a Query request proto, + // which can be caused by bad data in the request from the browser during + // capture replay. + CHECK(query_request.ParseFromString(http_body)) << "could not parse HTTP request body to AutofillQueryContents " "proto: " - << http_body; + << GetHexString(http_body); // Get response from cache using query request proto as key. std::string http_response; @@ -367,7 +419,7 @@ constexpr char kNoKeyMatchHTTPErrorHeaders[] = "HTTP/2.0 404 Not Found"; constexpr char kNoKeyMatchHTTPErrorBody[] = "could not find response matching request"; - VLOG(1) << kNoKeyMatchHTTPErrorBody << ": " << http_body; + VLOG(1) << "Served Autofill error response: " << kNoKeyMatchHTTPErrorBody; content::URLLoaderInterceptor::WriteResponse( std::string(kNoKeyMatchHTTPErrorHeaders), std::string(kNoKeyMatchHTTPErrorBody), params->client.get());
diff --git a/chrome/browser/autofill/automated_tests/cache_replayer_unittest.cc b/chrome/browser/autofill/automated_tests/cache_replayer_unittest.cc new file mode 100644 index 0000000..cd1d485c --- /dev/null +++ b/chrome/browser/autofill/automated_tests/cache_replayer_unittest.cc
@@ -0,0 +1,275 @@ +// Copyright 2019 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/autofill/automated_tests/cache_replayer.h" + +#include <memory> +#include <utility> +#include <vector> + +#include "base/base64.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" +#include "base/json/json_writer.h" +#include "base/strings/string_util.h" +#include "base/values.h" +#include "build/build_config.h" +#include "components/autofill/core/browser/proto/server.pb.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/zlib/google/compression_utils.h" + +namespace autofill { +namespace test { +namespace { + +// Only run these tests on Linux because there are issues with other platforms. +// Testing on one platform gives enough confidence. +#if defined(OS_LINUX) + +using base::JSONWriter; +using base::Value; + +using RequestResponsePair = + std::pair<AutofillQueryContents, AutofillQueryResponseContents>; + +constexpr char kTestHTTPRequestHeader[] = "Fake HTTP Request Header"; +constexpr char kTestHTTPResponseHeader[] = "Fake HTTP Response Header"; +constexpr char kHTTPBodySep[] = "\r\n\r\n"; + +struct LightField { + uint32_t signature; + uint32_t prediction; +}; + +struct LightForm { + uint64_t signature; + std::vector<LightField> fields; +}; + +RequestResponsePair MakeQueryRequestResponsePair( + const std::vector<LightForm>& forms) { + AutofillQueryContents query; + query.set_client_version("Chrome Test"); + AutofillQueryResponseContents query_response; + for (const auto& form : forms) { + auto* added_form = query.add_form(); + added_form->set_signature(form.signature); + for (const auto& field : form.fields) { + added_form->add_field()->set_signature(field.signature); + query_response.add_field()->set_overall_type_prediction(field.prediction); + } + } + return RequestResponsePair({std::move(query), std::move(query_response)}); +} + +std::string MakeSerializedRequest(const AutofillQueryContents& query) { + std::string serialized_query; + query.SerializeToString(&serialized_query); + // TODO(vincb): Put a real header here. + std::string http_text = base::JoinString( + std::vector<std::string>{kTestHTTPRequestHeader, serialized_query}, + kHTTPBodySep); + std::string encoded_http_text; + base::Base64Encode(http_text, &encoded_http_text); + return encoded_http_text; +} + +std::string MakeSerializedResponse( + const AutofillQueryResponseContents& query_response) { + std::string serialized_query; + query_response.SerializeToString(&serialized_query); + std::string compressed_query; + compression::GzipCompress(serialized_query, &compressed_query); + // TODO(vincb): Put a real header here. + std::string http_text = base::JoinString( + std::vector<std::string>{kTestHTTPResponseHeader, compressed_query}, + kHTTPBodySep); + std::string encoded_http_text; + base::Base64Encode(http_text, &encoded_http_text); + return encoded_http_text; +} + +bool WriteJSON(const base::FilePath& file_path, + const std::vector<RequestResponsePair>& request_response_pairs) { + // Make json list node that contains all query requests. + Value::ListStorage autofill_requests; + for (const auto& request_response_pair : request_response_pairs) { + Value::DictStorage request_response_node; + request_response_node["SerializedRequest"] = std::make_unique<Value>( + MakeSerializedRequest(request_response_pair.first)); + request_response_node["SerializedResponse"] = std::make_unique<Value>( + MakeSerializedResponse(request_response_pair.second)); + autofill_requests.push_back(Value(std::move(request_response_node))); + } + + // Make json dict node that contains Autofill Server requests per URL. + base::Value::DictStorage urls_dict; + urls_dict["https://clients1.google.com/tbproxy/af/query?"] = + std::make_unique<Value>(std::move(autofill_requests)); + + // Make json dict node that contains requests per domain. + base::Value::DictStorage domains_dict; + domains_dict["clients1.google.com"] = + std::make_unique<Value>(std::move(urls_dict)); + + // Make json root dict. + base::Value::DictStorage root_dict; + root_dict["Requests"] = std::make_unique<Value>(std::move(domains_dict)); + + std::string json_text; + JSONWriter::WriteWithOptions(Value(std::move(root_dict)), + JSONWriter::Options::OPTIONS_PRETTY_PRINT, + &json_text); + + std::string compressed_json_text; + if (!compression::GzipCompress(json_text, &compressed_json_text)) { + VLOG(1) << "Cannot compress json to gzip."; + return false; + } + + if (base::WriteFile(file_path, compressed_json_text.data(), + compressed_json_text.size()) == -1) { + VLOG(1) << "Could not write json at file: " << file_path; + return false; + } + return true; +} + +// TODO(vincb): Add extra death tests. +TEST(AutofillCacheReplayerDeathTest, + ServerCacheReplayerConstructorCrashesWhenCannotParseJSON) { + // Make death test threadsafe. + testing::FLAGS_gtest_death_test_style = "threadsafe"; + + // Make writable file path. + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + const base::FilePath file_path = + temp_dir.GetPath().AppendASCII("test_wpr_capture.json"); + + // JSON structure is not right. + const std::string invalid_json = "{\"Requests\": \"invalid_field\"}"; + + // Write json to file. + ASSERT_TRUE( + base::WriteFile(file_path, invalid_json.data(), invalid_json.size()) > -1) + << "there was an error when writing content to json file: " << file_path; + + // Crash since json content is invalid. + ASSERT_DEATH_IF_SUPPORTED( + ServerCacheReplayer(file_path, + ServerCacheReplayer::kOptionFailOnInvalidJsonRecord), + ".*"); +} + +TEST(AutofillCacheReplayerTest, GetResponseForQueryFillsResponseWhenNoErrors) { + // Make writable file path. + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + base::FilePath file_path = + temp_dir.GetPath().AppendASCII("test_wpr_capture.json"); + + // Make request/response pairs to write in cache. + std::vector<RequestResponsePair> request_response_pairs; + { + LightForm form_to_add; + form_to_add.signature = 1234; + form_to_add.fields = {LightField{1234, 1}}; + request_response_pairs.push_back( + MakeQueryRequestResponsePair({form_to_add})); + } + + // Write cache to json. + ASSERT_TRUE(WriteJSON(file_path, request_response_pairs)); + + ServerCacheReplayer cache_replayer( + file_path, ServerCacheReplayer::kOptionFailOnInvalidJsonRecord); + + // Verify if we can get cached response. + std::string http_text_response; + ASSERT_TRUE(cache_replayer.GetResponseForQuery( + request_response_pairs[0].first, &http_text_response)); + AutofillQueryResponseContents response_from_cache; + ASSERT_TRUE(response_from_cache.ParseFromString( + SplitHTTP(http_text_response).second)); +} + +TEST(AutofillCacheReplayerTest, GetResponseForQueryGivesFalseWhenNullptr) { + ServerCacheReplayer cache_replayer(ServerCache{{}}); + EXPECT_FALSE( + cache_replayer.GetResponseForQuery(AutofillQueryContents(), nullptr)); +} + +TEST(AutofillCacheReplayerTest, GetResponseForQueryGivesFalseWhenNoKeyMatch) { + // Make writable file path. + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + base::FilePath file_path = + temp_dir.GetPath().AppendASCII("test_wpr_capture.json"); + + // Make request/response pairs to write in cache. + std::vector<RequestResponsePair> request_response_pairs; + { + LightForm form_to_add; + form_to_add.signature = 1234; + form_to_add.fields = {LightField{1234, 1}}; + request_response_pairs.push_back( + MakeQueryRequestResponsePair({form_to_add})); + } + + // Write cache to json and create replayer. + ASSERT_TRUE(WriteJSON(file_path, request_response_pairs)); + ServerCacheReplayer cache_replayer( + file_path, ServerCacheReplayer::kOptionFailOnInvalidJsonRecord); + + // Verify if we get false when there is no cache for the query. + std::string http_text; + AutofillQueryContents query_with_no_match; + EXPECT_FALSE( + cache_replayer.GetResponseForQuery(query_with_no_match, &http_text)); +} + +TEST(AutofillCacheReplayerTest, + GetResponseForQueryGivesFalseWhenDecompressFailsBecauseInvalidHTTP) { + // Make query request and key. + LightForm form_to_add; + form_to_add.signature = 1234; + form_to_add.fields = {LightField{1234, 1}}; + const AutofillQueryContents query_request_for_key = + MakeQueryRequestResponsePair({form_to_add}).first; + const std::string key = GetKeyFromQueryRequest(query_request_for_key); + + const char invalid_http[] = ""; + ServerCacheReplayer cache_replayer(ServerCache{{key, invalid_http}}); + + // Verify if we get false when invalid HTTP response to decompress. + std::string response_http_text; + EXPECT_FALSE(cache_replayer.GetResponseForQuery(query_request_for_key, + &response_http_text)); +} + +TEST(AutofillCacheReplayerTest, + GetResponseForQueryGivesTrueWhenDecompressSucceededBecauseEmptyBody) { + // Make query request and key. + LightForm form_to_add; + form_to_add.signature = 1234; + form_to_add.fields = {LightField{1234, 1}}; + const AutofillQueryContents query_request_for_key = + MakeQueryRequestResponsePair({form_to_add}).first; + const std::string key = GetKeyFromQueryRequest(query_request_for_key); + + const char http_without_body[] = "Test HTTP Header\r\n\r\n"; + ServerCacheReplayer cache_replayer(ServerCache{{key, http_without_body}}); + + // Verify if we get true when no HTTP body. + std::string response_http_text; + EXPECT_TRUE(cache_replayer.GetResponseForQuery(query_request_for_key, + &response_http_text)); +} +#endif // if defined(OS_LINUX) + +} // namespace +} // namespace test +} // namespace autofill
diff --git a/chrome/browser/browser_process_platform_part_chromeos.cc b/chrome/browser/browser_process_platform_part_chromeos.cc index c78ed1b..e65af396 100644 --- a/chrome/browser/browser_process_platform_part_chromeos.cc +++ b/chrome/browser/browser_process_platform_part_chromeos.cc
@@ -9,6 +9,7 @@ #include "ash/public/interfaces/constants.mojom.h" #include "base/bind.h" #include "base/logging.h" +#include "base/memory/singleton.h" #include "base/time/default_tick_clock.h" #include "base/time/tick_clock.h" #include "chrome/browser/browser_process.h" @@ -35,6 +36,7 @@ #include "chromeos/timezone/timezone_resolver.h" #include "components/keep_alive_registry/keep_alive_types.h" #include "components/keep_alive_registry/scoped_keep_alive.h" +#include "components/keyed_service/content/browser_context_keyed_service_shutdown_notifier_factory.h" #include "components/session_manager/core/session_manager.h" #include "components/user_manager/user_manager.h" #include "content/public/common/service_manager_connection.h" @@ -44,6 +46,30 @@ #include "services/service_manager/public/cpp/interface_provider.h" #include "services/service_manager/public/cpp/service.h" +namespace { + +class PrimaryProfileServicesShutdownNotifierFactory + : public BrowserContextKeyedServiceShutdownNotifierFactory { + public: + static PrimaryProfileServicesShutdownNotifierFactory* GetInstance() { + return base::Singleton< + PrimaryProfileServicesShutdownNotifierFactory>::get(); + } + + private: + friend struct base::DefaultSingletonTraits< + PrimaryProfileServicesShutdownNotifierFactory>; + + PrimaryProfileServicesShutdownNotifierFactory() + : BrowserContextKeyedServiceShutdownNotifierFactory( + "PrimaryProfileServices") {} + ~PrimaryProfileServicesShutdownNotifierFactory() override {} + + DISALLOW_COPY_AND_ASSIGN(PrimaryProfileServicesShutdownNotifierFactory); +}; + +} // namespace + BrowserProcessPlatformPart::BrowserProcessPlatformPart() : created_profile_helper_(false), account_manager_factory_( @@ -124,7 +150,7 @@ } void BrowserProcessPlatformPart::InitializePrimaryProfileServices( - const Profile* primary_profile) { + Profile* primary_profile) { DCHECK(primary_profile); const user_manager::User* primary_user = chromeos::ProfileHelper::Get()->GetUserByProfile(primary_profile); @@ -134,11 +160,15 @@ kerberos_credentials_manager_ = std::make_unique<chromeos::KerberosCredentialsManager>( g_browser_process->local_state(), primary_user); + primary_profile_shutdown_subscription_ = + PrimaryProfileServicesShutdownNotifierFactory::GetInstance() + ->Get(primary_profile) + ->Subscribe(base::Bind( + &BrowserProcessPlatformPart::ShutdownPrimaryProfileServices, + base::Unretained(this))); } void BrowserProcessPlatformPart::ShutdownPrimaryProfileServices() { - // Note: This might be called even if InitializePrimaryProfileServices() - // wasn't called, e.g. if something during initialization went wrong. kerberos_credentials_manager_.reset(); }
diff --git a/chrome/browser/browser_process_platform_part_chromeos.h b/chrome/browser/browser_process_platform_part_chromeos.h index 67a4d39..5ad1879b 100644 --- a/chrome/browser/browser_process_platform_part_chromeos.h +++ b/chrome/browser/browser_process_platform_part_chromeos.h
@@ -12,6 +12,7 @@ #include "base/macros.h" #include "base/sequence_checker.h" #include "chrome/browser/browser_process_platform_part_base.h" +#include "components/keyed_service/core/keyed_service_shutdown_notifier.h" class BrowserProcessPlatformPartTestApi; class Profile; @@ -65,13 +66,13 @@ // Initializes all services that need the primary profile. Gets called as soon // as the primary profile is available, which implies that the primary user - // has logged in. + // has logged in. The services are shut down automatically when the primary + // profile is destroyed. // Use this for simple 'leaf-type' services with no or negligible inter- // dependencies. If your service has more complex dependencies, consider using // a BrowserContextKeyedService and restricting service creation to the // primary profile. - void InitializePrimaryProfileServices(const Profile* primary_profile); - void ShutdownPrimaryProfileServices(); + void InitializePrimaryProfileServices(Profile* primary_profile); // Disable the offline interstitial easter egg if the device is enterprise // enrolled. @@ -127,6 +128,8 @@ void CreateProfileHelper(); + void ShutdownPrimaryProfileServices(); + std::unique_ptr<chromeos::ChromeSessionManager> session_manager_; bool created_profile_helper_; @@ -161,6 +164,9 @@ std::unique_ptr<chromeos::KerberosCredentialsManager> kerberos_credentials_manager_; + std::unique_ptr<KeyedServiceShutdownNotifier::Subscription> + primary_profile_shutdown_subscription_; + SEQUENCE_CHECKER(sequence_checker_); DISALLOW_COPY_AND_ASSIGN(BrowserProcessPlatformPart);
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 1f957e34..51f62650 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
@@ -86,6 +86,7 @@ #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browsing_data_filter_builder.h" #include "content/public/browser/browsing_data_remover.h" +#include "content/public/browser/network_service_instance.h" #include "content/public/test/browsing_data_remover_test_util.h" #include "content/public/test/mock_download_manager.h" #include "content/public/test/test_browser_thread_bundle.h" @@ -94,8 +95,9 @@ #include "net/http/http_transaction_factory.h" #include "net/net_buildflags.h" #include "net/url_request/url_request_context.h" -#include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_test_util.h" +#include "services/network/network_context.h" +#include "services/network/network_service.h" #include "services/network/public/mojom/cookie_manager.mojom.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/favicon_size.h" @@ -579,21 +581,6 @@ DISALLOW_COPY_AND_ASSIGN(RemovePasswordsTester); }; -// Implementation of the TestingProfile that has the neccessary services for -// BrowsingDataRemover. -class BrowsingDataTestingProfile : public TestingProfile { - public: - BrowsingDataTestingProfile() {} - ~BrowsingDataTestingProfile() override {} - - content::SSLHostStateDelegate* GetSSLHostStateDelegate() override { - return ChromeSSLHostStateDelegateFactory::GetForProfile(this); - } - - private: - DISALLOW_COPY_AND_ASSIGN(BrowsingDataTestingProfile); -}; - class RemovePermissionPromptCountsTest { public: explicit RemovePermissionPromptCountsTest(TestingProfile* profile) @@ -1019,28 +1006,25 @@ class ClearReportingCacheTester { public: - ClearReportingCacheTester(TestingProfile* profile, bool create_service) - : profile_(profile) { + ClearReportingCacheTester(network::NetworkContext* network_context, + bool create_service) + : url_request_context_(network_context->url_request_context()) { if (create_service) service_ = std::make_unique<MockReportingService>(); - net::URLRequestContext* request_context = - profile_->GetRequestContext()->GetURLRequestContext(); - old_service_ = request_context->reporting_service(); - request_context->set_reporting_service(service_.get()); + old_service_ = url_request_context_->reporting_service(); + url_request_context_->set_reporting_service(service_.get()); } ~ClearReportingCacheTester() { - net::URLRequestContext* request_context = - profile_->GetRequestContext()->GetURLRequestContext(); - DCHECK_EQ(service_.get(), request_context->reporting_service()); - request_context->set_reporting_service(old_service_); + DCHECK_EQ(service_.get(), url_request_context_->reporting_service()); + url_request_context_->set_reporting_service(old_service_); } const MockReportingService& mock() { return *service_; } private: - TestingProfile* profile_; + net::URLRequestContext* url_request_context_; std::unique_ptr<MockReportingService> service_; net::ReportingService* old_service_; }; @@ -1092,28 +1076,25 @@ class ClearNetworkErrorLoggingTester { public: - ClearNetworkErrorLoggingTester(TestingProfile* profile, bool create_service) - : profile_(profile) { + ClearNetworkErrorLoggingTester(network::NetworkContext* network_context, + bool create_service) + : url_request_context_(network_context->url_request_context()) { if (create_service) service_ = std::make_unique<MockNetworkErrorLoggingService>(); - net::URLRequestContext* request_context = - profile_->GetRequestContext()->GetURLRequestContext(); - - request_context->set_network_error_logging_service(service_.get()); + url_request_context_->set_network_error_logging_service(service_.get()); } ~ClearNetworkErrorLoggingTester() { - net::URLRequestContext* request_context = - profile_->GetRequestContext()->GetURLRequestContext(); - DCHECK_EQ(service_.get(), request_context->network_error_logging_service()); - request_context->set_network_error_logging_service(nullptr); + DCHECK_EQ(service_.get(), + url_request_context_->network_error_logging_service()); + url_request_context_->set_network_error_logging_service(nullptr); } const MockNetworkErrorLoggingService& mock() { return *service_; } private: - TestingProfile* profile_; + net::URLRequestContext* url_request_context_; std::unique_ptr<MockNetworkErrorLoggingService> service_; DISALLOW_COPY_AND_ASSIGN(ClearNetworkErrorLoggingTester); @@ -1143,6 +1124,17 @@ : profile_(new BrowsingDataRemoverTestingProfile()) { remover_ = content::BrowserContext::GetBrowsingDataRemover(profile_.get()); + // Make sure the Network Service is started before making a NetworkContext. + content::GetNetworkService(); + thread_bundle_.RunUntilIdle(); + + auto network_context = std::make_unique<network::NetworkContext>( + network::NetworkService::GetNetworkServiceForTesting(), + mojo::MakeRequest(&network_context_ptr_), + network::mojom::NetworkContextParams::New()); + network_context_ = network_context.get(); + profile_->SetNetworkContext(std::move(network_context)); + ProtocolHandlerRegistryFactory::GetInstance()->SetTestingFactory( profile_.get(), base::BindRepeating(&BuildProtocolHandlerRegistry)); @@ -1223,6 +1215,8 @@ return remover_->GetLastUsedOriginTypeMask(); } + network::NetworkContext* network_context() { return network_context_; } + TestingProfile* GetProfile() { return profile_.get(); } @@ -1239,6 +1233,8 @@ content::BrowsingDataRemover* remover_; content::TestBrowserThreadBundle thread_bundle_; + network::mojom::NetworkContextPtr network_context_ptr_; + network::NetworkContext* network_context_; std::unique_ptr<TestingProfile> profile_; DISALLOW_COPY_AND_ASSIGN(ChromeBrowsingDataRemoverDelegateTest); @@ -2419,9 +2415,8 @@ // Test that removing passwords clears HTTP auth data. TEST_F(ChromeBrowsingDataRemoverDelegateTest, ClearHttpAuthCache_RemovePasswords) { - net::HttpNetworkSession* http_session = GetProfile() - ->GetRequestContext() - ->GetURLRequestContext() + net::HttpNetworkSession* http_session = network_context() + ->url_request_context() ->http_transaction_factory() ->GetSession(); DCHECK(http_session); @@ -2761,7 +2756,7 @@ #if BUILDFLAG(ENABLE_REPORTING) TEST_F(ChromeBrowsingDataRemoverDelegateTest, ReportingCache_NoService) { - ClearReportingCacheTester tester(GetProfile(), false); + ClearReportingCacheTester tester(network_context(), false); BlockUntilBrowsingDataRemoved( base::Time(), base::Time::Max(), @@ -2772,7 +2767,7 @@ } TEST_F(ChromeBrowsingDataRemoverDelegateTest, ReportingCache) { - ClearReportingCacheTester tester(GetProfile(), true); + ClearReportingCacheTester tester(network_context(), true); BlockUntilBrowsingDataRemoved( base::Time(), base::Time::Max(), @@ -2790,7 +2785,7 @@ // a filterable datatype. TEST_F(ChromeBrowsingDataRemoverDelegateTest, DISABLED_ReportingCache_WithFilter) { - ClearReportingCacheTester tester(GetProfile(), true); + ClearReportingCacheTester tester(network_context(), true); std::unique_ptr<BrowsingDataFilterBuilder> builder( BrowsingDataFilterBuilder::Create(BrowsingDataFilterBuilder::WHITELIST)); @@ -2809,7 +2804,7 @@ } TEST_F(ChromeBrowsingDataRemoverDelegateTest, NetworkErrorLogging_NoDelegate) { - ClearNetworkErrorLoggingTester tester(GetProfile(), false); + ClearNetworkErrorLoggingTester tester(network_context(), false); BlockUntilBrowsingDataRemoved( base::Time(), base::Time::Max(), @@ -2821,7 +2816,7 @@ // This would use an origin filter, but history isn't yet filterable. TEST_F(ChromeBrowsingDataRemoverDelegateTest, NetworkErrorLogging_History) { - ClearNetworkErrorLoggingTester tester(GetProfile(), true); + ClearNetworkErrorLoggingTester tester(network_context(), true); BlockUntilBrowsingDataRemoved( base::Time(), base::Time::Max(),
diff --git a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.cc b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.cc index 5da1670..2f473e08 100644 --- a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.cc +++ b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.cc
@@ -306,6 +306,10 @@ return nullptr; } +bool AXTreeSourceArc::IsIgnored(ArcAccessibilityInfoData* info_data) const { + return false; +} + bool AXTreeSourceArc::IsValid(ArcAccessibilityInfoData* info_data) const { return info_data; }
diff --git a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h index e85531f..504651c 100644 --- a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h +++ b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h
@@ -97,6 +97,7 @@ void GetChildren( ArcAccessibilityInfoData* info_data, std::vector<ArcAccessibilityInfoData*>* out_children) const override; + bool IsIgnored(ArcAccessibilityInfoData* info_data) const override; bool IsValid(ArcAccessibilityInfoData* info_data) const override; bool IsEqual(ArcAccessibilityInfoData* info_data1, ArcAccessibilityInfoData* info_data2) const override;
diff --git a/chrome/browser/chromeos/assistant/assistant_util.cc b/chrome/browser/chromeos/assistant/assistant_util.cc index b2f51411..a2b14e1 100644 --- a/chrome/browser/chromeos/assistant/assistant_util.cc +++ b/chrome/browser/chromeos/assistant/assistant_util.cc
@@ -6,10 +6,12 @@ #include <string> +#include "ash/public/interfaces/voice_interaction_controller.mojom-shared.h" #include "chrome/browser/chromeos/login/demo_mode/demo_session.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/ui/ash/assistant/assistant_pref_util.h" #include "chromeos/constants/chromeos_switches.h" #include "components/language/core/browser/pref_names.h" #include "components/prefs/pref_service.h" @@ -84,11 +86,14 @@ return ash::mojom::AssistantAllowedState::DISALLOWED_BY_LOCALE; } + if (prefs->GetBoolean(::assistant::prefs::kAssistantDisabledByPolicy)) + return ash::mojom::AssistantAllowedState::DISALLOWED_BY_POLICY; + // Bypass the account type check when using fake gaia login, e.g. in Tast // tests, or the account is logged in a device with a physical Assistant key // on keyboard. if (!chromeos::switches::IsGaiaServicesDisabled() && - !ui::DeviceUsesKeyboardLayout2()) { + !ui::DeviceKeyboardHasAssistantKey()) { // Only enable non-dasher accounts for devices without physical key. bool account_supported = false; auto* identity_manager =
diff --git a/chrome/browser/chromeos/lock_screen_apps/state_controller.cc b/chrome/browser/chromeos/lock_screen_apps/state_controller.cc index 92d6a65..a322bf6 100644 --- a/chrome/browser/chromeos/lock_screen_apps/state_controller.cc +++ b/chrome/browser/chromeos/lock_screen_apps/state_controller.cc
@@ -39,7 +39,7 @@ #include "extensions/browser/app_window/native_app_window.h" #include "extensions/common/extension.h" #include "services/service_manager/public/cpp/connector.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/wm/core/window_animations.h" using ash::mojom::CloseLockScreenNoteReason; @@ -231,7 +231,7 @@ first_app_run_toast_manager_ = std::make_unique<FirstAppRunToastManager>(profile); - input_devices_observer_.Add(ui::InputDeviceManager::GetInstance()); + input_devices_observer_.Add(ui::DeviceDataManager::GetInstance()); // Do not start state controller if stylus input is not present as lock // screen notes apps are geared towards stylus.
diff --git a/chrome/browser/chromeos/lock_screen_apps/state_controller.h b/chrome/browser/chromeos/lock_screen_apps/state_controller.h index 192edc3..8de24d2 100644 --- a/chrome/browser/chromeos/lock_screen_apps/state_controller.h +++ b/chrome/browser/chromeos/lock_screen_apps/state_controller.h
@@ -54,7 +54,7 @@ } namespace ui { -class InputDeviceManager; +class DeviceDataManager; } namespace lock_screen_apps { @@ -258,7 +258,7 @@ ScopedObserver<session_manager::SessionManager, session_manager::SessionManagerObserver> session_observer_; - ScopedObserver<ui::InputDeviceManager, ui::InputDeviceEventObserver> + ScopedObserver<ui::DeviceDataManager, ui::InputDeviceEventObserver> input_devices_observer_; ScopedObserver<chromeos::PowerManagerClient, chromeos::PowerManagerClient::Observer>
diff --git a/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc b/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc index 4a3bdb3..e26a770 100644 --- a/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc +++ b/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
@@ -57,8 +57,8 @@ #include "extensions/common/value_builder.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/aura/window.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/device_data_manager_test_api.h" -#include "ui/events/devices/input_device_manager.h" using ash::mojom::CloseLockScreenNoteReason; using ash::mojom::LockScreenNoteOrigin;
diff --git a/chrome/browser/chromeos/login/screens/recommend_apps/recommend_apps_fetcher_impl.cc b/chrome/browser/chromeos/login/screens/recommend_apps/recommend_apps_fetcher_impl.cc index 17417f0..3404fcf 100644 --- a/chrome/browser/chromeos/login/screens/recommend_apps/recommend_apps_fetcher_impl.cc +++ b/chrome/browser/chromeos/login/screens/recommend_apps/recommend_apps_fetcher_impl.cc
@@ -29,8 +29,8 @@ #include "third_party/zlib/google/compression_utils.h" #include "ui/display/display.h" #include "ui/display/screen.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/input_device.h" -#include "ui/events/devices/input_device_manager.h" #include "ui/gfx/extension_set.h" #include "ui/gl/gl_version_info.h" @@ -65,15 +65,13 @@ }; bool HasTouchScreen() { - return !ui::InputDeviceManager::GetInstance() - ->GetTouchscreenDevices() - .empty(); + return !ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices().empty(); } bool HasStylusInput() { // Check to see if the hardware reports it is stylus capable. for (const ui::TouchscreenDevice& device : - ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices()) { + ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices()) { if (device.has_stylus && device.type == ui::InputDeviceType::INPUT_DEVICE_INTERNAL) { return true; @@ -84,12 +82,12 @@ } bool HasKeyboard() { - return !ui::InputDeviceManager::GetInstance()->GetKeyboardDevices().empty(); + return !ui::DeviceDataManager::GetInstance()->GetKeyboardDevices().empty(); } bool HasHardKeyboard() { for (const ui::InputDevice& device : - ui::InputDeviceManager::GetInstance()->GetKeyboardDevices()) { + ui::DeviceDataManager::GetInstance()->GetKeyboardDevices()) { if (!device.phys.empty()) return true; }
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc index 5b14c05..11a8dcb 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc +++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
@@ -97,7 +97,7 @@ #include "ui/compositor/scoped_layer_animation_settings.h" #include "ui/display/display.h" #include "ui/display/screen.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/event_handler.h" #include "ui/events/event_utils.h" #include "ui/gfx/geometry/rect.h" @@ -402,7 +402,7 @@ display::Screen::GetScreen()->AddObserver(this); - ui::InputDeviceManager::GetInstance()->AddObserver(this); + ui::DeviceDataManager::GetInstance()->AddObserver(this); // Login screen is moved to lock screen container when user logs in. registrar_.Add(this, chrome::NOTIFICATION_LOGIN_USER_CHANGED, @@ -447,7 +447,7 @@ waiting_for_configuration_ = false; } - ui::InputDeviceManager::GetInstance()->RemoveObserver(this); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); if (login_view_ && login_window_) login_window_->RemoveRemovalsObserver(this);
diff --git a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc index 1619dba..e906258 100644 --- a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc +++ b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
@@ -405,7 +405,6 @@ void ChromeUserManagerImpl::Shutdown() { DCHECK_CURRENTLY_ON(BrowserThread::UI); - g_browser_process->platform_part()->ShutdownPrimaryProfileServices(); ChromeUserManager::Shutdown(); if (GetMinimumVersionPolicyHandler()) {
diff --git a/chrome/browser/chromeos/scheduler_configuration_manager.cc b/chrome/browser/chromeos/scheduler_configuration_manager.cc index ca6ef4a..ffe6024 100644 --- a/chrome/browser/chromeos/scheduler_configuration_manager.cc +++ b/chrome/browser/chromeos/scheduler_configuration_manager.cc
@@ -77,7 +77,7 @@ } else if (!feature_param_value.empty()) { config_name = feature_param_value; } else { - config_name = debugd::scheduler_configuration::kPerformanceScheduler; + config_name = debugd::scheduler_configuration::kConservativeScheduler; } // NB: Also send an update when the config gets reset to let the system pick
diff --git a/chrome/browser/chromeos/scheduler_configuration_manager_unittest.cc b/chrome/browser/chromeos/scheduler_configuration_manager_unittest.cc index d614f591..331f13a 100644 --- a/chrome/browser/chromeos/scheduler_configuration_manager_unittest.cc +++ b/chrome/browser/chromeos/scheduler_configuration_manager_unittest.cc
@@ -54,7 +54,7 @@ // Correct default is used when there is no configured value. SchedulerConfigurationManager manager(&debug_daemon_client_, &local_state_); scoped_task_environment_.RunUntilIdle(); - EXPECT_EQ(debugd::scheduler_configuration::kPerformanceScheduler, + EXPECT_EQ(debugd::scheduler_configuration::kConservativeScheduler, debug_daemon_client_.scheduler_configuration_name()); // Change user pref, which should trigger a config change. @@ -77,7 +77,7 @@ // Dropping the policy as well reverts to the default configuration. local_state_.RemoveManagedPref(prefs::kSchedulerConfiguration); scoped_task_environment_.RunUntilIdle(); - EXPECT_EQ(debugd::scheduler_configuration::kPerformanceScheduler, + EXPECT_EQ(debugd::scheduler_configuration::kConservativeScheduler, debug_daemon_client_.scheduler_configuration_name()); }
diff --git a/chrome/browser/chromeos/system/pointer_device_observer.cc b/chrome/browser/chromeos/system/pointer_device_observer.cc index 0b8c837..6c95f87 100644 --- a/chrome/browser/chromeos/system/pointer_device_observer.cc +++ b/chrome/browser/chromeos/system/pointer_device_observer.cc
@@ -8,7 +8,7 @@ #include "base/bind_helpers.h" #include "chrome/browser/chromeos/system/input_device_settings.h" #include "content/public/browser/browser_thread.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" using content::BrowserThread; @@ -20,11 +20,11 @@ } PointerDeviceObserver::~PointerDeviceObserver() { - ui::InputDeviceManager::GetInstance()->RemoveObserver(this); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); } void PointerDeviceObserver::Init() { - ui::InputDeviceManager::GetInstance()->AddObserver(this); + ui::DeviceDataManager::GetInstance()->AddObserver(this); } void PointerDeviceObserver::CheckDevices() {
diff --git a/chrome/browser/chromeos/ui/screen_capture_notification_ui_chromeos.cc b/chrome/browser/chromeos/ui/screen_capture_notification_ui_chromeos.cc index 9cf65b37..fb22c19e 100644 --- a/chrome/browser/chromeos/ui/screen_capture_notification_ui_chromeos.cc +++ b/chrome/browser/chromeos/ui/screen_capture_notification_ui_chromeos.cc
@@ -30,8 +30,9 @@ base::BindRepeating( &ScreenCaptureNotificationUIChromeOS::ProcessStopRequestFromUI, base::Unretained(this)), - base::BindRepeating(std::move(source_callback), - content::DesktopMediaID()), + source_callback ? base::BindRepeating(std::move(source_callback), + content::DesktopMediaID()) + : base::RepeatingClosure(), text_); return 0; }
diff --git a/chrome/browser/extensions/api/settings_private/generated_prefs_factory.cc b/chrome/browser/extensions/api/settings_private/generated_prefs_factory.cc index 24f509a9..fa90ade 100644 --- a/chrome/browser/extensions/api/settings_private/generated_prefs_factory.cc +++ b/chrome/browser/extensions/api/settings_private/generated_prefs_factory.cc
@@ -31,16 +31,6 @@ GeneratedPrefsFactory::~GeneratedPrefsFactory() {} -content::BrowserContext* GeneratedPrefsFactory::GetBrowserContextToUse( - content::BrowserContext* context) const { - // Use |context| even if it is off-the-record/incognito. - return context; -} - -bool GeneratedPrefsFactory::ServiceIsNULLWhileTesting() const { - return true; -} - KeyedService* GeneratedPrefsFactory::BuildServiceInstanceFor( content::BrowserContext* profile) const { return new GeneratedPrefs(static_cast<Profile*>(profile));
diff --git a/chrome/browser/extensions/api/settings_private/generated_prefs_factory.h b/chrome/browser/extensions/api/settings_private/generated_prefs_factory.h index 10fc892..e755cf0 100644 --- a/chrome/browser/extensions/api/settings_private/generated_prefs_factory.h +++ b/chrome/browser/extensions/api/settings_private/generated_prefs_factory.h
@@ -29,9 +29,6 @@ ~GeneratedPrefsFactory() override; // BrowserContextKeyedServiceFactory implementation. - content::BrowserContext* GetBrowserContextToUse( - content::BrowserContext* context) const override; - bool ServiceIsNULLWhileTesting() const override; KeyedService* BuildServiceInstanceFor( content::BrowserContext* profile) const override;
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_api.cc b/chrome/browser/extensions/api/settings_private/settings_private_api.cc index 821ed53..4898ddb 100644 --- a/chrome/browser/extensions/api/settings_private/settings_private_api.cc +++ b/chrome/browser/extensions/api/settings_private/settings_private_api.cc
@@ -17,6 +17,10 @@ #include "content/public/common/page_zoom.h" #include "extensions/browser/extension_function_registry.h" +namespace { + const char kDelegateIsNull[] = "delegate is null"; +} + namespace extensions { //////////////////////////////////////////////////////////////////////////////// @@ -33,7 +37,8 @@ SettingsPrivateDelegate* delegate = SettingsPrivateDelegateFactory::GetForBrowserContext(browser_context()); - DCHECK(delegate); + if (delegate == nullptr) + return RespondNow(Error(kDelegateIsNull)); settings_private::SetPrefResult result = delegate->SetPref(parameters->name, parameters->value.get()); @@ -66,8 +71,11 @@ ExtensionFunction::ResponseAction SettingsPrivateGetAllPrefsFunction::Run() { SettingsPrivateDelegate* delegate = SettingsPrivateDelegateFactory::GetForBrowserContext(browser_context()); - DCHECK(delegate); - return RespondNow(OneArgument(delegate->GetAllPrefs())); + + if (delegate == nullptr) + return RespondNow(Error(kDelegateIsNull)); + else + return RespondNow(OneArgument(delegate->GetAllPrefs())); } //////////////////////////////////////////////////////////////////////////////// @@ -84,7 +92,8 @@ SettingsPrivateDelegate* delegate = SettingsPrivateDelegateFactory::GetForBrowserContext(browser_context()); - DCHECK(delegate); + if (delegate == nullptr) + return RespondNow(Error(kDelegateIsNull)); std::unique_ptr<base::Value> value = delegate->GetPref(parameters->name); if (value->is_none()) @@ -105,8 +114,11 @@ SettingsPrivateGetDefaultZoomFunction::Run() { SettingsPrivateDelegate* delegate = SettingsPrivateDelegateFactory::GetForBrowserContext(browser_context()); - DCHECK(delegate); - return RespondNow(OneArgument(delegate->GetDefaultZoom())); + + if (delegate == nullptr) + return RespondNow(Error(kDelegateIsNull)); + else + return RespondNow(OneArgument(delegate->GetDefaultZoom())); } //////////////////////////////////////////////////////////////////////////////// @@ -125,7 +137,9 @@ SettingsPrivateDelegate* delegate = SettingsPrivateDelegateFactory::GetForBrowserContext(browser_context()); - DCHECK(delegate); + if (delegate == nullptr) + return RespondNow(Error(kDelegateIsNull)); + delegate->SetDefaultZoom(parameters->zoom); return RespondNow(OneArgument(std::make_unique<base::Value>(true))); }
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_browsertest_chromeos.cc b/chrome/browser/extensions/api/settings_private/settings_private_browsertest_chromeos.cc deleted file mode 100644 index 6b7a7b7..0000000 --- a/chrome/browser/extensions/api/settings_private/settings_private_browsertest_chromeos.cc +++ /dev/null
@@ -1,57 +0,0 @@ -// Copyright 2019 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 "base/values.h" -#include "chrome/browser/chromeos/login/mixin_based_in_process_browser_test.h" -#include "chrome/browser/chromeos/login/test/guest_session_mixin.h" -#include "chrome/browser/extensions/api/settings_private/prefs_util_enums.h" -#include "chrome/browser/extensions/api/settings_private/settings_private_api.h" -#include "chrome/browser/extensions/api/settings_private/settings_private_delegate.h" -#include "chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.h" -#include "chrome/browser/extensions/api/settings_private/settings_private_event_router.h" -#include "chrome/browser/extensions/api/settings_private/settings_private_event_router_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser.h" -#include "content/public/test/browser_test.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace extensions { -namespace { - -class SettingsPrivateGuestModeTest - : public chromeos::MixinBasedInProcessBrowserTest { - protected: - chromeos::GuestSessionMixin guest_session_{&mixin_host_}; -}; - -// Regression test for https://crbug.com/887383. -IN_PROC_BROWSER_TEST_F(SettingsPrivateGuestModeTest, GuestMode) { - Profile* guest_profile = browser()->profile(); - EXPECT_TRUE(guest_profile->IsOffTheRecord()); - - // SettingsPrivate uses the incognito profile, not the recording profile, - // to set preferences. - SettingsPrivateDelegate* delegate = - SettingsPrivateDelegateFactory::GetForBrowserContext(guest_profile); - Profile* delegate_profile = delegate->profile_for_test(); - EXPECT_EQ(guest_profile, delegate_profile); - EXPECT_NE(guest_profile->GetOriginalProfile(), delegate_profile); - - // SettingsPrivate observes the incognito profile, not the recording profile, - // for pref changes. - SettingsPrivateEventRouter* router = - SettingsPrivateEventRouterFactory::GetForProfile(guest_profile); - Profile* router_profile = static_cast<Profile*>(router->context_for_test()); - EXPECT_EQ(guest_profile, router_profile); - EXPECT_NE(guest_profile->GetOriginalProfile(), router_profile); - - // Page zoom preferences cannot be changed in guest mode and always return a - // default value. - EXPECT_EQ(settings_private::SetPrefResult::PREF_NOT_MODIFIABLE, - delegate->SetDefaultZoom(0.5)); - EXPECT_EQ(delegate->GetDefaultZoom()->GetDouble(), 0.0); -} - -} // namespace -} // namespace extensions
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc b/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc index 9eb36246..adf858f 100644 --- a/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc +++ b/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
@@ -10,7 +10,6 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/extensions/api/settings_private/prefs_util.h" -#include "chrome/browser/extensions/api/settings_private/prefs_util_enums.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h" #include "chrome/common/pref_names.h" @@ -59,21 +58,14 @@ } std::unique_ptr<base::Value> SettingsPrivateDelegate::GetDefaultZoom() { - // Zoom level prefs aren't available for off-the-record profiles (like guest - // mode on Chrome OS). The setting isn't visible to users anyway, so return a - // default value. - if (profile_->IsOffTheRecord()) - return std::make_unique<base::Value>(0.0); double zoom = content::ZoomLevelToZoomFactor( profile_->GetZoomLevelPrefs()->GetDefaultZoomLevelPref()); - return std::make_unique<base::Value>(zoom); + std::unique_ptr<base::Value> value(new base::Value(zoom)); + return value; } settings_private::SetPrefResult SettingsPrivateDelegate::SetDefaultZoom( double zoom) { - // See comment in GetDefaultZoom(). - if (profile_->IsOffTheRecord()) - return settings_private::SetPrefResult::PREF_NOT_MODIFIABLE; double zoom_factor = content::ZoomFactorToZoomLevel(zoom); profile_->GetZoomLevelPrefs()->SetDefaultZoomLevelPref(zoom_factor); return settings_private::SetPrefResult::SUCCESS;
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_delegate.h b/chrome/browser/extensions/api/settings_private/settings_private_delegate.h index bbe82f1..e2d07ca2 100644 --- a/chrome/browser/extensions/api/settings_private/settings_private_delegate.h +++ b/chrome/browser/extensions/api/settings_private/settings_private_delegate.h
@@ -50,8 +50,6 @@ // Sets the pref. virtual settings_private::SetPrefResult SetDefaultZoom(double zoom); - Profile* profile_for_test() { return profile_; } - protected: Profile* profile_; // weak; not owned by us std::unique_ptr<PrefsUtil> prefs_util_;
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.cc b/chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.cc index fd8ed79c..e855cac0 100644 --- a/chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.cc +++ b/chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.cc
@@ -6,6 +6,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/api/settings_private/settings_private_delegate.h" +#include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/profile.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "extensions/browser/extension_system_provider.h" @@ -38,6 +39,8 @@ content::BrowserContext* SettingsPrivateDelegateFactory::GetBrowserContextToUse( content::BrowserContext* context) const { // Use the incognito profile when in Guest mode. + if (context->IsOffTheRecord()) + return chrome::GetBrowserContextRedirectedInIncognito(context); return context; }
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_event_router.h b/chrome/browser/extensions/api/settings_private/settings_private_event_router.h index ddad6b08..08bb8c9 100644 --- a/chrome/browser/extensions/api/settings_private/settings_private_event_router.h +++ b/chrome/browser/extensions/api/settings_private/settings_private_event_router.h
@@ -41,8 +41,6 @@ // settings_private::GeneratedPref::Observer implementation. void OnGeneratedPrefChanged(const std::string& pref_name) override; - content::BrowserContext* context_for_test() { return context_; } - protected: explicit SettingsPrivateEventRouter(content::BrowserContext* context);
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_event_router_factory.cc b/chrome/browser/extensions/api/settings_private/settings_private_event_router_factory.cc index b491f73a..227e15d0 100644 --- a/chrome/browser/extensions/api/settings_private/settings_private_event_router_factory.cc +++ b/chrome/browser/extensions/api/settings_private/settings_private_event_router_factory.cc
@@ -44,8 +44,7 @@ content::BrowserContext* SettingsPrivateEventRouterFactory::GetBrowserContextToUse( content::BrowserContext* context) const { - // Use the incognito profile in guest mode. - return context; + return ExtensionsBrowserClient::Get()->GetOriginalContext(context); } bool SettingsPrivateEventRouterFactory::ServiceIsCreatedWithBrowserContext() @@ -54,7 +53,7 @@ } bool SettingsPrivateEventRouterFactory::ServiceIsNULLWhileTesting() const { - return true; + return false; } } // namespace extensions
diff --git a/chrome/browser/favicon/favicon_request_handler_factory.cc b/chrome/browser/favicon/favicon_request_handler_factory.cc new file mode 100644 index 0000000..30c6775 --- /dev/null +++ b/chrome/browser/favicon/favicon_request_handler_factory.cc
@@ -0,0 +1,56 @@ +// Copyright 2019 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/favicon/favicon_request_handler_factory.h" + +#include "base/memory/singleton.h" +#include "base/task/post_task.h" +#include "chrome/browser/favicon/favicon_service_factory.h" +#include "chrome/browser/favicon/large_icon_service_factory.h" +#include "chrome/browser/profiles/incognito_helpers.h" +#include "chrome/browser/profiles/profile.h" +#include "components/favicon/core/favicon_request_handler.h" +#include "components/keyed_service/content/browser_context_dependency_manager.h" +#include "content/public/browser/browser_context.h" + +// static +favicon::FaviconRequestHandler* +FaviconRequestHandlerFactory::GetForBrowserContext( + content::BrowserContext* context) { + return static_cast<favicon::FaviconRequestHandler*>( + GetInstance()->GetServiceForBrowserContext(context, true)); +} + +// static +FaviconRequestHandlerFactory* FaviconRequestHandlerFactory::GetInstance() { + return base::Singleton<FaviconRequestHandlerFactory>::get(); +} + +FaviconRequestHandlerFactory::FaviconRequestHandlerFactory() + : BrowserContextKeyedServiceFactory( + "FaviconRequestHandler", + BrowserContextDependencyManager::GetInstance()) { + DependsOn(FaviconServiceFactory::GetInstance()); + DependsOn(LargeIconServiceFactory::GetInstance()); +} + +FaviconRequestHandlerFactory::~FaviconRequestHandlerFactory() {} + +content::BrowserContext* FaviconRequestHandlerFactory::GetBrowserContextToUse( + content::BrowserContext* context) const { + return chrome::GetBrowserContextRedirectedInIncognito(context); +} + +KeyedService* FaviconRequestHandlerFactory::BuildServiceInstanceFor( + content::BrowserContext* context) const { + Profile* profile = Profile::FromBrowserContext(context); + return new favicon::FaviconRequestHandler( + FaviconServiceFactory::GetForProfile(profile, + ServiceAccessType::EXPLICIT_ACCESS), + LargeIconServiceFactory::GetForBrowserContext(context)); +} + +bool FaviconRequestHandlerFactory::ServiceIsNULLWhileTesting() const { + return true; +}
diff --git a/chrome/browser/favicon/favicon_request_handler_factory.h b/chrome/browser/favicon/favicon_request_handler_factory.h new file mode 100644 index 0000000..9690ab9 --- /dev/null +++ b/chrome/browser/favicon/favicon_request_handler_factory.h
@@ -0,0 +1,46 @@ +// Copyright 2019 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_FAVICON_FAVICON_REQUEST_HANDLER_FACTORY_H_ +#define CHROME_BROWSER_FAVICON_FAVICON_REQUEST_HANDLER_FACTORY_H_ + +#include "components/keyed_service/content/browser_context_keyed_service_factory.h" + +namespace base { +template <typename T> +struct DefaultSingletonTraits; +} + +namespace content { +class BrowserContext; +} + +namespace favicon { +class FaviconRequestHandler; +} + +class FaviconRequestHandlerFactory : public BrowserContextKeyedServiceFactory { + public: + static favicon::FaviconRequestHandler* GetForBrowserContext( + content::BrowserContext* context); + + static FaviconRequestHandlerFactory* GetInstance(); + + private: + friend struct base::DefaultSingletonTraits<FaviconRequestHandlerFactory>; + + FaviconRequestHandlerFactory(); + ~FaviconRequestHandlerFactory() override; + + // BrowserContextKeyedServiceFactory: + content::BrowserContext* GetBrowserContextToUse( + content::BrowserContext* context) const override; + KeyedService* BuildServiceInstanceFor( + content::BrowserContext* context) const override; + bool ServiceIsNULLWhileTesting() const override; + + DISALLOW_COPY_AND_ASSIGN(FaviconRequestHandlerFactory); +}; + +#endif // CHROME_BROWSER_FAVICON_FAVICON_REQUEST_HANDLER_FACTORY_H_
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 142506f..a937782 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -88,6 +88,11 @@ "expiry_milestone": 76 }, { + "name": "android-picture-in-picture-api", + "owners": [ "beccahughes", "jazzhsu" ], + "expiry_milestone": 78 + }, + { "name": "android-site-settings-ui-refresh", "owners": [ "hkamila" ], "expiry_milestone": 76
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 8573fb5..46d76b9 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -92,6 +92,11 @@ "Use web push for background notificatons in Chrome OS integration " "with Android Messages for Web"; +const char kAndroidPictureInPictureAPIName[] = + "Picture-in-Picture Web API for Android"; +const char kAndroidPictureInPictureAPIDescription[] = + "Enable Picture-in-Picture Web API for Android"; + const char kAndroidSiteSettingsUIRefreshName[] = "Android Site Settings UI changes."; const char kAndroidSiteSettingsUIRefreshDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index f21e223f..adb6bcc 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -81,6 +81,9 @@ extern const char kEnableMessagesWebPushName[]; extern const char kEnableMessagesWebPushDescription[]; +extern const char kAndroidPictureInPictureAPIName[]; +extern const char kAndroidPictureInPictureAPIDescription[]; + extern const char kAndroidSiteSettingsUIRefreshName[]; extern const char kAndroidSiteSettingsUIRefreshDescription[];
diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc index 43f861c..b5652de 100644 --- a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc +++ b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
@@ -58,8 +58,8 @@ #endif // defined(OS_LINUX) && !defined(OS_CHROMEOS) #if defined(USE_OZONE) || defined(USE_X11) +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/input_device_event_observer.h" -#include "ui/events/devices/input_device_manager.h" #endif // defined(USE_OZONE) || defined(USE_X11) #if defined(OS_WIN) @@ -477,15 +477,15 @@ }; AsynchronousTouchEventStateRecorder::AsynchronousTouchEventStateRecorder() { - ui::InputDeviceManager::GetInstance()->AddObserver(this); + ui::DeviceDataManager::GetInstance()->AddObserver(this); } AsynchronousTouchEventStateRecorder::~AsynchronousTouchEventStateRecorder() { - ui::InputDeviceManager::GetInstance()->RemoveObserver(this); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); } void AsynchronousTouchEventStateRecorder::OnDeviceListsComplete() { - ui::InputDeviceManager::GetInstance()->RemoveObserver(this); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); RecordTouchEventState(); } @@ -580,7 +580,7 @@ // The touch event state for X11 and Ozone based event sub-systems are based // on device scans that happen asynchronously. So we may need to attach an // observer to wait until these scans complete. - if (ui::InputDeviceManager::GetInstance()->AreDeviceListsComplete()) { + if (ui::DeviceDataManager::GetInstance()->AreDeviceListsComplete()) { RecordTouchEventState(); } else { input_device_event_observer_.reset(
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc index 2d152e8..4d0b915 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -39,6 +39,7 @@ #include "chrome/browser/history/history_service_factory.h" #include "chrome/browser/metrics/chrome_metrics_service_accessor.h" #include "chrome/browser/metrics/chrome_stability_metrics_provider.h" +#include "chrome/browser/metrics/desktop_platform_features_metrics_provider.h" #include "chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service_factory.h" #include "chrome/browser/metrics/https_engagement_metrics_provider.h" #include "chrome/browser/metrics/metrics_reporting_state.h" @@ -656,6 +657,13 @@ content::ServiceManagerConnection::GetForProcess()->GetConnector())); #endif // defined(OS_WIN) +#if defined(OS_WIN) || defined(OS_MACOSX) || \ + (defined(OS_LINUX) && !defined(OS_CHROMEOS)) + metrics_service_->RegisterMetricsProvider( + std::make_unique<DesktopPlatformFeaturesMetricsProvider>()); +#endif // defined(OS_WIN) || defined(OS_MACOSX) || \ + // (defined(OS_LINUX) && !defined(OS_CHROMEOS)) + #if BUILDFLAG(ENABLE_PLUGINS) plugin_metrics_provider_ = new PluginMetricsProvider(local_state); metrics_service_->RegisterMetricsProvider(
diff --git a/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc b/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc index d45c6ba..d6c5de5 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc
@@ -200,6 +200,12 @@ expected_providers++; // PowerMetricsProvider #endif // defined(OS_MACOSX) +#if defined(OS_WIN) || defined(OS_MACOSX) || \ + (defined(OS_LINUX) && !defined(OS_CHROMEOS)) + expected_providers++; // DesktopPlatformFeaturesMetricsProvider +#endif // defined(OS_WIN) || defined(OS_MACOSX) || \ + // (defined(OS_LINUX) && !defined(OS_CHROMEOS)) + std::unique_ptr<ChromeMetricsServiceClient> chrome_metrics_service_client = ChromeMetricsServiceClient::Create(metrics_state_manager_.get()); EXPECT_EQ(expected_providers,
diff --git a/chrome/browser/metrics/desktop_platform_features_metrics_provider.cc b/chrome/browser/metrics/desktop_platform_features_metrics_provider.cc new file mode 100644 index 0000000..011922c --- /dev/null +++ b/chrome/browser/metrics/desktop_platform_features_metrics_provider.cc
@@ -0,0 +1,37 @@ +// Copyright 2019 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/desktop_platform_features_metrics_provider.h" + +#include "base/metrics/histogram_macros.h" +#include "ui/native_theme/native_theme.h" + +namespace { + +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class DarkModeStatus { + kUnavailable = 0, + kLight = 1, + kDark = 2, + kMaxValue = kDark, +}; + +} // namespace + +DesktopPlatformFeaturesMetricsProvider:: + DesktopPlatformFeaturesMetricsProvider() {} +DesktopPlatformFeaturesMetricsProvider:: + ~DesktopPlatformFeaturesMetricsProvider() {} + +void DesktopPlatformFeaturesMetricsProvider::ProvideCurrentSessionData( + metrics::ChromeUserMetricsExtension* uma_proto) { + ui::NativeTheme* theme = ui::NativeTheme::GetInstanceForNativeUi(); + DarkModeStatus status = DarkModeStatus::kUnavailable; + if (theme->SystemDarkModeSupported()) { + status = theme->SystemDarkModeEnabled() ? DarkModeStatus::kDark + : DarkModeStatus::kLight; + } + UMA_HISTOGRAM_ENUMERATION("Browser.DarkModeStatus", status); +}
diff --git a/chrome/browser/metrics/desktop_platform_features_metrics_provider.h b/chrome/browser/metrics/desktop_platform_features_metrics_provider.h new file mode 100644 index 0000000..a2d61b0 --- /dev/null +++ b/chrome/browser/metrics/desktop_platform_features_metrics_provider.h
@@ -0,0 +1,29 @@ +// Copyright 2019 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_METRICS_DESKTOP_PLATFORM_FEATURES_METRICS_PROVIDER_H_ +#define CHROME_BROWSER_METRICS_DESKTOP_PLATFORM_FEATURES_METRICS_PROVIDER_H_ + +#include "base/macros.h" +#include "components/metrics/metrics_provider.h" + +namespace metrics { +class ChromeUserMetricsExtension; +} + +// Provides platform-specific metrics for desktop browsers. +class DesktopPlatformFeaturesMetricsProvider : public metrics::MetricsProvider { + public: + DesktopPlatformFeaturesMetricsProvider(); + ~DesktopPlatformFeaturesMetricsProvider() override; + + // metrics::MetricsProvider + void ProvideCurrentSessionData( + metrics::ChromeUserMetricsExtension* uma_proto) override; + + private: + DISALLOW_COPY_AND_ASSIGN(DesktopPlatformFeaturesMetricsProvider); +}; + +#endif // CHROME_BROWSER_METRICS_DESKTOP_PLATFORM_FEATURES_METRICS_PROVIDER_H_
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc index 2470f63..c21b834 100644 --- a/chrome/browser/prerender/prerender_browsertest.cc +++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -106,6 +106,7 @@ #include "content/public/common/url_constants.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/browsing_data_remover_test_util.h" +#include "content/public/test/no_renderer_crashes_assertion.h" #include "content/public/test/ppapi_test_utils.h" #include "content/public/test/test_navigation_observer.h" #include "content/public/test/test_utils.h" @@ -1513,6 +1514,7 @@ "/prerender/prerender_page.html", FINAL_STATUS_RENDERER_CRASHED, 1); // Navigate to about:crash and then wait for the renderer to crash. + content::ScopedAllowRendererCrashes scoped_allow_renderer_crashes; ASSERT_TRUE(prerender->contents()); ASSERT_TRUE(prerender->contents()->prerender_contents()); prerender->contents()->prerender_contents()->GetController().
diff --git a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc index fea8666..260903f 100644 --- a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc +++ b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
@@ -40,6 +40,7 @@ #include "content/public/common/result_codes.h" #include "content/public/common/url_constants.h" #include "content/public/test/browser_test_utils.h" +#include "content/public/test/no_renderer_crashes_assertion.h" #include "content/public/test/url_loader_interceptor.h" #include "net/base/escape.h" #include "net/base/features.h" @@ -786,6 +787,7 @@ std::unique_ptr<TestPrerender> test_prerender = prerender_contents_factory()->ExpectPrerenderContents( FINAL_STATUS_RENDERER_CRASHED); + content::ScopedAllowRendererCrashes scoped_allow_renderer_crashes; std::unique_ptr<PrerenderHandle> prerender_handle( GetPrerenderManager()->AddPrerenderFromExternalRequest( GURL(content::kChromeUICrashURL), content::Referrer(),
diff --git a/chrome/browser/previews/previews_lite_page_decider.cc b/chrome/browser/previews/previews_lite_page_decider.cc index 58012c5..2154633 100644 --- a/chrome/browser/previews/previews_lite_page_decider.cc +++ b/chrome/browser/previews/previews_lite_page_decider.cc
@@ -15,6 +15,8 @@ #include "build/build_config.h" #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h" #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h" +#include "chrome/browser/predictors/loading_predictor.h" +#include "chrome/browser/predictors/loading_predictor_factory.h" #include "chrome/browser/previews/previews_lite_page_infobar_delegate.h" #include "chrome/browser/previews/previews_lite_page_navigation_throttle.h" #include "chrome/browser/previews/previews_service.h" @@ -82,6 +84,19 @@ DCHECK_GE(kMaxBlacklistEntries, dict->DictSize()); } + +void PreconnectToLitePagesServer(content::BrowserContext* browser_context) { + predictors::LoadingPredictor* loading_predictor = + predictors::LoadingPredictorFactory::GetForProfile( + Profile::FromBrowserContext(browser_context)); + + if (!loading_predictor || !loading_predictor->preconnect_manager()) + return; + + loading_predictor->preconnect_manager()->StartPreconnectUrl( + previews::params::GetLitePagePreviewsDomainURL(), true); +} + } // namespace // This WebContentsObserver watches the rest of the current navigation shows a @@ -152,6 +167,11 @@ DCHECK(!browser_context->IsOffTheRecord()); + // TODO(crbug.com/971918): Remove once a more robust prober is setup. + if (drp_settings->IsDataReductionProxyEnabled()) { + PreconnectToLitePagesServer(browser_context); + } + pref_service_ = Profile::FromBrowserContext(browser_context)->GetPrefs(); host_bypass_blacklist_ = pref_service_->GetDictionary(kHostBlacklist)->CreateDeepCopy();
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc index 546fbac..19386646 100644 --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -29,6 +29,7 @@ #include "chrome/browser/download/download_service_factory.h" #include "chrome/browser/engagement/site_engagement_service.h" #include "chrome/browser/engagement/site_engagement_service_factory.h" +#include "chrome/browser/favicon/favicon_request_handler_factory.h" #include "chrome/browser/favicon/favicon_service_factory.h" #include "chrome/browser/feature_engagement/tracker_factory.h" #include "chrome/browser/google/google_search_domain_mixing_metrics_emitter_factory.h" @@ -273,6 +274,7 @@ extensions::VerifyTrustAPI::GetFactoryInstance(); #endif FaviconServiceFactory::GetInstance(); + FaviconRequestHandlerFactory::GetInstance(); #if BUILDFLAG(ENABLE_LEGACY_DESKTOP_IN_PRODUCT_HELP) feature_engagement::BookmarkTrackerFactory::GetInstance(); feature_engagement::IncognitoWindowTrackerFactory::GetInstance();
diff --git a/chrome/browser/resources/chromeos/camera/src/css/main.css b/chrome/browser/resources/chromeos/camera/src/css/main.css index da6704bf..90a274e 100644 --- a/chrome/browser/resources/chromeos/camera/src/css/main.css +++ b/chrome/browser/resources/chromeos/camera/src/css/main.css
@@ -225,7 +225,7 @@ height: calc(var(--modes-height) - var(--modes-gradient-padding) * 2); justify-content: flex-start; overflow: scroll; - padding: var(--modes-gradient-padding) 3px; + padding: var(--modes-gradient-padding) 8px; pointer-events: auto; } @@ -244,13 +244,20 @@ line-height: 32px; margin: 8px 0; padding: 0 12px; + position: relative; text-shadow: 0 2px 3px rgba(32, 33, 36, 0.3); + z-index: 0; } .mode-item>input { height: 100%; position: absolute; width: 100%; + z-index: 1; +} + +.mode-item>input:focus::after { + display: none; } .mode-item>input:checked + span { @@ -259,8 +266,15 @@ text-shadow: none; } -.mode-item>input:focus + span { - margin-bottom: 6px; +.mode-item>input:focus + span::after { + border: 2px solid rgba(37, 129, 223, 0.7); + border-radius: 20px/50%; + bottom: -7px; + content: ''; + left: -7px; + position: absolute; + right: -7px; + top: -7px; } button.shutter {
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera/layout.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera/layout.js index 27bd0e7..43afec7 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/views/camera/layout.js +++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera/layout.js
@@ -115,9 +115,9 @@ var modeWidth = document.querySelector('#modes-group').getBoundingClientRect().width; var layoutToggled = false; - [[modeWidth + 40, 'w-letterbox-s'], - [modeWidth + 40 + 72, 'w-letterbox-m'], - [(modeWidth + 40) * 2, 'w-letterbox-l'], + [[modeWidth + 30, 'w-letterbox-s'], + [modeWidth + 30 + 72, 'w-letterbox-m'], + [(modeWidth + 30) * 2, 'w-letterbox-l'], [Infinity, 'w-letterbox-xl'], ] .forEach(
diff --git a/chrome/browser/ui/ash/system_tray_client.cc b/chrome/browser/ui/ash/system_tray_client.cc index 959da4c..e26a0587 100644 --- a/chrome/browser/ui/ash/system_tray_client.cc +++ b/chrome/browser/ui/ash/system_tray_client.cc
@@ -389,10 +389,17 @@ } std::string page = chrome::kInternetSubPage; - if (!network_id.empty()) { + const chromeos::NetworkState* network_state = GetNetworkState(network_id); + if (!network_id.empty() && network_state) { page = chrome::kNetworkDetailSubPage; page += "?guid="; page += net::EscapeUrlEncodedData(network_id, true); + page += "&name="; + page += net::EscapeUrlEncodedData(network_state->name(), true); + page += "&type="; + page += net::EscapeUrlEncodedData( + chromeos::network_util::TranslateShillTypeToONC(network_state->type()), + true); if (show_configure) page += "&showConfigure=true"; }
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc index d32817a9..4de954a 100644 --- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc +++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
@@ -16,9 +16,8 @@ #include "build/build_config.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/app/vector_icons/vector_icons.h" -#include "chrome/browser/favicon/favicon_service_factory.h" +#include "chrome/browser/favicon/favicon_request_handler_factory.h" #include "chrome/browser/favicon/favicon_utils.h" -#include "chrome/browser/favicon/large_icon_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search/search.h" #include "chrome/browser/sessions/session_restore.h" @@ -32,6 +31,7 @@ #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/toolbar/app_menu_model.h" #include "chrome/grit/generated_resources.h" +#include "components/favicon/core/favicon_request_handler.h" #include "components/favicon_base/favicon_types.h" #include "components/feature_engagement/buildflags.h" #include "components/prefs/scoped_user_pref_update.h" @@ -595,16 +595,18 @@ // Set default icon first. SetIcon(index_in_menu, favicon::GetDefaultFavicon()); + favicon::FaviconRequestHandler* favicon_request_handler = + FaviconRequestHandlerFactory::GetForBrowserContext(browser_->profile()); + // Can be null for tests. + if (!favicon_request_handler) + return; sync_sessions::OpenTabsUIDelegate* open_tabs = GetOpenTabsUIDelegate(); bool is_local_tab = command_id < kFirstOtherDevicesTabCommandId; - favicon_request_handler_.GetFaviconImageForPageURL( + favicon_request_handler->GetFaviconImageForPageURL( url, base::BindOnce(&RecentTabsSubMenuModel::OnFaviconDataAvailable, base::Unretained(this), command_id), favicon::FaviconRequestOrigin::RECENTLY_CLOSED_TABS, - FaviconServiceFactory::GetForProfile(browser_->profile(), - ServiceAccessType::EXPLICIT_ACCESS), - LargeIconServiceFactory::GetForBrowserContext(browser_->profile()), open_tabs ? open_tabs->GetIconUrlForPageUrl(url) : GURL(), base::BindOnce(&RecentTabsGetSyncedFaviconForPageURL, base::Unretained(session_sync_service_)),
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h index 53be110d..515952c 100644 --- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h +++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h
@@ -16,7 +16,6 @@ #include "base/scoped_observer.h" #include "base/task/cancelable_task_tracker.h" #include "base/timer/elapsed_timer.h" -#include "components/favicon/core/favicon_request_handler.h" #include "components/favicon/core/favicon_service.h" #include "components/sessions/core/session_id.h" #include "components/sessions/core/tab_restore_service.h" @@ -188,7 +187,6 @@ std::unique_ptr<base::CallbackList<void()>::Subscription> foreign_session_updated_subscription_; - favicon::FaviconRequestHandler favicon_request_handler_; base::WeakPtrFactory<RecentTabsSubMenuModel> weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(RecentTabsSubMenuModel);
diff --git a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc index b5a226d..5153eb8 100644 --- a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc +++ b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc
@@ -224,19 +224,21 @@ return this; } -views::View* CardUnmaskPromptViews::CreateFootnoteView() { +std::unique_ptr<views::View> CardUnmaskPromptViews::CreateFootnoteView() { if (!controller_->CanStoreLocally()) return nullptr; - storage_checkbox_ = new views::Checkbox(l10n_util::GetStringUTF16( - IDS_AUTOFILL_CARD_UNMASK_PROMPT_STORAGE_CHECKBOX)); - storage_checkbox_->SetBorder(views::CreateEmptyBorder(gfx::Insets())); - storage_checkbox_->SetChecked(controller_->GetStoreLocallyStartState()); - storage_checkbox_->SetEnabledTextColors(views::style::GetColor( + auto storage_checkbox = + std::make_unique<views::Checkbox>(l10n_util::GetStringUTF16( + IDS_AUTOFILL_CARD_UNMASK_PROMPT_STORAGE_CHECKBOX)); + storage_checkbox->SetBorder(views::CreateEmptyBorder(gfx::Insets())); + storage_checkbox->SetChecked(controller_->GetStoreLocallyStartState()); + storage_checkbox->SetEnabledTextColors(views::style::GetColor( *storage_checkbox_, ChromeTextContext::CONTEXT_BODY_TEXT_SMALL, STYLE_SECONDARY)); + storage_checkbox_ = storage_checkbox.get(); - return storage_checkbox_; + return storage_checkbox; } gfx::Size CardUnmaskPromptViews::CalculatePreferredSize() const {
diff --git a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.h b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.h index e319998..77e1926d 100644 --- a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.h +++ b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.h
@@ -51,7 +51,7 @@ // views::DialogDelegateView View* GetContentsView() override; - View* CreateFootnoteView() override; + std::unique_ptr<View> CreateFootnoteView() override; // views::View gfx::Size CalculatePreferredSize() const override;
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc index e7d4a109..4ea7fd8 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc
@@ -83,7 +83,7 @@ : controller()->GetDeclineButtonText(); } -views::View* SaveCardBubbleViews::CreateFootnoteView() { +std::unique_ptr<views::View> SaveCardBubbleViews::CreateFootnoteView() { return nullptr; }
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.h b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.h index 302c5a5c..75c149b9 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.h +++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.h
@@ -41,7 +41,7 @@ // views::BubbleDialogDelegateView: base::string16 GetDialogButtonLabel(ui::DialogButton button) const override; - views::View* CreateFootnoteView() override; + std::unique_ptr<views::View> CreateFootnoteView() override; bool Accept() override; bool Cancel() override; bool Close() override;
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.cc index a7ced9a..513434d 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.cc
@@ -31,7 +31,8 @@ : SaveCardBubbleViews(anchor_view, anchor_point, web_contents, controller) { } -views::View* SaveCardManageCardsBubbleViews::CreateFootnoteView() { +std::unique_ptr<views::View> +SaveCardManageCardsBubbleViews::CreateFootnoteView() { #if defined(OS_CHROMEOS) // ChromeOS does not show the signin promo. return nullptr; @@ -55,13 +56,13 @@ params.dice_signin_button_prominent = false; params.dice_text_style = ChromeTextStyle::STYLE_SECONDARY; - std::unique_ptr<views::View> promo_view = CreateBubbleSyncPromoView( + auto promo_view = CreateBubbleSyncPromoView( controller()->GetProfile(), sync_promo_delegate_.get(), signin_metrics::AccessPoint::ACCESS_POINT_MANAGE_CARDS_BUBBLE, params); DCHECK(promo_view); InitFootnoteView(promo_view.get()); - return promo_view.release(); + return promo_view; #endif }
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.h b/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.h index 71acf1e..e10c7ef 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.h +++ b/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.h
@@ -26,7 +26,7 @@ SaveCardBubbleController* controller); // views::WidgetDelegate: - views::View* CreateFootnoteView() override; + std::unique_ptr<views::View> CreateFootnoteView() override; std::unique_ptr<views::View> CreateExtraView() override; int GetDialogButtons() const override;
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc index 5c9ba838..376f7575 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
@@ -80,15 +80,16 @@ return upload_explanation_tooltip; } -views::View* SaveCardOfferBubbleViews::CreateFootnoteView() { +std::unique_ptr<views::View> SaveCardOfferBubbleViews::CreateFootnoteView() { if (controller()->GetLegalMessageLines().empty()) return nullptr; - legal_message_view_ = - new LegalMessageView(controller()->GetLegalMessageLines(), this); + auto legal_message_view = std::make_unique<LegalMessageView>( + controller()->GetLegalMessageLines(), this); + legal_message_view_ = legal_message_view.get(); InitFootnoteView(legal_message_view_); - return legal_message_view_; + return legal_message_view; } bool SaveCardOfferBubbleViews::Accept() {
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.h b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.h index a81efb8..84520784 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.h +++ b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.h
@@ -35,7 +35,7 @@ // BubbleDialogDelegateView: std::unique_ptr<views::View> CreateExtraView() override; - views::View* CreateFootnoteView() override; + std::unique_ptr<views::View> CreateFootnoteView() override; bool Accept() override; int GetDialogButtons() const override; bool IsDialogButtonEnabled(ui::DialogButton button) const override;
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc index db6d98ad..e82ff63 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
@@ -157,7 +157,7 @@ return true; } -views::View* BookmarkBubbleView::CreateFootnoteView() { +std::unique_ptr<views::View> BookmarkBubbleView::CreateFootnoteView() { #if defined(OS_CHROMEOS) // ChromeOS does not show the signin promo. return nullptr; @@ -174,12 +174,11 @@ IDS_BOOKMARK_DICE_PROMO_SYNC_MESSAGE; params.dice_signin_button_prominent = false; - footnote_view_ = - CreateBubbleSyncPromoView( - profile_, delegate_.get(), - signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE, params) - .release(); - return footnote_view_; + auto footnote_view = CreateBubbleSyncPromoView( + profile_, delegate_.get(), + signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE, params); + footnote_view_ = footnote_view.get(); + return footnote_view; #endif }
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h index 1d13539f..809f4c1 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h +++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h
@@ -67,7 +67,7 @@ base::string16 GetDialogButtonLabel(ui::DialogButton button) const override; std::unique_ptr<views::View> CreateExtraView() override; bool GetExtraViewPadding(int* padding) override; - views::View* CreateFootnoteView() override; + std::unique_ptr<views::View> CreateFootnoteView() override; bool Cancel() override; bool Accept() override; bool Close() override;
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_unittest.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_unittest.cc index 058eb5b..9e17581 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_unittest.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_unittest.cc
@@ -66,7 +66,7 @@ } std::unique_ptr<views::View> CreateFootnoteView() { - return base::WrapUnique(bubble_->CreateFootnoteView()); + return bubble_->CreateFootnoteView(); } std::unique_ptr<BookmarkBubbleView> bubble_;
diff --git a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc index 0217f3e2..4ff75c8 100644 --- a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc +++ b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
@@ -131,7 +131,7 @@ gfx::ImageSkia GetWindowIcon() override; bool ShouldShowWindowIcon() const override; bool ShouldShowCloseButton() const override; - View* CreateFootnoteView() override; + std::unique_ptr<View> CreateFootnoteView() override; int GetDialogButtons() const override; void Init() override; @@ -213,7 +213,8 @@ return true; } -views::View* ExtensionInstalledBubbleView::CreateFootnoteView() { +std::unique_ptr<views::View> +ExtensionInstalledBubbleView::CreateFootnoteView() { #if defined(OS_CHROMEOS) // ChromeOS does not show the signin promo. return nullptr; @@ -230,10 +231,9 @@ IDS_EXTENSION_INSTALLED_DICE_PROMO_SYNC_MESSAGE; return CreateBubbleSyncPromoView( - browser()->profile(), this, - signin_metrics::AccessPoint::ACCESS_POINT_EXTENSION_INSTALL_BUBBLE, - params) - .release(); + browser()->profile(), this, + signin_metrics::AccessPoint::ACCESS_POINT_EXTENSION_INSTALL_BUBBLE, + params); #endif }
diff --git a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc index 50c5a26..765ce5d 100644 --- a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc +++ b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc
@@ -145,10 +145,10 @@ return l10n_util::GetStringUTF16(message_id); } -views::View* AccountChooserDialogView::CreateFootnoteView() { +std::unique_ptr<views::View> AccountChooserDialogView::CreateFootnoteView() { if (!controller_->ShouldShowFooter()) return nullptr; - views::Label* label = new views::Label( + auto label = std::make_unique<views::Label>( l10n_util::GetStringUTF16(IDS_SAVE_PASSWORD_FOOTER), ChromeTextContext::CONTEXT_BODY_TEXT_SMALL, STYLE_SECONDARY); label->SetMultiLine(true);
diff --git a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.h b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.h index 27c000d..88e790b 100644 --- a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.h +++ b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.h
@@ -39,7 +39,7 @@ bool Accept() override; int GetDialogButtons() const override; base::string16 GetDialogButtonLabel(ui::DialogButton button) const override; - views::View* CreateFootnoteView() override; + std::unique_ptr<views::View> CreateFootnoteView() override; // ButtonListener: void ButtonPressed(views::Button* sender, const ui::Event& event) override;
diff --git a/chrome/browser/ui/views/passwords/password_pending_view.cc b/chrome/browser/ui/views/passwords/password_pending_view.cc index 618bec7..03294d0 100644 --- a/chrome/browser/ui/views/passwords/password_pending_view.cc +++ b/chrome/browser/ui/views/passwords/password_pending_view.cc
@@ -304,10 +304,10 @@ } } -views::View* PasswordPendingView::CreateFootnoteView() { +std::unique_ptr<views::View> PasswordPendingView::CreateFootnoteView() { if (sign_in_promo_ || !model()->ShouldShowFooter()) return nullptr; - views::Label* label = new views::Label( + auto label = std::make_unique<views::Label>( l10n_util::GetStringUTF16(IDS_SAVE_PASSWORD_FOOTER), ChromeTextContext::CONTEXT_BODY_TEXT_SMALL, STYLE_SECONDARY); label->SetMultiLine(true);
diff --git a/chrome/browser/ui/views/passwords/password_pending_view.h b/chrome/browser/ui/views/passwords/password_pending_view.h index 188a63f..a2adc5d 100644 --- a/chrome/browser/ui/views/passwords/password_pending_view.h +++ b/chrome/browser/ui/views/passwords/password_pending_view.h
@@ -42,7 +42,7 @@ void OnContentChanged(views::EditableCombobox* editable_combobox) override; // PasswordBubbleViewBase: - views::View* CreateFootnoteView() override; + std::unique_ptr<views::View> CreateFootnoteView() override; gfx::Size CalculatePreferredSize() const override; views::View* GetInitiallyFocusedView() override; int GetDialogButtons() const override;
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc index cfb898b..8aab961d 100644 --- a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc +++ b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc
@@ -53,7 +53,9 @@ std::unique_ptr<AuthenticatorRequestDialogModel> model) : content::WebContentsObserver(web_contents), model_(std::move(model)), - sheet_(nullptr) { + sheet_(nullptr), + web_contents_hidden_(web_contents->GetVisibility() == + content::Visibility::HIDDEN) { DCHECK(!model_->should_dialog_be_closed()); model_->AddObserver(this); @@ -259,9 +261,18 @@ constrained_window::ShowWebModalDialogViews(this, web_contents()); DCHECK(GetWidget()); first_shown_ = true; - } else { - GetWidget()->Show(); + return; } + + if (web_contents_hidden_) { + // Calling Widget::Show() while the tab is not in foreground shows the + // dialog on the foreground tab (https://crbug/969153). Instead, wait for + // OnVisibilityChanged() to signal the tab going into foreground again, and + // then show the widget. + return; + } + + GetWidget()->Show(); } void AuthenticatorRequestDialogView::OnSheetModelChanged() { @@ -287,6 +298,19 @@ ui::MENU_SOURCE_MOUSE); } +void AuthenticatorRequestDialogView::OnVisibilityChanged( + content::Visibility visibility) { + const bool web_contents_was_hidden = web_contents_hidden_; + web_contents_hidden_ = visibility == content::Visibility::HIDDEN; + + // Show() does not actually show the dialog while the parent WebContents are + // hidden. Instead, show it when the WebContents become visible again. + if (web_contents_was_hidden && !web_contents_hidden_ && + !model_->should_dialog_be_hidden() && !GetWidget()->IsVisible()) { + GetWidget()->Show(); + } +} + void AuthenticatorRequestDialogView::ReplaceCurrentSheetWith( std::unique_ptr<AuthenticatorRequestSheetView> new_sheet) { DCHECK(new_sheet);
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h index 1ef60d6..a38b2d6 100644 --- a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h +++ b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h
@@ -88,6 +88,8 @@ // views::ButtonListener: void ButtonPressed(views::Button* sender, const ui::Event& event) override; + void OnVisibilityChanged(content::Visibility visibility) override; + private: friend class test::AuthenticatorRequestDialogViewTestApi; friend void ShowAuthenticatorRequestDialog( @@ -109,6 +111,11 @@ std::unique_ptr<views::MenuRunner> other_transports_menu_runner_; bool first_shown_ = false; + // web_contents_hidden_ is true if the |WebContents| that this dialog should + // attach to is currently hidden. In this case, the dialog won't be shown + // when requested, but will wait until the WebContents is visible again. + bool web_contents_hidden_; + DISALLOW_COPY_AND_ASSIGN(AuthenticatorRequestDialogView); };
diff --git a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc index 24fabe1..b0774bb 100644 --- a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc +++ b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc
@@ -270,9 +270,11 @@ chromeos::CrasAudioHandler::Get()->GetAudioDevices(&devices); for (const chromeos::AudioDevice& device : devices) { if (device.type == chromeos::AUDIO_TYPE_HOTWORD) { + VLOG(1) << "Hotword dsp device detected."; return true; } } + VLOG(1) << "No hotword dsp device detected."; return false; }
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser.cc b/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser.cc index dd76b24..9746a36 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser.cc
@@ -18,7 +18,7 @@ #include "services/service_manager/public/cpp/connector.h" #include "ui/display/display.h" #include "ui/display/screen.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/touchscreen_device.h" using content::BrowserThread; @@ -74,13 +74,13 @@ } void OobeDisplayChooser::MaybeMoveToTouchDisplay() { - ui::InputDeviceManager* input_device_manager = - ui::InputDeviceManager::GetInstance(); - if (input_device_manager->AreDeviceListsComplete() && - input_device_manager->AreTouchscreenTargetDisplaysValid()) { + ui::DeviceDataManager* device_data_manager = + ui::DeviceDataManager::GetInstance(); + if (device_data_manager->AreDeviceListsComplete() && + device_data_manager->AreTouchscreenTargetDisplaysValid()) { MoveToTouchDisplay(); - } else if (!scoped_observer_.IsObserving(input_device_manager)) { - scoped_observer_.Add(input_device_manager); + } else if (!scoped_observer_.IsObserving(device_data_manager)) { + scoped_observer_.Add(device_data_manager); } } @@ -89,10 +89,10 @@ scoped_observer_.RemoveAll(); - const ui::InputDeviceManager* input_device_manager = - ui::InputDeviceManager::GetInstance(); + const ui::DeviceDataManager* device_data_manager = + ui::DeviceDataManager::GetInstance(); for (const ui::TouchscreenDevice& device : - input_device_manager->GetTouchscreenDevices()) { + device_data_manager->GetTouchscreenDevices()) { if (IsWhiteListedVendorId(device.vendor_id) && device.target_display_id != display::kInvalidDisplayId) { auto config_properties = ash::mojom::DisplayConfigProperties::New();
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser.h b/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser.h index 7fdd90e..5f2c676 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser.h +++ b/chrome/browser/ui/webui/chromeos/login/oobe_display_chooser.h
@@ -12,7 +12,7 @@ #include "ui/events/devices/input_device_event_observer.h" namespace ui { -class InputDeviceManager; +class DeviceDataManager; } namespace chromeos { @@ -43,7 +43,7 @@ void OnTouchDeviceAssociationChanged() override; void OnDeviceListsComplete() override; - ScopedObserver<ui::InputDeviceManager, ui::InputDeviceEventObserver> + ScopedObserver<ui::DeviceDataManager, ui::InputDeviceEventObserver> scoped_observer_; ash::mojom::CrosDisplayConfigControllerPtr cros_display_config_ptr_;
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index c83c559..9f088cc 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -102,8 +102,8 @@ #include "ui/base/webui/web_ui_util.h" #include "ui/chromeos/resources/grit/ui_chromeos_resources.h" #include "ui/display/display.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/input_device.h" -#include "ui/events/devices/input_device_manager.h" namespace chromeos {
diff --git a/chrome/browser/ui/webui/favicon_source.cc b/chrome/browser/ui/webui/favicon_source.cc index 111a732..f866bd30 100644 --- a/chrome/browser/ui/webui/favicon_source.cc +++ b/chrome/browser/ui/webui/favicon_source.cc
@@ -10,8 +10,8 @@ #include "base/bind_helpers.h" #include "base/metrics/histogram_macros.h" #include "base/strings/string_number_conversions.h" +#include "chrome/browser/favicon/favicon_request_handler_factory.h" #include "chrome/browser/favicon/favicon_service_factory.h" -#include "chrome/browser/favicon/large_icon_service_factory.h" #include "chrome/browser/history/top_sites_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search/instant_io_context.h" @@ -19,6 +19,7 @@ #include "chrome/browser/sync/session_sync_service_factory.h" #include "chrome/common/url_constants.h" #include "chrome/common/webui_url_constants.h" +#include "components/favicon/core/favicon_request_handler.h" #include "components/favicon_base/favicon_url_parser.h" #include "components/history/core/browser/top_sites.h" #include "components/sync/driver/sync_service_utils.h" @@ -159,17 +160,21 @@ } } } + favicon::FaviconRequestHandler* favicon_request_handler = + FaviconRequestHandlerFactory::GetForBrowserContext(profile_); + if (!favicon_request_handler) { + SendDefaultResponse(callback); + return; + } sync_sessions::OpenTabsUIDelegate* open_tabs = GetOpenTabsUIDelegate(profile_); - favicon_request_handler_.GetRawFaviconForPageURL( + favicon_request_handler->GetRawFaviconForPageURL( url, desired_size_in_pixel, base::BindOnce(&FaviconSource::OnFaviconDataAvailable, base::Unretained(this), IconRequest(callback, url, parsed.size_in_dip, parsed.device_scale_factor)), unsafe_request_origin, favicon::FaviconRequestPlatform::kDesktop, - favicon_service, - LargeIconServiceFactory::GetForBrowserContext(profile_), /*icon_url_for_uma=*/ open_tabs ? open_tabs->GetIconUrlForPageUrl(url) : GURL(), base::BindOnce(&GetSyncedFaviconForPageURL, base::Unretained(profile_)),
diff --git a/chrome/browser/ui/webui/favicon_source.h b/chrome/browser/ui/webui/favicon_source.h index 6eec8e5b..af25ade3 100644 --- a/chrome/browser/ui/webui/favicon_source.h +++ b/chrome/browser/ui/webui/favicon_source.h
@@ -11,7 +11,6 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/task/cancelable_task_tracker.h" -#include "components/favicon/core/favicon_request_handler.h" #include "components/favicon/core/favicon_service.h" #include "content/public/browser/url_data_source.h" #include "ui/gfx/favicon_size.h" @@ -118,7 +117,6 @@ void SendDefaultResponse(const IconRequest& request); base::CancelableTaskTracker cancelable_task_tracker_; - favicon::FaviconRequestHandler favicon_request_handler_; DISALLOW_COPY_AND_ASSIGN(FaviconSource); };
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.cc b/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.cc index 11a2cc2..7dc7653 100644 --- a/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.cc
@@ -17,7 +17,7 @@ #include "services/service_manager/public/cpp/connector.h" #include "ui/chromeos/events/event_rewriter_chromeos.h" #include "ui/chromeos/events/keyboard_layout_util.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" namespace { @@ -30,7 +30,7 @@ KeyboardsStateResult GetKeyboardsState() { KeyboardsStateResult result; for (const ui::InputDevice& keyboard : - ui::InputDeviceManager::GetInstance()->GetKeyboardDevices()) { + ui::DeviceDataManager::GetInstance()->GetKeyboardDevices()) { result.has_internal_keyboard |= (keyboard.type == ui::INPUT_DEVICE_INTERNAL); @@ -80,7 +80,7 @@ } void KeyboardHandler::OnJavascriptAllowed() { - observer_.Add(ui::InputDeviceManager::GetInstance()); + observer_.Add(ui::DeviceDataManager::GetInstance()); } void KeyboardHandler::OnJavascriptDisallowed() { @@ -121,7 +121,7 @@ } if (!physical_keyboard) { for (const ui::InputDevice& keyboard : - ui::InputDeviceManager::GetInstance()->GetKeyboardDevices()) { + ui::DeviceDataManager::GetInstance()->GetKeyboardDevices()) { if (keyboard.type != ui::InputDeviceType::INPUT_DEVICE_INTERNAL) { physical_keyboard = true; break;
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.h b/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.h index 84b0108..89e70bb 100644 --- a/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.h +++ b/chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.h
@@ -15,7 +15,7 @@ } namespace ui { -class InputDeviceManager; +class DeviceDataManager; } namespace chromeos { @@ -71,7 +71,7 @@ // Sends the UI a message about whether hardware keyboard are attached. void UpdateKeyboards(); - ScopedObserver<ui::InputDeviceManager, KeyboardHandler> observer_; + ScopedObserver<ui::DeviceDataManager, KeyboardHandler> observer_; DISALLOW_COPY_AND_ASSIGN(KeyboardHandler); };
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc b/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc index e289167..202fcf8 100644 --- a/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc
@@ -14,7 +14,7 @@ #include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" namespace chromeos { namespace settings { @@ -63,7 +63,7 @@ void StylusHandler::OnJavascriptAllowed() { note_observer_.Add(NoteTakingHelper::Get()); - input_observer_.Add(ui::InputDeviceManager::GetInstance()); + input_observer_.Add(ui::DeviceDataManager::GetInstance()); } void StylusHandler::OnJavascriptDisallowed() { @@ -146,12 +146,12 @@ void StylusHandler::HandleInitialize(const base::ListValue* args) { AllowJavascript(); - if (ui::InputDeviceManager::GetInstance()->AreDeviceListsComplete()) + if (ui::DeviceDataManager::GetInstance()->AreDeviceListsComplete()) SendHasStylus(); } void StylusHandler::SendHasStylus() { - DCHECK(ui::InputDeviceManager::GetInstance()->AreDeviceListsComplete()); + DCHECK(ui::DeviceDataManager::GetInstance()->AreDeviceListsComplete()); FireWebUIListener("has-stylus-changed", base::Value(ash::stylus_utils::HasStylusInput())); }
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.h b/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.h index 676d939..a1be49b 100644 --- a/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.h +++ b/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.h
@@ -19,7 +19,7 @@ } namespace ui { -class InputDeviceManager; +class DeviceDataManager; } namespace chromeos { @@ -64,7 +64,7 @@ // Observer registration. ScopedObserver<NoteTakingHelper, NoteTakingHelper::Observer> note_observer_; - ScopedObserver<ui::InputDeviceManager, ui::InputDeviceEventObserver> + ScopedObserver<ui::DeviceDataManager, ui::InputDeviceEventObserver> input_observer_; DISALLOW_COPY_AND_ASSIGN(StylusHandler);
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index e798aaa3..0173305 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -80,6 +80,8 @@ testonly = true sources = [ + "../browser/autofill/automated_tests/cache_replayer.cc", + "../browser/autofill/automated_tests/cache_replayer.h", "base/chrome_render_view_host_test_harness.cc", "base/chrome_render_view_host_test_harness.h", "base/chrome_test_launcher.cc", @@ -2119,7 +2121,6 @@ "../browser/extensions/api/certificate_provider/certificate_provider_apitest.cc", "../browser/extensions/api/networking_private/networking_private_apitest.cc", "../browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc", - "../browser/extensions/api/settings_private/settings_private_browsertest_chromeos.cc", "../browser/extensions/api/vpn_provider/vpn_provider_apitest.cc", "../browser/extensions/chromeos_component_extensions_browsertest.cc", "../browser/notifications/notification_platform_bridge_chromeos_browsertest.cc", @@ -2691,6 +2692,7 @@ "../browser/android/history_report/usage_reports_buffer_backend_unittest.cc", "../browser/android/locale/locale_template_url_loader_unittest.cc", "../browser/android/tab_web_contents_delegate_android_unittest.cc", + "../browser/autofill/automated_tests/cache_replayer_unittest.cc", "../browser/security_events/security_event_recorder_impl_unittest.cc", "../browser/ui/webui/version_handler_win_unittest.cc", @@ -5976,8 +5978,6 @@ "../browser/autofill/autofill_captured_sites_interactive_uitest.cc", "../browser/autofill/autofill_uitest.cc", "../browser/autofill/autofill_uitest.h", - "../browser/autofill/automated_tests/cache_replayer.cc", - "../browser/autofill/automated_tests/cache_replayer.h", "../browser/autofill/captured_sites_test_utils.cc", "../browser/autofill/captured_sites_test_utils.h", "../browser/password_manager/password_manager_captured_sites_interactive_uitest.cc",
diff --git a/chrome/test/base/browser_with_test_window_test.cc b/chrome/test/base/browser_with_test_window_test.cc index 0c7ed6c..9e2350a 100644 --- a/chrome/test/base/browser_with_test_window_test.cc +++ b/chrome/test/base/browser_with_test_window_test.cc
@@ -57,7 +57,7 @@ #endif // This must be created after ash_test_helper_ is set up so that it doesn't - // create an InputDeviceManager. + // create an DeviceDataManager. rvh_test_enabler_ = std::make_unique<content::RenderViewHostTestEnabler>(); #if defined(TOOLKIT_VIEWS)
diff --git a/chrome/test/base/testing_profile.cc b/chrome/test/base/testing_profile.cc index 006cfd22f..35e96b4 100644 --- a/chrome/test/base/testing_profile.cc +++ b/chrome/test/base/testing_profile.cc
@@ -1090,9 +1090,21 @@ return last_session_exited_cleanly_ ? EXIT_NORMAL : EXIT_CRASHED; } +void TestingProfile::SetNetworkContext( + std::unique_ptr<network::mojom::NetworkContext> network_context) { + DCHECK(!network_context_); + network_context_ = std::move(network_context); +} + network::mojom::NetworkContextPtr TestingProfile::CreateNetworkContext( bool in_memory, const base::FilePath& relative_partition_path) { + if (network_context_) { + network::mojom::NetworkContextPtr network_context_ptr; + network_context_bindings_.AddBinding( + network_context_.get(), mojo::MakeRequest(&network_context_ptr)); + return network_context_ptr; + } if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { network::mojom::NetworkContextPtr network_context; network_context_request_ = mojo::MakeRequest(&network_context);
diff --git a/chrome/test/base/testing_profile.h b/chrome/test/base/testing_profile.h index 3c05434..e754e915 100644 --- a/chrome/test/base/testing_profile.h +++ b/chrome/test/base/testing_profile.h
@@ -21,6 +21,7 @@ #include "components/keyed_service/core/simple_factory_key.h" #include "content/public/browser/browser_thread.h" #include "extensions/buildflags/buildflags.h" +#include "mojo/public/cpp/bindings/binding_set.h" #include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/network_service.mojom.h" #include "services/service_manager/public/mojom/service.mojom.h" @@ -251,6 +252,10 @@ sync_preferences::TestingPrefServiceSyncable* GetTestingPrefService(); + // Sets the Profile's NetworkContext. + void SetNetworkContext( + std::unique_ptr<network::mojom::NetworkContext> network_context); + // Called on the parent of an incognito |profile|. Usually called from the // constructor of an incognito TestingProfile, but can also be used by tests // to provide an OffTheRecordProfileImpl instance. @@ -426,6 +431,8 @@ // Holds a dummy network context request to avoid triggering connection error // handler. network::mojom::NetworkContextRequest network_context_request_; + std::unique_ptr<network::mojom::NetworkContext> network_context_; + mojo::BindingSet<network::mojom::NetworkContext> network_context_bindings_; std::unique_ptr<Profile> incognito_profile_; TestingProfile* original_profile_;
diff --git a/chrome/test/data/android/portals/touch-transfer-portal.html b/chrome/test/data/android/portals/touch-transfer-portal.html new file mode 100644 index 0000000..bc15d7b --- /dev/null +++ b/chrome/test/data/android/portals/touch-transfer-portal.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html> +<style> + #scroller { + width: 300px; + height: 2000px; + background-color: green; + } +</style> +<body> + <div id="scroller"></div> +</body> +</html>
diff --git a/chrome/test/data/android/portals/touch-transfer.html b/chrome/test/data/android/portals/touch-transfer.html new file mode 100644 index 0000000..34c7ac9 --- /dev/null +++ b/chrome/test/data/android/portals/touch-transfer.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html> +<body> + <div>This is the embedder</div> + <portal src="touch-transfer-portal.html"></portal> + <script> + document.addEventListener("overscroll", e => { + var portal = document.querySelector("portal"); + portal.activate(); + }); + </script> +</body> +</html>
diff --git a/chrome/test/data/extensions/api_test/autotest_private/test.js b/chrome/test/data/extensions/api_test/autotest_private/test.js index 2d51358a..636d648 100644 --- a/chrome/test/data/extensions/api_test/autotest_private/test.js +++ b/chrome/test/data/extensions/api_test/autotest_private/test.js
@@ -234,21 +234,21 @@ function setAssistantEnabled() { chrome.autotestPrivate.setAssistantEnabled(true, 1000 /* timeout_ms */, chrome.test.callbackFail( - 'Assistant not allowed - state: 4')); + 'Assistant not allowed - state: 3')); }, function sendAssistantTextQuery() { chrome.autotestPrivate.sendAssistantTextQuery( 'what time is it?' /* query */, 1000 /* timeout_ms */, chrome.test.callbackFail( - 'Assistant not allowed - state: 4')); + 'Assistant not allowed - state: 3')); }, function setWhitelistedPref() { chrome.autotestPrivate.setWhitelistedPref( 'settings.voice_interaction.hotword.enabled' /* pref_name */, true /* value */, chrome.test.callbackFail( - 'Assistant not allowed - state: 4')); + 'Assistant not allowed - state: 3')); }, // This test verifies that getArcState returns provisioned False in case ARC // is not provisioned by default.
diff --git a/chrome/test/media_router/telemetry/README.md b/chrome/test/media_router/telemetry/README.md index 24c39eed..e8d86dd 100644 --- a/chrome/test/media_router/telemetry/README.md +++ b/chrome/test/media_router/telemetry/README.md
@@ -16,7 +16,7 @@ ```shell ./chrome/test/media_router/telemetry/run_benchmark --browser=<browser> \ - media_router.dialog.latency.histogram + media_router.cpu_memory ``` The results will be in
diff --git a/chrome/test/media_router/telemetry/benchmarks/media_router_benchmark.py b/chrome/test/media_router/telemetry/benchmarks/media_router_benchmark.py index f2e3d85..caeabae6 100644 --- a/chrome/test/media_router/telemetry/benchmarks/media_router_benchmark.py +++ b/chrome/test/media_router/telemetry/benchmarks/media_router_benchmark.py
@@ -3,15 +3,11 @@ # found in the LICENSE file. import os -from telemetry import benchmark from core import perf_benchmark from core import path_util -from telemetry.timeline import chrome_trace_category_filter -from telemetry.web_perf import timeline_based_measurement from benchmarks.pagesets import media_router_perf_pages from benchmarks import media_router_measurements -from benchmarks import media_router_timeline_metric class _BaseCastBenchmark(perf_benchmark.PerfBenchmark): @@ -39,22 +35,6 @@ ]) -class HistogramCastBenckmark(_BaseCastBenchmark): - """Benchmark for dialog latency from histograms.""" - - def CreatePageTest(self, options): - return media_router_measurements.MediaRouterDialogTest() - - @classmethod - def Name(cls): - return 'media_router.dialog.latency.histogram' - - @classmethod - def ShouldAddValue(cls, _, from_first_story_run): - """Only drops the first result.""" - return not from_first_story_run - - class CPUMemoryCastBenckmark(_BaseCastBenchmark): """Benchmark for CPU and memory usage with Media Router."""
diff --git a/chrome/test/media_router/telemetry/benchmarks/media_router_dialog_metric.py b/chrome/test/media_router/telemetry/benchmarks/media_router_dialog_metric.py deleted file mode 100644 index 85f66b8..0000000 --- a/chrome/test/media_router/telemetry/benchmarks/media_router_dialog_metric.py +++ /dev/null
@@ -1,71 +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. - -import json - -from telemetry.value import histogram -from telemetry.value import histogram_util -from telemetry.value import scalar - -from metrics import Metric - -HISTOGRAMS_TO_RECORD = [ - { - 'name': 'MediaRouter.Ui.Dialog.LoadedWithData', 'units': 'ms', - 'display_name': 'dialog_loaded_with_data', - 'type': histogram_util.BROWSER_HISTOGRAM, - 'description': 'The latency to render the media router dialog with data.', - }, - { - 'name': 'MediaRouter.Ui.Dialog.Paint', 'units': 'ms', - 'display_name': 'dialog_paint', - 'type': histogram_util.BROWSER_HISTOGRAM, - 'description': 'The latency to paint the media router dialog.', - }] - - -class MediaRouterDialogMetric(Metric): - "A metric for media router dialog latency from histograms." - - def __init__(self): - super(MediaRouterDialogMetric, self).__init__() - self._histogram_start = dict() - self._histogram_delta = dict() - self._started = False - - def Start(self, page, tab): - self._started = True - - for h in HISTOGRAMS_TO_RECORD: - histogram_data = histogram_util.GetHistogram( - h['type'], h['name'], tab) - # Histogram data may not be available - if not histogram_data: - continue - self._histogram_start[h['name']] = histogram_data - - def Stop(self, page, tab): - assert self._started, 'Must call Start() first' - for h in HISTOGRAMS_TO_RECORD: - # Histogram data may not be available - if h['name'] not in self._histogram_start: - continue - histogram_data = histogram_util.GetHistogram( - h['type'], h['name'], tab) - - if not histogram_data: - continue - self._histogram_delta[h['name']] = histogram_util.SubtractHistogram( - histogram_data, self._histogram_start[h['name']]) - - def AddResults(self, tab, results): - assert self._histogram_delta, 'Must call Stop() first' - for h in HISTOGRAMS_TO_RECORD: - # Histogram data may not be available - if h['name'] not in self._histogram_delta: - continue - results.AddValue(histogram.HistogramValue( - results.current_page, h['display_name'], h['units'], - raw_value_json=self._histogram_delta[h['name']], important=False, - description=h.get('description')))
diff --git a/chrome/test/media_router/telemetry/benchmarks/media_router_measurements.py b/chrome/test/media_router/telemetry/benchmarks/media_router_measurements.py index d42e046..6746735 100644 --- a/chrome/test/media_router/telemetry/benchmarks/media_router_measurements.py +++ b/chrome/test/media_router/telemetry/benchmarks/media_router_measurements.py
@@ -2,26 +2,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -from benchmarks import media_router_dialog_metric from benchmarks import media_router_cpu_memory_metric from telemetry.page import legacy_page_test -class MediaRouterDialogTest(legacy_page_test.LegacyPageTest): - """Performs a measurement of Media Route dialog latency.""" - - def __init__(self): - super(MediaRouterDialogTest, self).__init__() - self._metric = media_router_dialog_metric.MediaRouterDialogMetric() - - def DidNavigateToPage(self, page, tab): - self._metric.Start(page, tab) - - def ValidateAndMeasurePage(self, page, tab, results): - self._metric.Stop(page, tab) - self._metric.AddResults(tab, results) - - class MediaRouterCPUMemoryTest(legacy_page_test.LegacyPageTest): """Performs a measurement of Media Route CPU/memory usage."""
diff --git a/chromecast/browser/exo/wm_helper_cast_shell.cc b/chromecast/browser/exo/wm_helper_cast_shell.cc index d15e7248..6a156778 100644 --- a/chromecast/browser/exo/wm_helper_cast_shell.cc +++ b/chromecast/browser/exo/wm_helper_cast_shell.cc
@@ -15,7 +15,7 @@ #include "ui/display/manager/display_manager.h" #include "ui/display/screen.h" #include "ui/display/types/display_snapshot.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/wm/public/activation_client.h" namespace exo {
diff --git a/components/favicon/core/favicon_request_handler.cc b/components/favicon/core/favicon_request_handler.cc index 7531923..55f897e 100644 --- a/components/favicon/core/favicon_request_handler.cc +++ b/components/favicon/core/favicon_request_handler.cc
@@ -104,17 +104,22 @@ return !icon_url.is_empty() ? icon_url : page_url; } -bool CanQueryGoogleServer(LargeIconService* large_icon_service, - FaviconRequestOrigin origin, +bool CanQueryGoogleServer(FaviconRequestOrigin origin, bool can_send_history_data) { - return large_icon_service && CanOriginQueryGoogleServer(origin) && - can_send_history_data && + return CanOriginQueryGoogleServer(origin) && can_send_history_data && base::FeatureList::IsEnabled(kEnableHistoryFaviconsGoogleServerQuery); } } // namespace -FaviconRequestHandler::FaviconRequestHandler() {} +FaviconRequestHandler::FaviconRequestHandler( + FaviconService* favicon_service, + LargeIconService* large_icon_service) + : favicon_service_(favicon_service), + large_icon_service_(large_icon_service) { + DCHECK(favicon_service); + DCHECK(large_icon_service); +} FaviconRequestHandler::~FaviconRequestHandler() {} @@ -124,32 +129,20 @@ favicon_base::FaviconRawBitmapCallback callback, FaviconRequestOrigin request_origin, FaviconRequestPlatform request_platform, - FaviconService* favicon_service, - LargeIconService* large_icon_service, const GURL& icon_url_for_uma, FaviconRequestHandler::SyncedFaviconGetter synced_favicon_getter, bool can_send_history_data, base::CancelableTaskTracker* tracker) { - if (!favicon_service) { - RecordFaviconAvailabilityMetric(request_origin, - FaviconAvailability::kNotAvailable); - std::move(callback).Run(favicon_base::FaviconRawBitmapResult()); - return; - } - // First attempt to find the icon locally. - favicon_service->GetRawFaviconForPageURL( + favicon_service_->GetRawFaviconForPageURL( page_url, GetIconTypesForLocalQuery(), desired_size_in_pixel, kFallbackToHost, - base::BindOnce(&FaviconRequestHandler::OnBitmapLocalDataAvailable, - weak_ptr_factory_.GetWeakPtr(), page_url, - desired_size_in_pixel, - /*response_callback=*/std::move(callback), request_origin, - request_platform, favicon_service, large_icon_service, - icon_url_for_uma, std::move(synced_favicon_getter), - CanQueryGoogleServer(large_icon_service, request_origin, - can_send_history_data), - tracker), + base::BindOnce( + &FaviconRequestHandler::OnBitmapLocalDataAvailable, + weak_ptr_factory_.GetWeakPtr(), page_url, desired_size_in_pixel, + /*response_callback=*/std::move(callback), request_origin, + request_platform, icon_url_for_uma, std::move(synced_favicon_getter), + CanQueryGoogleServer(request_origin, can_send_history_data), tracker), tracker); } @@ -157,30 +150,19 @@ const GURL& page_url, favicon_base::FaviconImageCallback callback, FaviconRequestOrigin request_origin, - FaviconService* favicon_service, - LargeIconService* large_icon_service, const GURL& icon_url_for_uma, FaviconRequestHandler::SyncedFaviconGetter synced_favicon_getter, bool can_send_history_data, base::CancelableTaskTracker* tracker) { - if (!favicon_service) { - RecordFaviconAvailabilityMetric(request_origin, - FaviconAvailability::kNotAvailable); - std::move(callback).Run(favicon_base::FaviconImageResult()); - return; - } - // First attempt to find the icon locally. - favicon_service->GetFaviconImageForPageURL( + favicon_service_->GetFaviconImageForPageURL( page_url, - base::BindOnce(&FaviconRequestHandler::OnImageLocalDataAvailable, - weak_ptr_factory_.GetWeakPtr(), page_url, - /*response_callback=*/std::move(callback), request_origin, - favicon_service, large_icon_service, icon_url_for_uma, - std::move(synced_favicon_getter), - CanQueryGoogleServer(large_icon_service, request_origin, - can_send_history_data), - tracker), + base::BindOnce( + &FaviconRequestHandler::OnImageLocalDataAvailable, + weak_ptr_factory_.GetWeakPtr(), page_url, + /*response_callback=*/std::move(callback), request_origin, + icon_url_for_uma, std::move(synced_favicon_getter), + CanQueryGoogleServer(request_origin, can_send_history_data), tracker), tracker); } @@ -190,8 +172,6 @@ favicon_base::FaviconRawBitmapCallback response_callback, FaviconRequestOrigin origin, FaviconRequestPlatform platform, - FaviconService* favicon_service, - LargeIconService* large_icon_service, const GURL& icon_url_for_uma, FaviconRequestHandler::SyncedFaviconGetter synced_favicon_getter, bool can_query_google_server, @@ -201,8 +181,7 @@ // The icon comes from local storage now even though it may have been // originally retrieved from Google server. RecordFaviconAvailabilityMetric(origin, FaviconAvailability::kLocal); - if (large_icon_service) - large_icon_service->TouchIconFromGoogleServer(bitmap_result.icon_url); + large_icon_service_->TouchIconFromGoogleServer(bitmap_result.icon_url); std::move(response_callback).Run(bitmap_result); return; } @@ -227,10 +206,10 @@ /*local_lookup_callback=*/ base::BindOnce( base::IgnoreResult(&FaviconService::GetRawFaviconForPageURL), - base::Unretained(favicon_service), page_url, + base::Unretained(favicon_service_), page_url, GetIconTypesForLocalQuery(), desired_size_in_pixel, kFallbackToHost, repeating_response_callback, tracker), - large_icon_service, icon_url_for_uma, origin); + icon_url_for_uma, origin); return; } @@ -254,8 +233,6 @@ const GURL& page_url, favicon_base::FaviconImageCallback response_callback, FaviconRequestOrigin origin, - FaviconService* favicon_service, - LargeIconService* large_icon_service, const GURL& icon_url_for_uma, FaviconRequestHandler::SyncedFaviconGetter synced_favicon_getter, bool can_query_google_server, @@ -265,8 +242,7 @@ // The icon comes from local storage now even though it may have been // originally retrieved from Google server. RecordFaviconAvailabilityMetric(origin, FaviconAvailability::kLocal); - if (large_icon_service) - large_icon_service->TouchIconFromGoogleServer(image_result.icon_url); + large_icon_service_->TouchIconFromGoogleServer(image_result.icon_url); std::move(response_callback).Run(image_result); return; } @@ -286,9 +262,9 @@ /*local_lookup_callback=*/ base::BindOnce( base::IgnoreResult(&FaviconService::GetFaviconImageForPageURL), - base::Unretained(favicon_service), page_url, + base::Unretained(favicon_service_), page_url, repeating_response_callback, tracker), - large_icon_service, icon_url_for_uma, origin); + icon_url_for_uma, origin); return; } @@ -315,7 +291,6 @@ std::unique_ptr<FaviconServerFetcherParams> server_parameters, base::OnceClosure empty_response_callback, base::OnceClosure local_lookup_callback, - LargeIconService* large_icon_service, const GURL& icon_url_for_uma, FaviconRequestOrigin origin) { net::NetworkTrafficAnnotationTag traffic_annotation = @@ -360,7 +335,7 @@ bool should_trim_url_path = base::GetFieldTrialParamByFeatureAsBool( kEnableHistoryFaviconsGoogleServerQuery, "trim_url_path", /* default_value= */ false); - large_icon_service + large_icon_service_ ->GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache( std::move(server_parameters), /*may_page_url_be_private=*/true, should_trim_url_path,
diff --git a/components/favicon/core/favicon_request_handler.h b/components/favicon/core/favicon_request_handler.h index 27d5e2cc..11e2c0d 100644 --- a/components/favicon/core/favicon_request_handler.h +++ b/components/favicon/core/favicon_request_handler.h
@@ -6,12 +6,14 @@ #define COMPONENTS_FAVICON_CORE_FAVICON_REQUEST_HANDLER_H_ #include <map> +#include <memory> #include "base/memory/ref_counted_memory.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/task/cancelable_task_tracker.h" #include "components/favicon_base/favicon_callback.h" +#include "components/keyed_service/core/keyed_service.h" #include "url/gurl.h" namespace favicon { @@ -50,24 +52,21 @@ kDesktop, }; -// Class for handling favicon requests by page url, forwarding them to local -// storage, sync or Google server accordingly. -// TODO(victorvianna): Refactor LargeIconService to avoid having to pass both -// it and FaviconService to the API. +// Keyed service for handling favicon requests by page url, forwarding them to +// local storage, sync or Google server accordingly. // TODO(victorvianna): Use a more natural order for the parameters in the API. // TODO(victorvianna): Remove |icon_url_for_uma| when we have access to the // FaviconUrlMapper. -class FaviconRequestHandler { +class FaviconRequestHandler : public KeyedService { public: - // Callback that requests the synced bitmap for the page url given in the - // the first argument, storing the result in the second argument. Returns - // whether the request succeeded. + // Callback that requests the synced bitmap for a page url. using SyncedFaviconGetter = base::OnceCallback<scoped_refptr<base::RefCountedMemory>(const GURL&)>; - FaviconRequestHandler(); + FaviconRequestHandler(FaviconService* favicon_service, + LargeIconService* large_icon_service); - ~FaviconRequestHandler(); + ~FaviconRequestHandler() override; // Requests favicon bitmap at |page_url| of size |desired_size_in_pixel|. // Tries to fetch the icon from local storage and falls back to sync, or to @@ -83,8 +82,6 @@ favicon_base::FaviconRawBitmapCallback callback, FaviconRequestOrigin request_origin, FaviconRequestPlatform request_platform, - FaviconService* favicon_service, - LargeIconService* large_icon_service, const GURL& icon_url_for_uma, SyncedFaviconGetter synced_favicon_getter, bool can_send_history_data, @@ -102,8 +99,6 @@ void GetFaviconImageForPageURL(const GURL& page_url, favicon_base::FaviconImageCallback callback, FaviconRequestOrigin request_origin, - FaviconService* favicon_service, - LargeIconService* large_icon_service, const GURL& icon_url_for_uma, SyncedFaviconGetter synced_favicon_getter, bool can_send_history_data, @@ -120,8 +115,6 @@ favicon_base::FaviconRawBitmapCallback response_callback, FaviconRequestOrigin origin, FaviconRequestPlatform platform, - FaviconService* favicon_service, - LargeIconService* large_icon_service, const GURL& icon_url_for_uma, SyncedFaviconGetter synced_favicon_getter, bool can_query_google_server, @@ -136,8 +129,6 @@ const GURL& page_url, favicon_base::FaviconImageCallback response_callback, FaviconRequestOrigin origin, - FaviconService* favicon_service, - LargeIconService* large_icon_service, const GURL& icon_url_for_uma, SyncedFaviconGetter synced_favicon_getter, bool can_query_google_server, @@ -152,7 +143,6 @@ std::unique_ptr<FaviconServerFetcherParams> server_parameters, base::OnceClosure empty_response_callback, base::OnceClosure local_lookup_callback, - LargeIconService* large_icon_service, const GURL& icon_url_for_uma, FaviconRequestOrigin origin); @@ -168,6 +158,10 @@ const GURL& group_to_clear, favicon_base::GoogleFaviconServerRequestStatus status); + FaviconService* const favicon_service_; + + LargeIconService* const large_icon_service_; + // Map from a group identifier to the number of callbacks in that group which // would be waiting for execution. Used for recording metrics for the possible // benefit of grouping.
diff --git a/components/favicon/core/favicon_request_handler_unittest.cc b/components/favicon/core/favicon_request_handler_unittest.cc index d11187f..d076cdfd 100644 --- a/components/favicon/core/favicon_request_handler_unittest.cc +++ b/components/favicon/core/favicon_request_handler_unittest.cc
@@ -4,6 +4,8 @@ #include "components/favicon/core/favicon_request_handler.h" +#include <utility> + #include "base/bind.h" #include "base/task/cancelable_task_tracker.h" #include "base/test/metrics/histogram_tester.h" @@ -111,17 +113,19 @@ class FaviconRequestHandlerTest : public ::testing::Test { public: - FaviconRequestHandlerTest() = default; + FaviconRequestHandlerTest() + : favicon_request_handler_(&mock_favicon_service_, + &mock_large_icon_service_) {} protected: testing::NiceMock<MockFaviconService> mock_favicon_service_; testing::NiceMock<MockLargeIconService> mock_large_icon_service_; - FaviconRequestHandler favicon_request_handler_; base::MockCallback<FaviconRequestHandler::SyncedFaviconGetter> synced_favicon_getter_; base::CancelableTaskTracker tracker_; base::HistogramTester histogram_tester_; base::test::ScopedFeatureList scoped_feature_list_; + FaviconRequestHandler favicon_request_handler_; }; TEST_F(FaviconRequestHandlerTest, ShouldGetEmptyBitmap) { @@ -141,7 +145,7 @@ favicon_request_handler_.GetRawFaviconForPageURL( GURL(kDummyPageUrl), kDesiredSizeInPixel, base::BindOnce(&StoreBitmap, &result), FaviconRequestOrigin::UNKNOWN, - kDummyPlatform, &mock_favicon_service_, &mock_large_icon_service_, + kDummyPlatform, /*icon_url_for_uma=*/GURL(), synced_favicon_getter_.Get(), /*can_send_history_data=*/true, &tracker_); EXPECT_FALSE(result.is_valid()); @@ -166,7 +170,7 @@ favicon_request_handler_.GetRawFaviconForPageURL( GURL(kDummyPageUrl), kDesiredSizeInPixel, base::BindOnce(&StoreBitmap, &result), FaviconRequestOrigin::UNKNOWN, - kDummyPlatform, &mock_favicon_service_, &mock_large_icon_service_, + kDummyPlatform, /*icon_url_for_uma=*/GURL(), synced_favicon_getter_.Get(), /*can_send_history_data=*/true, &tracker_); EXPECT_TRUE(result.is_valid()); @@ -192,7 +196,7 @@ favicon_request_handler_.GetRawFaviconForPageURL( GURL(kDummyPageUrl), kDesiredSizeInPixel, base::BindOnce(&StoreBitmap, &result), FaviconRequestOrigin::UNKNOWN, - kDummyPlatform, &mock_favicon_service_, &mock_large_icon_service_, + kDummyPlatform, /*icon_url_for_uma=*/GURL(), synced_favicon_getter_.Get(), /*can_send_history_data=*/true, &tracker_); EXPECT_TRUE(result.is_valid()); @@ -201,8 +205,7 @@ } TEST_F(FaviconRequestHandlerTest, ShouldGetGoogleServerBitmapForFullUrl) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeatureWithParameters( + scoped_feature_list_.InitAndEnableFeatureWithParameters( kEnableHistoryFaviconsGoogleServerQuery, {{"trim_url_path", "false"}}); EXPECT_CALL(mock_favicon_service_, GetRawFaviconForPageURL(GURL(kDummyPageUrl), _, @@ -230,15 +233,14 @@ favicon_request_handler_.GetRawFaviconForPageURL( GURL(kDummyPageUrl), kDesiredSizeInPixel, base::BindOnce(&StoreBitmap, &result), FaviconRequestOrigin::HISTORY, - kDummyPlatform, &mock_favicon_service_, &mock_large_icon_service_, + kDummyPlatform, /*icon_url_for_uma=*/GURL(), synced_favicon_getter_.Get(), /*can_send_history_data=*/true, &tracker_); EXPECT_TRUE(result.is_valid()); } TEST_F(FaviconRequestHandlerTest, ShouldGetGoogleServerBitmapForTrimmedUrl) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeatureWithParameters( + scoped_feature_list_.InitAndEnableFeatureWithParameters( kEnableHistoryFaviconsGoogleServerQuery, {{"trim_url_path", "true"}}); EXPECT_CALL(mock_favicon_service_, GetRawFaviconForPageURL(GURL(kDummyPageUrl), _, @@ -266,7 +268,7 @@ favicon_request_handler_.GetRawFaviconForPageURL( GURL(kDummyPageUrl), kDesiredSizeInPixel, base::BindOnce(&StoreBitmap, &result), FaviconRequestOrigin::HISTORY, - kDummyPlatform, &mock_favicon_service_, &mock_large_icon_service_, + kDummyPlatform, /*icon_url_for_uma=*/GURL(), synced_favicon_getter_.Get(), /*can_send_history_data=*/true, &tracker_); EXPECT_TRUE(result.is_valid()); @@ -290,8 +292,7 @@ favicon_base::FaviconImageResult result; favicon_request_handler_.GetFaviconImageForPageURL( GURL(kDummyPageUrl), base::BindOnce(&StoreImage, &result), - FaviconRequestOrigin::UNKNOWN, &mock_favicon_service_, - &mock_large_icon_service_, + FaviconRequestOrigin::UNKNOWN, /*icon_url_for_uma=*/GURL(), synced_favicon_getter_.Get(), /*can_send_history_data=*/true, &tracker_); EXPECT_TRUE(result.image.IsEmpty()); @@ -313,8 +314,7 @@ favicon_base::FaviconImageResult result; favicon_request_handler_.GetFaviconImageForPageURL( GURL(kDummyPageUrl), base::BindOnce(&StoreImage, &result), - FaviconRequestOrigin::UNKNOWN, &mock_favicon_service_, - &mock_large_icon_service_, + FaviconRequestOrigin::UNKNOWN, /*icon_url_for_uma=*/GURL(), synced_favicon_getter_.Get(), /*can_send_history_data=*/true, &tracker_); EXPECT_FALSE(result.image.IsEmpty()); @@ -337,8 +337,7 @@ favicon_base::FaviconImageResult result; favicon_request_handler_.GetFaviconImageForPageURL( GURL(kDummyPageUrl), base::BindOnce(&StoreImage, &result), - FaviconRequestOrigin::UNKNOWN, &mock_favicon_service_, - &mock_large_icon_service_, + FaviconRequestOrigin::UNKNOWN, /*icon_url_for_uma=*/GURL(), synced_favicon_getter_.Get(), /*can_send_history_data=*/true, &tracker_); EXPECT_FALSE(result.image.IsEmpty()); @@ -347,8 +346,7 @@ } TEST_F(FaviconRequestHandlerTest, ShouldGetGoogleServerImageForFullUrl) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeatureWithParameters( + scoped_feature_list_.InitAndEnableFeatureWithParameters( kEnableHistoryFaviconsGoogleServerQuery, {{"trim_url_path", "false"}}); EXPECT_CALL(mock_favicon_service_, GetFaviconImageForPageURL(GURL(kDummyPageUrl), _, &tracker_)) @@ -372,8 +370,7 @@ favicon_base::FaviconImageResult result; favicon_request_handler_.GetFaviconImageForPageURL( GURL(kDummyPageUrl), base::BindOnce(&StoreImage, &result), - FaviconRequestOrigin::RECENTLY_CLOSED_TABS, &mock_favicon_service_, - &mock_large_icon_service_, /*icon_url_for_uma=*/GURL(), + FaviconRequestOrigin::RECENTLY_CLOSED_TABS, /*icon_url_for_uma=*/GURL(), synced_favicon_getter_.Get(), /*can_send_history_data=*/true, &tracker_); EXPECT_FALSE(result.image.IsEmpty()); histogram_tester_.ExpectUniqueSample( @@ -384,8 +381,7 @@ } TEST_F(FaviconRequestHandlerTest, ShouldGetGoogleServerImageForTrimmedUrl) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeatureWithParameters( + scoped_feature_list_.InitAndEnableFeatureWithParameters( kEnableHistoryFaviconsGoogleServerQuery, {{"trim_url_path", "true"}}); EXPECT_CALL(mock_favicon_service_, GetFaviconImageForPageURL(GURL(kDummyPageUrl), _, &tracker_)) @@ -409,16 +405,14 @@ favicon_base::FaviconImageResult result; favicon_request_handler_.GetFaviconImageForPageURL( GURL(kDummyPageUrl), base::BindOnce(&StoreImage, &result), - FaviconRequestOrigin::RECENTLY_CLOSED_TABS, &mock_favicon_service_, - &mock_large_icon_service_, /*icon_url_for_uma=*/GURL(), + FaviconRequestOrigin::RECENTLY_CLOSED_TABS, /*icon_url_for_uma=*/GURL(), synced_favicon_getter_.Get(), /*can_send_history_data=*/true, &tracker_); EXPECT_FALSE(result.image.IsEmpty()); } TEST_F(FaviconRequestHandlerTest, ShouldNotQueryGoogleServerIfCannotSendData) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( + scoped_feature_list_.InitAndEnableFeature( kEnableHistoryFaviconsGoogleServerQuery); EXPECT_CALL(mock_favicon_service_, GetRawFaviconForPageURL(GURL(kDummyPageUrl), _, @@ -436,7 +430,7 @@ favicon_request_handler_.GetRawFaviconForPageURL( GURL(kDummyPageUrl), kDesiredSizeInPixel, base::BindOnce(&StoreBitmap, &result), FaviconRequestOrigin::HISTORY, - kDummyPlatform, &mock_favicon_service_, &mock_large_icon_service_, + kDummyPlatform, /*icon_url_for_uma=*/GURL(), synced_favicon_getter_.Get(), /*can_send_history_data=*/false, &tracker_); }
diff --git a/components/pdf/renderer/pdf_accessibility_tree.cc b/components/pdf/renderer/pdf_accessibility_tree.cc index 49da6bf..43a47cd 100644 --- a/components/pdf/renderer/pdf_accessibility_tree.cc +++ b/components/pdf/renderer/pdf_accessibility_tree.cc
@@ -455,6 +455,10 @@ return node->parent(); } +bool PdfAccessibilityTree::IsIgnored(const ui::AXNode* node) const { + return node->data().HasState(ax::mojom::State::kIgnored); +} + bool PdfAccessibilityTree::IsValid(const ui::AXNode* node) const { return node != nullptr; }
diff --git a/components/pdf/renderer/pdf_accessibility_tree.h b/components/pdf/renderer/pdf_accessibility_tree.h index 1d6ef4e..4c468e6 100644 --- a/components/pdf/renderer/pdf_accessibility_tree.h +++ b/components/pdf/renderer/pdf_accessibility_tree.h
@@ -53,6 +53,7 @@ void GetChildren(const ui::AXNode* node, std::vector<const ui::AXNode*>* out_children) const override; ui::AXNode* GetParent(const ui::AXNode* node) const override; + bool IsIgnored(const ui::AXNode* node) const override; bool IsValid(const ui::AXNode* node) const override; bool IsEqual(const ui::AXNode* node1, const ui::AXNode* node2) const override; const ui::AXNode* GetNull() const override;
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index f2f0796f..c67d867d 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -15337,7 +15337,7 @@ If the policy is enabled, Google Assistant would listen for the voice activation phrase. If the policy is disabled, Google Assistant would not listen for the voice activation phrase. - If the policy is not set, Google Assistant would not listen for the voice activation phrase. + If the policy is not set, users can decide whether to allow Google Assistant to listen for the voice activation phrase. ''', }, {
diff --git a/components/ui_devtools/dom_agent.cc b/components/ui_devtools/dom_agent.cc index 8cf2d970a..99de980 100644 --- a/components/ui_devtools/dom_agent.cc +++ b/components/ui_devtools/dom_agent.cc
@@ -4,14 +4,25 @@ #include "components/ui_devtools/dom_agent.h" +#include <algorithm> #include <memory> #include <string> #include <utility> +#include "base/containers/adapters.h" #include "components/ui_devtools/devtools_server.h" #include "components/ui_devtools/root_element.h" #include "components/ui_devtools/ui_element.h" +namespace { + +std::string CreateIdentifier() { + static int last_used_identifier; + return base::NumberToString(++last_used_identifier); +} + +} // namespace + namespace ui_devtools { using ui_devtools::protocol::Array; @@ -30,7 +41,9 @@ } Response DOMAgent::getDocument(std::unique_ptr<Node>* out_root) { + element_root_->ResetNodeId(); *out_root = BuildInitialTree(); + is_document_created_ = true; return Response::OK(); } @@ -122,8 +135,6 @@ return 0; } -// TODO(mhashmi): Make ids reusable - std::unique_ptr<Node> DOMAgent::BuildNode( const std::string& name, std::unique_ptr<Array<std::string>> attributes, @@ -183,6 +194,119 @@ element_root_.reset(); node_id_to_ui_element_.clear(); observers_.Clear(); + is_document_created_ = false; + search_results_.clear(); +} + +// code is based on InspectorDOMAgent::performSearch() from +// src/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc +Response DOMAgent::performSearch( + const protocol::String& whitespace_trimmed_query, + protocol::Maybe<bool> optional_include_user_agent_shadow_dom, + protocol::String* search_id, + int* result_count) { + protocol::String query = whitespace_trimmed_query; + std::transform(query.begin(), query.end(), query.begin(), ::tolower); + + unsigned query_length = query.length(); + bool start_tag_found = !query.find('<'); + bool end_tag_found = query.rfind('>') + 1 == query_length; + bool start_quote_found = !query.find('"'); + bool end_quote_found = query.rfind('"') + 1 == query_length; + bool exact_attribute_match = start_quote_found && end_quote_found; + + protocol::String tag_name_query = query; + protocol::String attribute_query = query; + if (start_tag_found) + tag_name_query = tag_name_query.substr(1, tag_name_query.length() - 1); + if (end_tag_found) + tag_name_query = tag_name_query.substr(0, tag_name_query.length() - 1); + if (start_quote_found) + attribute_query = attribute_query.substr(1, attribute_query.length() - 1); + if (end_quote_found) + attribute_query = attribute_query.substr(0, attribute_query.length() - 1); + + std::vector<int> result_collector; + std::vector<UIElement*> stack; + + // root node from element_root() is not a real node from DOM tree + // the children of the root node are the 'actual' roots of the DOM tree + UIElement* root = element_root(); + std::vector<UIElement*> root_list = root->children(); + DCHECK(root_list.size()); + // Children are accessed from bottom to top. So iterate backwards. + for (auto* root : base::Reversed(root_list)) + stack.push_back(root); + + // Manual plain text search. DFS traversal. + while (!stack.empty()) { + UIElement* node = stack.back(); + stack.pop_back(); + protocol::String node_name = node->GetTypeName(); + std::transform(node_name.begin(), node_name.end(), node_name.begin(), + ::tolower); + + std::vector<UIElement*> children_array = node->children(); + // Children are accessed from bottom to top. So iterate backwards. + for (auto* child : base::Reversed(children_array)) + stack.push_back(child); + + if (node_name.find(query) != protocol::String::npos || + node_name == tag_name_query) { + result_collector.push_back(node->node_id()); + continue; + } + + std::unique_ptr<protocol::Array<std::string>> attribute_array = + node->GetAttributes(); + if (!attribute_array->length()) + continue; + for (size_t i = 0; i < attribute_array->length(); ++i) { + protocol::String data = attribute_array->get(i); + std::transform(data.begin(), data.end(), data.begin(), ::tolower); + if (data.find(query) != protocol::String::npos) { + result_collector.push_back(node->node_id()); + break; + } + if (data.find(attribute_query) != protocol::String::npos) { + if (!exact_attribute_match || + data.length() == attribute_query.length()) { + result_collector.push_back(node->node_id()); + } + break; + } + } + } + + *search_id = CreateIdentifier(); + *result_count = result_collector.size(); + search_results_.insert( + std::make_pair(*search_id, std::move(result_collector))); + return Response::OK(); +} + +Response DOMAgent::getSearchResults( + const protocol::String& search_id, + int from_index, + int to_index, + std::unique_ptr<protocol::Array<int>>* node_ids) { + SearchResults::iterator it = search_results_.find(search_id); + if (it == search_results_.end()) + return Response::Error("No search session with given id found"); + + int size = it->second.size(); + if (from_index < 0 || to_index > size || from_index >= to_index) + return Response::Error("Invalid search result range"); + + *node_ids = protocol::Array<int>::create(); + for (int i = from_index; i < to_index; ++i) + (*node_ids)->addItem((it->second)[i]); + return Response::OK(); +} + +Response DOMAgent::discardSearchResults(const protocol::String& search_id) { + search_results_.erase(search_id); + return Response::OK(); } } // namespace ui_devtools
diff --git a/components/ui_devtools/dom_agent.h b/components/ui_devtools/dom_agent.h index 36db4a1..833fb30 100644 --- a/components/ui_devtools/dom_agent.h +++ b/components/ui_devtools/dom_agent.h
@@ -40,6 +40,18 @@ protocol::Response pushNodesByBackendIdsToFrontend( std::unique_ptr<protocol::Array<int>> backend_node_ids, std::unique_ptr<protocol::Array<int>>* result) override; + protocol::Response performSearch( + const protocol::String& query, + protocol::Maybe<bool> include_user_agent_shadow_dom, + protocol::String* search_id, + int* result_count) override; + protocol::Response getSearchResults( + const protocol::String& search_id, + int from_index, + int to_index, + std::unique_ptr<protocol::Array<int>>* node_ids) override; + protocol::Response discardSearchResults( + const protocol::String& search_id) override; // UIElementDelegate: void OnUIElementAdded(UIElement* parent, UIElement* child) override; @@ -83,6 +95,12 @@ base::ObserverList<DOMAgentObserver>::Unchecked observers_; + using SearchResults = std::unordered_map<std::string, std::vector<int>>; + + SearchResults search_results_; + + bool is_document_created_ = false; + DISALLOW_COPY_AND_ASSIGN(DOMAgent); };
diff --git a/components/ui_devtools/protocol.json b/components/ui_devtools/protocol.json index e406126..f6fbaf9 100644 --- a/components/ui_devtools/protocol.json +++ b/components/ui_devtools/protocol.json
@@ -55,7 +55,42 @@ } ], "experimental": true + }, + { + "name": "performSearch", + "parameters": [ + { "name": "query", "type": "string", "description": "Plain text or query selector or XPath search query." }, + { "name": "includeUserAgentShadowDOM", "type": "boolean", "optional": true, "description": "True to search in user agent shadow DOM." } + ], + "returns": [ + { "name": "searchId", "type": "string", "description": "Unique search session identifier." }, + { "name": "resultCount", "type": "integer", "description": "Number of search results." } + ], + "description": "Searches for a given string in the DOM tree. Use <code>getSearchResults</code> to access search results or <code>cancelSearch</code> to end this search session.", + "experimental": true + }, + { + "name": "getSearchResults", + "parameters": [ + { "name": "searchId", "type": "string", "description": "Unique search session identifier." }, + { "name": "fromIndex", "type": "integer", "description": "Start index of the search result to be returned." }, + { "name": "toIndex", "type": "integer", "description": "End index of the search result to be returned." } + ], + "returns": [ + { "name": "nodeIds", "type": "array", "items": { "$ref": "NodeId" }, "description": "Ids of the search result nodes." } + ], + "description": "Returns search results from given <code>fromIndex</code> to given <code>toIndex</code> from the search with the given identifier.", + "experimental": true + }, + { + "name": "discardSearchResults", + "parameters": [ + { "name": "searchId", "type": "string", "description": "Unique search session identifier." } + ], + "description": "Discards search results from the session with the given id. <code>getSearchResults</code> should no longer be called for that search.", + "experimental": true } + ], "description": "This domain exposes DOM read/write operations. Each DOM Node is represented with its mirror object\nthat has an `id`. This `id` can be used to get additional information on the Node, resolve it into\nthe JavaScript object wrapper, etc. It is important that client receives DOM events only for the\nnodes that are known to the client. Backend keeps track of the nodes that were sent to the client\nand never sends the same node twice. It is client's responsibility to collect information about\nthe nodes that were sent to the client.<p>Note that `iframe` owner elements will return\ncorresponding document elements as their child nodes.</p>", "domain": "DOM",
diff --git a/components/ui_devtools/ui_element.cc b/components/ui_devtools/ui_element.cc index 59470da5..2802951 100644 --- a/components/ui_devtools/ui_element.cc +++ b/components/ui_devtools/ui_element.cc
@@ -16,6 +16,11 @@ } // namespace +// static +void UIElement::ResetNodeId() { + node_ids = 0; +} + UIElement::~UIElement() { if (owns_children_) { for (auto* child : children_)
diff --git a/components/ui_devtools/ui_element.h b/components/ui_devtools/ui_element.h index 6b25d2a..e249759 100644 --- a/components/ui_devtools/ui_element.h +++ b/components/ui_devtools/ui_element.h
@@ -31,6 +31,9 @@ public: using UIElements = std::vector<UIElement*>; + // resets node ids to 0 so that they are reusable + static void ResetNodeId(); + virtual ~UIElement(); int node_id() const { return node_id_; } std::string GetTypeName() const;
diff --git a/components/ui_devtools/views/dom_agent_unittest.cc b/components/ui_devtools/views/dom_agent_unittest.cc index 36b57de..3d3b1fb 100644 --- a/components/ui_devtools/views/dom_agent_unittest.cc +++ b/components/ui_devtools/views/dom_agent_unittest.cc
@@ -82,7 +82,9 @@ return widget->native_widget_private(); } - std::unique_ptr<views::Widget> CreateTestWidget(const gfx::Rect& bounds) { + std::unique_ptr<views::Widget> CreateTestWidget( + const gfx::Rect& bounds, + const std::string* name = nullptr) { auto widget = std::make_unique<views::Widget>(); views::Widget::InitParams params; params.delegate = nullptr; @@ -91,6 +93,8 @@ #if defined(USE_AURA) params.parent = GetContext(); #endif + if (name) + params.name = *name; widget->Init(params); widget->Show(); return widget; @@ -554,4 +558,98 @@ EXPECT_TRUE(WasChildNodeInserted(target_view)); } +// Tests to ensure dom search for native UI is working +TEST_F(DOMAgentTest, SimpleDomSearch) { + std::unique_ptr<views::Widget> widget_a( + CreateTestWidget(gfx::Rect(1, 1, 80, 80))); + widget_a->GetRootView()->AddChildView(new TestView("child_a1")); + widget_a->GetRootView()->AddChildView(new TestView("child_a2")); + + std::unique_ptr<DOM::Node> root; + dom_agent()->getDocument(&root); + + std::string search_id; + int result_count = 0; + std::unique_ptr<protocol::Array<int>> node_ids = nullptr; + + // 1 match + dom_agent()->performSearch("child_a1", false, &search_id, &result_count); + EXPECT_EQ(result_count, 1); + dom_agent()->getSearchResults(search_id, 0, result_count, &node_ids); + EXPECT_EQ(node_ids->length(), 1u); + dom_agent()->discardSearchResults(search_id); + node_ids.reset(); + + // no match + dom_agent()->performSearch("child_a12", false, &search_id, &result_count); + EXPECT_EQ(result_count, 0); + dom_agent()->getSearchResults(search_id, 0, 1, &node_ids); + EXPECT_TRUE(!node_ids); +} + +TEST_F(DOMAgentTest, ExactDomSearch) { + std::unique_ptr<views::Widget> widget_a( + CreateTestWidget(gfx::Rect(1, 1, 80, 80))); + widget_a->GetRootView()->AddChildView(new TestView("child_a")); + widget_a->GetRootView()->AddChildView(new TestView("child_aa")); + + std::unique_ptr<DOM::Node> root; + dom_agent()->getDocument(&root); + std::string search_id; + int result_count = 0; + std::unique_ptr<protocol::Array<int>> node_ids = nullptr; + + // substring matches + dom_agent()->performSearch("child_a", false, &search_id, &result_count); + EXPECT_EQ(result_count, 2); + dom_agent()->getSearchResults(search_id, 0, result_count, &node_ids); + EXPECT_EQ(node_ids->length(), 2u); + dom_agent()->discardSearchResults(search_id); + node_ids.reset(); + + // exact string matches + dom_agent()->performSearch("\"child_a\"", false, &search_id, &result_count); + EXPECT_EQ(result_count, 1); + dom_agent()->getSearchResults(search_id, 0, result_count, &node_ids); + EXPECT_EQ(node_ids->length(), 1u); + dom_agent()->discardSearchResults(search_id); + node_ids.reset(); + + dom_agent()->performSearch("\"child\"", false, &search_id, &result_count); + EXPECT_EQ(result_count, 0); + dom_agent()->getSearchResults(search_id, 0, 1, &node_ids); + EXPECT_TRUE(!node_ids); +} + +TEST_F(DOMAgentTest, TagDomSearch) { + std::string widget_name = "TestElement"; + std::unique_ptr<views::Widget> widget_a( + CreateTestWidget(gfx::Rect(1, 1, 80, 80), &widget_name)); + std::unique_ptr<views::Widget> widget_b( + CreateTestWidget(gfx::Rect(1, 1, 80, 80), &widget_name)); + std::unique_ptr<views::Widget> widget_c( + CreateTestWidget(gfx::Rect(1, 1, 80, 80), &widget_name)); + widget_a->GetRootView()->AddChildView(new TestView("WidgetView")); + + std::unique_ptr<DOM::Node> root; + dom_agent()->getDocument(&root); + std::string search_id; + int result_count = 0; + std::unique_ptr<protocol::Array<int>> node_ids = nullptr; + + // normal search looks for any "widget" substrings + dom_agent()->performSearch("widget", false, &search_id, &result_count); + EXPECT_EQ(result_count, 4); + dom_agent()->getSearchResults(search_id, 0, result_count, &node_ids); + EXPECT_EQ(node_ids->length(), 4u); + dom_agent()->discardSearchResults(search_id); + node_ids.reset(); + + // tag search only looks for <widget...> + dom_agent()->performSearch("<widget>", false, &search_id, &result_count); + EXPECT_EQ(result_count, 3); + dom_agent()->getSearchResults(search_id, 0, result_count, &node_ids); + EXPECT_EQ(node_ids->length(), 3u); +} + } // namespace ui_devtools
diff --git a/components/viz/common/gpu/vulkan_in_process_context_provider.cc b/components/viz/common/gpu/vulkan_in_process_context_provider.cc index bec98f4..e17419a 100644 --- a/components/viz/common/gpu/vulkan_in_process_context_provider.cc +++ b/components/viz/common/gpu/vulkan_in_process_context_provider.cc
@@ -5,6 +5,7 @@ #include "components/viz/common/gpu/vulkan_in_process_context_provider.h" #include "gpu/vulkan/buildflags.h" #include "gpu/vulkan/vulkan_device_queue.h" +#include "gpu/vulkan/vulkan_fence_helper.h" #include "gpu/vulkan/vulkan_function_pointers.h" #include "gpu/vulkan/vulkan_implementation.h" #include "gpu/vulkan/vulkan_instance.h" @@ -34,6 +35,14 @@ }; } +VulkanInProcessContextProvider::VulkanInProcessContextProvider( + gpu::VulkanImplementation* vulkan_implementation) + : vulkan_implementation_(vulkan_implementation) {} + +VulkanInProcessContextProvider::~VulkanInProcessContextProvider() { + Destroy(); +} + bool VulkanInProcessContextProvider::Initialize() { DCHECK(!device_queue_); const gfx::ExtensionSet& extensions = @@ -89,8 +98,19 @@ } void VulkanInProcessContextProvider::Destroy() { - if (gr_context_) + if (device_queue_) { + // Destroy |fence_helper| will wait idle on the device queue, and then run + // all enqueued cleanup tasks. + auto* fence_helper = device_queue_->GetFenceHelper(); + fence_helper->Destroy(); + } + + if (gr_context_) { + // releaseResourcesAndAbandonContext() will wait on GPU to finish all works, + // execute pending flush done callbacks and release all resources. + gr_context_->releaseResourcesAndAbandonContext(); gr_context_.reset(); + } if (device_queue_) { device_queue_->Destroy(); @@ -126,12 +146,4 @@ NOTREACHED(); } -VulkanInProcessContextProvider::VulkanInProcessContextProvider( - gpu::VulkanImplementation* vulkan_implementation) - : vulkan_implementation_(vulkan_implementation) {} - -VulkanInProcessContextProvider::~VulkanInProcessContextProvider() { - Destroy(); -} - } // namespace viz
diff --git a/components/viz/common/gpu/vulkan_in_process_context_provider.h b/components/viz/common/gpu/vulkan_in_process_context_provider.h index a906f8f..9522620 100644 --- a/components/viz/common/gpu/vulkan_in_process_context_provider.h +++ b/components/viz/common/gpu/vulkan_in_process_context_provider.h
@@ -27,7 +27,6 @@ static scoped_refptr<VulkanInProcessContextProvider> Create( gpu::VulkanImplementation* vulkan_implementation); - bool Initialize(); void Destroy(); // VulkanContextProvider implementation @@ -39,12 +38,13 @@ std::vector<VkSemaphore> semaphores) override; void EnqueueSecondaryCBPostSubmitTask(base::OnceClosure closure) override; - protected: + private: explicit VulkanInProcessContextProvider( gpu::VulkanImplementation* vulkan_implementation); ~VulkanInProcessContextProvider() override; - private: + bool Initialize(); + #if BUILDFLAG(ENABLE_VULKAN) sk_sp<GrContext> gr_context_; gpu::VulkanImplementation* vulkan_implementation_;
diff --git a/components/viz/service/display/display_resource_provider.cc b/components/viz/service/display/display_resource_provider.cc index 2bf8113..6004636c 100644 --- a/components/viz/service/display/display_resource_provider.cc +++ b/components/viz/service/display/display_resource_provider.cc
@@ -424,7 +424,7 @@ void DisplayResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, DeleteStyle style) { - TRACE_EVENT0("viz", "DosplayResourceProvider::DeleteResourceInternal"); + TRACE_EVENT0("viz", "DisplayResourceProvider::DeleteResourceInternal"); ChildResource* resource = &it->second; if (resource->gl_id) {
diff --git a/components/viz/service/display/gl_renderer.cc b/components/viz/service/display/gl_renderer.cc index b7a65f6..64f2992 100644 --- a/components/viz/service/display/gl_renderer.cc +++ b/components/viz/service/display/gl_renderer.cc
@@ -734,37 +734,10 @@ gfx::Rect backdrop_rect = gfx::ToEnclosingRect(cc::MathUtil::MapClippedRect( params->contents_device_transform, scaled_region.BoundingBox())); - if (ShouldApplyBackdropFilters(params->backdrop_filters)) { - SkMatrix matrix; - // |filters_scale| is the ratio of render pass physical pixels to root layer - // layer space, including content-to-target-space scale and device pixel - // ratio. - matrix.setScale(quad->filters_scale.x(), quad->filters_scale.y()); - if (FlippedFramebuffer()) { - // TODO(jbroman): This probably isn't the right way to account for this. - // Probably some combination of current_frame()->projection_matrix, - // current_frame()->window_matrix and contents_device_transform? - // Likely this should be window_matrix*projection_matrix. - matrix.postScale(1, -1); - } - // |backdrop_rect| is now expanded for pixel moving backdrop_filters, offset - // by any backdrop-filter drop-shadow offset (flipped if - // FlippedFramebuffer()). Note that scale is not applied to the - // backdrop_rect itself, only the sigma or x/y offset of filters. - backdrop_rect = - params->backdrop_filters->MapRectReverse(backdrop_rect, matrix); - } - - if (!backdrop_rect.IsEmpty() && params->use_aa) { - const int kOutsetForAntialiasing = 1; - backdrop_rect.Inset(-kOutsetForAntialiasing, -kOutsetForAntialiasing); - } - - if (params->filters) { - DCHECK(!params->filters->IsEmpty()); - // If we have regular filters, grab an extra one-pixel border around the - // background, so texture edge clamping gives us a transparent border - // in case the filter expands the result. + if (!backdrop_rect.IsEmpty() && (params->filters || params->use_aa)) { + // If we have regular filters or antialiasing, grab an extra one-pixel + // border around the background, so texture edge clamping gives us a + // transparent border. backdrop_rect.Inset(-1, -1, -1, -1); } @@ -843,6 +816,19 @@ return texture_id; } +static sk_sp<SkImage> FinalizeImage(sk_sp<SkSurface> surface) { + // Flush the drawing before source texture read lock goes out of scope. + // Skia API does not guarantee that when the SkImage goes out of scope, + // its externally referenced resources would force the rendering to be + // flushed. + surface->getCanvas()->flush(); + sk_sp<SkImage> image = surface->makeImageSnapshot(); + if (!image || !image->isTextureBacked()) { + return nullptr; + } + return image; +} + sk_sp<SkImage> GLRenderer::ApplyBackdropFilters( DrawRenderPassDrawQuadParams* params, const gfx::Rect& unclipped_rect, @@ -920,11 +906,19 @@ surface->getCanvas()->drawImageRect(src_image, RectFToSkRect(src_image_rect), dest_rect, nullptr); - // Can't crop here, because the crop rect is applied prior to filtering, and - // some filters move pixels and need to process the full image. - // TODO(916314): this could probably be put back to just using - // drawImageRect on the unfiltered image, with &paint last argument to handle - // filters and opacity. Would be cleaner. + if (backdrop_filter_bounds.has_value()) { + // Crop the source image to the backdrop_filter_bounds. + gfx::Rect filter_clip = gfx::ToEnclosingRect(cc::MathUtil::MapClippedRect( + backdrop_filter_bounds_transform, backdrop_filter_bounds->rect())); + filter_clip.Intersect(gfx::Rect(src_image->width(), src_image->height())); + if (filter_clip.IsEmpty()) + return FinalizeImage(surface); + src_image = src_image->makeSubset(RectToSkIRect(filter_clip)); + src_image_rect = gfx::RectF(filter_clip.width(), filter_clip.height()); + dest_rect = RectToSkRect( + ScaleToEnclosingRect(filter_clip, params->backdrop_filter_quality)); + } + SkIPoint offset; SkIRect subset; sk_sp<SkImage> filtered_image = SkiaHelper::ApplyImageFilter( @@ -951,17 +945,7 @@ surface->getCanvas()->restore(); } - // Flush the drawing before source texture read lock goes out of scope. - // Skia API does not guarantee that when the SkImage goes out of scope, - // its externally referenced resources would force the rendering to be - // flushed. - surface->getCanvas()->flush(); - sk_sp<SkImage> image = surface->makeImageSnapshot(); - if (!image || !image->isTextureBacked()) { - return nullptr; - } - - return image; + return FinalizeImage(surface); } const TileDrawQuad* GLRenderer::CanPassBeDrawnDirectly(const RenderPass* pass) {
diff --git a/components/viz/service/display/software_renderer.cc b/components/viz/service/display/software_renderer.cc index e9f4f44..e783b198 100644 --- a/components/viz/service/display/software_renderer.cc +++ b/components/viz/service/display/software_renderer.cc
@@ -738,18 +738,6 @@ gfx::Rect backdrop_rect = gfx::ToEnclosingRect(cc::MathUtil::MapClippedRect( contents_device_transform, QuadVertexRect())); - if (ShouldApplyBackdropFilters(backdrop_filters)) { - SkMatrix matrix; - // |filters_scale| is the ratio of render pass physical pixels to root layer - // layer space, including content-to-target-space scale and device pixel - // ratio. - matrix.setScale(quad->filters_scale.x(), quad->filters_scale.y()); - // |backdrop_rect| is now expanded for pixel moving backdrop_filters, offset - // by any backdrop-filter drop-shadow offset. Note that scale is not applied - // to the backdrop_rect itself, only the sigma or x/y offset of filters. - backdrop_rect = backdrop_filters->MapRectReverse(backdrop_rect, matrix); - } - if (regular_filters) { DCHECK(!regular_filters->IsEmpty()); // If we have regular filters, grab an extra one-pixel border around the
diff --git a/components/viz/test/data/backdrop_filter_blur_off_axis.png b/components/viz/test/data/backdrop_filter_blur_off_axis.png index 89355ae4..c347075f 100644 --- a/components/viz/test/data/backdrop_filter_blur_off_axis.png +++ b/components/viz/test/data/backdrop_filter_blur_off_axis.png Binary files differ
diff --git a/components/viz/test/data/backdrop_filter_blur_outsets.png b/components/viz/test/data/backdrop_filter_blur_outsets.png index e5b81d65..a74b270 100644 --- a/components/viz/test/data/backdrop_filter_blur_outsets.png +++ b/components/viz/test/data/backdrop_filter_blur_outsets.png Binary files differ
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index d56c152..ba3a4da 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -1545,6 +1545,8 @@ "renderer_host/input_event_shim.h", "renderer_host/legacy_render_widget_host_win.cc", "renderer_host/legacy_render_widget_host_win.h", + "renderer_host/media/aec_dump_manager_impl.cc", + "renderer_host/media/aec_dump_manager_impl.h", "renderer_host/media/audio_input_delegate_impl.cc", "renderer_host/media/audio_input_delegate_impl.h", "renderer_host/media/audio_input_device_manager.cc",
diff --git a/content/browser/accessibility/accessibility_tree_formatter_blink.cc b/content/browser/accessibility/accessibility_tree_formatter_blink.cc index 4ef0ceb..24feeee 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_blink.cc +++ b/content/browser/accessibility/accessibility_tree_formatter_blink.cc
@@ -406,22 +406,26 @@ FormatCoordinates("size", "boundsWidth", "boundsHeight", dict), &line); - WriteAttribute( - false, - FormatCoordinates("pageLocation", "pageBoundsX", "pageBoundsY", dict), - &line); - WriteAttribute(false, - FormatCoordinates("pageSize", "pageBoundsWidth", - "pageBoundsHeight", dict), - &line); - WriteAttribute(false, - FormatCoordinates("unclippedLocation", "unclippedBoundsX", - "unclippedBoundsY", dict), - &line); - WriteAttribute(false, - FormatCoordinates("unclippedSize", "unclippedBoundsWidth", - "unclippedBoundsHeight", dict), - &line); + bool ignored = false; + dict.GetBoolean("ignored", &ignored); + if (!ignored) { + WriteAttribute( + false, + FormatCoordinates("pageLocation", "pageBoundsX", "pageBoundsY", dict), + &line); + WriteAttribute(false, + FormatCoordinates("pageSize", "pageBoundsWidth", + "pageBoundsHeight", dict), + &line); + WriteAttribute(false, + FormatCoordinates("unclippedLocation", "unclippedBoundsX", + "unclippedBoundsY", dict), + &line); + WriteAttribute(false, + FormatCoordinates("unclippedSize", "unclippedBoundsWidth", + "unclippedBoundsHeight", dict), + &line); + } bool transform; if (dict.GetBoolean("transform", &transform) && transform)
diff --git a/content/browser/accessibility/accessibility_win_browsertest.cc b/content/browser/accessibility/accessibility_win_browsertest.cc index 32f42b2..3ad5986 100644 --- a/content/browser/accessibility/accessibility_win_browsertest.cc +++ b/content/browser/accessibility/accessibility_win_browsertest.cc
@@ -978,8 +978,18 @@ LoadInitialAccessibilityTreeFromHtml( "<div role=group style='visibility: hidden'>text</div>"); + // Trigger Event::kDocumentTitleChanged, the <body> can receive an + // Event::kChildrenChanged after the document is loaded, but before + // modifying visibility below. This will make sure that we wait for + // the Event::kChildrenChanged that we care about for this test. + AccessibilityNotificationWaiter document_waiter( + shell()->web_contents(), ui::kAXModeComplete, + ax::mojom::Event::kDocumentTitleChanged); + ExecuteScript(L"document.title = 'document'"); + document_waiter.WaitForNotification(); + // Check the accessible tree of the browser. - AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, + AccessibleChecker document_checker(L"document", ROLE_SYSTEM_DOCUMENT, std::wstring()); document_checker.CheckAccessible(GetRendererAccessible());
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc index 398fda3..e90e1884 100644 --- a/content/browser/accessibility/browser_accessibility.cc +++ b/content/browser/accessibility/browser_accessibility.cc
@@ -71,6 +71,13 @@ if (InternalChildCount() == 0) return true; + return PlatformIsLeafIncludingIgnored(); +} + +bool BrowserAccessibility::PlatformIsLeafIncludingIgnored() const { + if (node()->children().size() == 0) + return true; + // These types of objects may have children that we use as internal // implementation details, but we want to expose them as leaves to platform // accessibility APIs because screen readers might be confused if they find @@ -101,7 +108,7 @@ if (!instance_active()) return false; // Allow events unless this object would be trimmed away. - return !PlatformIsChildOfLeaf(); + return !PlatformIsChildOfLeafIncludingIgnored(); } uint32_t BrowserAccessibility::PlatformChildCount() const { @@ -202,6 +209,18 @@ return false; } +bool BrowserAccessibility::PlatformIsChildOfLeafIncludingIgnored() const { + BrowserAccessibility* ancestor = InternalGetParent(); + + while (ancestor) { + if (ancestor->PlatformIsLeafIncludingIgnored()) + return true; + ancestor = ancestor->InternalGetParent(); + } + + return false; +} + BrowserAccessibility* BrowserAccessibility::GetClosestPlatformObject() const { BrowserAccessibility* platform_object = const_cast<BrowserAccessibility*>(this);
diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h index 405b95d6..92db5030 100644 --- a/content/browser/accessibility/browser_accessibility.h +++ b/content/browser/accessibility/browser_accessibility.h
@@ -115,11 +115,18 @@ // Returns true if this is a leaf node on this platform, meaning any // children should not be exposed to this platform's native accessibility - // layer. Each platform subclass should implement this itself. + // layer. // The definition of a leaf may vary depending on the platform, // but a leaf node should never have children that are focusable or // that might send notifications. - virtual bool PlatformIsLeaf() const; + bool PlatformIsLeaf() const; + + // Returns true if this is a leaf node on this platform, including + // ignored nodes, meaning any children should not be exposed to this + // platform's native accessibility layer, but a node shouldn't be + // considered a leaf node solely because it has only ignored children. + // Each platform subclass should implement this itself. + virtual bool PlatformIsLeafIncludingIgnored() const; // Returns true if this object can fire events. virtual bool CanFireEvents() const; @@ -142,6 +149,12 @@ // platform. bool PlatformIsChildOfLeaf() const; + // Returns true if an ancestor of this node (not including itself) is a + // leaf node, including ignored nodes, meaning that this node is not + // actually exposed to the platform, but a node shouldn't be + // considered a leaf node solely because it has only ignored children. + bool PlatformIsChildOfLeafIncludingIgnored() const; + // If this object is exposed to the platform, returns this object. Otherwise, // returns the platform leaf under which this object is found. BrowserAccessibility* GetClosestPlatformObject() const;
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc index 5b1b4c840..42c4be2e 100644 --- a/content/browser/accessibility/browser_accessibility_android.cc +++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -164,8 +164,8 @@ return value; } -bool BrowserAccessibilityAndroid::PlatformIsLeaf() const { - if (BrowserAccessibility::PlatformIsLeaf()) +bool BrowserAccessibilityAndroid::PlatformIsLeafIncludingIgnored() const { + if (BrowserAccessibility::PlatformIsLeafIncludingIgnored()) return true; // Iframes are always allowed to contain children.
diff --git a/content/browser/accessibility/browser_accessibility_android.h b/content/browser/accessibility/browser_accessibility_android.h index cdd15c6..8143ac7 100644 --- a/content/browser/accessibility/browser_accessibility_android.h +++ b/content/browser/accessibility/browser_accessibility_android.h
@@ -27,7 +27,7 @@ void OnLocationChanged() override; base::string16 GetValue() const override; - bool PlatformIsLeaf() const override; + bool PlatformIsLeafIncludingIgnored() const override; // Android needs events even on objects that are trimmed away. bool CanFireEvents() const override;
diff --git a/content/browser/accessibility/browser_accessibility_com_win.cc b/content/browser/accessibility/browser_accessibility_com_win.cc index 58209c7..b8f7c6e6 100644 --- a/content/browser/accessibility/browser_accessibility_com_win.cc +++ b/content/browser/accessibility/browser_accessibility_com_win.cc
@@ -53,7 +53,7 @@ // BrowserAccessibilityComWin::WinAttributes::WinAttributes() - : ia_role(0), ia_state(0), ia2_role(0), ia2_state(0) {} + : ignored(false), ia_role(0), ia_state(0), ia2_role(0), ia2_state(0) {} BrowserAccessibilityComWin::WinAttributes::~WinAttributes() {} @@ -1720,6 +1720,8 @@ owner()->GetString16Attribute(ax::mojom::StringAttribute::kDescription); win_attributes_->value = GetValue(); + + win_attributes_->ignored = owner()->HasState(ax::mojom::State::kIgnored); } void BrowserAccessibilityComWin::UpdateStep2ComputeHypertext() { @@ -1729,21 +1731,18 @@ void BrowserAccessibilityComWin::UpdateStep3FireEvents( bool is_subtree_creation) { int32_t state = MSAAState(); + const bool ignored = owner()->HasState(ax::mojom::State::kIgnored); + + // Suppress all of these events when the node is ignored, or when the ignored + // state has changed. + if (ignored || (old_win_attributes_->ignored != ignored)) + return; // The rest of the events only fire on changes, not on new objects. - bool did_fire_namechange = false; - if (old_win_attributes_->ia_role != 0 || !old_win_attributes_->role_name.empty()) { - // Fire an event if the name, description, help, or value changes. - if (name() != old_win_attributes_->name && - GetData().GetNameFrom() != ax::mojom::NameFrom::kContents) { - // Only fire name changes when the name comes from an attribute, otherwise - // name changes are redundant with text removed/inserted events. - FireNativeEvent(EVENT_OBJECT_NAMECHANGE); - did_fire_namechange = true; - } + // Fire an event if the description, help, or value changes. if (description() != old_win_attributes_->description) FireNativeEvent(EVENT_OBJECT_DESCRIPTIONCHANGE); @@ -1767,10 +1766,11 @@ } // Fire hypertext-related events. - // Do not fire removed/inserted when a name change event was also fired, as - // they are providing redundant information and will lead to duplicate - // announcements. - if (!did_fire_namechange) { + // Do not fire removed/inserted when a name change event will be fired by + // AXEventGenerator, as they are providing redundant information and will + // lead to duplicate announcements. + if (name() == old_win_attributes_->name || + GetData().GetNameFrom() == ax::mojom::NameFrom::kContents) { size_t start, old_len, new_len; ComputeHypertextRemovedAndInserted(&start, &old_len, &new_len); if (old_len > 0) {
diff --git a/content/browser/accessibility/browser_accessibility_com_win.h b/content/browser/accessibility/browser_accessibility_com_win.h index 2560c375..97994fa 100644 --- a/content/browser/accessibility/browser_accessibility_com_win.h +++ b/content/browser/accessibility/browser_accessibility_com_win.h
@@ -496,6 +496,9 @@ WinAttributes(); ~WinAttributes(); + // Ignored state + bool ignored; + // IAccessible role and state. int32_t ia_role; int32_t ia_state;
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc index 8903c77..9f402852 100644 --- a/content/browser/accessibility/browser_accessibility_manager.cc +++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -381,6 +381,9 @@ return true; } + // Allow derived classes to do event pre-processing. + BeforeAccessibilityEvents(); + // If the root's parent is in another accessibility tree but it wasn't // previously connected, post the proper notifications on the parent. BrowserAccessibility* parent = GetParentNodeFromParentTree(); @@ -402,7 +405,7 @@ root_manager->FireFocusEventsIfNeeded(); // Fire any events related to changes to the tree. - for (auto targeted_event : event_generator_) { + for (const auto& targeted_event : event_generator_) { BrowserAccessibility* event_target = GetFromAXNode(targeted_event.node); if (!event_target || !event_target->CanFireEvents()) continue; @@ -441,6 +444,8 @@ return true; } +void BrowserAccessibilityManager::BeforeAccessibilityEvents() {} + void BrowserAccessibilityManager::FinalizeAccessibilityEvents() {} void BrowserAccessibilityManager::OnLocationChanges(
diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h index 78efe6d..f6e4b53 100644 --- a/content/browser/accessibility/browser_accessibility_manager.h +++ b/content/browser/accessibility/browser_accessibility_manager.h
@@ -266,6 +266,9 @@ virtual bool OnAccessibilityEvents(const AXEventNotificationDetails& details) WARN_UNUSED_RESULT; + // Allows derived classes to do event pre-processing + virtual void BeforeAccessibilityEvents(); + // Allows derived classes to do event post-processing. virtual void FinalizeAccessibilityEvents();
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc index 74da28ea6..c7c83b4 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.cc +++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -217,6 +217,7 @@ case ui::AXEventGenerator::Event::GRABBED_CHANGED: case ui::AXEventGenerator::Event::HASPOPUP_CHANGED: case ui::AXEventGenerator::Event::HIERARCHICAL_LEVEL_CHANGED: + case ui::AXEventGenerator::Event::IGNORED_CHANGED: case ui::AXEventGenerator::Event::IMAGE_ANNOTATION_CHANGED: case ui::AXEventGenerator::Event::INVALID_STATUS_CHANGED: case ui::AXEventGenerator::Event::KEY_SHORTCUTS_CHANGED:
diff --git a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc index b5846a5e..70f57d74 100644 --- a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc +++ b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
@@ -154,6 +154,18 @@ case ui::AXEventGenerator::Event::EXPANDED: FireExpandedEvent(node, true); break; + case ui::AXEventGenerator::Event::IGNORED_CHANGED: + // Since AuraLinux needs to send the children-changed::add event with the + // index in parent, the event must be fired after the node is unignored. + // children-changed:remove is handled in |OnStateChanged| + if (!node->HasState(ax::mojom::State::kIgnored)) { + if (node->IsNative() && node->GetParent()) { + g_signal_emit_by_name(node->GetParent(), "children-changed::add", + node->GetIndexInParent(), + node->GetNativeViewAccessible()); + } + } + break; case ui::AXEventGenerator::Event::LOAD_COMPLETE: FireLoadingEvent(node, false); FireEvent(node, ax::mojom::Event::kLoadComplete); @@ -222,6 +234,27 @@ document_platform_node->SetEmbeddingWindow(window); } +void BrowserAccessibilityManagerAuraLinux::OnStateChanged( + ui::AXTree* tree, + ui::AXNode* node, + ax::mojom::State state, + bool new_value) { + DCHECK_EQ(ax_tree(), tree); + + // Since AuraLinux needs to send the children-changed::remove event with the + // index in parent, the event must be fired before the node becomes ignored. + // children-changed:add is handled with the generated Event::IGNORED_CHANGED. + if (state == ax::mojom::State::kIgnored && new_value) { + DCHECK(!node->data().HasState(ax::mojom::State::kIgnored)); + BrowserAccessibility* obj = GetFromAXNode(node); + if (obj && obj->IsNative() && obj->GetParent()) { + g_signal_emit_by_name(obj->GetParent(), "children-changed::remove", + obj->GetIndexInParent(), + obj->GetNativeViewAccessible()); + } + } +} + void BrowserAccessibilityManagerAuraLinux::OnSubtreeWillBeDeleted( ui::AXTree* tree, ui::AXNode* node) {
diff --git a/content/browser/accessibility/browser_accessibility_manager_auralinux.h b/content/browser/accessibility/browser_accessibility_manager_auralinux.h index 18e932f..4f00246 100644 --- a/content/browser/accessibility/browser_accessibility_manager_auralinux.h +++ b/content/browser/accessibility/browser_accessibility_manager_auralinux.h
@@ -42,6 +42,10 @@ protected: // AXTreeObserver methods. + void OnStateChanged(ui::AXTree* tree, + ui::AXNode* node, + ax::mojom::State state, + bool new_value) override; void OnSubtreeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override; void OnAtomicUpdateFinished( ui::AXTree* tree,
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm index e02f5f9..55964c0 100644 --- a/content/browser/accessibility/browser_accessibility_manager_mac.mm +++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -388,6 +388,7 @@ case ui::AXEventGenerator::Event::GRABBED_CHANGED: case ui::AXEventGenerator::Event::HASPOPUP_CHANGED: case ui::AXEventGenerator::Event::HIERARCHICAL_LEVEL_CHANGED: + case ui::AXEventGenerator::Event::IGNORED_CHANGED: case ui::AXEventGenerator::Event::IMAGE_ANNOTATION_CHANGED: case ui::AXEventGenerator::Event::KEY_SHORTCUTS_CHANGED: case ui::AXEventGenerator::Event::LABELED_BY_CHANGED:
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc index 0c460ba..7d632fd 100644 --- a/content/browser/accessibility/browser_accessibility_manager_win.cc +++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
@@ -9,7 +9,9 @@ #include <vector> +#include "base/auto_reset.h" #include "base/command_line.h" +#include "base/stl_util.h" #include "base/win/scoped_variant.h" #include "base/win/windows_version.h" #include "content/browser/accessibility/browser_accessibility_state_impl.h" @@ -244,6 +246,15 @@ FireUiaPropertyChangedEvent(UIA_LevelPropertyId, node); aria_properties_events_.insert(node); break; + case ui::AXEventGenerator::Event::IGNORED_CHANGED: + if (node->HasState(ax::mojom::State::kIgnored)) { + FireWinAccessibilityEvent(EVENT_OBJECT_HIDE, node); + FireUiaStructureChangedEvent(StructureChangeType_ChildRemoved, node); + } else { + FireWinAccessibilityEvent(EVENT_OBJECT_SHOW, node); + FireUiaStructureChangedEvent(StructureChangeType_ChildAdded, node); + } + break; case ui::AXEventGenerator::Event::IMAGE_ANNOTATION_CHANGED: FireWinAccessibilityEvent(EVENT_OBJECT_NAMECHANGE, node); break; @@ -299,6 +310,10 @@ break; case ui::AXEventGenerator::Event::NAME_CHANGED: FireUiaPropertyChangedEvent(UIA_NamePropertyId, node); + // Only fire name changes when the name comes from an attribute, otherwise + // name changes are redundant with text removed/inserted events. + if (node->GetData().GetNameFrom() != ax::mojom::NameFrom::kContents) + FireWinAccessibilityEvent(EVENT_OBJECT_NAMECHANGE, node); break; case ui::AXEventGenerator::Event::PLACEHOLDER_CHANGED: FireUiaPropertyChangedEvent(UIA_HelpTextPropertyId, node); @@ -407,6 +422,18 @@ return; if (!ShouldFireEventForNode(node)) return; + // Suppress events when |IGNORED_CHANGED| except for related SHOW / HIDE + if (base::Contains(ignored_changed_nodes_, node)) { + switch (win_event_type) { + case EVENT_OBJECT_HIDE: + case EVENT_OBJECT_SHOW: + break; + default: + return; + } + } else if (node->HasState(ax::mojom::State::kIgnored)) { + return; + } HWND hwnd = GetParentHWND(); if (!hwnd) @@ -427,6 +454,10 @@ return; if (!ShouldFireEventForNode(node)) return; + // Suppress events when |IGNORED_CHANGED| + if (node->HasState(ax::mojom::State::kIgnored) || + base::Contains(ignored_changed_nodes_, node)) + return; ::UiaRaiseAutomationEvent(ToBrowserAccessibilityWin(node)->GetCOM(), uia_event); @@ -439,6 +470,10 @@ return; if (!ShouldFireEventForNode(node)) return; + // Suppress events when |IGNORED_CHANGED| + if (node->HasState(ax::mojom::State::kIgnored) || + base::Contains(ignored_changed_nodes_, node)) + return; // The old value is not used by the system VARIANT old_value = {}; @@ -460,6 +495,18 @@ return; if (!ShouldFireEventForNode(node)) return; + // Suppress events when |IGNORED_CHANGED| except for related structure changes + if (base::Contains(ignored_changed_nodes_, node)) { + switch (change_type) { + case StructureChangeType_ChildRemoved: + case StructureChangeType_ChildAdded: + break; + default: + return; + } + } else if (node->HasState(ax::mojom::State::kIgnored)) { + return; + } auto* provider = ToBrowserAccessibilityWin(node); auto* provider_com = provider ? provider->GetCOM() : nullptr; @@ -677,6 +724,25 @@ } } +void BrowserAccessibilityManagerWin::BeforeAccessibilityEvents() { + BrowserAccessibilityManager::BeforeAccessibilityEvents(); + + for (const auto& targeted_event : event_generator_) { + if (targeted_event.event_params.event == + ui::AXEventGenerator::Event::IGNORED_CHANGED) { + BrowserAccessibility* event_target = GetFromAXNode(targeted_event.node); + if (!event_target) + continue; + + const auto insert_pair = ignored_changed_nodes_.insert(event_target); + + // Expect that |IGNORED_CHANGED| only fires once for a given + // node in a given event frame. + DCHECK(insert_pair.second); + } + } +} + void BrowserAccessibilityManagerWin::FinalizeAccessibilityEvents() { BrowserAccessibilityManager::FinalizeAccessibilityEvents(); @@ -725,6 +791,7 @@ } } selection_events_.clear(); + ignored_changed_nodes_.clear(); } BrowserAccessibilityManagerWin::SelectionEvents::SelectionEvents() = default;
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.h b/content/browser/accessibility/browser_accessibility_manager_win.h index 13ea393..81e40bb 100644 --- a/content/browser/accessibility/browser_accessibility_manager_win.h +++ b/content/browser/accessibility/browser_accessibility_manager_win.h
@@ -68,6 +68,9 @@ BrowserAccessibility* node); void FireUiaTextContainerEvent(LONG uia_event, BrowserAccessibility* node); + // Do event pre-processing + void BeforeAccessibilityEvents() override; + // Do event post-processing void FinalizeAccessibilityEvents() override; @@ -106,6 +109,11 @@ // changes, so we only fire the event once for every node. std::unordered_set<BrowserAccessibility*> aria_properties_events_; + // When the ignored state changes for a node, we only want to fire the + // events relevant to the ignored state change (e.g. show / hide). + // This set keeps track of what nodes should suppress superfluous events. + std::set<BrowserAccessibility*> ignored_changed_nodes_; + // Keep track of selection changes so we can optimize UIA event firing. // Pointers are only stored for the duration of |OnAccessibilityEvents|, and // the map is cleared in |FinalizeAccessibilityEvents|.
diff --git a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc index 35663718..47b02f83 100644 --- a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc +++ b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
@@ -653,8 +653,8 @@ const ui::AXTree& tree = GetAXTree(); const ui::AXNode* root = tree.root(); - const ui::AXNode* input1 = root->children()[0]; - const ui::AXNode* input2 = root->children()[1]; + const ui::AXNode* input1 = root->GetUnignoredChildAtIndex(0); + const ui::AXNode* input2 = root->GetUnignoredChildAtIndex(1); EXPECT_EQ(static_cast<int>(ax::mojom::NameFrom::kTitle), GetIntAttr(input1, ax::mojom::IntAttribute::kNameFrom));
diff --git a/content/browser/accessibility/hit_testing_browsertest.cc b/content/browser/accessibility/hit_testing_browsertest.cc index 9364fb4..15e0fe1 100644 --- a/content/browser/accessibility/hit_testing_browsertest.cc +++ b/content/browser/accessibility/hit_testing_browsertest.cc
@@ -309,9 +309,13 @@ EXPECT_EQ("Button 1", hit_node->GetStringAttribute(ax::mojom::StringAttribute::kName)); - // (60, 60) -> No button there + // (60, 60) -> No button there, hits the ignored <body> node hit_node = TapAndWaitForResult(gfx::Point(60, 60)); - EXPECT_TRUE(hit_node == nullptr); + EXPECT_NE(nullptr, hit_node); + EXPECT_EQ(ax::mojom::Role::kGenericContainer, hit_node->GetRole()); + EXPECT_TRUE(hit_node->HasState(ax::mojom::State::kIgnored)); + EXPECT_EQ("body", + hit_node->GetStringAttribute(ax::mojom::StringAttribute::kHtmlTag)); // (10, 60) -> "Button 2" hit_node = TapAndWaitForResult(gfx::Point(10, 60));
diff --git a/content/browser/devtools/protocol/webauthn_handler.cc b/content/browser/devtools/protocol/webauthn_handler.cc index 105b22c9..1f800087 100644 --- a/content/browser/devtools/protocol/webauthn_handler.cc +++ b/content/browser/devtools/protocol/webauthn_handler.cc
@@ -25,6 +25,8 @@ "Could not find a Virtual Authenticator matching the ID"; static constexpr char kCouldNotCreateCredential[] = "An error occurred trying to create the credential"; +static constexpr char kDevToolsNotAttached[] = + "The DevTools session is not attached to a frame"; static constexpr char kInvalidProtocol[] = "The protocol is not valid"; static constexpr char kInvalidRpIdHash[] = "The Relying Party ID hash must have a size of "; @@ -54,6 +56,9 @@ void WebAuthnHandler::SetRenderer(int process_host_id, RenderFrameHostImpl* frame_host) { + if (!frame_host) { + Disable(); + } frame_host_ = frame_host; } @@ -62,6 +67,9 @@ } Response WebAuthnHandler::Enable() { + if (!frame_host_) + return Response::Error(kDevToolsNotAttached); + AuthenticatorEnvironmentImpl::GetInstance()->EnableVirtualAuthenticatorFor( frame_host_->frame_tree_node()); virtual_discovery_factory_ = @@ -71,8 +79,10 @@ } Response WebAuthnHandler::Disable() { - AuthenticatorEnvironmentImpl::GetInstance()->DisableVirtualAuthenticatorFor( - frame_host_->frame_tree_node()); + if (frame_host_) { + AuthenticatorEnvironmentImpl::GetInstance()->DisableVirtualAuthenticatorFor( + frame_host_->frame_tree_node()); + } virtual_discovery_factory_ = nullptr; return Response::OK(); }
diff --git a/content/browser/devtools/protocol/webauthn_handler.h b/content/browser/devtools/protocol/webauthn_handler.h index c8838921..28683ab 100644 --- a/content/browser/devtools/protocol/webauthn_handler.h +++ b/content/browser/devtools/protocol/webauthn_handler.h
@@ -10,6 +10,7 @@ #include "base/macros.h" #include "content/browser/devtools/protocol/devtools_domain_handler.h" #include "content/browser/devtools/protocol/web_authn.h" +#include "content/common/content_export.h" namespace content { class VirtualFidoDiscoveryFactory; @@ -17,8 +18,8 @@ class WebAuthnHandler : public DevToolsDomainHandler, public WebAuthn::Backend { public: - WebAuthnHandler(); - ~WebAuthnHandler() override; + CONTENT_EXPORT WebAuthnHandler(); + CONTENT_EXPORT ~WebAuthnHandler() override; // DevToolsDomainHandler: void SetRenderer(int process_host_id, @@ -26,8 +27,8 @@ void Wire(UberDispatcher* dispatcher) override; // WebAuthn::Backend - Response Enable() override; - Response Disable() override; + CONTENT_EXPORT Response Enable() override; + CONTENT_EXPORT Response Disable() override; Response AddVirtualAuthenticator( std::unique_ptr<WebAuthn::VirtualAuthenticatorOptions> options, String* out_authenticator_id) override; @@ -42,7 +43,7 @@ Response ClearCredentials(const String& in_authenticator_id) override; private: - RenderFrameHostImpl* frame_host_; + RenderFrameHostImpl* frame_host_ = nullptr; VirtualFidoDiscoveryFactory* virtual_discovery_factory_ = nullptr; DISALLOW_COPY_AND_ASSIGN(WebAuthnHandler); };
diff --git a/content/browser/devtools/protocol/webauthn_handler_unittest.cc b/content/browser/devtools/protocol/webauthn_handler_unittest.cc new file mode 100644 index 0000000..e00546b --- /dev/null +++ b/content/browser/devtools/protocol/webauthn_handler_unittest.cc
@@ -0,0 +1,39 @@ +// Copyright 2019 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/devtools/protocol/webauthn_handler.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace content { +namespace protocol { + +class WebAuthnHandlerTest : public testing::Test { + public: + void SetUp() override { + webauthn_handler_ = std::make_unique<WebAuthnHandler>(); + } + + void TearDown() override { webauthn_handler_.reset(); } + + protected: + WebAuthnHandler* webauthn_handler() { return webauthn_handler_.get(); } + + private: + std::unique_ptr<WebAuthnHandler> webauthn_handler_; +}; + +TEST_F(WebAuthnHandlerTest, EnableFailsGracefullyIfNoFrameHostSet) { + Response response = webauthn_handler()->Enable(); + EXPECT_EQ(DispatchResponse::Status::kError, response.status()); + EXPECT_STREQ("The DevTools session is not attached to a frame", + response.errorMessage().c_str()); +} + +TEST_F(WebAuthnHandlerTest, DisableGracefullyIfNoFrameHostSet) { + Response response = webauthn_handler()->Disable(); + EXPECT_EQ(DispatchResponse::Status::kSuccess, response.status()); +} + +} // namespace protocol +} // namespace content
diff --git a/content/browser/indexed_db/indexed_db_transaction.cc b/content/browser/indexed_db/indexed_db_transaction.cc index 26b3f0767..4f2a1f21 100644 --- a/content/browser/indexed_db/indexed_db_transaction.cc +++ b/content/browser/indexed_db/indexed_db_transaction.cc
@@ -250,14 +250,19 @@ if (callbacks_.get()) callbacks_->OnAbort(*this, error); + // |TransactionFinished| can delete the database, which owns the connection, + // which owns this transaction. Grab a weak pointer to the connection so we + // can test it later. + base::WeakPtr<IndexedDBConnection> connection = connection_; + if (database_) database_->TransactionFinished(mode_, false); // RemoveTransaction will delete |this|. // Note: During force-close situations, the connection can be destroyed during // the |IndexedDBDatabase::TransactionFinished| call - if (connection_) - connection_->RemoveTransaction(id_); + if (connection) + connection->RemoveTransaction(id_); } bool IndexedDBTransaction::IsTaskQueueEmpty() const {
diff --git a/content/browser/renderer_host/input/input_device_change_observer.cc b/content/browser/renderer_host/input/input_device_change_observer.cc index d4f206b9..8280ecc 100644 --- a/content/browser/renderer_host/input/input_device_change_observer.cc +++ b/content/browser/renderer_host/input/input_device_change_observer.cc
@@ -11,7 +11,7 @@ #if defined(OS_WIN) #include "ui/events/devices/input_device_observer_win.h" #elif defined(OS_LINUX) -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #elif defined(OS_ANDROID) #include "ui/events/devices/input_device_observer_android.h" #endif @@ -23,7 +23,7 @@ #if defined(OS_WIN) ui::InputDeviceObserverWin::GetInstance()->AddObserver(this); #elif defined(OS_LINUX) - ui::InputDeviceManager::GetInstance()->AddObserver(this); + ui::DeviceDataManager::GetInstance()->AddObserver(this); #elif defined(OS_ANDROID) ui::InputDeviceObserverAndroid::GetInstance()->AddObserver(this); #endif @@ -33,7 +33,7 @@ #if defined(OS_WIN) ui::InputDeviceObserverWin::GetInstance()->RemoveObserver(this); #elif defined(OS_LINUX) - ui::InputDeviceManager::GetInstance()->RemoveObserver(this); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); #elif defined(OS_ANDROID) ui::InputDeviceObserverAndroid::GetInstance()->RemoveObserver(this); #endif
diff --git a/content/browser/renderer_host/media/aec_dump_manager_impl.cc b/content/browser/renderer_host/media/aec_dump_manager_impl.cc new file mode 100644 index 0000000..67a5489 --- /dev/null +++ b/content/browser/renderer_host/media/aec_dump_manager_impl.cc
@@ -0,0 +1,106 @@ +// Copyright 2019 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/media/aec_dump_manager_impl.h" + +#include "base/files/file.h" +#include "base/strings/string_number_conversions.h" +#include "base/task/post_task.h" +#include "content/browser/webrtc/webrtc_internals.h" +#include "content/public/browser/render_process_host.h" +#include "mojo/public/cpp/base/file_mojom_traits.h" + +namespace content { +namespace { + +constexpr char kAecDumpFileNameAddition[] = "aec_dump"; + +base::File CreateDumpFile(const base::FilePath& file_path) { + return base::File(file_path, + base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_APPEND); +} + +} // namespace + +AecDumpManagerImpl::AecDumpManagerImpl() = default; + +AecDumpManagerImpl::~AecDumpManagerImpl() = default; + +void AecDumpManagerImpl::AddRequest( + mojo::InterfaceRequest<mojom::AecDumpManager> request) { + receiver_set_.Add(this, std::move(request)); +} + +void AecDumpManagerImpl::AutoStart(base::ProcessId pid) { + WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance(); + if (webrtc_internals->IsAudioDebugRecordingsEnabled()) + Start(pid, webrtc_internals->GetAudioDebugRecordingsFilePath()); +} + +void AecDumpManagerImpl::Start(base::ProcessId pid, + const base::FilePath& file_path) { + base::FilePath file_path_extended = + file_path.AddExtensionASCII(base::NumberToString(pid)) + .AddExtensionASCII(kAecDumpFileNameAddition); + + for (auto& it : agents_) + CreateFileAndStartDump(file_path_extended, it.first); +} + +void AecDumpManagerImpl::Stop() { + for (auto& it : agents_) + it.second->Stop(); +} + +void AecDumpManagerImpl::Add(mojo::PendingRemote<mojom::AecDumpAgent> agent) { + int id = ++id_counter_; + + agents_.emplace(std::make_pair(id, std::move(agent))); + + agents_[id].set_disconnect_handler( + base::BindOnce(&AecDumpManagerImpl::OnAgentDisconnected, + weak_factory_.GetWeakPtr(), id)); + + WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance(); + if (webrtc_internals->IsAudioDebugRecordingsEnabled()) { + CreateFileAndStartDump(webrtc_internals->GetAudioDebugRecordingsFilePath(), + id); + } +} + +void AecDumpManagerImpl::CreateFileAndStartDump(const base::FilePath& file_path, + int id) { + base::PostTaskAndReplyWithResult( + FROM_HERE, + {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN, + base::TaskPriority::USER_BLOCKING}, + base::BindOnce(&CreateDumpFile, + file_path.AddExtensionASCII(base::NumberToString(id))), + base::BindOnce(&AecDumpManagerImpl::StartDump, weak_factory_.GetWeakPtr(), + id)); +} + +void AecDumpManagerImpl::StartDump(int id, base::File file) { + if (!file.IsValid()) { + VLOG(1) << "Could not open AEC dump file, error=" << file.error_details(); + return; + } + + auto it = agents_.find(id); + if (it == agents_.end()) { + // Post the file close to avoid blocking the current thread. + base::PostTaskWithTraits( + FROM_HERE, {base::TaskPriority::LOWEST, base::MayBlock()}, + base::BindOnce([](base::File) {}, std::move(file))); + return; + } + + it->second->Start(std::move(file)); +} + +void AecDumpManagerImpl::OnAgentDisconnected(int id) { + agents_.erase(id); +} + +} // namespace content
diff --git a/content/browser/renderer_host/media/aec_dump_manager_impl.h b/content/browser/renderer_host/media/aec_dump_manager_impl.h new file mode 100644 index 0000000..96ae6ad0 --- /dev/null +++ b/content/browser/renderer_host/media/aec_dump_manager_impl.h
@@ -0,0 +1,57 @@ +// Copyright 2019 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_MEDIA_AEC_DUMP_MANAGER_IMPL_H_ +#define CONTENT_BROWSER_RENDERER_HOST_MEDIA_AEC_DUMP_MANAGER_IMPL_H_ + +#include <map> +#include <memory> + +#include "base/process/process_handle.h" +#include "content/common/media/aec_dump.mojom.h" +#include "mojo/public/cpp/bindings/receiver_set.h" + +namespace base { +class File; +class FilePath; +} // namespace base + +namespace content { + +class AecDumpManagerImpl : public mojom::AecDumpManager { + public: + AecDumpManagerImpl(); + ~AecDumpManagerImpl() override; + + void AddRequest(mojo::InterfaceRequest<mojom::AecDumpManager> request); + + // Start generating AEC dumps using default settings. + void AutoStart(base::ProcessId pid); + + // Start generating AEC dumps using a specific file path prefix. + void Start(base::ProcessId pid, const base::FilePath& file_path); + + // Stop generating AEC dumps. + void Stop(); + + // mojom::AecDumpManager methods: + void Add(mojo::PendingRemote<mojom::AecDumpAgent> agent) override; + + private: + void CreateFileAndStartDump(const base::FilePath& file_path, int id); + void StartDump(int id, base::File file); + void OnAgentDisconnected(int id); + + std::map<int /* id */, mojo::Remote<mojom::AecDumpAgent>> agents_; + int id_counter_ = 0; + mojo::ReceiverSet<mojom::AecDumpManager> receiver_set_; + + base::WeakPtrFactory<AecDumpManagerImpl> weak_factory_{this}; + + DISALLOW_COPY_AND_ASSIGN(AecDumpManagerImpl); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_RENDERER_HOST_MEDIA_AEC_DUMP_MANAGER_IMPL_H_
diff --git a/content/browser/renderer_host/render_process_host_browsertest.cc b/content/browser/renderer_host/render_process_host_browsertest.cc index 7bb33e6..b223b11 100644 --- a/content/browser/renderer_host/render_process_host_browsertest.cc +++ b/content/browser/renderer_host/render_process_host_browsertest.cc
@@ -42,6 +42,7 @@ #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" +#include "services/network/public/cpp/features.h" #if defined(OS_WIN) #include "base/win/windows_version.h" @@ -412,6 +413,9 @@ // for StoragePartition differences when handing out the spare process. IN_PROC_BROWSER_TEST_F(RenderProcessHostTest, SpareProcessVsCustomStoragePartition) { + if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) + return; + ASSERT_TRUE(embedded_test_server()->Start()); // Provide custom storage partition for test sites.
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 574ba1a..8020d527 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -135,14 +135,12 @@ #include "content/browser/site_instance_impl.h" #include "content/browser/storage_partition_impl.h" #include "content/browser/tracing/background_tracing_manager_impl.h" -#include "content/browser/webrtc/webrtc_internals.h" #include "content/browser/websockets/websocket_manager.h" #include "content/browser/webui/web_ui_controller_factory_registry.h" #include "content/common/child_process_host_impl.h" #include "content/common/content_switches_internal.h" #include "content/common/frame_messages.h" #include "content/common/in_process_child_thread_params.h" -#include "content/common/media/aec_dump_messages.h" #include "content/common/media/peer_connection_tracker_messages.h" #include "content/common/resource_messages.h" #include "content/common/service_manager/child_connection.h" @@ -269,12 +267,6 @@ #include "services/service_manager/zygote/common/zygote_handle.h" // nogncheck #endif -#if defined(OS_WIN) -#define NumberToStringType base::NumberToString16 -#else -#define NumberToStringType base::NumberToString -#endif - namespace content { namespace { @@ -295,9 +287,6 @@ RenderProcessHost::AnalyzeHungRendererFunction g_analyze_hung_renderer = nullptr; -const base::FilePath::CharType kAecDumpFileNameAddition[] = - FILE_PATH_LITERAL("aec_dump"); - void CacheShaderInfo(int32_t id, base::FilePath path) { if (GetShaderCacheFactorySingleton()) GetShaderCacheFactorySingleton()->SetCacheInfo(id, path); @@ -332,18 +321,6 @@ GetRequestContext(request_context, media_request_context, resource_type); } -// Creates a file used for handing over to the renderer. -IPC::PlatformFileForTransit CreateFileForProcess(base::FilePath file_path) { - base::File dump_file(file_path, - base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_APPEND); - if (!dump_file.IsValid()) { - VLOG(1) << "Could not open AEC dump file, error=" - << dump_file.error_details(); - return IPC::InvalidPlatformFileForTransit(); - } - return IPC::TakePlatformFileForTransit(std::move(dump_file)); -} - // Allow us to only run the trial in the first renderer. bool has_done_stun_trials = false; @@ -2194,6 +2171,11 @@ base::BindRepeating(&RenderProcessHostImpl::BindVideoDecoderService, base::Unretained(this))); + AddUIThreadInterface( + registry.get(), + base::BindRepeating(&AecDumpManagerImpl::AddRequest, + base::Unretained(&aec_dump_manager_))); + // ---- Please do not register interfaces below this line ------ // // This call should be done after registering all interfaces above, so that @@ -3277,10 +3259,6 @@ IPC_MESSAGE_HANDLER(ViewHostMsg_UserMetricsRecordAction, OnUserMetricsRecordAction) IPC_MESSAGE_HANDLER(WidgetHostMsg_Close_ACK, OnCloseACK) - IPC_MESSAGE_HANDLER(AecDumpMsg_RegisterAecDumpConsumer, - OnRegisterAecDumpConsumer) - IPC_MESSAGE_HANDLER(AecDumpMsg_UnregisterAecDumpConsumer, - OnUnregisterAecDumpConsumer) // Adding single handlers for your service here is fine, but once your // service needs more than one handler, please extract them into a new // message filter and add that filter to CreateMessageFilters(). @@ -3547,26 +3525,16 @@ } void RenderProcessHostImpl::EnableAudioDebugRecordings( - const base::FilePath& file) { + const base::FilePath& file_path) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - // Enable AEC dump for each registered consumer. - base::FilePath file_with_extensions = GetAecDumpFilePathWithExtensions(file); - for (int id : aec_dump_consumers_) { - EnableAecDumpForId(file_with_extensions, id); - } + aec_dump_manager_.Start(GetProcess().Pid(), file_path); } void RenderProcessHostImpl::DisableAudioDebugRecordings() { DCHECK_CURRENTLY_ON(BrowserThread::UI); - // Posting on the sequence and then replying back on the UI thread is only - // for avoiding races between enable and disable. Nothing is done on the - // sequence. - GetAecDumpFileTaskRunner().PostTaskAndReply( - FROM_HERE, base::DoNothing(), - base::BindOnce(&RenderProcessHostImpl::SendDisableAecDumpToRenderer, - weak_factory_.GetWeakPtr())); + aec_dump_manager_.Stop(); } RenderProcessHostImpl::WebRtcStopRtpDumpCallback @@ -4472,11 +4440,7 @@ observer.RenderProcessReady(this); } - WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance(); - if (webrtc_internals->IsAudioDebugRecordingsEnabled()) { - EnableAudioDebugRecordings( - webrtc_internals->GetAudioDebugRecordingsFilePath()); - } + aec_dump_manager_.AutoStart(GetProcess().Pid()); } void RenderProcessHostImpl::OnProcessLaunchFailed(int error_code) { @@ -4576,80 +4540,6 @@ } #endif // BUILDFLAG(ENABLE_MDNS) -void RenderProcessHostImpl::OnRegisterAecDumpConsumer(int id) { - base::PostTaskWithTraits( - FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&RenderProcessHostImpl::RegisterAecDumpConsumerOnUIThread, - weak_factory_.GetWeakPtr(), id)); -} - -void RenderProcessHostImpl::OnUnregisterAecDumpConsumer(int id) { - base::PostTaskWithTraits( - FROM_HERE, {BrowserThread::UI}, - base::BindOnce( - &RenderProcessHostImpl::UnregisterAecDumpConsumerOnUIThread, - weak_factory_.GetWeakPtr(), id)); -} - -void RenderProcessHostImpl::RegisterAecDumpConsumerOnUIThread(int id) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - aec_dump_consumers_.push_back(id); - - WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance(); - if (webrtc_internals->IsAudioDebugRecordingsEnabled()) { - base::FilePath file_with_extensions = GetAecDumpFilePathWithExtensions( - webrtc_internals->GetAudioDebugRecordingsFilePath()); - EnableAecDumpForId(file_with_extensions, id); - } -} - -void RenderProcessHostImpl::UnregisterAecDumpConsumerOnUIThread(int id) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - auto it = - std::find(aec_dump_consumers_.begin(), aec_dump_consumers_.end(), id); - if (it != aec_dump_consumers_.end()) - aec_dump_consumers_.erase(it); -} - -void RenderProcessHostImpl::EnableAecDumpForId(const base::FilePath& file, - int id) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - base::PostTaskAndReplyWithResult( - &GetAecDumpFileTaskRunner(), FROM_HERE, - base::Bind(&CreateFileForProcess, - file.AddExtension(NumberToStringType(id))), - base::Bind(&RenderProcessHostImpl::SendAecDumpFileToRenderer, - weak_factory_.GetWeakPtr(), id)); -} - -void RenderProcessHostImpl::SendAecDumpFileToRenderer( - int id, - IPC::PlatformFileForTransit file_for_transit) { - if (file_for_transit == IPC::InvalidPlatformFileForTransit()) - return; - Send(new AecDumpMsg_EnableAecDump(id, file_for_transit)); -} - -void RenderProcessHostImpl::SendDisableAecDumpToRenderer() { - Send(new AecDumpMsg_DisableAecDump()); -} - -base::FilePath RenderProcessHostImpl::GetAecDumpFilePathWithExtensions( - const base::FilePath& file) { - return file.AddExtension(NumberToStringType(GetProcess().Pid())) - .AddExtension(kAecDumpFileNameAddition); -} - -base::SequencedTaskRunner& RenderProcessHostImpl::GetAecDumpFileTaskRunner() { - if (!audio_debug_recordings_file_task_runner_) { - audio_debug_recordings_file_task_runner_ = - base::CreateSequencedTaskRunnerWithTraits( - {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN, - base::TaskPriority::USER_BLOCKING}); - } - return *audio_debug_recordings_file_task_runner_; -} - // static void RenderProcessHostImpl::OnMojoError(int render_process_id, const std::string& error) {
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h index a949f32..da7d3ca 100644 --- a/content/browser/renderer_host/render_process_host_impl.h +++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -33,6 +33,7 @@ #include "content/browser/media/video_decoder_proxy.h" #include "content/browser/renderer_host/embedded_frame_sink_provider_impl.h" #include "content/browser/renderer_host/frame_sink_provider_impl.h" +#include "content/browser/renderer_host/media/aec_dump_manager_impl.h" #include "content/browser/renderer_host/media/renderer_audio_output_stream_factory_context_impl.h" #include "content/common/associated_interfaces.mojom.h" #include "content/common/child_control.mojom.h" @@ -636,17 +637,6 @@ void CreateMdnsResponder(network::mojom::MdnsResponderRequest request); #endif // BUILDFLAG(ENABLE_MDNS) - void OnRegisterAecDumpConsumer(int id); - void OnUnregisterAecDumpConsumer(int id); - void RegisterAecDumpConsumerOnUIThread(int id); - void UnregisterAecDumpConsumerOnUIThread(int id); - void EnableAecDumpForId(const base::FilePath& file, int id); - // Sends |file_for_transit| to the render process. - void SendAecDumpFileToRenderer(int id, - IPC::PlatformFileForTransit file_for_transit); - void SendDisableAecDumpToRenderer(); - base::FilePath GetAecDumpFilePathWithExtensions(const base::FilePath& file); - base::SequencedTaskRunner& GetAecDumpFileTaskRunner(); void NotifyRendererIfLockedToSite(); void PopulateTerminationInfoRendererFields(ChildProcessTerminationInfo* info); @@ -839,13 +829,10 @@ std::unique_ptr<P2PSocketDispatcherHost> p2p_socket_dispatcher_host_; // Must be accessed on UI thread. - std::vector<int> aec_dump_consumers_; + AecDumpManagerImpl aec_dump_manager_; WebRtcStopRtpDumpCallback stop_rtp_dump_callback_; - scoped_refptr<base::SequencedTaskRunner> - audio_debug_recordings_file_task_runner_; - std::unique_ptr<MediaStreamTrackMetricsHost, BrowserThread::DeleteOnIOThread> media_stream_track_metrics_host_;
diff --git a/content/browser/tracing/tracing_controller_impl.cc b/content/browser/tracing/tracing_controller_impl.cc index c7d2b04..b5c09bbc 100644 --- a/content/browser/tracing/tracing_controller_impl.cc +++ b/content/browser/tracing/tracing_controller_impl.cc
@@ -59,6 +59,7 @@ #endif #if defined(OS_ANDROID) +#include <sys/time.h> #include "base/debug/elf_reader.h" #include "content/browser/android/tracing_controller_android.h" @@ -115,6 +116,38 @@ return std::string(); } +#if defined(OS_ANDROID) +int64_t ConvertTimespecToMicros(const struct timespec& ts) { + // On 32-bit systems, the calculation cannot overflow int64_t. + // 2**32 * 1000000 + 2**64 / 1000 < 2**63 + if (sizeof(ts.tv_sec) <= 4 && sizeof(ts.tv_nsec) <= 8) { + int64_t result = ts.tv_sec; + result *= base::Time::kMicrosecondsPerSecond; + result += (ts.tv_nsec / base::Time::kNanosecondsPerMicrosecond); + return result; + } + base::CheckedNumeric<int64_t> result(ts.tv_sec); + result *= base::Time::kMicrosecondsPerSecond; + result += (ts.tv_nsec / base::Time::kNanosecondsPerMicrosecond); + return result.ValueOrDie(); +} + +// This returns the offset between the monotonic clock and the realtime clock. +// We could read btime from /proc/status files; however, btime can be off by +// around 1s, which is too much. The following method should give us a better +// approximation of the offset. +std::string GetClockOffsetSinceEpoch() { + struct timespec realtime_before, monotonic, realtime_after; + clock_gettime(CLOCK_REALTIME, &realtime_before); + clock_gettime(CLOCK_MONOTONIC, &monotonic); + clock_gettime(CLOCK_REALTIME, &realtime_after); + return base::StringPrintf("%" PRId64, + ConvertTimespecToMicros(realtime_before) / 2 + + ConvertTimespecToMicros(realtime_after) / 2 - + ConvertTimespecToMicros(monotonic)); +} +#endif + #if defined(OS_WIN) // The following code detect whether the current session is a remote session. // See: @@ -241,6 +274,8 @@ base::debug::ReadElfLibraryName(&__ehdr_start); if (soname) metadata_dict->SetString("chrome-library-name", *soname); + metadata_dict->SetString("clock-offset-since-epoch", + GetClockOffsetSinceEpoch()); #endif // defined(OS_ANDROID) metadata_dict->SetInteger("chrome-bitness", 8 * sizeof(uintptr_t));
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index 32d91d8..f25500a1 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -409,6 +409,11 @@ WebRuntimeFeatures::EnablePictureInPicture( base::FeatureList::IsEnabled(media::kPictureInPicture)); +#if defined(OS_ANDROID) + WebRuntimeFeatures::EnablePictureInPictureAPI( + base::FeatureList::IsEnabled(media::kPictureInPictureAPI)); +#endif + WebRuntimeFeatures::EnableCacheInlineScriptCode( base::FeatureList::IsEnabled(features::kCacheInlineScriptCode));
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index 25d40e6..36106aa 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -176,7 +176,6 @@ "mac/attributed_string_coder.mm", "mac/font_loader.h", "mac/font_loader.mm", - "media/aec_dump_messages.h", "media/cdm_info.cc", "media/media_player_delegate_messages.h", "media/peer_connection_tracker_messages.h", @@ -476,6 +475,7 @@ "input/input_handler.mojom", "input/input_injector.mojom", "input/synchronous_compositor.mojom", + "media/aec_dump.mojom", "media/peer_connection_tracker.mojom", "media/renderer_audio_input_stream_factory.mojom", "media/renderer_audio_output_stream_factory.mojom",
diff --git a/content/common/content_message_generator.h b/content/common/content_message_generator.h index 7f555c0..27534ba 100644 --- a/content/common/content_message_generator.h +++ b/content/common/content_message_generator.h
@@ -41,11 +41,6 @@ #ifndef CONTENT_COMMON_INPUT_MESSAGES_H_ #error "Failed to include content/common/input_messages.h" #endif -#undef CONTENT_COMMON_MEDIA_AEC_DUMP_MESSAGES_H_ -#include "content/common/media/aec_dump_messages.h" -#ifndef CONTENT_COMMON_MEDIA_AEC_DUMP_MESSAGES_H_ -#error "Failed to include content/common/media/aec_dump_messages.h" -#endif #undef CONTENT_COMMON_MEDIA_MEDIA_PLAYER_DELEGATE_MESSAGES_H_ #include "content/common/media/media_player_delegate_messages.h" #ifndef CONTENT_COMMON_MEDIA_MEDIA_PLAYER_DELEGATE_MESSAGES_H_
diff --git a/content/common/media/aec_dump.mojom b/content/common/media/aec_dump.mojom new file mode 100644 index 0000000..24fe459 --- /dev/null +++ b/content/common/media/aec_dump.mojom
@@ -0,0 +1,19 @@ +// Copyright 2019 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 content.mojom; + +import "mojo/public/mojom/base/file.mojom"; + +// Interface used to start / stop writing out an AEC dump from a child process. +interface AecDumpAgent { + Start(mojo_base.mojom.File file); + Stop(); +}; + +// Interface used to register child processes that can generate AEC dump files. +interface AecDumpManager { + // Register the provided |agent| until disconnected. + Add(pending_remote<AecDumpAgent> agent); +};
diff --git a/content/common/media/aec_dump_messages.h b/content/common/media/aec_dump_messages.h deleted file mode 100644 index fc84743..0000000 --- a/content/common/media/aec_dump_messages.h +++ /dev/null
@@ -1,40 +0,0 @@ -// 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. - -#ifndef CONTENT_COMMON_MEDIA_AEC_DUMP_MESSAGES_H_ -#define CONTENT_COMMON_MEDIA_AEC_DUMP_MESSAGES_H_ - -// IPC messages for the AEC dump. - -#include "content/common/content_export.h" -#include "ipc/ipc_message_macros.h" -#include "ipc/ipc_platform_file.h" - -#undef IPC_MESSAGE_EXPORT -#define IPC_MESSAGE_EXPORT CONTENT_EXPORT -#define IPC_MESSAGE_START AecDumpMsgStart - -// Messages sent from the browser to the renderer. - -// The browser hands over a file handle to the consumer in the renderer -// identified by |id| to use for AEC dump. -IPC_MESSAGE_CONTROL2(AecDumpMsg_EnableAecDump, - int /* id */, - IPC::PlatformFileForTransit /* file_handle */) - -// Tell the renderer to disable AEC dump in all consumers. -IPC_MESSAGE_CONTROL0(AecDumpMsg_DisableAecDump) - -// Messages sent from the renderer to the browser. - -// Registers a consumer with the browser. The consumer will then get a file -// handle when the dump is enabled. -IPC_MESSAGE_CONTROL1(AecDumpMsg_RegisterAecDumpConsumer, - int /* id */) - -// Unregisters a consumer with the browser. -IPC_MESSAGE_CONTROL1(AecDumpMsg_UnregisterAecDumpConsumer, - int /* id */) - -#endif // CONTENT_COMMON_MEDIA_AEC_DUMP_MESSAGES_H_
diff --git a/content/public/app/content_browser_manifest.cc b/content/public/app/content_browser_manifest.cc index f53c4405..c36f884c 100644 --- a/content/public/app/content_browser_manifest.cc +++ b/content/public/app/content_browser_manifest.cc
@@ -71,6 +71,7 @@ "blink.mojom.ReportingServiceProxy", "blink.mojom.StoragePartitionService", "blink.mojom.WebDatabaseHost", + "content.mojom.AecDumpManager", "content.mojom.ClipboardHost", "content.mojom.FieldTrialRecorder", "content.mojom.FrameSinkProvider",
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index 9a1ee08c..7fccce0 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -200,8 +200,8 @@ "media/renderer_webaudiodevice_impl.h", "media/renderer_webmediaplayer_delegate.cc", "media/renderer_webmediaplayer_delegate.h", - "media/stream/aec_dump_message_filter.cc", - "media/stream/aec_dump_message_filter.h", + "media/stream/aec_dump_agent_impl.cc", + "media/stream/aec_dump_agent_impl.h", "media/stream/apply_constraints_processor.cc", "media/stream/apply_constraints_processor.h", "media/stream/audio_service_audio_processor_proxy.cc",
diff --git a/content/renderer/accessibility/blink_ax_enum_conversion.cc b/content/renderer/accessibility/blink_ax_enum_conversion.cc index 114d1c9..656c0c2 100644 --- a/content/renderer/accessibility/blink_ax_enum_conversion.cc +++ b/content/renderer/accessibility/blink_ax_enum_conversion.cc
@@ -75,6 +75,9 @@ dst->AddState(ax::mojom::State::kVertical); else if (o.Orientation() == blink::kWebAXOrientationHorizontal) dst->AddState(ax::mojom::State::kHorizontal); + + if (o.AccessibilityIsIgnored()) + dst->AddState(ax::mojom::State::kIgnored); } } // namespace content.
diff --git a/content/renderer/accessibility/blink_ax_tree_source.cc b/content/renderer/accessibility/blink_ax_tree_source.cc index 9df33a8..da9b875 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.cc +++ b/content/renderer/accessibility/blink_ax_tree_source.cc
@@ -488,6 +488,10 @@ return node; } +bool BlinkAXTreeSource::IsIgnored(WebAXObject node) const { + return node.AccessibilityIsIgnored(); +} + bool BlinkAXTreeSource::IsValid(WebAXObject node) const { return !node.IsDetached(); // This also checks if it's null. } @@ -541,6 +545,11 @@ if (clips_children) dst->AddBoolAttribute(ax::mojom::BoolAttribute::kClipsChildren, true); + if (src.IsLineBreakingObject()) { + dst->AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject, + true); + } + AXContentNodeDataSparseAttributeAdapter sparse_attribute_adapter(dst); src.GetSparseAXAttributes(sparse_attribute_adapter);
diff --git a/content/renderer/accessibility/blink_ax_tree_source.h b/content/renderer/accessibility/blink_ax_tree_source.h index 5d05648..4d0d671 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.h +++ b/content/renderer/accessibility/blink_ax_tree_source.h
@@ -101,6 +101,7 @@ blink::WebAXObject GetParent(blink::WebAXObject node) const override; void SerializeNode(blink::WebAXObject node, AXContentNodeData* out_data) const override; + bool IsIgnored(blink::WebAXObject node) const override; bool IsValid(blink::WebAXObject node) const override; bool IsEqual(blink::WebAXObject node1, blink::WebAXObject node2) const override;
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc index dc9228b4..8d297be4 100644 --- a/content/renderer/accessibility/render_accessibility_impl.cc +++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -518,8 +518,43 @@ continue; // If it's ignored, find the first ancestor that's not ignored. - while (!obj.IsDetached() && obj.AccessibilityIsIgnored()) + while (!obj.IsDetached() && obj.AccessibilityIsIgnored()) { + // There are 3 states of nodes that we care about here. + // (x) Unignored, included in tree + // [x] Ignored, included in tree + // <x> Ignored, excluded from tree + // + // Consider the following tree : + // ++(0) Role::kRootWebArea + // ++++<1> Role::kIgnored + // ++++++[2] Role::kGenericContainer <body> + // ++++++++[3] Role::kGenericContainer with 'visibility: hidden' + // + // If we modify [3] to be 'visibility: visible', we will receive + // Event::kChildrenChanged here for the Ignored parent [2]. + // We must re-serialize the Unignored parent node (0) due to this + // change, but we must also re-serialize [2] since its children + // have changed. <1> was never part of the ax tree, and therefore + // does not need to be serialized. + // + // So on the way to the Unignored parent, ancestors that are + // included in the tree must also be serialized. + // Note that [3] will be serialized to (3) during : + // |AXTreeSerializer<>::SerializeChangedNodes| when node [2] is + // being serialized, since it will detect the Ignored state had + // changed. + // + // Similarly, during Event::kTextChanged, if any Ignored, + // but included in tree ancestor uses NameFrom::kContents, + // they must also be re-serialized in case the name changed. + if (obj.AccessibilityIsIncludedInTree()) { + DirtyObject dirty_object; + dirty_object.obj = obj; + dirty_object.event_from = event.event_from; + dirty_objects.push_back(dirty_object); + } obj = obj.ParentObject(); + } // Make sure it's a descendant of our root node - exceptions include the // scroll area that's the parent of the main document (we ignore it), and
diff --git a/content/renderer/accessibility/render_accessibility_impl_browsertest.cc b/content/renderer/accessibility/render_accessibility_impl_browsertest.cc index 4ec4f38..08bacee 100644 --- a/content/renderer/accessibility/render_accessibility_impl_browsertest.cc +++ b/content/renderer/accessibility/render_accessibility_impl_browsertest.cc
@@ -225,7 +225,7 @@ )HTML"; LoadHTMLAndRefreshAccessibilityTree(html); - EXPECT_EQ(4, CountAccessibilityNodesSentToBrowser()); + EXPECT_EQ(5, CountAccessibilityNodesSentToBrowser()); // If we post another event but the tree doesn't change, // we should only send 1 node to the browser. @@ -243,7 +243,7 @@ } // If we reload the page and send a event, we should send - // all 4 nodes to the browser. Also double-check that we didn't + // all 5 nodes to the browser. Also double-check that we didn't // leak any of the old BrowserTreeNodes. LoadHTML(html); document = GetMainFrame()->GetDocument(); @@ -252,7 +252,7 @@ render_accessibility().HandleAXEvent(root_obj, ax::mojom::Event::kLayoutComplete); render_accessibility().SendPendingAccessibilityEvents(); - EXPECT_EQ(4, CountAccessibilityNodesSentToBrowser()); + EXPECT_EQ(5, CountAccessibilityNodesSentToBrowser()); // Even if the first event is sent on an element other than // the root, the whole tree should be updated because we know @@ -265,7 +265,7 @@ render_accessibility().HandleAXEvent(first_child, ax::mojom::Event::kLiveRegionChanged); render_accessibility().SendPendingAccessibilityEvents(); - EXPECT_EQ(4, CountAccessibilityNodesSentToBrowser()); + EXPECT_EQ(5, CountAccessibilityNodesSentToBrowser()); } TEST_F(RenderAccessibilityImplTest, HideAccessibilityObject) { @@ -283,11 +283,12 @@ </body> )HTML"); - EXPECT_EQ(4, CountAccessibilityNodesSentToBrowser()); + EXPECT_EQ(5, CountAccessibilityNodesSentToBrowser()); WebDocument document = GetMainFrame()->GetDocument(); WebAXObject root_obj = WebAXObject::FromWebDocument(document); - WebAXObject node_a = root_obj.ChildAt(0); + WebAXObject body = root_obj.ChildAt(0); + WebAXObject node_a = body.ChildAt(0); WebAXObject node_b = node_a.ChildAt(0); WebAXObject node_c = node_b.ChildAt(0); @@ -305,11 +306,13 @@ AXContentTreeUpdate update = GetLastAccUpdate(); ASSERT_EQ(2U, update.nodes.size()); - // RenderAccessibilityImpl notices that "C" is being reparented, - // so it clears the subtree rooted at "A", then updates "A" and then "C". - EXPECT_EQ(node_a.AxID(), update.node_id_to_clear); + // Since ignored nodes are included in the ax tree with State::kIgnored set, + // "C" is NOT reparented, only the changed nodes are re-serialized. + // "A" updates because it handled Event::kChildrenChanged + // "B" updates because its State::kIgnored has changed + EXPECT_EQ(0, update.node_id_to_clear); EXPECT_EQ(node_a.AxID(), update.nodes[0].id); - EXPECT_EQ(node_c.AxID(), update.nodes[1].id); + EXPECT_EQ(node_b.AxID(), update.nodes[1].id); EXPECT_EQ(2, CountAccessibilityNodesSentToBrowser()); } @@ -329,12 +332,14 @@ </body> )HTML"); - EXPECT_EQ(3, CountAccessibilityNodesSentToBrowser()); + EXPECT_EQ(5, CountAccessibilityNodesSentToBrowser()); WebDocument document = GetMainFrame()->GetDocument(); WebAXObject root_obj = WebAXObject::FromWebDocument(document); - WebAXObject node_a = root_obj.ChildAt(0); - WebAXObject node_c = node_a.ChildAt(0); + WebAXObject body = root_obj.ChildAt(0); + WebAXObject node_a = body.ChildAt(0); + WebAXObject node_b = node_a.ChildAt(0); + WebAXObject node_c = node_b.ChildAt(0); // Show node "B", then send a childrenChanged on "A". ExecuteJavaScriptForTests( @@ -343,19 +348,20 @@ root_obj.UpdateLayoutAndCheckValidity(); sink_->ClearMessages(); - WebAXObject node_b = node_a.ChildAt(0); - render_accessibility().HandleAXEvent(node_a, ax::mojom::Event::kChildrenChanged); render_accessibility().SendPendingAccessibilityEvents(); AXContentTreeUpdate update = GetLastAccUpdate(); - ASSERT_EQ(3U, update.nodes.size()); - EXPECT_EQ(node_a.AxID(), update.node_id_to_clear); + // Since ignored nodes are included in the ax tree with State::kIgnored set, + // "C" is NOT reparented, only the changed nodes are re-serialized. + // "A" updates because it handled Event::kChildrenChanged + // "B" updates because its State::kIgnored has changed + ASSERT_EQ(2U, update.nodes.size()); + EXPECT_EQ(0, update.node_id_to_clear); EXPECT_EQ(node_a.AxID(), update.nodes[0].id); EXPECT_EQ(node_b.AxID(), update.nodes[1].id); - EXPECT_EQ(node_c.AxID(), update.nodes[2].id); - EXPECT_EQ(3, CountAccessibilityNodesSentToBrowser()); + EXPECT_EQ(2, CountAccessibilityNodesSentToBrowser()); } //
diff --git a/content/renderer/media/stream/aec_dump_agent_impl.cc b/content/renderer/media/stream/aec_dump_agent_impl.cc new file mode 100644 index 0000000..5b80a8e --- /dev/null +++ b/content/renderer/media/stream/aec_dump_agent_impl.cc
@@ -0,0 +1,46 @@ +// 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. + +#include "content/renderer/media/stream/aec_dump_agent_impl.h" + +#include "content/public/child/child_thread.h" +#include "content/public/common/service_names.mojom.h" +#include "mojo/public/cpp/bindings/remote.h" +#include "services/service_manager/public/cpp/connector.h" + +namespace content { + +// static +std::unique_ptr<AecDumpAgentImpl> AecDumpAgentImpl::Create(Delegate* delegate) { + if (!ChildThread::Get()) // Can be true in unit tests. + return nullptr; + + mojo::Remote<mojom::AecDumpManager> manager; + ChildThread::Get()->GetConnector()->Connect( + mojom::kBrowserServiceName, manager.BindNewPipeAndPassReceiver()); + + mojo::PendingRemote<AecDumpAgent> remote; + auto receiver = remote.InitWithNewPipeAndPassReceiver(); + + manager->Add(std::move(remote)); + + return base::WrapUnique(new AecDumpAgentImpl(delegate, std::move(receiver))); +} + +AecDumpAgentImpl::AecDumpAgentImpl( + Delegate* delegate, + mojo::PendingReceiver<mojom::AecDumpAgent> receiver) + : delegate_(delegate), receiver_(this, std::move(receiver)) {} + +AecDumpAgentImpl::~AecDumpAgentImpl() = default; + +void AecDumpAgentImpl::Start(base::File dump_file) { + delegate_->OnStartDump(std::move(dump_file)); +} + +void AecDumpAgentImpl::Stop() { + delegate_->OnStopDump(); +} + +} // namespace content
diff --git a/content/renderer/media/stream/aec_dump_agent_impl.h b/content/renderer/media/stream/aec_dump_agent_impl.h new file mode 100644 index 0000000..fd04eab --- /dev/null +++ b/content/renderer/media/stream/aec_dump_agent_impl.h
@@ -0,0 +1,46 @@ +// 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. + +#ifndef CONTENT_RENDERER_MEDIA_STREAM_AEC_DUMP_AGENT_IMPL_H_ +#define CONTENT_RENDERER_MEDIA_STREAM_AEC_DUMP_AGENT_IMPL_H_ + +#include "base/macros.h" +#include "content/common/media/aec_dump.mojom.h" +#include "mojo/public/cpp/bindings/receiver.h" + +namespace content { + +// An instance of this class connects to the browser process to register for +// notifications to start / stop writing to a dump file. +class AecDumpAgentImpl : public mojom::AecDumpAgent { + public: + class Delegate { + public: + virtual void OnStartDump(base::File file) = 0; + virtual void OnStopDump() = 0; + }; + + // This may fail in unit tests, in which case a null object is returned. + static std::unique_ptr<AecDumpAgentImpl> Create(Delegate* delegate); + + ~AecDumpAgentImpl() override; + + // AecDumpAgent methods: + void Start(base::File dump_file) override; + void Stop() override; + + private: + explicit AecDumpAgentImpl( + Delegate* delegate, + mojo::PendingReceiver<mojom::AecDumpAgent> receiver); + + Delegate* delegate_; + mojo::Receiver<mojom::AecDumpAgent> receiver_{this}; + + DISALLOW_COPY_AND_ASSIGN(AecDumpAgentImpl); +}; + +} // namespace content + +#endif // CONTENT_RENDERER_MEDIA_STREAM_AEC_DUMP_AGENT_IMPL_H_
diff --git a/content/renderer/media/stream/aec_dump_message_filter.cc b/content/renderer/media/stream/aec_dump_message_filter.cc deleted file mode 100644 index 469cb91..0000000 --- a/content/renderer/media/stream/aec_dump_message_filter.cc +++ /dev/null
@@ -1,175 +0,0 @@ -// 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. - -#include "content/renderer/media/stream/aec_dump_message_filter.h" - -#include "base/bind.h" -#include "base/single_thread_task_runner.h" -#include "content/common/media/aec_dump_messages.h" -#include "content/renderer/media/webrtc_logging.h" -#include "ipc/ipc_logging.h" -#include "ipc/ipc_sender.h" - -namespace { -const int kInvalidDelegateId = -1; -} - -namespace content { - -AecDumpMessageFilter* AecDumpMessageFilter::g_filter = nullptr; - -AecDumpMessageFilter::AecDumpMessageFilter( - const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner, - const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner) - : sender_(nullptr), - delegate_id_counter_(1), - io_task_runner_(io_task_runner), - main_task_runner_(main_task_runner) { - DCHECK(!g_filter); - g_filter = this; -} - -AecDumpMessageFilter::~AecDumpMessageFilter() { - DCHECK_EQ(g_filter, this); - g_filter = nullptr; -} - -// static -scoped_refptr<AecDumpMessageFilter> AecDumpMessageFilter::Get() { - return g_filter; -} - -void AecDumpMessageFilter::AddDelegate( - AecDumpMessageFilter::AecDumpDelegate* delegate) { - DCHECK(main_task_runner_->BelongsToCurrentThread()); - DCHECK(delegate); - DCHECK_EQ(kInvalidDelegateId, GetIdForDelegate(delegate)); - - int id = delegate_id_counter_++; - delegates_[id] = delegate; - - io_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&AecDumpMessageFilter::RegisterAecDumpConsumer, this, id)); -} - -void AecDumpMessageFilter::RemoveDelegate( - AecDumpMessageFilter::AecDumpDelegate* delegate) { - DCHECK(main_task_runner_->BelongsToCurrentThread()); - DCHECK(delegate); - - int id = GetIdForDelegate(delegate); - DCHECK_NE(kInvalidDelegateId, id); - delegates_.erase(id); - - io_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&AecDumpMessageFilter::UnregisterAecDumpConsumer, this, - id)); -} - -void AecDumpMessageFilter::Send(IPC::Message* message) { - DCHECK(io_task_runner_->BelongsToCurrentThread()); - if (sender_) - sender_->Send(message); - else - delete message; -} - -void AecDumpMessageFilter::RegisterAecDumpConsumer(int id) { - Send(new AecDumpMsg_RegisterAecDumpConsumer(id)); -} - -void AecDumpMessageFilter::UnregisterAecDumpConsumer(int id) { - Send(new AecDumpMsg_UnregisterAecDumpConsumer(id)); -} - -bool AecDumpMessageFilter::OnMessageReceived(const IPC::Message& message) { - DCHECK(io_task_runner_->BelongsToCurrentThread()); - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(AecDumpMessageFilter, message) - IPC_MESSAGE_HANDLER(AecDumpMsg_EnableAecDump, OnEnableAecDump) - IPC_MESSAGE_HANDLER(AecDumpMsg_DisableAecDump, OnDisableAecDump) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - -void AecDumpMessageFilter::OnFilterAdded(IPC::Channel* channel) { - DCHECK(io_task_runner_->BelongsToCurrentThread()); - sender_ = channel; -} - -void AecDumpMessageFilter::OnFilterRemoved() { - DCHECK(io_task_runner_->BelongsToCurrentThread()); - - // Once removed, a filter will not be used again. At this time the - // observer must be notified so it releases its reference. - OnChannelClosing(); -} - -void AecDumpMessageFilter::OnChannelClosing() { - DCHECK(io_task_runner_->BelongsToCurrentThread()); - sender_ = nullptr; - main_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&AecDumpMessageFilter::DoChannelClosingOnDelegates, this)); -} - -void AecDumpMessageFilter::OnEnableAecDump( - int id, - IPC::PlatformFileForTransit file_handle) { - DCHECK(io_task_runner_->BelongsToCurrentThread()); - main_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&AecDumpMessageFilter::DoEnableAecDump, this, - id, file_handle)); -} - -void AecDumpMessageFilter::OnDisableAecDump() { - DCHECK(io_task_runner_->BelongsToCurrentThread()); - main_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&AecDumpMessageFilter::DoDisableAecDump, this)); -} - -void AecDumpMessageFilter::DoEnableAecDump( - int id, - IPC::PlatformFileForTransit file_handle) { - DCHECK(main_task_runner_->BelongsToCurrentThread()); - auto it = delegates_.find(id); - if (it != delegates_.end()) { - it->second->OnAecDumpFile(file_handle); - } else { - // Delegate has been removed, we must close the file. - base::File file = IPC::PlatformFileForTransitToFile(file_handle); - DCHECK(file.IsValid()); - file.Close(); - } -} - -void AecDumpMessageFilter::DoDisableAecDump() { - DCHECK(main_task_runner_->BelongsToCurrentThread()); - for (auto it = delegates_.begin(); it != delegates_.end(); ++it) { - it->second->OnDisableAecDump(); - } -} - -void AecDumpMessageFilter::DoChannelClosingOnDelegates() { - DCHECK(main_task_runner_->BelongsToCurrentThread()); - for (auto it = delegates_.begin(); it != delegates_.end(); ++it) { - it->second->OnIpcClosing(); - } - delegates_.clear(); -} - -int AecDumpMessageFilter::GetIdForDelegate( - AecDumpMessageFilter::AecDumpDelegate* delegate) { - DCHECK(main_task_runner_->BelongsToCurrentThread()); - for (auto it = delegates_.begin(); it != delegates_.end(); ++it) { - if (it->second == delegate) - return it->first; - } - return kInvalidDelegateId; -} - -} // namespace content
diff --git a/content/renderer/media/stream/aec_dump_message_filter.h b/content/renderer/media/stream/aec_dump_message_filter.h deleted file mode 100644 index 4c340d0..0000000 --- a/content/renderer/media/stream/aec_dump_message_filter.h +++ /dev/null
@@ -1,113 +0,0 @@ -// 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. - -#ifndef CONTENT_RENDERER_MEDIA_STREAM_AEC_DUMP_MESSAGE_FILTER_H_ -#define CONTENT_RENDERER_MEDIA_STREAM_AEC_DUMP_MESSAGE_FILTER_H_ - -#include <memory> - -#include "base/macros.h" -#include "base/optional.h" -#include "content/common/content_export.h" -#include "content/renderer/render_thread_impl.h" -#include "ipc/ipc_platform_file.h" -#include "ipc/message_filter.h" - -namespace base { -class SingleThreadTaskRunner; -} - -namespace content { - -// MessageFilter that handles AEC dump messages and forwards them to an -// observer. -class CONTENT_EXPORT AecDumpMessageFilter : public IPC::MessageFilter { - public: - class AecDumpDelegate { - public: - virtual void OnAecDumpFile( - const IPC::PlatformFileForTransit& file_handle) = 0; - virtual void OnDisableAecDump() = 0; - virtual void OnIpcClosing() = 0; - }; - - AecDumpMessageFilter( - const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner, - const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner); - - // Getter for the one AecDumpMessageFilter object. - static scoped_refptr<AecDumpMessageFilter> Get(); - - // Adds a delegate that receives the enable and disable notifications. Must be - // called on the main task runner (|main_task_runner| in constructor). All - // calls on |delegate| are done on the main task runner. - void AddDelegate(AecDumpMessageFilter::AecDumpDelegate* delegate); - - // Removes a delegate. Must be called on the main task runner - // (|main_task_runner| in constructor). - void RemoveDelegate(AecDumpMessageFilter::AecDumpDelegate* delegate); - - // IO task runner associated with this message filter. - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner() const { - return io_task_runner_; - } - - protected: - ~AecDumpMessageFilter() override; - - private: - // Sends an IPC message using |sender_|. - void Send(IPC::Message* message); - - // Registers a consumer of AEC dump in the browser process. This consumer will - // get a file handle when the AEC dump is enabled and a notification when it - // is disabled. - void RegisterAecDumpConsumer(int id); - - // Unregisters a consumer of AEC dump in the browser process. - void UnregisterAecDumpConsumer(int id); - - // IPC::MessageFilter override. Called on |io_task_runner|. - bool OnMessageReceived(const IPC::Message& message) override; - void OnFilterAdded(IPC::Channel* channel) override; - void OnFilterRemoved() override; - void OnChannelClosing() override; - - // Accessed on |io_task_runner_|. - void OnEnableAecDump(int id, IPC::PlatformFileForTransit file_handle); - void OnDisableAecDump(); - - // Accessed on |main_task_runner_|. - void DoEnableAecDump(int id, IPC::PlatformFileForTransit file_handle); - void DoDisableAecDump(); - void DoChannelClosingOnDelegates(); - int GetIdForDelegate(AecDumpMessageFilter::AecDumpDelegate* delegate); - - // Accessed on |io_task_runner_|. - IPC::Sender* sender_; - - // The delgates for this filter. Must only be accessed on - // |main_task_runner_|. - using DelegateMap = std::map<int, AecDumpMessageFilter::AecDumpDelegate*>; - DelegateMap delegates_; - - // Counter for generating unique IDs to delegates. Accessed on - // |main_task_runner_|. - int delegate_id_counter_; - - // Task runner which IPC calls are executed. - const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; - - // Main task runner. - const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; - - // The singleton instance for this filter. - static AecDumpMessageFilter* g_filter; - - DISALLOW_COPY_AND_ASSIGN(AecDumpMessageFilter); -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_STREAM_AEC_DUMP_MESSAGE_FILTER_H_
diff --git a/content/renderer/media/stream/audio_service_audio_processor_proxy.cc b/content/renderer/media/stream/audio_service_audio_processor_proxy.cc index dd66e79..a17ed83 100644 --- a/content/renderer/media/stream/audio_service_audio_processor_proxy.cc +++ b/content/renderer/media/stream/audio_service_audio_processor_proxy.cc
@@ -31,7 +31,6 @@ scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner) : main_thread_runner_(std::move(main_thread_task_runner)), target_stats_interval_(kMaxStatsInterval), - aec_dump_message_filter_(AecDumpMessageFilter::Get()), weak_ptr_factory_(this) { DCHECK(main_thread_runner_->BelongsToCurrentThread()); } @@ -44,10 +43,7 @@ void AudioServiceAudioProcessorProxy::Stop() { DCHECK(main_thread_runner_->BelongsToCurrentThread()); - if (aec_dump_message_filter_.get()) { - aec_dump_message_filter_->RemoveDelegate(this); - aec_dump_message_filter_ = nullptr; - } + aec_dump_agent_impl_.reset(); if (processor_controls_) { processor_controls_->StopEchoCancellationDump(); @@ -57,33 +53,25 @@ stats_update_timer_.Stop(); } -void AudioServiceAudioProcessorProxy::OnAecDumpFile( - const IPC::PlatformFileForTransit& file_handle) { +void AudioServiceAudioProcessorProxy::OnStartDump(base::File dump_file) { DCHECK(main_thread_runner_->BelongsToCurrentThread()); - base::File file = IPC::PlatformFileForTransitToFile(file_handle); - DCHECK(file.IsValid()); + DCHECK(dump_file.IsValid()); if (processor_controls_) { - processor_controls_->StartEchoCancellationDump(std::move(file)); + processor_controls_->StartEchoCancellationDump(std::move(dump_file)); } else { // Post the file close to avoid blocking the main thread. base::PostTaskWithTraits( FROM_HERE, {base::TaskPriority::LOWEST, base::MayBlock()}, - base::BindOnce([](base::File) {}, std::move(file))); + base::BindOnce([](base::File) {}, std::move(dump_file))); } } -void AudioServiceAudioProcessorProxy::OnDisableAecDump() { +void AudioServiceAudioProcessorProxy::OnStopDump() { DCHECK(main_thread_runner_->BelongsToCurrentThread()); if (processor_controls_) processor_controls_->StopEchoCancellationDump(); } -void AudioServiceAudioProcessorProxy::OnIpcClosing() { - DCHECK(main_thread_runner_->BelongsToCurrentThread()); - aec_dump_message_filter_->RemoveDelegate(this); - aec_dump_message_filter_ = nullptr; -} - void AudioServiceAudioProcessorProxy::SetControls( media::AudioProcessorControls* controls) { DCHECK(main_thread_runner_->BelongsToCurrentThread()); @@ -96,11 +84,9 @@ last_stats_request_time_ = base::TimeTicks::Now(); stats_update_timer_.SetTaskRunner(main_thread_runner_); RescheduleStatsUpdateTimer(target_stats_interval_); - // In unit tests not creating a message filter, |aec_dump_message_filter_| - // will be null. We can just ignore that. Other unit tests and browser tests - // ensure that we do get the filter when we should. - if (aec_dump_message_filter_) - aec_dump_message_filter_->AddDelegate(this); + + // Can be null in unit tests. That's okay. + aec_dump_agent_impl_ = AecDumpAgentImpl::Create(this); } webrtc::AudioProcessorInterface::AudioProcessorStatistics
diff --git a/content/renderer/media/stream/audio_service_audio_processor_proxy.h b/content/renderer/media/stream/audio_service_audio_processor_proxy.h index 4fed003..2e2b5ac 100644 --- a/content/renderer/media/stream/audio_service_audio_processor_proxy.h +++ b/content/renderer/media/stream/audio_service_audio_processor_proxy.h
@@ -14,7 +14,7 @@ #include "base/threading/thread_checker.h" #include "base/timer/timer.h" #include "content/common/content_export.h" -#include "content/renderer/media/stream/aec_dump_message_filter.h" +#include "content/renderer/media/stream/aec_dump_agent_impl.h" #include "media/base/audio_processing.h" #include "media/webrtc/audio_processor_controls.h" #include "third_party/webrtc/api/media_stream_interface.h" @@ -31,7 +31,7 @@ // calculation code should be encapsulated in a class. class CONTENT_EXPORT AudioServiceAudioProcessorProxy : public webrtc::AudioProcessorInterface, - public AecDumpMessageFilter::AecDumpDelegate { + public AecDumpAgentImpl::Delegate { public: // All methods (including constructor and destructor) must be called on the // main thread except for GetStats. @@ -45,11 +45,10 @@ // This method is called on the libjingle thread. AudioProcessorStatistics GetStats(bool has_remote_tracks) override; - // AecDumpMessageFilter::AecDumpDelegate implementation. + // AecDumpAgentImpl::Delegate implementation. // Called on the main render thread. - void OnAecDumpFile(const IPC::PlatformFileForTransit& file_handle) override; - void OnDisableAecDump() override; - void OnIpcClosing() override; + void OnStartDump(base::File file) override; + void OnStopDump() override; // Set the AudioProcessorControls which to proxy to. Must only be called once // and |controls| cannot be nullptr. @@ -78,7 +77,7 @@ AudioProcessorStatistics latest_stats_ = {}; // Communication with browser for AEC dump. - scoped_refptr<AecDumpMessageFilter> aec_dump_message_filter_; + std::unique_ptr<AecDumpAgentImpl> aec_dump_agent_impl_; base::WeakPtrFactory<AudioServiceAudioProcessorProxy> weak_ptr_factory_;
diff --git a/content/renderer/media/stream/media_stream_audio_processor.cc b/content/renderer/media/stream/media_stream_audio_processor.cc index 4f99d26b..05603d0 100644 --- a/content/renderer/media/stream/media_stream_audio_processor.cc +++ b/content/renderer/media/stream/media_stream_audio_processor.cc
@@ -21,6 +21,8 @@ #include "base/optional.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" +#include "base/task/post_task.h" +#include "base/task/task_traits.h" #include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" @@ -276,19 +278,13 @@ main_thread_runner_(base::ThreadTaskRunnerHandle::Get()), audio_mirroring_(false), typing_detected_(false), - aec_dump_message_filter_(AecDumpMessageFilter::Get()), + aec_dump_agent_impl_(AecDumpAgentImpl::Create(this)), stopped_(false) { DCHECK(main_thread_runner_); DETACH_FROM_THREAD(capture_thread_checker_); DETACH_FROM_THREAD(render_thread_checker_); InitializeAudioProcessingModule(properties); - - // In unit tests not creating a message filter, |aec_dump_message_filter_| - // will be null. We can just ignore that. Other unit tests and browser tests - // ensure that we do get the filter when we should. - if (aec_dump_message_filter_.get()) - aec_dump_message_filter_->AddDelegate(this); } MediaStreamAudioProcessor::~MediaStreamAudioProcessor() { @@ -369,10 +365,7 @@ stopped_ = true; - if (aec_dump_message_filter_.get()) { - aec_dump_message_filter_->RemoveDelegate(this); - aec_dump_message_filter_ = nullptr; - } + aec_dump_agent_impl_.reset(); if (!audio_processing_.get()) return; @@ -394,12 +387,10 @@ return output_format_; } -void MediaStreamAudioProcessor::OnAecDumpFile( - const IPC::PlatformFileForTransit& file_handle) { +void MediaStreamAudioProcessor::OnStartDump(base::File dump_file) { DCHECK(main_thread_runner_->BelongsToCurrentThread()); - base::File file = IPC::PlatformFileForTransitToFile(file_handle); - DCHECK(file.IsValid()); + DCHECK(dump_file.IsValid()); if (audio_processing_) { if (!worker_queue_) { @@ -409,14 +400,17 @@ // Here tasks will be posted on the |worker_queue_|. It must be // kept alive until StopEchoCancellationDump is called or the // webrtc::AudioProcessing instance is destroyed. - blink::StartEchoCancellationDump(audio_processing_.get(), std::move(file), - worker_queue_.get()); + blink::StartEchoCancellationDump(audio_processing_.get(), + std::move(dump_file), worker_queue_.get()); } else { - file.Close(); + // Post the file close to avoid blocking the main thread. + base::PostTaskWithTraits( + FROM_HERE, {base::TaskPriority::LOWEST, base::MayBlock()}, + base::BindOnce([](base::File) {}, std::move(dump_file))); } } -void MediaStreamAudioProcessor::OnDisableAecDump() { +void MediaStreamAudioProcessor::OnStopDump() { DCHECK(main_thread_runner_->BelongsToCurrentThread()); if (audio_processing_) blink::StopEchoCancellationDump(audio_processing_.get()); @@ -426,11 +420,6 @@ worker_queue_.reset(nullptr); } -void MediaStreamAudioProcessor::OnIpcClosing() { - DCHECK(main_thread_runner_->BelongsToCurrentThread()); - aec_dump_message_filter_ = nullptr; -} - // static bool MediaStreamAudioProcessor::WouldModifyAudio( const blink::AudioProcessingProperties& properties) {
diff --git a/content/renderer/media/stream/media_stream_audio_processor.h b/content/renderer/media/stream/media_stream_audio_processor.h index dc200497..04da8552 100644 --- a/content/renderer/media/stream/media_stream_audio_processor.h +++ b/content/renderer/media/stream/media_stream_audio_processor.h
@@ -18,7 +18,7 @@ #include "base/threading/thread_checker.h" #include "base/time/time.h" #include "content/common/content_export.h" -#include "content/renderer/media/stream/aec_dump_message_filter.h" +#include "content/renderer/media/stream/aec_dump_agent_impl.h" #include "content/renderer/media/webrtc/webrtc_audio_device_impl.h" #include "media/base/audio_converter.h" #include "media/webrtc/audio_delay_stats_reporter.h" @@ -51,7 +51,7 @@ class CONTENT_EXPORT MediaStreamAudioProcessor : public WebRtcPlayoutDataSource::Sink, public AudioProcessorInterface, - public AecDumpMessageFilter::AecDumpDelegate { + public AecDumpAgentImpl::Delegate { public: // |playout_data_source| is used to register this class as a sink to the // WebRtc playout data for processing AEC. If clients do not enable AEC, @@ -105,11 +105,10 @@ // Accessor to check if the audio processing is enabled or not. bool has_audio_processing() const { return audio_processing_ != NULL; } - // AecDumpMessageFilter::AecDumpDelegate implementation. + // AecDumpAgentImpl::Delegate implementation. // Called on the main render thread. - void OnAecDumpFile(const IPC::PlatformFileForTransit& file_handle) override; - void OnDisableAecDump() override; - void OnIpcClosing() override; + void OnStartDump(base::File dump_file) override; + void OnStopDump() override; // Returns true if MediaStreamAudioProcessor would modify the audio signal, // based on |properties|. If the audio signal would not be modified, there is @@ -205,7 +204,7 @@ base::subtle::Atomic32 typing_detected_; // Communication with browser for AEC dump. - scoped_refptr<AecDumpMessageFilter> aec_dump_message_filter_; + std::unique_ptr<AecDumpAgentImpl> aec_dump_agent_impl_; // Flag to avoid executing Stop() more than once. bool stopped_;
diff --git a/content/renderer/media/stream/media_stream_audio_processor_unittest.cc b/content/renderer/media/stream/media_stream_audio_processor_unittest.cc index 764a7ea..4540641 100644 --- a/content/renderer/media/stream/media_stream_audio_processor_unittest.cc +++ b/content/renderer/media/stream/media_stream_audio_processor_unittest.cc
@@ -276,29 +276,6 @@ audio_processor->Stop(); } -// Test that if we have an AEC dump message filter created, we are getting it -// correctly in MSAP. Any IPC messages will be deleted since no sender in the -// filter will be created. -TEST_F(MediaStreamAudioProcessorTest, GetAecDumpMessageFilter) { - scoped_refptr<AecDumpMessageFilter> aec_dump_message_filter_( - new AecDumpMessageFilter( - blink::scheduler::GetSingleThreadTaskRunnerForTesting(), - blink::scheduler::GetSingleThreadTaskRunnerForTesting())); - - scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device( - new rtc::RefCountedObject<WebRtcAudioDeviceImpl>()); - blink::AudioProcessingProperties properties; - scoped_refptr<MediaStreamAudioProcessor> audio_processor( - new rtc::RefCountedObject<MediaStreamAudioProcessor>( - properties, webrtc_audio_device.get())); - - EXPECT_TRUE(audio_processor->aec_dump_message_filter_.get()); - - // Stop |audio_processor| so that it removes itself from - // |webrtc_audio_device| and clears its pointer to it. - audio_processor->Stop(); -} - TEST_F(MediaStreamAudioProcessorTest, StartStopAecDump) { scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device( new rtc::RefCountedObject<WebRtcAudioDeviceImpl>()); @@ -315,13 +292,13 @@ properties, webrtc_audio_device.get())); // Start and stop recording. - audio_processor->OnAecDumpFile(IPC::TakePlatformFileForTransit(base::File( - temp_file_path, base::File::FLAG_WRITE | base::File::FLAG_OPEN))); - audio_processor->OnDisableAecDump(); + audio_processor->OnStartDump(base::File( + temp_file_path, base::File::FLAG_WRITE | base::File::FLAG_OPEN)); + audio_processor->OnStopDump(); // Start and wait for d-tor. - audio_processor->OnAecDumpFile(IPC::TakePlatformFileForTransit(base::File( - temp_file_path, base::File::FLAG_WRITE | base::File::FLAG_OPEN))); + audio_processor->OnStartDump(base::File( + temp_file_path, base::File::FLAG_WRITE | base::File::FLAG_OPEN)); } // Check that dump file is non-empty after audio processor has been
diff --git a/content/renderer/media/stream/media_stream_constraints_util_audio.cc b/content/renderer/media/stream/media_stream_constraints_util_audio.cc index 9b6072fec..eb37d51 100644 --- a/content/renderer/media/stream/media_stream_constraints_util_audio.cc +++ b/content/renderer/media/stream/media_stream_constraints_util_audio.cc
@@ -338,8 +338,6 @@ constraint_set.echo_cancellation); BoolSet goog_ec_set = blink::media_constraints::BoolSetFromConstraint( constraint_set.goog_echo_cancellation); - StringSet ec_type_set = blink::media_constraints::StringSetFromConstraint( - constraint_set.echo_cancellation_type); // Apply echoCancellation constraint. ec_allowed_values_ = ec_allowed_values_.Intersection(ec_set); @@ -350,11 +348,9 @@ auto ec_intersection = ec_allowed_values_.Intersection(goog_ec_set); if (ec_intersection.IsEmpty()) return constraint_set.echo_cancellation.GetName(); - // Apply echoCancellationType constraint. + // Translate the boolean values into EC modes. ec_mode_allowed_values_ = ec_mode_allowed_values_.Intersection( - ToEchoCancellationTypes(ec_intersection, ec_type_set)); - if (ec_mode_allowed_values_.IsEmpty()) - return constraint_set.echo_cancellation_type.GetName(); + ToEchoCancellationTypes(ec_intersection)); // Finally, if this container is empty, fail due to contradiction of the // resulting allowed values for goog_ec, ec, and/or ec_type. @@ -364,8 +360,8 @@ std::tuple<Score, EchoCancellationType> SelectSettingsAndScore( const ConstraintSet& constraint_set) const { EchoCancellationType selected_ec_mode = SelectBestEcMode(constraint_set); - double fitness = Fitness(selected_ec_mode, constraint_set.echo_cancellation, - constraint_set.echo_cancellation_type); + double fitness = + Fitness(selected_ec_mode, constraint_set.echo_cancellation); Score score(fitness); score.set_ec_mode_score(GetEcModeScore(selected_ec_mode)); return std::make_tuple(score, selected_ec_mode); @@ -418,53 +414,14 @@ } } - static base::Optional<EchoCancellationType> ToEchoCancellationType( - const char* blink_type) { - std::string blink_type_str = std::string(blink_type); - if (blink_type_str == blink::kEchoCancellationTypeBrowser || - blink_type_str == blink::kEchoCancellationTypeAec3) { - return EchoCancellationType::kEchoCancellationAec3; - } - - if (blink_type_str == blink::kEchoCancellationTypeSystem) - return EchoCancellationType::kEchoCancellationSystem; - - return base::nullopt; - } - - static std::vector<EchoCancellationType> ToEchoCancellationTypes( - const StringSet& types_set) { - std::vector<EchoCancellationType> methods; - const char* blink_types[] = {blink::kEchoCancellationTypeBrowser, - blink::kEchoCancellationTypeAec3, - blink::kEchoCancellationTypeSystem}; - - for (const char* blink_type : blink_types) { - if (types_set.Contains(blink_type)) { - base::Optional<EchoCancellationType> converted_type = - ToEchoCancellationType(blink_type); - DCHECK(converted_type); - methods.push_back(*converted_type); - } - } - - return methods; - } - - static EchoCancellationTypeSet ToEchoCancellationTypes( - const BoolSet ec_set, - const StringSet ec_type_set) { + static EchoCancellationTypeSet ToEchoCancellationTypes(const BoolSet ec_set) { std::vector<EchoCancellationType> types; - if (ec_set.Contains(false) && ec_type_set.is_universal()) + if (ec_set.Contains(false)) types.push_back(EchoCancellationType::kEchoCancellationDisabled); if (ec_set.Contains(true)) { - if (ec_type_set.Contains(blink::kEchoCancellationTypeBrowser) || - ec_type_set.Contains(blink::kEchoCancellationTypeAec3)) { types.push_back(EchoCancellationType::kEchoCancellationAec3); - } - if (ec_type_set.Contains(blink::kEchoCancellationTypeSystem)) types.push_back(EchoCancellationType::kEchoCancellationSystem); } @@ -487,15 +444,6 @@ return EchoCancellationType::kEchoCancellationDisabled; } - if (constraint_set.echo_cancellation_type.HasIdeal()) { - for (const auto& ideal : constraint_set.echo_cancellation_type.Ideal()) { - base::Optional<EchoCancellationType> candidate = - ToEchoCancellationType(ideal.Utf8().c_str()); - if (candidate && ec_mode_allowed_values_.Contains(*candidate)) - return *candidate; - } - } - // If no ideal could be selected and the set contains only one value, pick // that one. if (ec_mode_allowed_values_.elements().size() == 1) @@ -511,52 +459,24 @@ return EchoCancellationType::kEchoCancellationSystem; } - // If the previous tie breakers were not enough to determine the selected - // mode, the resolution is based on pre-defined priorities assigned to the - // available echo cancellation modes. - DCHECK(ec_mode_allowed_values_.elements().size() > 1); - auto best_ec_type = ec_mode_allowed_values_.FirstElement(); - auto best_score = GetEcModeScore(best_ec_type); - for (const auto& type : ec_mode_allowed_values_.elements()) { - auto score = GetEcModeScore(type); - if (score > best_score) { - best_score = score; - best_ec_type = type; - } - } - return best_ec_type; + DCHECK(ec_mode_allowed_values_.Contains( + EchoCancellationType::kEchoCancellationAec3)); + return EchoCancellationType::kEchoCancellationAec3; } // This function computes the fitness score of the given |ec_mode|. The - // fitness is determined by the ideal values of two constraints, namely - // |ec_type_constraint| and |ec_constraint|. For each constraint, a score of - // 0 is assigned if the ideal constraint cannot be satisfied, or 1 otherwise. - // If |ec_mode| satisfies both constraints, the fitness score results in a - // value of 2; if only one is satisfied, the result will be 1, and 0 when none - // of the ideal values are satisfied. + // fitness is determined by the ideal values of |ec_constraint|. If |ec_mode| + // satisfies the constraint, the fitness score results in a value of 1, and 0 + // otherwise. If no ideal value is specified, the fitness is 1. double Fitness(const EchoCancellationType& ec_mode, - const BooleanConstraint& ec_constraint, - const StringConstraint& ec_type_constraint) const { - double ec_fitness = - ec_constraint.HasIdeal() - ? ((ec_constraint.Ideal() && - ec_mode != EchoCancellationType::kEchoCancellationDisabled) || - (!ec_constraint.Ideal() && - ec_mode == EchoCancellationType::kEchoCancellationDisabled)) - : 1.0; - double ec_type_fitness = 0.0; - if (ec_type_constraint.HasIdeal()) { - for (auto ideal : ec_type_constraint.Ideal()) { - base::Optional<EchoCancellationType> ideal_type = - ToEchoCancellationType(ideal.Utf8().c_str()); - if (ideal_type && *ideal_type == ec_mode) - ec_type_fitness = 1.0; - } - } else { - ec_type_fitness = 1.0; - } - - return ec_fitness + ec_type_fitness; + const BooleanConstraint& ec_constraint) const { + return ec_constraint.HasIdeal() + ? ((ec_constraint.Ideal() && + ec_mode != + EchoCancellationType::kEchoCancellationDisabled) || + (!ec_constraint.Ideal() && + ec_mode == EchoCancellationType::kEchoCancellationDisabled)) + : 1.0; } bool EchoCancellationModeContains(bool ec) const {
diff --git a/content/renderer/media/stream/media_stream_constraints_util_audio_unittest.cc b/content/renderer/media/stream/media_stream_constraints_util_audio_unittest.cc index f763d0a..16c7d62 100644 --- a/content/renderer/media/stream/media_stream_constraints_util_audio_unittest.cc +++ b/content/renderer/media/stream/media_stream_constraints_util_audio_unittest.cc
@@ -45,10 +45,6 @@ &blink::BooleanConstraint::SetExact, &blink::BooleanConstraint::SetIdeal, }; -const StringSetFunction kStringSetFunctions[] = { - &blink::StringConstraint::SetExact, &blink::StringConstraint::SetIdeal, -}; - const MockFactoryAccessor kFactoryAccessors[] = { &MockConstraintFactory::basic, &MockConstraintFactory::AddAdvanced}; @@ -313,56 +309,6 @@ CheckDeviceDefaults(result); } - // Assumes that echoCancellation is set to true as a basic, exact constraint. - void CheckAudioProcessingPropertiesForExactEchoCancellationType( - const blink::WebString& echo_cancellation_type_constraint, - const AudioCaptureSettings& result) { - const AudioProcessingProperties& properties = - result.audio_processing_properties(); - - // With device capture, the echo_cancellation constraint - // enables/disables all audio processing by default. - // With content capture, the echo_cancellation constraint controls - // only the echo_cancellation properties. The other audio processing - // properties default to false. - const EchoCancellationType expected_ec_type = - GetEchoCancellationTypeFromConstraintString( - echo_cancellation_type_constraint); - if (!IsDeviceCapture()) { - ASSERT_NE(EchoCancellationType::kEchoCancellationSystem, - expected_ec_type); - } - EXPECT_EQ(expected_ec_type, properties.echo_cancellation_type); - - const bool enable_webrtc_audio_processing = IsDeviceCapture(); - EXPECT_EQ(enable_webrtc_audio_processing, - properties.goog_auto_gain_control); - CheckGoogExperimentalEchoCancellationDefault( - properties, enable_webrtc_audio_processing); - EXPECT_EQ(enable_webrtc_audio_processing, - properties.goog_noise_suppression); - EXPECT_EQ(enable_webrtc_audio_processing, - properties.goog_experimental_noise_suppression); - EXPECT_EQ(enable_webrtc_audio_processing, properties.goog_highpass_filter); - EXPECT_EQ(enable_webrtc_audio_processing, - properties.goog_experimental_auto_gain_control); - - // The following are not audio processing. - EXPECT_FALSE(properties.goog_audio_mirroring); - EXPECT_EQ(GetMediaStreamSource() != blink::kMediaStreamSourceDesktop, - result.disable_local_echo()); - EXPECT_FALSE(result.render_to_associated_sink()); - if (IsDeviceCapture()) { - CheckDevice( - expected_ec_type == EchoCancellationType::kEchoCancellationSystem - ? *system_echo_canceller_device_ - : *default_device_, - result); - } else { - EXPECT_TRUE(result.device_id().empty()); - } - } - void CheckAudioProcessingPropertiesForIdealEchoCancellationType( const AudioCaptureSettings& result) { const AudioProcessingProperties& properties = @@ -1454,193 +1400,6 @@ } } -// Tests the echoCancellationType constraint without constraining to a device -// with system echo cancellation. Tested as basic exact constraints. -TEST_P(MediaStreamConstraintsUtilAudioTest, EchoCancellationTypeExact) { - for (blink::WebString value : kEchoCancellationTypeValues) { - ResetFactory(); - constraint_factory_.basic().echo_cancellation.SetExact(true); - constraint_factory_.basic().echo_cancellation_type.SetExact(value); - auto result = SelectSettings(); - // If content capture and EC type "system", we expect failure. - if (!IsDeviceCapture() && value == kEchoCancellationTypeValues[2]) { - EXPECT_FALSE(result.HasValue()); - EXPECT_EQ(result.failed_constraint_name(), - constraint_factory_.basic().echo_cancellation_type.GetName()); - continue; - } - ASSERT_TRUE(result.HasValue()); - - CheckAudioProcessingPropertiesForExactEchoCancellationType(value, result); - } -} - -// Like the test above, but changes the device with system echo cancellation -// support to only support experimental system echo cancellation. It should -// still be picked if requested. -TEST_P(MediaStreamConstraintsUtilAudioTest, - EchoCancellationTypeExact_Experimental) { - if (!IsDeviceCapture()) - return; - - // Replace the device with one that only supports experimental system echo - // cancellation. - MakeSystemEchoCancellerDeviceExperimental(); - - for (blink::WebString value : kEchoCancellationTypeValues) { - ResetFactory(); - constraint_factory_.basic().echo_cancellation.SetExact(true); - constraint_factory_.basic().echo_cancellation_type.SetExact(value); - auto result = SelectSettings(); - ASSERT_TRUE(result.HasValue()); - CheckAudioProcessingPropertiesForExactEchoCancellationType(value, result); - } -} - -// Tests the echoCancellationType constraint without constraining to a device -// with system echo cancellation. Tested as basic ideal constraints. -TEST_P(MediaStreamConstraintsUtilAudioTest, EchoCancellationTypeIdeal) { - // With content capture, there is no system echo cancellation, so - // nothing to test. - if (!IsDeviceCapture()) - return; - - constraint_factory_.basic().echo_cancellation.SetExact(true); - constraint_factory_.basic().echo_cancellation_type.SetIdeal( - kEchoCancellationTypeValues[2]); - auto result = SelectSettings(); - ASSERT_TRUE(result.HasValue()); - CheckAudioProcessingPropertiesForIdealEchoCancellationType(result); -} - -// Like the test above, but only having a device with experimental system echo -// cancellation available. -TEST_P(MediaStreamConstraintsUtilAudioTest, - EchoCancellationTypeIdeal_Experimental) { - // With content capture, there is no system echo cancellation, so - // nothing to test. - if (!IsDeviceCapture()) - return; - - // Replace the device with one that only supports experimental system echo - // cancellation. - MakeSystemEchoCancellerDeviceExperimental(); - - constraint_factory_.basic().echo_cancellation.SetExact(true); - constraint_factory_.basic().echo_cancellation_type.SetIdeal( - kEchoCancellationTypeValues[2]); - auto result = SelectSettings(); - ASSERT_TRUE(result.HasValue()); - CheckAudioProcessingPropertiesForIdealEchoCancellationType(result); -} - -// Tests the echoCancellationType constraint with constraining to a device with -// experimental system echo cancellation. -TEST_P(MediaStreamConstraintsUtilAudioTest, - EchoCancellationTypeWithExpSystemDeviceConstraint) { - // With content capture, there is no system echo cancellation, so - // nothing to test. - if (!IsDeviceCapture()) - return; - - MakeSystemEchoCancellerDeviceExperimental(); - - // Include leaving the echoCancellationType constraint unset in the tests. - // It should then behave as before the constraint was introduced. - auto echo_cancellation_types_and_unset = kEchoCancellationTypeValues; - echo_cancellation_types_and_unset.push_back(blink::WebString()); - - for (auto set_function : kStringSetFunctions) { - for (auto accessor : kFactoryAccessors) { - // Ideal advanced is ignored by the SelectSettings algorithm. - // Using array elements instead of pointer values due to the comparison - // failing on some build configurations. - if (set_function == kStringSetFunctions[1] && - accessor == kFactoryAccessors[1]) { - continue; - } - for (blink::WebString ec_type_value : echo_cancellation_types_and_unset) { - for (bool ec_value : kBoolValues) { - ResetFactory(); - constraint_factory_.basic().device_id.SetExact( - blink::WebString::FromASCII( - system_echo_canceller_device_->DeviceID())); - constraint_factory_.basic().echo_cancellation.SetExact(ec_value); - if (!ec_type_value.IsNull()) - ((constraint_factory_.*accessor)().echo_cancellation_type.* - set_function)(ec_type_value); - - // We should get a result if echo cancellation is enabled or if it's - // disabled and we set the type as an advanced or ideal constraint, or - // we've left the constraint unset. - auto result = SelectSettings(); - const bool advanced_constraint = accessor == kFactoryAccessors[1]; - const bool ideal_constraint = set_function == kStringSetFunctions[1]; - const bool should_have_result = ec_value || advanced_constraint || - ideal_constraint || - ec_type_value.IsNull(); - EXPECT_EQ(should_have_result, result.HasValue()); - if (!should_have_result) - continue; - - const AudioProcessingProperties& properties = - result.audio_processing_properties(); - - // With experimental system echo cancellation (echo canceller type - // "system"), the echo_cancellation constraint enables/disables all - // audio processing by default, WebRTC echo cancellation is always - // disabled, and experimental system echo cancellation is disabled - // if the echo_cancellation constraint is false. - if (ec_value) { - const EchoCancellationType expected_echo_cancellation_type = - ec_type_value == blink::WebString() - ? EchoCancellationType::kEchoCancellationAec3 - : GetEchoCancellationTypeFromConstraintString( - ec_type_value); - EXPECT_EQ(expected_echo_cancellation_type, - properties.echo_cancellation_type); - } else { - EXPECT_EQ(EchoCancellationType::kEchoCancellationDisabled, - properties.echo_cancellation_type); - } - EXPECT_EQ(ec_value, properties.goog_auto_gain_control); - CheckGoogExperimentalEchoCancellationDefault(properties, ec_value); - EXPECT_EQ(ec_value, properties.goog_noise_suppression); - EXPECT_EQ(ec_value, properties.goog_experimental_noise_suppression); - EXPECT_EQ(ec_value, properties.goog_highpass_filter); - EXPECT_EQ(ec_value, properties.goog_experimental_auto_gain_control); - - // The following are not audio processing. - EXPECT_FALSE(properties.goog_audio_mirroring); - EXPECT_EQ(GetMediaStreamSource() != blink::kMediaStreamSourceDesktop, - result.disable_local_echo()); - EXPECT_FALSE(result.render_to_associated_sink()); - CheckDevice(*system_echo_canceller_device_, result); - } - } - } - } -} - -// Tests the echoCancellationType constraint with constraining to a device -// without experimental system echo cancellation, which should fail. -TEST_P(MediaStreamConstraintsUtilAudioTest, - EchoCancellationTypeWithWebRtcDeviceConstraint) { - if (!IsDeviceCapture()) - return; - - constraint_factory_.basic().device_id.SetExact( - blink::WebString::FromASCII(default_device_->DeviceID())); - constraint_factory_.basic().echo_cancellation.SetExact(true); - constraint_factory_.basic().echo_cancellation_type.SetExact( - kEchoCancellationTypeValues[2]); - - auto result = SelectSettings(); - EXPECT_FALSE(result.HasValue()); - EXPECT_EQ(result.failed_constraint_name(), - constraint_factory_.basic().device_id.GetName()); -} - // Test that having differing mandatory values for echoCancellation and // googEchoCancellation fails. TEST_P(MediaStreamConstraintsUtilAudioTest, ContradictoryEchoCancellation) { @@ -1845,32 +1604,6 @@ } } -// Test functionality to support applyConstraints() for echo cancellation type -// for tracks attached to sources that have no audio processing. -TEST_P(MediaStreamConstraintsUtilAudioTest, - EchoCancellationTypeWithSourceWithNoAudioProcessing) { - for (blink::WebString value : kEchoCancellationTypeValues) { - std::unique_ptr<LocalMediaStreamAudioSource> source = - GetLocalMediaStreamAudioSource(false /* enable_system_echo_canceller */, - false /* disable_local_echo */, - false /* render_to_associated_sink */); - - // No echo cancellation is available so we expect failure. - constraint_factory_.Reset(); - constraint_factory_.basic().echo_cancellation_type.SetExact(value); - auto result = SelectSettingsAudioCapture( - source.get(), constraint_factory_.CreateWebMediaConstraints()); - EXPECT_FALSE(result.HasValue()); - - // Setting just ideal values should always succeed. - constraint_factory_.Reset(); - constraint_factory_.basic().echo_cancellation_type.SetIdeal(value); - result = SelectSettingsAudioCapture( - source.get(), constraint_factory_.CreateWebMediaConstraints()); - EXPECT_TRUE(result.HasValue()); - } -} - // Test functionality to support applyConstraints() for tracks attached to // sources that have audio processing. TEST_P(MediaStreamConstraintsUtilAudioTest, SourceWithAudioProcessing) { @@ -2048,52 +1781,6 @@ } } -// Test functionality to support applyConstraints() for echo cancellation type -// for tracks attached to sources that have audio processing. -TEST_P(MediaStreamConstraintsUtilAudioTest, - EchoCancellationTypeWithSourceWithAudioProcessing) { - // Processed audio sources are supported only for device capture. - if (!IsDeviceCapture()) - return; - - const EchoCancellationType kEchoCancellationTypes[] = { - EchoCancellationType::kEchoCancellationDisabled, - EchoCancellationType::kEchoCancellationAec3, - EchoCancellationType::kEchoCancellationSystem}; - - for (EchoCancellationType ec_type : kEchoCancellationTypes) { - AudioProcessingProperties properties; - properties.DisableDefaultProperties(); - properties.echo_cancellation_type = ec_type; - - std::unique_ptr<ProcessedLocalAudioSource> source = - GetProcessedLocalAudioSource( - properties, false /* disable_local_echo */, - false /* render_to_associated_sink */, - ec_type == EchoCancellationType::kEchoCancellationSystem - ? media::AudioParameters::PlatformEffectsMask:: - EXPERIMENTAL_ECHO_CANCELLER - : media::AudioParameters::PlatformEffectsMask::NO_EFFECTS); - - for (blink::WebString value : kEchoCancellationTypeValues) { - constraint_factory_.Reset(); - constraint_factory_.basic().echo_cancellation_type.SetExact(value); - auto result = SelectSettingsAudioCapture( - source.get(), constraint_factory_.CreateWebMediaConstraints()); - const bool should_have_result_value = - ec_type == GetEchoCancellationTypeFromConstraintString(value); - EXPECT_EQ(should_have_result_value, result.HasValue()); - - // Setting just ideal values should always succeed. - constraint_factory_.Reset(); - constraint_factory_.basic().echo_cancellation_type.SetIdeal(value); - result = SelectSettingsAudioCapture( - source.get(), constraint_factory_.CreateWebMediaConstraints()); - EXPECT_TRUE(result.HasValue()); - } - } -} - TEST_P(MediaStreamConstraintsUtilAudioTest, UsedAndUnusedSources) { // The distinction of used and unused sources is relevant only for device // capture.
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 476c27d..a1ceab0 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -89,7 +89,6 @@ #include "content/renderer/media/audio/audio_renderer_mixer_manager.h" #include "content/renderer/media/gpu/gpu_video_accelerator_factories_impl.h" #include "content/renderer/media/render_media_client.h" -#include "content/renderer/media/stream/aec_dump_message_filter.h" #include "content/renderer/media/stream/media_stream_center.h" #include "content/renderer/media/video_capture/video_capture_impl_manager.h" #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" @@ -756,11 +755,6 @@ peer_connection_factory_.reset( new PeerConnectionDependencyFactory(p2p_socket_dispatcher_.get())); - aec_dump_message_filter_ = - new AecDumpMessageFilter(GetIOTaskRunner(), main_thread_runner()); - - AddFilter(aec_dump_message_filter_.get()); - unfreezable_message_filter_ = new UnfreezableMessageFilter(this); AddFilter(unfreezable_message_filter_.get());
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h index 90c62a7..649f7a6 100644 --- a/content/renderer/render_thread_impl.h +++ b/content/renderer/render_thread_impl.h
@@ -112,7 +112,6 @@ } // namespace viz namespace content { -class AecDumpMessageFilter; class AudioRendererMixerManager; class BrowserPluginManager; class CategorizedWorkerPool; @@ -593,12 +592,6 @@ // Dispatches all P2P sockets. scoped_refptr<P2PSocketDispatcher> p2p_socket_dispatcher_; - // Used for communicating registering AEC dump consumers with the browser and - // receving AEC dump file handles when AEC dump is enabled. An AEC dump is - // diagnostic audio data for WebRTC stored locally when enabled by the user in - // chrome://webrtc-internals. - scoped_refptr<AecDumpMessageFilter> aec_dump_message_filter_; - // Filter out unfreezable messages and pass it to unfreezable task runners. scoped_refptr<UnfreezableMessageFilter> unfreezable_message_filter_;
diff --git a/content/shell/test_runner/web_ax_object_proxy.cc b/content/shell/test_runner/web_ax_object_proxy.cc index e9ea1df..86e84f79 100644 --- a/content/shell/test_runner/web_ax_object_proxy.cc +++ b/content/shell/test_runner/web_ax_object_proxy.cc
@@ -696,6 +696,7 @@ .SetProperty("hasPopup", &WebAXObjectProxy::HasPopup) .SetProperty("isValid", &WebAXObjectProxy::IsValid) .SetProperty("isReadOnly", &WebAXObjectProxy::IsReadOnly) + .SetProperty("isIgnored", &WebAXObjectProxy::IsIgnored) .SetProperty("restriction", &WebAXObjectProxy::Restriction) .SetProperty("activeDescendant", &WebAXObjectProxy::ActiveDescendant) .SetProperty("backgroundColor", &WebAXObjectProxy::BackgroundColor) @@ -1216,6 +1217,11 @@ blink::kWebAXRestrictionReadOnly; } +bool WebAXObjectProxy::IsIgnored() { + accessibility_object_.UpdateLayoutAndCheckValidity(); + return accessibility_object_.AccessibilityIsIgnored(); +} + v8::Local<v8::Object> WebAXObjectProxy::ActiveDescendant() { accessibility_object_.UpdateLayoutAndCheckValidity(); blink::WebAXObject element = accessibility_object_.AriaActiveDescendant();
diff --git a/content/shell/test_runner/web_ax_object_proxy.h b/content/shell/test_runner/web_ax_object_proxy.h index 3348c58..458f635 100644 --- a/content/shell/test_runner/web_ax_object_proxy.h +++ b/content/shell/test_runner/web_ax_object_proxy.h
@@ -116,6 +116,7 @@ bool IsCollapsed(); bool IsValid(); bool IsReadOnly(); + bool IsIgnored(); std::string Restriction(); v8::Local<v8::Object> ActiveDescendant(); unsigned int BackgroundColor();
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 4dfad8f..859e25b 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -2233,6 +2233,7 @@ } else { # Non-Android. sources += [ + "../browser/devtools/protocol/webauthn_handler_unittest.cc", "../browser/host_zoom_map_impl_unittest.cc", "../browser/serial/serial_unittest.cc", "../browser/speech/chunked_byte_buffer_unittest.cc",
diff --git a/content/test/data/accessibility/aom/aom-busy-expected-blink.txt b/content/test/data/accessibility/aom/aom-busy-expected-blink.txt index 4cbc992..dbc2bc6 100644 --- a/content/test/data/accessibility/aom/aom-busy-expected-blink.txt +++ b/content/test/data/accessibility/aom/aom-busy-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++genericContainer -++genericContainer busy=true -++genericContainer busy=true +++genericContainer ignored +++++genericContainer +++++genericContainer busy=true +++++genericContainer busy=true
diff --git a/content/test/data/accessibility/aom/aom-checked-expected-blink.txt b/content/test/data/accessibility/aom/aom-checked-expected-blink.txt index 3b89931..2e10ecb 100644 --- a/content/test/data/accessibility/aom/aom-checked-expected-blink.txt +++ b/content/test/data/accessibility/aom/aom-checked-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++checkBox checkedState=false -++checkBox checkedState=false -++checkBox checkedState=false -++checkBox checkedState=false +++genericContainer ignored +++++checkBox checkedState=false +++++checkBox checkedState=false +++++checkBox checkedState=false +++++checkBox checkedState=false
diff --git a/content/test/data/accessibility/aria/aria-activedescendant-expected-blink.txt b/content/test/data/accessibility/aria/aria-activedescendant-expected-blink.txt index f95b78d..7a24614 100644 --- a/content/test/data/accessibility/aria/aria-activedescendant-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-activedescendant-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++menu name='parent node' activedescendantId=menuItemCheckBox -++++menuItem name='Inactive descendant' -++++menuItemCheckBox name='Active descendant' checkedState=false -++++menuItemRadio name='Inactive descendant #2' checkedState=false +++genericContainer ignored +++++menu name='parent node' activedescendantId=menuItemCheckBox +++++++menuItem name='Inactive descendant' +++++++menuItemCheckBox name='Active descendant' checkedState=false +++++++menuItemRadio name='Inactive descendant #2' checkedState=false
diff --git a/content/test/data/accessibility/aria/aria-alert-expected-blink.txt b/content/test/data/accessibility/aria/aria-alert-expected-blink.txt index 04322469..ee3f576 100644 --- a/content/test/data/accessibility/aria/aria-alert-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-alert-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++alert liveStatus='assertive' containerLiveAtomic=true liveAtomic=true -++++staticText name='This test is for aria role="alert"' containerLiveAtomic=true -++++++inlineTextBox name='This test is for aria role="alert"' \ No newline at end of file +++genericContainer ignored +++++alert liveStatus='assertive' containerLiveAtomic=true liveAtomic=true +++++++staticText name='This test is for aria role="alert"' containerLiveAtomic=true +++++++++inlineTextBox name='This test is for aria role="alert"'
diff --git a/content/test/data/accessibility/aria/aria-alertdialog-expected-blink.txt b/content/test/data/accessibility/aria/aria-alertdialog-expected-blink.txt index ee6a33a..8ec05de 100644 --- a/content/test/data/accessibility/aria/aria-alertdialog-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-alertdialog-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++alertDialog +++genericContainer ignored +++++alertDialog
diff --git a/content/test/data/accessibility/aria/aria-any-unignored-expected-blink.txt b/content/test/data/accessibility/aria/aria-any-unignored-expected-blink.txt index 7408006..b5a7908c 100644 --- a/content/test/data/accessibility/aria/aria-any-unignored-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-any-unignored-expected-blink.txt
@@ -1,12 +1,13 @@ rootWebArea -++paragraph -++++staticText name='Hi ' -++++++inlineTextBox name='Hi ' -++++staticText name='ignored span' -++++++inlineTextBox name='ignored span' -++paragraph -++++staticText name='Hi ' -++++++inlineTextBox name='Hi ' -++++genericContainer -++++++staticText name='unignored span' -++++++++inlineTextBox name='unignored span' +++genericContainer ignored +++++paragraph +++++++staticText name='Hi ' +++++++++inlineTextBox name='Hi ' +++++++staticText name='ignored span' +++++++++inlineTextBox name='ignored span' +++++paragraph +++++++staticText name='Hi ' +++++++++inlineTextBox name='Hi ' +++++++genericContainer +++++++++staticText name='unignored span' +++++++++++inlineTextBox name='unignored span'
diff --git a/content/test/data/accessibility/aria/aria-article-expected-blink.txt b/content/test/data/accessibility/aria/aria-article-expected-blink.txt index fabb32140..65b1930 100644 --- a/content/test/data/accessibility/aria/aria-article-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-article-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++article -++++staticText name='This is an ARIA article.' -++++++inlineTextBox name='This is an ARIA article.' \ No newline at end of file +++genericContainer ignored +++++article +++++++staticText name='This is an ARIA article.' +++++++++inlineTextBox name='This is an ARIA article.'
diff --git a/content/test/data/accessibility/aria/aria-article-posinset-setsize-expected-blink.txt b/content/test/data/accessibility/aria/aria-article-posinset-setsize-expected-blink.txt index 51e4643..789b1d6 100644 --- a/content/test/data/accessibility/aria/aria-article-posinset-setsize-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-article-posinset-setsize-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++article setSize=0 posInSet=0 -++++staticText name='ARIA Articles outside of feeds should have PosInSet and SetSize of 0.' -++++++inlineTextBox name='ARIA Articles outside of feeds should have PosInSet and SetSize of 0.' -++feed setSize=5 -++++article setSize=5 posInSet=4 -++++article setSize=5 posInSet=5 +++genericContainer ignored +++++article setSize=0 posInSet=0 +++++++staticText name='ARIA Articles outside of feeds should have PosInSet and SetSize of 0.' +++++++++inlineTextBox name='ARIA Articles outside of feeds should have PosInSet and SetSize of 0.' +++++feed setSize=5 +++++++article setSize=5 posInSet=4 +++++++article setSize=5 posInSet=5
diff --git a/content/test/data/accessibility/aria/aria-atomic-expected-blink.txt b/content/test/data/accessibility/aria/aria-atomic-expected-blink.txt index c93963b..d817194 100644 --- a/content/test/data/accessibility/aria/aria-atomic-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-atomic-expected-blink.txt
@@ -1,13 +1,14 @@ rootWebArea -++log -++++staticText name='This test is for aria-atomic="false"' -++++++inlineTextBox name='This test is for aria-atomic="false"' -++log containerLiveAtomic=true liveAtomic=true -++++staticText name='This test is for aria-atomic="true"' containerLiveAtomic=true -++++++inlineTextBox name='This test is for aria-atomic="true"' -++alert containerLiveAtomic=true liveAtomic=true -++++staticText name='This test is for alert.' containerLiveAtomic=true -++++++inlineTextBox name='This test is for alert.' -++status containerLiveAtomic=true liveAtomic=true -++++staticText name='This test is for status.' containerLiveAtomic=true -++++++inlineTextBox name='This test is for status.' \ No newline at end of file +++genericContainer ignored +++++log +++++++staticText name='This test is for aria-atomic="false"' +++++++++inlineTextBox name='This test is for aria-atomic="false"' +++++log containerLiveAtomic=true liveAtomic=true +++++++staticText name='This test is for aria-atomic="true"' containerLiveAtomic=true +++++++++inlineTextBox name='This test is for aria-atomic="true"' +++++alert containerLiveAtomic=true liveAtomic=true +++++++staticText name='This test is for alert.' containerLiveAtomic=true +++++++++inlineTextBox name='This test is for alert.' +++++status containerLiveAtomic=true liveAtomic=true +++++++staticText name='This test is for status.' containerLiveAtomic=true +++++++++inlineTextBox name='This test is for status.'
diff --git a/content/test/data/accessibility/aria/aria-banner-expected-blink.txt b/content/test/data/accessibility/aria/aria-banner-expected-blink.txt index 235b808..acaa5ef 100644 --- a/content/test/data/accessibility/aria/aria-banner-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-banner-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++banner -++++staticText name='Chromium Browser' -++++++inlineTextBox name='Chromium Browser' \ No newline at end of file +++genericContainer ignored +++++banner +++++++staticText name='Chromium Browser' +++++++++inlineTextBox name='Chromium Browser'
diff --git a/content/test/data/accessibility/aria/aria-busy-expected-blink.txt b/content/test/data/accessibility/aria/aria-busy-expected-blink.txt index ced5a96b..9377d228 100644 --- a/content/test/data/accessibility/aria/aria-busy-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-busy-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++log name='Busy log' busy=true containerLiveBusy=true -++log name='Not-busy log' containerLiveBusy=false -++genericContainer name='plain div' busy=true +++genericContainer ignored +++++log name='Busy log' busy=true containerLiveBusy=true +++++log name='Not-busy log' containerLiveBusy=false +++++genericContainer name='plain div' busy=true
diff --git a/content/test/data/accessibility/aria/aria-button-expected-blink.txt b/content/test/data/accessibility/aria/aria-button-expected-blink.txt index 56d577c..0fad92f0 100644 --- a/content/test/data/accessibility/aria/aria-button-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-button-expected-blink.txt
@@ -1,11 +1,12 @@ rootWebArea -++button name='Button1' -++toggleButton name='Button2' checkedState=true -++toggleButton name='Button3' checkedState=false -++popUpButton name='Button4' haspopup=menu -++button name='Button5' -++button name='Complex button ' -++++staticText name='Complex button ' -++++++inlineTextBox name='Complex button ' -++++textField -++++++genericContainer \ No newline at end of file +++genericContainer ignored +++++button name='Button1' +++++toggleButton name='Button2' checkedState=true +++++toggleButton name='Button3' checkedState=false +++++popUpButton name='Button4' haspopup=menu +++++button name='Button5' +++++button name='Complex button ' +++++++staticText name='Complex button ' +++++++++inlineTextBox name='Complex button ' +++++++textField +++++++++genericContainer
diff --git a/content/test/data/accessibility/aria/aria-cell-expected-blink.txt b/content/test/data/accessibility/aria/aria-cell-expected-blink.txt index ee500c52a..364cbe9e 100644 --- a/content/test/data/accessibility/aria/aria-cell-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-cell-expected-blink.txt
@@ -1,16 +1,17 @@ rootWebArea -++table -++++row selected=false -++++++columnHeader name='Browser' selected=false -++++++++staticText name='Browser' -++++++++++inlineTextBox name='Browser' -++++++columnHeader name='Rendering Engine' selected=false -++++++++staticText name='Rendering Engine' -++++++++++inlineTextBox name='Rendering Engine' -++++row selected=false -++++++cell name='Chrome' selected=false -++++++++staticText name='Chrome' -++++++++++inlineTextBox name='Chrome' -++++++cell name='Blink' selected=false -++++++++staticText name='Blink' -++++++++++inlineTextBox name='Blink' +++genericContainer ignored +++++table +++++++row selected=false +++++++++columnHeader name='Browser' selected=false +++++++++++staticText name='Browser' +++++++++++++inlineTextBox name='Browser' +++++++++columnHeader name='Rendering Engine' selected=false +++++++++++staticText name='Rendering Engine' +++++++++++++inlineTextBox name='Rendering Engine' +++++++row selected=false +++++++++cell name='Chrome' selected=false +++++++++++staticText name='Chrome' +++++++++++++inlineTextBox name='Chrome' +++++++++cell name='Blink' selected=false +++++++++++staticText name='Blink' +++++++++++++inlineTextBox name='Blink'
diff --git a/content/test/data/accessibility/aria/aria-checkbox-expected-blink.txt b/content/test/data/accessibility/aria/aria-checkbox-expected-blink.txt index 1d4869d..0ad84d1 100644 --- a/content/test/data/accessibility/aria/aria-checkbox-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-checkbox-expected-blink.txt
@@ -1,12 +1,13 @@ rootWebArea -++checkBox name='CheckBox1' checkedState=true -++checkBox name='CheckBox2' checkedState=false -++checkBox name='CheckBox3' checkedState=mixed -++checkBox name='CheckBox4' checkedState=false -++checkBox name='Complex checkbox' checkedState=false -++++staticText name='Complex ' -++++++inlineTextBox name='Complex ' -++++textField -++++++genericContainer -++++staticText name=' checkbox' -++++++inlineTextBox name=' checkbox' \ No newline at end of file +++genericContainer ignored +++++checkBox name='CheckBox1' checkedState=true +++++checkBox name='CheckBox2' checkedState=false +++++checkBox name='CheckBox3' checkedState=mixed +++++checkBox name='CheckBox4' checkedState=false +++++checkBox name='Complex checkbox' checkedState=false +++++++staticText name='Complex ' +++++++++inlineTextBox name='Complex ' +++++++textField +++++++++genericContainer +++++++staticText name=' checkbox' +++++++++inlineTextBox name=' checkbox'
diff --git a/content/test/data/accessibility/aria/aria-checked-expected-blink.txt b/content/test/data/accessibility/aria/aria-checked-expected-blink.txt index f64910c..88b737c 100644 --- a/content/test/data/accessibility/aria/aria-checked-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-checked-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++checkBox checkedState=true -++checkBox checkedState=false -++checkBox checkedState=mixed \ No newline at end of file +++genericContainer ignored +++++checkBox checkedState=true +++++checkBox checkedState=false +++++checkBox checkedState=mixed
diff --git a/content/test/data/accessibility/aria/aria-col-attr-expected-blink.txt b/content/test/data/accessibility/aria/aria-col-attr-expected-blink.txt index 40dc2f72..11aae7b 100644 --- a/content/test/data/accessibility/aria/aria-col-attr-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-col-attr-expected-blink.txt
@@ -1,25 +1,26 @@ rootWebArea -++grid ariaColumnCount=5 -++++row selected=false -++++++columnHeader name='cell 2' ariaCellColumnIndex=2 selected=false -++++++++staticText name='cell 2' -++++++++++inlineTextBox name='cell 2' -++++++columnHeader name='cell 4' ariaCellColumnIndex=4 selected=false -++++++++staticText name='cell 4' -++++++++++inlineTextBox name='cell 4' -++++++columnHeader name='cell 5' ariaCellColumnIndex=5 selected=false -++++++++staticText name='cell 5' -++++++++++inlineTextBox name='cell 5' -++++row ariaCellColumnIndex=2 selected=false -++++++cell name='cell 2' ariaCellColumnIndex=2 selected=false -++++++++staticText name='cell 2' -++++++++++inlineTextBox name='cell 2' -++++++cell name='cell 3' ariaCellColumnIndex=3 selected=false -++++++++staticText name='cell 3' -++++++++++inlineTextBox name='cell 3' -++++++cell name='cell 4' ariaCellColumnIndex=4 selected=false -++++++++staticText name='cell 4' -++++++++++inlineTextBox name='cell 4' -++++++cell name='cell 5' ariaCellColumnIndex=5 selected=false -++++++++staticText name='cell 5' -++++++++++inlineTextBox name='cell 5' +++genericContainer ignored +++++grid ariaColumnCount=5 +++++++row selected=false +++++++++columnHeader name='cell 2' ariaCellColumnIndex=2 selected=false +++++++++++staticText name='cell 2' +++++++++++++inlineTextBox name='cell 2' +++++++++columnHeader name='cell 4' ariaCellColumnIndex=4 selected=false +++++++++++staticText name='cell 4' +++++++++++++inlineTextBox name='cell 4' +++++++++columnHeader name='cell 5' ariaCellColumnIndex=5 selected=false +++++++++++staticText name='cell 5' +++++++++++++inlineTextBox name='cell 5' +++++++row ariaCellColumnIndex=2 selected=false +++++++++cell name='cell 2' ariaCellColumnIndex=2 selected=false +++++++++++staticText name='cell 2' +++++++++++++inlineTextBox name='cell 2' +++++++++cell name='cell 3' ariaCellColumnIndex=3 selected=false +++++++++++staticText name='cell 3' +++++++++++++inlineTextBox name='cell 3' +++++++++cell name='cell 4' ariaCellColumnIndex=4 selected=false +++++++++++staticText name='cell 4' +++++++++++++inlineTextBox name='cell 4' +++++++++cell name='cell 5' ariaCellColumnIndex=5 selected=false +++++++++++staticText name='cell 5' +++++++++++++inlineTextBox name='cell 5'
diff --git a/content/test/data/accessibility/aria/aria-columnheader-expected-blink.txt b/content/test/data/accessibility/aria/aria-columnheader-expected-blink.txt index 64884c7..ffb6c1f 100644 --- a/content/test/data/accessibility/aria/aria-columnheader-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-columnheader-expected-blink.txt
@@ -1,23 +1,24 @@ rootWebArea -++grid -++++row selected=false -++++++columnHeader name='Browser' selected=false -++++++++staticText name='Browser' -++++++++++inlineTextBox name='Browser' -++++++columnHeader name='Rendering Engine' selected=false -++++++++staticText name='Rendering Engine' -++++++++++inlineTextBox name='Rendering Engine' -++++row selected=false -++++++cell name='Chrome' selected=false -++++++++staticText name='Chrome' -++++++++++inlineTextBox name='Chrome' -++++++cell name='Blink' selected=false -++++++++staticText name='Blink' -++++++++++inlineTextBox name='Blink' -++++row selected=false -++++++cell name='Safari' selected=false -++++++++staticText name='Safari' -++++++++++inlineTextBox name='Safari' -++++++cell name='WebKit' selected=false -++++++++staticText name='WebKit' -++++++++++inlineTextBox name='WebKit' +++genericContainer ignored +++++grid +++++++row selected=false +++++++++columnHeader name='Browser' selected=false +++++++++++staticText name='Browser' +++++++++++++inlineTextBox name='Browser' +++++++++columnHeader name='Rendering Engine' selected=false +++++++++++staticText name='Rendering Engine' +++++++++++++inlineTextBox name='Rendering Engine' +++++++row selected=false +++++++++cell name='Chrome' selected=false +++++++++++staticText name='Chrome' +++++++++++++inlineTextBox name='Chrome' +++++++++cell name='Blink' selected=false +++++++++++staticText name='Blink' +++++++++++++inlineTextBox name='Blink' +++++++row selected=false +++++++++cell name='Safari' selected=false +++++++++++staticText name='Safari' +++++++++++++inlineTextBox name='Safari' +++++++++cell name='WebKit' selected=false +++++++++++staticText name='WebKit' +++++++++++++inlineTextBox name='WebKit'
diff --git a/content/test/data/accessibility/aria/aria-combobox-expected-blink.txt b/content/test/data/accessibility/aria/aria-combobox-expected-blink.txt index 7b23872..2455a9f 100644 --- a/content/test/data/accessibility/aria/aria-combobox-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-combobox-expected-blink.txt
@@ -1,9 +1,10 @@ rootWebArea -++genericContainer -++++staticText name='State' -++++++inlineTextBox name='State' -++textFieldWithComboBox autoComplete='list' name='State' activedescendantId=listBoxOption restriction=readOnly haspopup=listbox +++genericContainer ignored ++++genericContainer -++listBox -++++listBoxOption name='Alabama' selected=false -++++listBoxOption name='Alaska' selected=true \ No newline at end of file +++++++staticText name='State' +++++++++inlineTextBox name='State' +++++textFieldWithComboBox autoComplete='list' name='State' activedescendantId=listBoxOption restriction=readOnly haspopup=listbox +++++++genericContainer +++++listBox +++++++listBoxOption name='Alabama' selected=false +++++++listBoxOption name='Alaska' selected=true
diff --git a/content/test/data/accessibility/aria/aria-complementary-expected-blink.txt b/content/test/data/accessibility/aria/aria-complementary-expected-blink.txt index 5759d85..95cb14d 100644 --- a/content/test/data/accessibility/aria/aria-complementary-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-complementary-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++complementary -++++staticText name='This is ARIA role complementary.' -++++++inlineTextBox name='This is ARIA role complementary.' \ No newline at end of file +++genericContainer ignored +++++complementary +++++++staticText name='This is ARIA role complementary.' +++++++++inlineTextBox name='This is ARIA role complementary.'
diff --git a/content/test/data/accessibility/aria/aria-contentinfo-expected-blink.txt b/content/test/data/accessibility/aria/aria-contentinfo-expected-blink.txt index 7888d8d..97cee42a 100644 --- a/content/test/data/accessibility/aria/aria-contentinfo-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-contentinfo-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++contentInfo -++++staticText name='This is ARIA role contentinfo.' -++++++inlineTextBox name='This is ARIA role contentinfo.' \ No newline at end of file +++genericContainer ignored +++++contentInfo +++++++staticText name='This is ARIA role contentinfo.' +++++++++inlineTextBox name='This is ARIA role contentinfo.'
diff --git a/content/test/data/accessibility/aria/aria-controls-expected-blink.txt b/content/test/data/accessibility/aria/aria-controls-expected-blink.txt index beda688..9230506 100644 --- a/content/test/data/accessibility/aria/aria-controls-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-controls-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++menuBar horizontal -++++menuItem name='File' controlsIds=menu -++++menuItem name='Edit' -++menu name='File' -++++menuItem name='New' -++++menuItem name='Open' \ No newline at end of file +++genericContainer ignored +++++menuBar horizontal +++++++menuItem name='File' controlsIds=menu +++++++menuItem name='Edit' +++++menu name='File' +++++++menuItem name='New' +++++++menuItem name='Open'
diff --git a/content/test/data/accessibility/aria/aria-current-expected-blink.txt b/content/test/data/accessibility/aria/aria-current-expected-blink.txt index 40eaf2a..75c90b65 100644 --- a/content/test/data/accessibility/aria/aria-current-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-current-expected-blink.txt
@@ -1,39 +1,40 @@ rootWebArea -++link name='Section one' -++++staticText name='Section one' -++++++inlineTextBox name='Section one' -++staticText name=' ' -++++inlineTextBox name=' ' -++link name='Section two' -++++staticText name='Section two' -++++++inlineTextBox name='Section two' -++staticText name=' ' -++++inlineTextBox name=' ' -++link name='Section three' ariaCurrentState=location -++++staticText name='Section three' -++++++inlineTextBox name='Section three' -++lineBreak name='<newline>' -++++inlineTextBox name='<newline>' -++heading name='Section one heading' hierarchicalLevel=1 -++++staticText name='Section one heading' -++++++inlineTextBox name='Section one heading' -++heading name='Section two heading' hierarchicalLevel=1 -++++staticText name='Section two heading' -++++++inlineTextBox name='Section two heading' -++heading name='Section three heading' hierarchicalLevel=1 -++++staticText name='Section three heading' -++++++inlineTextBox name='Section three heading' -++lineBreak name='<newline>' -++++inlineTextBox name='<newline>' -++genericContainer -++++staticText name='Span 1' -++++++inlineTextBox name='Span 1' +++genericContainer ignored +++++link name='Section one' +++++++staticText name='Section one' +++++++++inlineTextBox name='Section one' ++++staticText name=' ' ++++++inlineTextBox name=' ' -++++genericContainer ariaCurrentState=true -++++++staticText name='Span 2' -++++++++inlineTextBox name='Span 2' +++++link name='Section two' +++++++staticText name='Section two' +++++++++inlineTextBox name='Section two' ++++staticText name=' ' ++++++inlineTextBox name=' ' -++++staticText name='Span 3' -++++++inlineTextBox name='Span 3' \ No newline at end of file +++++link name='Section three' ariaCurrentState=location +++++++staticText name='Section three' +++++++++inlineTextBox name='Section three' +++++lineBreak name='<newline>' +++++++inlineTextBox name='<newline>' +++++heading name='Section one heading' hierarchicalLevel=1 +++++++staticText name='Section one heading' +++++++++inlineTextBox name='Section one heading' +++++heading name='Section two heading' hierarchicalLevel=1 +++++++staticText name='Section two heading' +++++++++inlineTextBox name='Section two heading' +++++heading name='Section three heading' hierarchicalLevel=1 +++++++staticText name='Section three heading' +++++++++inlineTextBox name='Section three heading' +++++lineBreak name='<newline>' +++++++inlineTextBox name='<newline>' +++++genericContainer +++++++staticText name='Span 1' +++++++++inlineTextBox name='Span 1' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++genericContainer ariaCurrentState=true +++++++++staticText name='Span 2' +++++++++++inlineTextBox name='Span 2' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='Span 3' +++++++++inlineTextBox name='Span 3'
diff --git a/content/test/data/accessibility/aria/aria-definition-expected-blink.txt b/content/test/data/accessibility/aria/aria-definition-expected-blink.txt index d6380991..0d514419 100644 --- a/content/test/data/accessibility/aria/aria-definition-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-definition-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++definition \ No newline at end of file +++genericContainer ignored +++++definition
diff --git a/content/test/data/accessibility/aria/aria-describedby-expected-blink.txt b/content/test/data/accessibility/aria/aria-describedby-expected-blink.txt index 62bdfa7..87ed42c 100644 --- a/content/test/data/accessibility/aria/aria-describedby-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-describedby-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++textField description='Your username should be your email id' descriptionFrom=relatedElement describedbyIds=tooltip -++++genericContainer -++tooltip name='Your username should be your email id' -++++staticText name='Your username should be your email id' -++++++inlineTextBox name='Your username should be your email id' -++textField description='mmddyy' descriptionFrom=relatedElement describedbyIds=null -++++genericContainer \ No newline at end of file +++genericContainer ignored +++++textField description='Your username should be your email id' descriptionFrom=relatedElement describedbyIds=tooltip +++++++genericContainer +++++tooltip name='Your username should be your email id' +++++++staticText name='Your username should be your email id' +++++++++inlineTextBox name='Your username should be your email id' +++++textField description='mmddyy' descriptionFrom=relatedElement describedbyIds=null +++++++genericContainer
diff --git a/content/test/data/accessibility/aria/aria-describedby-updates-expected-blink.txt b/content/test/data/accessibility/aria/aria-describedby-updates-expected-blink.txt index 3c68834..c3516c64 100644 --- a/content/test/data/accessibility/aria/aria-describedby-updates-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-describedby-updates-expected-blink.txt
@@ -1,2 +1,4 @@ rootWebArea -++main description='oranges' +++genericContainer ignored +++++main description='oranges' +++++++paragraph ignored invisible
diff --git a/content/test/data/accessibility/aria/aria-details-expected-blink.txt b/content/test/data/accessibility/aria/aria-details-expected-blink.txt index f82f31bf..45c7c8c 100644 --- a/content/test/data/accessibility/aria/aria-details-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-details-expected-blink.txt
@@ -1,18 +1,19 @@ rootWebArea -++genericContainer -++++textField detailsId=paragraph -++++++genericContainer -++paragraph -++++staticText name='Details' -++++++inlineTextBox name='Details' -++paragraph -++++staticText name='This ' -++++++inlineTextBox name='This ' -++++genericContainer detailsId=group -++++++staticText name='text' -++++++++inlineTextBox name='text' -++++staticText name=' has details' -++++++inlineTextBox name=' has details' -++group -++++staticText name='Text details' -++++++inlineTextBox name='Text details' \ No newline at end of file +++genericContainer ignored +++++genericContainer +++++++textField detailsId=paragraph +++++++++genericContainer +++++paragraph +++++++staticText name='Details' +++++++++inlineTextBox name='Details' +++++paragraph +++++++staticText name='This ' +++++++++inlineTextBox name='This ' +++++++genericContainer detailsId=group +++++++++staticText name='text' +++++++++++inlineTextBox name='text' +++++++staticText name=' has details' +++++++++inlineTextBox name=' has details' +++++group +++++++staticText name='Text details' +++++++++inlineTextBox name='Text details'
diff --git a/content/test/data/accessibility/aria/aria-dialog-expected-blink.txt b/content/test/data/accessibility/aria/aria-dialog-expected-blink.txt index e041347..4893bbe 100644 --- a/content/test/data/accessibility/aria/aria-dialog-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-dialog-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++dialog -++++staticText name='This is ARIA dialog.' -++++++inlineTextBox name='This is ARIA dialog.' \ No newline at end of file +++genericContainer ignored +++++dialog +++++++staticText name='This is ARIA dialog.' +++++++++inlineTextBox name='This is ARIA dialog.'
diff --git a/content/test/data/accessibility/aria/aria-directory-expected-blink.txt b/content/test/data/accessibility/aria/aria-directory-expected-blink.txt index 86539306..76a60bd 100644 --- a/content/test/data/accessibility/aria/aria-directory-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-directory-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++list \ No newline at end of file +++genericContainer ignored +++++list
diff --git a/content/test/data/accessibility/aria/aria-disabled-expected-blink.txt b/content/test/data/accessibility/aria/aria-disabled-expected-blink.txt index ffb95fa..441022a8 100644 --- a/content/test/data/accessibility/aria/aria-disabled-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-disabled-expected-blink.txt
@@ -1,22 +1,23 @@ rootWebArea -++genericContainer -++++textField -++++++genericContainer -++++textField restriction=disabled -++++++genericContainer -++++textField -++++++genericContainer -++genericContainer restriction=disabled -++++textField restriction=disabled -++++++genericContainer -++++textField restriction=disabled -++++++genericContainer -++++textField -++++++genericContainer -++genericContainer -++++textField -++++++genericContainer -++++textField restriction=disabled -++++++genericContainer -++++textField -++++++genericContainer \ No newline at end of file +++genericContainer ignored +++++genericContainer +++++++textField +++++++++genericContainer +++++++textField restriction=disabled +++++++++genericContainer +++++++textField +++++++++genericContainer +++++genericContainer restriction=disabled +++++++textField restriction=disabled +++++++++genericContainer +++++++textField restriction=disabled +++++++++genericContainer +++++++textField +++++++++genericContainer +++++genericContainer +++++++textField +++++++++genericContainer +++++++textField restriction=disabled +++++++++genericContainer +++++++textField +++++++++genericContainer
diff --git a/content/test/data/accessibility/aria/aria-document-expected-blink.txt b/content/test/data/accessibility/aria/aria-document-expected-blink.txt index 2af5a4e..96f165b 100644 --- a/content/test/data/accessibility/aria/aria-document-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-document-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++document -++++staticText name='aria role document' -++++++inlineTextBox name='aria role document' \ No newline at end of file +++genericContainer ignored +++++document +++++++staticText name='aria role document' +++++++++inlineTextBox name='aria role document'
diff --git a/content/test/data/accessibility/aria/aria-dropeffect-expected-blink.txt b/content/test/data/accessibility/aria/aria-dropeffect-expected-blink.txt index cf2fb62b..196c20d 100644 --- a/content/test/data/accessibility/aria/aria-dropeffect-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-dropeffect-expected-blink.txt
@@ -1,22 +1,23 @@ rootWebArea -++genericContainer dropeffect=copy -++++staticText name='copy' -++++++inlineTextBox name='copy' -++genericContainer dropeffect=move -++++staticText name='move' -++++++inlineTextBox name='move' -++genericContainer dropeffect=link -++++staticText name='link' -++++++inlineTextBox name='link' -++genericContainer dropeffect=execute -++++staticText name='execute' -++++++inlineTextBox name='execute' -++genericContainer dropeffect=popup -++++staticText name='popup' -++++++inlineTextBox name='popup' -++genericContainer dropeffect=none -++++staticText name='none(default)' -++++++inlineTextBox name='none(default)' -++genericContainer dropeffect=link popup -++++staticText name='link popup' -++++++inlineTextBox name='link popup' +++genericContainer ignored +++++genericContainer dropeffect=copy +++++++staticText name='copy' +++++++++inlineTextBox name='copy' +++++genericContainer dropeffect=move +++++++staticText name='move' +++++++++inlineTextBox name='move' +++++genericContainer dropeffect=link +++++++staticText name='link' +++++++++inlineTextBox name='link' +++++genericContainer dropeffect=execute +++++++staticText name='execute' +++++++++inlineTextBox name='execute' +++++genericContainer dropeffect=popup +++++++staticText name='popup' +++++++++inlineTextBox name='popup' +++++genericContainer dropeffect=none +++++++staticText name='none(default)' +++++++++inlineTextBox name='none(default)' +++++genericContainer dropeffect=link popup +++++++staticText name='link popup' +++++++++inlineTextBox name='link popup'
diff --git a/content/test/data/accessibility/aria/aria-editable-expected-blink.txt b/content/test/data/accessibility/aria/aria-editable-expected-blink.txt index 2862a062..b0dc0ad 100644 --- a/content/test/data/accessibility/aria/aria-editable-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-editable-expected-blink.txt
@@ -1,11 +1,12 @@ rootWebArea -++genericContainer editable multiline richlyEditable value='Editable text/Non-editable text' editableRoot=true -++++paragraph editable richlyEditable -++++++staticText editable richlyEditable name='Editable text/' -++++++++inlineTextBox name='Editable text/' -++++paragraph -++++++staticText name='Non-editable text' -++++++++inlineTextBox name='Non-editable text' -++genericContainer editable richlyEditable -++++staticText editable richlyEditable name='Fake-editable' -++++++inlineTextBox name='Fake-editable' +++genericContainer ignored +++++genericContainer editable multiline richlyEditable value='Editable text/Non-editable text' editableRoot=true +++++++paragraph editable richlyEditable +++++++++staticText editable richlyEditable name='Editable text/' +++++++++++inlineTextBox name='Editable text/' +++++++paragraph +++++++++staticText name='Non-editable text' +++++++++++inlineTextBox name='Non-editable text' +++++genericContainer editable richlyEditable +++++++staticText editable richlyEditable name='Fake-editable' +++++++++inlineTextBox name='Fake-editable'
diff --git a/content/test/data/accessibility/aria/aria-empty-string-expected-blink.txt b/content/test/data/accessibility/aria/aria-empty-string-expected-blink.txt index 2f1b1dc..75e98ae 100644 --- a/content/test/data/accessibility/aria/aria-empty-string-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-empty-string-expected-blink.txt
@@ -1,25 +1,26 @@ rootWebArea -++genericContainer name='Atomic undefined' -++textField name='Autocomplete undefined' -++genericContainer name='Busy undefined' -++treeItem name='Checked undefined' selected=false -++genericContainer name='Current undefined' -++genericContainer name='Disabled undefined' -++genericContainer name='Dropeffect undefined' dropeffect=none -++treeItem name='Expanded undefined' selected=false -++genericContainer name='Grabbed undefined' -++button name='Haspopup undefined' -++genericContainer name='Invalid undefined' -++genericContainer name='Live undefined' -++dialog name='Modal undefined' modal=false -++textField name='Multiline undefined' -++grid name='Multiselectable undefined' -++scrollBar vertical name='Orientation undefined' -++button name='Pressed undefined' -++textField name='Readonly undefined' -++genericContainer name='Relevant undefined' -++textField name='Required undefined' -++tree multiselectable vertical -++++treeItem name='Selected undefined' selected=false -++columnHeader name='Sort undefined' selected=false -++genericContainer name='Hidden undefined, display block' +++genericContainer ignored +++++genericContainer name='Atomic undefined' +++++textField name='Autocomplete undefined' +++++genericContainer name='Busy undefined' +++++treeItem name='Checked undefined' selected=false +++++genericContainer name='Current undefined' +++++genericContainer name='Disabled undefined' +++++genericContainer name='Dropeffect undefined' dropeffect=none +++++treeItem name='Expanded undefined' selected=false +++++genericContainer name='Grabbed undefined' +++++button name='Haspopup undefined' +++++genericContainer name='Invalid undefined' +++++genericContainer name='Live undefined' +++++dialog name='Modal undefined' modal=false +++++textField name='Multiline undefined' +++++grid name='Multiselectable undefined' +++++scrollBar vertical name='Orientation undefined' +++++button name='Pressed undefined' +++++textField name='Readonly undefined' +++++genericContainer name='Relevant undefined' +++++textField name='Required undefined' +++++tree multiselectable vertical +++++++treeItem name='Selected undefined' selected=false +++++columnHeader name='Sort undefined' selected=false +++++genericContainer name='Hidden undefined, display block'
diff --git a/content/test/data/accessibility/aria/aria-errormessage-expected-blink.txt b/content/test/data/accessibility/aria/aria-errormessage-expected-blink.txt index 191b040..31e7c0c 100644 --- a/content/test/data/accessibility/aria/aria-errormessage-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-errormessage-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++genericContainer -++++textField errormessageId=paragraph invalidState=true -++++++genericContainer -++paragraph -++++staticText name='Error' -++++++inlineTextBox name='Error' \ No newline at end of file +++genericContainer ignored +++++genericContainer +++++++textField errormessageId=paragraph invalidState=true +++++++++genericContainer +++++paragraph +++++++staticText name='Error' +++++++++inlineTextBox name='Error'
diff --git a/content/test/data/accessibility/aria/aria-expanded-expected-blink.txt b/content/test/data/accessibility/aria/aria-expanded-expected-blink.txt index 51042474..3ca67a13 100644 --- a/content/test/data/accessibility/aria/aria-expanded-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-expanded-expected-blink.txt
@@ -1,9 +1,10 @@ rootWebArea -++menu -++++menuItem collapsed name='New' haspopup=menu -++++menuItem name='Open' haspopup=menu -++++menuItem collapsed name='Save' -++++menuItem name='Quit' -++splitter horizontal -++splitter horizontal -++splitter horizontal +++genericContainer ignored +++++menu +++++++menuItem collapsed name='New' haspopup=menu +++++++menuItem name='Open' haspopup=menu +++++++menuItem collapsed name='Save' +++++++menuItem name='Quit' +++++splitter horizontal +++++splitter horizontal +++++splitter horizontal
diff --git a/content/test/data/accessibility/aria/aria-figure-expected-blink.txt b/content/test/data/accessibility/aria/aria-figure-expected-blink.txt index 9a22292..4775c32 100644 --- a/content/test/data/accessibility/aria/aria-figure-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-figure-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++figure -++++staticText name='Figure' -++++++inlineTextBox name='Figure' \ No newline at end of file +++genericContainer ignored +++++figure +++++++staticText name='Figure' +++++++++inlineTextBox name='Figure'
diff --git a/content/test/data/accessibility/aria/aria-flowto-expected-blink.txt b/content/test/data/accessibility/aria/aria-flowto-expected-blink.txt index 0171c6b..2c33dd95 100644 --- a/content/test/data/accessibility/aria/aria-flowto-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-flowto-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++region name='current' flowtoIds=footer -++++staticText name='Lorem ipsum' -++++++inlineTextBox name='Lorem ipsum' -++footer name='next' -++++staticText name='dolor sit amet' -++++++inlineTextBox name='dolor sit amet' +++genericContainer ignored +++++region name='current' flowtoIds=footer +++++++staticText name='Lorem ipsum' +++++++++inlineTextBox name='Lorem ipsum' +++++footer name='next' +++++++staticText name='dolor sit amet' +++++++++inlineTextBox name='dolor sit amet'
diff --git a/content/test/data/accessibility/aria/aria-flowto-multiple-expected-blink.txt b/content/test/data/accessibility/aria/aria-flowto-multiple-expected-blink.txt index cb771c2..82100434 100644 --- a/content/test/data/accessibility/aria/aria-flowto-multiple-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-flowto-multiple-expected-blink.txt
@@ -1,10 +1,11 @@ rootWebArea -++genericContainer name='a3' flowtoIds=genericContainer -++++staticText name='a3' -++++++inlineTextBox name='a3' -++genericContainer name='b3' -++++staticText name='b3' -++++++inlineTextBox name='b3' -++genericContainer name='c3' flowtoIds=genericContainer -++++staticText name='c3' -++++++inlineTextBox name='c3' +++genericContainer ignored +++++genericContainer name='a3' flowtoIds=genericContainer +++++++staticText name='a3' +++++++++inlineTextBox name='a3' +++++genericContainer name='b3' +++++++staticText name='b3' +++++++++inlineTextBox name='b3' +++++genericContainer name='c3' flowtoIds=genericContainer +++++++staticText name='c3' +++++++++inlineTextBox name='c3'
diff --git a/content/test/data/accessibility/aria/aria-form-expected-blink.txt b/content/test/data/accessibility/aria/aria-form-expected-blink.txt index 9482feb..2e9c92e 100644 --- a/content/test/data/accessibility/aria/aria-form-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-form-expected-blink.txt
@@ -1,2 +1,4 @@ rootWebArea -++form \ No newline at end of file +++genericContainer ignored +++++form +++++++genericContainer ignored
diff --git a/content/test/data/accessibility/aria/aria-grid-dynamic-add-row-expected-blink.txt b/content/test/data/accessibility/aria/aria-grid-dynamic-add-row-expected-blink.txt index 2b4fca0d..395afb2 100644 --- a/content/test/data/accessibility/aria/aria-grid-dynamic-add-row-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-grid-dynamic-add-row-expected-blink.txt
@@ -1,17 +1,18 @@ rootWebArea -++grid -++++row -++++++columnHeader name='Turtle' tableCellRowIndex=0 -++++++columnHeader name='Weapon' tableCellRowIndex=0 -++++row -++++++cell name='Donatello' tableCellRowIndex=1 -++++++cell name='Bo' tableCellRowIndex=1 -++++row -++++++cell name='Leonardo' tableCellRowIndex=2 -++++++cell name='Twin Katana' tableCellRowIndex=2 -++++row -++++++cell name='Michelangelo' tableCellRowIndex=3 -++++++cell name='Nunchaku' tableCellRowIndex=3 -++++row -++++++cell name='Raphael' tableCellRowIndex=4 -++++++cell name='Sai' tableCellRowIndex=4 +++genericContainer ignored +++++grid +++++++row +++++++++columnHeader name='Turtle' tableCellRowIndex=0 +++++++++columnHeader name='Weapon' tableCellRowIndex=0 +++++++row +++++++++cell name='Donatello' tableCellRowIndex=1 +++++++++cell name='Bo' tableCellRowIndex=1 +++++++row +++++++++cell name='Leonardo' tableCellRowIndex=2 +++++++++cell name='Twin Katana' tableCellRowIndex=2 +++++++row +++++++++cell name='Michelangelo' tableCellRowIndex=3 +++++++++cell name='Nunchaku' tableCellRowIndex=3 +++++++row +++++++++cell name='Raphael' tableCellRowIndex=4 +++++++++cell name='Sai' tableCellRowIndex=4
diff --git a/content/test/data/accessibility/aria/aria-grid-expected-blink.txt b/content/test/data/accessibility/aria/aria-grid-expected-blink.txt index eadbd5b7..1bcdb4b 100644 --- a/content/test/data/accessibility/aria/aria-grid-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-grid-expected-blink.txt
@@ -1,16 +1,17 @@ rootWebArea -++grid -++++row selected=false -++++++columnHeader name='Browser' selected=false -++++++++staticText name='Browser' -++++++++++inlineTextBox name='Browser' -++++++columnHeader name='Rendering Engine' selected=false -++++++++staticText name='Rendering Engine' -++++++++++inlineTextBox name='Rendering Engine' -++++row selected=false -++++++cell name='Chrome' selected=false -++++++++staticText name='Chrome' -++++++++++inlineTextBox name='Chrome' -++++++cell name='Blink' selected=false -++++++++staticText name='Blink' -++++++++++inlineTextBox name='Blink' +++genericContainer ignored +++++grid +++++++row selected=false +++++++++columnHeader name='Browser' selected=false +++++++++++staticText name='Browser' +++++++++++++inlineTextBox name='Browser' +++++++++columnHeader name='Rendering Engine' selected=false +++++++++++staticText name='Rendering Engine' +++++++++++++inlineTextBox name='Rendering Engine' +++++++row selected=false +++++++++cell name='Chrome' selected=false +++++++++++staticText name='Chrome' +++++++++++++inlineTextBox name='Chrome' +++++++++cell name='Blink' selected=false +++++++++++staticText name='Blink' +++++++++++++inlineTextBox name='Blink'
diff --git a/content/test/data/accessibility/aria/aria-grid-extra-wrap-elems-expected-blink.txt b/content/test/data/accessibility/aria/aria-grid-extra-wrap-elems-expected-blink.txt index 876b7a5..66c7ce0 100644 --- a/content/test/data/accessibility/aria/aria-grid-extra-wrap-elems-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-grid-extra-wrap-elems-expected-blink.txt
@@ -1,91 +1,32 @@ rootWebArea -++grid name='1: Individual rows get their own wrappers' tableRowCount=2 tableColumnCount=2 -++++genericContainer name='r1-wrap' -++++++row name='r1-real' tableRowIndex=0 selected=false -++++++++cell name='A1' tableCellColumnIndex=0 tableCellRowIndex=0 selected=false -++++++++++staticText name='A1' -++++++++++++inlineTextBox name='A1' -++++++++cell name='A2' tableCellColumnIndex=1 tableCellRowIndex=0 selected=false -++++++++++staticText name='A2' -++++++++++++inlineTextBox name='A2' -++++genericContainer name='r2-wrap' -++++++genericContainer name='r2-vanilla' -++++++++row name='r2-real' tableRowIndex=1 selected=false -++++++++++cell name='B1' tableCellColumnIndex=0 tableCellRowIndex=1 selected=false -++++++++++++staticText name='B1' -++++++++++++++inlineTextBox name='B1' -++++++++++cell name='B2' tableCellColumnIndex=1 tableCellRowIndex=1 selected=false -++++++++++++staticText name='B2' -++++++++++++++inlineTextBox name='B2' -++grid name='2: Single wrapper around all rows' tableRowCount=2 tableColumnCount=2 -++++genericContainer -++++++row tableRowIndex=0 selected=false -++++++++cell name='A1' tableCellColumnIndex=0 tableCellRowIndex=0 selected=false -++++++++++staticText name='A1' -++++++++++++inlineTextBox name='A1' -++++++++cell name='A2' tableCellColumnIndex=1 tableCellRowIndex=0 selected=false -++++++++++staticText name='A2' -++++++++++++inlineTextBox name='A2' -++++++row tableRowIndex=1 selected=false -++++++++cell name='B1' tableCellColumnIndex=0 tableCellRowIndex=1 selected=false -++++++++++staticText name='B1' -++++++++++++inlineTextBox name='B1' -++++++++cell name='B2' tableCellColumnIndex=1 tableCellRowIndex=1 selected=false -++++++++++staticText name='B2' -++++++++++++inlineTextBox name='B2' -++grid name='3: Individual cells get their own wrappers' tableRowCount=2 tableColumnCount=2 -++++row tableRowIndex=0 selected=false +++genericContainer ignored +++++grid name='1: Individual rows get their own wrappers' tableRowCount=2 tableColumnCount=2 +++++++genericContainer name='r1-wrap' +++++++++row name='r1-real' tableRowIndex=0 selected=false +++++++++++cell name='A1' tableCellColumnIndex=0 tableCellRowIndex=0 selected=false +++++++++++++staticText name='A1' +++++++++++++++inlineTextBox name='A1' +++++++++++cell name='A2' tableCellColumnIndex=1 tableCellRowIndex=0 selected=false +++++++++++++staticText name='A2' +++++++++++++++inlineTextBox name='A2' +++++++genericContainer name='r2-wrap' +++++++++genericContainer name='r2-vanilla' +++++++++++row name='r2-real' tableRowIndex=1 selected=false +++++++++++++cell name='B1' tableCellColumnIndex=0 tableCellRowIndex=1 selected=false +++++++++++++++staticText name='B1' +++++++++++++++++inlineTextBox name='B1' +++++++++++++cell name='B2' tableCellColumnIndex=1 tableCellRowIndex=1 selected=false +++++++++++++++staticText name='B2' +++++++++++++++++inlineTextBox name='B2' +++++grid name='2: Single wrapper around all rows' tableRowCount=2 tableColumnCount=2 ++++++genericContainer -++++++++cell name='A1' tableCellColumnIndex=0 tableCellRowIndex=0 selected=false -++++++++++staticText name='A1' -++++++++++++inlineTextBox name='A1' -++++++genericContainer -++++++++cell name='A2' tableCellColumnIndex=1 tableCellRowIndex=0 selected=false -++++++++++staticText name='A2' -++++++++++++inlineTextBox name='A2' -++++row tableRowIndex=1 selected=false -++++++genericContainer -++++++++cell name='B1' tableCellColumnIndex=0 tableCellRowIndex=1 selected=false -++++++++++staticText name='B1' -++++++++++++inlineTextBox name='B1' -++++++genericContainer -++++++++genericContainer -++++++++++cell name='B2' tableCellColumnIndex=1 tableCellRowIndex=1 selected=false -++++++++++++staticText name='B2' -++++++++++++++inlineTextBox name='B2' -++grid name='4: Single wrapper around all cells in a row' tableRowCount=2 tableColumnCount=2 -++++row tableRowIndex=0 selected=false -++++++genericContainer -++++++++cell name='A1' tableCellColumnIndex=0 tableCellRowIndex=0 selected=false -++++++++++staticText name='A1' -++++++++++++inlineTextBox name='A1' -++++++++cell name='A2' tableCellColumnIndex=1 tableCellRowIndex=0 selected=false -++++++++++staticText name='A2' -++++++++++++inlineTextBox name='A2' -++++row tableRowIndex=1 selected=false -++++++genericContainer -++++++++genericContainer -++++++++++cell name='B1' tableCellColumnIndex=0 tableCellRowIndex=1 selected=false -++++++++++++staticText name='B1' -++++++++++++++inlineTextBox name='B1' -++++++++genericContainer -++++++++++cell name='B2' tableCellColumnIndex=1 tableCellRowIndex=1 selected=false -++++++++++++staticText name='B2' -++++++++++++++inlineTextBox name='B2' -++grid name='5: Wrapper insanity' tableRowCount=2 tableColumnCount=2 -++++genericContainer -++++++genericContainer -++++++++genericContainer -++++++++++row tableRowIndex=0 selected=false -++++++++++++genericContainer -++++++++++++++genericContainer -++++++++++++++++cell name='A1' tableCellColumnIndex=0 tableCellRowIndex=0 selected=false -++++++++++++++++++staticText name='A1' -++++++++++++++++++++inlineTextBox name='A1' -++++++++++++cell name='A2' tableCellColumnIndex=1 tableCellRowIndex=0 selected=false -++++++++++++++staticText name='A2' -++++++++++++++++inlineTextBox name='A2' -++++++genericContainer +++++++++row tableRowIndex=0 selected=false +++++++++++cell name='A1' tableCellColumnIndex=0 tableCellRowIndex=0 selected=false +++++++++++++staticText name='A1' +++++++++++++++inlineTextBox name='A1' +++++++++++cell name='A2' tableCellColumnIndex=1 tableCellRowIndex=0 selected=false +++++++++++++staticText name='A2' +++++++++++++++inlineTextBox name='A2' ++++++++row tableRowIndex=1 selected=false ++++++++++cell name='B1' tableCellColumnIndex=0 tableCellRowIndex=1 selected=false ++++++++++++staticText name='B1' @@ -93,3 +34,63 @@ ++++++++++cell name='B2' tableCellColumnIndex=1 tableCellRowIndex=1 selected=false ++++++++++++staticText name='B2' ++++++++++++++inlineTextBox name='B2' +++++grid name='3: Individual cells get their own wrappers' tableRowCount=2 tableColumnCount=2 +++++++row tableRowIndex=0 selected=false +++++++++genericContainer +++++++++++cell name='A1' tableCellColumnIndex=0 tableCellRowIndex=0 selected=false +++++++++++++staticText name='A1' +++++++++++++++inlineTextBox name='A1' +++++++++genericContainer +++++++++++cell name='A2' tableCellColumnIndex=1 tableCellRowIndex=0 selected=false +++++++++++++staticText name='A2' +++++++++++++++inlineTextBox name='A2' +++++++row tableRowIndex=1 selected=false +++++++++genericContainer +++++++++++cell name='B1' tableCellColumnIndex=0 tableCellRowIndex=1 selected=false +++++++++++++staticText name='B1' +++++++++++++++inlineTextBox name='B1' +++++++++genericContainer +++++++++++genericContainer +++++++++++++cell name='B2' tableCellColumnIndex=1 tableCellRowIndex=1 selected=false +++++++++++++++staticText name='B2' +++++++++++++++++inlineTextBox name='B2' +++++grid name='4: Single wrapper around all cells in a row' tableRowCount=2 tableColumnCount=2 +++++++row tableRowIndex=0 selected=false +++++++++genericContainer +++++++++++cell name='A1' tableCellColumnIndex=0 tableCellRowIndex=0 selected=false +++++++++++++staticText name='A1' +++++++++++++++inlineTextBox name='A1' +++++++++++cell name='A2' tableCellColumnIndex=1 tableCellRowIndex=0 selected=false +++++++++++++staticText name='A2' +++++++++++++++inlineTextBox name='A2' +++++++row tableRowIndex=1 selected=false +++++++++genericContainer +++++++++++genericContainer +++++++++++++cell name='B1' tableCellColumnIndex=0 tableCellRowIndex=1 selected=false +++++++++++++++staticText name='B1' +++++++++++++++++inlineTextBox name='B1' +++++++++++genericContainer +++++++++++++cell name='B2' tableCellColumnIndex=1 tableCellRowIndex=1 selected=false +++++++++++++++staticText name='B2' +++++++++++++++++inlineTextBox name='B2' +++++grid name='5: Wrapper insanity' tableRowCount=2 tableColumnCount=2 +++++++genericContainer +++++++++genericContainer +++++++++++genericContainer +++++++++++++row tableRowIndex=0 selected=false +++++++++++++++genericContainer +++++++++++++++++genericContainer +++++++++++++++++++cell name='A1' tableCellColumnIndex=0 tableCellRowIndex=0 selected=false +++++++++++++++++++++staticText name='A1' +++++++++++++++++++++++inlineTextBox name='A1' +++++++++++++++cell name='A2' tableCellColumnIndex=1 tableCellRowIndex=0 selected=false +++++++++++++++++staticText name='A2' +++++++++++++++++++inlineTextBox name='A2' +++++++++genericContainer +++++++++++row tableRowIndex=1 selected=false +++++++++++++cell name='B1' tableCellColumnIndex=0 tableCellRowIndex=1 selected=false +++++++++++++++staticText name='B1' +++++++++++++++++inlineTextBox name='B1' +++++++++++++cell name='B2' tableCellColumnIndex=1 tableCellRowIndex=1 selected=false +++++++++++++++staticText name='B2' +++++++++++++++++inlineTextBox name='B2'
diff --git a/content/test/data/accessibility/aria/aria-gridcell-expected-blink.txt b/content/test/data/accessibility/aria/aria-gridcell-expected-blink.txt index b1eccba..47f80b5f 100644 --- a/content/test/data/accessibility/aria/aria-gridcell-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-gridcell-expected-blink.txt
@@ -1,16 +1,17 @@ rootWebArea -++grid multiselectable -++++row selected=false -++++++columnHeader name='Browser' selected=false -++++++++staticText name='Browser' -++++++++++inlineTextBox name='Browser' -++++++columnHeader name='Rendering Engine' selected=false -++++++++staticText name='Rendering Engine' -++++++++++inlineTextBox name='Rendering Engine' -++++row selected=false -++++++cell name='Chrome' selected=false -++++++++staticText name='Chrome' -++++++++++inlineTextBox name='Chrome' -++++++cell name='Blink' selected=false -++++++++staticText name='Blink' -++++++++++inlineTextBox name='Blink' +++genericContainer ignored +++++grid multiselectable +++++++row selected=false +++++++++columnHeader name='Browser' selected=false +++++++++++staticText name='Browser' +++++++++++++inlineTextBox name='Browser' +++++++++columnHeader name='Rendering Engine' selected=false +++++++++++staticText name='Rendering Engine' +++++++++++++inlineTextBox name='Rendering Engine' +++++++row selected=false +++++++++cell name='Chrome' selected=false +++++++++++staticText name='Chrome' +++++++++++++inlineTextBox name='Chrome' +++++++++cell name='Blink' selected=false +++++++++++staticText name='Blink' +++++++++++++inlineTextBox name='Blink'
diff --git a/content/test/data/accessibility/aria/aria-group-expected-blink.txt b/content/test/data/accessibility/aria/aria-group-expected-blink.txt index d343516..3ce7ca9 100644 --- a/content/test/data/accessibility/aria/aria-group-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-group-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++group -++++link name='Group Link1' -++++++staticText name='Group Link1' -++++++++inlineTextBox name='Group Link1' -++++link name='Group Link2' -++++++staticText name='Group Link2' -++++++++inlineTextBox name='Group Link2' \ No newline at end of file +++genericContainer ignored +++++group +++++++link name='Group Link1' +++++++++staticText name='Group Link1' +++++++++++inlineTextBox name='Group Link1' +++++++link name='Group Link2' +++++++++staticText name='Group Link2' +++++++++++inlineTextBox name='Group Link2'
diff --git a/content/test/data/accessibility/aria/aria-haspopup-expected-blink.txt b/content/test/data/accessibility/aria/aria-haspopup-expected-blink.txt index ff34d30..0f612968 100644 --- a/content/test/data/accessibility/aria/aria-haspopup-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-haspopup-expected-blink.txt
@@ -1,10 +1,11 @@ rootWebArea -++comboBoxMenuButton haspopup=menu -++comboBoxMenuButton -++comboBoxMenuButton haspopup=menu -++comboBoxMenuButton haspopup=listbox -++comboBoxMenuButton haspopup=grid -++comboBoxMenuButton haspopup=dialog -++comboBoxMenuButton haspopup=menu -++comboBoxMenuButton haspopup=listbox -++comboBoxMenuButton haspopup=listbox +++genericContainer ignored +++++comboBoxMenuButton haspopup=menu +++++comboBoxMenuButton +++++comboBoxMenuButton haspopup=menu +++++comboBoxMenuButton haspopup=listbox +++++comboBoxMenuButton haspopup=grid +++++comboBoxMenuButton haspopup=dialog +++++comboBoxMenuButton haspopup=menu +++++comboBoxMenuButton haspopup=listbox +++++comboBoxMenuButton haspopup=listbox
diff --git a/content/test/data/accessibility/aria/aria-heading-expected-blink.txt b/content/test/data/accessibility/aria/aria-heading-expected-blink.txt index 4006449..faad4a5 100644 --- a/content/test/data/accessibility/aria/aria-heading-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-heading-expected-blink.txt
@@ -1,23 +1,24 @@ rootWebArea -++heading name='ARIA Heading 1' hierarchicalLevel=1 -++++staticText name='ARIA Heading 1' -++++++inlineTextBox name='ARIA Heading 1' -++heading name='ARIA Heading 2' hierarchicalLevel=2 -++++staticText name='ARIA Heading 2' -++++++inlineTextBox name='ARIA Heading 2' -++heading name='ARIA Heading 3' hierarchicalLevel=3 -++++staticText name='ARIA Heading 3' -++++++inlineTextBox name='ARIA Heading 3' -++heading name='ARIA Heading 4' hierarchicalLevel=4 -++++staticText name='ARIA Heading 4' -++++++inlineTextBox name='ARIA Heading 4' -++heading name='ARIA Heading 5' hierarchicalLevel=5 -++++staticText name='ARIA Heading 5' -++++++inlineTextBox name='ARIA Heading 5' -++heading name='ARIA Heading 6' hierarchicalLevel=6 -++++staticText name='ARIA Heading 6' -++++++inlineTextBox name='ARIA Heading 6' -++genericContainer -++++heading name='Heading' hierarchicalLevel=2 -++++++staticText name='Heading' -++++++++inlineTextBox name='Heading' \ No newline at end of file +++genericContainer ignored +++++heading name='ARIA Heading 1' hierarchicalLevel=1 +++++++staticText name='ARIA Heading 1' +++++++++inlineTextBox name='ARIA Heading 1' +++++heading name='ARIA Heading 2' hierarchicalLevel=2 +++++++staticText name='ARIA Heading 2' +++++++++inlineTextBox name='ARIA Heading 2' +++++heading name='ARIA Heading 3' hierarchicalLevel=3 +++++++staticText name='ARIA Heading 3' +++++++++inlineTextBox name='ARIA Heading 3' +++++heading name='ARIA Heading 4' hierarchicalLevel=4 +++++++staticText name='ARIA Heading 4' +++++++++inlineTextBox name='ARIA Heading 4' +++++heading name='ARIA Heading 5' hierarchicalLevel=5 +++++++staticText name='ARIA Heading 5' +++++++++inlineTextBox name='ARIA Heading 5' +++++heading name='ARIA Heading 6' hierarchicalLevel=6 +++++++staticText name='ARIA Heading 6' +++++++++inlineTextBox name='ARIA Heading 6' +++++genericContainer +++++++heading name='Heading' hierarchicalLevel=2 +++++++++staticText name='Heading' +++++++++++inlineTextBox name='Heading'
diff --git a/content/test/data/accessibility/aria/aria-hidden-descendant-tabindex-change-expected-blink.txt b/content/test/data/accessibility/aria/aria-hidden-descendant-tabindex-change-expected-blink.txt index 2c2882c..a7b63615 100644 --- a/content/test/data/accessibility/aria/aria-hidden-descendant-tabindex-change-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-hidden-descendant-tabindex-change-expected-blink.txt
@@ -1,3 +1,11 @@ rootWebArea -++slider horizontal invisible name='Slider #2 now focusable' -++group name='finished' +++genericContainer ignored +++++genericContainer ignored invisible +++++++group ignored invisible +++++++++group ignored invisible +++++++++++slider horizontal ignored invisible name='Slider#1 now unfocusable' +++++genericContainer ignored invisible +++++++group ignored invisible +++++++++group ignored invisible +++++++++++slider horizontal invisible name='Slider #2 now focusable' +++++group name='finished'
diff --git a/content/test/data/accessibility/aria/aria-hidden-descendants-expected-blink.txt b/content/test/data/accessibility/aria/aria-hidden-descendants-expected-blink.txt index 608fabe..bbdee5a3 100644 --- a/content/test/data/accessibility/aria/aria-hidden-descendants-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-hidden-descendants-expected-blink.txt
@@ -1,7 +1,11 @@ rootWebArea -++slider horizontal invisible name='Slider#1 now inside hidden subtree' -++genericContainer name='Subtree starts hidden ends visible' -++++group +++genericContainer ignored +++++group ignored invisible name='Subtree starts visible ends hidden' +++++++group ignored invisible +++++++++group ignored invisible +++++++++++slider horizontal invisible name='Slider#1 now inside hidden subtree' +++++genericContainer name='Subtree starts hidden ends visible' ++++++group -++++++++slider horizontal name='Slider #2 now inside visible subtree' -++group name='finished' +++++++++group +++++++++++slider horizontal name='Slider #2 now inside visible subtree' +++++group name='finished'
diff --git a/content/test/data/accessibility/aria/aria-hidden-expected-blink.txt b/content/test/data/accessibility/aria/aria-hidden-expected-blink.txt index ecc38d1c..418ae44 100644 --- a/content/test/data/accessibility/aria/aria-hidden-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-hidden-expected-blink.txt
@@ -1,9 +1,11 @@ -rootWebArea -++genericContainer -++++staticText name='blockDisplay' -++++++inlineTextBox name='blockDisplay' -++genericContainer -++++staticText name='blockDisplay Hiddenfalse' -++++++inlineTextBox name='blockDisplay Hiddenfalse' -++genericContainer -++genericContainer invisible name='blockDisplay Hiddentruefocusable' +rootWebArea isLineBreakingObject=true +++genericContainer ignored isLineBreakingObject=true +++++genericContainer isLineBreakingObject=true +++++++staticText name='blockDisplay' +++++++++inlineTextBox name='blockDisplay' +++++genericContainer ignored invisible isLineBreakingObject=true +++++genericContainer isLineBreakingObject=true +++++++staticText name='blockDisplay Hiddenfalse' +++++++++inlineTextBox name='blockDisplay Hiddenfalse' +++++genericContainer +++++genericContainer invisible name='blockDisplay Hiddentruefocusable' isLineBreakingObject=true
diff --git a/content/test/data/accessibility/aria/aria-hidden-iframe-body-expected-blink.txt b/content/test/data/accessibility/aria/aria-hidden-iframe-body-expected-blink.txt index 6b1213e2..f53885b 100644 --- a/content/test/data/accessibility/aria/aria-hidden-iframe-body-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-hidden-iframe-body-expected-blink.txt
@@ -5,3 +5,4 @@ ++++++++genericContainer editable focusable invisible multiline richlyEditable value='1' ++++iframe focusable ++++++rootWebArea focusable +++++++++genericContainer ignored invisible
diff --git a/content/test/data/accessibility/aria/aria-hidden.html b/content/test/data/accessibility/aria/aria-hidden.html index 7b6ba88..c26d549f 100644 --- a/content/test/data/accessibility/aria/aria-hidden.html +++ b/content/test/data/accessibility/aria/aria-hidden.html
@@ -2,6 +2,7 @@ @MAC-ALLOW:AXValue* @WIN-ALLOW:hidden* @AURALINUX-ALLOW:hidden* +@BLINK-ALLOW:isLineBreakingObject* --> <html> <head>
diff --git a/content/test/data/accessibility/aria/aria-illegal-val-expected-blink.txt b/content/test/data/accessibility/aria/aria-illegal-val-expected-blink.txt index 574dab9dc..980a64b 100644 --- a/content/test/data/accessibility/aria/aria-illegal-val-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-illegal-val-expected-blink.txt
@@ -1,24 +1,26 @@ rootWebArea -++log containerLiveRelevant='additions text' containerLiveStatus='polite' name='Atomic illegal' liveRelevant='additions text' liveStatus='polite' containerLiveAtomic=true containerLiveBusy=false liveAtomic=true -++textField autoComplete='x-illegal' name='Autocomplete illegal' -++log containerLiveRelevant='additions text' containerLiveStatus='polite' name='Busy illegal' liveRelevant='additions text' liveStatus='polite' busy=true containerLiveAtomic=false containerLiveBusy=true liveAtomic=false -++treeItem name='Checked illegal' checkedState=true selected=false -++genericContainer name='Current illegal' ariaCurrentState=true -++genericContainer name='Disabled illegal' restriction=disabled -++genericContainer name='Dropeffect illegal' dropeffect=none -++treeItem expanded name='Expanded illegal' selected=false -++genericContainer name='Grabbed illegal' -++popUpButton name='Haspopup illegal' haspopup=menu -++genericContainer ariaInvalidValue='X-ILLEGAL' name='Invalid illegal' invalidState=other -++log containerLiveRelevant='additions text' containerLiveStatus='X-ILLEGAL' name='Live illegal' liveRelevant='additions text' liveStatus='X-ILLEGAL' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false -++dialog name='Modal illegal' modal=true -++textField multiline name='Multiline illegal' -++grid multiselectable name='Multiselectable illegal' -++slider horizontal name='Orientation illegal' -++toggleButton name='Pressed illegal' checkedState=true -++textField name='Readonly illegal' restriction=readOnly -++log containerLiveRelevant='X-ILLEGAL' containerLiveStatus='polite' name='Relevant illegal' liveRelevant='X-ILLEGAL' liveStatus='polite' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false -++textField required name='Required illegal' -++tree multiselectable vertical -++++treeItem name='Selected illegal' selected=true -++columnHeader name='Sort illegal' sortDirection=other selected=false +++genericContainer ignored +++++log containerLiveRelevant='additions text' containerLiveStatus='polite' name='Atomic illegal' liveRelevant='additions text' liveStatus='polite' containerLiveAtomic=true containerLiveBusy=false liveAtomic=true +++++textField autoComplete='x-illegal' name='Autocomplete illegal' +++++log containerLiveRelevant='additions text' containerLiveStatus='polite' name='Busy illegal' liveRelevant='additions text' liveStatus='polite' busy=true containerLiveAtomic=false containerLiveBusy=true liveAtomic=false +++++treeItem name='Checked illegal' checkedState=true selected=false +++++genericContainer name='Current illegal' ariaCurrentState=true +++++genericContainer name='Disabled illegal' restriction=disabled +++++genericContainer name='Dropeffect illegal' dropeffect=none +++++treeItem expanded name='Expanded illegal' selected=false +++++genericContainer name='Grabbed illegal' +++++popUpButton name='Haspopup illegal' haspopup=menu +++++genericContainer ariaInvalidValue='X-ILLEGAL' name='Invalid illegal' invalidState=other +++++log containerLiveRelevant='additions text' containerLiveStatus='X-ILLEGAL' name='Live illegal' liveRelevant='additions text' liveStatus='X-ILLEGAL' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false +++++dialog name='Modal illegal' modal=true +++++textField multiline name='Multiline illegal' +++++grid multiselectable name='Multiselectable illegal' +++++slider horizontal name='Orientation illegal' +++++toggleButton name='Pressed illegal' checkedState=true +++++textField name='Readonly illegal' restriction=readOnly +++++log containerLiveRelevant='X-ILLEGAL' containerLiveStatus='polite' name='Relevant illegal' liveRelevant='X-ILLEGAL' liveStatus='polite' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false +++++textField required name='Required illegal' +++++tree multiselectable vertical +++++++treeItem name='Selected illegal' selected=true +++++columnHeader name='Sort illegal' sortDirection=other selected=false +++++genericContainer ignored invisible name='Hidden illegal'
diff --git a/content/test/data/accessibility/aria/aria-img-expected-blink.txt b/content/test/data/accessibility/aria/aria-img-expected-blink.txt index 049fb738..3fbe9e8 100644 --- a/content/test/data/accessibility/aria/aria-img-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-img-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++image \ No newline at end of file +++genericContainer ignored +++++image
diff --git a/content/test/data/accessibility/aria/aria-insertion-deletion-expected-blink.txt b/content/test/data/accessibility/aria/aria-insertion-deletion-expected-blink.txt index 31227a5..296df33 100644 --- a/content/test/data/accessibility/aria/aria-insertion-deletion-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-insertion-deletion-expected-blink.txt
@@ -1,14 +1,15 @@ rootWebArea -++paragraph -++++staticText name='My favorite browser is ' -++++++inlineTextBox name='My favorite browser is ' -++++contentDeletion -++++++staticText name='ABC' -++++++++inlineTextBox name='ABC' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++contentInsertion -++++++staticText name='Chrome' -++++++++inlineTextBox name='Chrome' -++++staticText name='!' -++++++inlineTextBox name='!' +++genericContainer ignored +++++paragraph +++++++staticText name='My favorite browser is ' +++++++++inlineTextBox name='My favorite browser is ' +++++++contentDeletion +++++++++staticText name='ABC' +++++++++++inlineTextBox name='ABC' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++contentInsertion +++++++++staticText name='Chrome' +++++++++++inlineTextBox name='Chrome' +++++++staticText name='!' +++++++++inlineTextBox name='!'
diff --git a/content/test/data/accessibility/aria/aria-invalid-expected-blink.txt b/content/test/data/accessibility/aria/aria-invalid-expected-blink.txt index 7d06cbe..b9ffb4084 100644 --- a/content/test/data/accessibility/aria/aria-invalid-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-invalid-expected-blink.txt
@@ -1,37 +1,38 @@ rootWebArea -++genericContainer invalidState=true -++++staticText name='invalid=true' -++++++inlineTextBox name='invalid=true' -++textField value='An eror via invalid=spelling' -++++staticText name='An ' -++++++inlineTextBox name='An ' -++++genericContainer ariaInvalidValue='spelling' invalidState=other -++++++staticText name='eror' markerTypes=1 markerStarts=0 markerEnds=4 -++++++++inlineTextBox name='eror' -++++staticText name=' via invalid=spelling' -++++++inlineTextBox name=' via invalid=spelling' -++textField value='An errors via invalid=grammar' -++++staticText name='An ' -++++++inlineTextBox name='An ' -++++genericContainer ariaInvalidValue='grammar' invalidState=other -++++++staticText name='errors' markerTypes=2 markerStarts=0 markerEnds=6 -++++++++inlineTextBox name='errors' -++++staticText name=' via invalid=grammar' -++++++inlineTextBox name=' via invalid=grammar' -++genericContainer invalidState=false -++++staticText name='invalid=false' -++++++inlineTextBox name='invalid=false' -++genericContainer -++++staticText name='invalid=<empty>' -++++++inlineTextBox name='invalid=<empty>' -++genericContainer -++++staticText name='invalid=<default>' -++++++inlineTextBox name='invalid=<default>' -++genericContainer ariaInvalidValue='unknown' invalidState=other -++++staticText name='invalid=unknown' -++++++inlineTextBox name='invalid=unknown' -++form -++++textField value='1234' invalidState=true -++++++genericContainer -++++++++staticText name='1234' -++++++++++inlineTextBox name='1234' \ No newline at end of file +++genericContainer ignored +++++genericContainer invalidState=true +++++++staticText name='invalid=true' +++++++++inlineTextBox name='invalid=true' +++++textField value='An eror via invalid=spelling' +++++++staticText name='An ' +++++++++inlineTextBox name='An ' +++++++genericContainer ariaInvalidValue='spelling' invalidState=other +++++++++staticText name='eror' markerTypes=1 markerStarts=0 markerEnds=4 +++++++++++inlineTextBox name='eror' +++++++staticText name=' via invalid=spelling' +++++++++inlineTextBox name=' via invalid=spelling' +++++textField value='An errors via invalid=grammar' +++++++staticText name='An ' +++++++++inlineTextBox name='An ' +++++++genericContainer ariaInvalidValue='grammar' invalidState=other +++++++++staticText name='errors' markerTypes=2 markerStarts=0 markerEnds=6 +++++++++++inlineTextBox name='errors' +++++++staticText name=' via invalid=grammar' +++++++++inlineTextBox name=' via invalid=grammar' +++++genericContainer invalidState=false +++++++staticText name='invalid=false' +++++++++inlineTextBox name='invalid=false' +++++genericContainer +++++++staticText name='invalid=<empty>' +++++++++inlineTextBox name='invalid=<empty>' +++++genericContainer +++++++staticText name='invalid=<default>' +++++++++inlineTextBox name='invalid=<default>' +++++genericContainer ariaInvalidValue='unknown' invalidState=other +++++++staticText name='invalid=unknown' +++++++++inlineTextBox name='invalid=unknown' +++++form +++++++textField value='1234' invalidState=true +++++++++genericContainer +++++++++++staticText name='1234' +++++++++++++inlineTextBox name='1234'
diff --git a/content/test/data/accessibility/aria/aria-label-expected-blink.txt b/content/test/data/accessibility/aria/aria-label-expected-blink.txt index 5850333..8510570 100644 --- a/content/test/data/accessibility/aria/aria-label-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-label-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++checkBox name='aria label' checkedState=false \ No newline at end of file +++genericContainer ignored +++++checkBox name='aria label' checkedState=false
diff --git a/content/test/data/accessibility/aria/aria-labelledby-heading-expected-blink.txt b/content/test/data/accessibility/aria/aria-labelledby-heading-expected-blink.txt index 07b3bf6..ddb8923 100644 --- a/content/test/data/accessibility/aria/aria-labelledby-heading-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-labelledby-heading-expected-blink.txt
@@ -1,6 +1,7 @@ rootWebArea -++textField name='h2' -++++genericContainer -++heading name='h2' hierarchicalLevel=2 -++++staticText name='h2' -++++++inlineTextBox name='h2' \ No newline at end of file +++genericContainer ignored +++++textField name='h2' +++++++genericContainer +++++heading name='h2' hierarchicalLevel=2 +++++++staticText name='h2' +++++++++inlineTextBox name='h2'
diff --git a/content/test/data/accessibility/aria/aria-labelledby-updates-expected-blink.txt b/content/test/data/accessibility/aria/aria-labelledby-updates-expected-blink.txt index fed8f49..799a083 100644 --- a/content/test/data/accessibility/aria/aria-labelledby-updates-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-labelledby-updates-expected-blink.txt
@@ -1,2 +1,4 @@ rootWebArea -++main name='oranges' +++genericContainer ignored +++++main name='oranges' +++++paragraph ignored invisible
diff --git a/content/test/data/accessibility/aria/aria-level-expected-blink.txt b/content/test/data/accessibility/aria/aria-level-expected-blink.txt index 6b159f8..bc2eb1d 100644 --- a/content/test/data/accessibility/aria/aria-level-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-level-expected-blink.txt
@@ -1,42 +1,43 @@ rootWebArea -++heading name='Level 2' hierarchicalLevel=2 -++++staticText name='Level 2' -++++++inlineTextBox name='Level 2' -++heading name='Level 9' hierarchicalLevel=9 -++++staticText name='Level 9' -++++++inlineTextBox name='Level 9' -++heading name='Level 1' hierarchicalLevel=1 -++++staticText name='Level 1' -++++++inlineTextBox name='Level 1' -++heading name='Level 3' hierarchicalLevel=3 -++++staticText name='Level 3' -++++++inlineTextBox name='Level 3' -++heading name='Level 3' hierarchicalLevel=3 -++++staticText name='Level 3' -++++++inlineTextBox name='Level 3' -++heading name='Level 4' hierarchicalLevel=4 -++++staticText name='Level 4' -++++++inlineTextBox name='Level 4' -++heading name='Level 5' hierarchicalLevel=5 -++++staticText name='Level 5' -++++++inlineTextBox name='Level 5' -++tree -++++treeItem name='Tree item at level 1' hierarchicalLevel=1 selected=false -++++++staticText name='Tree item at level 1' -++++++++inlineTextBox name='Tree item at level 1' -++++++group -++++++++treeItem name='Tree item at level 2' hierarchicalLevel=2 selected=false -++++++++++staticText name='Tree item at level 2' -++++++++++++inlineTextBox name='Tree item at level 2' -++++treeItem name='Tree item at level 3' hierarchicalLevel=3 selected=false -++++++staticText name='Tree item at level 3' -++++++++inlineTextBox name='Tree item at level 3' -++treeGrid -++++row hierarchicalLevel=1 selected=false -++++++cell name='Cell at level 1' selected=false -++++++++staticText name='Cell at level 1' -++++++++++inlineTextBox name='Cell at level 1' -++++row hierarchicalLevel=2 selected=false -++++++cell name='Cell at level 2' selected=false -++++++++staticText name='Cell at level 2' -++++++++++inlineTextBox name='Cell at level 2' +++genericContainer ignored +++++heading name='Level 2' hierarchicalLevel=2 +++++++staticText name='Level 2' +++++++++inlineTextBox name='Level 2' +++++heading name='Level 9' hierarchicalLevel=9 +++++++staticText name='Level 9' +++++++++inlineTextBox name='Level 9' +++++heading name='Level 1' hierarchicalLevel=1 +++++++staticText name='Level 1' +++++++++inlineTextBox name='Level 1' +++++heading name='Level 3' hierarchicalLevel=3 +++++++staticText name='Level 3' +++++++++inlineTextBox name='Level 3' +++++heading name='Level 3' hierarchicalLevel=3 +++++++staticText name='Level 3' +++++++++inlineTextBox name='Level 3' +++++heading name='Level 4' hierarchicalLevel=4 +++++++staticText name='Level 4' +++++++++inlineTextBox name='Level 4' +++++heading name='Level 5' hierarchicalLevel=5 +++++++staticText name='Level 5' +++++++++inlineTextBox name='Level 5' +++++tree +++++++treeItem name='Tree item at level 1' hierarchicalLevel=1 selected=false +++++++++staticText name='Tree item at level 1' +++++++++++inlineTextBox name='Tree item at level 1' +++++++++group +++++++++++treeItem name='Tree item at level 2' hierarchicalLevel=2 selected=false +++++++++++++staticText name='Tree item at level 2' +++++++++++++++inlineTextBox name='Tree item at level 2' +++++++treeItem name='Tree item at level 3' hierarchicalLevel=3 selected=false +++++++++staticText name='Tree item at level 3' +++++++++++inlineTextBox name='Tree item at level 3' +++++treeGrid +++++++row hierarchicalLevel=1 selected=false +++++++++cell name='Cell at level 1' selected=false +++++++++++staticText name='Cell at level 1' +++++++++++++inlineTextBox name='Cell at level 1' +++++++row hierarchicalLevel=2 selected=false +++++++++cell name='Cell at level 2' selected=false +++++++++++staticText name='Cell at level 2' +++++++++++++inlineTextBox name='Cell at level 2'
diff --git a/content/test/data/accessibility/aria/aria-list-expected-blink.txt b/content/test/data/accessibility/aria/aria-list-expected-blink.txt index 50b8b63..baf0064 100644 --- a/content/test/data/accessibility/aria/aria-list-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-list-expected-blink.txt
@@ -1,11 +1,12 @@ rootWebArea -++list -++++listItem name='1' -++++++staticText name='Item 1' -++++++++inlineTextBox name='Item 1' -++++listItem name='2' -++++++staticText name='Item 2' -++++++++inlineTextBox name='Item 2' -++++listItem name='3' -++++++staticText name='Item 3' -++++++++inlineTextBox name='Item 3' \ No newline at end of file +++genericContainer ignored +++++list +++++++listItem name='1' +++++++++staticText name='Item 1' +++++++++++inlineTextBox name='Item 1' +++++++listItem name='2' +++++++++staticText name='Item 2' +++++++++++inlineTextBox name='Item 2' +++++++listItem name='3' +++++++++staticText name='Item 3' +++++++++++inlineTextBox name='Item 3'
diff --git a/content/test/data/accessibility/aria/aria-listbox-activedescendant-expected-blink.txt b/content/test/data/accessibility/aria/aria-listbox-activedescendant-expected-blink.txt index e59f2d6..4edb2873 100644 --- a/content/test/data/accessibility/aria/aria-listbox-activedescendant-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-listbox-activedescendant-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++listBox activedescendantId=listBoxOption -++++listBoxOption name='1' selected=false -++++listBoxOption name='2' selected=false -++++listBoxOption name='3' selected=true \ No newline at end of file +++genericContainer ignored +++++listBox activedescendantId=listBoxOption +++++++listBoxOption name='1' selected=false +++++++listBoxOption name='2' selected=false +++++++listBoxOption name='3' selected=true
diff --git a/content/test/data/accessibility/aria/aria-listbox-aria-selected-expected-blink.txt b/content/test/data/accessibility/aria/aria-listbox-aria-selected-expected-blink.txt index dfa19798..db16ef389 100644 --- a/content/test/data/accessibility/aria/aria-listbox-aria-selected-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-listbox-aria-selected-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++listBox multiselectable activedescendantId=listBoxOption -++++listBoxOption name='Item 1' selected=false -++++listBoxOption name='Item 2' selected=false -++++listBoxOption name='Item 3' selected=false -++++listBoxOption name='Item 4' selected=true -++++listBoxOption name='Item 5' selected=true +++genericContainer ignored +++++listBox multiselectable activedescendantId=listBoxOption +++++++listBoxOption name='Item 1' selected=false +++++++listBoxOption name='Item 2' selected=false +++++++listBoxOption name='Item 3' selected=false +++++++listBoxOption name='Item 4' selected=true +++++++listBoxOption name='Item 5' selected=true
diff --git a/content/test/data/accessibility/aria/aria-listbox-childfocus-expected-blink.txt b/content/test/data/accessibility/aria/aria-listbox-childfocus-expected-blink.txt index 62c3abce..7654939 100644 --- a/content/test/data/accessibility/aria/aria-listbox-childfocus-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-listbox-childfocus-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++listBox -++++listBoxOption name='1' selected=false -++++listBoxOption name='2' selected=true -++++listBoxOption name='3' selected=false \ No newline at end of file +++genericContainer ignored +++++listBox +++++++listBoxOption name='1' selected=false +++++++listBoxOption name='2' selected=true +++++++listBoxOption name='3' selected=false
diff --git a/content/test/data/accessibility/aria/aria-listbox-expected-blink.txt b/content/test/data/accessibility/aria/aria-listbox-expected-blink.txt index dc833e6..69652b3 100644 --- a/content/test/data/accessibility/aria/aria-listbox-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-listbox-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++listBox setSize=4 -++++listBoxOption name='Item 1' setSize=4 posInSet=1 selected=false -++++listBoxOption name='Item 2' setSize=4 posInSet=2 selected=false -++++splitter horizontal -++++listBoxOption name='Second group item 1' setSize=4 posInSet=3 selected=false -++++listBoxOption name='Second group item 2' setSize=4 posInSet=4 selected=false +++genericContainer ignored +++++listBox setSize=4 +++++++listBoxOption name='Item 1' setSize=4 posInSet=1 selected=false +++++++listBoxOption name='Item 2' setSize=4 posInSet=2 selected=false +++++++splitter horizontal +++++++listBoxOption name='Second group item 1' setSize=4 posInSet=3 selected=false +++++++listBoxOption name='Second group item 2' setSize=4 posInSet=4 selected=false
diff --git a/content/test/data/accessibility/aria/aria-listitem-expected-blink.txt b/content/test/data/accessibility/aria/aria-listitem-expected-blink.txt index 2ae18cf..8f38469 100644 --- a/content/test/data/accessibility/aria/aria-listitem-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-listitem-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++list -++++listItem name='1' -++++++staticText name='Item 1' -++++++++inlineTextBox name='Item 1' -++++listItem name='2' -++++++staticText name='Item 2' -++++++++inlineTextBox name='Item 2' \ No newline at end of file +++genericContainer ignored +++++list +++++++listItem name='1' +++++++++staticText name='Item 1' +++++++++++inlineTextBox name='Item 1' +++++++listItem name='2' +++++++++staticText name='Item 2' +++++++++++inlineTextBox name='Item 2'
diff --git a/content/test/data/accessibility/aria/aria-live-expected-blink.txt b/content/test/data/accessibility/aria/aria-live-expected-blink.txt index 9a282e3f..861d23e973 100644 --- a/content/test/data/accessibility/aria/aria-live-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-live-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++marquee containerLiveRelevant='additions text' containerLiveStatus='off' liveRelevant='additions text' liveStatus='off' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false -++marquee containerLiveRelevant='additions text' containerLiveStatus='polite' liveRelevant='additions text' liveStatus='polite' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false -++marquee containerLiveRelevant='additions text' containerLiveStatus='assertive' liveRelevant='additions text' liveStatus='assertive' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false -++alert containerLiveRelevant='additions text' containerLiveStatus='assertive' liveRelevant='additions text' liveStatus='assertive' containerLiveAtomic=true containerLiveBusy=false liveAtomic=true \ No newline at end of file +++genericContainer ignored +++++marquee containerLiveRelevant='additions text' containerLiveStatus='off' liveRelevant='additions text' liveStatus='off' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false +++++marquee containerLiveRelevant='additions text' containerLiveStatus='polite' liveRelevant='additions text' liveStatus='polite' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false +++++marquee containerLiveRelevant='additions text' containerLiveStatus='assertive' liveRelevant='additions text' liveStatus='assertive' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false +++++alert containerLiveRelevant='additions text' containerLiveStatus='assertive' liveRelevant='additions text' liveStatus='assertive' containerLiveAtomic=true containerLiveBusy=false liveAtomic=true
diff --git a/content/test/data/accessibility/aria/aria-live-nested-expected-blink.txt b/content/test/data/accessibility/aria/aria-live-nested-expected-blink.txt index b7f43c61..08845dc 100644 --- a/content/test/data/accessibility/aria/aria-live-nested-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-live-nested-expected-blink.txt
@@ -1,13 +1,15 @@ rootWebArea -++group containerLiveStatus='polite' liveStatus='polite' -++++group containerLiveStatus='off' liveStatus='off' -++++++staticText containerLiveStatus='off' name='Nested - off' -++++++++inlineTextBox name='Nested - off' -++group containerLiveStatus='off' liveStatus='off' +++genericContainer ignored ++++group containerLiveStatus='polite' liveStatus='polite' -++++++staticText containerLiveStatus='polite' name='Nested - polite' -++++++++inlineTextBox name='Nested - polite' -++group containerLiveStatus='polite' liveStatus='polite' -++++group containerLiveStatus='assertive' liveStatus='assertive' -++++++staticText containerLiveStatus='assertive' name='Nested - assertive' -++++++++inlineTextBox name='Nested - assertive' \ No newline at end of file +++++++group containerLiveStatus='off' liveStatus='off' +++++++++staticText containerLiveStatus='off' name='Nested - off' +++++++++++inlineTextBox containerLiveStatus='off' name='Nested - off' +++++group containerLiveStatus='off' liveStatus='off' +++++++group containerLiveStatus='polite' liveStatus='polite' +++++++++staticText containerLiveStatus='polite' name='Nested - polite' +++++++++++inlineTextBox containerLiveStatus='polite' name='Nested - polite' +++++group containerLiveStatus='polite' liveStatus='polite' +++++++genericContainer ignored containerLiveStatus='polite' +++++++++group containerLiveStatus='assertive' liveStatus='assertive' +++++++++++staticText containerLiveStatus='assertive' name='Nested - assertive' +++++++++++++inlineTextBox name='Nested - assertive'
diff --git a/content/test/data/accessibility/aria/aria-live-with-content-expected-blink.txt b/content/test/data/accessibility/aria/aria-live-with-content-expected-blink.txt index 929cc74..5d8cb80f 100644 --- a/content/test/data/accessibility/aria/aria-live-with-content-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-live-with-content-expected-blink.txt
@@ -1,10 +1,11 @@ rootWebArea -++marquee containerLiveRelevant='additions text' containerLiveStatus='off' liveRelevant='additions text' liveStatus='off' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false -++++staticText containerLiveRelevant='additions text' containerLiveStatus='off' name='Off' liveRelevant='additions text' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false -++++++inlineTextBox name='Off' -++marquee containerLiveRelevant='additions text' containerLiveStatus='polite' liveRelevant='additions text' liveStatus='polite' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false -++++staticText containerLiveRelevant='additions text' containerLiveStatus='polite' name='Polite' liveRelevant='additions text' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false -++++++inlineTextBox name='Polite' -++marquee containerLiveRelevant='additions text' containerLiveStatus='assertive' liveRelevant='additions text' liveStatus='assertive' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false -++++staticText containerLiveRelevant='additions text' containerLiveStatus='assertive' name='Assertive' liveRelevant='additions text' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false -++++++inlineTextBox name='Assertive' \ No newline at end of file +++genericContainer ignored +++++marquee containerLiveRelevant='additions text' containerLiveStatus='off' liveRelevant='additions text' liveStatus='off' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false +++++++staticText containerLiveRelevant='additions text' containerLiveStatus='off' name='Off' liveRelevant='additions text' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false +++++++++inlineTextBox name='Off' +++++marquee containerLiveRelevant='additions text' containerLiveStatus='polite' liveRelevant='additions text' liveStatus='polite' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false +++++++staticText containerLiveRelevant='additions text' containerLiveStatus='polite' name='Polite' liveRelevant='additions text' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false +++++++++inlineTextBox name='Polite' +++++marquee containerLiveRelevant='additions text' containerLiveStatus='assertive' liveRelevant='additions text' liveStatus='assertive' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false +++++++staticText containerLiveRelevant='additions text' containerLiveStatus='assertive' name='Assertive' liveRelevant='additions text' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false +++++++++inlineTextBox name='Assertive'
diff --git a/content/test/data/accessibility/aria/aria-log-expected-blink.txt b/content/test/data/accessibility/aria/aria-log-expected-blink.txt index 34feffd..56f12e4 100644 --- a/content/test/data/accessibility/aria/aria-log-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-log-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++log \ No newline at end of file +++genericContainer ignored +++++log
diff --git a/content/test/data/accessibility/aria/aria-main-expected-blink.txt b/content/test/data/accessibility/aria/aria-main-expected-blink.txt index b19eee86..816e7c5 100644 --- a/content/test/data/accessibility/aria/aria-main-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-main-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++main \ No newline at end of file +++genericContainer ignored +++++main
diff --git a/content/test/data/accessibility/aria/aria-marquee-expected-blink.txt b/content/test/data/accessibility/aria/aria-marquee-expected-blink.txt index 795ccf19..50b3875 100644 --- a/content/test/data/accessibility/aria/aria-marquee-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-marquee-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++marquee containerLiveRelevant='additions text' containerLiveStatus='off' liveRelevant='additions text' liveStatus='off' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false -++marquee containerLiveRelevant='additions text' containerLiveStatus='polite' liveRelevant='additions text' liveStatus='polite' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false -++marquee containerLiveRelevant='additions text' containerLiveStatus='assertive' liveRelevant='additions text' liveStatus='assertive' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false \ No newline at end of file +++genericContainer ignored +++++marquee containerLiveRelevant='additions text' containerLiveStatus='off' liveRelevant='additions text' liveStatus='off' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false +++++marquee containerLiveRelevant='additions text' containerLiveStatus='polite' liveRelevant='additions text' liveStatus='polite' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false +++++marquee containerLiveRelevant='additions text' containerLiveStatus='assertive' liveRelevant='additions text' liveStatus='assertive' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false
diff --git a/content/test/data/accessibility/aria/aria-math-expected-blink.txt b/content/test/data/accessibility/aria/aria-math-expected-blink.txt index 0899533b..b75d17b9 100644 --- a/content/test/data/accessibility/aria/aria-math-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-math-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++math \ No newline at end of file +++genericContainer ignored +++++math
diff --git a/content/test/data/accessibility/aria/aria-menu-expected-blink.txt b/content/test/data/accessibility/aria/aria-menu-expected-blink.txt index 819d35a..47c0c6a 100644 --- a/content/test/data/accessibility/aria/aria-menu-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-menu-expected-blink.txt
@@ -1,10 +1,11 @@ rootWebArea -++menuBar horizontal -++++menuItem name='File' controlsIds=menu -++++menuItem name='Edit' -++++menuItem name='View' -++menu name='File' -++++menuItem name='New' -++++menuItem name='Open' -++++menuItem name='Save' -++++menuItem name='Quit' +++genericContainer ignored +++++menuBar horizontal +++++++menuItem name='File' controlsIds=menu +++++++menuItem name='Edit' +++++++menuItem name='View' +++++menu name='File' +++++++menuItem name='New' +++++++menuItem name='Open' +++++++menuItem name='Save' +++++++menuItem name='Quit'
diff --git a/content/test/data/accessibility/aria/aria-menubar-expected-blink.txt b/content/test/data/accessibility/aria/aria-menubar-expected-blink.txt index 0d1724a..d483f40 100644 --- a/content/test/data/accessibility/aria/aria-menubar-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-menubar-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++menuBar horizontal -++++menuItem name='File' -++++menuItem name='Edit' -++++menuItem name='View' \ No newline at end of file +++genericContainer ignored +++++menuBar horizontal +++++++menuItem name='File' +++++++menuItem name='Edit' +++++++menuItem name='View'
diff --git a/content/test/data/accessibility/aria/aria-menuitem-expected-blink.txt b/content/test/data/accessibility/aria/aria-menuitem-expected-blink.txt index a0c5973..af43935e 100644 --- a/content/test/data/accessibility/aria/aria-menuitem-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-menuitem-expected-blink.txt
@@ -1,11 +1,12 @@ rootWebArea -++menu -++++menuItem name='File' -++++menuItem name='Edit' -++++menuItem name='Complex menuitem' -++++++staticText name='Complex ' -++++++++inlineTextBox name='Complex ' -++++++textField -++++++++genericContainer -++++++staticText name=' menuitem' -++++++++inlineTextBox name=' menuitem' \ No newline at end of file +++genericContainer ignored +++++menu +++++++menuItem name='File' +++++++menuItem name='Edit' +++++++menuItem name='Complex menuitem' +++++++++staticText name='Complex ' +++++++++++inlineTextBox name='Complex ' +++++++++textField +++++++++++genericContainer +++++++++staticText name=' menuitem' +++++++++++inlineTextBox name=' menuitem'
diff --git a/content/test/data/accessibility/aria/aria-menuitemcheckbox-expected-blink.txt b/content/test/data/accessibility/aria/aria-menuitemcheckbox-expected-blink.txt index 08e65f8..6a589b2 100644 --- a/content/test/data/accessibility/aria/aria-menuitemcheckbox-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-menuitemcheckbox-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++menu -++++menuItemCheckBox name='Menu item 1' checkedState=false -++++menuItemCheckBox name='Menu item 2' checkedState=true -++++menuItemCheckBox name='Menu item 3' checkedState=mixed \ No newline at end of file +++genericContainer ignored +++++menu +++++++menuItemCheckBox name='Menu item 1' checkedState=false +++++++menuItemCheckBox name='Menu item 2' checkedState=true +++++++menuItemCheckBox name='Menu item 3' checkedState=mixed
diff --git a/content/test/data/accessibility/aria/aria-menuitemradio-expected-blink.txt b/content/test/data/accessibility/aria/aria-menuitemradio-expected-blink.txt index 76ed6c4..e5d4c17 100644 --- a/content/test/data/accessibility/aria/aria-menuitemradio-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-menuitemradio-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++menu -++++menuItemRadio name='Menu item 1' checkedState=false -++++menuItemRadio name='Menu item 2' checkedState=true -++++menuItemRadio name='Menu item 3' checkedState=mixed \ No newline at end of file +++genericContainer ignored +++++menu +++++++menuItemRadio name='Menu item 1' checkedState=false +++++++menuItemRadio name='Menu item 2' checkedState=true +++++++menuItemRadio name='Menu item 3' checkedState=mixed
diff --git a/content/test/data/accessibility/aria/aria-meter-expected-blink.txt b/content/test/data/accessibility/aria/aria-meter-expected-blink.txt index 9c57ede..46aee75d 100644 --- a/content/test/data/accessibility/aria/aria-meter-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-meter-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++meter name='funding' value='half-way' valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 -++++staticText name='We're getting there!' -++++++inlineTextBox name='We're getting there!' -++meter name='funding' valueForRange=10.00 minValueForRange=0.00 maxValueForRange=100.00 -++++staticText name='Not so great.' -++++++inlineTextBox name='Not so great.' +++genericContainer ignored +++++meter name='funding' value='half-way' valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 +++++++staticText name='We're getting there!' +++++++++inlineTextBox name='We're getting there!' +++++meter name='funding' valueForRange=10.00 minValueForRange=0.00 maxValueForRange=100.00 +++++++staticText name='Not so great.' +++++++++inlineTextBox name='Not so great.'
diff --git a/content/test/data/accessibility/aria/aria-modal-expected-blink.txt b/content/test/data/accessibility/aria/aria-modal-expected-blink.txt index 2fd0f1b..40993fcd 100644 --- a/content/test/data/accessibility/aria/aria-modal-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-modal-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++dialog modal=false -++++staticText name='Nonmodal' -++++++inlineTextBox name='Nonmodal' -++dialog modal=true -++++staticText name='Modal' -++++++inlineTextBox name='Modal' +++genericContainer ignored +++++dialog modal=false +++++++staticText name='Nonmodal' +++++++++inlineTextBox name='Nonmodal' +++++dialog modal=true +++++++staticText name='Modal' +++++++++inlineTextBox name='Modal'
diff --git a/content/test/data/accessibility/aria/aria-multiline-expected-blink.txt b/content/test/data/accessibility/aria/aria-multiline-expected-blink.txt index 37f1547..ba5071fc 100644 --- a/content/test/data/accessibility/aria/aria-multiline-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-multiline-expected-blink.txt
@@ -1,3 +1,4 @@ rootWebArea -++textField -++textField multiline +++genericContainer ignored +++++textField +++++textField multiline
diff --git a/content/test/data/accessibility/aria/aria-multiselectable-expected-blink.txt b/content/test/data/accessibility/aria/aria-multiselectable-expected-blink.txt index 4d3b48c6..eb1bd3e 100644 --- a/content/test/data/accessibility/aria/aria-multiselectable-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-multiselectable-expected-blink.txt
@@ -1,3 +1,4 @@ rootWebArea -++listBox multiselectable -++listBox \ No newline at end of file +++genericContainer ignored +++++listBox multiselectable +++++listBox
diff --git a/content/test/data/accessibility/aria/aria-navigation-expected-blink.txt b/content/test/data/accessibility/aria/aria-navigation-expected-blink.txt index 30ab57a..0e3403b 100644 --- a/content/test/data/accessibility/aria/aria-navigation-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-navigation-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++navigation \ No newline at end of file +++genericContainer ignored +++++navigation
diff --git a/content/test/data/accessibility/aria/aria-none-expected-blink.txt b/content/test/data/accessibility/aria/aria-none-expected-blink.txt index 665640d..ee4ddd6b 100644 --- a/content/test/data/accessibility/aria/aria-none-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-none-expected-blink.txt
@@ -1,3 +1,5 @@ rootWebArea -++staticText name='With aria-role none' -++++inlineTextBox name='With aria-role none' \ No newline at end of file +++genericContainer ignored +++++none ignored +++++++staticText name='With aria-role none' +++++++++inlineTextBox name='With aria-role none'
diff --git a/content/test/data/accessibility/aria/aria-note-expected-blink.txt b/content/test/data/accessibility/aria/aria-note-expected-blink.txt index f7f65cf..4e230d5 100644 --- a/content/test/data/accessibility/aria/aria-note-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-note-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++note \ No newline at end of file +++genericContainer ignored +++++note
diff --git a/content/test/data/accessibility/aria/aria-option-expected-blink.txt b/content/test/data/accessibility/aria/aria-option-expected-blink.txt index e4ddff75..5a9a5023 100644 --- a/content/test/data/accessibility/aria/aria-option-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-option-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea focusable -++listBox -++++listBoxOption focusable name='option 1' selected=false -++++listBoxOption focusable name='label 2' selected=false \ No newline at end of file +++genericContainer ignored +++++listBox +++++++listBoxOption focusable name='option 1' selected=false +++++++listBoxOption focusable name='label 2' selected=false
diff --git a/content/test/data/accessibility/aria/aria-orientation-expected-blink.txt b/content/test/data/accessibility/aria/aria-orientation-expected-blink.txt index e400131..86567fc 100644 --- a/content/test/data/accessibility/aria/aria-orientation-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-orientation-expected-blink.txt
@@ -1,37 +1,38 @@ rootWebArea -++comboBoxGrouping -++comboBoxGrouping horizontal -++comboBoxGrouping vertical -++listBox vertical -++listBox horizontal -++listBox vertical -++menu vertical -++menu horizontal -++menu vertical -++menuBar horizontal -++menuBar horizontal -++menuBar vertical -++radioGroup -++radioGroup horizontal -++radioGroup vertical -++scrollBar vertical valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 -++scrollBar horizontal valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 -++scrollBar vertical valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 -++slider horizontal valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 -++slider horizontal valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 -++slider vertical valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 -++splitter horizontal -++splitter horizontal -++splitter vertical -++tabList horizontal -++tabList horizontal -++tabList vertical -++toolbar horizontal -++toolbar horizontal -++toolbar vertical -++tree vertical -++tree horizontal -++tree vertical -++treeGrid -++treeGrid horizontal -++treeGrid vertical +++genericContainer ignored +++++comboBoxGrouping +++++comboBoxGrouping horizontal +++++comboBoxGrouping vertical +++++listBox vertical +++++listBox horizontal +++++listBox vertical +++++menu vertical +++++menu horizontal +++++menu vertical +++++menuBar horizontal +++++menuBar horizontal +++++menuBar vertical +++++radioGroup +++++radioGroup horizontal +++++radioGroup vertical +++++scrollBar vertical valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 +++++scrollBar horizontal valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 +++++scrollBar vertical valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 +++++slider horizontal valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 +++++slider horizontal valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 +++++slider vertical valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00 +++++splitter horizontal +++++splitter horizontal +++++splitter vertical +++++tabList horizontal +++++tabList horizontal +++++tabList vertical +++++toolbar horizontal +++++toolbar horizontal +++++toolbar vertical +++++tree vertical +++++tree horizontal +++++tree vertical +++++treeGrid +++++treeGrid horizontal +++++treeGrid vertical
diff --git a/content/test/data/accessibility/aria/aria-owns-expected-blink.txt b/content/test/data/accessibility/aria/aria-owns-expected-blink.txt index 580d01f..cc61ff95 100644 --- a/content/test/data/accessibility/aria/aria-owns-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-owns-expected-blink.txt
@@ -1,17 +1,20 @@ rootWebArea -++list -++++listItem -++++++listMarker name='• ' -++++++genericContainer -++++++++staticText name='One' -++++++++++inlineTextBox name='One' -++++listItem -++++++listMarker name='• ' -++++++genericContainer -++++++++staticText name='Two' -++++++++++inlineTextBox name='Two' -++listItem -++++listMarker name='• ' -++++genericContainer -++++++staticText name='Three' -++++++++inlineTextBox name='Three' +++genericContainer ignored +++++list +++++++listItem +++++++++listMarker name='• ' +++++++++genericContainer +++++++++++staticText name='One' +++++++++++++inlineTextBox name='One' +++++++listItem +++++++++listMarker name='• ' +++++++++genericContainer +++++++++++staticText name='Two' +++++++++++++inlineTextBox name='Two' +++++genericContainer ignored +++++genericContainer ignored +++++++listItem +++++++++listMarker name='• ' +++++++++genericContainer +++++++++++staticText name='Three' +++++++++++++inlineTextBox name='Three'
diff --git a/content/test/data/accessibility/aria/aria-owns-list-expected-blink.txt b/content/test/data/accessibility/aria/aria-owns-list-expected-blink.txt index 624735ea..b77562b 100644 --- a/content/test/data/accessibility/aria/aria-owns-list-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-owns-list-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++list pageSize=(400, 400) -++++listItem pageSize=(400, 200) -++++++staticText name='One' -++++++++inlineTextBox name='One' -++++listItem pageSize=(400, 200) -++++++staticText name='Two' -++++++++inlineTextBox name='Two' +++genericContainer ignored +++++list pageSize=(400, 400) +++++++listItem pageSize=(400, 200) +++++++++staticText name='One' +++++++++++inlineTextBox name='One' +++++++listItem pageSize=(400, 200) +++++++++staticText name='Two' +++++++++++inlineTextBox name='Two'
diff --git a/content/test/data/accessibility/aria/aria-posinset-expected-blink.txt b/content/test/data/accessibility/aria/aria-posinset-expected-blink.txt index b3a039bb..bc3d335 100644 --- a/content/test/data/accessibility/aria/aria-posinset-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-posinset-expected-blink.txt
@@ -1,49 +1,50 @@ rootWebArea -++article setSize=0 posInSet=0 -++++staticText name='This is an ARIA article 1.' -++++++inlineTextBox name='This is an ARIA article 1.' -++article setSize=0 posInSet=0 -++++staticText name='This is an ARIA article 2.' -++++++inlineTextBox name='This is an ARIA article 2.' -++listBox setSize=2 -++++listBoxOption name='Item 1' setSize=2 posInSet=1 selected=false -++++listBoxOption name='Item 2' setSize=2 posInSet=2 selected=false -++listBox setSize=2 -++++listBoxOption name='Item 1' setSize=2 posInSet=1 selected=false -++++listBoxOption name='Item 2' setSize=2 posInSet=2 selected=false -++form -++++radioButton setSize=4 posInSet=3 checkedState=false -++++staticText name='1' -++++++inlineTextBox name='1' -++++lineBreak name='<newline>' -++++++inlineTextBox name='<newline>' -++++radioButton setSize=4 posInSet=4 checkedState=false -++++staticText name='2' -++++++inlineTextBox name='2' -++radioButton setSize=2 posInSet=1 checkedState=false -++staticText name='Apple' -++++inlineTextBox name='Apple' -++lineBreak name='<newline>' -++++inlineTextBox name='<newline>' -++radioButton setSize=2 posInSet=2 checkedState=false -++staticText name='Banana' -++++inlineTextBox name='Banana' -++group name='Cake' setSize=0 -++++legend -++++++staticText name='Cake' -++++++++inlineTextBox name='Cake' -++++radioButton name='Chiffon cakes' setSize=2 posInSet=1 checkedState=true -++++lineBreak name='<newline>' -++++++inlineTextBox name='<newline>' -++++radioButton name='Chocolate cakes' setSize=2 posInSet=2 checkedState=false -++form -++++paragraph -++++++button name='changedFromRadio' -++++++labelText -++++++++staticText name='red' -++++++++++inlineTextBox name='red' +++genericContainer ignored +++++article setSize=0 posInSet=0 +++++++staticText name='This is an ARIA article 1.' +++++++++inlineTextBox name='This is an ARIA article 1.' +++++article setSize=0 posInSet=0 +++++++staticText name='This is an ARIA article 2.' +++++++++inlineTextBox name='This is an ARIA article 2.' +++++listBox setSize=2 +++++++listBoxOption name='Item 1' setSize=2 posInSet=1 selected=false +++++++listBoxOption name='Item 2' setSize=2 posInSet=2 selected=false +++++listBox setSize=2 +++++++listBoxOption name='Item 1' setSize=2 posInSet=1 selected=false +++++++listBoxOption name='Item 2' setSize=2 posInSet=2 selected=false +++++form +++++++radioButton setSize=4 posInSet=3 checkedState=false +++++++staticText name='1' +++++++++inlineTextBox name='1' ++++++lineBreak name='<newline>' ++++++++inlineTextBox name='<newline>' -++++++radioButton name='blue' setSize=1 posInSet=1 checkedState=false -++staticText name='Done' -++++inlineTextBox name='Done' +++++++radioButton setSize=4 posInSet=4 checkedState=false +++++++staticText name='2' +++++++++inlineTextBox name='2' +++++radioButton setSize=2 posInSet=1 checkedState=false +++++staticText name='Apple' +++++++inlineTextBox name='Apple' +++++lineBreak name='<newline>' +++++++inlineTextBox name='<newline>' +++++radioButton setSize=2 posInSet=2 checkedState=false +++++staticText name='Banana' +++++++inlineTextBox name='Banana' +++++group name='Cake' setSize=0 +++++++legend +++++++++staticText name='Cake' +++++++++++inlineTextBox name='Cake' +++++++radioButton name='Chiffon cakes' setSize=2 posInSet=1 checkedState=true +++++++lineBreak name='<newline>' +++++++++inlineTextBox name='<newline>' +++++++radioButton name='Chocolate cakes' setSize=2 posInSet=2 checkedState=false +++++form +++++++paragraph +++++++++button name='changedFromRadio' +++++++++labelText +++++++++++staticText name='red' +++++++++++++inlineTextBox name='red' +++++++++lineBreak name='<newline>' +++++++++++inlineTextBox name='<newline>' +++++++++radioButton name='blue' setSize=1 posInSet=1 checkedState=false +++++staticText name='Done' +++++++inlineTextBox name='Done'
diff --git a/content/test/data/accessibility/aria/aria-presentation-expected-blink.txt b/content/test/data/accessibility/aria/aria-presentation-expected-blink.txt index 0fe92ae..feffaa5 100644 --- a/content/test/data/accessibility/aria/aria-presentation-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-presentation-expected-blink.txt
@@ -1,3 +1,5 @@ rootWebArea -++staticText name='aria-role presentation' -++++inlineTextBox name='aria-role presentation' \ No newline at end of file +++genericContainer ignored +++++presentational ignored +++++++staticText name='aria-role presentation' +++++++++inlineTextBox name='aria-role presentation'
diff --git a/content/test/data/accessibility/aria/aria-pressed-expected-blink.txt b/content/test/data/accessibility/aria/aria-pressed-expected-blink.txt index a714de0..950b0df3 100644 --- a/content/test/data/accessibility/aria/aria-pressed-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-pressed-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++button name='Regular button' -++toggleButton name='Toggle button unpressed' checkedState=false -++toggleButton name='Toggle button pressed' checkedState=true -++toggleButton name='Toggle button mixed' checkedState=mixed \ No newline at end of file +++genericContainer ignored +++++button name='Regular button' +++++toggleButton name='Toggle button unpressed' checkedState=false +++++toggleButton name='Toggle button pressed' checkedState=true +++++toggleButton name='Toggle button mixed' checkedState=mixed
diff --git a/content/test/data/accessibility/aria/aria-progressbar-expected-blink.txt b/content/test/data/accessibility/aria/aria-progressbar-expected-blink.txt index 47e2e26..357a5a1 100644 --- a/content/test/data/accessibility/aria/aria-progressbar-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-progressbar-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++progressIndicator valueForRange=3.00 minValueForRange=1.00 maxValueForRange=37.00 -++progressIndicator value='three' valueForRange=3.00 minValueForRange=1.00 maxValueForRange=96.00 -++progressIndicator minValueForRange=0.00 maxValueForRange=10.00 +++genericContainer ignored +++++progressIndicator valueForRange=3.00 minValueForRange=1.00 maxValueForRange=37.00 +++++progressIndicator value='three' valueForRange=3.00 minValueForRange=1.00 maxValueForRange=96.00 +++++progressIndicator minValueForRange=0.00 maxValueForRange=10.00
diff --git a/content/test/data/accessibility/aria/aria-radio-expected-blink.txt b/content/test/data/accessibility/aria/aria-radio-expected-blink.txt index f0df9f5..c413cb9 100644 --- a/content/test/data/accessibility/aria/aria-radio-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-radio-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++radioButton name='Radio1' checkedState=false \ No newline at end of file +++genericContainer ignored +++++radioButton name='Radio1' checkedState=false
diff --git a/content/test/data/accessibility/aria/aria-radiogroup-expected-blink.txt b/content/test/data/accessibility/aria/aria-radiogroup-expected-blink.txt index 988e632b..58753ac 100644 --- a/content/test/data/accessibility/aria/aria-radiogroup-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-radiogroup-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++radioGroup name='My group' -++++radioButton name='Radio 1' checkedState=false radioGroupIds=radioButton,radioButton -++++radioButton name='Radio 2' checkedState=false radioGroupIds=radioButton,radioButton \ No newline at end of file +++genericContainer ignored +++++radioGroup name='My group' +++++++radioButton name='Radio 1' checkedState=false radioGroupIds=radioButton,radioButton +++++++radioButton name='Radio 2' checkedState=false radioGroupIds=radioButton,radioButton
diff --git a/content/test/data/accessibility/aria/aria-readonly-expected-blink.txt b/content/test/data/accessibility/aria/aria-readonly-expected-blink.txt index 2ab448f9..4ad5d40 100644 --- a/content/test/data/accessibility/aria/aria-readonly-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-readonly-expected-blink.txt
@@ -1,30 +1,31 @@ rootWebArea -++genericContainer -++++textField value='Readonly-false input' -++++++genericContainer -++++++++staticText name='Readonly-false input' -++++++++++inlineTextBox name='Readonly-false input' -++genericContainer -++++textField value='Readonly-true input' restriction=readOnly -++++++genericContainer -++++++++staticText name='Readonly-true input' -++++++++++inlineTextBox name='Readonly-true input' -++genericContainer name='Readonly-false plain div' -++genericContainer name='Readonly-true plain div' -++genericContainer multiline name='Readonly-false contenteditable div' -++genericContainer multiline name='Readonly-true contenteditable div' -++textField name='Readonly-false role unimplemented textbox' -++textField name='Readonly-true role unimplemented textbox' restriction=readOnly -++textField name='Readonly-false contenteditable textbox' -++textField name='Readonly-true contenteditable textbox' restriction=readOnly -++checkBox name='Readonly checkbox' restriction=readOnly -++textFieldWithComboBox name='Readonly combobox' restriction=readOnly haspopup=listbox +++genericContainer ignored ++++genericContainer -++listBox name='Readonly listbox' restriction=readOnly -++radioGroup name='Readonly radiogroup' restriction=readOnly -++slider horizontal name='Readonly slider' restriction=readOnly -++spinButton name='Readonly spinbutton' restriction=readOnly -++menuItemCheckBox name='Readonly menuitemcheckbox' restriction=readOnly -++menuItemRadio name='Readonly menuitemradio' restriction=readOnly -++searchBox name='Readonly searchbox' restriction=readOnly -++switch name='Readonly switch' restriction=readOnly \ No newline at end of file +++++++textField value='Readonly-false input' +++++++++genericContainer +++++++++++staticText name='Readonly-false input' +++++++++++++inlineTextBox name='Readonly-false input' +++++genericContainer +++++++textField value='Readonly-true input' restriction=readOnly +++++++++genericContainer +++++++++++staticText name='Readonly-true input' +++++++++++++inlineTextBox name='Readonly-true input' +++++genericContainer name='Readonly-false plain div' +++++genericContainer name='Readonly-true plain div' +++++genericContainer multiline name='Readonly-false contenteditable div' +++++genericContainer multiline name='Readonly-true contenteditable div' +++++textField name='Readonly-false role unimplemented textbox' +++++textField name='Readonly-true role unimplemented textbox' restriction=readOnly +++++textField name='Readonly-false contenteditable textbox' +++++textField name='Readonly-true contenteditable textbox' restriction=readOnly +++++checkBox name='Readonly checkbox' restriction=readOnly +++++textFieldWithComboBox name='Readonly combobox' restriction=readOnly haspopup=listbox +++++++genericContainer +++++listBox name='Readonly listbox' restriction=readOnly +++++radioGroup name='Readonly radiogroup' restriction=readOnly +++++slider horizontal name='Readonly slider' restriction=readOnly +++++spinButton name='Readonly spinbutton' restriction=readOnly +++++menuItemCheckBox name='Readonly menuitemcheckbox' restriction=readOnly +++++menuItemRadio name='Readonly menuitemradio' restriction=readOnly +++++searchBox name='Readonly searchbox' restriction=readOnly +++++switch name='Readonly switch' restriction=readOnly
diff --git a/content/test/data/accessibility/aria/aria-region-expected-blink.txt b/content/test/data/accessibility/aria/aria-region-expected-blink.txt index f94d0c1..0738ec3 100644 --- a/content/test/data/accessibility/aria/aria-region-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-region-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++region -++++staticText name='This is an ARIA region.' -++++++inlineTextBox name='This is an ARIA region.' \ No newline at end of file +++genericContainer ignored +++++region +++++++staticText name='This is an ARIA region.' +++++++++inlineTextBox name='This is an ARIA region.'
diff --git a/content/test/data/accessibility/aria/aria-relevant-expected-blink.txt b/content/test/data/accessibility/aria/aria-relevant-expected-blink.txt index e036d49..c74ab31 100644 --- a/content/test/data/accessibility/aria/aria-relevant-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-relevant-expected-blink.txt
@@ -1,6 +1,7 @@ rootWebArea -++log containerLiveRelevant='additions' liveRelevant='additions' -++log containerLiveRelevant='removals' liveRelevant='removals' -++log containerLiveRelevant='text' liveRelevant='text' -++log containerLiveRelevant='all' liveRelevant='all' -++log containerLiveRelevant='additions text' liveRelevant='additions text' \ No newline at end of file +++genericContainer ignored +++++log containerLiveRelevant='additions' liveRelevant='additions' +++++log containerLiveRelevant='removals' liveRelevant='removals' +++++log containerLiveRelevant='text' liveRelevant='text' +++++log containerLiveRelevant='all' liveRelevant='all' +++++log containerLiveRelevant='additions text' liveRelevant='additions text'
diff --git a/content/test/data/accessibility/aria/aria-required-expected-blink.txt b/content/test/data/accessibility/aria/aria-required-expected-blink.txt index 23318c03..432a8b66 100644 --- a/content/test/data/accessibility/aria/aria-required-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-required-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++radioGroup required -++++radioButton checkedState=false -++++radioButton checkedState=false \ No newline at end of file +++genericContainer ignored +++++radioGroup required +++++++radioButton checkedState=false +++++++radioButton checkedState=false
diff --git a/content/test/data/accessibility/aria/aria-roledescription-expected-blink.txt b/content/test/data/accessibility/aria/aria-roledescription-expected-blink.txt index 2c3604f0..dbe39ee 100644 --- a/content/test/data/accessibility/aria/aria-roledescription-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-roledescription-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++button name='Native button' -++button name='ARIA button' -++button name='Clicky button' roleDescription='Clicky' +++genericContainer ignored +++++button name='Native button' +++++button name='ARIA button' +++++button name='Clicky button' roleDescription='Clicky'
diff --git a/content/test/data/accessibility/aria/aria-row-attr-expected-blink.txt b/content/test/data/accessibility/aria/aria-row-attr-expected-blink.txt index 0bc2afc..af208e1e 100644 --- a/content/test/data/accessibility/aria/aria-row-attr-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-row-attr-expected-blink.txt
@@ -1,19 +1,20 @@ rootWebArea -++grid ariaRowCount=5 -++++row selected=false -++++++columnHeader name='cell 2' ariaCellRowIndex=3 selected=false -++++++++staticText name='cell 2' -++++++++++inlineTextBox name='cell 2' -++++++columnHeader name='cell 3' ariaCellRowIndex=3 selected=false -++++++++staticText name='cell 3' -++++++++++inlineTextBox name='cell 3' -++++++columnHeader name='cell 4' ariaCellRowIndex=3 selected=false -++++++++staticText name='cell 4' -++++++++++inlineTextBox name='cell 4' -++++row ariaCellRowIndex=4 selected=false -++++++cell name='cell 2' ariaCellRowIndex=4 selected=false -++++++++staticText name='cell 2' -++++++++++inlineTextBox name='cell 2' -++++++cell name='cell 3' ariaCellRowIndex=4 selected=false -++++++++staticText name='cell 3' -++++++++++inlineTextBox name='cell 3' +++genericContainer ignored +++++grid ariaRowCount=5 +++++++row selected=false +++++++++columnHeader name='cell 2' ariaCellRowIndex=3 selected=false +++++++++++staticText name='cell 2' +++++++++++++inlineTextBox name='cell 2' +++++++++columnHeader name='cell 3' ariaCellRowIndex=3 selected=false +++++++++++staticText name='cell 3' +++++++++++++inlineTextBox name='cell 3' +++++++++columnHeader name='cell 4' ariaCellRowIndex=3 selected=false +++++++++++staticText name='cell 4' +++++++++++++inlineTextBox name='cell 4' +++++++row ariaCellRowIndex=4 selected=false +++++++++cell name='cell 2' ariaCellRowIndex=4 selected=false +++++++++++staticText name='cell 2' +++++++++++++inlineTextBox name='cell 2' +++++++++cell name='cell 3' ariaCellRowIndex=4 selected=false +++++++++++staticText name='cell 3' +++++++++++++inlineTextBox name='cell 3'
diff --git a/content/test/data/accessibility/aria/aria-row-expected-blink.txt b/content/test/data/accessibility/aria/aria-row-expected-blink.txt index 64884c7..ffb6c1f 100644 --- a/content/test/data/accessibility/aria/aria-row-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-row-expected-blink.txt
@@ -1,23 +1,24 @@ rootWebArea -++grid -++++row selected=false -++++++columnHeader name='Browser' selected=false -++++++++staticText name='Browser' -++++++++++inlineTextBox name='Browser' -++++++columnHeader name='Rendering Engine' selected=false -++++++++staticText name='Rendering Engine' -++++++++++inlineTextBox name='Rendering Engine' -++++row selected=false -++++++cell name='Chrome' selected=false -++++++++staticText name='Chrome' -++++++++++inlineTextBox name='Chrome' -++++++cell name='Blink' selected=false -++++++++staticText name='Blink' -++++++++++inlineTextBox name='Blink' -++++row selected=false -++++++cell name='Safari' selected=false -++++++++staticText name='Safari' -++++++++++inlineTextBox name='Safari' -++++++cell name='WebKit' selected=false -++++++++staticText name='WebKit' -++++++++++inlineTextBox name='WebKit' +++genericContainer ignored +++++grid +++++++row selected=false +++++++++columnHeader name='Browser' selected=false +++++++++++staticText name='Browser' +++++++++++++inlineTextBox name='Browser' +++++++++columnHeader name='Rendering Engine' selected=false +++++++++++staticText name='Rendering Engine' +++++++++++++inlineTextBox name='Rendering Engine' +++++++row selected=false +++++++++cell name='Chrome' selected=false +++++++++++staticText name='Chrome' +++++++++++++inlineTextBox name='Chrome' +++++++++cell name='Blink' selected=false +++++++++++staticText name='Blink' +++++++++++++inlineTextBox name='Blink' +++++++row selected=false +++++++++cell name='Safari' selected=false +++++++++++staticText name='Safari' +++++++++++++inlineTextBox name='Safari' +++++++++cell name='WebKit' selected=false +++++++++++staticText name='WebKit' +++++++++++++inlineTextBox name='WebKit'
diff --git a/content/test/data/accessibility/aria/aria-rowgroup-expected-blink.txt b/content/test/data/accessibility/aria/aria-rowgroup-expected-blink.txt index 2c82341..f472560 100644 --- a/content/test/data/accessibility/aria/aria-rowgroup-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-rowgroup-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++grid -++++row selected=false -++++row selected=false +++genericContainer ignored +++++grid +++++++row selected=false +++++++row selected=false
diff --git a/content/test/data/accessibility/aria/aria-rowheader-expected-blink.txt b/content/test/data/accessibility/aria/aria-rowheader-expected-blink.txt index c0164e2..c3380727 100644 --- a/content/test/data/accessibility/aria/aria-rowheader-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-rowheader-expected-blink.txt
@@ -1,22 +1,23 @@ rootWebArea -++grid -++++row selected=false -++++++rowHeader name='Browser' selected=false -++++++++staticText name='Browser' -++++++++++inlineTextBox name='Browser' -++++++cell name='Chrome' selected=false -++++++++staticText name='Chrome' -++++++++++inlineTextBox name='Chrome' -++++++cell name='Safari' selected=false -++++++++staticText name='Safari' -++++++++++inlineTextBox name='Safari' -++++row selected=false -++++++rowHeader name='Rendering Engine' selected=false -++++++++staticText name='Rendering Engine' -++++++++++inlineTextBox name='Rendering Engine' -++++++cell name='Blink' selected=false -++++++++staticText name='Blink' -++++++++++inlineTextBox name='Blink' -++++++cell name='WebKit' selected=false -++++++++staticText name='WebKit' -++++++++++inlineTextBox name='WebKit' +++genericContainer ignored +++++grid +++++++row selected=false +++++++++rowHeader name='Browser' selected=false +++++++++++staticText name='Browser' +++++++++++++inlineTextBox name='Browser' +++++++++cell name='Chrome' selected=false +++++++++++staticText name='Chrome' +++++++++++++inlineTextBox name='Chrome' +++++++++cell name='Safari' selected=false +++++++++++staticText name='Safari' +++++++++++++inlineTextBox name='Safari' +++++++row selected=false +++++++++rowHeader name='Rendering Engine' selected=false +++++++++++staticText name='Rendering Engine' +++++++++++++inlineTextBox name='Rendering Engine' +++++++++cell name='Blink' selected=false +++++++++++staticText name='Blink' +++++++++++++inlineTextBox name='Blink' +++++++++cell name='WebKit' selected=false +++++++++++staticText name='WebKit' +++++++++++++inlineTextBox name='WebKit'
diff --git a/content/test/data/accessibility/aria/aria-scrollbar-expected-blink.txt b/content/test/data/accessibility/aria/aria-scrollbar-expected-blink.txt index 5106995..cbfb0e1 100644 --- a/content/test/data/accessibility/aria/aria-scrollbar-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-scrollbar-expected-blink.txt
@@ -1,3 +1,4 @@ rootWebArea -++scrollBar vertical valueForRange=55.00 minValueForRange=0.00 maxValueForRange=100.00 -++scrollBar horizontal valueForRange=55.00 minValueForRange=0.00 maxValueForRange=100.00 +++genericContainer ignored +++++scrollBar vertical valueForRange=55.00 minValueForRange=0.00 maxValueForRange=100.00 +++++scrollBar horizontal valueForRange=55.00 minValueForRange=0.00 maxValueForRange=100.00
diff --git a/content/test/data/accessibility/aria/aria-search-expected-blink.txt b/content/test/data/accessibility/aria/aria-search-expected-blink.txt index 737e496..d4bb577 100644 --- a/content/test/data/accessibility/aria/aria-search-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-search-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++search -++++staticText name='ARIA role search.' -++++++inlineTextBox name='ARIA role search.' \ No newline at end of file +++genericContainer ignored +++++search +++++++staticText name='ARIA role search.' +++++++++inlineTextBox name='ARIA role search.'
diff --git a/content/test/data/accessibility/aria/aria-searchbox-expected-blink.txt b/content/test/data/accessibility/aria/aria-searchbox-expected-blink.txt index 85ad33f7..9919ac41 100644 --- a/content/test/data/accessibility/aria/aria-searchbox-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-searchbox-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++searchBox value='ARIA role searchbox.' -++++staticText name='ARIA role searchbox.' -++++++inlineTextBox name='ARIA role searchbox.' +++genericContainer ignored +++++searchBox value='ARIA role searchbox.' +++++++staticText name='ARIA role searchbox.' +++++++++inlineTextBox name='ARIA role searchbox.'
diff --git a/content/test/data/accessibility/aria/aria-selected-expected-blink.txt b/content/test/data/accessibility/aria/aria-selected-expected-blink.txt index a3d4b02..bf5832b 100644 --- a/content/test/data/accessibility/aria/aria-selected-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-selected-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++listBox -++++listBoxOption name='1' selected=true -++++listBoxOption name='2' selected=false \ No newline at end of file +++genericContainer ignored +++++listBox +++++++listBoxOption name='1' selected=true +++++++listBoxOption name='2' selected=false
diff --git a/content/test/data/accessibility/aria/aria-separator-expected-blink.txt b/content/test/data/accessibility/aria/aria-separator-expected-blink.txt index e3cf25fc..7112681 100644 --- a/content/test/data/accessibility/aria/aria-separator-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-separator-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++staticText name='Before' -++++inlineTextBox name='Before' -++splitter horizontal -++splitter horizontal valueForRange=1.00 minValueForRange=1.00 maxValueForRange=3.00 -++staticText name='After' -++++inlineTextBox name='After' \ No newline at end of file +++genericContainer ignored +++++staticText name='Before' +++++++inlineTextBox name='Before' +++++splitter horizontal +++++splitter horizontal valueForRange=1.00 minValueForRange=1.00 maxValueForRange=3.00 +++++staticText name='After' +++++++inlineTextBox name='After'
diff --git a/content/test/data/accessibility/aria/aria-set-counts-with-hidden-items-expected-blink.txt b/content/test/data/accessibility/aria/aria-set-counts-with-hidden-items-expected-blink.txt index a0eefff..b717448 100644 --- a/content/test/data/accessibility/aria/aria-set-counts-with-hidden-items-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-set-counts-with-hidden-items-expected-blink.txt
@@ -1,14 +1,15 @@ rootWebArea -++listBox setSize=4 -++++listBoxOption name='Item 1' setSize=4 posInSet=1 selected=false -++++listBoxOption name='Item 2' setSize=4 posInSet=2 selected=false -++++listBoxOption invisible name='Hidden' selected=false -++++listBoxOption name='Item 3' setSize=4 posInSet=3 selected=false -++++listBoxOption name='Item 4' setSize=4 posInSet=4 selected=false -++listBox setSize=5 -++++listBoxOption name='Item 1' setSize=5 posInSet=1 selected=false -++++listBoxOption name='Item 2' setSize=5 posInSet=2 selected=false -++++listBoxOption invisible name='Hidden' selected=false -++++listBoxOption name='Item 3' setSize=5 posInSet=3 selected=false -++++listBoxOption name='Item 4' setSize=5 posInSet=4 selected=false -++++listBoxOption name='Item 5' setSize=5 posInSet=5 selected=false +++genericContainer ignored +++++listBox setSize=4 +++++++listBoxOption name='Item 1' setSize=4 posInSet=1 selected=false +++++++listBoxOption name='Item 2' setSize=4 posInSet=2 selected=false +++++++listBoxOption invisible name='Hidden' selected=false +++++++listBoxOption name='Item 3' setSize=4 posInSet=3 selected=false +++++++listBoxOption name='Item 4' setSize=4 posInSet=4 selected=false +++++listBox setSize=5 +++++++listBoxOption name='Item 1' setSize=5 posInSet=1 selected=false +++++++listBoxOption name='Item 2' setSize=5 posInSet=2 selected=false +++++++listBoxOption invisible name='Hidden' selected=false +++++++listBoxOption name='Item 3' setSize=5 posInSet=3 selected=false +++++++listBoxOption name='Item 4' setSize=5 posInSet=4 selected=false +++++++listBoxOption name='Item 5' setSize=5 posInSet=5 selected=false
diff --git a/content/test/data/accessibility/aria/aria-setsize-expected-blink.txt b/content/test/data/accessibility/aria/aria-setsize-expected-blink.txt index 4459055..6268477 100644 --- a/content/test/data/accessibility/aria/aria-setsize-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-setsize-expected-blink.txt
@@ -1,12 +1,13 @@ rootWebArea -++listBox setSize=4 -++++listBoxOption name='Item 1' setSize=4 posInSet=1 selected=false -++++listBoxOption name='Item 2' setSize=4 posInSet=2 selected=false -++++listBoxOption name='Item 3' setSize=4 posInSet=3 selected=false -++++listBoxOption name='Item 4' setSize=4 posInSet=4 selected=false -++listBox setSize=5 -++++listBoxOption name='Item 1' setSize=5 posInSet=1 selected=false -++++listBoxOption name='Item 2' setSize=5 posInSet=2 selected=false -++++listBoxOption name='Item 3' setSize=5 posInSet=3 selected=false -++++listBoxOption name='Item 4' setSize=5 posInSet=4 selected=false -++++listBoxOption name='Item 5' setSize=5 posInSet=5 selected=false +++genericContainer ignored +++++listBox setSize=4 +++++++listBoxOption name='Item 1' setSize=4 posInSet=1 selected=false +++++++listBoxOption name='Item 2' setSize=4 posInSet=2 selected=false +++++++listBoxOption name='Item 3' setSize=4 posInSet=3 selected=false +++++++listBoxOption name='Item 4' setSize=4 posInSet=4 selected=false +++++listBox setSize=5 +++++++listBoxOption name='Item 1' setSize=5 posInSet=1 selected=false +++++++listBoxOption name='Item 2' setSize=5 posInSet=2 selected=false +++++++listBoxOption name='Item 3' setSize=5 posInSet=3 selected=false +++++++listBoxOption name='Item 4' setSize=5 posInSet=4 selected=false +++++++listBoxOption name='Item 5' setSize=5 posInSet=5 selected=false
diff --git a/content/test/data/accessibility/aria/aria-slider-expected-blink.txt b/content/test/data/accessibility/aria/aria-slider-expected-blink.txt index 8e8bd03..ab0e361e 100644 --- a/content/test/data/accessibility/aria/aria-slider-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-slider-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++slider horizontal valueForRange=5.00 minValueForRange=1.00 maxValueForRange=10.00 +++genericContainer ignored +++++slider horizontal valueForRange=5.00 minValueForRange=1.00 maxValueForRange=10.00
diff --git a/content/test/data/accessibility/aria/aria-sort-aria-grid-expected-blink.txt b/content/test/data/accessibility/aria/aria-sort-aria-grid-expected-blink.txt index 99675e2..660a1288 100644 --- a/content/test/data/accessibility/aria/aria-sort-aria-grid-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-sort-aria-grid-expected-blink.txt
@@ -1,121 +1,122 @@ rootWebArea -++grid -++++row selected=false -++++++columnHeader name='Alphabet' selected=false -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++row selected=false -++++++cell name='A' selected=false -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++row selected=false -++++++cell name='B' selected=false -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++grid -++++row selected=false -++++++columnHeader name='Alphabet' selected=false -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++row selected=false -++++++cell name='A' selected=false -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++row selected=false -++++++cell name='B' selected=false -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++grid -++++row selected=false -++++++columnHeader name='Alphabet' selected=false -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++row selected=false -++++++cell name='A' selected=false -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++row selected=false -++++++cell name='B' selected=false -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++grid -++++row selected=false -++++++columnHeader name='Alphabet' selected=false -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++row selected=false -++++++cell name='B' selected=false -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++++row selected=false -++++++cell name='A' selected=false -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++grid -++++row selected=false -++++++columnHeader name='Alphabet' selected=false -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++row selected=false -++++++cell name='A' selected=false -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++row selected=false -++++++cell name='A' selected=false -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++grid -++++row selected=false -++++++rowHeader name='Alphabet' selected=false -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++++cell name='A' selected=false -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++++cell name='B' selected=false -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++grid -++++row selected=false -++++++rowHeader name='Alphabet' selected=false -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++++cell name='A' selected=false -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++++cell name='B' selected=false -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++grid -++++row selected=false -++++++rowHeader name='Alphabet' selected=false -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++++cell name='A' selected=false -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++++cell name='B' selected=false -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++grid -++++row selected=false -++++++rowHeader name='Alphabet' selected=false -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++++cell name='B' selected=false -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++++++cell name='A' selected=false -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++grid -++++row selected=false -++++++rowHeader name='Alphabet' selected=false -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++++cell name='A' selected=false -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++++cell name='A' selected=false -++++++++staticText name='A' -++++++++++inlineTextBox name='A' +++genericContainer ignored +++++grid +++++++row selected=false +++++++++columnHeader name='Alphabet' selected=false +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++row selected=false +++++++++cell name='A' selected=false +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++row selected=false +++++++++cell name='B' selected=false +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++grid +++++++row selected=false +++++++++columnHeader name='Alphabet' selected=false +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++row selected=false +++++++++cell name='A' selected=false +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++row selected=false +++++++++cell name='B' selected=false +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++grid +++++++row selected=false +++++++++columnHeader name='Alphabet' selected=false +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++row selected=false +++++++++cell name='A' selected=false +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++row selected=false +++++++++cell name='B' selected=false +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++grid +++++++row selected=false +++++++++columnHeader name='Alphabet' selected=false +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++row selected=false +++++++++cell name='B' selected=false +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++++row selected=false +++++++++cell name='A' selected=false +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++grid +++++++row selected=false +++++++++columnHeader name='Alphabet' selected=false +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++row selected=false +++++++++cell name='A' selected=false +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++row selected=false +++++++++cell name='A' selected=false +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++grid +++++++row selected=false +++++++++rowHeader name='Alphabet' selected=false +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++++cell name='A' selected=false +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++++cell name='B' selected=false +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++grid +++++++row selected=false +++++++++rowHeader name='Alphabet' selected=false +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++++cell name='A' selected=false +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++++cell name='B' selected=false +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++grid +++++++row selected=false +++++++++rowHeader name='Alphabet' selected=false +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++++cell name='A' selected=false +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++++cell name='B' selected=false +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++grid +++++++row selected=false +++++++++rowHeader name='Alphabet' selected=false +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++++cell name='B' selected=false +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++++++cell name='A' selected=false +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++grid +++++++row selected=false +++++++++rowHeader name='Alphabet' selected=false +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++++cell name='A' selected=false +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++++cell name='A' selected=false +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A'
diff --git a/content/test/data/accessibility/aria/aria-sort-html-table-expected-blink.txt b/content/test/data/accessibility/aria/aria-sort-html-table-expected-blink.txt index 30445e2..9c7a14a3 100644 --- a/content/test/data/accessibility/aria/aria-sort-html-table-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-sort-html-table-expected-blink.txt
@@ -1,137 +1,139 @@ rootWebArea -++table name='Data table' -++++row -++++++columnHeader name='Alphabet' +++genericContainer ignored +++++table name='Data table' +++++++row +++++++++columnHeader name='Alphabet' +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++row +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++row +++++++++cell name='B' +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++table name='Data table' +++++++row +++++++++columnHeader name='Alphabet' +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++row +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++row +++++++++cell name='B' +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++table name='Data table' +++++++row +++++++++columnHeader name='Alphabet' +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++row +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++row +++++++++cell name='B' +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++table name='Data table' +++++++row +++++++++columnHeader name='Alphabet' +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++row +++++++++cell name='B' +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++++row +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++table name='Data table' +++++++row +++++++++columnHeader name='Alphabet' +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++row +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++row +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++table name='Data table' +++++++row +++++++++rowHeader name='Alphabet' +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++++cell name='B' +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++table name='Data table' +++++++row +++++++++rowHeader name='Alphabet' +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++++cell name='B' +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++table name='Data table' +++++++row +++++++++rowHeader name='Alphabet' +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++++cell name='B' +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++table name='Data table' +++++++row +++++++++rowHeader name='Alphabet' +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++++cell name='B' +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++table name='Data table' +++++++row +++++++++rowHeader name='Alphabet' +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++table name='Data table' +++++++row +++++++++columnHeader name='Alphabet' +++++++++++staticText name='Alphabet' +++++++++++++inlineTextBox name='Alphabet' +++++++row +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++row +++++++++cell name='B' +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++none ignored +++++++genericContainer ++++++++staticText name='Alphabet' ++++++++++inlineTextBox name='Alphabet' -++++row -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++row -++++++cell name='B' -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++table name='Data table' -++++row -++++++columnHeader name='Alphabet' -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++row -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++row -++++++cell name='B' -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++table name='Data table' -++++row -++++++columnHeader name='Alphabet' -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++row -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++row -++++++cell name='B' -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++table name='Data table' -++++row -++++++columnHeader name='Alphabet' -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++row -++++++cell name='B' -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++++row -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++table name='Data table' -++++row -++++++columnHeader name='Alphabet' -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++row -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++row -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++table name='Data table' -++++row -++++++rowHeader name='Alphabet' -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++++cell name='B' -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++table name='Data table' -++++row -++++++rowHeader name='Alphabet' -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++++cell name='B' -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++table name='Data table' -++++row -++++++rowHeader name='Alphabet' -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++++cell name='B' -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++table name='Data table' -++++row -++++++rowHeader name='Alphabet' -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++++cell name='B' -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++table name='Data table' -++++row -++++++rowHeader name='Alphabet' -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++table name='Data table' -++++row -++++++columnHeader name='Alphabet' -++++++++staticText name='Alphabet' -++++++++++inlineTextBox name='Alphabet' -++++row -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++row -++++++cell name='B' -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++genericContainer -++++staticText name='Alphabet' -++++++inlineTextBox name='Alphabet'
diff --git a/content/test/data/accessibility/aria/aria-status-expected-blink.txt b/content/test/data/accessibility/aria/aria-status-expected-blink.txt index e60bea6..dd2477aa 100644 --- a/content/test/data/accessibility/aria/aria-status-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-status-expected-blink.txt
@@ -1,3 +1,4 @@ rootWebArea -++status containerLiveRelevant='additions text' containerLiveStatus='polite' liveRelevant='additions text' liveStatus='polite' containerLiveAtomic=true containerLiveBusy=false liveAtomic=true -++status containerLiveRelevant='additions text' containerLiveStatus='polite' liveRelevant='additions text' liveStatus='polite' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false \ No newline at end of file +++genericContainer ignored +++++status containerLiveRelevant='additions text' containerLiveStatus='polite' liveRelevant='additions text' liveStatus='polite' containerLiveAtomic=true containerLiveBusy=false liveAtomic=true +++++status containerLiveRelevant='additions text' containerLiveStatus='polite' liveRelevant='additions text' liveStatus='polite' containerLiveAtomic=false containerLiveBusy=false liveAtomic=false
diff --git a/content/test/data/accessibility/aria/aria-switch-expected-blink.txt b/content/test/data/accessibility/aria/aria-switch-expected-blink.txt index b25b4d3..80524b8 100644 --- a/content/test/data/accessibility/aria/aria-switch-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-switch-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++switch name='Switch1' checkedState=false -++switch name='Switch2' checkedState=false -++switch name='Switch3' checkedState=true -++switch name='Switch4' checkedState=true +++genericContainer ignored +++++switch name='Switch1' checkedState=false +++++switch name='Switch2' checkedState=false +++++switch name='Switch3' checkedState=true +++++switch name='Switch4' checkedState=true
diff --git a/content/test/data/accessibility/aria/aria-tab-expected-blink.txt b/content/test/data/accessibility/aria/aria-tab-expected-blink.txt index e8cd121..53ce736 100644 --- a/content/test/data/accessibility/aria/aria-tab-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-tab-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++tabList horizontal setSize=2 -++++tab name='Tab 1' setSize=2 posInSet=1 selected=false -++++tab name='Tab 2' setSize=2 posInSet=2 selected=false +++genericContainer ignored +++++tabList horizontal setSize=2 +++++++tab name='Tab 1' setSize=2 posInSet=1 selected=false +++++++tab name='Tab 2' setSize=2 posInSet=2 selected=false
diff --git a/content/test/data/accessibility/aria/aria-table-expected-blink.txt b/content/test/data/accessibility/aria/aria-table-expected-blink.txt index ee500c52a..364cbe9e 100644 --- a/content/test/data/accessibility/aria/aria-table-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-table-expected-blink.txt
@@ -1,16 +1,17 @@ rootWebArea -++table -++++row selected=false -++++++columnHeader name='Browser' selected=false -++++++++staticText name='Browser' -++++++++++inlineTextBox name='Browser' -++++++columnHeader name='Rendering Engine' selected=false -++++++++staticText name='Rendering Engine' -++++++++++inlineTextBox name='Rendering Engine' -++++row selected=false -++++++cell name='Chrome' selected=false -++++++++staticText name='Chrome' -++++++++++inlineTextBox name='Chrome' -++++++cell name='Blink' selected=false -++++++++staticText name='Blink' -++++++++++inlineTextBox name='Blink' +++genericContainer ignored +++++table +++++++row selected=false +++++++++columnHeader name='Browser' selected=false +++++++++++staticText name='Browser' +++++++++++++inlineTextBox name='Browser' +++++++++columnHeader name='Rendering Engine' selected=false +++++++++++staticText name='Rendering Engine' +++++++++++++inlineTextBox name='Rendering Engine' +++++++row selected=false +++++++++cell name='Chrome' selected=false +++++++++++staticText name='Chrome' +++++++++++++inlineTextBox name='Chrome' +++++++++cell name='Blink' selected=false +++++++++++staticText name='Blink' +++++++++++++inlineTextBox name='Blink'
diff --git a/content/test/data/accessibility/aria/aria-tablist-expected-blink.txt b/content/test/data/accessibility/aria/aria-tablist-expected-blink.txt index 26c4988..afb12b73 100644 --- a/content/test/data/accessibility/aria/aria-tablist-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-tablist-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++tabList horizontal -++++tab name='Tab 1' selected=false -++++tab name='Tab 2' selected=false \ No newline at end of file +++genericContainer ignored +++++tabList horizontal +++++++tab name='Tab 1' selected=false +++++++tab name='Tab 2' selected=false
diff --git a/content/test/data/accessibility/aria/aria-tabpanel-expected-blink.txt b/content/test/data/accessibility/aria/aria-tabpanel-expected-blink.txt index e4702b3bf..e0046b1d 100644 --- a/content/test/data/accessibility/aria/aria-tabpanel-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-tabpanel-expected-blink.txt
@@ -1,10 +1,11 @@ rootWebArea -++tabPanel -++++tab name='Item' selected=false -++++++heading name='Item' hierarchicalLevel=3 -++++++++staticText name='Item' -++++++++++inlineTextBox name='Item' -++++tab name='Prices' selected=false -++++++heading name='Prices' hierarchicalLevel=3 -++++++++staticText name='Prices' -++++++++++inlineTextBox name='Prices' \ No newline at end of file +++genericContainer ignored +++++tabPanel +++++++tab name='Item' selected=false +++++++++heading name='Item' hierarchicalLevel=3 +++++++++++staticText name='Item' +++++++++++++inlineTextBox name='Item' +++++++tab name='Prices' selected=false +++++++++heading name='Prices' hierarchicalLevel=3 +++++++++++staticText name='Prices' +++++++++++++inlineTextBox name='Prices'
diff --git a/content/test/data/accessibility/aria/aria-term-expected-blink.txt b/content/test/data/accessibility/aria/aria-term-expected-blink.txt index 5ff8c71..d4c2d302 100644 --- a/content/test/data/accessibility/aria/aria-term-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-term-expected-blink.txt
@@ -1,14 +1,15 @@ rootWebArea -++list -++++term -++++++staticText name='Term1' -++++++++inlineTextBox name='Term1' -++++definition -++++++staticText name='Definition1' -++++++++inlineTextBox name='Definition1' -++++term -++++++staticText name='Term2' -++++++++inlineTextBox name='Term2' -++++definition -++++++staticText name='Definition2' -++++++++inlineTextBox name='Definition2' \ No newline at end of file +++genericContainer ignored +++++list +++++++term +++++++++staticText name='Term1' +++++++++++inlineTextBox name='Term1' +++++++definition +++++++++staticText name='Definition1' +++++++++++inlineTextBox name='Definition1' +++++++term +++++++++staticText name='Term2' +++++++++++inlineTextBox name='Term2' +++++++definition +++++++++staticText name='Definition2' +++++++++++inlineTextBox name='Definition2'
diff --git a/content/test/data/accessibility/aria/aria-textbox-expected-blink.txt b/content/test/data/accessibility/aria/aria-textbox-expected-blink.txt index fced2723..eabc414 100644 --- a/content/test/data/accessibility/aria/aria-textbox-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-textbox-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++textField value='TextBox1' -++++staticText name='TextBox1' -++++++inlineTextBox name='TextBox1' -++textField multiline value='TextBox2' -++++staticText name='TextBox2' -++++++inlineTextBox name='TextBox2' +++genericContainer ignored +++++textField value='TextBox1' +++++++staticText name='TextBox1' +++++++++inlineTextBox name='TextBox1' +++++textField multiline value='TextBox2' +++++++staticText name='TextBox2' +++++++++inlineTextBox name='TextBox2'
diff --git a/content/test/data/accessibility/aria/aria-timer-expected-blink.txt b/content/test/data/accessibility/aria/aria-timer-expected-blink.txt index 554b469..82f043fe 100644 --- a/content/test/data/accessibility/aria/aria-timer-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-timer-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++timer -++++staticText name='This test is for aria-role = timer' -++++++inlineTextBox name='This test is for aria-role = timer' \ No newline at end of file +++genericContainer ignored +++++timer +++++++staticText name='This test is for aria-role = timer' +++++++++inlineTextBox name='This test is for aria-role = timer'
diff --git a/content/test/data/accessibility/aria/aria-togglebutton-expected-blink.txt b/content/test/data/accessibility/aria/aria-togglebutton-expected-blink.txt index 0d60db3..2cd13a91 100644 --- a/content/test/data/accessibility/aria/aria-togglebutton-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-togglebutton-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++button name='Regular button' -++toggleButton name='Toggle button' checkedState=false -++toggleButton name='Toggle button' checkedState=true -++toggleButton name='Toggle button' checkedState=mixed +++genericContainer ignored +++++button name='Regular button' +++++toggleButton name='Toggle button' checkedState=false +++++toggleButton name='Toggle button' checkedState=true +++++toggleButton name='Toggle button' checkedState=mixed
diff --git a/content/test/data/accessibility/aria/aria-toolbar-expected-blink.txt b/content/test/data/accessibility/aria/aria-toolbar-expected-blink.txt index e2383e2..98387db 100644 --- a/content/test/data/accessibility/aria/aria-toolbar-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-toolbar-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++toolbar horizontal -++++staticText name='A toolbar' -++++++inlineTextBox name='A toolbar' \ No newline at end of file +++genericContainer ignored +++++toolbar horizontal +++++++staticText name='A toolbar' +++++++++inlineTextBox name='A toolbar'
diff --git a/content/test/data/accessibility/aria/aria-tooltip-expected-blink.txt b/content/test/data/accessibility/aria/aria-tooltip-expected-blink.txt index fa9261c..f539e1f 100644 --- a/content/test/data/accessibility/aria/aria-tooltip-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-tooltip-expected-blink.txt
@@ -1,6 +1,7 @@ rootWebArea -++textField description='Your username should be your email id' descriptionFrom=relatedElement -++++genericContainer -++tooltip name='Your username should be your email id' -++++staticText name='Your username should be your email id' -++++++inlineTextBox name='Your username should be your email id' \ No newline at end of file +++genericContainer ignored +++++textField description='Your username should be your email id' descriptionFrom=relatedElement +++++++genericContainer +++++tooltip name='Your username should be your email id' +++++++staticText name='Your username should be your email id' +++++++++inlineTextBox name='Your username should be your email id'
diff --git a/content/test/data/accessibility/aria/aria-tree-expected-blink.txt b/content/test/data/accessibility/aria/aria-tree-expected-blink.txt index df2a948d..20b3b90 100644 --- a/content/test/data/accessibility/aria/aria-tree-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-tree-expected-blink.txt
@@ -1,28 +1,29 @@ rootWebArea -++tree setSize=2 -++++treeItem name='Animals' hierarchicalLevel=1 setSize=2 posInSet=1 checkedState=mixed selected=false -++++++link name='Animals' -++++++++staticText name='Animals' -++++++++++inlineTextBox name='Animals' -++++++group setSize=2 -++++++++treeItem name='Domesticated' hierarchicalLevel=2 setSize=2 posInSet=1 selected=false -++++++++++link name='Domesticated' -++++++++++++staticText name='Domesticated' -++++++++++++++inlineTextBox name='Domesticated' -++++++++++group setSize=2 -++++++++++++treeItem name='Dog' hierarchicalLevel=3 setSize=2 posInSet=1 checkedState=true selected=false -++++++++++++++link name='Dog' -++++++++++++++++staticText name='Dog' -++++++++++++++++++inlineTextBox name='Dog' -++++++++++++treeItem name='Cat' hierarchicalLevel=3 setSize=2 posInSet=2 checkedState=false selected=false -++++++++++++++link name='Cat' -++++++++++++++++staticText name='Cat' -++++++++++++++++++inlineTextBox name='Cat' -++++++++treeItem name='Wild' hierarchicalLevel=2 setSize=2 posInSet=2 selected=false -++++++++++link name='Wild' -++++++++++++staticText name='Wild' -++++++++++++++inlineTextBox name='Wild' -++++treeItem name='Plants' hierarchicalLevel=1 setSize=2 posInSet=2 selected=false -++++++link name='Plants' -++++++++staticText name='Plants' -++++++++++inlineTextBox name='Plants' +++genericContainer ignored +++++tree setSize=2 +++++++treeItem name='Animals' hierarchicalLevel=1 setSize=2 posInSet=1 checkedState=mixed selected=false +++++++++link name='Animals' +++++++++++staticText name='Animals' +++++++++++++inlineTextBox name='Animals' +++++++++group setSize=2 +++++++++++treeItem name='Domesticated' hierarchicalLevel=2 setSize=2 posInSet=1 selected=false +++++++++++++link name='Domesticated' +++++++++++++++staticText name='Domesticated' +++++++++++++++++inlineTextBox name='Domesticated' +++++++++++++group setSize=2 +++++++++++++++treeItem name='Dog' hierarchicalLevel=3 setSize=2 posInSet=1 checkedState=true selected=false +++++++++++++++++link name='Dog' +++++++++++++++++++staticText name='Dog' +++++++++++++++++++++inlineTextBox name='Dog' +++++++++++++++treeItem name='Cat' hierarchicalLevel=3 setSize=2 posInSet=2 checkedState=false selected=false +++++++++++++++++link name='Cat' +++++++++++++++++++staticText name='Cat' +++++++++++++++++++++inlineTextBox name='Cat' +++++++++++treeItem name='Wild' hierarchicalLevel=2 setSize=2 posInSet=2 selected=false +++++++++++++link name='Wild' +++++++++++++++staticText name='Wild' +++++++++++++++++inlineTextBox name='Wild' +++++++treeItem name='Plants' hierarchicalLevel=1 setSize=2 posInSet=2 selected=false +++++++++link name='Plants' +++++++++++staticText name='Plants' +++++++++++++inlineTextBox name='Plants'
diff --git a/content/test/data/accessibility/aria/aria-treegrid-expected-blink.txt b/content/test/data/accessibility/aria/aria-treegrid-expected-blink.txt index 5b41a71..4b446cf 100644 --- a/content/test/data/accessibility/aria/aria-treegrid-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-treegrid-expected-blink.txt
@@ -1,15 +1,16 @@ rootWebArea -++treeGrid -++++row hierarchicalLevel=1 selected=false -++++++cell name='Cell at level 1' selected=false -++++++++staticText name='Cell at level 1' -++++++++++inlineTextBox name='Cell at level 1' -++++row hierarchicalLevel=2 selected=false -++++++cell name='Cell at level 2' selected=false -++++++++staticText name='Cell at level 2' -++++++++++inlineTextBox name='Cell at level 2' -++treeGrid -++++row hierarchicalLevel=1 selected=false -++++++cell name='Cell at level 1' selected=false -++++++++staticText name='Cell at level 1' -++++++++++inlineTextBox name='Cell at level 1' +++genericContainer ignored +++++treeGrid +++++++row hierarchicalLevel=1 selected=false +++++++++cell name='Cell at level 1' selected=false +++++++++++staticText name='Cell at level 1' +++++++++++++inlineTextBox name='Cell at level 1' +++++++row hierarchicalLevel=2 selected=false +++++++++cell name='Cell at level 2' selected=false +++++++++++staticText name='Cell at level 2' +++++++++++++inlineTextBox name='Cell at level 2' +++++treeGrid +++++++row hierarchicalLevel=1 selected=false +++++++++cell name='Cell at level 1' selected=false +++++++++++staticText name='Cell at level 1' +++++++++++++inlineTextBox name='Cell at level 1'
diff --git a/content/test/data/accessibility/aria/aria-undefined-expected-blink.txt b/content/test/data/accessibility/aria/aria-undefined-expected-blink.txt index 19ddc0c6..e5e95b1 100644 --- a/content/test/data/accessibility/aria/aria-undefined-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-undefined-expected-blink.txt
@@ -1,25 +1,26 @@ rootWebArea -++genericContainer name='Atomic undefined' -++textField name='Autocomplete undefined' -++genericContainer name='Busy undefined' -++treeItem name='Checked undefined' selected=false -++genericContainer name='Current undefined' -++genericContainer name='Disabled undefined' -++genericContainer name='Dropeffect undefined' -++treeItem name='Expanded undefined' selected=false -++genericContainer name='Grabbed undefined' -++button name='Haspopup undefined' -++genericContainer name='Invalid undefined' -++genericContainer name='Live undefined' -++dialog name='Modal undefined' modal=false -++textField name='Multiline undefined' -++grid name='Multiselectable undefined' -++scrollBar vertical name='Orientation undefined' -++button name='Pressed undefined' -++textField name='Readonly undefined' -++genericContainer name='Relevant undefined' -++textField name='Required undefined' -++tree multiselectable vertical -++++treeItem name='Selected undefined' selected=false -++columnHeader name='Sort undefined' selected=false -++genericContainer name='Hidden undefined, display block' +++genericContainer ignored +++++genericContainer name='Atomic undefined' +++++textField name='Autocomplete undefined' +++++genericContainer name='Busy undefined' +++++treeItem name='Checked undefined' selected=false +++++genericContainer name='Current undefined' +++++genericContainer name='Disabled undefined' +++++genericContainer name='Dropeffect undefined' +++++treeItem name='Expanded undefined' selected=false +++++genericContainer name='Grabbed undefined' +++++button name='Haspopup undefined' +++++genericContainer name='Invalid undefined' +++++genericContainer name='Live undefined' +++++dialog name='Modal undefined' modal=false +++++textField name='Multiline undefined' +++++grid name='Multiselectable undefined' +++++scrollBar vertical name='Orientation undefined' +++++button name='Pressed undefined' +++++textField name='Readonly undefined' +++++genericContainer name='Relevant undefined' +++++textField name='Required undefined' +++++tree multiselectable vertical +++++++treeItem name='Selected undefined' selected=false +++++columnHeader name='Sort undefined' selected=false +++++genericContainer name='Hidden undefined, display block'
diff --git a/content/test/data/accessibility/aria/aria-undefined-literal-expected-blink.txt b/content/test/data/accessibility/aria/aria-undefined-literal-expected-blink.txt index 2f1b1dc..75e98ae 100644 --- a/content/test/data/accessibility/aria/aria-undefined-literal-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-undefined-literal-expected-blink.txt
@@ -1,25 +1,26 @@ rootWebArea -++genericContainer name='Atomic undefined' -++textField name='Autocomplete undefined' -++genericContainer name='Busy undefined' -++treeItem name='Checked undefined' selected=false -++genericContainer name='Current undefined' -++genericContainer name='Disabled undefined' -++genericContainer name='Dropeffect undefined' dropeffect=none -++treeItem name='Expanded undefined' selected=false -++genericContainer name='Grabbed undefined' -++button name='Haspopup undefined' -++genericContainer name='Invalid undefined' -++genericContainer name='Live undefined' -++dialog name='Modal undefined' modal=false -++textField name='Multiline undefined' -++grid name='Multiselectable undefined' -++scrollBar vertical name='Orientation undefined' -++button name='Pressed undefined' -++textField name='Readonly undefined' -++genericContainer name='Relevant undefined' -++textField name='Required undefined' -++tree multiselectable vertical -++++treeItem name='Selected undefined' selected=false -++columnHeader name='Sort undefined' selected=false -++genericContainer name='Hidden undefined, display block' +++genericContainer ignored +++++genericContainer name='Atomic undefined' +++++textField name='Autocomplete undefined' +++++genericContainer name='Busy undefined' +++++treeItem name='Checked undefined' selected=false +++++genericContainer name='Current undefined' +++++genericContainer name='Disabled undefined' +++++genericContainer name='Dropeffect undefined' dropeffect=none +++++treeItem name='Expanded undefined' selected=false +++++genericContainer name='Grabbed undefined' +++++button name='Haspopup undefined' +++++genericContainer name='Invalid undefined' +++++genericContainer name='Live undefined' +++++dialog name='Modal undefined' modal=false +++++textField name='Multiline undefined' +++++grid name='Multiselectable undefined' +++++scrollBar vertical name='Orientation undefined' +++++button name='Pressed undefined' +++++textField name='Readonly undefined' +++++genericContainer name='Relevant undefined' +++++textField name='Required undefined' +++++tree multiselectable vertical +++++++treeItem name='Selected undefined' selected=false +++++columnHeader name='Sort undefined' selected=false +++++genericContainer name='Hidden undefined, display block'
diff --git a/content/test/data/accessibility/aria/aria-valuenow-expected-blink.txt b/content/test/data/accessibility/aria/aria-valuenow-expected-blink.txt index 8c9f1d4..0449dff 100644 --- a/content/test/data/accessibility/aria/aria-valuenow-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-valuenow-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++progressIndicator valueForRange=3.00 \ No newline at end of file +++genericContainer ignored +++++progressIndicator valueForRange=3.00
diff --git a/content/test/data/accessibility/aria/aria-valuetext-expected-blink.txt b/content/test/data/accessibility/aria/aria-valuetext-expected-blink.txt index 4c9023b..0410238 100644 --- a/content/test/data/accessibility/aria/aria-valuetext-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-valuetext-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++progressIndicator value='three' valueForRange=3.00 minValueForRange=1.00 maxValueForRange=96.00 +++genericContainer ignored +++++progressIndicator value='three' valueForRange=3.00 minValueForRange=1.00 maxValueForRange=96.00
diff --git a/content/test/data/accessibility/aria/aria1.1-combobox-expected-blink.txt b/content/test/data/accessibility/aria/aria1.1-combobox-expected-blink.txt index c45fbe6b..3e55204 100644 --- a/content/test/data/accessibility/aria/aria1.1-combobox-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria1.1-combobox-expected-blink.txt
@@ -1,16 +1,17 @@ rootWebArea -++genericContainer -++++staticText name='State' -++++++inlineTextBox name='State' -++comboBoxGrouping name='State' haspopup=listbox -++++textField activedescendantId=listBoxOption controlsIds=listBox -++++++genericContainer -++listBox -++++listBoxOption name='Alabama' selected=false -++++listBoxOption name='Alaska' selected=true -++comboBoxGrouping name='State' haspopup=listbox -++++textField activedescendantId=listBoxOption controlsIds=listBox -++++++genericContainer -++listBox -++++listBoxOption name='Alabama' selected=false -++++listBoxOption name='Alaska' selected=false \ No newline at end of file +++genericContainer ignored +++++genericContainer +++++++staticText name='State' +++++++++inlineTextBox name='State' +++++comboBoxGrouping name='State' haspopup=listbox +++++++textField activedescendantId=listBoxOption controlsIds=listBox +++++++++genericContainer +++++listBox +++++++listBoxOption name='Alabama' selected=false +++++++listBoxOption name='Alaska' selected=true +++++comboBoxGrouping name='State' haspopup=listbox +++++++textField activedescendantId=listBoxOption controlsIds=listBox +++++++++genericContainer +++++listBox +++++++listBoxOption name='Alabama' selected=false +++++++listBoxOption name='Alaska' selected=false
diff --git a/content/test/data/accessibility/aria/dpub-roles-expected-blink.txt b/content/test/data/accessibility/aria/dpub-roles-expected-blink.txt index 0791432..3deca6e 100644 --- a/content/test/data/accessibility/aria/dpub-roles-expected-blink.txt +++ b/content/test/data/accessibility/aria/dpub-roles-expected-blink.txt
@@ -1,40 +1,41 @@ rootWebArea -++docAbstract name='doc-abstract' -++docAcknowledgments name='doc-acknowledgments' -++docAfterword name='doc-afterword' -++docAppendix name='doc-appendix' -++docBackLink name='doc-backlink' -++docBiblioEntry name='doc-biblioentry' -++docBibliography name='doc-bibliography' -++docBiblioRef name='doc-biblioref' -++docChapter name='doc-chapter' -++docColophon name='doc-colophon' -++docConclusion name='doc-conclusion' -++docCover name='doc-cover' -++docCredit name='doc-credit' -++docCredits name='doc-credits' -++docDedication name='doc-dedication' -++docEndnote name='doc-endnote' -++docEndnotes name='doc-endnotes' -++docEpigraph name='doc-epigraph' -++docEpilogue name='doc-epilogue' -++docErrata name='doc-errata' -++docExample name='doc-example' -++docFootnote name='doc-footnote' -++docForeword name='doc-foreword' -++docGlossary name='doc-glossary' -++docGlossref name='doc-glossref' -++docIndex name='doc-index' -++docIntroduction name='doc-introduction' -++docNoteRef name='doc-noteref' -++docNotice name='doc-notice' -++docPageBreak name='doc-pagebreak' -++docPageList name='doc-pagelist' -++docPart name='doc-part' -++docPreface name='doc-preface' -++docPrologue name='doc-prologue' -++docPullquote name='doc-pullquote' -++docQna name='doc-qna' -++docSubtitle name='doc-subtitle' -++docTip name='doc-tip' -++docToc name='doc-toc' \ No newline at end of file +++genericContainer ignored +++++docAbstract name='doc-abstract' +++++docAcknowledgments name='doc-acknowledgments' +++++docAfterword name='doc-afterword' +++++docAppendix name='doc-appendix' +++++docBackLink name='doc-backlink' +++++docBiblioEntry name='doc-biblioentry' +++++docBibliography name='doc-bibliography' +++++docBiblioRef name='doc-biblioref' +++++docChapter name='doc-chapter' +++++docColophon name='doc-colophon' +++++docConclusion name='doc-conclusion' +++++docCover name='doc-cover' +++++docCredit name='doc-credit' +++++docCredits name='doc-credits' +++++docDedication name='doc-dedication' +++++docEndnote name='doc-endnote' +++++docEndnotes name='doc-endnotes' +++++docEpigraph name='doc-epigraph' +++++docEpilogue name='doc-epilogue' +++++docErrata name='doc-errata' +++++docExample name='doc-example' +++++docFootnote name='doc-footnote' +++++docForeword name='doc-foreword' +++++docGlossary name='doc-glossary' +++++docGlossref name='doc-glossref' +++++docIndex name='doc-index' +++++docIntroduction name='doc-introduction' +++++docNoteRef name='doc-noteref' +++++docNotice name='doc-notice' +++++docPageBreak name='doc-pagebreak' +++++docPageList name='doc-pagelist' +++++docPart name='doc-part' +++++docPreface name='doc-preface' +++++docPrologue name='doc-prologue' +++++docPullquote name='doc-pullquote' +++++docQna name='doc-qna' +++++docSubtitle name='doc-subtitle' +++++docTip name='doc-tip' +++++docToc name='doc-toc'
diff --git a/content/test/data/accessibility/aria/graphics-roles-expected-blink.txt b/content/test/data/accessibility/aria/graphics-roles-expected-blink.txt index 51311ae..79187b32 100644 --- a/content/test/data/accessibility/aria/graphics-roles-expected-blink.txt +++ b/content/test/data/accessibility/aria/graphics-roles-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++graphicsDocument name='graphics-document' -++graphicsObject name='graphics-object' -++graphicsSymbol name='graphics-symbol' +++genericContainer ignored +++++graphicsDocument name='graphics-document' +++++graphicsObject name='graphics-object' +++++graphicsSymbol name='graphics-symbol'
diff --git a/content/test/data/accessibility/aria/input-text-aria-placeholder-expected-blink.txt b/content/test/data/accessibility/aria/input-text-aria-placeholder-expected-blink.txt index c0e07c4..152b30b 100644 --- a/content/test/data/accessibility/aria/input-text-aria-placeholder-expected-blink.txt +++ b/content/test/data/accessibility/aria/input-text-aria-placeholder-expected-blink.txt
@@ -1,16 +1,17 @@ rootWebArea -++textField name='aria-placeholder1' +++genericContainer ignored +++++textField name='aria-placeholder1' +++++++genericContainer +++++textField name='placeholder2' +++++++genericContainer +++++textField name='aria-label3' placeholder='placeholder3' +++++++genericContainer +++++textField name='aria-label4' placeholder='aria-placeholder4' +++++++genericContainer +++++textField description='aria-description5' name='aria-label5' placeholder='placeholder5' descriptionFrom=relatedElement +++++++genericContainer ++++genericContainer -++textField name='placeholder2' -++++genericContainer -++textField name='aria-label3' placeholder='placeholder3' -++++genericContainer -++textField name='aria-label4' placeholder='aria-placeholder4' -++++genericContainer -++textField description='aria-description5' name='aria-label5' placeholder='placeholder5' descriptionFrom=relatedElement -++++genericContainer -++genericContainer -++++staticText name='aria-description5' -++++++inlineTextBox name='aria-description5' -++textField description='title6' name='aria-placeholder6' descriptionFrom=attribute -++++genericContainer \ No newline at end of file +++++++staticText name='aria-description5' +++++++++inlineTextBox name='aria-description5' +++++textField description='title6' name='aria-placeholder6' descriptionFrom=attribute +++++++genericContainer
diff --git a/content/test/data/accessibility/aria/label-with-selected-option-expected-blink.txt b/content/test/data/accessibility/aria/label-with-selected-option-expected-blink.txt index 6af34113..46789bc 100644 --- a/content/test/data/accessibility/aria/label-with-selected-option-expected-blink.txt +++ b/content/test/data/accessibility/aria/label-with-selected-option-expected-blink.txt
@@ -1,9 +1,37 @@ rootWebArea -++checkBox name='Test 1: Flash the screen 2 times.' checkedState=false -++checkBox name='Test 2: Flash the screen 2 times.' checkedState=false -++textField -++checkBox name='Test 3: Flash the screen two times.' checkedState=false -++checkBox name='Test 4: Flash the screen two times.' checkedState=false -++textField -++checkBox name='Test 5: Flash the screen two times.' checkedState=false -++comboBoxMenuButton name='two' +++genericContainer ignored +++++genericContainer ignored +++++++checkBox name='Test 1: Flash the screen 2 times.' checkedState=false +++++++listBox ignored +++++++++listBoxOption ignored name='1' selected=false +++++++++listBoxOption ignored name='2' selected=true +++++++++listBoxOption ignored name='3' selected=false +++++genericContainer ignored +++++++checkBox name='Test 2: Flash the screen 2 times.' checkedState=false +++++++comboBoxGrouping ignored +++++++++textField +++++++++listBox ignored +++++++++++listBoxOption ignored name='1' selected=false +++++++++++listBoxOption ignored name='2' selected=true +++++++++++listBoxOption ignored name='3' selected=false +++++genericContainer ignored +++++++checkBox name='Test 3: Flash the screen two times.' checkedState=false +++++++listBox ignored +++++++++listBoxOption ignored name='1' selected=false +++++++++listBoxOption ignored name='two' selected=true +++++++++listBoxOption ignored name='3' selected=false +++++genericContainer ignored +++++++checkBox name='Test 4: Flash the screen two times.' checkedState=false +++++++comboBoxGrouping ignored +++++++++textField +++++++++listBox ignored +++++++++++listBoxOption ignored name='1' selected=false +++++++++++listBoxOption ignored name='two' selected=true +++++++++++listBoxOption ignored name='3' selected=false +++++genericContainer ignored +++++++checkBox name='Test 5: Flash the screen two times.' checkedState=false +++++++comboBoxMenuButton name='two' +++++++++listBox ignored +++++++++++listBoxOption ignored name='1' selected=false +++++++++++listBoxOption ignored name='two' selected=true +++++++++++listBoxOption ignored name='3' selected=false
diff --git a/content/test/data/accessibility/aria/table-column-hidden-expected-blink.txt b/content/test/data/accessibility/aria/table-column-hidden-expected-blink.txt index 88f459b..44a5916 100644 --- a/content/test/data/accessibility/aria/table-column-hidden-expected-blink.txt +++ b/content/test/data/accessibility/aria/table-column-hidden-expected-blink.txt
@@ -1,35 +1,36 @@ rootWebArea -++grid ariaColumnCount=5 ariaRowCount=4 tableRowCount=3 tableColumnCount=3 -++++row selected=false -++++++columnHeader name='Month' ariaCellColumnIndex=2 ariaCellRowIndex=2 selected=false -++++++++staticText name='Month' -++++++++++inlineTextBox name='Month' -++++++columnHeader name='Day' ariaCellColumnIndex=3 ariaCellRowIndex=2 selected=false -++++++++staticText name='Day' -++++++++++inlineTextBox name='Day' -++++++columnHeader name='Weather' ariaCellColumnIndex=5 ariaCellRowIndex=2 selected=false -++++++++staticText name='Weather' -++++++++++inlineTextBox name='Weather' -++++row selected=false -++++++cell name='January' ariaCellColumnIndex=2 ariaCellRowIndex=3 selected=false -++++++++staticText name='January' -++++++++++inlineTextBox name='January' -++++++cell name='01' ariaCellColumnIndex=3 ariaCellRowIndex=3 selected=false -++++++++staticText name='01' -++++++++++inlineTextBox name='01' -++++++cell name='Sunny' ariaCellColumnIndex=5 ariaCellRowIndex=3 selected=false -++++++++staticText name='Sunny' -++++++++++inlineTextBox name='Sunny' -++++row selected=false -++++++cell name='January' ariaCellColumnIndex=2 ariaCellRowIndex=4 selected=false -++++++++staticText name='January' -++++++++++inlineTextBox name='January' -++++++cell name='02' ariaCellColumnIndex=3 ariaCellRowIndex=4 selected=false -++++++++staticText name='02' -++++++++++inlineTextBox name='02' -++++++cell name='Rainy' ariaCellColumnIndex=5 ariaCellRowIndex=4 selected=false -++++++++staticText name='Rainy' -++++++++++inlineTextBox name='Rainy' -++paragraph -++++staticText name='done' -++++++inlineTextBox name='done' +++genericContainer ignored +++++grid ariaColumnCount=5 ariaRowCount=4 tableRowCount=3 tableColumnCount=3 +++++++row selected=false +++++++++columnHeader name='Month' ariaCellColumnIndex=2 ariaCellRowIndex=2 selected=false +++++++++++staticText name='Month' +++++++++++++inlineTextBox name='Month' +++++++++columnHeader name='Day' ariaCellColumnIndex=3 ariaCellRowIndex=2 selected=false +++++++++++staticText name='Day' +++++++++++++inlineTextBox name='Day' +++++++++columnHeader name='Weather' ariaCellColumnIndex=5 ariaCellRowIndex=2 selected=false +++++++++++staticText name='Weather' +++++++++++++inlineTextBox name='Weather' +++++++row selected=false +++++++++cell name='January' ariaCellColumnIndex=2 ariaCellRowIndex=3 selected=false +++++++++++staticText name='January' +++++++++++++inlineTextBox name='January' +++++++++cell name='01' ariaCellColumnIndex=3 ariaCellRowIndex=3 selected=false +++++++++++staticText name='01' +++++++++++++inlineTextBox name='01' +++++++++cell name='Sunny' ariaCellColumnIndex=5 ariaCellRowIndex=3 selected=false +++++++++++staticText name='Sunny' +++++++++++++inlineTextBox name='Sunny' +++++++row selected=false +++++++++cell name='January' ariaCellColumnIndex=2 ariaCellRowIndex=4 selected=false +++++++++++staticText name='January' +++++++++++++inlineTextBox name='January' +++++++++cell name='02' ariaCellColumnIndex=3 ariaCellRowIndex=4 selected=false +++++++++++staticText name='02' +++++++++++++inlineTextBox name='02' +++++++++cell name='Rainy' ariaCellColumnIndex=5 ariaCellRowIndex=4 selected=false +++++++++++staticText name='Rainy' +++++++++++++inlineTextBox name='Rainy' +++++paragraph +++++++staticText name='done' +++++++++inlineTextBox name='done'
diff --git a/content/test/data/accessibility/css/color-expected-blink.txt b/content/test/data/accessibility/css/color-expected-blink.txt index 2071684..4ec571f 100644 --- a/content/test/data/accessibility/css/color-expected-blink.txt +++ b/content/test/data/accessibility/css/color-expected-blink.txt
@@ -1,15 +1,16 @@ rootWebArea backgroundColor=-1 color=-16777216 -++paragraph backgroundColor=-16776961 color=-65536 -++++staticText name='Red on blue.' backgroundColor=-16776961 color=-65536 -++++++inlineTextBox name='Red on blue.' color=-16777216 -++genericContainer multiline value='Default. Blue background. Green text.' backgroundColor=-1 color=-16777216 -++++staticText name='Default.' backgroundColor=-1 color=-16777216 -++++++inlineTextBox name='Default.' color=-16777216 -++++staticText name=' ' backgroundColor=-1 color=-16777216 -++++++inlineTextBox name=' ' color=-16777216 -++++staticText name='Blue background.' backgroundColor=-16776961 color=-16777216 -++++++inlineTextBox name='Blue background.' color=-16777216 -++++staticText name=' ' backgroundColor=-1 color=-16777216 -++++++inlineTextBox name=' ' color=-16777216 -++++staticText name='Green text.' backgroundColor=-1 color=-16711936 -++++++inlineTextBox name='Green text.' color=-16777216 +++genericContainer ignored backgroundColor=-1 color=-16777216 +++++paragraph backgroundColor=-16776961 color=-65536 +++++++staticText name='Red on blue.' backgroundColor=-16776961 color=-65536 +++++++++inlineTextBox name='Red on blue.' color=-16777216 +++++genericContainer multiline value='Default. Blue background. Green text.' backgroundColor=-1 color=-16777216 +++++++staticText name='Default.' backgroundColor=-1 color=-16777216 +++++++++inlineTextBox name='Default.' color=-16777216 +++++++staticText name=' ' backgroundColor=-1 color=-16777216 +++++++++inlineTextBox name=' ' color=-16777216 +++++++staticText name='Blue background.' backgroundColor=-16776961 color=-16777216 +++++++++inlineTextBox name='Blue background.' color=-16777216 +++++++staticText name=' ' backgroundColor=-1 color=-16777216 +++++++++inlineTextBox name=' ' color=-16777216 +++++++staticText name='Green text.' backgroundColor=-1 color=-16711936 +++++++++inlineTextBox name='Green text.' color=-16777216
diff --git a/content/test/data/accessibility/css/display-to-block-expected-blink.txt b/content/test/data/accessibility/css/display-to-block-expected-blink.txt index 30467267..187d11c 100644 --- a/content/test/data/accessibility/css/display-to-block-expected-blink.txt +++ b/content/test/data/accessibility/css/display-to-block-expected-blink.txt
@@ -1,6 +1,9 @@ rootWebArea -++genericContainer -++++staticText name='Cats' -++++++inlineTextBox name='Cats' -++genericContainer -++++checkBox name='done' checkedState=false +++genericContainer ignored +++++genericContainer ignored +++++++genericContainer +++++++++staticText name='Cats' +++++++++++inlineTextBox name='Cats' +++++++genericContainer +++++++++checkBox name='done' checkedState=false +++++++genericContainer ignored
diff --git a/content/test/data/accessibility/css/display-to-inline-expected-blink.txt b/content/test/data/accessibility/css/display-to-inline-expected-blink.txt index e20e85c..6abd4a4 100644 --- a/content/test/data/accessibility/css/display-to-inline-expected-blink.txt +++ b/content/test/data/accessibility/css/display-to-inline-expected-blink.txt
@@ -1,5 +1,8 @@ rootWebArea -++staticText name='Cats ' -++++inlineTextBox name='Cats ' -++genericContainer -++++checkBox name='done' checkedState=false +++genericContainer ignored +++++genericContainer ignored +++++++staticText name='Cats ' +++++++++inlineTextBox name='Cats ' +++++++genericContainer +++++++++checkBox name='done' checkedState=false +++++++genericContainer ignored
diff --git a/content/test/data/accessibility/css/font-family-expected-blink.txt b/content/test/data/accessibility/css/font-family-expected-blink.txt index b150f49..783f358 100644 --- a/content/test/data/accessibility/css/font-family-expected-blink.txt +++ b/content/test/data/accessibility/css/font-family-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea fontFamily='Times New Roman' -++navigation fontFamily='-webkit-serif' -++++paragraph fontFamily='-webkit-monospace' -++++++staticText fontFamily='-webkit-monospace' name='Monospace' -++++++++inlineTextBox fontFamily='-webkit-monospace' name='Monospace' -++++staticText fontFamily='-webkit-sans-serif' name='Sans serif' -++++++inlineTextBox fontFamily='-webkit-sans-serif' name='Sans serif' -<-- End-of-file --> \ No newline at end of file +++genericContainer ignored fontFamily='-webkit-serif' +++++navigation fontFamily='-webkit-serif' +++++++paragraph fontFamily='-webkit-monospace' +++++++++staticText fontFamily='-webkit-monospace' name='Monospace' +++++++++++inlineTextBox fontFamily='-webkit-monospace' name='Monospace' +++++++presentational ignored fontFamily='-webkit-sans-serif' +++++++++staticText fontFamily='-webkit-sans-serif' name='Sans serif' +++++++++++inlineTextBox fontFamily='-webkit-sans-serif' name='Sans serif'
diff --git a/content/test/data/accessibility/css/font-style-expected-blink.txt b/content/test/data/accessibility/css/font-style-expected-blink.txt index b6123a4..f9f266d 100644 --- a/content/test/data/accessibility/css/font-style-expected-blink.txt +++ b/content/test/data/accessibility/css/font-style-expected-blink.txt
@@ -1,53 +1,54 @@ rootWebArea -++paragraph -++++staticText name='The ' -++++++inlineTextBox name='The ' -++++staticText name='quick' textStyle=1 -++++++inlineTextBox name='quick' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='brown' textStyle=2 -++++++inlineTextBox name='brown' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='fox' textStyle=4 -++++++inlineTextBox name='fox' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='jumped' textStyle=3 -++++++inlineTextBox name='jumped' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='over' textStyle=6 -++++++inlineTextBox name='over' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='dog' textStyle=7 -++++++inlineTextBox name='dog' -++genericContainer multiline value='Normal bold italic underline line-through subscript superscript' -++++staticText name='Normal' -++++++inlineTextBox name='Normal' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='bold' textStyle=1 -++++++inlineTextBox name='bold' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='italic' textStyle=2 -++++++inlineTextBox name='italic' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='underline' textStyle=4 -++++++inlineTextBox name='underline' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='line-through' textStyle=8 -++++++inlineTextBox name='line-through' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='subscript' textPosition=subscript -++++++inlineTextBox name='subscript' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='superscript' textPosition=superscript -++++++inlineTextBox name='superscript' +++genericContainer ignored +++++paragraph +++++++staticText name='The ' +++++++++inlineTextBox name='The ' +++++++staticText name='quick' textStyle=1 +++++++++inlineTextBox name='quick' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='brown' textStyle=2 +++++++++inlineTextBox name='brown' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='fox' textStyle=4 +++++++++inlineTextBox name='fox' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='jumped' textStyle=3 +++++++++inlineTextBox name='jumped' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='over' textStyle=6 +++++++++inlineTextBox name='over' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='dog' textStyle=7 +++++++++inlineTextBox name='dog' +++++genericContainer multiline value='Normal bold italic underline line-through subscript superscript' +++++++staticText name='Normal' +++++++++inlineTextBox name='Normal' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='bold' textStyle=1 +++++++++inlineTextBox name='bold' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='italic' textStyle=2 +++++++++inlineTextBox name='italic' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='underline' textStyle=4 +++++++++inlineTextBox name='underline' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='line-through' textStyle=8 +++++++++inlineTextBox name='line-through' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='subscript' textPosition=subscript +++++++++inlineTextBox name='subscript' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='superscript' textPosition=superscript +++++++++inlineTextBox name='superscript'
diff --git a/content/test/data/accessibility/css/inline-position-relative-expected-blink.txt b/content/test/data/accessibility/css/inline-position-relative-expected-blink.txt index 6af34a76..65bfd04 100644 --- a/content/test/data/accessibility/css/inline-position-relative-expected-blink.txt +++ b/content/test/data/accessibility/css/inline-position-relative-expected-blink.txt
@@ -1,6 +1,8 @@ rootWebArea pageLocation=(0, 0) -++genericContainer pageLocation=(0, 0) -++++staticText pageLocation=(0, 0) name='Before' -++++++inlineTextBox pageLocation=(0, 0) name='Before' -++++staticText pageLocation=(100, 0) name='After' -++++++inlineTextBox pageLocation=(100, 0) name='After' \ No newline at end of file +++genericContainer ignored +++++genericContainer pageLocation=(0, 0) +++++++genericContainer ignored +++++++++staticText pageLocation=(0, 0) name='Before' +++++++++++inlineTextBox pageLocation=(0, 0) name='Before' +++++++staticText pageLocation=(100, 0) name='After' +++++++++inlineTextBox pageLocation=(100, 0) name='After'
diff --git a/content/test/data/accessibility/css/language-expected-blink.txt b/content/test/data/accessibility/css/language-expected-blink.txt index dbeb548..3c844ff 100644 --- a/content/test/data/accessibility/css/language-expected-blink.txt +++ b/content/test/data/accessibility/css/language-expected-blink.txt
@@ -1,6 +1,8 @@ rootWebArea language='en-US' -++paragraph language='es-ES' -++++staticText language='es-ES' name='Espanyol' -++++++inlineTextBox language='es-ES' name='Espanyol' -++staticText language='fr-FR' name='Comment allez-vous?' -++++inlineTextBox language='fr-FR' name='Comment allez-vous?' +++genericContainer ignored language='en-US' +++++paragraph language='es-ES' +++++++staticText language='es-ES' name='Espanyol' +++++++++inlineTextBox language='es-ES' name='Espanyol' +++++presentational ignored language='fr-FR' +++++++staticText language='fr-FR' name='Comment allez-vous?' +++++++++inlineTextBox language='fr-FR' name='Comment allez-vous?'
diff --git a/content/test/data/accessibility/css/pseudo-element-alternative-text-expected-blink.txt b/content/test/data/accessibility/css/pseudo-element-alternative-text-expected-blink.txt index 0a094aa..0d8e4d8f 100644 --- a/content/test/data/accessibility/css/pseudo-element-alternative-text-expected-blink.txt +++ b/content/test/data/accessibility/css/pseudo-element-alternative-text-expected-blink.txt
@@ -1,6 +1,7 @@ rootWebArea -++genericContainer -++++image name='alternative text' -++++staticText name='DOM text' -++++++inlineTextBox name='DOM text' -++++image +++genericContainer ignored +++++genericContainer +++++++image name='alternative text' +++++++staticText name='DOM text' +++++++++inlineTextBox name='DOM text' +++++++image
diff --git a/content/test/data/accessibility/css/table-incomplete-expected-blink.txt b/content/test/data/accessibility/css/table-incomplete-expected-blink.txt index ad8308c2..359688a 100644 --- a/content/test/data/accessibility/css/table-incomplete-expected-blink.txt +++ b/content/test/data/accessibility/css/table-incomplete-expected-blink.txt
@@ -1,9 +1,10 @@ rootWebArea -++table -++++row selected=false -++++++cell name='Fred' selected=false -++++++++staticText name='Fred' -++++++++++inlineTextBox name='Fred' -++++++cell name='Jackson' selected=false -++++++++staticText name='Jackson' -++++++++++inlineTextBox name='Jackson' +++genericContainer ignored +++++table +++++++row selected=false +++++++++cell name='Fred' selected=false +++++++++++staticText name='Fred' +++++++++++++inlineTextBox name='Fred' +++++++++cell name='Jackson' selected=false +++++++++++staticText name='Jackson' +++++++++++++inlineTextBox name='Jackson'
diff --git a/content/test/data/accessibility/css/transform-expected-blink.txt b/content/test/data/accessibility/css/transform-expected-blink.txt index bb5705b0d..1d926a1 100644 --- a/content/test/data/accessibility/css/transform-expected-blink.txt +++ b/content/test/data/accessibility/css/transform-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea pageLocation=(0, 0) -++genericContainer pageLocation=(0, 50) -++++paragraph pageLocation=(0, 50) -++++++staticText pageLocation=(0, 50) name='content' -++++++++inlineTextBox pageLocation=(0, 50) name='content' +++genericContainer ignored +++++genericContainer pageLocation=(0, 50) +++++++paragraph pageLocation=(0, 50) +++++++++staticText pageLocation=(0, 50) name='content' +++++++++++inlineTextBox pageLocation=(0, 50) name='content'
diff --git a/content/test/data/accessibility/event/aria-combo-box-delay-show-list-expected-mac.txt.html b/content/test/data/accessibility/event/aria-combo-box-delay-show-list-expected-mac.txt similarity index 100% rename from content/test/data/accessibility/event/aria-combo-box-delay-show-list-expected-mac.txt.html rename to content/test/data/accessibility/event/aria-combo-box-delay-show-list-expected-mac.txt
diff --git a/content/test/data/accessibility/event/aria-combo-box-delay-show-list-expected-win.txt b/content/test/data/accessibility/event/aria-combo-box-delay-show-list-expected-win.txt new file mode 100644 index 0000000..55aef2f --- /dev/null +++ b/content/test/data/accessibility/event/aria-combo-box-delay-show-list-expected-win.txt
@@ -0,0 +1,5 @@ +EVENT_OBJECT_FOCUS on <li#op1> role=ROLE_SYSTEM_LISTITEM name="Apple" SELECTED,FOCUSED,FOCUSABLE,SELECTABLE PosInSet=1 SetSize=1 +EVENT_OBJECT_HIDE on <body> role=BODY +IA2_EVENT_ACTIVE_DESCENDANT_CHANGED on <input> role=ROLE_SYSTEM_COMBOBOX EXPANDED,FOCUSABLE,HASPOPUP IA2_STATE_EDITABLE,IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE,IA2_STATE_SUPPORTS_AUTOCOMPLETION +IA2_EVENT_TEXT_INSERTED on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSABLE new_text={'<obj><obj>' start=0 end=2} +IA2_EVENT_TEXT_REMOVED on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSABLE old_text={'<obj>' start=0 end=1}
diff --git a/content/test/data/accessibility/event/aria-combo-box-delay-show-list-expected-win.txt.html b/content/test/data/accessibility/event/aria-combo-box-delay-show-list-expected-win.txt.html deleted file mode 100644 index 6647c3d..0000000 --- a/content/test/data/accessibility/event/aria-combo-box-delay-show-list-expected-win.txt.html +++ /dev/null
@@ -1,3 +0,0 @@ -EVENT_OBJECT_FOCUS on <li#op1> role=ROLE_SYSTEM_LISTITEM name="Apple" SELECTED,FOCUSED,FOCUSABLE,SELECTABLE -IA2_EVENT_ACTIVE_DESCENDANT_CHANGED on <input> role=ROLE_SYSTEM_COMBOBOX EXPANDED,FOCUSABLE,HASPOPUP IA2_STATE_EDITABLE,IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE,IA2_STATE_SUPPORTS_AUTOCOMPLETION -IA2_EVENT_TEXT_INSERTED on <div#container> role=DIV new_text={'<obj>' start=0 end=1}
diff --git a/content/test/data/accessibility/event/css-visibility-expected-win.txt b/content/test/data/accessibility/event/css-visibility-expected-win.txt index d04c621..a267f80 100644 --- a/content/test/data/accessibility/event/css-visibility-expected-win.txt +++ b/content/test/data/accessibility/event/css-visibility-expected-win.txt
@@ -1,4 +1,4 @@ -EVENT_OBJECT_HIDE on <div.a> role=DIV name="Heading" level=2 +EVENT_OBJECT_HIDE on <div.a> role=DIV level=2 EVENT_OBJECT_REORDER on <div> role=ROLE_SYSTEM_TOOLBAR IA2_STATE_HORIZONTAL EVENT_OBJECT_SHOW on <div.b> role=ROLE_SYSTEM_GROUPING name="Banner" IA2_EVENT_TEXT_INSERTED on <div> role=ROLE_SYSTEM_TOOLBAR IA2_STATE_HORIZONTAL new_text={'<obj>' start=0 end=1}
diff --git a/content/test/data/accessibility/event/tabindex-removed-on-aria-hidden-expected-win.txt b/content/test/data/accessibility/event/tabindex-removed-on-aria-hidden-expected-win.txt index 537b4b6..e7aca91 100644 --- a/content/test/data/accessibility/event/tabindex-removed-on-aria-hidden-expected-win.txt +++ b/content/test/data/accessibility/event/tabindex-removed-on-aria-hidden-expected-win.txt
@@ -1,3 +1,3 @@ -EVENT_OBJECT_HIDE on <div#d> role=DIV INVISIBLE,FOCUSABLE +EVENT_OBJECT_HIDE on <div#d> role=DIV INVISIBLE EVENT_OBJECT_REORDER on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE IA2_EVENT_TEXT_REMOVED on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE old_text={'<obj>' start=0 end=1}
diff --git a/content/test/data/accessibility/html/a-name-calc-expected-blink.txt b/content/test/data/accessibility/html/a-name-calc-expected-blink.txt index c99ac754..68d657b 100644 --- a/content/test/data/accessibility/html/a-name-calc-expected-blink.txt +++ b/content/test/data/accessibility/html/a-name-calc-expected-blink.txt
@@ -1,22 +1,23 @@ rootWebArea -++link name='InnerText0' nameFrom=contents -++++staticText name='InnerText0' nameFrom=contents -++++++inlineTextBox name='InnerText0' nameFrom=contents -++staticText name=' ' nameFrom=contents -++++inlineTextBox name=' ' nameFrom=contents -++link description='Title1' name='InnerText1' nameFrom=contents descriptionFrom=attribute -++++staticText name='InnerText1' nameFrom=contents -++++++inlineTextBox name='InnerText1' nameFrom=contents -++staticText name=' ' nameFrom=contents -++++inlineTextBox name=' ' nameFrom=contents -++link name='Title2' nameFrom=attribute -++++staticText name='InnerText2' nameFrom=contents -++++++inlineTextBox name='InnerText2' nameFrom=contents -++staticText name=' ' nameFrom=contents -++++inlineTextBox name=' ' nameFrom=contents -++link name='LabelledBy3' nameFrom=relatedElement -++++staticText name='InnerText3' nameFrom=contents -++++++inlineTextBox name='InnerText3' nameFrom=contents -++link name='Title4' nameFrom=title -++link name='Label5' nameFrom=attribute -++link name='LabelledBy6' nameFrom=relatedElement +++genericContainer ignored +++++link name='InnerText0' nameFrom=contents +++++++staticText name='InnerText0' nameFrom=contents +++++++++inlineTextBox name='InnerText0' nameFrom=contents +++++staticText name=' ' nameFrom=contents +++++++inlineTextBox name=' ' nameFrom=contents +++++link description='Title1' name='InnerText1' nameFrom=contents descriptionFrom=attribute +++++++staticText name='InnerText1' nameFrom=contents +++++++++inlineTextBox name='InnerText1' nameFrom=contents +++++staticText name=' ' nameFrom=contents +++++++inlineTextBox name=' ' nameFrom=contents +++++link name='Title2' nameFrom=attribute +++++++staticText name='InnerText2' nameFrom=contents +++++++++inlineTextBox name='InnerText2' nameFrom=contents +++++staticText name=' ' nameFrom=contents +++++++inlineTextBox name=' ' nameFrom=contents +++++link name='LabelledBy3' nameFrom=relatedElement +++++++staticText name='InnerText3' nameFrom=contents +++++++++inlineTextBox name='InnerText3' nameFrom=contents +++++link name='Title4' nameFrom=title +++++link name='Label5' nameFrom=attribute +++++link name='LabelledBy6' nameFrom=relatedElement
diff --git a/content/test/data/accessibility/html/a-name-expected-blink.txt b/content/test/data/accessibility/html/a-name-expected-blink.txt index 80372bce..c01e14e 100644 --- a/content/test/data/accessibility/html/a-name-expected-blink.txt +++ b/content/test/data/accessibility/html/a-name-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++anchor name='named anchor' -++++staticText name='named anchor' -++++++inlineTextBox name='named anchor' -++link name='both a named anchor and a link' -++++staticText name='both a named anchor and a link' -++++++inlineTextBox name='both a named anchor and a link' \ No newline at end of file +++genericContainer ignored +++++anchor name='named anchor' +++++++staticText name='named anchor' +++++++++inlineTextBox name='named anchor' +++++link name='both a named anchor and a link' +++++++staticText name='both a named anchor and a link' +++++++++inlineTextBox name='both a named anchor and a link'
diff --git a/content/test/data/accessibility/html/a-onclick-expected-blink.txt b/content/test/data/accessibility/html/a-onclick-expected-blink.txt index 41a1ed47..9b45cd7 100644 --- a/content/test/data/accessibility/html/a-onclick-expected-blink.txt +++ b/content/test/data/accessibility/html/a-onclick-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++link name='link with no href but onclick' defaultActionVerb=jump -++++staticText name='link with no href but onclick' defaultActionVerb=clickAncestor -++++++inlineTextBox name='link with no href but onclick' -++link name='link with no href and click handler added via script' defaultActionVerb=jump -++++staticText name='link with no href and click handler added via script' defaultActionVerb=clickAncestor -++++++inlineTextBox name='link with no href and click handler added via script' \ No newline at end of file +++genericContainer ignored +++++link name='link with no href but onclick' defaultActionVerb=jump +++++++staticText name='link with no href but onclick' defaultActionVerb=clickAncestor +++++++++inlineTextBox name='link with no href but onclick' +++++link name='link with no href and click handler added via script' defaultActionVerb=jump +++++++staticText name='link with no href and click handler added via script' defaultActionVerb=clickAncestor +++++++++inlineTextBox name='link with no href and click handler added via script'
diff --git a/content/test/data/accessibility/html/abbr-expected-blink.txt b/content/test/data/accessibility/html/abbr-expected-blink.txt index c68f15b..2171ead8 100644 --- a/content/test/data/accessibility/html/abbr-expected-blink.txt +++ b/content/test/data/accessibility/html/abbr-expected-blink.txt
@@ -1,9 +1,10 @@ rootWebArea -++paragraph -++++staticText name='The ' -++++++inlineTextBox name='The ' -++++abbr name='World Health Organization' -++++++staticText name='WHO' -++++++++inlineTextBox name='WHO' -++++staticText name=' was founded in 1948.' -++++++inlineTextBox name=' was founded in 1948.' \ No newline at end of file +++genericContainer ignored +++++paragraph +++++++staticText name='The ' +++++++++inlineTextBox name='The ' +++++++abbr name='World Health Organization' +++++++++staticText name='WHO' +++++++++++inlineTextBox name='WHO' +++++++staticText name=' was founded in 1948.' +++++++++inlineTextBox name=' was founded in 1948.'
diff --git a/content/test/data/accessibility/html/absolute-offscreen-expected-blink.txt b/content/test/data/accessibility/html/absolute-offscreen-expected-blink.txt index a7c06cbdb..af89137 100644 --- a/content/test/data/accessibility/html/absolute-offscreen-expected-blink.txt +++ b/content/test/data/accessibility/html/absolute-offscreen-expected-blink.txt
@@ -1,14 +1,14 @@ rootWebArea clipsChildren=true -++genericContainer size=(0, 0) pageSize=(50, 20) unclippedSize=(50, 20) -++++genericContainer pageSize=(50, 20) unclippedSize=(50, 20) -++++++staticText name='Visible' -++++++++inlineTextBox name='Visible' -++genericContainer size=(0, 0) pageSize=(1, 1) clipsChildren=true -++++genericContainer offscreen pageSize=(1, 1) unclippedSize=(50, 20) -++++++staticText offscreen pageSize=(1, 1) name='Invisible' -++++++++inlineTextBox offscreen pageSize=(1, 1) name='Invisible' -++genericContainer clipsChildren=true -++++genericContainer offscreen pageSize=(50, 1) unclippedSize=(50, 20) -++++++staticText offscreen name='Invisible' -++++++++inlineTextBox offscreen name='Invisible' -<-- End-of-file --> \ No newline at end of file +++genericContainer ignored +++++genericContainer size=(0, 0) pageSize=(50, 20) unclippedSize=(50, 20) +++++++genericContainer pageSize=(50, 20) unclippedSize=(50, 20) +++++++++staticText name='Visible' +++++++++++inlineTextBox name='Visible' +++++genericContainer size=(0, 0) pageSize=(1, 1) clipsChildren=true +++++++genericContainer offscreen pageSize=(1, 1) unclippedSize=(50, 20) +++++++++staticText offscreen pageSize=(1, 1) name='Invisible' +++++++++++inlineTextBox offscreen pageSize=(1, 1) name='Invisible' +++++genericContainer clipsChildren=true +++++++genericContainer offscreen pageSize=(50, 1) unclippedSize=(50, 20) +++++++++staticText offscreen name='Invisible' +++++++++++inlineTextBox offscreen name='Invisible'
diff --git a/content/test/data/accessibility/html/action-verbs-expected-blink.txt b/content/test/data/accessibility/html/action-verbs-expected-blink.txt index bf24fa3..0a4de04 100644 --- a/content/test/data/accessibility/html/action-verbs-expected-blink.txt +++ b/content/test/data/accessibility/html/action-verbs-expected-blink.txt
@@ -1,40 +1,41 @@ rootWebArea name='Action verbs' -++genericContainer -++++staticText name='Generic div' -++++++inlineTextBox name='Generic div' -++heading name='Heading' hierarchicalLevel=1 -++++staticText name='Heading' -++++++inlineTextBox name='Heading' -++button name='Button' defaultActionVerb=press -++link name='Link' defaultActionVerb=jump -++++staticText name='Link' defaultActionVerb=clickAncestor -++++++inlineTextBox name='Link' -++textField defaultActionVerb=activate +++genericContainer ignored ++++genericContainer -++searchBox defaultActionVerb=activate -++++genericContainer -++textField multiline defaultActionVerb=activate -++++genericContainer -++textField defaultActionVerb=activate -++checkBox defaultActionVerb=check checkedState=false -++checkBox defaultActionVerb=uncheck checkedState=true -++radioButton defaultActionVerb=check checkedState=false -++switch name='ARIA Switch' defaultActionVerb=check checkedState=false -++details -++++disclosureTriangle collapsed name='Summary' defaultActionVerb=press -++++++staticText name='Summary' -++++++++inlineTextBox name='Summary' -++popUpButton collapsed value='Pop-up button' defaultActionVerb=open haspopup=menu -++++menuListPopup invisible -++++++menuListOption name='Pop-up button' defaultActionVerb=select selected=true -++genericContainer defaultActionVerb=click -++++staticText name='Div with click handler' defaultActionVerb=clickAncestor -++++++inlineTextBox name='Div with click handler' -++group defaultActionVerb=click -++++paragraph defaultActionVerb=clickAncestor -++++++staticText name='Paragraph with click handler on parent' defaultActionVerb=clickAncestor -++++++++inlineTextBox name='Paragraph with click handler on parent' -++menu -++++menuItem name='Menu item 1' defaultActionVerb=select -++++menuItemCheckBox name='Menu item 2' defaultActionVerb=uncheck checkedState=true -++++menuItemRadio name='Menu item 3' defaultActionVerb=check checkedState=false \ No newline at end of file +++++++staticText name='Generic div' +++++++++inlineTextBox name='Generic div' +++++heading name='Heading' hierarchicalLevel=1 +++++++staticText name='Heading' +++++++++inlineTextBox name='Heading' +++++button name='Button' defaultActionVerb=press +++++link name='Link' defaultActionVerb=jump +++++++staticText name='Link' defaultActionVerb=clickAncestor +++++++++inlineTextBox name='Link' +++++textField defaultActionVerb=activate +++++++genericContainer +++++searchBox defaultActionVerb=activate +++++++genericContainer +++++textField multiline defaultActionVerb=activate +++++++genericContainer +++++textField defaultActionVerb=activate +++++checkBox defaultActionVerb=check checkedState=false +++++checkBox defaultActionVerb=uncheck checkedState=true +++++radioButton defaultActionVerb=check checkedState=false +++++switch name='ARIA Switch' defaultActionVerb=check checkedState=false +++++details +++++++disclosureTriangle collapsed name='Summary' defaultActionVerb=press +++++++++staticText name='Summary' +++++++++++inlineTextBox name='Summary' +++++popUpButton collapsed value='Pop-up button' defaultActionVerb=open haspopup=menu +++++++menuListPopup invisible +++++++++menuListOption name='Pop-up button' defaultActionVerb=select selected=true +++++genericContainer defaultActionVerb=click +++++++staticText name='Div with click handler' defaultActionVerb=clickAncestor +++++++++inlineTextBox name='Div with click handler' +++++group defaultActionVerb=click +++++++paragraph defaultActionVerb=clickAncestor +++++++++staticText name='Paragraph with click handler on parent' defaultActionVerb=clickAncestor +++++++++++inlineTextBox name='Paragraph with click handler on parent' +++++menu +++++++menuItem name='Menu item 1' defaultActionVerb=select +++++++menuItemCheckBox name='Menu item 2' defaultActionVerb=uncheck checkedState=true +++++++menuItemRadio name='Menu item 3' defaultActionVerb=check checkedState=false
diff --git a/content/test/data/accessibility/html/address-expected-blink.txt b/content/test/data/accessibility/html/address-expected-blink.txt index cc35b42..28da951 100644 --- a/content/test/data/accessibility/html/address-expected-blink.txt +++ b/content/test/data/accessibility/html/address-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++genericContainer -++++staticText name='Please contact John Citizen for more information.' -++++++inlineTextBox name='Please contact John Citizen for more information.' +++genericContainer ignored +++++genericContainer +++++++staticText name='Please contact John Citizen for more information.' +++++++++inlineTextBox name='Please contact John Citizen for more information.'
diff --git a/content/test/data/accessibility/html/article-expected-blink.txt b/content/test/data/accessibility/html/article-expected-blink.txt index dcf5b9f..84a6c34 100644 --- a/content/test/data/accessibility/html/article-expected-blink.txt +++ b/content/test/data/accessibility/html/article-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++article -++++staticText name='This is an article element.' -++++++inlineTextBox name='This is an article element.' +++genericContainer ignored +++++article +++++++staticText name='This is an article element.' +++++++++inlineTextBox name='This is an article element.'
diff --git a/content/test/data/accessibility/html/aside-expected-blink.txt b/content/test/data/accessibility/html/aside-expected-blink.txt index 8d99b50..71468ffe 100644 --- a/content/test/data/accessibility/html/aside-expected-blink.txt +++ b/content/test/data/accessibility/html/aside-expected-blink.txt
@@ -1,11 +1,12 @@ rootWebArea -++paragraph -++++staticText name='The aside tag defines some content aside from the content it is placed in.' -++++++inlineTextBox name='The aside tag defines some content aside from the content it is placed in.' -++complementary -++++heading name='Aside tag' hierarchicalLevel=4 -++++++staticText name='Aside tag' -++++++++inlineTextBox name='Aside tag' +++genericContainer ignored ++++paragraph -++++++staticText name='The aside content should be related to the surrounding content.' -++++++++inlineTextBox name='The aside content should be related to the surrounding content.' \ No newline at end of file +++++++staticText name='The aside tag defines some content aside from the content it is placed in.' +++++++++inlineTextBox name='The aside tag defines some content aside from the content it is placed in.' +++++complementary +++++++heading name='Aside tag' hierarchicalLevel=4 +++++++++staticText name='Aside tag' +++++++++++inlineTextBox name='Aside tag' +++++++paragraph +++++++++staticText name='The aside content should be related to the surrounding content.' +++++++++++inlineTextBox name='The aside content should be related to the surrounding content.'
diff --git a/content/test/data/accessibility/html/b-expected-blink.txt b/content/test/data/accessibility/html/b-expected-blink.txt index 2d7d50ee..d93c310 100644 --- a/content/test/data/accessibility/html/b-expected-blink.txt +++ b/content/test/data/accessibility/html/b-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++paragraph -++++staticText name='Some ' -++++++inlineTextBox name='Some ' -++++staticText name='bold' textStyle=1 -++++++inlineTextBox name='bold' -++++staticText name=' text' -++++++inlineTextBox name=' text' \ No newline at end of file +++genericContainer ignored +++++paragraph +++++++staticText name='Some ' +++++++++inlineTextBox name='Some ' +++++++staticText name='bold' textStyle=1 +++++++++inlineTextBox name='bold' +++++++staticText name=' text' +++++++++inlineTextBox name=' text'
diff --git a/content/test/data/accessibility/html/blockquote-expected-blink.txt b/content/test/data/accessibility/html/blockquote-expected-blink.txt index ffa8de7b..0697bf4 100644 --- a/content/test/data/accessibility/html/blockquote-expected-blink.txt +++ b/content/test/data/accessibility/html/blockquote-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++blockquote -++++paragraph -++++++staticText name='First blockquote has a child element.' -++++++++inlineTextBox name='First blockquote has a child element.' -++blockquote -++++staticText name='Second blockquote has no child.' -++++++inlineTextBox name='Second blockquote has no child.' \ No newline at end of file +++genericContainer ignored +++++blockquote +++++++paragraph +++++++++staticText name='First blockquote has a child element.' +++++++++++inlineTextBox name='First blockquote has a child element.' +++++blockquote +++++++staticText name='Second blockquote has no child.' +++++++++inlineTextBox name='Second blockquote has no child.'
diff --git a/content/test/data/accessibility/html/body-expected-blink.txt b/content/test/data/accessibility/html/body-expected-blink.txt index 523cdc2..927d40b 100644 --- a/content/test/data/accessibility/html/body-expected-blink.txt +++ b/content/test/data/accessibility/html/body-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++paragraph -++++staticText name='This test is for body tag' -++++++inlineTextBox name='This test is for body tag' \ No newline at end of file +++genericContainer ignored +++++paragraph +++++++staticText name='This test is for body tag' +++++++++inlineTextBox name='This test is for body tag'
diff --git a/content/test/data/accessibility/html/body-tabindex-expected-blink.txt b/content/test/data/accessibility/html/body-tabindex-expected-blink.txt index 6b445d7..c873c46 100644 --- a/content/test/data/accessibility/html/body-tabindex-expected-blink.txt +++ b/content/test/data/accessibility/html/body-tabindex-expected-blink.txt
@@ -1,5 +1,5 @@ rootWebArea -++paragraph -++++staticText name='This test is for the body tag with a tabindex' -++++++inlineTextBox name='This test is for the body tag with a tabindex' - +++genericContainer ignored name='This test is for the body tag with a tabindex' +++++paragraph +++++++staticText name='This test is for the body tag with a tabindex' +++++++++inlineTextBox name='This test is for the body tag with a tabindex'
diff --git a/content/test/data/accessibility/html/bounds-absolute-expected-blink.txt b/content/test/data/accessibility/html/bounds-absolute-expected-blink.txt index 919c65e..a7132025 100644 --- a/content/test/data/accessibility/html/bounds-absolute-expected-blink.txt +++ b/content/test/data/accessibility/html/bounds-absolute-expected-blink.txt
@@ -1,6 +1,6 @@ rootWebArea clipsChildren=true -++genericContainer size=(200, 200) pageSize=(200, 200) unclippedSize=(200, 200) clipsChildren=true -++++dialog size=(200, 200) pageLocation=(150, 50) pageSize=(200, 200) unclippedLocation=(150, 50) unclippedSize=(200, 200) -++++++button size=(160, 50) pageSize=(160, 50) name='Button 1' -++++++button size=(160, 50) pageSize=(160, 50) name='Button 2' -<-- End-of-file --> \ No newline at end of file +++genericContainer ignored +++++genericContainer size=(200, 200) pageSize=(200, 200) unclippedSize=(200, 200) clipsChildren=true +++++++dialog size=(200, 200) pageLocation=(150, 50) pageSize=(200, 200) unclippedLocation=(150, 50) unclippedSize=(200, 200) +++++++++button size=(160, 50) pageSize=(160, 50) name='Button 1' +++++++++button size=(160, 50) pageSize=(160, 50) name='Button 2'
diff --git a/content/test/data/accessibility/html/bounds-clips-expected-blink.txt b/content/test/data/accessibility/html/bounds-clips-expected-blink.txt index d623d6d..1eb8a28 100644 --- a/content/test/data/accessibility/html/bounds-clips-expected-blink.txt +++ b/content/test/data/accessibility/html/bounds-clips-expected-blink.txt
@@ -1,20 +1,22 @@ rootWebArea -++genericContainer -++++staticText name='Visible' -++++++inlineTextBox name='Visible' -++genericContainer size=(200, 100) -++++staticText name='Also visible' -++++++inlineTextBox name='Also visible' -++genericContainer -++++staticText name='Also visible' -++++++inlineTextBox name='Also ' -++++++inlineTextBox name='visible' -++genericContainer -++++staticText offscreen name='Hidden' -++++++inlineTextBox offscreen name='Hidden' -++genericContainer size=(10, 10) +++genericContainer ignored ++++genericContainer -++++++staticText offscreen name='Also hidden' -++++++++inlineTextBox offscreen name='Also ' -++++++++inlineTextBox offscreen name='hidden' -<-- End-of-file --> \ No newline at end of file +++++++staticText name='Visible' +++++++++inlineTextBox name='Visible' +++++genericContainer ignored +++++++genericContainer size=(200, 100) +++++++++staticText name='Also visible' +++++++++++inlineTextBox name='Also visible' +++++genericContainer ignored +++++++genericContainer +++++++++staticText name='Also visible' +++++++++++inlineTextBox name='Also ' +++++++++++inlineTextBox name='visible' +++++genericContainer +++++++staticText offscreen name='Hidden' +++++++++inlineTextBox offscreen name='Hidden' +++++genericContainer size=(10, 10) +++++++genericContainer +++++++++staticText offscreen name='Also hidden' +++++++++++inlineTextBox offscreen name='Also ' +++++++++++inlineTextBox offscreen name='hidden'
diff --git a/content/test/data/accessibility/html/bounds-fixed-expected-blink.txt b/content/test/data/accessibility/html/bounds-fixed-expected-blink.txt index 919c65e..a7132025 100644 --- a/content/test/data/accessibility/html/bounds-fixed-expected-blink.txt +++ b/content/test/data/accessibility/html/bounds-fixed-expected-blink.txt
@@ -1,6 +1,6 @@ rootWebArea clipsChildren=true -++genericContainer size=(200, 200) pageSize=(200, 200) unclippedSize=(200, 200) clipsChildren=true -++++dialog size=(200, 200) pageLocation=(150, 50) pageSize=(200, 200) unclippedLocation=(150, 50) unclippedSize=(200, 200) -++++++button size=(160, 50) pageSize=(160, 50) name='Button 1' -++++++button size=(160, 50) pageSize=(160, 50) name='Button 2' -<-- End-of-file --> \ No newline at end of file +++genericContainer ignored +++++genericContainer size=(200, 200) pageSize=(200, 200) unclippedSize=(200, 200) clipsChildren=true +++++++dialog size=(200, 200) pageLocation=(150, 50) pageSize=(200, 200) unclippedLocation=(150, 50) unclippedSize=(200, 200) +++++++++button size=(160, 50) pageSize=(160, 50) name='Button 1' +++++++++button size=(160, 50) pageSize=(160, 50) name='Button 2'
diff --git a/content/test/data/accessibility/html/bounds-inherits-expected-blink.txt b/content/test/data/accessibility/html/bounds-inherits-expected-blink.txt index 66c17c9..e5bcc22 100644 --- a/content/test/data/accessibility/html/bounds-inherits-expected-blink.txt +++ b/content/test/data/accessibility/html/bounds-inherits-expected-blink.txt
@@ -1,5 +1,5 @@ rootWebArea -++genericContainer size=(200, 200) -++++genericContainer size=(0, 0) -++++++genericContainer offscreen size=(0, 0) -<-- End-of-file --> +++genericContainer ignored +++++genericContainer size=(200, 200) +++++++genericContainer size=(0, 0) +++++++++genericContainer offscreen size=(0, 0)
diff --git a/content/test/data/accessibility/html/br-expected-blink.txt b/content/test/data/accessibility/html/br-expected-blink.txt index 2342cef..ff473dd7 100644 --- a/content/test/data/accessibility/html/br-expected-blink.txt +++ b/content/test/data/accessibility/html/br-expected-blink.txt
@@ -1,15 +1,15 @@ rootWebArea -++lineBreak size=(0, 0) name='<newline>' -++++inlineTextBox name='<newline>' -++staticText name='Text line 1' -++++inlineTextBox name='Text line 1' -++paragraph -++++staticText name='Text line 2' -++++++inlineTextBox name='Text line 2' +++genericContainer ignored ++++lineBreak size=(0, 0) name='<newline>' ++++++inlineTextBox name='<newline>' -++++staticText name='Text line 3' -++++++inlineTextBox name='Text line 3' -++lineBreak size=(0, 0) name='<newline>' -++++inlineTextBox name='<newline>' -<-- End-of-file --> \ No newline at end of file +++++staticText name='Text line 1' +++++++inlineTextBox name='Text line 1' +++++paragraph +++++++staticText name='Text line 2' +++++++++inlineTextBox name='Text line 2' +++++++lineBreak size=(0, 0) name='<newline>' +++++++++inlineTextBox name='<newline>' +++++++staticText name='Text line 3' +++++++++inlineTextBox name='Text line 3' +++++lineBreak size=(0, 0) name='<newline>' +++++++inlineTextBox name='<newline>'
diff --git a/content/test/data/accessibility/html/button-alt-changed-expected-blink.txt b/content/test/data/accessibility/html/button-alt-changed-expected-blink.txt index 4b306f40..51e911b 100644 --- a/content/test/data/accessibility/html/button-alt-changed-expected-blink.txt +++ b/content/test/data/accessibility/html/button-alt-changed-expected-blink.txt
@@ -1,3 +1,4 @@ rootWebArea -++genericContainer name='Done' -++button name='After' +++genericContainer ignored +++++genericContainer name='Done' +++++button name='After'
diff --git a/content/test/data/accessibility/html/button-content-changed-expected-blink.txt b/content/test/data/accessibility/html/button-content-changed-expected-blink.txt index 4b306f40..51e911b 100644 --- a/content/test/data/accessibility/html/button-content-changed-expected-blink.txt +++ b/content/test/data/accessibility/html/button-content-changed-expected-blink.txt
@@ -1,3 +1,4 @@ rootWebArea -++genericContainer name='Done' -++button name='After' +++genericContainer ignored +++++genericContainer name='Done' +++++button name='After'
diff --git a/content/test/data/accessibility/html/button-expected-blink.txt b/content/test/data/accessibility/html/button-expected-blink.txt index c139492..cc5312f 100644 --- a/content/test/data/accessibility/html/button-expected-blink.txt +++ b/content/test/data/accessibility/html/button-expected-blink.txt
@@ -1,3 +1,3 @@ rootWebArea ++genericContainer -++++button name='Click me!' \ No newline at end of file +++++button name='Click me!'
diff --git a/content/test/data/accessibility/html/button-name-calc-expected-blink.txt b/content/test/data/accessibility/html/button-name-calc-expected-blink.txt index 6ef3d2fd..957aa72b 100644 --- a/content/test/data/accessibility/html/button-name-calc-expected-blink.txt +++ b/content/test/data/accessibility/html/button-name-calc-expected-blink.txt
@@ -1,10 +1,11 @@ rootWebArea -++button name='InnerText0' -++button description='Title1' name='InnerText1' descriptionFrom=attribute -++button description='Title2' name='AriaLabel2' descriptionFrom=attribute -++button description='Title3' name='LabelledBy3' descriptionFrom=attribute -++button description='DescribedBy4' name='LabelledBy4' descriptionFrom=relatedElement -++button description='DescribedBy5' name='InnerText5' descriptionFrom=relatedElement -++button name='Outer inner' -++button name='Outer inner1' -++button name='Outer grandchild' +++genericContainer ignored +++++button name='InnerText0' +++++button description='Title1' name='InnerText1' descriptionFrom=attribute +++++button description='Title2' name='AriaLabel2' descriptionFrom=attribute +++++button description='Title3' name='LabelledBy3' descriptionFrom=attribute +++++button description='DescribedBy4' name='LabelledBy4' descriptionFrom=relatedElement +++++button description='DescribedBy5' name='InnerText5' descriptionFrom=relatedElement +++++button name='Outer inner' +++++button name='Outer inner1' +++++button name='Outer grandchild'
diff --git a/content/test/data/accessibility/html/button-submit-expected-blink.txt b/content/test/data/accessibility/html/button-submit-expected-blink.txt index 6f852167..33f43ba 100644 --- a/content/test/data/accessibility/html/button-submit-expected-blink.txt +++ b/content/test/data/accessibility/html/button-submit-expected-blink.txt
@@ -1,12 +1,13 @@ rootWebArea -++form -++++textField -++++++genericContainer -++++button default name='First submit in a form is a valid default button' -++++button name='Second submit in a form not a valid default button' -++form -++++textField -++++++genericContainer -++++button default name='First button in form is a valid default button' -++++button name='Second button in form not a valid default button' -++button name='Submit outside of form not a valid default button' +++genericContainer ignored +++++form +++++++textField +++++++++genericContainer +++++++button default name='First submit in a form is a valid default button' +++++++button name='Second submit in a form not a valid default button' +++++form +++++++textField +++++++++genericContainer +++++++button default name='First button in form is a valid default button' +++++++button name='Second button in form not a valid default button' +++++button name='Submit outside of form not a valid default button'
diff --git a/content/test/data/accessibility/html/button-with-listbox-popup-expected-blink.txt b/content/test/data/accessibility/html/button-with-listbox-popup-expected-blink.txt index 6096db6..25f6161 100644 --- a/content/test/data/accessibility/html/button-with-listbox-popup-expected-blink.txt +++ b/content/test/data/accessibility/html/button-with-listbox-popup-expected-blink.txt
@@ -1,12 +1,13 @@ rootWebArea -++genericContainer +++genericContainer ignored ++++genericContainer -++++++staticText name='Choose one:' -++++++++inlineTextBox name='Choose one:' -++++popUpButton name='Choose one: Foo' -++++++staticText name='Foo' -++++++++inlineTextBox name='Foo' -++++listBox name='Choose one:' -++++++listBoxOption name='Baz' selected=false -++++++listBoxOption name='Bar' selected=false -++++++listBoxOption name='Foo' selected=false +++++++genericContainer +++++++++staticText name='Choose one:' +++++++++++inlineTextBox name='Choose one:' +++++++popUpButton name='Choose one: Foo' +++++++++staticText name='Foo' +++++++++++inlineTextBox name='Foo' +++++++listBox name='Choose one:' +++++++++listBoxOption name='Baz' selected=false +++++++++listBoxOption name='Bar' selected=false +++++++++listBoxOption name='Foo' selected=false
diff --git a/content/test/data/accessibility/html/caption-expected-blink.txt b/content/test/data/accessibility/html/caption-expected-blink.txt index f9b6abe..124e1c2 100644 --- a/content/test/data/accessibility/html/caption-expected-blink.txt +++ b/content/test/data/accessibility/html/caption-expected-blink.txt
@@ -1,27 +1,28 @@ rootWebArea -++table name='Browser and Engine' -++++caption -++++++staticText name='Browser and Engine' -++++++++inlineTextBox name='Browser and ' -++++++++inlineTextBox name='Engine' -++++row -++++++columnHeader name='Browser' -++++++++staticText name='Browser' -++++++++++inlineTextBox name='Browser' -++++++columnHeader name='Engine' -++++++++staticText name='Engine' +++genericContainer ignored +++++table name='Browser and Engine' +++++++caption +++++++++staticText name='Browser and Engine' +++++++++++inlineTextBox name='Browser and ' ++++++++++inlineTextBox name='Engine' -++++row -++++++cell name='Chrome' -++++++++staticText name='Chrome' -++++++++++inlineTextBox name='Chrome' -++++++cell name='Blink' -++++++++staticText name='Blink' -++++++++++inlineTextBox name='Blink' -++++row -++++++cell name='Safari' -++++++++staticText name='Safari' -++++++++++inlineTextBox name='Safari' -++++++cell name='WebKit' -++++++++staticText name='WebKit' -++++++++++inlineTextBox name='WebKit' +++++++row +++++++++columnHeader name='Browser' +++++++++++staticText name='Browser' +++++++++++++inlineTextBox name='Browser' +++++++++columnHeader name='Engine' +++++++++++staticText name='Engine' +++++++++++++inlineTextBox name='Engine' +++++++row +++++++++cell name='Chrome' +++++++++++staticText name='Chrome' +++++++++++++inlineTextBox name='Chrome' +++++++++cell name='Blink' +++++++++++staticText name='Blink' +++++++++++++inlineTextBox name='Blink' +++++++row +++++++++cell name='Safari' +++++++++++staticText name='Safari' +++++++++++++inlineTextBox name='Safari' +++++++++cell name='WebKit' +++++++++++staticText name='WebKit' +++++++++++++inlineTextBox name='WebKit'
diff --git a/content/test/data/accessibility/html/checkbox-name-calc-expected-blink.txt b/content/test/data/accessibility/html/checkbox-name-calc-expected-blink.txt index 849ff4f..780aef34 100644 --- a/content/test/data/accessibility/html/checkbox-name-calc-expected-blink.txt +++ b/content/test/data/accessibility/html/checkbox-name-calc-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++checkBox name='Title0' checkedState=false -++checkBox description='Title1' name='Label1' descriptionFrom=attribute checkedState=false -++checkBox description='Title2' name='AriaLabel2' descriptionFrom=attribute checkedState=false -++checkBox description='Title3' name='LabelledBy3' descriptionFrom=attribute checkedState=false -++checkBox description='DescribedBy4' name='LabelledBy4' descriptionFrom=relatedElement checkedState=false -++checkBox description='DescribedBy5' descriptionFrom=relatedElement checkedState=false \ No newline at end of file +++genericContainer ignored +++++checkBox name='Title0' checkedState=false +++++checkBox description='Title1' name='Label1' descriptionFrom=attribute checkedState=false +++++checkBox description='Title2' name='AriaLabel2' descriptionFrom=attribute checkedState=false +++++checkBox description='Title3' name='LabelledBy3' descriptionFrom=attribute checkedState=false +++++checkBox description='DescribedBy4' name='LabelledBy4' descriptionFrom=relatedElement checkedState=false +++++checkBox description='DescribedBy5' descriptionFrom=relatedElement checkedState=false
diff --git a/content/test/data/accessibility/html/cite-expected-blink.txt b/content/test/data/accessibility/html/cite-expected-blink.txt index 296dafa5..d6804292d 100644 --- a/content/test/data/accessibility/html/cite-expected-blink.txt +++ b/content/test/data/accessibility/html/cite-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++image name='Pipe' -++paragraph -++++staticText name='The pipe' -++++++inlineTextBox name='The pipe' -++++staticText name=' clicked by SomeOne.' -++++++inlineTextBox name=' clicked by SomeOne.' \ No newline at end of file +++genericContainer ignored +++++image name='Pipe' +++++paragraph +++++++staticText name='The pipe' +++++++++inlineTextBox name='The pipe' +++++++staticText name=' clicked by SomeOne.' +++++++++inlineTextBox name=' clicked by SomeOne.'
diff --git a/content/test/data/accessibility/html/col-expected-blink.txt b/content/test/data/accessibility/html/col-expected-blink.txt index a349d2dc..fb46664 100644 --- a/content/test/data/accessibility/html/col-expected-blink.txt +++ b/content/test/data/accessibility/html/col-expected-blink.txt
@@ -1,16 +1,17 @@ rootWebArea -++table -++++row -++++++columnHeader name='Browser' -++++++++staticText name='Browser' -++++++++++inlineTextBox name='Browser' -++++++columnHeader name='Rendering Engine' -++++++++staticText name='Rendering Engine' -++++++++++inlineTextBox name='Rendering Engine' -++++row -++++++cell name='Chrome' -++++++++staticText name='Chrome' -++++++++++inlineTextBox name='Chrome' -++++++cell name='Blink' -++++++++staticText name='Blink' -++++++++++inlineTextBox name='Blink' +++genericContainer ignored +++++table +++++++row +++++++++columnHeader name='Browser' +++++++++++staticText name='Browser' +++++++++++++inlineTextBox name='Browser' +++++++++columnHeader name='Rendering Engine' +++++++++++staticText name='Rendering Engine' +++++++++++++inlineTextBox name='Rendering Engine' +++++++row +++++++++cell name='Chrome' +++++++++++staticText name='Chrome' +++++++++++++inlineTextBox name='Chrome' +++++++++cell name='Blink' +++++++++++staticText name='Blink' +++++++++++++inlineTextBox name='Blink'
diff --git a/content/test/data/accessibility/html/colgroup-expected-blink.txt b/content/test/data/accessibility/html/colgroup-expected-blink.txt index 42fbed0d..a7217ef 100644 --- a/content/test/data/accessibility/html/colgroup-expected-blink.txt +++ b/content/test/data/accessibility/html/colgroup-expected-blink.txt
@@ -1,16 +1,17 @@ rootWebArea -++table -++++row -++++++columnHeader name='Single' -++++++++staticText name='Single' -++++++++++inlineTextBox name='Single' -++++++columnHeader name='Pair' -++++++++staticText name='Pair' -++++++++++inlineTextBox name='Pair' -++++row -++++++cell name='A' -++++++++staticText name='A' -++++++++++inlineTextBox name='A' -++++++cell name='AA' -++++++++staticText name='AA' -++++++++++inlineTextBox name='AA' +++genericContainer ignored +++++table +++++++row +++++++++columnHeader name='Single' +++++++++++staticText name='Single' +++++++++++++inlineTextBox name='Single' +++++++++columnHeader name='Pair' +++++++++++staticText name='Pair' +++++++++++++inlineTextBox name='Pair' +++++++row +++++++++cell name='A' +++++++++++staticText name='A' +++++++++++++inlineTextBox name='A' +++++++++cell name='AA' +++++++++++staticText name='AA' +++++++++++++inlineTextBox name='AA'
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt index 58fcee4..1d3eff2a 100644 --- a/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt +++ b/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt
@@ -1,32 +1,33 @@ rootWebArea -++genericContainer editable multiline richlyEditable value='A contenteditable with a link and an and a .<newline><newline>Always expose editable tables as tables.<newline>Editable list item.' editableRoot=true -++++paragraph editable richlyEditable -++++++staticText editable richlyEditable name='A contenteditable with a ' -++++++++inlineTextBox name='A contenteditable with a ' -++++++link editable linked richlyEditable name='link' -++++++++staticText editable linked richlyEditable name='link' -++++++++++inlineTextBox name='link' -++++++staticText editable richlyEditable name=' and an ' -++++++++inlineTextBox name=' and an ' -++++++image editable richlyEditable name='Image' -++++++staticText editable richlyEditable name=' and a ' -++++++++inlineTextBox name=' and a ' -++++++button editable richlyEditable name='Button' -++++++staticText editable richlyEditable name='.' -++++++++inlineTextBox name='.' -++++table editable richlyEditable -++++++row editable richlyEditable -++++++++cell editable richlyEditable name='Always expose editable tables as tables.' -++++++++++staticText editable richlyEditable name='Always expose editable tables as tables.' -++++++++++++inlineTextBox name='Always expose editable tables as tables.' -++++list editable richlyEditable -++++++listItem editable richlyEditable -++++++++listMarker editable richlyEditable name='1. ' -++++++++staticText editable richlyEditable name='Editable list item.' -++++++++++inlineTextBox name='Editable list item.' -++paragraph -++++staticText name='Non-editable paragraph.' -++++++inlineTextBox name='Non-editable paragraph.' -++paragraph editable multiline richlyEditable value='Should keep the role but change the state.' editableRoot=true -++++staticText editable richlyEditable name='Should keep the role but change the state.' -++++++inlineTextBox name='Should keep the role but change the state.' +++genericContainer ignored +++++genericContainer editable multiline richlyEditable value='A contenteditable with a link and an and a .<newline><newline>Always expose editable tables as tables.<newline>Editable list item.' editableRoot=true +++++++paragraph editable richlyEditable +++++++++staticText editable richlyEditable name='A contenteditable with a ' +++++++++++inlineTextBox name='A contenteditable with a ' +++++++++link editable linked richlyEditable name='link' +++++++++++staticText editable linked richlyEditable name='link' +++++++++++++inlineTextBox name='link' +++++++++staticText editable richlyEditable name=' and an ' +++++++++++inlineTextBox name=' and an ' +++++++++image editable richlyEditable name='Image' +++++++++staticText editable richlyEditable name=' and a ' +++++++++++inlineTextBox name=' and a ' +++++++++button editable richlyEditable name='Button' +++++++++staticText editable richlyEditable name='.' +++++++++++inlineTextBox name='.' +++++++table editable richlyEditable +++++++++row editable richlyEditable +++++++++++cell editable richlyEditable name='Always expose editable tables as tables.' +++++++++++++staticText editable richlyEditable name='Always expose editable tables as tables.' +++++++++++++++inlineTextBox name='Always expose editable tables as tables.' +++++++list editable richlyEditable +++++++++listItem editable richlyEditable +++++++++++listMarker editable richlyEditable name='1. ' +++++++++++staticText editable richlyEditable name='Editable list item.' +++++++++++++inlineTextBox name='Editable list item.' +++++paragraph +++++++staticText name='Non-editable paragraph.' +++++++++inlineTextBox name='Non-editable paragraph.' +++++paragraph editable multiline richlyEditable value='Should keep the role but change the state.' editableRoot=true +++++++staticText editable richlyEditable name='Should keep the role but change the state.' +++++++++inlineTextBox name='Should keep the role but change the state.'
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt index c8b358b..337519f7 100644 --- a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt +++ b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt
@@ -1,26 +1,27 @@ rootWebArea -++genericContainer editable multiline richlyEditable value='A contenteditable with a link and an and a .<newline><newline>Always expose editable tables as tables.<newline>Editable list item.' editableRoot=true TreeData.textSelStartOffset=0 TreeData.textSelEndOffset=3 -++++paragraph editable richlyEditable -++++++staticText editable richlyEditable name='A contenteditable with a ' -++++++++inlineTextBox name='A contenteditable with a ' -++++++link editable richlyEditable name='link' -++++++++staticText editable richlyEditable name='link' -++++++++++inlineTextBox name='link' -++++++staticText editable richlyEditable name=' and an ' -++++++++inlineTextBox name=' and an ' -++++++image editable richlyEditable name='Image' -++++++staticText editable richlyEditable name=' and a ' -++++++++inlineTextBox name=' and a ' -++++++button editable richlyEditable name='Button' -++++++staticText editable richlyEditable name='.' -++++++++inlineTextBox name='.' -++++table editable richlyEditable -++++++row editable richlyEditable -++++++++cell editable richlyEditable name='Always expose editable tables as tables.' -++++++++++staticText editable richlyEditable name='Always expose editable tables as tables.' -++++++++++++inlineTextBox name='Always expose editable tables as tables.' -++++list editable richlyEditable -++++++listItem editable richlyEditable -++++++++listMarker editable richlyEditable name='1. ' -++++++++staticText editable richlyEditable name='Editable list item.' -++++++++++inlineTextBox name='Editable list item.' +++genericContainer ignored +++++genericContainer editable multiline richlyEditable value='A contenteditable with a link and an and a .<newline><newline>Always expose editable tables as tables.<newline>Editable list item.' editableRoot=true TreeData.textSelStartOffset=0 TreeData.textSelEndOffset=3 +++++++paragraph editable richlyEditable +++++++++staticText editable richlyEditable name='A contenteditable with a ' +++++++++++inlineTextBox name='A contenteditable with a ' +++++++++link editable richlyEditable name='link' +++++++++++staticText editable richlyEditable name='link' +++++++++++++inlineTextBox name='link' +++++++++staticText editable richlyEditable name=' and an ' +++++++++++inlineTextBox name=' and an ' +++++++++image editable richlyEditable name='Image' +++++++++staticText editable richlyEditable name=' and a ' +++++++++++inlineTextBox name=' and a ' +++++++++button editable richlyEditable name='Button' +++++++++staticText editable richlyEditable name='.' +++++++++++inlineTextBox name='.' +++++++table editable richlyEditable +++++++++row editable richlyEditable +++++++++++cell editable richlyEditable name='Always expose editable tables as tables.' +++++++++++++staticText editable richlyEditable name='Always expose editable tables as tables.' +++++++++++++++inlineTextBox name='Always expose editable tables as tables.' +++++++list editable richlyEditable +++++++++listItem editable richlyEditable +++++++++++listMarker editable richlyEditable name='1. ' +++++++++++staticText editable richlyEditable name='Editable list item.' +++++++++++++inlineTextBox name='Editable list item.'
diff --git a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-blink.txt index 4bf712d1..85380046 100644 --- a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-blink.txt +++ b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-blink.txt
@@ -1,15 +1,17 @@ rootWebArea -++genericContainer editable multiline richlyEditable value='This is editable.<newline><newline>This is not editable.<newline><newline><newline>But this one is.<newline><newline>So is this one.' editableRoot=true -++++paragraph editable richlyEditable -++++++staticText editable richlyEditable name='This is editable.' -++++++++inlineTextBox name='This is editable.' -++++staticText name='This is not editable.' -++++++inlineTextBox name='This is not editable.' -++++lineBreak name='<newline>' -++++++inlineTextBox name='<newline>' -++++paragraph editable multiline richlyEditable value='But this one is.' editableRoot=true -++++++staticText editable richlyEditable name='But this one is.' -++++++++inlineTextBox name='But this one is.' -++++paragraph editable multiline richlyEditable value='So is this one.' -++++++staticText editable richlyEditable name='So is this one.' -++++++++inlineTextBox name='So is this one.' +++genericContainer ignored +++++genericContainer editable multiline richlyEditable value='This is editable.<newline><newline>This is not editable.<newline><newline><newline>But this one is.<newline><newline>So is this one.' editableRoot=true +++++++paragraph editable richlyEditable +++++++++staticText editable richlyEditable name='This is editable.' +++++++++++inlineTextBox name='This is editable.' +++++++genericContainer ignored +++++++++staticText name='This is not editable.' +++++++++++inlineTextBox name='This is not editable.' +++++++++lineBreak name='<newline>' +++++++++++inlineTextBox name='<newline>' +++++++++paragraph editable multiline richlyEditable value='But this one is.' editableRoot=true +++++++++++staticText editable richlyEditable name='But this one is.' +++++++++++++inlineTextBox name='But this one is.' +++++++paragraph editable multiline richlyEditable value='So is this one.' +++++++++staticText editable richlyEditable name='So is this one.' +++++++++++inlineTextBox name='So is this one.'
diff --git a/content/test/data/accessibility/html/contenteditable-with-no-descendants-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-with-no-descendants-expected-blink.txt index d82c315..6793560 100644 --- a/content/test/data/accessibility/html/contenteditable-with-no-descendants-expected-blink.txt +++ b/content/test/data/accessibility/html/contenteditable-with-no-descendants-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++genericContainer editable multiline richlyEditable name='label' -++genericContainer editable multiline richlyEditable description='description' descriptionFrom=relatedElement -++genericContainer editable multiline richlyEditable name='title' -++paragraph -++++staticText name='description' -++++++inlineTextBox name='description' \ No newline at end of file +++genericContainer ignored +++++genericContainer editable multiline richlyEditable name='label' +++++genericContainer editable multiline richlyEditable description='description' descriptionFrom=relatedElement +++++genericContainer editable multiline richlyEditable name='title' +++++paragraph +++++++staticText name='description' +++++++++inlineTextBox name='description'
diff --git a/content/test/data/accessibility/html/dd-expected-blink.txt b/content/test/data/accessibility/html/dd-expected-blink.txt index 2a91cf6..e46bab3 100644 --- a/content/test/data/accessibility/html/dd-expected-blink.txt +++ b/content/test/data/accessibility/html/dd-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++descriptionList -++++descriptionListTerm -++++++staticText name='Coffee' -++++++++inlineTextBox name='Coffee' -++++descriptionListDetail -++++++staticText name='Black hot drink' -++++++++inlineTextBox name='Black hot drink' \ No newline at end of file +++genericContainer ignored +++++descriptionList +++++++descriptionListTerm +++++++++staticText name='Coffee' +++++++++++inlineTextBox name='Coffee' +++++++descriptionListDetail +++++++++staticText name='Black hot drink' +++++++++++inlineTextBox name='Black hot drink'
diff --git a/content/test/data/accessibility/html/del-expected-blink.txt b/content/test/data/accessibility/html/del-expected-blink.txt index 1b7ca4f..606d3e30 100644 --- a/content/test/data/accessibility/html/del-expected-blink.txt +++ b/content/test/data/accessibility/html/del-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++paragraph -++++staticText name='I am ' -++++++inlineTextBox name='I am ' -++++contentDeletion -++++++staticText name='vegetarian' -++++++++inlineTextBox name='vegetarian' +++genericContainer ignored +++++paragraph +++++++staticText name='I am ' +++++++++inlineTextBox name='I am ' +++++++contentDeletion +++++++++staticText name='vegetarian' +++++++++++inlineTextBox name='vegetarian'
diff --git a/content/test/data/accessibility/html/details-expected-blink.txt b/content/test/data/accessibility/html/details-expected-blink.txt index 1d3b41f..7b99cff 100644 --- a/content/test/data/accessibility/html/details-expected-blink.txt +++ b/content/test/data/accessibility/html/details-expected-blink.txt
@@ -1,12 +1,13 @@ rootWebArea -++details -++++disclosureTriangle collapsed name='details tag' -++++++staticText name='details tag' -++++++++inlineTextBox name='details tag' -++details -++++disclosureTriangle name='details tag open' -++++++staticText name='details tag open' -++++++++inlineTextBox name='details tag open' -++++paragraph -++++++staticText name='The details tag with open specifies that the details should be visible (open) to the user.' -++++++++inlineTextBox name='The details tag with open specifies that the details should be visible (open) to the user.' \ No newline at end of file +++genericContainer ignored +++++details +++++++disclosureTriangle collapsed name='details tag' +++++++++staticText name='details tag' +++++++++++inlineTextBox name='details tag' +++++details +++++++disclosureTriangle name='details tag open' +++++++++staticText name='details tag open' +++++++++++inlineTextBox name='details tag open' +++++++paragraph +++++++++staticText name='The details tag with open specifies that the details should be visible (open) to the user.' +++++++++++inlineTextBox name='The details tag with open specifies that the details should be visible (open) to the user.'
diff --git a/content/test/data/accessibility/html/dialog-expected-blink.txt b/content/test/data/accessibility/html/dialog-expected-blink.txt index ad6c8e6..200c3f5 100644 --- a/content/test/data/accessibility/html/dialog-expected-blink.txt +++ b/content/test/data/accessibility/html/dialog-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++dialog -++++staticText name='Text in dialog' -++++++inlineTextBox name='Text in dialog' \ No newline at end of file +++genericContainer ignored +++++dialog +++++++staticText name='Text in dialog' +++++++++inlineTextBox name='Text in dialog'
diff --git a/content/test/data/accessibility/html/disabled-expected-blink.txt b/content/test/data/accessibility/html/disabled-expected-blink.txt index 39f3e37..ab82071 100644 --- a/content/test/data/accessibility/html/disabled-expected-blink.txt +++ b/content/test/data/accessibility/html/disabled-expected-blink.txt
@@ -1,15 +1,16 @@ rootWebArea -++checkBox name='Enabled' checkedState=false -++checkBox name='Disabled' restriction=disabled checkedState=false -++button name='Enabled' -++button name='Disabled' restriction=disabled -++form -++++staticText name='Enabled form ' -++++++inlineTextBox name='Enabled form ' -++++checkBox name='Checkbox' checkedState=false -++++button name='Button' -++form restriction=disabled -++++staticText name='Disabled form ' -++++++inlineTextBox name='Disabled form ' -++++checkBox name='Checkbox' restriction=disabled checkedState=false -++++button name='Button' restriction=disabled \ No newline at end of file +++genericContainer ignored +++++checkBox name='Enabled' checkedState=false +++++checkBox name='Disabled' restriction=disabled checkedState=false +++++button name='Enabled' +++++button name='Disabled' restriction=disabled +++++form +++++++staticText name='Enabled form ' +++++++++inlineTextBox name='Enabled form ' +++++++checkBox name='Checkbox' checkedState=false +++++++button name='Button' +++++form restriction=disabled +++++++staticText name='Disabled form ' +++++++++inlineTextBox name='Disabled form ' +++++++checkBox name='Checkbox' restriction=disabled checkedState=false +++++++button name='Button' restriction=disabled
diff --git a/content/test/data/accessibility/html/div-expected-blink.txt b/content/test/data/accessibility/html/div-expected-blink.txt index 8154e313..4d6ca68 100644 --- a/content/test/data/accessibility/html/div-expected-blink.txt +++ b/content/test/data/accessibility/html/div-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++genericContainer -++++staticText name='Unfocusable div' -++++++inlineTextBox name='Unfocusable div' -++genericContainer name='Focusable div' -++++staticText name='Focusable div' -++++++inlineTextBox name='Focusable div' \ No newline at end of file +++genericContainer ignored +++++genericContainer +++++++staticText name='Unfocusable div' +++++++++inlineTextBox name='Unfocusable div' +++++genericContainer name='Focusable div' +++++++staticText name='Focusable div' +++++++++inlineTextBox name='Focusable div'
diff --git a/content/test/data/accessibility/html/dl-expected-blink.txt b/content/test/data/accessibility/html/dl-expected-blink.txt index a7114fe2..0ffc3fac 100644 --- a/content/test/data/accessibility/html/dl-expected-blink.txt +++ b/content/test/data/accessibility/html/dl-expected-blink.txt
@@ -1,11 +1,12 @@ rootWebArea -++descriptionList -++++descriptionListTerm -++++++staticText name='Term' -++++++++inlineTextBox name='Term' -++++descriptionListDetail -++++++staticText name='Description' -++++++++inlineTextBox name='Description' -++definition -++++staticText name='Definition' -++++++inlineTextBox name='Definition' \ No newline at end of file +++genericContainer ignored +++++descriptionList +++++++descriptionListTerm +++++++++staticText name='Term' +++++++++++inlineTextBox name='Term' +++++++descriptionListDetail +++++++++staticText name='Description' +++++++++++inlineTextBox name='Description' +++++definition +++++++staticText name='Definition' +++++++++inlineTextBox name='Definition'
diff --git a/content/test/data/accessibility/html/dt-expected-blink.txt b/content/test/data/accessibility/html/dt-expected-blink.txt index 2a91cf6..e46bab3 100644 --- a/content/test/data/accessibility/html/dt-expected-blink.txt +++ b/content/test/data/accessibility/html/dt-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++descriptionList -++++descriptionListTerm -++++++staticText name='Coffee' -++++++++inlineTextBox name='Coffee' -++++descriptionListDetail -++++++staticText name='Black hot drink' -++++++++inlineTextBox name='Black hot drink' \ No newline at end of file +++genericContainer ignored +++++descriptionList +++++++descriptionListTerm +++++++++staticText name='Coffee' +++++++++++inlineTextBox name='Coffee' +++++++descriptionListDetail +++++++++staticText name='Black hot drink' +++++++++++inlineTextBox name='Black hot drink'
diff --git a/content/test/data/accessibility/html/fieldset-expected-blink.txt b/content/test/data/accessibility/html/fieldset-expected-blink.txt index f7133d35..2d4601a 100644 --- a/content/test/data/accessibility/html/fieldset-expected-blink.txt +++ b/content/test/data/accessibility/html/fieldset-expected-blink.txt
@@ -1,6 +1,7 @@ rootWebArea -++form -++++group name='Browser Engines:' -++++++legend -++++++++staticText name='Browser Engines:' -++++++++++inlineTextBox name='Browser Engines:' \ No newline at end of file +++genericContainer ignored +++++form +++++++group name='Browser Engines:' +++++++++legend +++++++++++staticText name='Browser Engines:' +++++++++++++inlineTextBox name='Browser Engines:'
diff --git a/content/test/data/accessibility/html/figcaption-expected-blink.txt b/content/test/data/accessibility/html/figcaption-expected-blink.txt index 8732fcd4..de83cb1 100644 --- a/content/test/data/accessibility/html/figcaption-expected-blink.txt +++ b/content/test/data/accessibility/html/figcaption-expected-blink.txt
@@ -1,6 +1,7 @@ rootWebArea -++figure name='Fig.1 - A green Box' -++++image name='This is a green box.' -++++figcaption -++++++staticText name='Fig.1 - A green Box' -++++++++inlineTextBox name='Fig.1 - A green Box' \ No newline at end of file +++genericContainer ignored +++++figure name='Fig.1 - A green Box' +++++++image name='This is a green box.' +++++++figcaption +++++++++staticText name='Fig.1 - A green Box' +++++++++++inlineTextBox name='Fig.1 - A green Box'
diff --git a/content/test/data/accessibility/html/figure-expected-blink.txt b/content/test/data/accessibility/html/figure-expected-blink.txt index f7a97076..d3523fb 100644 --- a/content/test/data/accessibility/html/figure-expected-blink.txt +++ b/content/test/data/accessibility/html/figure-expected-blink.txt
@@ -1,3 +1,4 @@ rootWebArea -++figure -++++image name='Sunspots' \ No newline at end of file +++genericContainer ignored +++++figure +++++++image name='Sunspots'
diff --git a/content/test/data/accessibility/html/footer-expected-blink.txt b/content/test/data/accessibility/html/footer-expected-blink.txt index afa2b9b..f0de920 100644 --- a/content/test/data/accessibility/html/footer-expected-blink.txt +++ b/content/test/data/accessibility/html/footer-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++footer -++++staticText name='Footer element' -++++++inlineTextBox name='Footer element' \ No newline at end of file +++genericContainer ignored +++++footer +++++++staticText name='Footer element' +++++++++inlineTextBox name='Footer element'
diff --git a/content/test/data/accessibility/html/footer-inside-other-section-expected-blink.txt b/content/test/data/accessibility/html/footer-inside-other-section-expected-blink.txt index 1564408..5fb97d6 100644 --- a/content/test/data/accessibility/html/footer-inside-other-section-expected-blink.txt +++ b/content/test/data/accessibility/html/footer-inside-other-section-expected-blink.txt
@@ -1,16 +1,17 @@ rootWebArea -++article -++++genericContainer -++++++paragraph -++++++++staticText name='footer inside article.' -++++++++++inlineTextBox name='footer inside article.' -++region -++++genericContainer -++++++paragraph -++++++++staticText name='footer inside section.' -++++++++++inlineTextBox name='footer inside section.' -++main -++++genericContainer -++++++paragraph -++++++++staticText name='footer inside main.' -++++++++++inlineTextBox name='footer inside main.' \ No newline at end of file +++genericContainer ignored +++++article +++++++genericContainer +++++++++paragraph +++++++++++staticText name='footer inside article.' +++++++++++++inlineTextBox name='footer inside article.' +++++region +++++++genericContainer +++++++++paragraph +++++++++++staticText name='footer inside section.' +++++++++++++inlineTextBox name='footer inside section.' +++++main +++++++genericContainer +++++++++paragraph +++++++++++staticText name='footer inside main.' +++++++++++++inlineTextBox name='footer inside main.'
diff --git a/content/test/data/accessibility/html/form-expected-blink.txt b/content/test/data/accessibility/html/form-expected-blink.txt index c32fa97..0f11462 100644 --- a/content/test/data/accessibility/html/form-expected-blink.txt +++ b/content/test/data/accessibility/html/form-expected-blink.txt
@@ -1,3 +1,4 @@ rootWebArea -++form -++++button default name='Submit' +++genericContainer ignored +++++form +++++++button default name='Submit'
diff --git a/content/test/data/accessibility/html/form-validation-message-after-hide-timeout-expected-blink.txt b/content/test/data/accessibility/html/form-validation-message-after-hide-timeout-expected-blink.txt index f055b85..a5396ef 100644 --- a/content/test/data/accessibility/html/form-validation-message-after-hide-timeout-expected-blink.txt +++ b/content/test/data/accessibility/html/form-validation-message-after-hide-timeout-expected-blink.txt
@@ -1,11 +1,12 @@ rootWebArea -++form -++++labelText -++++++staticText name='Pet name:' -++++++++inlineTextBox name='Pet name:' -++++textField required name='Pet name:' errormessageId=alert invalidState=true +++genericContainer ignored +++++form +++++++labelText +++++++++staticText name='Pet name:' +++++++++++inlineTextBox name='Pet name:' +++++++textField required name='Pet name:' errormessageId=alert invalidState=true +++++++++genericContainer ++++++genericContainer -++++genericContainer -++++++staticText name='ready' -++++++++inlineTextBox name='ready' +++++++++staticText name='ready' +++++++++++inlineTextBox name='ready' ++alert invisible containerLiveRelevant='additions' containerLiveStatus='assertive' liveRelevant='additions' liveStatus='assertive' containerLiveAtomic=true containerLiveBusy=false liveAtomic=true
diff --git a/content/test/data/accessibility/html/form-validation-message-expected-blink.txt b/content/test/data/accessibility/html/form-validation-message-expected-blink.txt index 36557eec..fcfdb84 100644 --- a/content/test/data/accessibility/html/form-validation-message-expected-blink.txt +++ b/content/test/data/accessibility/html/form-validation-message-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++form -++++labelText -++++++staticText name='Pet name:' -++++++++inlineTextBox name='Pet name:' -++++textField required name='Pet name:' errormessageId=alert invalidState=true -++++++genericContainer +++genericContainer ignored +++++form +++++++labelText +++++++++staticText name='Pet name:' +++++++++++inlineTextBox name='Pet name:' +++++++textField required name='Pet name:' errormessageId=alert invalidState=true +++++++++genericContainer ++alert containerLiveRelevant='additions' containerLiveStatus='assertive' name='Please enter pet name' liveRelevant='additions' liveStatus='assertive' containerLiveAtomic=true containerLiveBusy=false liveAtomic=true
diff --git a/content/test/data/accessibility/html/frameset-expected-blink.txt b/content/test/data/accessibility/html/frameset-expected-blink.txt index a5df2e9..26ba151 100644 --- a/content/test/data/accessibility/html/frameset-expected-blink.txt +++ b/content/test/data/accessibility/html/frameset-expected-blink.txt
@@ -1,26 +1,28 @@ rootWebArea ++iframe ++++rootWebArea -++++++paragraph -++++++++staticText name='My favorite browser is ' -++++++++++inlineTextBox name='My favorite browser is ' -++++++++contentDeletion -++++++++++staticText name='ABC' -++++++++++++inlineTextBox name='ABC' -++++++++staticText name=' ' -++++++++++inlineTextBox name=' ' -++++++++contentInsertion -++++++++++staticText name='Chrome' -++++++++++++inlineTextBox name='Chrome' -++++++++staticText name='!' -++++++++++inlineTextBox name='!' +++++++genericContainer ignored +++++++++paragraph +++++++++++staticText name='My favorite browser is ' +++++++++++++inlineTextBox name='My favorite browser is ' +++++++++++contentDeletion +++++++++++++staticText name='ABC' +++++++++++++++inlineTextBox name='ABC' +++++++++++staticText name=' ' +++++++++++++inlineTextBox name=' ' +++++++++++contentInsertion +++++++++++++staticText name='Chrome' +++++++++++++++inlineTextBox name='Chrome' +++++++++++staticText name='!' +++++++++++++inlineTextBox name='!' ++iframe ++++rootWebArea -++++++paragraph -++++++++staticText name='This test is to check ' -++++++++++inlineTextBox name='This test is to check ' -++++++++mark -++++++++++staticText name='mark tag' -++++++++++++inlineTextBox name='mark tag' -++++++++staticText name='.' -++++++++++inlineTextBox name='.' +++++++genericContainer ignored +++++++++paragraph +++++++++++staticText name='This test is to check ' +++++++++++++inlineTextBox name='This test is to check ' +++++++++++mark +++++++++++++staticText name='mark tag' +++++++++++++++inlineTextBox name='mark tag' +++++++++++staticText name='.' +++++++++++++inlineTextBox name='.'
diff --git a/content/test/data/accessibility/html/header-expected-blink.txt b/content/test/data/accessibility/html/header-expected-blink.txt index 235b808..acaa5ef 100644 --- a/content/test/data/accessibility/html/header-expected-blink.txt +++ b/content/test/data/accessibility/html/header-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++banner -++++staticText name='Chromium Browser' -++++++inlineTextBox name='Chromium Browser' \ No newline at end of file +++genericContainer ignored +++++banner +++++++staticText name='Chromium Browser' +++++++++inlineTextBox name='Chromium Browser'
diff --git a/content/test/data/accessibility/html/header-inside-other-section-expected-blink.txt b/content/test/data/accessibility/html/header-inside-other-section-expected-blink.txt index 0a5439a6..f268d32f 100644 --- a/content/test/data/accessibility/html/header-inside-other-section-expected-blink.txt +++ b/content/test/data/accessibility/html/header-inside-other-section-expected-blink.txt
@@ -1,16 +1,17 @@ rootWebArea -++article -++++genericContainer -++++++paragraph -++++++++staticText name='Header inside article.' -++++++++++inlineTextBox name='Header inside article.' -++region -++++genericContainer -++++++paragraph -++++++++staticText name='Header inside section.' -++++++++++inlineTextBox name='Header inside section.' -++main -++++genericContainer -++++++paragraph -++++++++staticText name='Header inside main.' -++++++++++inlineTextBox name='Header inside main.' \ No newline at end of file +++genericContainer ignored +++++article +++++++genericContainer +++++++++paragraph +++++++++++staticText name='Header inside article.' +++++++++++++inlineTextBox name='Header inside article.' +++++region +++++++genericContainer +++++++++paragraph +++++++++++staticText name='Header inside section.' +++++++++++++inlineTextBox name='Header inside section.' +++++main +++++++genericContainer +++++++++paragraph +++++++++++staticText name='Header inside main.' +++++++++++++inlineTextBox name='Header inside main.'
diff --git a/content/test/data/accessibility/html/heading-expected-blink.txt b/content/test/data/accessibility/html/heading-expected-blink.txt index 634f065c..f46427e4 100644 --- a/content/test/data/accessibility/html/heading-expected-blink.txt +++ b/content/test/data/accessibility/html/heading-expected-blink.txt
@@ -1,19 +1,20 @@ rootWebArea -++heading name='Heading 1' hierarchicalLevel=1 -++++staticText name='Heading 1' -++++++inlineTextBox name='Heading 1' -++heading name='Heading 2' hierarchicalLevel=2 -++++staticText name='Heading 2' -++++++inlineTextBox name='Heading 2' -++heading name='Heading 3' hierarchicalLevel=3 -++++staticText name='Heading 3' -++++++inlineTextBox name='Heading 3' -++heading name='Heading 4' hierarchicalLevel=4 -++++staticText name='Heading 4' -++++++inlineTextBox name='Heading 4' -++heading name='Heading 5' hierarchicalLevel=5 -++++staticText name='Heading 5' -++++++inlineTextBox name='Heading 5' -++heading name='Heading 6' hierarchicalLevel=6 -++++staticText name='Heading 6' -++++++inlineTextBox name='Heading 6' \ No newline at end of file +++genericContainer ignored +++++heading name='Heading 1' hierarchicalLevel=1 +++++++staticText name='Heading 1' +++++++++inlineTextBox name='Heading 1' +++++heading name='Heading 2' hierarchicalLevel=2 +++++++staticText name='Heading 2' +++++++++inlineTextBox name='Heading 2' +++++heading name='Heading 3' hierarchicalLevel=3 +++++++staticText name='Heading 3' +++++++++inlineTextBox name='Heading 3' +++++heading name='Heading 4' hierarchicalLevel=4 +++++++staticText name='Heading 4' +++++++++inlineTextBox name='Heading 4' +++++heading name='Heading 5' hierarchicalLevel=5 +++++++staticText name='Heading 5' +++++++++inlineTextBox name='Heading 5' +++++heading name='Heading 6' hierarchicalLevel=6 +++++++staticText name='Heading 6' +++++++++inlineTextBox name='Heading 6'
diff --git a/content/test/data/accessibility/html/hr-expected-blink.txt b/content/test/data/accessibility/html/hr-expected-blink.txt index 3c7c11e..f22f097 100644 --- a/content/test/data/accessibility/html/hr-expected-blink.txt +++ b/content/test/data/accessibility/html/hr-expected-blink.txt
@@ -1,12 +1,13 @@ rootWebArea -++paragraph -++++staticText name='Before.' -++++++inlineTextBox name='Before.' -++splitter horizontal name='Dividing line' -++paragraph -++++staticText name='Middle.' -++++++inlineTextBox name='Middle.' -++splitter horizontal -++paragraph -++++staticText name='After.' -++++++inlineTextBox name='After.' \ No newline at end of file +++genericContainer ignored +++++paragraph +++++++staticText name='Before.' +++++++++inlineTextBox name='Before.' +++++splitter horizontal name='Dividing line' +++++paragraph +++++++staticText name='Middle.' +++++++++inlineTextBox name='Middle.' +++++splitter horizontal +++++paragraph +++++++staticText name='After.' +++++++++inlineTextBox name='After.'
diff --git a/content/test/data/accessibility/html/i-expected-blink.txt b/content/test/data/accessibility/html/i-expected-blink.txt index fcb4c61..d2c997e1 100644 --- a/content/test/data/accessibility/html/i-expected-blink.txt +++ b/content/test/data/accessibility/html/i-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++paragraph -++++staticText name='This is to check ' -++++++inlineTextBox name='This is to check ' -++++staticText name='italic property' -++++++inlineTextBox name='italic property' -++++staticText name=' using i tag.' -++++++inlineTextBox name=' using i tag.' \ No newline at end of file +++genericContainer ignored +++++paragraph +++++++staticText name='This is to check ' +++++++++inlineTextBox name='This is to check ' +++++++staticText name='italic property' +++++++++inlineTextBox name='italic property' +++++++staticText name=' using i tag.' +++++++++inlineTextBox name=' using i tag.'
diff --git a/content/test/data/accessibility/html/id-expected-blink.txt b/content/test/data/accessibility/html/id-expected-blink.txt index f367acb..faabed1 100644 --- a/content/test/data/accessibility/html/id-expected-blink.txt +++ b/content/test/data/accessibility/html/id-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++paragraph -++++staticText name='No id' -++++++inlineTextBox name='No id' -++paragraph -++++staticText name='Has id' -++++++inlineTextBox name='Has id' \ No newline at end of file +++genericContainer ignored +++++paragraph +++++++staticText name='No id' +++++++++inlineTextBox name='No id' +++++paragraph +++++++staticText name='Has id' +++++++++inlineTextBox name='Has id'
diff --git a/content/test/data/accessibility/html/iframe-coordinates-expected-blink.txt b/content/test/data/accessibility/html/iframe-coordinates-expected-blink.txt index 365384f..ced6379 100644 --- a/content/test/data/accessibility/html/iframe-coordinates-expected-blink.txt +++ b/content/test/data/accessibility/html/iframe-coordinates-expected-blink.txt
@@ -1,16 +1,18 @@ rootWebArea location=(0, 0) scrollX=0 scrollY=0 -++genericContainer location=(0, 0) size=(300, 150) -++++button location=(25, 25) size=(250, 50) unclippedSize=(250, 50) name='Button' -++genericContainer location=(0, 150) size=(300, 150) -++++button location=(25, 175) size=(250, 50) unclippedSize=(250, 50) name='Button' -++genericContainer location=(0, 300) size=(300, 150) -++++iframe location=(0, 300) size=(300, 100) unclippedSize=(300, 100) -++++++rootWebArea location=(0, 0) size=(300, 100) unclippedSize=(300, 100) scrollX=0 scrollY=0 -++++++++genericContainer location=(0, 0) size=(300, 100) unclippedSize=(300, 100) -++++++++++button location=(25, 25) size=(250, 50) unclippedSize=(250, 50) name='Ordinary Button' -++genericContainer location=(0, 450) size=(300, 150) -++++iframe location=(0, 450) size=(150, 50) -++++++rootWebArea location=(0, 0) size=(150, 50) scrollX=150 scrollY=50 -++++++++genericContainer location=(0, 0) size=(300, 100) unclippedLocation=(-150, 400) unclippedSize=(300, 100) -++++++++++button location=(25, 25) size=(250, 50) unclippedLocation=(-125, 425) unclippedSize=(250, 50) name='Scrolled Button' -<-- End-of-file --> +++genericContainer ignored location=(0, 0) +++++genericContainer location=(0, 0) size=(300, 150) +++++++button location=(25, 25) size=(250, 50) unclippedSize=(250, 50) name='Button' +++++genericContainer location=(0, 150) size=(300, 150) +++++++button location=(25, 175) size=(250, 50) unclippedSize=(250, 50) name='Button' +++++genericContainer location=(0, 300) size=(300, 150) +++++++iframe location=(0, 300) size=(300, 100) unclippedSize=(300, 100) +++++++++rootWebArea location=(0, 0) size=(300, 100) unclippedSize=(300, 100) scrollX=0 scrollY=0 +++++++++++genericContainer ignored location=(0, 0) size=(300, 100) +++++++++++++genericContainer location=(0, 0) size=(300, 100) unclippedSize=(300, 100) +++++++++++++++button location=(25, 25) size=(250, 50) unclippedSize=(250, 50) name='Ordinary Button' +++++genericContainer location=(0, 450) size=(300, 150) +++++++iframe location=(0, 450) size=(150, 50) +++++++++rootWebArea location=(0, 0) size=(150, 50) scrollX=150 scrollY=50 +++++++++++genericContainer ignored location=(0, 0) +++++++++++++genericContainer location=(0, 0) size=(300, 100) unclippedLocation=(-150, 400) unclippedSize=(300, 100) +++++++++++++++button location=(25, 25) size=(250, 50) unclippedLocation=(-125, 425) unclippedSize=(250, 50) name='Scrolled Button'
diff --git a/content/test/data/accessibility/html/iframe-cross-process-expected-blink.txt b/content/test/data/accessibility/html/iframe-cross-process-expected-blink.txt index 4746eee..9299f04 100644 --- a/content/test/data/accessibility/html/iframe-cross-process-expected-blink.txt +++ b/content/test/data/accessibility/html/iframe-cross-process-expected-blink.txt
@@ -1,13 +1,14 @@ rootWebArea -++paragraph -++++staticText name='Before frame' -++++++inlineTextBox name='Before frame' -++genericContainer -++++iframe name='Cross-process iframe' -++++++rootWebArea -++++++++genericContainer -++++++++++staticText name='Text in iframe' -++++++++++++inlineTextBox name='Text in iframe' -++paragraph -++++staticText name='After frame' -++++++inlineTextBox name='After frame' +++genericContainer ignored +++++paragraph +++++++staticText name='Before frame' +++++++++inlineTextBox name='Before frame' +++++genericContainer +++++++iframe name='Cross-process iframe' +++++++++rootWebArea +++++++++++genericContainer +++++++++++++staticText name='Text in iframe' +++++++++++++++inlineTextBox name='Text in iframe' +++++paragraph +++++++staticText name='After frame' +++++++++inlineTextBox name='After frame'
diff --git a/content/test/data/accessibility/html/iframe-expected-blink.txt b/content/test/data/accessibility/html/iframe-expected-blink.txt index 07ad073..739747d 100644 --- a/content/test/data/accessibility/html/iframe-expected-blink.txt +++ b/content/test/data/accessibility/html/iframe-expected-blink.txt
@@ -2,3 +2,4 @@ ++genericContainer ++++iframe name='Empty iframe' ++++++rootWebArea +++++++++genericContainer ignored
diff --git a/content/test/data/accessibility/html/iframe-padding-expected-blink.txt b/content/test/data/accessibility/html/iframe-padding-expected-blink.txt index 022ad4eb..3624f510 100644 --- a/content/test/data/accessibility/html/iframe-padding-expected-blink.txt +++ b/content/test/data/accessibility/html/iframe-padding-expected-blink.txt
@@ -1,9 +1,14 @@ rootWebArea pageLocation=(0, 0) -++iframe pageLocation=(0, 0) pageSize=(300, 100) -++++rootWebArea pageLocation=(0, 0) pageSize=(300, 100) -++++++genericContainer pageLocation=(0, 0) pageSize=(300, 100) -++++++++button pageLocation=(25, 25) pageSize=(250, 50) name='Ordinary Button' -++iframe pageLocation=(30, 230) pageSize=(300, 100) -++++rootWebArea pageLocation=(30, 230) pageSize=(300, 100) -++++++genericContainer pageLocation=(30, 230) pageSize=(300, 100) -++++++++button pageLocation=(55, 255) pageSize=(250, 50) name='Second Button' +++genericContainer ignored +++++genericContainer ignored +++++++iframe pageLocation=(0, 0) pageSize=(300, 100) +++++++++rootWebArea pageLocation=(0, 0) pageSize=(300, 100) +++++++++++genericContainer ignored +++++++++++++genericContainer pageLocation=(0, 0) pageSize=(300, 100) +++++++++++++++button pageLocation=(25, 25) pageSize=(250, 50) name='Ordinary Button' +++++genericContainer ignored +++++++iframe pageLocation=(30, 230) pageSize=(300, 100) +++++++++rootWebArea pageLocation=(30, 230) pageSize=(300, 100) +++++++++++genericContainer ignored +++++++++++++genericContainer pageLocation=(30, 230) pageSize=(300, 100) +++++++++++++++button pageLocation=(55, 255) pageSize=(250, 50) name='Second Button'
diff --git a/content/test/data/accessibility/html/iframe-presentational-expected-blink.txt b/content/test/data/accessibility/html/iframe-presentational-expected-blink.txt index ae9918d..9c399f4 100644 --- a/content/test/data/accessibility/html/iframe-presentational-expected-blink.txt +++ b/content/test/data/accessibility/html/iframe-presentational-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea ++genericContainer ++++iframePresentational -++++++rootWebArea \ No newline at end of file +++++++rootWebArea +++++++++genericContainer ignored
diff --git a/content/test/data/accessibility/html/iframe-transform-cross-process-expected-blink.txt b/content/test/data/accessibility/html/iframe-transform-cross-process-expected-blink.txt index 0603c36..9ef3039 100644 --- a/content/test/data/accessibility/html/iframe-transform-cross-process-expected-blink.txt +++ b/content/test/data/accessibility/html/iframe-transform-cross-process-expected-blink.txt
@@ -1,7 +1,10 @@ rootWebArea pageLocation=(0, 0) -++iframe pageLocation=(0, 0) -++++rootWebArea pageLocation=(0, 0) -++++++image pageLocation=(10, 10) pageSize=(100, 50) -++iframe pageLocation=(0, 250) transform -++++rootWebArea pageLocation=(0, 250) -++++++image pageLocation=(15, 265) pageSize=(150, 75) +++genericContainer ignored +++++iframe pageLocation=(0, 0) +++++++rootWebArea pageLocation=(0, 0) +++++++++genericContainer ignored +++++++++++image pageLocation=(10, 10) pageSize=(100, 50) +++++iframe pageLocation=(0, 250) transform +++++++rootWebArea pageLocation=(0, 250) +++++++++genericContainer ignored +++++++++++image pageLocation=(15, 265) pageSize=(150, 75)
diff --git a/content/test/data/accessibility/html/iframe-transform-expected-blink.txt b/content/test/data/accessibility/html/iframe-transform-expected-blink.txt index 0603c36..9ef3039 100644 --- a/content/test/data/accessibility/html/iframe-transform-expected-blink.txt +++ b/content/test/data/accessibility/html/iframe-transform-expected-blink.txt
@@ -1,7 +1,10 @@ rootWebArea pageLocation=(0, 0) -++iframe pageLocation=(0, 0) -++++rootWebArea pageLocation=(0, 0) -++++++image pageLocation=(10, 10) pageSize=(100, 50) -++iframe pageLocation=(0, 250) transform -++++rootWebArea pageLocation=(0, 250) -++++++image pageLocation=(15, 265) pageSize=(150, 75) +++genericContainer ignored +++++iframe pageLocation=(0, 0) +++++++rootWebArea pageLocation=(0, 0) +++++++++genericContainer ignored +++++++++++image pageLocation=(10, 10) pageSize=(100, 50) +++++iframe pageLocation=(0, 250) transform +++++++rootWebArea pageLocation=(0, 250) +++++++++genericContainer ignored +++++++++++image pageLocation=(15, 265) pageSize=(150, 75)
diff --git a/content/test/data/accessibility/html/iframe-transform-nested-cross-process-expected-blink.txt b/content/test/data/accessibility/html/iframe-transform-nested-cross-process-expected-blink.txt index 8cb9c0b..4443758 100644 --- a/content/test/data/accessibility/html/iframe-transform-nested-cross-process-expected-blink.txt +++ b/content/test/data/accessibility/html/iframe-transform-nested-cross-process-expected-blink.txt
@@ -1,6 +1,9 @@ rootWebArea pageLocation=(0, 0) -++iframe pageLocation=(0, 100) transform -++++rootWebArea pageLocation=(0, 100) -++++++iframe pageLocation=(200, 100) transform -++++++++rootWebArea pageLocation=(200, 100) -++++++++++image pageLocation=(240, 140) pageSize=(400, 200) +++genericContainer ignored +++++iframe pageLocation=(0, 100) transform +++++++rootWebArea pageLocation=(0, 100) +++++++++genericContainer ignored +++++++++++iframe pageLocation=(200, 100) transform +++++++++++++rootWebArea pageLocation=(200, 100) +++++++++++++++genericContainer ignored +++++++++++++++++image pageLocation=(240, 140) pageSize=(400, 200)
diff --git a/content/test/data/accessibility/html/iframe-transform-nested-expected-blink.txt b/content/test/data/accessibility/html/iframe-transform-nested-expected-blink.txt index 8cb9c0b..4443758 100644 --- a/content/test/data/accessibility/html/iframe-transform-nested-expected-blink.txt +++ b/content/test/data/accessibility/html/iframe-transform-nested-expected-blink.txt
@@ -1,6 +1,9 @@ rootWebArea pageLocation=(0, 0) -++iframe pageLocation=(0, 100) transform -++++rootWebArea pageLocation=(0, 100) -++++++iframe pageLocation=(200, 100) transform -++++++++rootWebArea pageLocation=(200, 100) -++++++++++image pageLocation=(240, 140) pageSize=(400, 200) +++genericContainer ignored +++++iframe pageLocation=(0, 100) transform +++++++rootWebArea pageLocation=(0, 100) +++++++++genericContainer ignored +++++++++++iframe pageLocation=(200, 100) transform +++++++++++++rootWebArea pageLocation=(200, 100) +++++++++++++++genericContainer ignored +++++++++++++++++image pageLocation=(240, 140) pageSize=(400, 200)
diff --git a/content/test/data/accessibility/html/iframe-transform-scrolled-expected-blink.txt b/content/test/data/accessibility/html/iframe-transform-scrolled-expected-blink.txt index 9baf1cab..7871c1c 100644 --- a/content/test/data/accessibility/html/iframe-transform-scrolled-expected-blink.txt +++ b/content/test/data/accessibility/html/iframe-transform-scrolled-expected-blink.txt
@@ -2,5 +2,6 @@ ++genericContainer pageLocation=(0, 0) ++++iframe pageLocation=(300, 300) transform ++++++rootWebArea pageLocation=(300, 300) scrollX=150 scrollY=50 -++++++++genericContainer pageLocation=(300, 300) -++++++++++button pageLocation=(300, 300) pageSize=(250, 50) name='Scrolled Button' +++++++++genericContainer ignored +++++++++++genericContainer pageLocation=(300, 300) +++++++++++++button pageLocation=(300, 300) pageSize=(250, 50) name='Scrolled Button'
diff --git a/content/test/data/accessibility/html/img-empty-alt-expected-blink.txt b/content/test/data/accessibility/html/img-empty-alt-expected-blink.txt index 46cda49..d51d33a 100644 --- a/content/test/data/accessibility/html/img-empty-alt-expected-blink.txt +++ b/content/test/data/accessibility/html/img-empty-alt-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea ++genericContainer +++++presentational ignored name='' ++++image name='' ++++image name='' ++++image
diff --git a/content/test/data/accessibility/html/img-link-empty-alt-expected-blink.txt b/content/test/data/accessibility/html/img-link-empty-alt-expected-blink.txt index e62107f..b2d8f10b 100644 --- a/content/test/data/accessibility/html/img-link-empty-alt-expected-blink.txt +++ b/content/test/data/accessibility/html/img-link-empty-alt-expected-blink.txt
@@ -1,6 +1,7 @@ rootWebArea ++genericContainer ++++link name='unread ' +++++++presentational ignored name='' ++++++staticText name='unread ' ++++++++inlineTextBox name='unread ' ++++link name='read '
diff --git a/content/test/data/accessibility/html/in-page-links-expected-blink.txt b/content/test/data/accessibility/html/in-page-links-expected-blink.txt index 1f71bc3..5930556 100644 --- a/content/test/data/accessibility/html/in-page-links-expected-blink.txt +++ b/content/test/data/accessibility/html/in-page-links-expected-blink.txt
@@ -1,52 +1,53 @@ rootWebArea -++link name='Empty anchor' inPageLinkTargetId=anchor -++++staticText name='Empty anchor' -++++++inlineTextBox name='Empty anchor' -++staticText name=' ' -++++inlineTextBox name=' ' -++link name='Anchor with content' inPageLinkTargetId=anchor -++++staticText name='Anchor with content' -++++++inlineTextBox name='Anchor with content' -++staticText name=' ' -++++inlineTextBox name=' ' -++link name='Anchor with ID' inPageLinkTargetId=anchor -++++staticText name='Anchor with ID' -++++++inlineTextBox name='Anchor with ID' -++staticText name=' ' -++++inlineTextBox name=' ' -++link name='Empty span' inPageLinkTargetId=genericContainer -++++staticText name='Empty span' -++++++inlineTextBox name='Empty span' -++staticText name=' ' -++++inlineTextBox name=' ' -++link name='Span with content' inPageLinkTargetId=genericContainer -++++staticText name='Span with content' -++++++inlineTextBox name='Span with content' -++staticText name=' ' -++++inlineTextBox name=' ' -++link name='Paragraph with content' inPageLinkTargetId=paragraph -++++staticText name='Paragraph with content' -++++++inlineTextBox name='Paragraph with content' -++paragraph -++++anchor -++++staticText name='After empty anchor' -++++++inlineTextBox name='After empty anchor' -++paragraph -++++anchor name='Anchor with content' +++genericContainer ignored +++++link name='Empty anchor' inPageLinkTargetId=anchor +++++++staticText name='Empty anchor' +++++++++inlineTextBox name='Empty anchor' +++++staticText name=' ' +++++++inlineTextBox name=' ' +++++link name='Anchor with content' inPageLinkTargetId=anchor ++++++staticText name='Anchor with content' ++++++++inlineTextBox name='Anchor with content' -++paragraph -++++anchor name='Anchor with ID' +++++staticText name=' ' +++++++inlineTextBox name=' ' +++++link name='Anchor with ID' inPageLinkTargetId=anchor ++++++staticText name='Anchor with ID' ++++++++inlineTextBox name='Anchor with ID' -++paragraph -++++genericContainer -++++staticText name='After empty span' -++++++inlineTextBox name='After empty span' -++paragraph -++++genericContainer +++++staticText name=' ' +++++++inlineTextBox name=' ' +++++link name='Empty span' inPageLinkTargetId=genericContainer +++++++staticText name='Empty span' +++++++++inlineTextBox name='Empty span' +++++staticText name=' ' +++++++inlineTextBox name=' ' +++++link name='Span with content' inPageLinkTargetId=genericContainer ++++++staticText name='Span with content' ++++++++inlineTextBox name='Span with content' -++paragraph -++++staticText name='Paragraph with content' -++++++inlineTextBox name='Paragraph with content' \ No newline at end of file +++++staticText name=' ' +++++++inlineTextBox name=' ' +++++link name='Paragraph with content' inPageLinkTargetId=paragraph +++++++staticText name='Paragraph with content' +++++++++inlineTextBox name='Paragraph with content' +++++paragraph +++++++anchor +++++++staticText name='After empty anchor' +++++++++inlineTextBox name='After empty anchor' +++++paragraph +++++++anchor name='Anchor with content' +++++++++staticText name='Anchor with content' +++++++++++inlineTextBox name='Anchor with content' +++++paragraph +++++++anchor name='Anchor with ID' +++++++++staticText name='Anchor with ID' +++++++++++inlineTextBox name='Anchor with ID' +++++paragraph +++++++genericContainer +++++++staticText name='After empty span' +++++++++inlineTextBox name='After empty span' +++++paragraph +++++++genericContainer +++++++++staticText name='Span with content' +++++++++++inlineTextBox name='Span with content' +++++paragraph +++++++staticText name='Paragraph with content' +++++++++inlineTextBox name='Paragraph with content'
diff --git a/content/test/data/accessibility/html/input-button-in-menu-expected-blink.txt b/content/test/data/accessibility/html/input-button-in-menu-expected-blink.txt index 8abf0a2..450edaa7 100644 --- a/content/test/data/accessibility/html/input-button-in-menu-expected-blink.txt +++ b/content/test/data/accessibility/html/input-button-in-menu-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++genericContainer -++++menuItem name='Button in menu element' -++menu -++++menuItem name='Button in element with menu role' \ No newline at end of file +++genericContainer ignored +++++genericContainer +++++++menuItem name='Button in menu element' +++++menu +++++++menuItem name='Button in element with menu role'
diff --git a/content/test/data/accessibility/html/input-checkbox-in-menu-expected-blink.txt b/content/test/data/accessibility/html/input-checkbox-in-menu-expected-blink.txt index 83a2836a..4dc5dfc 100644 --- a/content/test/data/accessibility/html/input-checkbox-in-menu-expected-blink.txt +++ b/content/test/data/accessibility/html/input-checkbox-in-menu-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++genericContainer -++++checkBox name='Checkbox1' checkedState=false -++++checkBox name='Checkbox2' checkedState=true -++menu -++++checkBox name='Checkbox3' checkedState=true -++++checkBox name='Checkbox4' checkedState=mixed \ No newline at end of file +++genericContainer ignored +++++genericContainer +++++++checkBox name='Checkbox1' checkedState=false +++++++checkBox name='Checkbox2' checkedState=true +++++menu +++++++checkBox name='Checkbox3' checkedState=true +++++++checkBox name='Checkbox4' checkedState=mixed
diff --git a/content/test/data/accessibility/html/input-date-with-popup-open-expected-blink.txt b/content/test/data/accessibility/html/input-date-with-popup-open-expected-blink.txt index 43a2147..71aafb7 100644 --- a/content/test/data/accessibility/html/input-date-with-popup-open-expected-blink.txt +++ b/content/test/data/accessibility/html/input-date-with-popup-open-expected-blink.txt
@@ -18,28 +18,30 @@ ++++++++++++++inlineTextBox name='2008' ++++++popUpButton name='Show date picker' ++++++rootWebArea -++++++++genericContainer +++++++++genericContainer ignored ++++++++++genericContainer ++++++++++++genericContainer -++++++++++++++button name='Show month selection panel' -++++++++++++button name='Show previous month' -++++++++++++button name='Today' -++++++++++++button name='Show next month' -++++++++++++grid -++++++++++++++genericContainer +++++++++++++++genericContainer ignored ++++++++++++++++genericContainer -++++++++++++++++++staticText name='Sun' +++++++++++++++++++button name='Show month selection panel' +++++++++++++++++button name='Show previous month' +++++++++++++++++button name='Today' +++++++++++++++++button name='Show next month' +++++++++++++++grid ++++++++++++++++genericContainer -++++++++++++++++++staticText name='Mon' +++++++++++++++++++genericContainer +++++++++++++++++++++staticText name='Sun' +++++++++++++++++++genericContainer +++++++++++++++++++++staticText name='Mon' +++++++++++++++++++genericContainer +++++++++++++++++++++staticText name='Tue' +++++++++++++++++++genericContainer +++++++++++++++++++++staticText name='Wed' +++++++++++++++++++genericContainer +++++++++++++++++++++staticText name='Thu' +++++++++++++++++++genericContainer +++++++++++++++++++++staticText name='Fri' +++++++++++++++++++genericContainer +++++++++++++++++++++staticText name='Sat' ++++++++++++++++genericContainer -++++++++++++++++++staticText name='Tue' -++++++++++++++++genericContainer -++++++++++++++++++staticText name='Wed' -++++++++++++++++genericContainer -++++++++++++++++++staticText name='Thu' -++++++++++++++++genericContainer -++++++++++++++++++staticText name='Fri' -++++++++++++++++genericContainer -++++++++++++++++++staticText name='Sat' -++++++++++++++genericContainer -++++++++++++++++genericContainer +++++++++++++++++++genericContainer
diff --git a/content/test/data/accessibility/html/input-image-button-in-menu-expected-blink.txt b/content/test/data/accessibility/html/input-image-button-in-menu-expected-blink.txt index addb15d..48098f8 100644 --- a/content/test/data/accessibility/html/input-image-button-in-menu-expected-blink.txt +++ b/content/test/data/accessibility/html/input-image-button-in-menu-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++genericContainer -++++button name='Bullet' -++menu -++++button name='Bullet' \ No newline at end of file +++genericContainer ignored +++++genericContainer +++++++button name='Bullet' +++++menu +++++++button name='Bullet'
diff --git a/content/test/data/accessibility/html/input-radio-expected-blink.txt b/content/test/data/accessibility/html/input-radio-expected-blink.txt index 0fa43c4..aaae13d 100644 --- a/content/test/data/accessibility/html/input-radio-expected-blink.txt +++ b/content/test/data/accessibility/html/input-radio-expected-blink.txt
@@ -1,16 +1,17 @@ rootWebArea -++form -++++radioButton checkedState=false radioGroupIds=radioButton -++++staticText name='Radio1' -++++++inlineTextBox name='Radio1' -++++lineBreak name='<newline>' -++++++inlineTextBox name='<newline>' -++++radioButton checkedState=false radioGroupIds=radioButton -++++staticText name='Radio2' -++++++inlineTextBox name='Radio2' -++form -++++radioButton name='Radio3' checkedState=false radioGroupIds=radioButton,radioButton -++++radioButton name='Radio4' checkedState=true radioGroupIds=radioButton,radioButton -++form -++++radioButton name='Radio5' checkedState=false radioGroupIds=radioButton -++++radioButton name='Radio6' checkedState=true radioGroupIds=radioButton \ No newline at end of file +++genericContainer ignored +++++form +++++++radioButton checkedState=false radioGroupIds=radioButton +++++++staticText name='Radio1' +++++++++inlineTextBox name='Radio1' +++++++lineBreak name='<newline>' +++++++++inlineTextBox name='<newline>' +++++++radioButton checkedState=false radioGroupIds=radioButton +++++++staticText name='Radio2' +++++++++inlineTextBox name='Radio2' +++++form +++++++radioButton name='Radio3' checkedState=false radioGroupIds=radioButton,radioButton +++++++radioButton name='Radio4' checkedState=true radioGroupIds=radioButton,radioButton +++++form +++++++radioButton name='Radio5' checkedState=false radioGroupIds=radioButton +++++++radioButton name='Radio6' checkedState=true radioGroupIds=radioButton
diff --git a/content/test/data/accessibility/html/input-radio-in-menu-expected-blink.txt b/content/test/data/accessibility/html/input-radio-in-menu-expected-blink.txt index 94aaa4e5..85ff50a 100644 --- a/content/test/data/accessibility/html/input-radio-in-menu-expected-blink.txt +++ b/content/test/data/accessibility/html/input-radio-in-menu-expected-blink.txt
@@ -1,13 +1,14 @@ rootWebArea -++genericContainer -++++menuItemRadio checkedState=true -++++staticText name='Radio0 ' -++++++inlineTextBox name='Radio0 ' -++++menuItemRadio checkedState=false -++++staticText name='Radio1 ' -++++++inlineTextBox name='Radio1 ' -++++radioButton name='Radio2' checkedState=false -++menu -++++radioButton name='Radio3' checkedState=false -++++menuItemRadio checkedState=false -++++menuItemRadio checkedState=true \ No newline at end of file +++genericContainer ignored +++++genericContainer +++++++menuItemRadio checkedState=true +++++++staticText name='Radio0 ' +++++++++inlineTextBox name='Radio0 ' +++++++menuItemRadio checkedState=false +++++++staticText name='Radio1 ' +++++++++inlineTextBox name='Radio1 ' +++++++radioButton name='Radio2' checkedState=false +++++menu +++++++radioButton name='Radio3' checkedState=false +++++++menuItemRadio checkedState=false +++++++menuItemRadio checkedState=true
diff --git a/content/test/data/accessibility/html/input-submit-expected-blink.txt b/content/test/data/accessibility/html/input-submit-expected-blink.txt index aa02c8e..4516ae7 100644 --- a/content/test/data/accessibility/html/input-submit-expected-blink.txt +++ b/content/test/data/accessibility/html/input-submit-expected-blink.txt
@@ -1,12 +1,13 @@ rootWebArea -++form -++++textField -++++++genericContainer -++++button default name='First submit in a form is a valid default button' -++++button name='Second submit in a form not a valid default button' -++form -++++textField -++++++genericContainer -++++button default name='First image button in a form is a valid default button' -++++button name='Second image button in a form not a valid default button' -++button name='Submit outside of form not a valid default button' \ No newline at end of file +++genericContainer ignored +++++form +++++++textField +++++++++genericContainer +++++++button default name='First submit in a form is a valid default button' +++++++button name='Second submit in a form not a valid default button' +++++form +++++++textField +++++++++genericContainer +++++++button default name='First image button in a form is a valid default button' +++++++button name='Second image button in a form not a valid default button' +++++button name='Submit outside of form not a valid default button'
diff --git a/content/test/data/accessibility/html/input-text-name-calc-expected-blink.txt b/content/test/data/accessibility/html/input-text-name-calc-expected-blink.txt index 5902d255..fac8550 100644 --- a/content/test/data/accessibility/html/input-text-name-calc-expected-blink.txt +++ b/content/test/data/accessibility/html/input-text-name-calc-expected-blink.txt
@@ -1,21 +1,22 @@ rootWebArea -++textField name='Title0' -++++genericContainer -++textField description='Title1' name='Label1' descriptionFrom=attribute -++++genericContainer -++textField description='Title2' name='AriaLabel2' descriptionFrom=attribute -++++genericContainer -++textField description='Title3' name='LabelledBy3' descriptionFrom=attribute -++++genericContainer -++textField name='Placeholder4' -++++genericContainer -++textField name='ARIA Placeholder4a' -++++genericContainer -++textField name='Placeholder4b' -++++genericContainer -++textField description='Title5' name='Placeholder5' descriptionFrom=attribute -++++genericContainer -++textField description='DescribedBy6' name='LabelledBy6' descriptionFrom=relatedElement -++++genericContainer -++textField description='DescribedBy7' name='AriaLabel7' descriptionFrom=relatedElement -++++genericContainer \ No newline at end of file +++genericContainer ignored +++++textField name='Title0' +++++++genericContainer +++++textField description='Title1' name='Label1' descriptionFrom=attribute +++++++genericContainer +++++textField description='Title2' name='AriaLabel2' descriptionFrom=attribute +++++++genericContainer +++++textField description='Title3' name='LabelledBy3' descriptionFrom=attribute +++++++genericContainer +++++textField name='Placeholder4' +++++++genericContainer +++++textField name='ARIA Placeholder4a' +++++++genericContainer +++++textField name='Placeholder4b' +++++++genericContainer +++++textField description='Title5' name='Placeholder5' descriptionFrom=attribute +++++++genericContainer +++++textField description='DescribedBy6' name='LabelledBy6' descriptionFrom=relatedElement +++++++genericContainer +++++textField description='DescribedBy7' name='AriaLabel7' descriptionFrom=relatedElement +++++++genericContainer
diff --git a/content/test/data/accessibility/html/input-types-expected-blink.txt b/content/test/data/accessibility/html/input-types-expected-blink.txt index 048d3c9..6a11448 100644 --- a/content/test/data/accessibility/html/input-types-expected-blink.txt +++ b/content/test/data/accessibility/html/input-types-expected-blink.txt
@@ -70,4 +70,4 @@ ++++++staticText name='Url: ' ++++++++inlineTextBox name='Url: ' ++++++textField name='Url:' -++++++++genericContainer \ No newline at end of file +++++++++genericContainer
diff --git a/content/test/data/accessibility/html/ins-expected-blink.txt b/content/test/data/accessibility/html/ins-expected-blink.txt index 31227a5..296df33 100644 --- a/content/test/data/accessibility/html/ins-expected-blink.txt +++ b/content/test/data/accessibility/html/ins-expected-blink.txt
@@ -1,14 +1,15 @@ rootWebArea -++paragraph -++++staticText name='My favorite browser is ' -++++++inlineTextBox name='My favorite browser is ' -++++contentDeletion -++++++staticText name='ABC' -++++++++inlineTextBox name='ABC' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++contentInsertion -++++++staticText name='Chrome' -++++++++inlineTextBox name='Chrome' -++++staticText name='!' -++++++inlineTextBox name='!' +++genericContainer ignored +++++paragraph +++++++staticText name='My favorite browser is ' +++++++++inlineTextBox name='My favorite browser is ' +++++++contentDeletion +++++++++staticText name='ABC' +++++++++++inlineTextBox name='ABC' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++contentInsertion +++++++++staticText name='Chrome' +++++++++++inlineTextBox name='Chrome' +++++++staticText name='!' +++++++++inlineTextBox name='!'
diff --git a/content/test/data/accessibility/html/label-with-selected-option-expected-blink.txt b/content/test/data/accessibility/html/label-with-selected-option-expected-blink.txt index a9906a5b..552fc2a 100644 --- a/content/test/data/accessibility/html/label-with-selected-option-expected-blink.txt +++ b/content/test/data/accessibility/html/label-with-selected-option-expected-blink.txt
@@ -1,33 +1,34 @@ rootWebArea -++genericContainer -++++checkBox name='Test 1: Flash the screen 2 times.' checkedState=false -++++popUpButton collapsed value='2' -++++++menuListPopup invisible -++++++++menuListOption invisible name='1' selected=false -++++++++menuListOption name='2' selected=true -++++++++menuListOption invisible name='3' selected=false -++genericContainer -++++checkBox name='Test 2: Flash the screen 2 times.' checkedState=false -++++listBox activedescendantId=listBoxOption -++++++listBoxOption name='1' selected=false -++++++listBoxOption name='2' selected=true -++++++listBoxOption name='3' selected=false -++genericContainer -++++checkBox name='Test 3: Flash the screen two times.' checkedState=false -++++popUpButton collapsed value='two' -++++++menuListPopup invisible -++++++++menuListOption invisible name='1' selected=false -++++++++menuListOption name='two' selected=true -++++++++menuListOption invisible name='3' selected=false -++genericContainer -++++checkBox name='Test 4: Flash the screen two times.' checkedState=false -++++listBox activedescendantId=listBoxOption -++++++listBoxOption name='1' selected=false -++++++listBoxOption name='two' selected=true -++++++listBoxOption name='3' selected=false -++genericContainer -++++checkBox name='Test 5: Flash the screen two 3 times.' checkedState=false -++++listBox multiselectable activedescendantId=listBoxOption -++++++listBoxOption name='1' selected=false -++++++listBoxOption name='two' selected=true -++++++listBoxOption name='3' selected=true +++genericContainer ignored +++++genericContainer +++++++checkBox name='Test 1: Flash the screen 2 times.' checkedState=false +++++++popUpButton collapsed value='2' +++++++++menuListPopup invisible +++++++++++menuListOption invisible name='1' selected=false +++++++++++menuListOption name='2' selected=true +++++++++++menuListOption invisible name='3' selected=false +++++genericContainer +++++++checkBox name='Test 2: Flash the screen 2 times.' checkedState=false +++++++listBox activedescendantId=listBoxOption +++++++++listBoxOption name='1' selected=false +++++++++listBoxOption name='2' selected=true +++++++++listBoxOption name='3' selected=false +++++genericContainer +++++++checkBox name='Test 3: Flash the screen two times.' checkedState=false +++++++popUpButton collapsed value='two' +++++++++menuListPopup invisible +++++++++++menuListOption invisible name='1' selected=false +++++++++++menuListOption name='two' selected=true +++++++++++menuListOption invisible name='3' selected=false +++++genericContainer +++++++checkBox name='Test 4: Flash the screen two times.' checkedState=false +++++++listBox activedescendantId=listBoxOption +++++++++listBoxOption name='1' selected=false +++++++++listBoxOption name='two' selected=true +++++++++listBoxOption name='3' selected=false +++++genericContainer +++++++checkBox name='Test 5: Flash the screen two 3 times.' checkedState=false +++++++listBox multiselectable activedescendantId=listBoxOption +++++++++listBoxOption name='1' selected=false +++++++++listBoxOption name='two' selected=true +++++++++listBoxOption name='3' selected=true
diff --git a/content/test/data/accessibility/html/landmark-expected-blink.txt b/content/test/data/accessibility/html/landmark-expected-blink.txt index eed5d09..ca84899 100644 --- a/content/test/data/accessibility/html/landmark-expected-blink.txt +++ b/content/test/data/accessibility/html/landmark-expected-blink.txt
@@ -1,204 +1,229 @@ rootWebArea -++banner -++++staticText name='This is a header element.' -++++++inlineTextBox name='This is a header element.' -++complementary -++++staticText name='This is an aside element.' -++++++inlineTextBox name='This is an aside element.' -++genericContainer -++++staticText name='This is an address element.' -++++++inlineTextBox name='This is an address element.' -++footer -++++staticText name='This is a footer element.' -++++++inlineTextBox name='This is a footer element.' -++form -++++staticText name='This is a form element.' -++++++inlineTextBox name='This is a form element.' -++main -++++staticText name='This is a main element.' -++++++inlineTextBox name='This is a main element.' -++navigation -++++staticText name='This is a nav element.' -++++++inlineTextBox name='This is a nav element.' -++application -++++staticText name='This is an ARIA application landmark.' -++++++inlineTextBox name='This is an ARIA application landmark.' -++banner -++++staticText name='This is an ARIA banner landmark.' -++++++inlineTextBox name='This is an ARIA banner landmark.' -++complementary -++++staticText name='This is an ARIA complementary landmark.' -++++++inlineTextBox name='This is an ARIA complementary landmark.' -++contentInfo -++++staticText name='This is an ARIA contentinfo landmark.' -++++++inlineTextBox name='This is an ARIA contentinfo landmark.' -++form -++++staticText name='This is an ARIA form landmark.' -++++++inlineTextBox name='This is an ARIA form landmark.' -++main -++++staticText name='This is an ARIA main landmark.' -++++++inlineTextBox name='This is an ARIA main landmark.' -++navigation -++++staticText name='This is an ARIA navigation landmark.' -++++++inlineTextBox name='This is an ARIA navigation landmark.' -++search -++++staticText name='This is an ARIA search landmark.' -++++++inlineTextBox name='This is an ARIA search landmark.' -++article +++genericContainer ignored +++++banner +++++++staticText name='This is a header element.' +++++++++inlineTextBox name='This is a header element.' +++++complementary +++++++staticText name='This is an aside element.' +++++++++inlineTextBox name='This is an aside element.' ++++genericContainer -++++++staticText name='This should NOT banner role.' -++++++++inlineTextBox name='This should NOT banner role.' -++complementary -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++navigation -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++region -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++blockquote -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++details -++++disclosureTriangle name='Details' -++++++staticText name='Details' -++++++++inlineTextBox name='Details' -++group -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++figure -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++group -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++main -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++article -++++genericContainer -++++++staticText name='This should NOT banner role.' -++++++++inlineTextBox name='This should NOT banner role.' -++complementary -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++navigation -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++region -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++blockquote -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++details -++++disclosureTriangle name='Details' -++++++staticText name='Details' -++++++++inlineTextBox name='Details' -++group -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++figure -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++genericContainer -++++staticText name='This should NOT have banner role.' -++++++inlineTextBox name='This should NOT have banner role.' -++main -++++genericContainer -++++++staticText name='This should NOT have banner role.' -++++++++inlineTextBox name='This should NOT have banner role.' -++article -++++genericContainer -++++++staticText name='This should NOT footer role.' -++++++++inlineTextBox name='This should NOT footer role.' -++complementary -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++navigation -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++region -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++blockquote -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++details -++++disclosureTriangle name='Details' -++++++staticText name='Details' -++++++++inlineTextBox name='Details' -++group -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++figure -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++genericContainer -++++staticText name='This should NOT have footer role.' -++++++inlineTextBox name='This should NOT have footer role.' -++main -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++article -++++genericContainer -++++++staticText name='This should NOT footer role.' -++++++++inlineTextBox name='This should NOT footer role.' -++complementary -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++navigation -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++region -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++blockquote -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++details -++++disclosureTriangle name='Details' -++++++staticText name='Details' -++++++++inlineTextBox name='Details' -++group -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++figure -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++group -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' -++main -++++genericContainer -++++++staticText name='This should NOT have footer role.' -++++++++inlineTextBox name='This should NOT have footer role.' +++++++staticText name='This is an address element.' +++++++++inlineTextBox name='This is an address element.' +++++footer +++++++staticText name='This is a footer element.' +++++++++inlineTextBox name='This is a footer element.' +++++form +++++++staticText name='This is a form element.' +++++++++inlineTextBox name='This is a form element.' +++++main +++++++staticText name='This is a main element.' +++++++++inlineTextBox name='This is a main element.' +++++navigation +++++++staticText name='This is a nav element.' +++++++++inlineTextBox name='This is a nav element.' +++++application +++++++staticText name='This is an ARIA application landmark.' +++++++++inlineTextBox name='This is an ARIA application landmark.' +++++banner +++++++staticText name='This is an ARIA banner landmark.' +++++++++inlineTextBox name='This is an ARIA banner landmark.' +++++complementary +++++++staticText name='This is an ARIA complementary landmark.' +++++++++inlineTextBox name='This is an ARIA complementary landmark.' +++++contentInfo +++++++staticText name='This is an ARIA contentinfo landmark.' +++++++++inlineTextBox name='This is an ARIA contentinfo landmark.' +++++form +++++++staticText name='This is an ARIA form landmark.' +++++++++inlineTextBox name='This is an ARIA form landmark.' +++++main +++++++staticText name='This is an ARIA main landmark.' +++++++++inlineTextBox name='This is an ARIA main landmark.' +++++navigation +++++++staticText name='This is an ARIA navigation landmark.' +++++++++inlineTextBox name='This is an ARIA navigation landmark.' +++++search +++++++staticText name='This is an ARIA search landmark.' +++++++++inlineTextBox name='This is an ARIA search landmark.' +++++article +++++++genericContainer +++++++++staticText name='This should NOT banner role.' +++++++++++inlineTextBox name='This should NOT banner role.' +++++complementary +++++++genericContainer +++++++++staticText name='This should NOT have banner role.' +++++++++++inlineTextBox name='This should NOT have banner role.' +++++navigation +++++++genericContainer +++++++++staticText name='This should NOT have banner role.' +++++++++++inlineTextBox name='This should NOT have banner role.' +++++region +++++++genericContainer +++++++++staticText name='This should NOT have banner role.' +++++++++++inlineTextBox name='This should NOT have banner role.' +++++blockquote +++++++genericContainer +++++++++staticText name='This should NOT have banner role.' +++++++++++inlineTextBox name='This should NOT have banner role.' +++++details +++++++disclosureTriangle name='Details' +++++++++staticText name='Details' +++++++++++inlineTextBox name='Details' +++++group +++++++genericContainer +++++++++staticText name='This should NOT have banner role.' +++++++++++inlineTextBox name='This should NOT have banner role.' +++++figure +++++++genericContainer +++++++++staticText name='This should NOT have banner role.' +++++++++++inlineTextBox name='This should NOT have banner role.' +++++group +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have banner role.' +++++++++++++inlineTextBox name='This should NOT have banner role.' +++++main +++++++genericContainer +++++++++staticText name='This should NOT have banner role.' +++++++++++inlineTextBox name='This should NOT have banner role.' +++++article +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT banner role.' +++++++++++++inlineTextBox name='This should NOT banner role.' +++++complementary +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have banner role.' +++++++++++++inlineTextBox name='This should NOT have banner role.' +++++navigation +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have banner role.' +++++++++++++inlineTextBox name='This should NOT have banner role.' +++++region +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have banner role.' +++++++++++++inlineTextBox name='This should NOT have banner role.' +++++blockquote +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have banner role.' +++++++++++++inlineTextBox name='This should NOT have banner role.' +++++details +++++++disclosureTriangle name='Details' +++++++++staticText name='Details' +++++++++++inlineTextBox name='Details' +++++group +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have banner role.' +++++++++++++inlineTextBox name='This should NOT have banner role.' +++++figure +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have banner role.' +++++++++++++inlineTextBox name='This should NOT have banner role.' +++++none ignored +++++++genericContainer ignored +++++++++genericContainer ignored +++++++++++genericContainer +++++++++++++staticText name='This should NOT have banner role.' +++++++++++++++inlineTextBox name='This should NOT have banner role.' +++++main +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have banner role.' +++++++++++++inlineTextBox name='This should NOT have banner role.' +++++article +++++++genericContainer +++++++++staticText name='This should NOT footer role.' +++++++++++inlineTextBox name='This should NOT footer role.' +++++complementary +++++++genericContainer +++++++++staticText name='This should NOT have footer role.' +++++++++++inlineTextBox name='This should NOT have footer role.' +++++navigation +++++++genericContainer +++++++++staticText name='This should NOT have footer role.' +++++++++++inlineTextBox name='This should NOT have footer role.' +++++region +++++++genericContainer +++++++++staticText name='This should NOT have footer role.' +++++++++++inlineTextBox name='This should NOT have footer role.' +++++blockquote +++++++genericContainer +++++++++staticText name='This should NOT have footer role.' +++++++++++inlineTextBox name='This should NOT have footer role.' +++++details +++++++disclosureTriangle name='Details' +++++++++staticText name='Details' +++++++++++inlineTextBox name='Details' +++++group +++++++genericContainer +++++++++staticText name='This should NOT have footer role.' +++++++++++inlineTextBox name='This should NOT have footer role.' +++++figure +++++++genericContainer +++++++++staticText name='This should NOT have footer role.' +++++++++++inlineTextBox name='This should NOT have footer role.' +++++none ignored +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have footer role.' +++++++++++++inlineTextBox name='This should NOT have footer role.' +++++main +++++++genericContainer +++++++++staticText name='This should NOT have footer role.' +++++++++++inlineTextBox name='This should NOT have footer role.' +++++article +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT footer role.' +++++++++++++inlineTextBox name='This should NOT footer role.' +++++complementary +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have footer role.' +++++++++++++inlineTextBox name='This should NOT have footer role.' +++++navigation +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have footer role.' +++++++++++++inlineTextBox name='This should NOT have footer role.' +++++region +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have footer role.' +++++++++++++inlineTextBox name='This should NOT have footer role.' +++++blockquote +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have footer role.' +++++++++++++inlineTextBox name='This should NOT have footer role.' +++++details +++++++disclosureTriangle name='Details' +++++++++staticText name='Details' +++++++++++inlineTextBox name='Details' +++++group +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have footer role.' +++++++++++++inlineTextBox name='This should NOT have footer role.' +++++figure +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have footer role.' +++++++++++++inlineTextBox name='This should NOT have footer role.' +++++group +++++++genericContainer ignored +++++++++genericContainer ignored +++++++++++genericContainer +++++++++++++staticText name='This should NOT have footer role.' +++++++++++++++inlineTextBox name='This should NOT have footer role.' +++++main +++++++genericContainer ignored +++++++++genericContainer +++++++++++staticText name='This should NOT have footer role.' +++++++++++++inlineTextBox name='This should NOT have footer role.'
diff --git a/content/test/data/accessibility/html/landmark.html b/content/test/data/accessibility/html/landmark.html index 3218097..b61b2cdf 100644 --- a/content/test/data/accessibility/html/landmark.html +++ b/content/test/data/accessibility/html/landmark.html
@@ -43,7 +43,7 @@ <details><div><header>This should NOT header role.</header></div></details> <fieldset><div><header>This should NOT have banner role.</header></div></fieldset> <figure><div><header>This should NOT have banner role.</header></div></figure> - <table role="none"><tr><td><div><header>This should NOT have banner role.</header><div></td></tr></table> + <table role="none"><tr><td><div><header>This should NOT have banner role.</header></div></td></tr></table> <main><div><header>This should NOT have banner role.</header></div></main> <article><footer>This should NOT footer role.</footer></article> @@ -65,7 +65,7 @@ <details><div><footer>This should NOT footer role.</footer></div></details> <fieldset><div><footer>This should NOT have footer role.</footer></div></fieldset> <figure><div><footer>This should NOT have footer role.</footer></div></figure> - <table role="group"><tr><td><div><footer>This should NOT have footer role.</footer><div></td></tr></table> + <table role="group"><tr><td><div><footer>This should NOT have footer role.</footer></div></td></tr></table> <main><div><footer>This should NOT have footer role.</footer></div></main> </body> </html>
diff --git a/content/test/data/accessibility/html/layout-table-in-button-expected-blink.txt b/content/test/data/accessibility/html/layout-table-in-button-expected-blink.txt index 9f8a298d..d7453e3c 100644 --- a/content/test/data/accessibility/html/layout-table-in-button-expected-blink.txt +++ b/content/test/data/accessibility/html/layout-table-in-button-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++button name='Conversation with Foo. 0 unread messages.' -++++layoutTable -++++++layoutTableRow -++++++++layoutTableCell name='Conversation with Foo. 0 unread messages.' -++++++++++genericContainer name='Conversation with Foo. 0 unread messages.' -++++++++++++staticText name='Foo' -++++++++++++++inlineTextBox name='Foo' +++genericContainer ignored +++++button name='Conversation with Foo. 0 unread messages.' +++++++layoutTable +++++++++layoutTableRow +++++++++++layoutTableCell name='Conversation with Foo. 0 unread messages.' +++++++++++++genericContainer name='Conversation with Foo. 0 unread messages.' +++++++++++++++staticText name='Foo' +++++++++++++++++inlineTextBox name='Foo'
diff --git a/content/test/data/accessibility/html/legend-expected-blink.txt b/content/test/data/accessibility/html/legend-expected-blink.txt index 7e87ec8a..b99c5940 100644 --- a/content/test/data/accessibility/html/legend-expected-blink.txt +++ b/content/test/data/accessibility/html/legend-expected-blink.txt
@@ -1,15 +1,16 @@ rootWebArea -++form -++++group name='Browser Engines:' -++++++legend -++++++++staticText name='Browser Engines:' -++++++++++inlineTextBox name='Browser Engines:' -++++++staticText name='Browser: ' -++++++++inlineTextBox name='Browser: ' -++++++textField -++++++++genericContainer -++++++staticText name=' Rendering Engine: ' -++++++++inlineTextBox name=' ' -++++++++inlineTextBox name='Rendering Engine: ' -++++++textField -++++++++genericContainer \ No newline at end of file +++genericContainer ignored +++++form +++++++group name='Browser Engines:' +++++++++legend +++++++++++staticText name='Browser Engines:' +++++++++++++inlineTextBox name='Browser Engines:' +++++++++staticText name='Browser: ' +++++++++++inlineTextBox name='Browser: ' +++++++++textField +++++++++++genericContainer +++++++++staticText name=' Rendering Engine: ' +++++++++++inlineTextBox name=' ' +++++++++++inlineTextBox name='Rendering Engine: ' +++++++++textField +++++++++++genericContainer
diff --git a/content/test/data/accessibility/html/li-expected-blink.txt b/content/test/data/accessibility/html/li-expected-blink.txt index 9895cd6..60a6dc1d 100644 --- a/content/test/data/accessibility/html/li-expected-blink.txt +++ b/content/test/data/accessibility/html/li-expected-blink.txt
@@ -1,14 +1,15 @@ rootWebArea -++list display='block' setSize=3 -++++listItem display='list-item' setSize=3 posInSet=1 -++++++listMarker name='• ' -++++++staticText display='list-item' name='Item 1' -++++++++inlineTextBox display='list-item' name='Item 1' -++++listItem display='list-item' setSize=3 posInSet=2 -++++++listMarker name='• ' -++++++staticText display='list-item' name='Item 2' -++++++++inlineTextBox display='list-item' name='Item 2' -++++listItem display='list-item' setSize=3 posInSet=3 -++++++listMarker name='• ' -++++++staticText display='list-item' name='Item 3' -++++++++inlineTextBox display='list-item' name='Item 3' +++genericContainer ignored display='block' +++++list display='block' setSize=3 +++++++listItem display='list-item' setSize=3 posInSet=1 +++++++++listMarker name='• ' +++++++++staticText display='list-item' name='Item 1' +++++++++++inlineTextBox display='list-item' name='Item 1' +++++++listItem display='list-item' setSize=3 posInSet=2 +++++++++listMarker name='• ' +++++++++staticText display='list-item' name='Item 2' +++++++++++inlineTextBox display='list-item' name='Item 2' +++++++listItem display='list-item' setSize=3 posInSet=3 +++++++++listMarker name='• ' +++++++++staticText display='list-item' name='Item 3' +++++++++++inlineTextBox display='list-item' name='Item 3'
diff --git a/content/test/data/accessibility/html/link-inside-heading-expected-blink.txt b/content/test/data/accessibility/html/link-inside-heading-expected-blink.txt index 1b20125..aeac6d3 100644 --- a/content/test/data/accessibility/html/link-inside-heading-expected-blink.txt +++ b/content/test/data/accessibility/html/link-inside-heading-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++heading name='Link In Heading' hierarchicalLevel=1 -++++link name='Link In Heading' -++++++staticText name='Link In Heading' -++++++++inlineTextBox name='Link In Heading' \ No newline at end of file +++genericContainer ignored +++++heading name='Link In Heading' hierarchicalLevel=1 +++++++link name='Link In Heading' +++++++++staticText name='Link In Heading' +++++++++++inlineTextBox name='Link In Heading'
diff --git a/content/test/data/accessibility/html/list-expected-blink.txt b/content/test/data/accessibility/html/list-expected-blink.txt index 1799fb9..6e5bef5 100644 --- a/content/test/data/accessibility/html/list-expected-blink.txt +++ b/content/test/data/accessibility/html/list-expected-blink.txt
@@ -1,28 +1,29 @@ rootWebArea -++list -++++listItem -++++++listMarker name='• ' -++++++staticText name='tic' -++++++++inlineTextBox name='tic' -++++listItem -++++++listMarker name='• ' -++++++staticText name='tac' -++++++++inlineTextBox name='tac' -++++listItem -++++++listMarker name='• ' -++++++staticText name='toe' -++++++++inlineTextBox name='toe' -++list -++++listItem -++++++staticText name='tic' -++++++++inlineTextBox name='tic' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++listItem -++++++staticText name='tac' -++++++++inlineTextBox name='tac' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++listItem -++++++staticText name='toe' -++++++++inlineTextBox name='toe' +++genericContainer ignored +++++list +++++++listItem +++++++++listMarker name='• ' +++++++++staticText name='tic' +++++++++++inlineTextBox name='tic' +++++++listItem +++++++++listMarker name='• ' +++++++++staticText name='tac' +++++++++++inlineTextBox name='tac' +++++++listItem +++++++++listMarker name='• ' +++++++++staticText name='toe' +++++++++++inlineTextBox name='toe' +++++list +++++++listItem +++++++++staticText name='tic' +++++++++++inlineTextBox name='tic' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++listItem +++++++++staticText name='tac' +++++++++++inlineTextBox name='tac' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++listItem +++++++++staticText name='toe' +++++++++++inlineTextBox name='toe'
diff --git a/content/test/data/accessibility/html/list-marker-styles-expected-blink.txt b/content/test/data/accessibility/html/list-marker-styles-expected-blink.txt index 1257c95d..158f9f5 100644 --- a/content/test/data/accessibility/html/list-marker-styles-expected-blink.txt +++ b/content/test/data/accessibility/html/list-marker-styles-expected-blink.txt
@@ -1,45 +1,46 @@ rootWebArea -++list -++++listItem -++++++staticText name='none' -++++++++inlineTextBox name='none' -++list -++++listItem listStyle=circle -++++++listMarker name='â—¦ ' -++++++staticText name='circle' -++++++++inlineTextBox name='circle' -++list -++++listItem listStyle=disc -++++++listMarker name='• ' -++++++staticText name='disc' -++++++++inlineTextBox name='disc' -++list -++++listItem listStyle=image -++++++listMarker name=' ' -++++++staticText name='image' -++++++++inlineTextBox name='image' -++list -++++listItem listStyle=square -++++++listMarker name='â– ' -++++++staticText name='square' -++++++++inlineTextBox name='square' -++list -++++listItem listStyle=numeric -++++++listMarker name='1. ' -++++++staticText name='decimal' -++++++++inlineTextBox name='decimal' -++list -++++listItem listStyle=other -++++++listMarker name='I. ' -++++++staticText name='upper-roman' -++++++++inlineTextBox name='upper-roman' -++list -++++listItem listStyle=other -++++++listMarker name='Ô±. ' -++++++staticText name='armenian' -++++++++inlineTextBox name='armenian' -++list -++++listItem listStyle=other -++++++listMarker name='a. ' -++++++staticText name='lower-alpha' -++++++++inlineTextBox name='lower-alpha' +++genericContainer ignored +++++list +++++++listItem +++++++++staticText name='none' +++++++++++inlineTextBox name='none' +++++list +++++++listItem listStyle=circle +++++++++listMarker name='â—¦ ' +++++++++staticText name='circle' +++++++++++inlineTextBox name='circle' +++++list +++++++listItem listStyle=disc +++++++++listMarker name='• ' +++++++++staticText name='disc' +++++++++++inlineTextBox name='disc' +++++list +++++++listItem listStyle=image +++++++++listMarker name=' ' +++++++++staticText name='image' +++++++++++inlineTextBox name='image' +++++list +++++++listItem listStyle=square +++++++++listMarker name='â– ' +++++++++staticText name='square' +++++++++++inlineTextBox name='square' +++++list +++++++listItem listStyle=numeric +++++++++listMarker name='1. ' +++++++++staticText name='decimal' +++++++++++inlineTextBox name='decimal' +++++list +++++++listItem listStyle=other +++++++++listMarker name='I. ' +++++++++staticText name='upper-roman' +++++++++++inlineTextBox name='upper-roman' +++++list +++++++listItem listStyle=other +++++++++listMarker name='Ô±. ' +++++++++staticText name='armenian' +++++++++++inlineTextBox name='armenian' +++++list +++++++listItem listStyle=other +++++++++listMarker name='a. ' +++++++++staticText name='lower-alpha' +++++++++++inlineTextBox name='lower-alpha'
diff --git a/content/test/data/accessibility/html/list-markers-expected-blink.txt b/content/test/data/accessibility/html/list-markers-expected-blink.txt index 28cdd7b2..61ac56af 100644 --- a/content/test/data/accessibility/html/list-markers-expected-blink.txt +++ b/content/test/data/accessibility/html/list-markers-expected-blink.txt
@@ -1,26 +1,27 @@ rootWebArea -++list -++++listItem -++++++listMarker name='• ' -++++++staticText name='First item properly groups itself despite ' -++++++++inlineTextBox name='First item properly groups itself despite ' -++++++staticText name='bolded' -++++++++inlineTextBox name='bolded' -++++++staticText name=' text.' -++++++++inlineTextBox name=' text.' -++++listItem -++++++listMarker name='• ' -++++++staticText name='This should also be ' -++++++++inlineTextBox name='This should also be ' -++++++staticText name='seen' -++++++++inlineTextBox name='seen' -++++++staticText name=' as a group.' -++++++++inlineTextBox name=' as a group.' -++++listItem -++++++listMarker name='• ' -++++++staticText name='Some ' -++++++++inlineTextBox name='Some ' -++++++staticText name='more' -++++++++inlineTextBox name='more' -++++++staticText name=' text.' -++++++++inlineTextBox name=' text.' +++genericContainer ignored +++++list +++++++listItem +++++++++listMarker name='• ' +++++++++staticText name='First item properly groups itself despite ' +++++++++++inlineTextBox name='First item properly groups itself despite ' +++++++++staticText name='bolded' +++++++++++inlineTextBox name='bolded' +++++++++staticText name=' text.' +++++++++++inlineTextBox name=' text.' +++++++listItem +++++++++listMarker name='• ' +++++++++staticText name='This should also be ' +++++++++++inlineTextBox name='This should also be ' +++++++++staticText name='seen' +++++++++++inlineTextBox name='seen' +++++++++staticText name=' as a group.' +++++++++++inlineTextBox name=' as a group.' +++++++listItem +++++++++listMarker name='• ' +++++++++staticText name='Some ' +++++++++++inlineTextBox name='Some ' +++++++++staticText name='more' +++++++++++inlineTextBox name='more' +++++++++staticText name=' text.' +++++++++++inlineTextBox name=' text.'
diff --git a/content/test/data/accessibility/html/long-text-expected-blink.txt b/content/test/data/accessibility/html/long-text-expected-blink.txt index 53331539..81ead57 100644 --- a/content/test/data/accessibility/html/long-text-expected-blink.txt +++ b/content/test/data/accessibility/html/long-text-expected-blink.txt
@@ -1,503 +1,504 @@ rootWebArea -++pre -++++staticText name='1. The quick brown fox jumps over the lazy dog.<newline>2. The quick brown fox jumps over the lazy dog.<newline>3. The quick brown fox jumps over the lazy dog.<newline>4. The quick brown fox jumps over the lazy dog.<newline>5. The quick brown fox jumps over the lazy dog.<newline>6. The quick brown fox jumps over the lazy dog.<newline>7. The quick brown fox jumps over the lazy dog.<newline>8. The quick brown fox jumps over the lazy dog.<newline>9. The quick brown fox jumps over the lazy dog.<newline>10. The quick brown fox jumps over the lazy dog.<newline>11. The quick brown fox jumps over the lazy dog.<newline>12. The quick brown fox jumps over the lazy dog.<newline>13. The quick brown fox jumps over the lazy dog.<newline>14. The quick brown fox jumps over the lazy dog.<newline>15. The quick brown fox jumps over the lazy dog.<newline>16. The quick brown fox jumps over the lazy dog.<newline>17. The quick brown fox jumps over the lazy dog.<newline>18. The quick brown fox jumps over the lazy dog.<newline>19. The quick brown fox jumps over the lazy dog.<newline>20. The quick brown fox jumps over the lazy dog.<newline>21. The quick brown fox jumps over the lazy dog.<newline>22. The quick brown fox jumps over the lazy dog.<newline>23. The quick brown fox jumps over the lazy dog.<newline>24. The quick brown fox jumps over the lazy dog.<newline>25. The quick brown fox jumps over the lazy dog.<newline>26. The quick brown fox jumps over the lazy dog.<newline>27. The quick brown fox jumps over the lazy dog.<newline>28. The quick brown fox jumps over the lazy dog.<newline>29. The quick brown fox jumps over the lazy dog.<newline>30. The quick brown fox jumps over the lazy dog.<newline>31. The quick brown fox jumps over the lazy dog.<newline>32. The quick brown fox jumps over the lazy dog.<newline>33. The quick brown fox jumps over the lazy dog.<newline>34. The quick brown fox jumps over the lazy dog.<newline>35. The quick brown fox jumps over the lazy dog.<newline>36. The quick brown fox jumps over the lazy dog.<newline>37. The quick brown fox jumps over the lazy dog.<newline>38. The quick brown fox jumps over the lazy dog.<newline>39. The quick brown fox jumps over the lazy dog.<newline>40. The quick brown fox jumps over the lazy dog.<newline>41. The quick brown fox jumps over the lazy dog.<newline>42. The quick brown fox jumps over the lazy dog.<newline>43. The quick brown fox jumps over the lazy dog.<newline>44. The quick brown fox jumps over the lazy dog.<newline>45. The quick brown fox jumps over the lazy dog.<newline>46. The quick brown fox jumps over the lazy dog.<newline>47. The quick brown fox jumps over the lazy dog.<newline>48. The quick brown fox jumps over the lazy dog.<newline>49. The quick brown fox jumps over the lazy dog.<newline>50. The quick brown fox jumps over the lazy dog.<newline>51. The quick brown fox jumps over the lazy dog.<newline>52. The quick brown fox jumps over the lazy dog.<newline>53. The quick brown fox jumps over the lazy dog.<newline>54. The quick brown fox jumps over the lazy dog.<newline>55. The quick brown fox jumps over the lazy dog.<newline>56. The quick brown fox jumps over the lazy dog.<newline>57. The quick brown fox jumps over the lazy dog.<newline>58. The quick brown fox jumps over the lazy dog.<newline>59. The quick brown fox jumps over the lazy dog.<newline>60. The quick brown fox jumps over the lazy dog.<newline>61. The quick brown fox jumps over the lazy dog.<newline>62. The quick brown fox jumps over the lazy dog.<newline>63. The quick brown fox jumps over the lazy dog.<newline>64. The quick brown fox jumps over the lazy dog.<newline>65. The quick brown fox jumps over the lazy dog.<newline>66. The quick brown fox jumps over the lazy dog.<newline>67. The quick brown fox jumps over the lazy dog.<newline>68. The quick brown fox jumps over the lazy dog.<newline>69. The quick brown fox jumps over the lazy dog.<newline>70. The quick brown fox jumps over the lazy dog.<newline>71. The quick brown fox jumps over the lazy dog.<newline>72. The quick brown fox jumps over the lazy dog.<newline>73. The quick brown fox jumps over the lazy dog.<newline>74. The quick brown fox jumps over the lazy dog.<newline>75. The quick brown fox jumps over the lazy dog.<newline>76. The quick brown fox jumps over the lazy dog.<newline>77. The quick brown fox jumps over the lazy dog.<newline>78. The quick brown fox jumps over the lazy dog.<newline>79. The quick brown fox jumps over the lazy dog.<newline>80. The quick brown fox jumps over the lazy dog.<newline>81. The quick brown fox jumps over the lazy dog.<newline>82. The quick brown fox jumps over the lazy dog.<newline>83. The quick brown fox jumps over the lazy dog.<newline>84. The quick brown fox jumps over the lazy dog.<newline>85. The quick brown fox jumps over the lazy dog.<newline>86. The quick brown fox jumps over the lazy dog.<newline>87. The quick brown fox jumps over the lazy dog.<newline>88. The quick brown fox jumps over the lazy dog.<newline>89. The quick brown fox jumps over the lazy dog.<newline>90. The quick brown fox jumps over the lazy dog.<newline>91. The quick brown fox jumps over the lazy dog.<newline>92. The quick brown fox jumps over the lazy dog.<newline>93. The quick brown fox jumps over the lazy dog.<newline>94. The quick brown fox jumps over the lazy dog.<newline>95. The quick brown fox jumps over the lazy dog.<newline>96. The quick brown fox jumps over the lazy dog.<newline>97. The quick brown fox jumps over the lazy dog.<newline>98. The quick brown fox jumps over the lazy dog.<newline>99. The quick brown fox jumps over the lazy dog.<newline>100. The quick brown fox jumps over the lazy dog.<newline>101. The quick brown fox jumps over the lazy dog.<newline>102. The quick brown fox jumps over the lazy dog.<newline>103. The quick brown fox jumps over the lazy dog.<newline>104. The quick brown fox jumps over the lazy dog.<newline>105. The quick brown fox jumps over the lazy dog.<newline>106. The quick brown fox jumps over the lazy dog.<newline>107. The quick brown fox jumps over the lazy dog.<newline>108. The quick brown fox jumps over the lazy dog.<newline>109. The quick brown fox jumps over the lazy dog.<newline>110. The quick brown fox jumps over the lazy dog.<newline>111. The quick brown fox jumps over the lazy dog.<newline>112. The quick brown fox jumps over the lazy dog.<newline>113. The quick brown fox jumps over the lazy dog.<newline>114. The quick brown fox jumps over the lazy dog.<newline>115. The quick brown fox jumps over the lazy dog.<newline>116. The quick brown fox jumps over the lazy dog.<newline>117. The quick brown fox jumps over the lazy dog.<newline>118. The quick brown fox jumps over the lazy dog.<newline>119. The quick brown fox jumps over the lazy dog.<newline>120. The quick brown fox jumps over the lazy dog.<newline>121. The quick brown fox jumps over the lazy dog.<newline>122. The quick brown fox jumps over the lazy dog.<newline>123. The quick brown fox jumps over the lazy dog.<newline>124. The quick brown fox jumps over the lazy dog.<newline>125. The quick brown fox jumps over the lazy dog.<newline>126. The quick brown fox jumps over the lazy dog.<newline>127. The quick brown fox jumps over the lazy dog.<newline>128. The quick brown fox jumps over the lazy dog.<newline>129. The quick brown fox jumps over the lazy dog.<newline>130. The quick brown fox jumps over the lazy dog.<newline>131. The quick brown fox jumps over the lazy dog.<newline>132. The quick brown fox jumps over the lazy dog.<newline>133. The quick brown fox jumps over the lazy dog.<newline>134. The quick brown fox jumps over the lazy dog.<newline>135. The quick brown fox jumps over the lazy dog.<newline>136. The quick brown fox jumps over the lazy dog.<newline>137. The quick brown fox jumps over the lazy dog.<newline>138. The quick brown fox jumps over the lazy dog.<newline>139. The quick brown fox jumps over the lazy dog.<newline>140. The quick brown fox jumps over the lazy dog.<newline>141. The quick brown fox jumps over the lazy dog.<newline>142. The quick brown fox jumps over the lazy dog.<newline>143. The quick brown fox jumps over the lazy dog.<newline>144. The quick brown fox jumps over the lazy dog.<newline>145. The quick brown fox jumps over the lazy dog.<newline>146. The quick brown fox jumps over the lazy dog.<newline>147. The quick brown fox jumps over the lazy dog.<newline>148. The quick brown fox jumps over the lazy dog.<newline>149. The quick brown fox jumps over the lazy dog.<newline>150. The quick brown fox jumps over the lazy dog.<newline>151. The quick brown fox jumps over the lazy dog.<newline>152. The quick brown fox jumps over the lazy dog.<newline>153. The quick brown fox jumps over the lazy dog.<newline>154. The quick brown fox jumps over the lazy dog.<newline>155. The quick brown fox jumps over the lazy dog.<newline>156. The quick brown fox jumps over the lazy dog.<newline>157. The quick brown fox jumps over the lazy dog.<newline>158. The quick brown fox jumps over the lazy dog.<newline>159. The quick brown fox jumps over the lazy dog.<newline>160. The quick brown fox jumps over the lazy dog.<newline>161. The quick brown fox jumps over the lazy dog.<newline>162. The quick brown fox jumps over the lazy dog.<newline>163. The quick brown fox jumps over the lazy dog.<newline>164. The quick brown fox jumps over the lazy dog.<newline>165. The quick brown fox jumps over the lazy dog.<newline>166. The quick brown fox jumps over the lazy dog.<newline>167. The quick brown fox jumps over the lazy dog.<newline>168. The quick brown fox jumps over the lazy dog.<newline>169. The quick brown fox jumps over the lazy dog.<newline>170. The quick brown fox jumps over the lazy dog.<newline>171. The quick brown fox jumps over the lazy dog.<newline>172. The quick brown fox jumps over the lazy dog.<newline>173. The quick brown fox jumps over the lazy dog.<newline>174. The quick brown fox jumps over the lazy dog.<newline>175. The quick brown fox jumps over the lazy dog.<newline>176. The quick brown fox jumps over the lazy dog.<newline>177. The quick brown fox jumps over the lazy dog.<newline>178. The quick brown fox jumps over the lazy dog.<newline>179. The quick brown fox jumps over the lazy dog.<newline>180. The quick brown fox jumps over the lazy dog.<newline>181. The quick brown fox jumps over the lazy dog.<newline>182. The quick brown fox jumps over the lazy dog.<newline>183. The quick brown fox jumps over the lazy dog.<newline>184. The quick brown fox jumps over the lazy dog.<newline>185. The quick brown fox jumps over the lazy dog.<newline>186. The quick brown fox jumps over the lazy dog.<newline>187. The quick brown fox jumps over the lazy dog.<newline>188. The quick brown fox jumps over the lazy dog.<newline>189. The quick brown fox jumps over the lazy dog.<newline>190. The quick brown fox jumps over the lazy dog.<newline>191. The quick brown fox jumps over the lazy dog.<newline>192. The quick brown fox jumps over the lazy dog.<newline>193. The quick brown fox jumps over the lazy dog.<newline>194. The quick brown fox jumps over the lazy dog.<newline>195. The quick brown fox jumps over the lazy dog.<newline>196. The quick brown fox jumps over the lazy dog.<newline>197. The quick brown fox jumps over the lazy dog.<newline>198. The quick brown fox jumps over the lazy dog.<newline>199. The quick brown fox jumps over the lazy dog.<newline>200. The quick brown fox jumps over the lazy dog.<newline>201. The quick brown fox jumps over the lazy dog.<newline>202. The quick brown fox jumps over the lazy dog.<newline>203. The quick brown fox jumps over the lazy dog.<newline>204. The quick brown fox jumps over the lazy dog.<newline>205. The quick brown fox jumps over the lazy dog.<newline>206. The quick brown fox jumps over the lazy dog.<newline>207. The quick brown fox jumps over the lazy dog.<newline>208. The quick brown fox jumps over the lazy dog.<newline>209. The quick brown fox jumps over the lazy dog.<newline>210. The quick brown fox jumps over the lazy dog.<newline>211. The quick brown fox jumps over the lazy dog.<newline>212. The quick brown fox jumps over the lazy dog.<newline>213. The quick brown fox jumps over the lazy dog.<newline>214. The quick brown fox jumps over the lazy dog.<newline>215. The quick brown fox jumps over the lazy dog.<newline>216. The quick brown fox jumps over the lazy dog.<newline>217. The quick brown fox jumps over the lazy dog.<newline>218. The quick brown fox jumps over the lazy dog.<newline>219. The quick brown fox jumps over the lazy dog.<newline>220. The quick brown fox jumps over the lazy dog.<newline>221. The quick brown fox jumps over the lazy dog.<newline>222. The quick brown fox jumps over the lazy dog.<newline>223. The quick brown fox jumps over the lazy dog.<newline>224. The quick brown fox jumps over the lazy dog.<newline>225. The quick brown fox jumps over the lazy dog.<newline>226. The quick brown fox jumps over the lazy dog.<newline>227. The quick brown fox jumps over the lazy dog.<newline>228. The quick brown fox jumps over the lazy dog.<newline>229. The quick brown fox jumps over the lazy dog.<newline>230. The quick brown fox jumps over the lazy dog.<newline>231. The quick brown fox jumps over the lazy dog.<newline>232. The quick brown fox jumps over the lazy dog.<newline>233. The quick brown fox jumps over the lazy dog.<newline>234. The quick brown fox jumps over the lazy dog.<newline>235. The quick brown fox jumps over the lazy dog.<newline>236. The quick brown fox jumps over the lazy dog.<newline>237. The quick brown fox jumps over the lazy dog.<newline>238. The quick brown fox jumps over the lazy dog.<newline>239. The quick brown fox jumps over the lazy dog.<newline>240. The quick brown fox jumps over the lazy dog.<newline>241. The quick brown fox jumps over the lazy dog.<newline>242. The quick brown fox jumps over the lazy dog.<newline>243. The quick brown fox jumps over the lazy dog.<newline>244. The quick brown fox jumps over the lazy dog.<newline>245. The quick brown fox jumps over the lazy dog.<newline>246. The quick brown fox jumps over the lazy dog.<newline>247. The quick brown fox jumps over the lazy dog.<newline>248. The quick brown fox jumps over the lazy dog.<newline>249. The quick brown fox jumps over the lazy dog.<newline>250. The quick brown fox jumps over the lazy dog.<newline>' -++++++inlineTextBox name='1. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='2. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='3. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='4. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='5. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='6. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='7. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='8. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='9. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='10. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='11. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='12. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='13. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='14. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='15. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='16. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='17. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='18. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='19. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='20. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='21. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='22. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='23. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='24. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='25. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='26. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='27. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='28. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='29. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='30. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='31. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='32. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='33. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='34. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='35. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='36. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='37. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='38. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='39. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='40. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='41. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='42. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='43. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='44. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='45. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='46. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='47. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='48. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='49. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='50. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='51. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='52. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='53. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='54. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='55. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='56. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='57. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='58. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='59. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='60. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='61. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='62. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='63. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='64. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='65. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='66. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='67. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='68. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='69. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='70. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='71. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='72. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='73. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='74. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='75. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='76. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='77. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='78. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='79. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='80. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='81. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='82. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='83. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='84. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='85. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='86. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='87. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='88. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='89. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='90. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='91. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='92. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='93. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='94. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='95. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='96. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='97. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='98. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='99. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='100. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='101. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='102. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='103. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='104. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='105. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='106. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='107. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='108. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='109. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='110. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='111. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='112. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='113. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='114. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='115. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='116. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='117. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='118. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='119. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='120. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='121. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='122. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='123. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='124. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='125. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='126. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='127. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='128. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='129. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='130. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='131. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='132. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='133. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='134. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='135. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='136. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='137. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='138. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='139. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='140. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='141. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='142. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='143. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='144. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='145. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='146. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='147. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='148. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='149. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='150. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='151. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='152. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='153. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='154. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='155. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='156. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='157. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='158. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='159. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='160. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='161. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='162. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='163. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='164. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='165. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='166. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='167. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='168. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='169. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='170. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='171. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='172. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='173. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='174. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='175. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='176. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='177. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='178. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='179. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='180. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='181. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='182. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='183. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='184. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='185. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='186. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='187. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='188. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='189. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='190. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='191. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='192. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='193. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='194. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='195. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='196. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='197. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='198. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='199. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='200. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='201. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='202. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='203. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='204. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='205. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='206. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='207. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='208. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='209. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='210. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='211. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='212. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='213. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='214. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='215. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='216. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='217. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='218. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='219. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='220. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='221. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='222. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='223. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='224. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='225. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='226. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='227. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='228. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='229. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='230. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='231. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='232. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='233. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='234. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='235. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='236. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='237. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='238. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='239. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='240. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='241. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='242. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='243. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='244. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='245. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='246. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='247. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='248. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='249. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='250. The quick brown fox jumps over the lazy dog.' -++++++inlineTextBox name='<newline>' +++genericContainer ignored +++++pre +++++++staticText name='1. The quick brown fox jumps over the lazy dog.<newline>2. The quick brown fox jumps over the lazy dog.<newline>3. The quick brown fox jumps over the lazy dog.<newline>4. The quick brown fox jumps over the lazy dog.<newline>5. The quick brown fox jumps over the lazy dog.<newline>6. The quick brown fox jumps over the lazy dog.<newline>7. The quick brown fox jumps over the lazy dog.<newline>8. The quick brown fox jumps over the lazy dog.<newline>9. The quick brown fox jumps over the lazy dog.<newline>10. The quick brown fox jumps over the lazy dog.<newline>11. The quick brown fox jumps over the lazy dog.<newline>12. The quick brown fox jumps over the lazy dog.<newline>13. The quick brown fox jumps over the lazy dog.<newline>14. The quick brown fox jumps over the lazy dog.<newline>15. The quick brown fox jumps over the lazy dog.<newline>16. The quick brown fox jumps over the lazy dog.<newline>17. The quick brown fox jumps over the lazy dog.<newline>18. The quick brown fox jumps over the lazy dog.<newline>19. The quick brown fox jumps over the lazy dog.<newline>20. The quick brown fox jumps over the lazy dog.<newline>21. The quick brown fox jumps over the lazy dog.<newline>22. The quick brown fox jumps over the lazy dog.<newline>23. The quick brown fox jumps over the lazy dog.<newline>24. The quick brown fox jumps over the lazy dog.<newline>25. The quick brown fox jumps over the lazy dog.<newline>26. The quick brown fox jumps over the lazy dog.<newline>27. The quick brown fox jumps over the lazy dog.<newline>28. The quick brown fox jumps over the lazy dog.<newline>29. The quick brown fox jumps over the lazy dog.<newline>30. The quick brown fox jumps over the lazy dog.<newline>31. The quick brown fox jumps over the lazy dog.<newline>32. The quick brown fox jumps over the lazy dog.<newline>33. The quick brown fox jumps over the lazy dog.<newline>34. The quick brown fox jumps over the lazy dog.<newline>35. The quick brown fox jumps over the lazy dog.<newline>36. The quick brown fox jumps over the lazy dog.<newline>37. The quick brown fox jumps over the lazy dog.<newline>38. The quick brown fox jumps over the lazy dog.<newline>39. The quick brown fox jumps over the lazy dog.<newline>40. The quick brown fox jumps over the lazy dog.<newline>41. The quick brown fox jumps over the lazy dog.<newline>42. The quick brown fox jumps over the lazy dog.<newline>43. The quick brown fox jumps over the lazy dog.<newline>44. The quick brown fox jumps over the lazy dog.<newline>45. The quick brown fox jumps over the lazy dog.<newline>46. The quick brown fox jumps over the lazy dog.<newline>47. The quick brown fox jumps over the lazy dog.<newline>48. The quick brown fox jumps over the lazy dog.<newline>49. The quick brown fox jumps over the lazy dog.<newline>50. The quick brown fox jumps over the lazy dog.<newline>51. The quick brown fox jumps over the lazy dog.<newline>52. The quick brown fox jumps over the lazy dog.<newline>53. The quick brown fox jumps over the lazy dog.<newline>54. The quick brown fox jumps over the lazy dog.<newline>55. The quick brown fox jumps over the lazy dog.<newline>56. The quick brown fox jumps over the lazy dog.<newline>57. The quick brown fox jumps over the lazy dog.<newline>58. The quick brown fox jumps over the lazy dog.<newline>59. The quick brown fox jumps over the lazy dog.<newline>60. The quick brown fox jumps over the lazy dog.<newline>61. The quick brown fox jumps over the lazy dog.<newline>62. The quick brown fox jumps over the lazy dog.<newline>63. The quick brown fox jumps over the lazy dog.<newline>64. The quick brown fox jumps over the lazy dog.<newline>65. The quick brown fox jumps over the lazy dog.<newline>66. The quick brown fox jumps over the lazy dog.<newline>67. The quick brown fox jumps over the lazy dog.<newline>68. The quick brown fox jumps over the lazy dog.<newline>69. The quick brown fox jumps over the lazy dog.<newline>70. The quick brown fox jumps over the lazy dog.<newline>71. The quick brown fox jumps over the lazy dog.<newline>72. The quick brown fox jumps over the lazy dog.<newline>73. The quick brown fox jumps over the lazy dog.<newline>74. The quick brown fox jumps over the lazy dog.<newline>75. The quick brown fox jumps over the lazy dog.<newline>76. The quick brown fox jumps over the lazy dog.<newline>77. The quick brown fox jumps over the lazy dog.<newline>78. The quick brown fox jumps over the lazy dog.<newline>79. The quick brown fox jumps over the lazy dog.<newline>80. The quick brown fox jumps over the lazy dog.<newline>81. The quick brown fox jumps over the lazy dog.<newline>82. The quick brown fox jumps over the lazy dog.<newline>83. The quick brown fox jumps over the lazy dog.<newline>84. The quick brown fox jumps over the lazy dog.<newline>85. The quick brown fox jumps over the lazy dog.<newline>86. The quick brown fox jumps over the lazy dog.<newline>87. The quick brown fox jumps over the lazy dog.<newline>88. The quick brown fox jumps over the lazy dog.<newline>89. The quick brown fox jumps over the lazy dog.<newline>90. The quick brown fox jumps over the lazy dog.<newline>91. The quick brown fox jumps over the lazy dog.<newline>92. The quick brown fox jumps over the lazy dog.<newline>93. The quick brown fox jumps over the lazy dog.<newline>94. The quick brown fox jumps over the lazy dog.<newline>95. The quick brown fox jumps over the lazy dog.<newline>96. The quick brown fox jumps over the lazy dog.<newline>97. The quick brown fox jumps over the lazy dog.<newline>98. The quick brown fox jumps over the lazy dog.<newline>99. The quick brown fox jumps over the lazy dog.<newline>100. The quick brown fox jumps over the lazy dog.<newline>101. The quick brown fox jumps over the lazy dog.<newline>102. The quick brown fox jumps over the lazy dog.<newline>103. The quick brown fox jumps over the lazy dog.<newline>104. The quick brown fox jumps over the lazy dog.<newline>105. The quick brown fox jumps over the lazy dog.<newline>106. The quick brown fox jumps over the lazy dog.<newline>107. The quick brown fox jumps over the lazy dog.<newline>108. The quick brown fox jumps over the lazy dog.<newline>109. The quick brown fox jumps over the lazy dog.<newline>110. The quick brown fox jumps over the lazy dog.<newline>111. The quick brown fox jumps over the lazy dog.<newline>112. The quick brown fox jumps over the lazy dog.<newline>113. The quick brown fox jumps over the lazy dog.<newline>114. The quick brown fox jumps over the lazy dog.<newline>115. The quick brown fox jumps over the lazy dog.<newline>116. The quick brown fox jumps over the lazy dog.<newline>117. The quick brown fox jumps over the lazy dog.<newline>118. The quick brown fox jumps over the lazy dog.<newline>119. The quick brown fox jumps over the lazy dog.<newline>120. The quick brown fox jumps over the lazy dog.<newline>121. The quick brown fox jumps over the lazy dog.<newline>122. The quick brown fox jumps over the lazy dog.<newline>123. The quick brown fox jumps over the lazy dog.<newline>124. The quick brown fox jumps over the lazy dog.<newline>125. The quick brown fox jumps over the lazy dog.<newline>126. The quick brown fox jumps over the lazy dog.<newline>127. The quick brown fox jumps over the lazy dog.<newline>128. The quick brown fox jumps over the lazy dog.<newline>129. The quick brown fox jumps over the lazy dog.<newline>130. The quick brown fox jumps over the lazy dog.<newline>131. The quick brown fox jumps over the lazy dog.<newline>132. The quick brown fox jumps over the lazy dog.<newline>133. The quick brown fox jumps over the lazy dog.<newline>134. The quick brown fox jumps over the lazy dog.<newline>135. The quick brown fox jumps over the lazy dog.<newline>136. The quick brown fox jumps over the lazy dog.<newline>137. The quick brown fox jumps over the lazy dog.<newline>138. The quick brown fox jumps over the lazy dog.<newline>139. The quick brown fox jumps over the lazy dog.<newline>140. The quick brown fox jumps over the lazy dog.<newline>141. The quick brown fox jumps over the lazy dog.<newline>142. The quick brown fox jumps over the lazy dog.<newline>143. The quick brown fox jumps over the lazy dog.<newline>144. The quick brown fox jumps over the lazy dog.<newline>145. The quick brown fox jumps over the lazy dog.<newline>146. The quick brown fox jumps over the lazy dog.<newline>147. The quick brown fox jumps over the lazy dog.<newline>148. The quick brown fox jumps over the lazy dog.<newline>149. The quick brown fox jumps over the lazy dog.<newline>150. The quick brown fox jumps over the lazy dog.<newline>151. The quick brown fox jumps over the lazy dog.<newline>152. The quick brown fox jumps over the lazy dog.<newline>153. The quick brown fox jumps over the lazy dog.<newline>154. The quick brown fox jumps over the lazy dog.<newline>155. The quick brown fox jumps over the lazy dog.<newline>156. The quick brown fox jumps over the lazy dog.<newline>157. The quick brown fox jumps over the lazy dog.<newline>158. The quick brown fox jumps over the lazy dog.<newline>159. The quick brown fox jumps over the lazy dog.<newline>160. The quick brown fox jumps over the lazy dog.<newline>161. The quick brown fox jumps over the lazy dog.<newline>162. The quick brown fox jumps over the lazy dog.<newline>163. The quick brown fox jumps over the lazy dog.<newline>164. The quick brown fox jumps over the lazy dog.<newline>165. The quick brown fox jumps over the lazy dog.<newline>166. The quick brown fox jumps over the lazy dog.<newline>167. The quick brown fox jumps over the lazy dog.<newline>168. The quick brown fox jumps over the lazy dog.<newline>169. The quick brown fox jumps over the lazy dog.<newline>170. The quick brown fox jumps over the lazy dog.<newline>171. The quick brown fox jumps over the lazy dog.<newline>172. The quick brown fox jumps over the lazy dog.<newline>173. The quick brown fox jumps over the lazy dog.<newline>174. The quick brown fox jumps over the lazy dog.<newline>175. The quick brown fox jumps over the lazy dog.<newline>176. The quick brown fox jumps over the lazy dog.<newline>177. The quick brown fox jumps over the lazy dog.<newline>178. The quick brown fox jumps over the lazy dog.<newline>179. The quick brown fox jumps over the lazy dog.<newline>180. The quick brown fox jumps over the lazy dog.<newline>181. The quick brown fox jumps over the lazy dog.<newline>182. The quick brown fox jumps over the lazy dog.<newline>183. The quick brown fox jumps over the lazy dog.<newline>184. The quick brown fox jumps over the lazy dog.<newline>185. The quick brown fox jumps over the lazy dog.<newline>186. The quick brown fox jumps over the lazy dog.<newline>187. The quick brown fox jumps over the lazy dog.<newline>188. The quick brown fox jumps over the lazy dog.<newline>189. The quick brown fox jumps over the lazy dog.<newline>190. The quick brown fox jumps over the lazy dog.<newline>191. The quick brown fox jumps over the lazy dog.<newline>192. The quick brown fox jumps over the lazy dog.<newline>193. The quick brown fox jumps over the lazy dog.<newline>194. The quick brown fox jumps over the lazy dog.<newline>195. The quick brown fox jumps over the lazy dog.<newline>196. The quick brown fox jumps over the lazy dog.<newline>197. The quick brown fox jumps over the lazy dog.<newline>198. The quick brown fox jumps over the lazy dog.<newline>199. The quick brown fox jumps over the lazy dog.<newline>200. The quick brown fox jumps over the lazy dog.<newline>201. The quick brown fox jumps over the lazy dog.<newline>202. The quick brown fox jumps over the lazy dog.<newline>203. The quick brown fox jumps over the lazy dog.<newline>204. The quick brown fox jumps over the lazy dog.<newline>205. The quick brown fox jumps over the lazy dog.<newline>206. The quick brown fox jumps over the lazy dog.<newline>207. The quick brown fox jumps over the lazy dog.<newline>208. The quick brown fox jumps over the lazy dog.<newline>209. The quick brown fox jumps over the lazy dog.<newline>210. The quick brown fox jumps over the lazy dog.<newline>211. The quick brown fox jumps over the lazy dog.<newline>212. The quick brown fox jumps over the lazy dog.<newline>213. The quick brown fox jumps over the lazy dog.<newline>214. The quick brown fox jumps over the lazy dog.<newline>215. The quick brown fox jumps over the lazy dog.<newline>216. The quick brown fox jumps over the lazy dog.<newline>217. The quick brown fox jumps over the lazy dog.<newline>218. The quick brown fox jumps over the lazy dog.<newline>219. The quick brown fox jumps over the lazy dog.<newline>220. The quick brown fox jumps over the lazy dog.<newline>221. The quick brown fox jumps over the lazy dog.<newline>222. The quick brown fox jumps over the lazy dog.<newline>223. The quick brown fox jumps over the lazy dog.<newline>224. The quick brown fox jumps over the lazy dog.<newline>225. The quick brown fox jumps over the lazy dog.<newline>226. The quick brown fox jumps over the lazy dog.<newline>227. The quick brown fox jumps over the lazy dog.<newline>228. The quick brown fox jumps over the lazy dog.<newline>229. The quick brown fox jumps over the lazy dog.<newline>230. The quick brown fox jumps over the lazy dog.<newline>231. The quick brown fox jumps over the lazy dog.<newline>232. The quick brown fox jumps over the lazy dog.<newline>233. The quick brown fox jumps over the lazy dog.<newline>234. The quick brown fox jumps over the lazy dog.<newline>235. The quick brown fox jumps over the lazy dog.<newline>236. The quick brown fox jumps over the lazy dog.<newline>237. The quick brown fox jumps over the lazy dog.<newline>238. The quick brown fox jumps over the lazy dog.<newline>239. The quick brown fox jumps over the lazy dog.<newline>240. The quick brown fox jumps over the lazy dog.<newline>241. The quick brown fox jumps over the lazy dog.<newline>242. The quick brown fox jumps over the lazy dog.<newline>243. The quick brown fox jumps over the lazy dog.<newline>244. The quick brown fox jumps over the lazy dog.<newline>245. The quick brown fox jumps over the lazy dog.<newline>246. The quick brown fox jumps over the lazy dog.<newline>247. The quick brown fox jumps over the lazy dog.<newline>248. The quick brown fox jumps over the lazy dog.<newline>249. The quick brown fox jumps over the lazy dog.<newline>250. The quick brown fox jumps over the lazy dog.<newline>' +++++++++inlineTextBox name='1. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='2. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='3. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='4. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='5. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='6. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='7. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='8. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='9. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='10. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='11. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='12. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='13. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='14. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='15. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='16. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='17. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='18. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='19. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='20. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='21. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='22. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='23. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='24. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='25. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='26. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='27. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='28. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='29. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='30. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='31. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='32. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='33. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='34. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='35. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='36. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='37. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='38. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='39. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='40. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='41. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='42. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='43. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='44. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='45. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='46. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='47. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='48. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='49. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='50. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='51. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='52. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='53. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='54. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='55. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='56. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='57. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='58. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='59. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='60. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='61. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='62. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='63. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='64. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='65. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='66. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='67. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='68. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='69. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='70. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='71. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='72. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='73. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='74. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='75. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='76. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='77. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='78. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='79. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='80. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='81. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='82. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='83. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='84. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='85. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='86. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='87. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='88. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='89. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='90. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='91. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='92. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='93. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='94. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='95. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='96. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='97. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='98. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='99. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='100. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='101. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='102. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='103. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='104. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='105. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='106. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='107. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='108. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='109. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='110. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='111. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='112. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='113. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='114. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='115. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='116. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='117. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='118. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='119. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='120. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='121. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='122. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='123. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='124. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='125. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='126. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='127. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='128. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='129. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='130. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='131. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='132. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='133. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='134. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='135. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='136. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='137. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='138. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='139. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='140. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='141. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='142. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='143. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='144. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='145. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='146. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='147. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='148. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='149. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='150. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='151. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='152. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='153. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='154. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='155. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='156. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='157. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='158. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='159. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='160. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='161. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='162. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='163. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='164. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='165. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='166. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='167. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='168. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='169. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='170. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='171. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='172. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='173. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='174. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='175. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='176. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='177. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='178. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='179. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='180. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='181. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='182. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='183. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='184. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='185. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='186. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='187. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='188. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='189. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='190. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='191. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='192. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='193. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='194. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='195. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='196. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='197. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='198. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='199. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='200. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='201. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='202. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='203. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='204. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='205. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='206. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='207. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='208. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='209. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='210. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='211. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='212. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='213. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='214. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='215. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='216. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='217. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='218. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='219. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='220. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='221. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='222. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='223. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='224. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='225. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='226. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='227. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='228. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='229. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='230. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='231. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='232. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='233. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='234. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='235. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='236. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='237. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='238. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='239. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='240. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='241. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='242. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='243. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='244. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='245. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='246. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='247. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='248. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='249. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='250. The quick brown fox jumps over the lazy dog.' +++++++++inlineTextBox name='<newline>'
diff --git a/content/test/data/accessibility/html/main-expected-blink.txt b/content/test/data/accessibility/html/main-expected-blink.txt index 4273ede0..03b6726 100644 --- a/content/test/data/accessibility/html/main-expected-blink.txt +++ b/content/test/data/accessibility/html/main-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++main -++++staticText name='This is main element.' -++++++inlineTextBox name='This is main element.' -++main -++++staticText name='This is an ARIA role main.' -++++++inlineTextBox name='This is an ARIA role main.' \ No newline at end of file +++genericContainer ignored +++++main +++++++staticText name='This is main element.' +++++++++inlineTextBox name='This is main element.' +++++main +++++++staticText name='This is an ARIA role main.' +++++++++inlineTextBox name='This is an ARIA role main.'
diff --git a/content/test/data/accessibility/html/mark-expected-blink.txt b/content/test/data/accessibility/html/mark-expected-blink.txt index 021a790..91b5800 100644 --- a/content/test/data/accessibility/html/mark-expected-blink.txt +++ b/content/test/data/accessibility/html/mark-expected-blink.txt
@@ -1,9 +1,10 @@ rootWebArea -++paragraph -++++staticText name='This test is to check ' -++++++inlineTextBox name='This test is to check ' -++++mark -++++++staticText name='mark tag' -++++++++inlineTextBox name='mark tag' -++++staticText name='.' -++++++inlineTextBox name='.' \ No newline at end of file +++genericContainer ignored +++++paragraph +++++++staticText name='This test is to check ' +++++++++inlineTextBox name='This test is to check ' +++++++mark +++++++++staticText name='mark tag' +++++++++++inlineTextBox name='mark tag' +++++++staticText name='.' +++++++++inlineTextBox name='.'
diff --git a/content/test/data/accessibility/html/menu-type-context-expected-blink.txt b/content/test/data/accessibility/html/menu-type-context-expected-blink.txt index 66f6c19d..d195eb646 100644 --- a/content/test/data/accessibility/html/menu-type-context-expected-blink.txt +++ b/content/test/data/accessibility/html/menu-type-context-expected-blink.txt
@@ -1,6 +1,9 @@ rootWebArea -++paragraph -++++staticText name='Right-click inside this box to see the context menu!' -++++++inlineTextBox name='Right-click inside this box to see the context menu!' -++genericContainer -++genericContainer +++genericContainer ignored +++++genericContainer ignored +++++++paragraph +++++++++staticText name='Right-click inside this box to see the context menu!' +++++++++++inlineTextBox name='Right-click inside this box to see the context menu!' +++++++genericContainer ignored +++++++++genericContainer +++++++++genericContainer
diff --git a/content/test/data/accessibility/html/modal-dialog-closed-expected-blink.txt b/content/test/data/accessibility/html/modal-dialog-closed-expected-blink.txt index dade5df3..1e0b560 100644 --- a/content/test/data/accessibility/html/modal-dialog-closed-expected-blink.txt +++ b/content/test/data/accessibility/html/modal-dialog-closed-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++staticText name='Test that elements respawn in the accessibility tree after a modal dialog closes.' -++++inlineTextBox name='Test that elements respawn in the accessibility tree after a modal dialog closes.' -++region -++++popUpButton collapsed value='This should be in the tree.' haspopup=menu -++++++menuListPopup invisible -++++++++menuListOption name='This should be in the tree.' selected=true -++colorWell value='#000000' +++genericContainer ignored +++++staticText name='Test that elements respawn in the accessibility tree after a modal dialog closes.' +++++++inlineTextBox name='Test that elements respawn in the accessibility tree after a modal dialog closes.' +++++region +++++++popUpButton collapsed value='This should be in the tree.' haspopup=menu +++++++++menuListPopup invisible +++++++++++menuListOption name='This should be in the tree.' selected=true +++++colorWell value='#000000'
diff --git a/content/test/data/accessibility/html/modal-dialog-opened-expected-blink.txt b/content/test/data/accessibility/html/modal-dialog-opened-expected-blink.txt index 1cf7805..49be1ce 100644 --- a/content/test/data/accessibility/html/modal-dialog-opened-expected-blink.txt +++ b/content/test/data/accessibility/html/modal-dialog-opened-expected-blink.txt
@@ -1,8 +1,14 @@ rootWebArea -++dialog -++++staticText name='The dialog subtree should be the only text content in the accessibility tree. ' -++++++inlineTextBox name='The dialog subtree should be the only text content in the accessibility tree. ' -++++link name='Link inside the dialog.' -++++++staticText name='Link inside the dialog.' -++++++++inlineTextBox name='Link inside the dialog.' +++genericContainer ignored invisible +++++region ignored invisible +++++++dialog +++++++++staticText name='The dialog subtree should be the only text content in the accessibility tree. ' +++++++++++inlineTextBox name='The dialog subtree should be the only text content in the accessibility tree. ' +++++++++link name='Link inside the dialog.' +++++++++++staticText name='Link inside the dialog.' +++++++++++++inlineTextBox name='Link inside the dialog.' +++++++popUpButton collapsed ignored invisible value='This should be pruned out of the tree.' +++++button ignored invisible name='Choose File' value='No file chosen' +++genericContainer ignored invisible +++dialog ignored invisible ++genericContainer
diff --git a/content/test/data/accessibility/html/modal-dialog-stack-expected-android.txt b/content/test/data/accessibility/html/modal-dialog-stack-expected-android.txt index aaa0943..75cb37a 100644 --- a/content/test/data/accessibility/html/modal-dialog-stack-expected-android.txt +++ b/content/test/data/accessibility/html/modal-dialog-stack-expected-android.txt
@@ -1,5 +1,5 @@ android.webkit.WebView focusable focused scrollable +++android.view.View ++android.app.Dialog role_description='dialog' ++++android.view.View name='This is the now active dialog. Of course it should be in the tree. ' ++++android.widget.Button role_description='button' clickable focusable name='This is in the active dialog and should be in the tree.' -++android.view.View
diff --git a/content/test/data/accessibility/html/modal-dialog-stack-expected-auralinux.txt b/content/test/data/accessibility/html/modal-dialog-stack-expected-auralinux.txt index c072723..7a0a189 100644 --- a/content/test/data/accessibility/html/modal-dialog-stack-expected-auralinux.txt +++ b/content/test/data/accessibility/html/modal-dialog-stack-expected-auralinux.txt
@@ -1,5 +1,5 @@ [document web] +++[section] ++[dialog] modal ++++[text] name='This is the now active dialog. Of course it should be in the tree. ' ++++[push button] name='This is in the active dialog and should be in the tree.' -++[section]
diff --git a/content/test/data/accessibility/html/modal-dialog-stack-expected-blink.txt b/content/test/data/accessibility/html/modal-dialog-stack-expected-blink.txt index 98dcc461..00f638e14 100644 --- a/content/test/data/accessibility/html/modal-dialog-stack-expected-blink.txt +++ b/content/test/data/accessibility/html/modal-dialog-stack-expected-blink.txt
@@ -1,6 +1,12 @@ rootWebArea +++genericContainer ignored invisible +++++region ignored invisible +++++++popUpButton collapsed ignored invisible value='This should be pruned out of the tree.' +++++button ignored invisible name='This button should not be in the tree.' +++genericContainer ignored invisible +++dialog ignored invisible +++genericContainer ++dialog ++++staticText name='This is the now active dialog. Of course it should be in the tree. ' ++++++inlineTextBox name='This is the now active dialog. Of course it should be in the tree. ' ++++button name='This is in the active dialog and should be in the tree.' -++genericContainer
diff --git a/content/test/data/accessibility/html/modal-dialog-stack-expected-mac.txt b/content/test/data/accessibility/html/modal-dialog-stack-expected-mac.txt index 1561a8b7..fd373b1 100644 --- a/content/test/data/accessibility/html/modal-dialog-stack-expected-mac.txt +++ b/content/test/data/accessibility/html/modal-dialog-stack-expected-mac.txt
@@ -1,5 +1,5 @@ AXWebArea +++AXGroup ++AXGroup AXSubrole=AXApplicationDialog ++++AXStaticText AXValue='This is the now active dialog. Of course it should be in the tree. ' ++++AXButton AXTitle='This is in the active dialog and should be in the tree.' -++AXGroup
diff --git a/content/test/data/accessibility/html/modal-dialog-stack-expected-uia-win.txt b/content/test/data/accessibility/html/modal-dialog-stack-expected-uia-win.txt index f0d02b6..a5a6537 100644 --- a/content/test/data/accessibility/html/modal-dialog-stack-expected-uia-win.txt +++ b/content/test/data/accessibility/html/modal-dialog-stack-expected-uia-win.txt
@@ -1,6 +1,6 @@ region ++document +++++group ++++dialog Window.IsModal=true ++++++description Name='This is the now active dialog. Of course it should be in the tree. ' ++++++button Name='This is in the active dialog and should be in the tree.' -++++group
diff --git a/content/test/data/accessibility/html/modal-dialog-stack-expected-win.txt b/content/test/data/accessibility/html/modal-dialog-stack-expected-win.txt index 0160c77e..df25937bd 100644 --- a/content/test/data/accessibility/html/modal-dialog-stack-expected-win.txt +++ b/content/test/data/accessibility/html/modal-dialog-stack-expected-win.txt
@@ -1,5 +1,5 @@ ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE +++IA2_ROLE_SECTION ++ROLE_SYSTEM_DIALOG IA2_STATE_MODAL ++++ROLE_SYSTEM_STATICTEXT name='This is the now active dialog. Of course it should be in the tree. ' ++++ROLE_SYSTEM_PUSHBUTTON name='This is in the active dialog and should be in the tree.' FOCUSABLE -++IA2_ROLE_SECTION
diff --git a/content/test/data/accessibility/html/navigation-expected-blink.txt b/content/test/data/accessibility/html/navigation-expected-blink.txt index e584f09..3db3511 100644 --- a/content/test/data/accessibility/html/navigation-expected-blink.txt +++ b/content/test/data/accessibility/html/navigation-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++navigation -++++link name='Don't click on me' -++++++staticText name='Don't click on me' -++++++++inlineTextBox name='Don't click on me' \ No newline at end of file +++genericContainer ignored +++++navigation +++++++link name='Don't click on me' +++++++++staticText name='Don't click on me' +++++++++++inlineTextBox name='Don't click on me'
diff --git a/content/test/data/accessibility/html/offscreen-expected-blink.txt b/content/test/data/accessibility/html/offscreen-expected-blink.txt index a372eb4..06b291d 100644 --- a/content/test/data/accessibility/html/offscreen-expected-blink.txt +++ b/content/test/data/accessibility/html/offscreen-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++button name='Onscreen' -++button offscreen name='Offscreen' -<-- End-of-file --> +++genericContainer ignored +++++button name='Onscreen' +++++genericContainer ignored +++++button offscreen name='Offscreen'
diff --git a/content/test/data/accessibility/html/offscreen-iframe-expected-blink.txt b/content/test/data/accessibility/html/offscreen-iframe-expected-blink.txt index f330e06..c568133 100644 --- a/content/test/data/accessibility/html/offscreen-iframe-expected-blink.txt +++ b/content/test/data/accessibility/html/offscreen-iframe-expected-blink.txt
@@ -2,5 +2,6 @@ ++genericContainer ++++iframe ++++++rootWebArea -++++++++genericContainer name='iframe_onscreen' -++++++++genericContainer offscreen name='iframe_offscreen' +++++++++genericContainer ignored +++++++++++genericContainer name='iframe_onscreen' +++++++++++genericContainer offscreen name='iframe_offscreen'
diff --git a/content/test/data/accessibility/html/offscreen-scroll-expected-blink.txt b/content/test/data/accessibility/html/offscreen-scroll-expected-blink.txt index e66194b..b36bcb3 100644 --- a/content/test/data/accessibility/html/offscreen-scroll-expected-blink.txt +++ b/content/test/data/accessibility/html/offscreen-scroll-expected-blink.txt
@@ -1,4 +1,6 @@ rootWebArea scrollY=640 -++button offscreen name='Onscreen before scroll' -++button name='Scrolled Button' -<-- End-of-file --> +++genericContainer ignored +++++button offscreen name='Onscreen before scroll' +++++genericContainer ignored +++++button name='Scrolled Button' +++++genericContainer ignored
diff --git a/content/test/data/accessibility/html/offscreen-select-expected-blink.txt b/content/test/data/accessibility/html/offscreen-select-expected-blink.txt index 2bf6dd51..cb2bc74f 100644 --- a/content/test/data/accessibility/html/offscreen-select-expected-blink.txt +++ b/content/test/data/accessibility/html/offscreen-select-expected-blink.txt
@@ -1,11 +1,13 @@ rootWebArea -++popUpButton collapsed value='Onscreen 1' -++++menuListPopup invisible -++++++menuListOption name='Onscreen 1' selected=true -++++++menuListOption invisible name='Onscreen 2' selected=false -++++++menuListOption invisible name='Onscreen 3' selected=false -++popUpButton collapsed offscreen value='Offscreen 1' -++++menuListPopup invisible -++++++menuListOption offscreen name='Offscreen 1' selected=true -++++++menuListOption invisible offscreen name='Offscreen 2' selected=false -++++++menuListOption invisible offscreen name='Offscreen 3' selected=false +++genericContainer ignored +++++popUpButton collapsed value='Onscreen 1' +++++++menuListPopup invisible +++++++++menuListOption name='Onscreen 1' selected=true +++++++++menuListOption invisible name='Onscreen 2' selected=false +++++++++menuListOption invisible name='Onscreen 3' selected=false +++++genericContainer ignored +++++popUpButton collapsed offscreen value='Offscreen 1' +++++++menuListPopup invisible +++++++++menuListOption offscreen name='Offscreen 1' selected=true +++++++++menuListOption invisible offscreen name='Offscreen 2' selected=false +++++++++menuListOption invisible offscreen name='Offscreen 3' selected=false
diff --git a/content/test/data/accessibility/html/ol-expected-blink.txt b/content/test/data/accessibility/html/ol-expected-blink.txt index 424fb06..760cea1 100644 --- a/content/test/data/accessibility/html/ol-expected-blink.txt +++ b/content/test/data/accessibility/html/ol-expected-blink.txt
@@ -1,27 +1,28 @@ rootWebArea -++list -++++listItem -++++++listMarker name='1. ' -++++++staticText name='Chrome' -++++++++inlineTextBox name='Chrome' -++++listItem -++++++listMarker name='2. ' -++++++staticText name='Safari' -++++++++inlineTextBox name='Safari' -++++listItem -++++++listMarker name='3. ' -++++++staticText name='IE' -++++++++inlineTextBox name='IE' -++list -++++listItem -++++++listMarker name='10. ' -++++++staticText name='Android' -++++++++inlineTextBox name='Android' -++++listItem -++++++listMarker name='11. ' -++++++staticText name='Mac' -++++++++inlineTextBox name='Mac' -++++listItem -++++++listMarker name='12. ' -++++++staticText name='Windows' -++++++++inlineTextBox name='Windows' +++genericContainer ignored +++++list +++++++listItem +++++++++listMarker name='1. ' +++++++++staticText name='Chrome' +++++++++++inlineTextBox name='Chrome' +++++++listItem +++++++++listMarker name='2. ' +++++++++staticText name='Safari' +++++++++++inlineTextBox name='Safari' +++++++listItem +++++++++listMarker name='3. ' +++++++++staticText name='IE' +++++++++++inlineTextBox name='IE' +++++list +++++++listItem +++++++++listMarker name='10. ' +++++++++staticText name='Android' +++++++++++inlineTextBox name='Android' +++++++listItem +++++++++listMarker name='11. ' +++++++++staticText name='Mac' +++++++++++inlineTextBox name='Mac' +++++++listItem +++++++++listMarker name='12. ' +++++++++staticText name='Windows' +++++++++++inlineTextBox name='Windows'
diff --git a/content/test/data/accessibility/html/optgroup-expected-blink.txt b/content/test/data/accessibility/html/optgroup-expected-blink.txt index 7769636..b705b94 100644 --- a/content/test/data/accessibility/html/optgroup-expected-blink.txt +++ b/content/test/data/accessibility/html/optgroup-expected-blink.txt
@@ -1,17 +1,19 @@ rootWebArea ++genericContainer ++++listBox setSize=8 -++++++group name='Enabled' setSize=0 -++++++++staticText name='Enabled' -++++++++++inlineTextBox name='Enabled' -++++++listBoxOption name='One' setSize=8 posInSet=1 selected=false -++++++listBoxOption name='Two' setSize=8 posInSet=2 selected=false -++++++listBoxOption name='Three' setSize=8 posInSet=3 selected=false -++++++listBoxOption name='Four' setSize=8 posInSet=4 selected=false -++++++group name='Disabled' setSize=0 -++++++++staticText name='Disabled' -++++++++++inlineTextBox name='Disabled' -++++++listBoxOption name='One' restriction=disabled setSize=8 posInSet=5 -++++++listBoxOption name='Two' restriction=disabled setSize=8 posInSet=6 -++++++listBoxOption name='Three' restriction=disabled setSize=8 posInSet=7 -++++++listBoxOption name='Four' restriction=disabled setSize=8 posInSet=8 +++++++genericContainer ignored +++++++++group name='Enabled' setSize=0 +++++++++++staticText name='Enabled' +++++++++++++inlineTextBox name='Enabled' +++++++++listBoxOption name='One' setSize=8 posInSet=1 selected=false +++++++++listBoxOption name='Two' setSize=8 posInSet=2 selected=false +++++++++listBoxOption name='Three' setSize=8 posInSet=3 selected=false +++++++++listBoxOption name='Four' setSize=8 posInSet=4 selected=false +++++++genericContainer ignored +++++++++group name='Disabled' setSize=0 +++++++++++staticText name='Disabled' +++++++++++++inlineTextBox name='Disabled' +++++++++listBoxOption name='One' restriction=disabled setSize=8 posInSet=5 +++++++++listBoxOption name='Two' restriction=disabled setSize=8 posInSet=6 +++++++++listBoxOption name='Three' restriction=disabled setSize=8 posInSet=7 +++++++++listBoxOption name='Four' restriction=disabled setSize=8 posInSet=8
diff --git a/content/test/data/accessibility/html/p-expected-blink.txt b/content/test/data/accessibility/html/p-expected-blink.txt index c53218d7..87fb3dd 100644 --- a/content/test/data/accessibility/html/p-expected-blink.txt +++ b/content/test/data/accessibility/html/p-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++staticText name='Before' -++++inlineTextBox name='Before' wordStarts=0 wordEnds=6 -++paragraph -++++staticText name='Paragraph' -++++++inlineTextBox name='Paragraph' wordStarts=0 wordEnds=9 -++staticText name='After' -++++inlineTextBox name='After' wordStarts=0 wordEnds=5 \ No newline at end of file +++genericContainer ignored +++++staticText name='Before' +++++++inlineTextBox name='Before' wordStarts=0 wordEnds=6 +++++paragraph +++++++staticText name='Paragraph' +++++++++inlineTextBox name='Paragraph' wordStarts=0 wordEnds=9 +++++staticText name='After' +++++++inlineTextBox name='After' wordStarts=0 wordEnds=5
diff --git a/content/test/data/accessibility/html/pre-expected-blink.txt b/content/test/data/accessibility/html/pre-expected-blink.txt index 685e497..ade0523 100644 --- a/content/test/data/accessibility/html/pre-expected-blink.txt +++ b/content/test/data/accessibility/html/pre-expected-blink.txt
@@ -1,19 +1,20 @@ rootWebArea -++pre -++++staticText name='This test is to check pre<newline>formatting.' -++++++inlineTextBox name='This test is to check pre' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='formatting.' -++genericContainer -++++staticText name='This test is to check pre<newline>formatting' -++++++inlineTextBox name='This test is to check pre' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='formatting' -++genericContainer -++++staticText name='This test is to check pre<newline>formatting.' -++++++inlineTextBox name='This test is to check pre' -++++++inlineTextBox name='<newline>' -++++++inlineTextBox name='formatting.' -++genericContainer -++++staticText name='This test is to check pre formatting.' -++++++inlineTextBox name='This test is to check pre formatting.' \ No newline at end of file +++genericContainer ignored +++++pre +++++++staticText name='This test is to check pre<newline>formatting.' +++++++++inlineTextBox name='This test is to check pre' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='formatting.' +++++genericContainer +++++++staticText name='This test is to check pre<newline>formatting' +++++++++inlineTextBox name='This test is to check pre' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='formatting' +++++genericContainer +++++++staticText name='This test is to check pre<newline>formatting.' +++++++++inlineTextBox name='This test is to check pre' +++++++++inlineTextBox name='<newline>' +++++++++inlineTextBox name='formatting.' +++++genericContainer +++++++staticText name='This test is to check pre formatting.' +++++++++inlineTextBox name='This test is to check pre formatting.'
diff --git a/content/test/data/accessibility/html/q-expected-blink.txt b/content/test/data/accessibility/html/q-expected-blink.txt index f584aee..62b1c0a 100644 --- a/content/test/data/accessibility/html/q-expected-blink.txt +++ b/content/test/data/accessibility/html/q-expected-blink.txt
@@ -1,12 +1,13 @@ rootWebArea -++paragraph -++++staticText name='This is ' -++++++inlineTextBox name='This is ' -++++staticText name='"' -++++++inlineTextBox name='"' -++++staticText name='Chromium Blink' -++++++inlineTextBox name='Chromium Blink' -++++staticText name='"' -++++++inlineTextBox name='"' -++++staticText name=' based browser.' -++++++inlineTextBox name=' based browser.' \ No newline at end of file +++genericContainer ignored +++++paragraph +++++++staticText name='This is ' +++++++++inlineTextBox name='This is ' +++++++staticText name='"' +++++++++inlineTextBox name='"' +++++++staticText name='Chromium Blink' +++++++++inlineTextBox name='Chromium Blink' +++++++staticText name='"' +++++++++inlineTextBox name='"' +++++++staticText name=' based browser.' +++++++++inlineTextBox name=' based browser.'
diff --git a/content/test/data/accessibility/html/reparent-crash-expected-blink.txt b/content/test/data/accessibility/html/reparent-crash-expected-blink.txt index c9fd0c7..e3d1d542 100644 --- a/content/test/data/accessibility/html/reparent-crash-expected-blink.txt +++ b/content/test/data/accessibility/html/reparent-crash-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++listItem name='@NO_CHILDREN_DUMP' -++genericContainer -++++staticText name='Done' -++++++inlineTextBox name='Done' +++genericContainer ignored +++++listItem name='@NO_CHILDREN_DUMP' +++++genericContainer +++++++staticText name='Done' +++++++++inlineTextBox name='Done'
diff --git a/content/test/data/accessibility/html/replace-data-expected-blink.txt b/content/test/data/accessibility/html/replace-data-expected-blink.txt index 66f88a4f..5f3f9df1 100644 --- a/content/test/data/accessibility/html/replace-data-expected-blink.txt +++ b/content/test/data/accessibility/html/replace-data-expected-blink.txt
@@ -1,7 +1,8 @@ rootWebArea -++paragraph -++++staticText name='apples' -++++++inlineTextBox name='apples' -++paragraph -++++staticText name='bananas' -++++++inlineTextBox name='bananas' \ No newline at end of file +++genericContainer ignored +++++paragraph +++++++staticText name='apples' +++++++++inlineTextBox name='apples' +++++paragraph +++++++staticText name='bananas' +++++++++inlineTextBox name='bananas'
diff --git a/content/test/data/accessibility/html/scrollable-overflow-expected-blink.txt b/content/test/data/accessibility/html/scrollable-overflow-expected-blink.txt index a655f37..6f4ad98 100644 --- a/content/test/data/accessibility/html/scrollable-overflow-expected-blink.txt +++ b/content/test/data/accessibility/html/scrollable-overflow-expected-blink.txt
@@ -1,38 +1,45 @@ rootWebArea scrollXMin=0 -++paragraph -++++staticText name='no overflow' -++++++inlineTextBox name='no overflow' -++genericContainer -++++paragraph -++++++staticText name='tiny' -++++++++inlineTextBox name='tiny' -++genericContainer scrollXMin=0 -++++paragraph -++++++staticText name='x=hidden' -++++++++inlineTextBox name='x=hidden' -++genericContainer name='x=auto' scrollXMin=0 -++++paragraph -++++++staticText name='x=auto' -++++++++inlineTextBox name='x=auto' -++genericContainer name='x=scroll' scrollXMin=0 -++++paragraph -++++++staticText name='x=scroll' -++++++++inlineTextBox name='x=scroll' -++paragraph -++++staticText name='x=visible' -++++++inlineTextBox name='x=visible' -++genericContainer scrollXMin=0 -++++paragraph -++++++staticText name='y=hidden' -++++++++inlineTextBox name='y=hidden' -++genericContainer name='y=auto' scrollXMin=0 -++++paragraph -++++++staticText name='y=auto' -++++++++inlineTextBox name='y=auto' -++genericContainer name='y=scroll' scrollXMin=0 -++++paragraph -++++++staticText name='y=scroll' -++++++++inlineTextBox name='y=scroll' -++paragraph -++++staticText name='y=visible' -++++++inlineTextBox name='y=visible' +++genericContainer ignored +++++genericContainer ignored +++++++paragraph +++++++++staticText name='no overflow' +++++++++++inlineTextBox name='no overflow' +++++genericContainer ignored +++++++genericContainer +++++++++paragraph +++++++++++staticText name='tiny' +++++++++++++inlineTextBox name='tiny' +++++genericContainer ignored +++++++genericContainer scrollXMin=0 +++++++++paragraph +++++++++++staticText name='x=hidden' +++++++++++++inlineTextBox name='x=hidden' +++++++genericContainer name='x=auto' scrollXMin=0 +++++++++paragraph +++++++++++staticText name='x=auto' +++++++++++++inlineTextBox name='x=auto' +++++++genericContainer name='x=scroll' scrollXMin=0 +++++++++paragraph +++++++++++staticText name='x=scroll' +++++++++++++inlineTextBox name='x=scroll' +++++++genericContainer ignored +++++++++paragraph +++++++++++staticText name='x=visible' +++++++++++++inlineTextBox name='x=visible' +++++genericContainer ignored +++++++genericContainer scrollXMin=0 +++++++++paragraph +++++++++++staticText name='y=hidden' +++++++++++++inlineTextBox name='y=hidden' +++++++genericContainer name='y=auto' scrollXMin=0 +++++++++paragraph +++++++++++staticText name='y=auto' +++++++++++++inlineTextBox name='y=auto' +++++++genericContainer name='y=scroll' scrollXMin=0 +++++++++paragraph +++++++++++staticText name='y=scroll' +++++++++++++inlineTextBox name='y=scroll' +++++++genericContainer ignored +++++++++paragraph +++++++++++staticText name='y=visible' +++++++++++++inlineTextBox name='y=visible'
diff --git a/content/test/data/accessibility/html/scrollable-overflow.html b/content/test/data/accessibility/html/scrollable-overflow.html index 7a2ab9d..cb048b0 100644 --- a/content/test/data/accessibility/html/scrollable-overflow.html +++ b/content/test/data/accessibility/html/scrollable-overflow.html
@@ -6,7 +6,7 @@ <style> body { font-style: monospace; width: 999px;} .x-overflow > div { width: 25px; height: 50px;} - .x-overflow > div > p { margin: 0; } + .x-overflow > div > p { margin: 0; } .y-overflow > div { height: 25px; } .y-overflow > div > p { padding: 12px 0; margin: 0;} </style> @@ -18,11 +18,12 @@ <div class="not-enough-content-to-scroll"> <!-- Not scrollable --> <div style="overflow: scroll; width: 100px; height: 100px"> <p>tiny + </div> </div> <div class="x-overflow"> <div style="overflow-x: hidden;"> <!-- Scrollable --> - <p>x=hidden + <p>x=hidden </div> <div style="overflow-x: auto;"> <!-- Scrollable --> <p>x=auto
diff --git a/content/test/data/accessibility/html/section-expected-blink.txt b/content/test/data/accessibility/html/section-expected-blink.txt index 8d0074f..66a6990 100644 --- a/content/test/data/accessibility/html/section-expected-blink.txt +++ b/content/test/data/accessibility/html/section-expected-blink.txt
@@ -1,4 +1,5 @@ rootWebArea -++region -++++staticText name='This is a section element.' -++++++inlineTextBox name='This is a section element.' \ No newline at end of file +++genericContainer ignored +++++region +++++++staticText name='This is a section element.' +++++++++inlineTextBox name='This is a section element.'
diff --git a/content/test/data/accessibility/html/small-expected-blink.txt b/content/test/data/accessibility/html/small-expected-blink.txt index 713253ea..8221ffc 100644 --- a/content/test/data/accessibility/html/small-expected-blink.txt +++ b/content/test/data/accessibility/html/small-expected-blink.txt
@@ -1,6 +1,7 @@ rootWebArea -++paragraph -++++staticText name='Chromium' -++++++inlineTextBox name='Chromium' -++++staticText name='open source project' -++++++inlineTextBox name='open source project' \ No newline at end of file +++genericContainer ignored +++++paragraph +++++++staticText name='Chromium' +++++++++inlineTextBox name='Chromium' +++++++staticText name='open source project' +++++++++inlineTextBox name='open source project'
diff --git a/content/test/data/accessibility/html/span-expected-blink.txt b/content/test/data/accessibility/html/span-expected-blink.txt index fea75888..723c1081 100644 --- a/content/test/data/accessibility/html/span-expected-blink.txt +++ b/content/test/data/accessibility/html/span-expected-blink.txt
@@ -1,118 +1,119 @@ rootWebArea -++paragraph -++++staticText name='This' -++++++inlineTextBox name='This' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='paragraph has ' -++++++inlineTextBox name='paragraph has ' -++++staticText name='text' -++++++inlineTextBox name='text' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='in' -++++++inlineTextBox name='in' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='spans' -++++++inlineTextBox name='spans' -++++staticText name='.' -++++++inlineTextBox name='.' -++paragraph -++++staticText name='E1. Eat' -++++++inlineTextBox name='E1. Eat' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++link name='space' +++genericContainer ignored +++++paragraph +++++++staticText name='This' +++++++++inlineTextBox name='This' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='paragraph has ' +++++++++inlineTextBox name='paragraph has ' +++++++staticText name='text' +++++++++inlineTextBox name='text' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='in' +++++++++inlineTextBox name='in' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='spans' +++++++++inlineTextBox name='spans' +++++++staticText name='.' +++++++++inlineTextBox name='.' +++++paragraph +++++++staticText name='E1. Eat' +++++++++inlineTextBox name='E1. Eat' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++link name='space' +++++++++staticText name='space' +++++++++++inlineTextBox name='space' +++++paragraph +++++++staticText name='E2. Eat' +++++++++inlineTextBox name='E2. Eat' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++link name='space' +++++++++staticText name='space' +++++++++++inlineTextBox name='space' +++++paragraph +++++++staticText name='E3. Eat' +++++++++inlineTextBox name='E3. Eat' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++link name='space' +++++++++staticText name='space' +++++++++++inlineTextBox name='space' +++++paragraph +++++++link name='E4. Eat' +++++++++staticText name='E4. Eat' +++++++++++inlineTextBox name='E4. Eat' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' ++++++staticText name='space' ++++++++inlineTextBox name='space' -++paragraph -++++staticText name='E2. Eat' -++++++inlineTextBox name='E2. Eat' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++link name='space' +++++paragraph +++++++link name='E5. Eat' +++++++++staticText name='E5. Eat' +++++++++++inlineTextBox name='E5. Eat' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' ++++++staticText name='space' ++++++++inlineTextBox name='space' -++paragraph -++++staticText name='E3. Eat' -++++++inlineTextBox name='E3. Eat' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++link name='space' +++++paragraph +++++++link name='E6. Eat' +++++++++staticText name='E6. Eat' +++++++++++inlineTextBox name='E6. Eat' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' ++++++staticText name='space' ++++++++inlineTextBox name='space' -++paragraph -++++link name='E4. Eat' -++++++staticText name='E4. Eat' -++++++++inlineTextBox name='E4. Eat' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='space' -++++++inlineTextBox name='space' -++paragraph -++++link name='E5. Eat' -++++++staticText name='E5. Eat' -++++++++inlineTextBox name='E5. Eat' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='space' -++++++inlineTextBox name='space' -++paragraph -++++link name='E6. Eat' -++++++staticText name='E6. Eat' -++++++++inlineTextBox name='E6. Eat' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='space' -++++++inlineTextBox name='space' -++paragraph -++++staticText name='K1. Keep' -++++++inlineTextBox name='K1. Keep' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='space' -++++++inlineTextBox name='space' -++paragraph -++++staticText name='K2. Keep' -++++++inlineTextBox name='K2. Keep' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='space' -++++++inlineTextBox name='space' -++paragraph -++++staticText name='K3. Keep' -++++++inlineTextBox name='K3. Keep' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='space' -++++++inlineTextBox name='space' -++paragraph -++++staticText name='K4. Keep ' -++++++inlineTextBox name='K4. Keep ' -++++staticText name='space' -++++++inlineTextBox name='space' -++paragraph -++++staticText name='K5. Keep' -++++++inlineTextBox name='K5. Keep' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='space' -++++++inlineTextBox name='space' -++paragraph -++++staticText name='K6. Keep ' -++++++inlineTextBox name='K6. Keep ' -++++staticText name='space' -++++++inlineTextBox name='space' -++paragraph -++++staticText name='K7. Keep' -++++++inlineTextBox name='K7. Keep' -++++staticText name=' space' -++++++inlineTextBox name=' space' -++paragraph -++++staticText name='K8. Keep' -++++++inlineTextBox name='K8. Keep' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='space' -++++++inlineTextBox name='space' +++++paragraph +++++++staticText name='K1. Keep' +++++++++inlineTextBox name='K1. Keep' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='space' +++++++++inlineTextBox name='space' +++++paragraph +++++++staticText name='K2. Keep' +++++++++inlineTextBox name='K2. Keep' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='space' +++++++++inlineTextBox name='space' +++++paragraph +++++++staticText name='K3. Keep' +++++++++inlineTextBox name='K3. Keep' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='space' +++++++++inlineTextBox name='space' +++++paragraph +++++++staticText name='K4. Keep ' +++++++++inlineTextBox name='K4. Keep ' +++++++staticText name='space' +++++++++inlineTextBox name='space' +++++paragraph +++++++staticText name='K5. Keep' +++++++++inlineTextBox name='K5. Keep' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='space' +++++++++inlineTextBox name='space' +++++paragraph +++++++staticText name='K6. Keep ' +++++++++inlineTextBox name='K6. Keep ' +++++++staticText name='space' +++++++++inlineTextBox name='space' +++++paragraph +++++++staticText name='K7. Keep' +++++++++inlineTextBox name='K7. Keep' +++++++staticText name=' space' +++++++++inlineTextBox name=' space' +++++paragraph +++++++staticText name='K8. Keep' +++++++++inlineTextBox name='K8. Keep' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='space' +++++++++inlineTextBox name='space'
diff --git a/content/test/data/accessibility/html/span-line-break-expected-blink.txt b/content/test/data/accessibility/html/span-line-break-expected-blink.txt index 7c20308..49c1aee 100644 --- a/content/test/data/accessibility/html/span-line-break-expected-blink.txt +++ b/content/test/data/accessibility/html/span-line-break-expected-blink.txt
@@ -1,61 +1,62 @@ rootWebArea -++paragraph -++++staticText name='100(a)#abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='100(a)#abcdefghijklmnopqrstuvwxyz' -++++staticText name=' ' -++++staticText name='abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' -++paragraph -++++staticText name='100(b)#abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='100(b)#abcdefghijklmnopqrstuvwxyz' -++++staticText name=' ' -++++staticText name='abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' -++paragraph -++++staticText name='100(c)#abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='100(c)#abcdefghijklmnopqrstuvwxyz' -++++staticText name=' ' -++++staticText name='abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' -++paragraph -++++staticText name='500(a)#abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='500(a)#abcdefghijklmnopqrstuvwxyz' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' -++paragraph -++++staticText name='500(b)#abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='500(b)#abcdefghijklmnopqrstuvwxyz' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' -++paragraph -++++staticText name='500(c)#abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='500(c)#abcdefghijklmnopqrstuvwxyz' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' -++paragraph -++++staticText name='900(a)#abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='900(a)#abcdefghijklmnopqrstuvwxyz' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' -++paragraph -++++staticText name='900(b)#abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='900(b)#abcdefghijklmnopqrstuvwxyz' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' -++paragraph -++++staticText name='900(c)#abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='900(c)#abcdefghijklmnopqrstuvwxyz' -++++staticText name=' ' -++++++inlineTextBox name=' ' -++++staticText name='abcdefghijklmnopqrstuvwxyz' -++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' +++genericContainer ignored +++++paragraph +++++++staticText name='100(a)#abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='100(a)#abcdefghijklmnopqrstuvwxyz' +++++++staticText name=' ' +++++++staticText name='abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' +++++paragraph +++++++staticText name='100(b)#abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='100(b)#abcdefghijklmnopqrstuvwxyz' +++++++staticText name=' ' +++++++staticText name='abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' +++++paragraph +++++++staticText name='100(c)#abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='100(c)#abcdefghijklmnopqrstuvwxyz' +++++++staticText name=' ' +++++++staticText name='abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' +++++paragraph +++++++staticText name='500(a)#abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='500(a)#abcdefghijklmnopqrstuvwxyz' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' +++++paragraph +++++++staticText name='500(b)#abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='500(b)#abcdefghijklmnopqrstuvwxyz' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' +++++paragraph +++++++staticText name='500(c)#abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='500(c)#abcdefghijklmnopqrstuvwxyz' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' +++++paragraph +++++++staticText name='900(a)#abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='900(a)#abcdefghijklmnopqrstuvwxyz' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' +++++paragraph +++++++staticText name='900(b)#abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='900(b)#abcdefghijklmnopqrstuvwxyz' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz' +++++paragraph +++++++staticText name='900(c)#abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='900(c)#abcdefghijklmnopqrstuvwxyz' +++++++staticText name=' ' +++++++++inlineTextBox name=' ' +++++++staticText name='abcdefghijklmnopqrstuvwxyz' +++++++++inlineTextBox name='abcdefghijklmnopqrstuvwxyz'
diff --git a/content/test/data/accessibility/html/sub-expected-blink.txt b/content/test/data/accessibility/html/sub-expected-blink.txt index aa74a7d0..45905f3 100644 --- a/content/test/data/accessibility/html/sub-expected-blink.txt +++ b/content/test/data/accessibility/html/sub-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++paragraph -++++staticText name='This text contains ' -++++++inlineTextBox name='This text contains ' -++++staticText name='subscript' -++++++inlineTextBox name='subscript' -++++staticText name=' text.' -++++++inlineTextBox name=' text.' \ No newline at end of file +++genericContainer ignored +++++paragraph +++++++staticText name='This text contains ' +++++++++inlineTextBox name='This text contains ' +++++++staticText name='subscript' +++++++++inlineTextBox name='subscript' +++++++staticText name=' text.' +++++++++inlineTextBox name=' text.'
diff --git a/content/test/data/accessibility/html/summary-expected-blink.txt b/content/test/data/accessibility/html/summary-expected-blink.txt index 987d99f..d2d473916 100644 --- a/content/test/data/accessibility/html/summary-expected-blink.txt +++ b/content/test/data/accessibility/html/summary-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea -++details -++++disclosureTriangle collapsed name='details tag' -++++++staticText name='details tag' -++++++++inlineTextBox name='details tag' \ No newline at end of file +++genericContainer ignored +++++details +++++++disclosureTriangle collapsed name='details tag' +++++++++staticText name='details tag' +++++++++++inlineTextBox name='details tag'
diff --git a/content/test/data/accessibility/html/sup-expected-blink.txt b/content/test/data/accessibility/html/sup-expected-blink.txt index 2747002..7611a8b 100644 --- a/content/test/data/accessibility/html/sup-expected-blink.txt +++ b/content/test/data/accessibility/html/sup-expected-blink.txt
@@ -1,8 +1,9 @@ rootWebArea -++paragraph -++++staticText name='This text contains' -++++++inlineTextBox name='This text contains' -++++staticText name='superscript' -++++++inlineTextBox name='superscript' -++++staticText name='text.' -++++++inlineTextBox name='text.' \ No newline at end of file +++genericContainer ignored +++++paragraph +++++++staticText name='This text contains' +++++++++inlineTextBox name='This text contains' +++++++staticText name='superscript' +++++++++inlineTextBox name='superscript' +++++++staticText name='text.' +++++++++inlineTextBox name='text.'
diff --git a/content/test/data/accessibility/html/table-focusable-sections-expected-blink.txt b/content/test/data/accessibility/html/table-focusable-sections-expected-blink.txt index 4f01368..77156b0 100644 --- a/content/test/data/accessibility/html/table-focusable-sections-expected-blink.txt +++ b/content/test/data/accessibility/html/table-focusable-sections-expected-blink.txt
@@ -1,33 +1,34 @@ rootWebArea name='Table example - focusable thead, tbody, tfoot' -++table -++++group -++++++row -++++++++columnHeader name='Sum' -++++++++++staticText name='Sum' -++++++++++++inlineTextBox name='Sum' -++++++++columnHeader name='Subtraction' -++++++++++staticText name='Subtraction' -++++++++++++inlineTextBox name='Subtraction' -++++group -++++++row -++++++++cell name='10' -++++++++++staticText name='10' -++++++++++++inlineTextBox name='10' -++++++++cell name='7' -++++++++++staticText name='7' -++++++++++++inlineTextBox name='7' -++++++row -++++++++cell name='2' -++++++++++staticText name='2' -++++++++++++inlineTextBox name='2' -++++++++cell name='4' -++++++++++staticText name='4' -++++++++++++inlineTextBox name='4' -++++group -++++++row -++++++++cell name='12' -++++++++++staticText name='12' -++++++++++++inlineTextBox name='12' -++++++++cell name='3' -++++++++++staticText name='3' -++++++++++++inlineTextBox name='3' +++genericContainer ignored +++++table +++++++group +++++++++row +++++++++++columnHeader name='Sum' +++++++++++++staticText name='Sum' +++++++++++++++inlineTextBox name='Sum' +++++++++++columnHeader name='Subtraction' +++++++++++++staticText name='Subtraction' +++++++++++++++inlineTextBox name='Subtraction' +++++++group +++++++++row +++++++++++cell name='10' +++++++++++++staticText name='10' +++++++++++++++inlineTextBox name='10' +++++++++++cell name='7' +++++++++++++staticText name='7' +++++++++++++++inlineTextBox name='7' +++++++++row +++++++++++cell name='2' +++++++++++++staticText name='2' +++++++++++++++inlineTextBox name='2' +++++++++++cell name='4' +++++++++++++staticText name='4' +++++++++++++++inlineTextBox name='4' +++++++group +++++++++row +++++++++++cell name='12' +++++++++++++staticText name='12' +++++++++++++++inlineTextBox name='12' +++++++++++cell name='3' +++++++++++++staticText name='3' +++++++++++++++inlineTextBox name='3'
diff --git a/content/test/data/accessibility/html/table-headers-empty-first-cell-expected-blink.txt b/content/test/data/accessibility/html/table-headers-empty-first-cell-expected-blink.txt index f4b32d0..337912e 100644 --- a/content/test/data/accessibility/html/table-headers-empty-first-cell-expected-blink.txt +++ b/content/test/data/accessibility/html/table-headers-empty-first-cell-expected-blink.txt
@@ -1,98 +1,99 @@ rootWebArea name='Table example - headers with empty first cell' -++table name='Delivery slots:' -++++caption -++++++staticText name='Delivery slots:' -++++++++inlineTextBox name='Delivery slots:' -++++row -++++++cell -++++++columnHeader name='Monday' -++++++++staticText name='Monday' -++++++++++inlineTextBox name='Monday' -++++++columnHeader name='Tuesday' -++++++++staticText name='Tuesday' -++++++++++inlineTextBox name='Tuesday' -++++++columnHeader name='Wednesday' -++++++++staticText name='Wednesday' -++++++++++inlineTextBox name='Wednesday' -++++++columnHeader name='Thursday' -++++++++staticText name='Thursday' -++++++++++inlineTextBox name='Thursday' -++++++columnHeader name='Friday' -++++++++staticText name='Friday' -++++++++++inlineTextBox name='Friday' -++++row -++++++rowHeader name='09:00 - 11:00' -++++++++staticText name='09:00 - 11:00' -++++++++++inlineTextBox name='09:00 - 11:00' -++++++cell name='Closed' -++++++++staticText name='Closed' -++++++++++inlineTextBox name='Closed' -++++++cell name='Open' -++++++++staticText name='Open' -++++++++++inlineTextBox name='Open' -++++++cell name='Open' -++++++++staticText name='Open' -++++++++++inlineTextBox name='Open' -++++++cell name='Closed' -++++++++staticText name='Closed' -++++++++++inlineTextBox name='Closed' -++++++cell name='Closed' -++++++++staticText name='Closed' -++++++++++inlineTextBox name='Closed' -++++row -++++++rowHeader name='11:00 - 13:00' -++++++++staticText name='11:00 - 13:00' -++++++++++inlineTextBox name='11:00 - 13:00' -++++++cell name='Open' -++++++++staticText name='Open' -++++++++++inlineTextBox name='Open' -++++++cell name='Open' -++++++++staticText name='Open' -++++++++++inlineTextBox name='Open' -++++++cell name='Closed' -++++++++staticText name='Closed' -++++++++++inlineTextBox name='Closed' -++++++cell name='Closed' -++++++++staticText name='Closed' -++++++++++inlineTextBox name='Closed' -++++++cell name='Closed' -++++++++staticText name='Closed' -++++++++++inlineTextBox name='Closed' -++++row -++++++rowHeader name='13:00 - 15:00' -++++++++staticText name='13:00 - 15:00' -++++++++++inlineTextBox name='13:00 - 15:00' -++++++cell name='Open' -++++++++staticText name='Open' -++++++++++inlineTextBox name='Open' -++++++cell name='Open' -++++++++staticText name='Open' -++++++++++inlineTextBox name='Open' -++++++cell name='Open' -++++++++staticText name='Open' -++++++++++inlineTextBox name='Open' -++++++cell name='Closed' -++++++++staticText name='Closed' -++++++++++inlineTextBox name='Closed' -++++++cell name='Closed' -++++++++staticText name='Closed' -++++++++++inlineTextBox name='Closed' -++++row -++++++rowHeader name='15:00 - 17:00' -++++++++staticText name='15:00 - 17:00' -++++++++++inlineTextBox name='15:00 - 17:00' -++++++cell name='Closed' -++++++++staticText name='Closed' -++++++++++inlineTextBox name='Closed' -++++++cell name='Closed' -++++++++staticText name='Closed' -++++++++++inlineTextBox name='Closed' -++++++cell name='Closed' -++++++++staticText name='Closed' -++++++++++inlineTextBox name='Closed' -++++++cell name='Open' -++++++++staticText name='Open' -++++++++++inlineTextBox name='Open' -++++++cell name='Open' -++++++++staticText name='Open' -++++++++++inlineTextBox name='Open' +++genericContainer ignored +++++table name='Delivery slots:' +++++++caption +++++++++staticText name='Delivery slots:' +++++++++++inlineTextBox name='Delivery slots:' +++++++row +++++++++cell +++++++++columnHeader name='Monday' +++++++++++staticText name='Monday' +++++++++++++inlineTextBox name='Monday' +++++++++columnHeader name='Tuesday' +++++++++++staticText name='Tuesday' +++++++++++++inlineTextBox name='Tuesday' +++++++++columnHeader name='Wednesday' +++++++++++staticText name='Wednesday' +++++++++++++inlineTextBox name='Wednesday' +++++++++columnHeader name='Thursday' +++++++++++staticText name='Thursday' +++++++++++++inlineTextBox name='Thursday' +++++++++columnHeader name='Friday' +++++++++++staticText name='Friday' +++++++++++++inlineTextBox name='Friday' +++++++row +++++++++rowHeader name='09:00 - 11:00' +++++++++++staticText name='09:00 - 11:00' +++++++++++++inlineTextBox name='09:00 - 11:00' +++++++++cell name='Closed' +++++++++++staticText name='Closed' +++++++++++++inlineTextBox name='Closed' +++++++++cell name='Open' +++++++++++staticText name='Open' +++++++++++++inlineTextBox name='Open' +++++++++cell name='Open' +++++++++++staticText name='Open' +++++++++++++inlineTextBox name='Open' +++++++++cell name='Closed' +++++++++++staticText name='Closed' +++++++++++++inlineTextBox name='Closed' +++++++++cell name='Closed' +++++++++++staticText name='Closed' +++++++++++++inlineTextBox name='Closed' +++++++row +++++++++rowHeader name='11:00 - 13:00' +++++++++++staticText name='11:00 - 13:00' +++++++++++++inlineTextBox name='11:00 - 13:00' +++++++++cell name='Open' +++++++++++staticText name='Open' +++++++++++++inlineTextBox name='Open' +++++++++cell name='Open' +++++++++++staticText name='Open' +++++++++++++inlineTextBox name='Open' +++++++++cell name='Closed' +++++++++++staticText name='Closed' +++++++++++++inlineTextBox name='Closed' +++++++++cell name='Closed' +++++++++++staticText name='Closed' +++++++++++++inlineTextBox name='Closed' +++++++++cell name='Closed' +++++++++++staticText name='Closed' +++++++++++++inlineTextBox name='Closed' +++++++row +++++++++rowHeader name='13:00 - 15:00' +++++++++++staticText name='13:00 - 15:00' +++++++++++++inlineTextBox name='13:00 - 15:00' +++++++++cell name='Open' +++++++++++staticText name='Open' +++++++++++++inlineTextBox name='Open' +++++++++cell name='Open' +++++++++++staticText name='Open' +++++++++++++inlineTextBox name='Open' +++++++++cell name='Open' +++++++++++staticText name='Open' +++++++++++++inlineTextBox name='Open' +++++++++cell name='Closed' +++++++++++staticText name='Closed' +++++++++++++inlineTextBox name='Closed' +++++++++cell name='Closed' +++++++++++staticText name='Closed' +++++++++++++inlineTextBox name='Closed' +++++++row +++++++++rowHeader name='15:00 - 17:00' +++++++++++staticText name='15:00 - 17:00' +++++++++++++inlineTextBox name='15:00 - 17:00' +++++++++cell name='Closed' +++++++++++staticText name='Closed' +++++++++++++inlineTextBox name='Closed' +++++++++cell name='Closed' +++++++++++staticText name='Closed' +++++++++++++inlineTextBox name='Closed' +++++++++cell name='Closed' +++++++++++staticText name='Closed' +++++++++++++inlineTextBox name='Closed' +++++++++cell name='Open' +++++++++++staticText name='Open' +++++++++++++inlineTextBox name='Open' +++++++++cell name='Open' +++++++++++staticText name='Open' +++++++++++++inlineTextBox name='Open'
diff --git a/content/test/data/accessibility/html/table-headers-on-all-sides-expected-blink.txt b/content/test/data/accessibility/html/table-headers-on-all-sides-expected-blink.txt index 4197d8c..edd0df22 100644 --- a/content/test/data/accessibility/html/table-headers-on-all-sides-expected-blink.txt +++ b/content/test/data/accessibility/html/table-headers-on-all-sides-expected-blink.txt
@@ -1,46 +1,47 @@ rootWebArea name='Table example - headers on all sides' -++table -++++row -++++++cell -++++++columnHeader name='Red' -++++++++staticText name='Red' -++++++++++inlineTextBox name='Red' -++++++columnHeader name='Green' -++++++++staticText name='Green' -++++++++++inlineTextBox name='Green' -++++++cell -++++row -++++++rowHeader name='Fruit' -++++++++staticText name='Fruit' -++++++++++inlineTextBox name='Fruit' -++++++cell name='strawberry' -++++++++staticText name='strawberry' -++++++++++inlineTextBox name='strawberry' -++++++cell name='lime' -++++++++staticText name='lime' -++++++++++inlineTextBox name='lime' -++++++rowHeader name='Fruit' -++++++++staticText name='Fruit' -++++++++++inlineTextBox name='Fruit' -++++row -++++++rowHeader name='Veggies' -++++++++staticText name='Veggies' -++++++++++inlineTextBox name='Veggies' -++++++cell name='radish' -++++++++staticText name='radish' -++++++++++inlineTextBox name='radish' -++++++cell name='spinach' -++++++++staticText name='spinach' -++++++++++inlineTextBox name='spinach' -++++++rowHeader name='Veggies' -++++++++staticText name='Veggies' -++++++++++inlineTextBox name='Veggies' -++++row -++++++cell -++++++columnHeader name='Red' -++++++++staticText name='Red' -++++++++++inlineTextBox name='Red' -++++++columnHeader name='Green' -++++++++staticText name='Green' -++++++++++inlineTextBox name='Green' -++++++cell +++genericContainer ignored +++++table +++++++row +++++++++cell +++++++++columnHeader name='Red' +++++++++++staticText name='Red' +++++++++++++inlineTextBox name='Red' +++++++++columnHeader name='Green' +++++++++++staticText name='Green' +++++++++++++inlineTextBox name='Green' +++++++++cell +++++++row +++++++++rowHeader name='Fruit' +++++++++++staticText name='Fruit' +++++++++++++inlineTextBox name='Fruit' +++++++++cell name='strawberry' +++++++++++staticText name='strawberry' +++++++++++++inlineTextBox name='strawberry' +++++++++cell name='lime' +++++++++++staticText name='lime' +++++++++++++inlineTextBox name='lime' +++++++++rowHeader name='Fruit' +++++++++++staticText name='Fruit' +++++++++++++inlineTextBox name='Fruit' +++++++row +++++++++rowHeader name='Veggies' +++++++++++staticText name='Veggies' +++++++++++++inlineTextBox name='Veggies' +++++++++cell name='radish' +++++++++++staticText name='radish' +++++++++++++inlineTextBox name='radish' +++++++++cell name='spinach' +++++++++++staticText name='spinach' +++++++++++++inlineTextBox name='spinach' +++++++++rowHeader name='Veggies' +++++++++++staticText name='Veggies' +++++++++++++inlineTextBox name='Veggies' +++++++row +++++++++cell +++++++++columnHeader name='Red' +++++++++++staticText name='Red' +++++++++++++inlineTextBox name='Red' +++++++++columnHeader name='Green' +++++++++++staticText name='Green' +++++++++++++inlineTextBox name='Green' +++++++++cell
diff --git a/content/test/data/accessibility/html/table-layout-expected-blink.txt b/content/test/data/accessibility/html/table-layout-expected-blink.txt index 20bdfb3b..e439b630 100644 --- a/content/test/data/accessibility/html/table-layout-expected-blink.txt +++ b/content/test/data/accessibility/html/table-layout-expected-blink.txt
@@ -1,32 +1,33 @@ rootWebArea name='Table example #2' -++layoutTable -++++layoutTableRow -++++++layoutTableCell name='1' -++++++++staticText name='1' -++++++++++inlineTextBox name='1' -++++++layoutTableCell name='2' -++++++++staticText name='2' -++++++++++inlineTextBox name='2' -++++++layoutTableCell name='3' -++++++++staticText name='3' -++++++++++inlineTextBox name='3' -++++layoutTableRow -++++++layoutTableCell name='4' -++++++++staticText name='4' -++++++++++inlineTextBox name='4' -++++++layoutTableCell name='5' -++++++++staticText name='5' -++++++++++inlineTextBox name='5' -++++++layoutTableCell name='6' -++++++++staticText name='6' -++++++++++inlineTextBox name='6' -++++layoutTableRow -++++++layoutTableCell name='7' -++++++++staticText name='7' -++++++++++inlineTextBox name='7' -++++++layoutTableCell name='8' -++++++++staticText name='8' -++++++++++inlineTextBox name='8' -++++++layoutTableCell name='9' -++++++++staticText name='9' -++++++++++inlineTextBox name='9' +++genericContainer ignored +++++layoutTable +++++++layoutTableRow +++++++++layoutTableCell name='1' +++++++++++staticText name='1' +++++++++++++inlineTextBox name='1' +++++++++layoutTableCell name='2' +++++++++++staticText name='2' +++++++++++++inlineTextBox name='2' +++++++++layoutTableCell name='3' +++++++++++staticText name='3' +++++++++++++inlineTextBox name='3' +++++++layoutTableRow +++++++++layoutTableCell name='4' +++++++++++staticText name='4' +++++++++++++inlineTextBox name='4' +++++++++layoutTableCell name='5' +++++++++++staticText name='5' +++++++++++++inlineTextBox name='5' +++++++++layoutTableCell name='6' +++++++++++staticText name='6' +++++++++++++inlineTextBox name='6' +++++++layoutTableRow +++++++++layoutTableCell name='7' +++++++++++staticText name='7' +++++++++++++inlineTextBox name='7' +++++++++layoutTableCell name='8' +++++++++++staticText name='8' +++++++++++++inlineTextBox name='8' +++++++++layoutTableCell name='9' +++++++++++staticText name='9' +++++++++++++inlineTextBox name='9'
diff --git a/content/test/data/accessibility/html/table-multiple-row-and-column-headers-expected-blink.txt b/content/test/data/accessibility/html/table-multiple-row-and-column-headers-expected-blink.txt index fb22679..5df4c51 100644 --- a/content/test/data/accessibility/html/table-multiple-row-and-column-headers-expected-blink.txt +++ b/content/test/data/accessibility/html/table-multiple-row-and-column-headers-expected-blink.txt
@@ -1,93 +1,94 @@ rootWebArea name='Table example - multiple row and column headers' -++table -++++row -++++++cell -++++++columnHeader name='Mars' -++++++++staticText name='Mars' -++++++++++inlineTextBox name='Mars' -++++++columnHeader name='Venus' -++++++++staticText name='Venus' -++++++++++inlineTextBox name='Venus' -++++row -++++++columnHeader name='Produced' -++++++++staticText name='Produced' -++++++++++inlineTextBox name='Produced' -++++++columnHeader name='Sold' -++++++++staticText name='Sold' -++++++++++inlineTextBox name='Sold' -++++++columnHeader name='Produced' -++++++++staticText name='Produced' -++++++++++inlineTextBox name='Produced' -++++++columnHeader name='Sold' -++++++++staticText name='Sold' -++++++++++inlineTextBox name='Sold' -++++row -++++++rowHeader name='For Toddlers' -++++++++staticText name='For Toddlers' -++++++++++inlineTextBox name='For Toddlers' -++++++rowHeader name='Teddy Bears' -++++++++staticText name='Teddy Bears' -++++++++++inlineTextBox name='Teddy Bears' -++++++cell name='50,000' -++++++++staticText name='50,000' -++++++++++inlineTextBox name='50,000' -++++++cell name='30,000' -++++++++staticText name='30,000' -++++++++++inlineTextBox name='30,000' -++++++cell name='100,000' -++++++++staticText name='100,000' -++++++++++inlineTextBox name='100,000' -++++++cell name='80,000' -++++++++staticText name='80,000' -++++++++++inlineTextBox name='80,000' -++++row -++++++rowHeader name='Action Figures' -++++++++staticText name='Action Figures' -++++++++++inlineTextBox name='Action Figures' -++++++cell name='25,000' -++++++++staticText name='25,000' -++++++++++inlineTextBox name='25,000' -++++++cell name='15,000' -++++++++staticText name='15,000' -++++++++++inlineTextBox name='15,000' -++++++cell name='50,000' -++++++++staticText name='50,000' -++++++++++inlineTextBox name='50,000' -++++++cell name='40,000' -++++++++staticText name='40,000' -++++++++++inlineTextBox name='40,000' -++++row -++++++rowHeader name='For Teens' -++++++++staticText name='For Teens' -++++++++++inlineTextBox name='For Teens' -++++++rowHeader name='Board Games' -++++++++staticText name='Board Games' -++++++++++inlineTextBox name='Board Games' -++++++cell name='5,000' -++++++++staticText name='5,000' -++++++++++inlineTextBox name='5,000' -++++++cell name='2,000' -++++++++staticText name='2,000' -++++++++++inlineTextBox name='2,000' -++++++cell name='6,000' -++++++++staticText name='6,000' -++++++++++inlineTextBox name='6,000' -++++++cell name='4,000' -++++++++staticText name='4,000' -++++++++++inlineTextBox name='4,000' -++++row -++++++rowHeader name='Video Games' -++++++++staticText name='Video Games' -++++++++++inlineTextBox name='Video Games' -++++++cell name='10,000' -++++++++staticText name='10,000' -++++++++++inlineTextBox name='10,000' -++++++cell name='5,000' -++++++++staticText name='5,000' -++++++++++inlineTextBox name='5,000' -++++++cell name='12,000' -++++++++staticText name='12,000' -++++++++++inlineTextBox name='12,000' -++++++cell name='9,000' -++++++++staticText name='9,000' -++++++++++inlineTextBox name='9,000' +++genericContainer ignored +++++table +++++++row +++++++++cell +++++++++columnHeader name='Mars' +++++++++++staticText name='Mars' +++++++++++++inlineTextBox name='Mars' +++++++++columnHeader name='Venus' +++++++++++staticText name='Venus' +++++++++++++inlineTextBox name='Venus' +++++++row +++++++++columnHeader name='Produced' +++++++++++staticText name='Produced' +++++++++++++inlineTextBox name='Produced' +++++++++columnHeader name='Sold' +++++++++++staticText name='Sold' +++++++++++++inlineTextBox name='Sold' +++++++++columnHeader name='Produced' +++++++++++staticText name='Produced' +++++++++++++inlineTextBox name='Produced' +++++++++columnHeader name='Sold' +++++++++++staticText name='Sold' +++++++++++++inlineTextBox name='Sold' +++++++row +++++++++rowHeader name='For Toddlers' +++++++++++staticText name='For Toddlers' +++++++++++++inlineTextBox name='For Toddlers' +++++++++rowHeader name='Teddy Bears' +++++++++++staticText name='Teddy Bears' +++++++++++++inlineTextBox name='Teddy Bears' +++++++++cell name='50,000' +++++++++++staticText name='50,000' +++++++++++++inlineTextBox name='50,000' +++++++++cell name='30,000' +++++++++++staticText name='30,000' +++++++++++++inlineTextBox name='30,000' +++++++++cell name='100,000' +++++++++++staticText name='100,000' +++++++++++++inlineTextBox name='100,000' +++++++++cell name='80,000' +++++++++++staticText name='80,000' +++++++++++++inlineTextBox name='80,000' +++++++row +++++++++rowHeader name='Action Figures' +++++++++++staticText name='Action Figures' +++++++++++++inlineTextBox name='Action Figures' +++++++++cell name='25,000' +++++++++++staticText name='25,000' +++++++++++++inlineTextBox name='25,000' +++++++++cell name='15,000' +++++++++++staticText name='15,000' +++++++++++++inlineTextBox name='15,000' +++++++++cell name='50,000' +++++++++++staticText name='50,000' +++++++++++++inlineTextBox name='50,000' +++++++++cell name='40,000' +++++++++++staticText name='40,000' +++++++++++++inlineTextBox name='40,000' +++++++row +++++++++rowHeader name='For Teens' +++++++++++staticText name='For Teens' +++++++++++++inlineTextBox name='For Teens' +++++++++rowHeader name='Board Games' +++++++++++staticText name='Board Games' +++++++++++++inlineTextBox name='Board Games' +++++++++cell name='5,000' +++++++++++staticText name='5,000' +++++++++++++inlineTextBox name='5,000' +++++++++cell name='2,000' +++++++++++staticText name='2,000' +++++++++++++inlineTextBox name='2,000' +++++++++cell name='6,000' +++++++++++staticText name='6,000' +++++++++++++inlineTextBox name='6,000' +++++++++cell name='4,000' +++++++++++staticText name='4,000' +++++++++++++inlineTextBox name='4,000' +++++++row +++++++++rowHeader name='Video Games' +++++++++++staticText name='Video Games' +++++++++++++inlineTextBox name='Video Games' +++++++++cell name='10,000' +++++++++++staticText name='10,000' +++++++++++++inlineTextBox name='10,000' +++++++++cell name='5,000' +++++++++++staticText name='5,000' +++++++++++++inlineTextBox name='5,000' +++++++++cell name='12,000' +++++++++++staticText name='12,000' +++++++++++++inlineTextBox name='12,000' +++++++++cell name='9,000' +++++++++++staticText name='9,000' +++++++++++++inlineTextBox name='9,000'
diff --git a/content/test/data/accessibility/html/table-presentation-expected-blink.txt b/content/test/data/accessibility/html/table-presentation-expected-blink.txt index fc19af8..cdf1ddc 100644 --- a/content/test/data/accessibility/html/table-presentation-expected-blink.txt +++ b/content/test/data/accessibility/html/table-presentation-expected-blink.txt
@@ -1,13 +1,15 @@ rootWebArea name='Table with role=presentation' -++genericContainer -++++staticText name='1' -++++++inlineTextBox name='1' -++genericContainer -++++staticText name='2' -++++++inlineTextBox name='2' -++genericContainer -++++staticText name='4' -++++++inlineTextBox name='4' -++genericContainer -++++staticText name='5' -++++++inlineTextBox name='5' \ No newline at end of file +++genericContainer ignored +++++presentational ignored +++++++genericContainer +++++++++staticText name='1' +++++++++++inlineTextBox name='1' +++++++genericContainer +++++++++staticText name='2' +++++++++++inlineTextBox name='2' +++++++genericContainer +++++++++staticText name='4' +++++++++++inlineTextBox name='4' +++++++genericContainer +++++++++staticText name='5' +++++++++++inlineTextBox name='5'
diff --git a/content/test/data/accessibility/html/table-simple-expected-blink.txt b/content/test/data/accessibility/html/table-simple-expected-blink.txt index 5a02eb6..5dac45b 100644 --- a/content/test/data/accessibility/html/table-simple-expected-blink.txt +++ b/content/test/data/accessibility/html/table-simple-expected-blink.txt
@@ -1,23 +1,24 @@ rootWebArea name='Table example' -++table -++++row -++++++columnHeader name='Pair' -++++++++staticText name='Pair' -++++++++++inlineTextBox name='Pair' -++++++columnHeader name='Single' -++++++++staticText name='Single' -++++++++++inlineTextBox name='Single' -++++row -++++++cell name='AB' -++++++++staticText name='AB' -++++++++++inlineTextBox name='AB' -++++++cell name='B' -++++++++staticText name='B' -++++++++++inlineTextBox name='B' -++++row -++++++cell name='CD' -++++++++staticText name='CD' -++++++++++inlineTextBox name='CD' -++++++cell name='D' -++++++++staticText name='D' -++++++++++inlineTextBox name='D' +++genericContainer ignored +++++table +++++++row +++++++++columnHeader name='Pair' +++++++++++staticText name='Pair' +++++++++++++inlineTextBox name='Pair' +++++++++columnHeader name='Single' +++++++++++staticText name='Single' +++++++++++++inlineTextBox name='Single' +++++++row +++++++++cell name='AB' +++++++++++staticText name='AB' +++++++++++++inlineTextBox name='AB' +++++++++cell name='B' +++++++++++staticText name='B' +++++++++++++inlineTextBox name='B' +++++++row +++++++++cell name='CD' +++++++++++staticText name='CD' +++++++++++++inlineTextBox name='CD' +++++++++cell name='D' +++++++++++staticText name='D' +++++++++++++inlineTextBox name='D'
diff --git a/content/test/data/accessibility/html/table-spans-expected-blink.txt b/content/test/data/accessibility/html/table-spans-expected-blink.txt index 1d9a046..9c4f8b5 100644 --- a/content/test/data/accessibility/html/table-spans-expected-blink.txt +++ b/content/test/data/accessibility/html/table-spans-expected-blink.txt
@@ -1,28 +1,29 @@ rootWebArea name='Table example with rowspan and colspan' -++table -++++row -++++++cell name='AD' -++++++++staticText name='AD' -++++++++++inlineTextBox name='AD' -++++++cell name='BC' -++++++++staticText name='BC' -++++++++++inlineTextBox name='BC' -++++row -++++++cell name='EF' -++++++++staticText name='EF' -++++++++++inlineTextBox name='EF' -++table -++++row -++++++cell name='AD' -++++++++staticText name='AD' -++++++++++inlineTextBox name='AD' -++++++cell name='BC' -++++++++staticText name='BC' -++++++++++inlineTextBox name='BC' -++++row -++++++cell name='EF' -++++++++staticText name='EF' -++++++++++inlineTextBox name='EF' -++++++cell name='GH' -++++++++staticText name='GH' -++++++++++inlineTextBox name='GH' +++genericContainer ignored +++++table +++++++row +++++++++cell name='AD' +++++++++++staticText name='AD' +++++++++++++inlineTextBox name='AD' +++++++++cell name='BC' +++++++++++staticText name='BC' +++++++++++++inlineTextBox name='BC' +++++++row +++++++++cell name='EF' +++++++++++staticText name='EF' +++++++++++++inlineTextBox name='EF' +++++table +++++++row +++++++++cell name='AD' +++++++++++staticText name='AD' +++++++++++++inlineTextBox name='AD' +++++++++cell name='BC' +++++++++++staticText name='BC' +++++++++++++inlineTextBox name='BC' +++++++row +++++++++cell name='EF' +++++++++++staticText name='EF' +++++++++++++inlineTextBox name='EF' +++++++++cell name='GH' +++++++++++staticText name='GH' +++++++++++++inlineTextBox name='GH'
diff --git a/content/test/data/accessibility/html/table-th-colheader-expected-blink.txt b/content/test/data/accessibility/html/table-th-colheader-expected-blink.txt index bd40bc2..1f1a9d4 100644 --- a/content/test/data/accessibility/html/table-th-colheader-expected-blink.txt +++ b/content/test/data/accessibility/html/table-th-colheader-expected-blink.txt
@@ -1,16 +1,17 @@ rootWebArea -++table -++++row -++++++columnHeader name='Firstname' -++++++++staticText name='Firstname' -++++++++++inlineTextBox name='Firstname' -++++++columnHeader name='Lastname' -++++++++staticText name='Lastname' -++++++++++inlineTextBox name='Lastname' -++++row -++++++cell name='Jill' -++++++++staticText name='Jill' -++++++++++inlineTextBox name='Jill' -++++++cell name='Smith' -++++++++staticText name='Smith' -++++++++++inlineTextBox name='Smith' +++genericContainer ignored +++++table +++++++row +++++++++columnHeader name='Firstname' +++++++++++staticText name='Firstname' +++++++++++++inlineTextBox name='Firstname' +++++++++columnHeader name='Lastname' +++++++++++staticText name='Lastname' +++++++++++++inlineTextBox name='Lastname' +++++++row +++++++++cell name='Jill' +++++++++++staticText name='Jill' +++++++++++++inlineTextBox name='Jill' +++++++++cell name='Smith' +++++++++++staticText name='Smith' +++++++++++++inlineTextBox name='Smith'
diff --git a/content/test/data/accessibility/html/table-th-rowheader-expected-blink.txt b/content/test/data/accessibility/html/table-th-rowheader-expected-blink.txt index 79bc45da..315fbdf 100644 --- a/content/test/data/accessibility/html/table-th-rowheader-expected-blink.txt +++ b/content/test/data/accessibility/html/table-th-rowheader-expected-blink.txt
@@ -1,16 +1,17 @@ rootWebArea name='Table example - th rowheader' -++table -++++row -++++++rowHeader name='Firstname' -++++++++staticText name='Firstname' -++++++++++inlineTextBox name='Firstname' -++++++cell name='Jill' -++++++++staticText name='Jill' -++++++++++inlineTextBox name='Jill' -++++row -++++++rowHeader name='Lastname' -++++++++staticText name='Lastname' -++++++++++inlineTextBox name='Lastname' -++++++cell name='Smith' -++++++++staticText name='Smith' -++++++++++inlineTextBox name='Smith' +++genericContainer ignored +++++table +++++++row +++++++++rowHeader name='Firstname' +++++++++++staticText name='Firstname' +++++++++++++inlineTextBox name='Firstname' +++++++++cell name='Jill' +++++++++++staticText name='Jill' +++++++++++++inlineTextBox name='Jill' +++++++row +++++++++rowHeader name='Lastname' +++++++++++staticText name='Lastname' +++++++++++++inlineTextBox name='Lastname' +++++++++cell name='Smith' +++++++++++staticText name='Smith' +++++++++++++inlineTextBox name='Smith'
diff --git a/content/test/data/accessibility/html/table-thead-tbody-tfoot-expected-blink.txt b/content/test/data/accessibility/html/table-thead-tbody-tfoot-expected-blink.txt index cd1b37b74..cc17c74 100644 --- a/content/test/data/accessibility/html/table-thead-tbody-tfoot-expected-blink.txt +++ b/content/test/data/accessibility/html/table-thead-tbody-tfoot-expected-blink.txt
@@ -1,30 +1,31 @@ rootWebArea name='Table example - thead, tbody, tfoot' -++table -++++row -++++++columnHeader name='Sum' -++++++++staticText name='Sum' -++++++++++inlineTextBox name='Sum' -++++++columnHeader name='Subtraction' -++++++++staticText name='Subtraction' -++++++++++inlineTextBox name='Subtraction' -++++row -++++++cell name='10' -++++++++staticText name='10' -++++++++++inlineTextBox name='10' -++++++cell name='7' -++++++++staticText name='7' -++++++++++inlineTextBox name='7' -++++row -++++++cell name='2' -++++++++staticText name='2' -++++++++++inlineTextBox name='2' -++++++cell name='4' -++++++++staticText name='4' -++++++++++inlineTextBox name='4' -++++row -++++++cell name='12' -++++++++staticText name='12' -++++++++++inlineTextBox name='12' -++++++cell name='3' -++++++++staticText name='3' -++++++++++inlineTextBox name='3' +++genericContainer ignored +++++table +++++++row +++++++++columnHeader name='Sum' +++++++++++staticText name='Sum' +++++++++++++inlineTextBox name='Sum' +++++++++columnHeader name='Subtraction' +++++++++++staticText name='Subtraction' +++++++++++++inlineTextBox name='Subtraction' +++++++row +++++++++cell name='10' +++++++++++staticText name='10' +++++++++++++inlineTextBox name='10' +++++++++cell name='7' +++++++++++staticText name='7' +++++++++++++inlineTextBox name='7' +++++++row +++++++++cell name='2' +++++++++++staticText name='2' +++++++++++++inlineTextBox name='2' +++++++++cell name='4' +++++++++++staticText name='4' +++++++++++++inlineTextBox name='4' +++++++row +++++++++cell name='12' +++++++++++staticText name='12' +++++++++++++inlineTextBox name='12' +++++++++cell name='3' +++++++++++staticText name='3' +++++++++++++inlineTextBox name='3'
diff --git a/content/test/data/accessibility/html/text-decoration-styles-expected-blink.txt b/content/test/data/accessibility/html/text-decoration-styles-expected-blink.txt index e1aee47..93574ab 100644 --- a/content/test/data/accessibility/html/text-decoration-styles-expected-blink.txt +++ b/content/test/data/accessibility/html/text-decoration-styles-expected-blink.txt
@@ -1,55 +1,56 @@ rootWebArea -++paragraph textOverlineStyle=solid -++++staticText name='overline style: none' textOverlineStyle=solid -++++++inlineTextBox name='overline style: none' -++paragraph textOverlineStyle=dotted -++++staticText name='overline style: dotted' textOverlineStyle=dotted -++++++inlineTextBox name='overline style: dotted' -++paragraph textOverlineStyle=dashed -++++staticText name='overline style: dashed' textOverlineStyle=dashed -++++++inlineTextBox name='overline style: dashed' -++paragraph textOverlineStyle=solid -++++staticText name='overline style: solid' textOverlineStyle=solid -++++++inlineTextBox name='overline style: solid' -++paragraph textOverlineStyle=double -++++staticText name='overline style: double' textOverlineStyle=double -++++++inlineTextBox name='overline style: double' -++paragraph textOverlineStyle=wavy -++++staticText name='overline style: wavy' textOverlineStyle=wavy -++++++inlineTextBox name='overline style: wavy' -++paragraph textUnderlineStyle=solid -++++staticText name='underline style: none' textUnderlineStyle=solid -++++++inlineTextBox name='underline style: none' -++paragraph textUnderlineStyle=dotted -++++staticText name='underline style: dotted' textUnderlineStyle=dotted -++++++inlineTextBox name='underline style: dotted' -++paragraph textUnderlineStyle=dashed -++++staticText name='underline style: dashed' textUnderlineStyle=dashed -++++++inlineTextBox name='underline style: dashed' -++paragraph textUnderlineStyle=solid -++++staticText name='underline style: solid' textUnderlineStyle=solid -++++++inlineTextBox name='underline style: solid' -++paragraph textUnderlineStyle=double -++++staticText name='underline style: double' textUnderlineStyle=double -++++++inlineTextBox name='underline style: double' -++paragraph textUnderlineStyle=wavy -++++staticText name='underline style: wavy' textUnderlineStyle=wavy -++++++inlineTextBox name='underline style: wavy' -++paragraph textStrikethroughStyle=solid -++++staticText name='line-through style: none' textStrikethroughStyle=solid -++++++inlineTextBox name='line-through style: none' -++paragraph textStrikethroughStyle=dotted -++++staticText name='line-through style: dotted' textStrikethroughStyle=dotted -++++++inlineTextBox name='line-through style: dotted' -++paragraph textStrikethroughStyle=dashed -++++staticText name='line-through style: dashed' textStrikethroughStyle=dashed -++++++inlineTextBox name='line-through style: dashed' -++paragraph textStrikethroughStyle=solid -++++staticText name='line-through style: solid' textStrikethroughStyle=solid -++++++inlineTextBox name='line-through style: solid' -++paragraph textStrikethroughStyle=double -++++staticText name='line-through style: double' textStrikethroughStyle=double -++++++inlineTextBox name='line-through style: double' -++paragraph textStrikethroughStyle=wavy -++++staticText name='line-through style: wavy' textStrikethroughStyle=wavy -++++++inlineTextBox name='line-through style: wavy' +++genericContainer ignored +++++paragraph textOverlineStyle=solid +++++++staticText name='overline style: none' textOverlineStyle=solid +++++++++inlineTextBox name='overline style: none' +++++paragraph textOverlineStyle=dotted +++++++staticText name='overline style: dotted' textOverlineStyle=dotted +++++++++inlineTextBox name='overline style: dotted' +++++paragraph textOverlineStyle=dashed +++++++staticText name='overline style: dashed' textOverlineStyle=dashed +++++++++inlineTextBox name='overline style: dashed' +++++paragraph textOverlineStyle=solid +++++++staticText name='overline style: solid' textOverlineStyle=solid +++++++++inlineTextBox name='overline style: solid' +++++paragraph textOverlineStyle=double +++++++staticText name='overline style: double' textOverlineStyle=double +++++++++inlineTextBox name='overline style: double' +++++paragraph textOverlineStyle=wavy +++++++staticText name='overline style: wavy' textOverlineStyle=wavy +++++++++inlineTextBox name='overline style: wavy' +++++paragraph textUnderlineStyle=solid +++++++staticText name='underline style: none' textUnderlineStyle=solid +++++++++inlineTextBox name='underline style: none' +++++paragraph textUnderlineStyle=dotted +++++++staticText name='underline style: dotted' textUnderlineStyle=dotted +++++++++inlineTextBox name='underline style: dotted' +++++paragraph textUnderlineStyle=dashed +++++++staticText name='underline style: dashed' textUnderlineStyle=dashed +++++++++inlineTextBox name='underline style: dashed' +++++paragraph textUnderlineStyle=solid +++++++staticText name='underline style: solid' textUnderlineStyle=solid +++++++++inlineTextBox name='underline style: solid' +++++paragraph textUnderlineStyle=double +++++++staticText name='underline style: double' textUnderlineStyle=double +++++++++inlineTextBox name='underline style: double' +++++paragraph textUnderlineStyle=wavy +++++++staticText name='underline style: wavy' textUnderlineStyle=wavy +++++++++inlineTextBox name='underline style: wavy' +++++paragraph textStrikethroughStyle=solid +++++++staticText name='line-through style: none' textStrikethroughStyle=solid +++++++++inlineTextBox name='line-through style: none' +++++paragraph textStrikethroughStyle=dotted +++++++staticText name='line-through style: dotted' textStrikethroughStyle=dotted +++++++++inlineTextBox name='line-through style: dotted' +++++paragraph textStrikethroughStyle=dashed +++++++staticText name='line-through style: dashed' textStrikethroughStyle=dashed +++++++++inlineTextBox name='line-through style: dashed' +++++paragraph textStrikethroughStyle=solid +++++++staticText name='line-through style: solid' textStrikethroughStyle=solid +++++++++inlineTextBox name='line-through style: solid' +++++paragraph textStrikethroughStyle=double +++++++staticText name='line-through style: double' textStrikethroughStyle=double +++++++++inlineTextBox name='line-through style: double' +++++paragraph textStrikethroughStyle=wavy +++++++staticText name='line-through style: wavy' textStrikethroughStyle=wavy +++++++++inlineTextBox name='line-through style: wavy'
diff --git a/content/test/data/accessibility/html/title-changed-expected-blink.txt b/content/test/data/accessibility/html/title-changed-expected-blink.txt index 2f6448e..2199bd8b 100644 --- a/content/test/data/accessibility/html/title-changed-expected-blink.txt +++ b/content/test/data/accessibility/html/title-changed-expected-blink.txt
@@ -1 +1,2 @@ rootWebArea name='New Title' +++genericContainer ignored
diff --git a/content/test/data/accessibility/html/title-expected-blink.txt b/content/test/data/accessibility/html/title-expected-blink.txt index f42e87f..265b4fc1 100644 --- a/content/test/data/accessibility/html/title-expected-blink.txt +++ b/content/test/data/accessibility/html/title-expected-blink.txt
@@ -1 +1,2 @@ -rootWebArea name='Title of the document' \ No newline at end of file +rootWebArea name='Title of the document' +++genericContainer ignored
diff --git a/content/test/data/accessibility/html/truncate-label-expected-blink.txt b/content/test/data/accessibility/html/truncate-label-expected-blink.txt index c8f8f97..8485a24 100644 --- a/content/test/data/accessibility/html/truncate-label-expected-blink.txt +++ b/content/test/data/accessibility/html/truncate-label-expected-blink.txt
@@ -1,2 +1,3 @@ rootWebArea -++genericContainer name='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' +++genericContainer ignored +++++genericContainer name='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
diff --git a/content/test/data/accessibility/html/ul-expected-blink.txt b/content/test/data/accessibility/html/ul-expected-blink.txt index c0ead70..9ae64fe 100644 --- a/content/test/data/accessibility/html/ul-expected-blink.txt +++ b/content/test/data/accessibility/html/ul-expected-blink.txt
@@ -1,14 +1,15 @@ rootWebArea -++list -++++listItem -++++++listMarker name='• ' -++++++staticText name='Item 1' -++++++++inlineTextBox name='Item 1' -++++listItem -++++++listMarker name='• ' -++++++staticText name='Item 2' -++++++++inlineTextBox name='Item 2' -++++listItem -++++++listMarker name='• ' -++++++staticText name='Item 3' -++++++++inlineTextBox name='Item 3' +++genericContainer ignored +++++list +++++++listItem +++++++++listMarker name='• ' +++++++++staticText name='Item 1' +++++++++++inlineTextBox name='Item 1' +++++++listItem +++++++++listMarker name='• ' +++++++++staticText name='Item 2' +++++++++++inlineTextBox name='Item 2' +++++++listItem +++++++++listMarker name='• ' +++++++++staticText name='Item 3' +++++++++++inlineTextBox name='Item 3'
diff --git a/content/test/data/accessibility/html/window-crops-items-expected-blink.txt b/content/test/data/accessibility/html/window-crops-items-expected-blink.txt index 6380df7e..9535a5d9 100644 --- a/content/test/data/accessibility/html/window-crops-items-expected-blink.txt +++ b/content/test/data/accessibility/html/window-crops-items-expected-blink.txt
@@ -1,9 +1,9 @@ rootWebArea -++button size=(300, 150) name='Button fits' -++button offscreen size=(300, 150) pageSize=(1, 150) name='Button offscreen X' -++button offscreen size=(300, 150) pageSize=(300, 1) name='Button offscreen Y' -++button size=(300, 150) name='Button partially on screen' -++button offscreen size=(300, 150) pageSize=(1, 1) name='Button offscreen' -++button offscreen size=(300, 150) pageSize=(1, 1) name='Button offscreen top' -++button size=(300, 150) pageSize=(208, 58) name='Button partially on screen' -<-- End-of-file --> \ No newline at end of file +++genericContainer ignored +++++button size=(300, 150) name='Button fits' +++++button offscreen size=(300, 150) pageSize=(1, 150) name='Button offscreen X' +++++button offscreen size=(300, 150) pageSize=(300, 1) name='Button offscreen Y' +++++button size=(300, 150) name='Button partially on screen' +++++button offscreen size=(300, 150) pageSize=(1, 1) name='Button offscreen' +++++button offscreen size=(300, 150) pageSize=(1, 1) name='Button offscreen top' +++++button size=(300, 150) pageSize=(208, 58) name='Button partially on screen'
diff --git a/content/test/data/accessibility/language-detection/basic-expected-blink.txt b/content/test/data/accessibility/language-detection/basic-expected-blink.txt index 2eb6e1e..c6648f0 100644 --- a/content/test/data/accessibility/language-detection/basic-expected-blink.txt +++ b/content/test/data/accessibility/language-detection/basic-expected-blink.txt
@@ -1,5 +1,6 @@ rootWebArea language='en-US' -++genericContainer language='fr' -++++staticText language='en' name='“The famous pipe. How people reproached me for it! And yet, could you stuff my pipe? No, it’s just a representation, is it not? So if I had written on my picture ‘This is a pipe,’ I’d have been lying!"' -++genericContainer language='en' -++++staticText language='fr' name='« La fameuse pipe, me l’a-t-on assez reprochée ! Et pourtant, pouvez-vous la bourrer ma pipe ? Non, n’est-ce pas, elle n’est qu’une représentation. Donc si j’avais écrit sous mon tableau « ceci est une pipe », j’aurais menti ! »' +++genericContainer ignored language='en-GB' +++++genericContainer language='fr' +++++++staticText language='en' name='“The famous pipe. How people reproached me for it! And yet, could you stuff my pipe? No, it’s just a representation, is it not? So if I had written on my picture ‘This is a pipe,’ I’d have been lying!"' +++++genericContainer language='en' +++++++staticText language='fr' name='« La fameuse pipe, me l’a-t-on assez reprochée ! Et pourtant, pouvez-vous la bourrer ma pipe ? Non, n’est-ce pas, elle n’est qu’une représentation. Donc si j’avais écrit sous mon tableau « ceci est une pipe », j’aurais menti ! »'
diff --git a/content/test/data/accessibility/language-detection/lang-attribute-nested-expected-blink.txt b/content/test/data/accessibility/language-detection/lang-attribute-nested-expected-blink.txt index 5596a314..cb6c7c1 100644 --- a/content/test/data/accessibility/language-detection/lang-attribute-nested-expected-blink.txt +++ b/content/test/data/accessibility/language-detection/lang-attribute-nested-expected-blink.txt
@@ -1,11 +1,13 @@ rootWebArea language='en-US' -++genericContainer language='en' +++genericContainer ignored language='en' +++++genericContainer ignored language='es-ES' +++++++genericContainer language='en' +++++++++staticText language='en' name='This document is excellent.' +++++++++++inlineTextBox language='en' name='This document is excellent.' +++++++staticText language='es-ES' name='Este documento es excelente.' +++++++++inlineTextBox language='es-ES' name='Este documento es excelente.' +++++genericContainer language='fr' +++++++staticText language='fr' name='Ce document est excellent.' +++++++++inlineTextBox language='fr' name='Ce document est excellent.' ++++staticText language='en' name='This document is excellent.' ++++++inlineTextBox language='en' name='This document is excellent.' -++staticText language='es-ES' name='Este documento es excelente.' -++++inlineTextBox language='es-ES' name='Este documento es excelente.' -++genericContainer language='fr' -++++staticText language='fr' name='Ce document est excellent.' -++++++inlineTextBox language='fr' name='Ce document est excellent.' -++staticText language='en' name='This document is excellent.' -++++inlineTextBox language='en' name='This document is excellent.'
diff --git a/content/test/data/accessibility/language-detection/lang-attribute-switching-expected-blink.txt b/content/test/data/accessibility/language-detection/lang-attribute-switching-expected-blink.txt index db989ad..5f607759 100644 --- a/content/test/data/accessibility/language-detection/lang-attribute-switching-expected-blink.txt +++ b/content/test/data/accessibility/language-detection/lang-attribute-switching-expected-blink.txt
@@ -1,12 +1,13 @@ rootWebArea language='en-US' -++paragraph language='en' -++++staticText language='en' name='In the morning, I sometimes eat breakfast.' -++++++inlineTextBox language='en' name='In the morning, I sometimes eat breakfast.' -++paragraph language='fr' -++++staticText language='fr' name='Dans l'apres-midi, je dejeune.' -++++++inlineTextBox language='fr' name='Dans l'apres-midi, je dejeune.' -++paragraph language='en' -++++staticText language='en' name='Hello it's a pleasure to meet you. ' -++++++inlineTextBox language='en' name='Hello it's a pleasure to meet you. ' -++++staticText language='fr' name='Comment ca va?' -++++++inlineTextBox language='fr' name='Comment ca va?' +++genericContainer ignored language='en' +++++paragraph language='en' +++++++staticText language='en' name='In the morning, I sometimes eat breakfast.' +++++++++inlineTextBox language='en' name='In the morning, I sometimes eat breakfast.' +++++paragraph language='fr' +++++++staticText language='fr' name='Dans l'apres-midi, je dejeune.' +++++++++inlineTextBox language='fr' name='Dans l'apres-midi, je dejeune.' +++++paragraph language='en' +++++++staticText language='en' name='Hello it's a pleasure to meet you. ' +++++++++inlineTextBox language='en' name='Hello it's a pleasure to meet you. ' +++++++staticText language='fr' name='Comment ca va?' +++++++++inlineTextBox language='fr' name='Comment ca va?'
diff --git a/content/test/data/accessibility/regression/xml-in-iframe-crash-expected-blink.txt b/content/test/data/accessibility/regression/xml-in-iframe-crash-expected-blink.txt index ab8ac60a..d992263 100644 --- a/content/test/data/accessibility/regression/xml-in-iframe-crash-expected-blink.txt +++ b/content/test/data/accessibility/regression/xml-in-iframe-crash-expected-blink.txt
@@ -1,3 +1,6 @@ rootWebArea -++iframe -++++rootWebArea +++genericContainer ignored +++++iframe +++++++rootWebArea +++++++++genericContainer ignored +++++genericContainer ignored
diff --git a/content/test/data/accessibility/test-harness/deny-node-expected-blink.txt b/content/test/data/accessibility/test-harness/deny-node-expected-blink.txt index 3a0424f..f51e3a2 100644 --- a/content/test/data/accessibility/test-harness/deny-node-expected-blink.txt +++ b/content/test/data/accessibility/test-harness/deny-node-expected-blink.txt
@@ -1,15 +1,16 @@ rootWebArea -++genericContainer -++++staticText name='This is a very important form full of very important form related things to fill in, it is likely the most important form you will see within the next 100 milliseconds. You may think I am just rambling, but this is rambling with a purpose! We need enough content in this div to force splitting across multiple inlineTextBox-en which we can then ignore using *-DENY-NODE.' -++form -++++paragraph -++++++staticText name='Please provide your details:' -++++labelText -++++++staticText name='Quack:' -++++textField name='Quack:' -++++++genericContainer -++++labelText -++++++staticText name='Moo?:' -++++radioButton name='Mooooo!' checkedState=false -++++radioButton name='Mooooo?' checkedState=false -++++button name='Submit' +++genericContainer ignored +++++genericContainer +++++++staticText name='This is a very important form full of very important form related things to fill in, it is likely the most important form you will see within the next 100 milliseconds. You may think I am just rambling, but this is rambling with a purpose! We need enough content in this div to force splitting across multiple inlineTextBox-en which we can then ignore using *-DENY-NODE.' +++++form +++++++paragraph +++++++++staticText name='Please provide your details:' +++++++labelText +++++++++staticText name='Quack:' +++++++textField name='Quack:' +++++++++genericContainer +++++++labelText +++++++++staticText name='Moo?:' +++++++radioButton name='Mooooo!' checkedState=false +++++++radioButton name='Mooooo?' checkedState=false +++++++button name='Submit'
diff --git a/device/bluetooth/bluez/bluetooth_bluez_unittest.cc b/device/bluetooth/bluez/bluetooth_bluez_unittest.cc index b35e200b..c411b3f 100644 --- a/device/bluetooth/bluez/bluetooth_bluez_unittest.cc +++ b/device/bluetooth/bluez/bluetooth_bluez_unittest.cc
@@ -11,11 +11,11 @@ #include "base/bind.h" #include "base/bind_helpers.h" -#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop_current.h" #include "base/run_loop.h" #include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_task_environment.h" #include "dbus/object_path.h" #include "device/bluetooth/bluetooth_adapter.h" #include "device/bluetooth/bluetooth_adapter_factory.h" @@ -274,7 +274,7 @@ } protected: - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; bluez::FakeBluetoothAdapterClient* fake_bluetooth_adapter_client_; bluez::FakeBluetoothDeviceClient* fake_bluetooth_device_client_; scoped_refptr<BluetoothAdapter> adapter_;
diff --git a/device/bluetooth/bluez/bluetooth_gatt_bluez_unittest.cc b/device/bluetooth/bluez/bluetooth_gatt_bluez_unittest.cc index 2352201..484351b 100644 --- a/device/bluetooth/bluez/bluetooth_gatt_bluez_unittest.cc +++ b/device/bluetooth/bluez/bluetooth_gatt_bluez_unittest.cc
@@ -11,9 +11,9 @@ #include "base/bind.h" #include "base/bind_helpers.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/test/bind_test_util.h" +#include "base/test/scoped_task_environment.h" #include "dbus/object_path.h" #include "device/bluetooth/bluetooth_adapter.h" #include "device/bluetooth/bluetooth_adapter_factory.h" @@ -287,7 +287,7 @@ base::RunLoop::QuitCurrentWhenIdleDeprecated(); } - base::MessageLoop message_loop_; + base::test::ScopedTaskEnvironment scoped_task_environment_; bluez::FakeBluetoothDeviceClient* fake_bluetooth_device_client_; bluez::FakeBluetoothGattServiceClient* fake_bluetooth_gatt_service_client_;
diff --git a/device/fido/bio/enrollment.cc b/device/fido/bio/enrollment.cc index 12f35398..44b1407 100644 --- a/device/fido/bio/enrollment.cc +++ b/device/fido/bio/enrollment.cc
@@ -69,6 +69,19 @@ return request; } +// static +BioEnrollmentRequest BioEnrollmentRequest::ForEnumerate( + const pin::TokenResponse& response) { + BioEnrollmentRequest request; + request.modality = BioEnrollmentModality::kFingerprint; + request.subcommand = BioEnrollmentSubCommand::kEnumerateEnrollments; + request.pin_protocol = 1; + request.pin_auth = response.PinAuth( + std::vector<uint8_t>{static_cast<int>(*request.modality), + static_cast<int>(*request.subcommand)}); + return request; +} + BioEnrollmentRequest::BioEnrollmentRequest(BioEnrollmentRequest&&) = default; BioEnrollmentRequest& BioEnrollmentRequest::operator=(BioEnrollmentRequest&&) = default; @@ -169,6 +182,45 @@ response.remaining_samples = it->second.GetUnsigned(); } + // enumerated template infos + it = response_map.find( + cbor::Value(static_cast<int>(BioEnrollmentResponseKey::kTemplateInfos))); + if (it != response_map.end()) { + if (!it->second.is_array()) { + return base::nullopt; + } + + std::vector<std::pair<std::vector<uint8_t>, std::string>> enumerated_ids; + for (const auto& bio_template : it->second.GetArray()) { + if (!bio_template.is_map()) { + return base::nullopt; + } + const cbor::Value::MapValue& template_map = bio_template.GetMap(); + + // id (required) + auto template_it = template_map.find(cbor::Value( + static_cast<int>(BioEnrollmentTemplateInfoParam::kTemplateId))); + if (template_it == template_map.end() || + !template_it->second.is_bytestring()) { + return base::nullopt; + } + std::vector<uint8_t> id = template_it->second.GetBytestring(); + + // name (optional) + std::string name; + template_it = template_map.find(cbor::Value(static_cast<int>( + BioEnrollmentTemplateInfoParam::kTemplateFriendlyName))); + if (template_it != template_map.end()) { + if (!template_it->second.is_string()) { + return base::nullopt; + } + name = template_it->second.GetString(); + } + enumerated_ids.push_back(std::make_pair(std::move(id), std::move(name))); + } + response.enumerated_ids = std::move(enumerated_ids); + } + return response; } @@ -176,6 +228,14 @@ BioEnrollmentResponse::BioEnrollmentResponse(BioEnrollmentResponse&&) = default; BioEnrollmentResponse::~BioEnrollmentResponse() = default; +bool BioEnrollmentResponse::operator==(const BioEnrollmentResponse& r) const { + return modality == r.modality && fingerprint_kind == r.fingerprint_kind && + max_samples_for_enroll == r.max_samples_for_enroll && + template_id == r.template_id && last_status == r.last_status && + remaining_samples == r.remaining_samples && + enumerated_ids == r.enumerated_ids; +} + std::pair<CtapRequestCommand, base::Optional<cbor::Value>> AsCTAPRequestValuePair(const BioEnrollmentRequest& request) { cbor::Value::MapValue map;
diff --git a/device/fido/bio/enrollment.h b/device/fido/bio/enrollment.h index be9ce8c..58e6242 100644 --- a/device/fido/bio/enrollment.h +++ b/device/fido/bio/enrollment.h
@@ -108,6 +108,7 @@ const pin::TokenResponse& pin_token, std::vector<uint8_t> template_id); static BioEnrollmentRequest ForCancel(); + static BioEnrollmentRequest ForEnumerate(const pin::TokenResponse&); base::Optional<BioEnrollmentModality> modality; base::Optional<BioEnrollmentSubCommand> subcommand; @@ -133,12 +134,16 @@ BioEnrollmentResponse& operator=(BioEnrollmentResponse&&) = default; ~BioEnrollmentResponse(); + bool operator==(const BioEnrollmentResponse&) const; + base::Optional<BioEnrollmentModality> modality; base::Optional<BioEnrollmentFingerprintKind> fingerprint_kind; base::Optional<uint8_t> max_samples_for_enroll; base::Optional<std::vector<uint8_t>> template_id; base::Optional<BioEnrollmentSampleStatus> last_status; base::Optional<uint8_t> remaining_samples; + base::Optional<std::vector<std::pair<std::vector<uint8_t>, std::string>>> + enumerated_ids; }; COMPONENT_EXPORT(DEVICE_FIDO)
diff --git a/device/fido/bio/enrollment_handler.cc b/device/fido/bio/enrollment_handler.cc index 88c87ca6..265f928 100644 --- a/device/fido/bio/enrollment_handler.cc +++ b/device/fido/bio/enrollment_handler.cc
@@ -58,13 +58,14 @@ } } -void BioEnrollmentHandler::Enroll(ResponseCallback callback) { +void BioEnrollmentHandler::EnrollTemplate(ResponseCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker); response_callback_ = std::move(callback); authenticator_->BioEnrollFingerprint( - *pin_token_response_, base::BindRepeating(&BioEnrollmentHandler::OnEnroll, - weak_factory_.GetWeakPtr())); + *pin_token_response_, + base::BindRepeating(&BioEnrollmentHandler::OnEnrollTemplate, + weak_factory_.GetWeakPtr())); } void BioEnrollmentHandler::Cancel(base::OnceClosure callback) { @@ -75,6 +76,16 @@ &BioEnrollmentHandler::OnCancel, weak_factory_.GetWeakPtr())); } +void BioEnrollmentHandler::EnumerateTemplates(ResponseCallback callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker); + + response_callback_ = std::move(callback); + authenticator_->BioEnrollEnumerate( + *pin_token_response_, + base::BindOnce(&BioEnrollmentHandler::OnEnumerateTemplates, + weak_factory_.GetWeakPtr())); +} + void BioEnrollmentHandler::DispatchRequest(FidoAuthenticator* authenticator) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker); authenticator->GetTouch(base::BindOnce(&BioEnrollmentHandler::OnTouch, @@ -191,9 +202,19 @@ std::move(ready_callback_).Run(); } -void BioEnrollmentHandler::OnEnroll( +void BioEnrollmentHandler::OnEnrollTemplate( CtapDeviceResponseCode code, base::Optional<BioEnrollmentResponse> response) { + if (code != CtapDeviceResponseCode::kSuccess) { + // Response is not valid if operation was not successful. + std::move(response_callback_).Run(code, base::nullopt); + return; + } + if (!response || !response->last_status || !response->remaining_samples) { + std::move(response_callback_) + .Run(CtapDeviceResponseCode::kCtap2ErrOther, base::nullopt); + return; + } FIDO_LOG(DEBUG) << "Finished bio enrollment with code " << static_cast<int>(code); std::move(response_callback_).Run(code, std::move(response)); @@ -204,4 +225,22 @@ std::move(status_callback_).Run(); } +void BioEnrollmentHandler::OnEnumerateTemplates( + CtapDeviceResponseCode code, + base::Optional<BioEnrollmentResponse> response) { + if (code != CtapDeviceResponseCode::kSuccess) { + // Response is not valid if operation was not successful. + // Note that an empty enumeration returns kCtap2ErrInvalidOption. + std::move(response_callback_).Run(code, base::nullopt); + return; + } + if (!response || !response->enumerated_ids) { + // Response must have enumerated_ids. + std::move(response_callback_) + .Run(CtapDeviceResponseCode::kCtap2ErrOther, base::nullopt); + return; + } + std::move(response_callback_).Run(code, std::move(response)); +} + } // namespace device
diff --git a/device/fido/bio/enrollment_handler.h b/device/fido/bio/enrollment_handler.h index 3bdf0c0..68cddaa 100644 --- a/device/fido/bio/enrollment_handler.h +++ b/device/fido/bio/enrollment_handler.h
@@ -42,8 +42,9 @@ void GetModality(ResponseCallback); void GetSensorInfo(ResponseCallback); - void Enroll(ResponseCallback); + void EnrollTemplate(ResponseCallback); void Cancel(base::OnceClosure); + void EnumerateTemplates(ResponseCallback); private: // FidoRequestHandlerBase: @@ -59,8 +60,11 @@ base::Optional<pin::KeyAgreementResponse>); void OnHavePINToken(CtapDeviceResponseCode, base::Optional<pin::TokenResponse>); - void OnEnroll(CtapDeviceResponseCode, base::Optional<BioEnrollmentResponse>); + void OnEnrollTemplate(CtapDeviceResponseCode, + base::Optional<BioEnrollmentResponse>); void OnCancel(CtapDeviceResponseCode, base::Optional<BioEnrollmentResponse>); + void OnEnumerateTemplates(CtapDeviceResponseCode, + base::Optional<BioEnrollmentResponse>); SEQUENCE_CHECKER(sequence_checker);
diff --git a/device/fido/bio/enrollment_handler_unittest.cc b/device/fido/bio/enrollment_handler_unittest.cc index b70bb7c7..67d522f4 100644 --- a/device/fido/bio/enrollment_handler_unittest.cc +++ b/device/fido/bio/enrollment_handler_unittest.cc
@@ -66,17 +66,18 @@ handler->GetModality(cb.callback()); cb.WaitForCallback(); + // Operation was successful. auto result = cb.TakeResult(); EXPECT_EQ(std::get<0>(result), CtapDeviceResponseCode::kSuccess); + // Result is valid. auto v = std::move(std::get<1>(result)); EXPECT_TRUE(v); - EXPECT_EQ(v->modality, BioEnrollmentModality::kFingerprint); - EXPECT_FALSE(v->fingerprint_kind); - EXPECT_FALSE(v->max_samples_for_enroll); - EXPECT_FALSE(v->template_id); - EXPECT_FALSE(v->last_status); - EXPECT_FALSE(v->remaining_samples); + + // Result is correct. + BioEnrollmentResponse expected; + expected.modality = BioEnrollmentModality::kFingerprint; + EXPECT_EQ(v, expected); } // Tests getting authenticator modality without pin auth. @@ -101,12 +102,12 @@ auto v = std::move(std::get<1>(result)); EXPECT_TRUE(v); - EXPECT_EQ(v->modality, BioEnrollmentModality::kFingerprint); - EXPECT_EQ(v->fingerprint_kind, BioEnrollmentFingerprintKind::kTouch); - EXPECT_EQ(v->max_samples_for_enroll, 7); - EXPECT_FALSE(v->template_id); - EXPECT_FALSE(v->last_status); - EXPECT_FALSE(v->remaining_samples); + + BioEnrollmentResponse expected; + expected.modality = BioEnrollmentModality::kFingerprint; + expected.fingerprint_kind = BioEnrollmentFingerprintKind::kTouch; + expected.max_samples_for_enroll = 7; + EXPECT_EQ(v, expected); } // Tests bio enrollment commands against an authenticator lacking support. @@ -156,19 +157,18 @@ test::StatusAndValueCallbackReceiver<CtapDeviceResponseCode, base::Optional<BioEnrollmentResponse>> cb; - handler->Enroll(cb.callback()); + handler->EnrollTemplate(cb.callback()); cb.WaitForCallback(); EXPECT_EQ(cb.status(), CtapDeviceResponseCode::kSuccess); auto v = std::move(std::get<1>(cb.TakeResult())); EXPECT_TRUE(v); - EXPECT_FALSE(v->modality); - EXPECT_FALSE(v->fingerprint_kind); - EXPECT_FALSE(v->max_samples_for_enroll); - EXPECT_FALSE(v->template_id); - EXPECT_EQ(v->last_status, BioEnrollmentSampleStatus::kGood); - EXPECT_EQ(v->remaining_samples, 0); + + BioEnrollmentResponse expected; + expected.last_status = BioEnrollmentSampleStatus::kGood; + expected.remaining_samples = 0; + EXPECT_EQ(v, expected); } // Tests cancelling fingerprint without an ongoing enrollment. @@ -187,5 +187,33 @@ cb.WaitForCallback(); } +TEST_F(BioEnrollmentHandlerTest, Enumerate) { + VirtualCtap2Device::Config config; + config.pin_support = true; + config.bio_enrollment_support = true; + + virtual_device_factory_.SetCtap2Config(config); + + auto handler = MakeHandler(); + ready_callback_.WaitForCallback(); + + test::StatusAndValueCallbackReceiver<CtapDeviceResponseCode, + base::Optional<BioEnrollmentResponse>> + cb; + handler->EnumerateTemplates(cb.callback()); + + cb.WaitForCallback(); + EXPECT_EQ(cb.status(), CtapDeviceResponseCode::kSuccess); + + auto v = std::move(std::get<1>(cb.TakeResult())); + EXPECT_TRUE(v); + + BioEnrollmentResponse expected; + expected.enumerated_ids = + std::vector<std::pair<std::vector<uint8_t>, std::string>>{ + {{0, 0, 0, 1}, "Template0001"}}; + EXPECT_EQ(v, expected); +} + } // namespace } // namespace device
diff --git a/device/fido/fido_authenticator.cc b/device/fido/fido_authenticator.cc index 75635759..4f5fc96 100644 --- a/device/fido/fido_authenticator.cc +++ b/device/fido/fido_authenticator.cc
@@ -100,6 +100,11 @@ NOTREACHED(); } +void FidoAuthenticator::BioEnrollEnumerate(pin::TokenResponse, + BioEnrollmentCallback) { + NOTREACHED(); +} + void FidoAuthenticator::Reset(ResetCallback callback) { std::move(callback).Run(CtapDeviceResponseCode::kCtap1ErrInvalidCommand, base::nullopt);
diff --git a/device/fido/fido_authenticator.h b/device/fido/fido_authenticator.h index c8a5b4a..afe0093 100644 --- a/device/fido/fido_authenticator.h +++ b/device/fido/fido_authenticator.h
@@ -173,6 +173,7 @@ virtual void GetSensorInfo(BioEnrollmentCallback callback); virtual void BioEnrollFingerprint(pin::TokenResponse, BioEnrollmentCallback); virtual void BioEnrollCancel(BioEnrollmentCallback); + virtual void BioEnrollEnumerate(pin::TokenResponse, BioEnrollmentCallback); // Reset triggers a reset operation on the authenticator. This erases all // stored resident keys and any configured PIN.
diff --git a/device/fido/fido_device_authenticator.cc b/device/fido/fido_device_authenticator.cc index b607ca6..6291da93 100644 --- a/device/fido/fido_device_authenticator.cc +++ b/device/fido/fido_device_authenticator.cc
@@ -559,6 +559,21 @@ base::BindOnce(&BioEnrollmentResponse::Parse)); } +void FidoDeviceAuthenticator::BioEnrollEnumerate( + pin::TokenResponse token, + BioEnrollmentCallback callback) { + DCHECK( + Options()->bio_enrollment_availability_preview != + AuthenticatorSupportedOptions::BioEnrollmentAvailability::kNotSupported); + + operation_ = std::make_unique< + Ctap2DeviceOperation<BioEnrollmentRequest, BioEnrollmentResponse>>( + device_.get(), BioEnrollmentRequest::ForEnumerate(std::move(token)), + std::move(callback), base::BindOnce(&BioEnrollmentResponse::Parse), + /*string_fixup_predicate=*/nullptr); + operation_->Start(); +} + void FidoDeviceAuthenticator::Reset(ResetCallback callback) { DCHECK(device_->SupportedProtocolIsInitialized()) << "InitializeAuthenticator() must be called first.";
diff --git a/device/fido/fido_device_authenticator.h b/device/fido/fido_device_authenticator.h index b3fbdfa9..6e8cdde4 100644 --- a/device/fido/fido_device_authenticator.h +++ b/device/fido/fido_device_authenticator.h
@@ -83,6 +83,7 @@ void GetSensorInfo(BioEnrollmentCallback callback) override; void BioEnrollFingerprint(pin::TokenResponse, BioEnrollmentCallback) override; void BioEnrollCancel(BioEnrollmentCallback) override; + void BioEnrollEnumerate(pin::TokenResponse, BioEnrollmentCallback) override; void Reset(ResetCallback callback) override; void Cancel() override;
diff --git a/device/fido/virtual_ctap2_device.cc b/device/fido/virtual_ctap2_device.cc index 13d720231..b7097cb 100644 --- a/device/fido/virtual_ctap2_device.cc +++ b/device/fido/virtual_ctap2_device.cc
@@ -1364,6 +1364,17 @@ return CtapDeviceResponseCode::kCtap2ErrCBORUnexpectedType; } + cbor::Value::MapValue id0; + id0.emplace(cbor::Value(static_cast<int>( + BioEnrollmentTemplateInfoParam::kTemplateId)), + cbor::Value::BinaryValue{0, 0, 0, 1}); + id0.emplace(cbor::Value(static_cast<int>( + BioEnrollmentTemplateInfoParam::kTemplateFriendlyName)), + cbor::Value("Template0001")); + + cbor::Value::ArrayValue enumerated_ids; + enumerated_ids.emplace_back(id0); + switch (it->second.GetUnsigned()) { case static_cast<int>(SubCmd::kGetFingerprintSensorInfo): response_map.emplace( @@ -1396,6 +1407,11 @@ break; case static_cast<int>(SubCmd::kCancelCurrentEnrollment): return CtapDeviceResponseCode::kSuccess; + case static_cast<int>(SubCmd::kEnumerateEnrollments): + response_map.emplace( + static_cast<int>(BioEnrollmentResponseKey::kTemplateInfos), + enumerated_ids); + break; default: // Handle all other commands as if they were unsupported (will change // when support is added).
diff --git a/docs/chromeos_build_instructions.md b/docs/chromeos_build_instructions.md index 164f5deb..87ca5c7 100644 --- a/docs/chromeos_build_instructions.md +++ b/docs/chromeos_build_instructions.md
@@ -76,7 +76,8 @@ `--user-data-dir=/tmp/chrome --login-manager` * Go through the out-of-the-box UX and sign in with a real Gmail account. * For subsequent runs, add: - `--user-data-dir=/tmp/chrome --login-user=username@gmail.com` + `--user-data-dir=/tmp/chrome --login-user=username@gmail.com + --login-profile=username@gmail.com-hash` * To run in guest mode instantly, add: `--user-data-dir=/tmp/chrome --bwsi --incognito --login-user='$guest' --login-profile=user`
diff --git a/docs/gpu/gpu_testing.md b/docs/gpu/gpu_testing.md index cf9519f1..c0eb4528 100644 --- a/docs/gpu/gpu_testing.md +++ b/docs/gpu/gpu_testing.md
@@ -364,6 +364,10 @@ See the [Swarming documentation] for instructions on how to upload your binaries to the isolate server and trigger execution on Swarming. +Be sure to use the correct swarming dimensions for your desired GPU e.g. "1002:6613" instead of "AMD Radeon R7 240 (1002:6613)" which is how it appears on swarming task page. You can query bots in the Chrome-GPU pool to find the correct dimensions: + +* `python tools\swarming_client\swarming.py bots -S chromium-swarm.appspot.com -d pool Chrome-GPU` + [Swarming documentation]: https://www.chromium.org/developers/testing/isolated-testing/for-swes#TOC-Run-a-test-built-locally-on-Swarming ## Moving Test Binaries from Machine to Machine
diff --git a/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc b/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc index 843bac9..4164da91 100644 --- a/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc +++ b/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc
@@ -203,6 +203,7 @@ case ui::AXEventGenerator::Event::GRABBED_CHANGED: case ui::AXEventGenerator::Event::HASPOPUP_CHANGED: case ui::AXEventGenerator::Event::HIERARCHICAL_LEVEL_CHANGED: + case ui::AXEventGenerator::Event::IGNORED_CHANGED: case ui::AXEventGenerator::Event::KEY_SHORTCUTS_CHANGED: case ui::AXEventGenerator::Event::LABELED_BY_CHANGED: case ui::AXEventGenerator::Event::LANGUAGE_CHANGED:
diff --git a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc index 742270d..992cfd7 100644 --- a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc +++ b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
@@ -708,7 +708,7 @@ if (GetRootOfChildTree(&node, &tree_wrapper)) child_count = 1; else - child_count = node->children().size(); + child_count = node->GetUnignoredChildCount(); result.Set(v8::Integer::New(isolate, int32_t{child_count})); }); @@ -716,7 +716,8 @@ "GetIndexInParent", [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, AutomationAXTreeWrapper* tree_wrapper, ui::AXNode* node) { - result.Set(v8::Integer::New(isolate, int32_t{node->index_in_parent()})); + result.Set(v8::Integer::New( + isolate, int32_t{node->GetUnignoredIndexInParent()})); }); RouteNodeIDFunction( "GetRole", [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, @@ -769,9 +770,9 @@ if (GetRootOfChildTree(&node, &tree_wrapper)) { child_ids.push_back(node->id()); } else { - const std::vector<ui::AXNode*>& children = node->children(); - for (size_t i = 0; i < children.size(); ++i) - child_ids.push_back(children[i]->id()); + size_t child_count = node->GetUnignoredChildCount(); + for (size_t i = 0; i < child_count; ++i) + child_ids.push_back(node->GetUnignoredChildAtIndex(i)->id()); } gin::DataObjectBuilder response(isolate); @@ -1682,8 +1683,8 @@ ui::AXNode* AutomationInternalCustomBindings::GetParent( ui::AXNode* node, AutomationAXTreeWrapper** in_out_tree_wrapper) const { - if (node->parent()) - return node->parent(); + if (node->GetUnignoredParent()) + return node->GetUnignoredParent(); AutomationAXTreeWrapper* parent_tree_wrapper = nullptr; @@ -1752,8 +1753,8 @@ ui::AXNode* start, AutomationAXTreeWrapper** in_out_tree_wrapper) const { ui::AXNode* walker = start; - if (!walker->children().empty()) - return walker->children().front(); + if (walker->GetUnignoredChildCount()) + return walker->GetUnignoredChildAtIndex(0); // We also have to check child tree id. if (GetRootOfChildTree(&walker, in_out_tree_wrapper)) @@ -1762,9 +1763,11 @@ // Find the next branch forward. ui::AXNode* parent; while ((parent = GetParent(walker, in_out_tree_wrapper))) { - if ((walker->index_in_parent() + 1) < parent->children().size()) - return parent->children()[walker->index_in_parent() + 1]; - + if ((walker->GetUnignoredIndexInParent() + 1) < + parent->GetUnignoredChildCount()) { + return parent->GetUnignoredChildAtIndex( + walker->GetUnignoredIndexInParent() + 1); + } walker = parent; } @@ -1783,15 +1786,17 @@ return nullptr; // No previous sibling; parent is previous. - if (walker->index_in_parent() == 0) + if (walker->GetUnignoredIndexInParent() == 0) return parent; - walker = parent->children()[walker->index_in_parent() - 1]; + walker = + parent->GetUnignoredChildAtIndex(walker->GetUnignoredIndexInParent() - 1); // Walks to deepest last child. while (true) { - if (!walker->children().empty()) { - walker = walker->children().back(); + if (walker->GetUnignoredChildCount()) { + walker = walker->GetUnignoredChildAtIndex( + walker->GetUnignoredChildCount() - 1); } else if (!GetRootOfChildTree(&walker, in_out_tree_wrapper)) { break; } @@ -1879,10 +1884,10 @@ // Check for a child tree, which is guaranteed to always be the only child. if (index == 0 && GetRootOfChildTree(&node, &tree_wrapper)) child_id = node->id(); - else if (index < 0 || size_t{index} >= node->children().size()) + else if (index < 0 || size_t{index} >= node->GetUnignoredChildCount()) return; else - child_id = node->children()[size_t{index}]->id(); + child_id = node->GetUnignoredChildAtIndex(size_t{index})->id(); gin::DataObjectBuilder response(GetIsolate()); response.Set("treeId", tree_wrapper->tree_id().ToString());
diff --git a/gpu/command_buffer/service/skia_utils.cc b/gpu/command_buffer/service/skia_utils.cc index ec81f696..bb82e21d 100644 --- a/gpu/command_buffer/service/skia_utils.cc +++ b/gpu/command_buffer/service/skia_utils.cc
@@ -7,6 +7,7 @@ #include "base/logging.h" #include "components/viz/common/gpu/vulkan_context_provider.h" #include "components/viz/common/resources/resource_format_utils.h" +#include "gpu/command_buffer/service/shared_context_state.h" #include "third_party/skia/include/gpu/GrBackendSurface.h" #include "third_party/skia/include/gpu/gl/GrGLTypes.h" #include "ui/gfx/geometry/size.h" @@ -90,4 +91,27 @@ #endif } +void DeleteGrBackendTexture(SharedContextState* context_state, + GrBackendTexture* backend_texture) { + DCHECK(backend_texture && backend_texture->isValid()); + if (!context_state->GrContextIsVulkan()) { + context_state->gr_context()->deleteBackendTexture( + std::move(*backend_texture)); + return; + } + +#if BUILDFLAG(ENABLE_VULKAN) + auto* fence_helper = + context_state->vk_context_provider()->GetDeviceQueue()->GetFenceHelper(); + fence_helper->EnqueueCleanupTaskForSubmittedWork(base::BindOnce( + [](const sk_sp<GrContext>& gr_context, GrBackendTexture backend_texture, + gpu::VulkanDeviceQueue* device_queue, bool is_lost) { + // If underlying Vulkan device is destroyed, gr_context should have been + // abandoned, the deleteBackendTexture() should be noop. + gr_context->deleteBackendTexture(std::move(backend_texture)); + }, + sk_ref_sp(context_state->gr_context()), std::move(*backend_texture))); +#endif +} + } // namespace gpu
diff --git a/gpu/command_buffer/service/skia_utils.h b/gpu/command_buffer/service/skia_utils.h index 3edf8b47..e5e1a965 100644 --- a/gpu/command_buffer/service/skia_utils.h +++ b/gpu/command_buffer/service/skia_utils.h
@@ -31,6 +31,9 @@ } // namespace viz namespace gpu { + +class SharedContextState; + // Creates a GrBackendTexture from a service ID. Skia does not take ownership. // Returns true on success. GPU_GLES2_EXPORT bool GetGrBackendTexture(const gl::GLVersionInfo* version_info, @@ -50,6 +53,9 @@ viz::VulkanContextProvider* context_provider, GrFlushInfo* flush_info); +GPU_GLES2_EXPORT void DeleteGrBackendTexture( + SharedContextState* context_state, + GrBackendTexture* backend_textures); } // namespace gpu #endif // GPU_COMMAND_BUFFER_SERVICE_SKIA_UTILS_H_
diff --git a/gpu/command_buffer/service/wrapped_sk_image.cc b/gpu/command_buffer/service/wrapped_sk_image.cc index 8a80586..a35f288 100644 --- a/gpu/command_buffer/service/wrapped_sk_image.cc +++ b/gpu/command_buffer/service/wrapped_sk_image.cc
@@ -17,6 +17,7 @@ #include "gpu/command_buffer/service/shared_context_state.h" #include "gpu/command_buffer/service/shared_image_backing.h" #include "gpu/command_buffer/service/shared_image_representation.h" +#include "gpu/command_buffer/service/skia_utils.h" #include "third_party/skia/include/core/SkPromiseImageTexture.h" #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/core/SkSurfaceProps.h" @@ -47,7 +48,7 @@ void Destroy() override { DCHECK(backend_texture_.isValid()); - context_state_->gr_context()->deleteBackendTexture(backend_texture_); + DeleteGrBackendTexture(context_state_, &backend_texture_); } bool IsCleared() const override { return cleared_; }
diff --git a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc index ee043fb8..b6a1b606 100644 --- a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc +++ b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
@@ -818,35 +818,35 @@ TEST_P(GLCopyTextureCHROMIUMTest, InternalFormat) { CopyType copy_type = GetParam(); - GLint src_formats[] = {GL_ALPHA, GL_RGB, GL_RGBA, - GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_BGRA_EXT}; - GLint dest_formats[] = {GL_RGB, GL_RGBA, GL_BGRA_EXT}; + constexpr GLint src_formats[] = { + GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_BGRA_EXT}; + constexpr GLint dest_formats[] = {GL_RGB, GL_RGBA, GL_BGRA_EXT}; - for (size_t src_index = 0; src_index < base::size(src_formats); src_index++) { - for (size_t dest_index = 0; dest_index < base::size(dest_formats); - dest_index++) { + for (const auto src_format : src_formats) { + for (const auto dst_format : dest_formats) { CreateAndBindDestinationTextureAndFBO(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, textures_[0]); - glTexImage2D(GL_TEXTURE_2D, 0, src_formats[src_index], 1, 1, 0, - src_formats[src_index], GL_UNSIGNED_BYTE, nullptr); + glTexImage2D(GL_TEXTURE_2D, 0, src_format, 1, 1, 0, src_format, + GL_UNSIGNED_BYTE, nullptr); EXPECT_TRUE(GL_NO_ERROR == glGetError()); if (copy_type == TexImage) { glCopyTextureCHROMIUM(textures_[0], 0, GL_TEXTURE_2D, textures_[1], 0, - dest_formats[dest_index], GL_UNSIGNED_BYTE, false, - false, false); + dst_format, GL_UNSIGNED_BYTE, false, false, + false); } else { glBindTexture(GL_TEXTURE_2D, textures_[1]); - glTexImage2D(GL_TEXTURE_2D, 0, dest_formats[dest_index], 1, 1, 0, - dest_formats[dest_index], GL_UNSIGNED_BYTE, nullptr); + glTexImage2D(GL_TEXTURE_2D, 0, dst_format, 1, 1, 0, dst_format, + GL_UNSIGNED_BYTE, nullptr); EXPECT_TRUE(GL_NO_ERROR == glGetError()); glCopySubTextureCHROMIUM(textures_[0], 0, GL_TEXTURE_2D, textures_[1], 0, 0, 0, 0, 0, 1, 1, false, false, false); } - EXPECT_TRUE(GL_NO_ERROR == glGetError()) << "src_index:" << src_index - << " dest_index:" << dest_index; + EXPECT_TRUE(GL_NO_ERROR == glGetError()) + << "src_format: " << gl::GLEnums::GetStringEnum(src_format) + << " dst_format: " << gl::GLEnums::GetStringEnum(dst_format); glDeleteTextures(2, textures_); glDeleteFramebuffers(1, &framebuffer_id_); }
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc index e64de67e..99603711 100644 --- a/gpu/config/gpu_finch_features.cc +++ b/gpu/config/gpu_finch_features.cc
@@ -55,8 +55,13 @@ // Enable out of process rasterization by default. This can still be overridden // by --enable-oop-rasterization or --disable-oop-rasterization. +#if defined(OS_ANDROID) +const base::Feature kDefaultEnableOopRasterization{ + "DefaultEnableOopRasterization", base::FEATURE_ENABLED_BY_DEFAULT}; +#else const base::Feature kDefaultEnableOopRasterization{ "DefaultEnableOopRasterization", base::FEATURE_DISABLED_BY_DEFAULT}; +#endif // Use the passthrough command decoder by default. This can be overridden with // the --use-cmd-decoder=passthrough or --use-cmd-decoder=validating flags.
diff --git a/infra/config/cr-buildbucket.cfg b/infra/config/cr-buildbucket.cfg index ccb17aa..130c4a14 100644 --- a/infra/config/cr-buildbucket.cfg +++ b/infra/config/cr-buildbucket.cfg
@@ -1534,7 +1534,6 @@ name: "linux-blink-animation-use-time-delta" dimensions: "os:Ubuntu-14.04" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { @@ -1542,26 +1541,23 @@ mixins: "fyi-ci" mixins: "linux" mixins: "builderless" - mixins: "goma-rbe-prod" } builders { name: "linux-blink-heap-verification" mixins: "fyi-ci" mixins: "linux" - mixins: "goma-rbe-prod" } builders { name: "linux-blink-heap-unified-gc" mixins: "fyi-ci" mixins: "linux" - mixins: "goma-rbe-prod" } builders { name: "linux_chromium_component_updater" - mixins: "linux-ci-goma-rbe-prod" + mixins: "linux-ci" recipe { name: "findit/chromium/update_components" } @@ -1572,14 +1568,12 @@ name: "linux-chromium-tests-staging-builder" mixins: "fyi-ci" mixins: "linux" - mixins: "goma-rbe-prod" } builders { name: "linux-chromium-tests-staging-tests" mixins: "fyi-ci" mixins: "linux" - mixins: "goma-rbe-prod" } builders { @@ -1589,14 +1583,20 @@ builders { name: "linux-jumbo-rel" - mixins: "linux-ci-goma-rbe-prod" + mixins: "linux-ci" mixins: "linux-xenial" mixins: "builderless" } builders { name: "linux-ozone-rel" - mixins: "linux-ci-goma-rbe-prod" + mixins: "linux-ci" + } + + builders { + name: "linux-fieldtrial-rel" + mixins: "builderless" + mixins: "linux-xenial" } builders { @@ -2424,7 +2424,6 @@ builders { name: "linux-code-coverage" mixins: "code-coverage" - mixins: "goma-rbe-prod" dimensions: "cores:32" } @@ -2672,7 +2671,6 @@ name: "linux-annotator-rel" dimensions: "os:Ubuntu-14.04" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "win-annotator-rel" @@ -2704,7 +2702,6 @@ dimensions: "os:Ubuntu-14.04" dimensions: "cores:32" mixins: "fyi-ci" - mixins: "goma-rbe-prod" } builders { name: "Mac deterministic (dbg)" @@ -3920,14 +3917,9 @@ builders { mixins: "builderless" mixins: "linux-try" - mixins: "goma-rbe-prod" name: "linux-blink-heap-concurrent-marking-tsan-rel" } - builders { - mixins: "linux-try" - mixins: "goma-rbe-prod" - name: "linux-blink-heap-verification-try" - } + builders { mixins: "linux-try" name: "linux-blink-heap-verification-try" } builders { mixins: "linux-try" mixins: "goma-rbe-prod" @@ -3944,7 +3936,6 @@ } builders { mixins: "linux-try" - mixins: "goma-rbe-prod" name: "linux-jumbo-rel" mixins: "linux-xenial" mixins: "builderless" @@ -3961,7 +3952,6 @@ builders { mixins: "builderless" mixins: "linux-try" - mixins: "goma-rbe-prod" name: "linux-ozone-rel" } builders { @@ -4358,7 +4348,6 @@ name: "linux-annotator-rel" dimensions: "os:Ubuntu-14.04" mixins: "linux-try" - mixins: "goma-rbe-prod" } builders { name: "linux_vr"
diff --git a/infra/config/luci-milo.cfg b/infra/config/luci-milo.cfg index d11beada..52ef6cae 100644 --- a/infra/config/luci-milo.cfg +++ b/infra/config/luci-milo.cfg
@@ -2252,6 +2252,10 @@ category: "linux" } builders { + name: "buildbucket/luci.chromium.ci/linux-fieldtrial-rel" + category: "linux" + } + builders { name: "buildbucket/luci.chromium.ci/Mojo Android" category: "mojo" short_name: "and" @@ -2993,71 +2997,6 @@ category: "week2.5|linux" short_name: "gpu" } - builders { - name: "buildbucket/luci.chromium.ci/linux-gcc-rel" - category: "week3a|linux" - short_name: "gcc" - } - builders { - name: "buildbucket/luci.chromium.ci/linux-jumbo-rel" - category: "week3a|linux" - short_name: "jumbo" - } - builders { - name: "buildbucket/luci.chromium.ci/linux-ozone-rel" - category: "week3a|linux" - short_name: "ozone" - } - builders { - name: "buildbucket/luci.chromium.ci/linux-tcmalloc-rel" - category: "week3a|linux" - short_name: "tcm" - } - builders { - name: "buildbucket/luci.chromium.ci/linux-annotator-rel" - category: "week3a|linux" - short_name: "anno" - } - builders { - name: "buildbucket/luci.chromium.ci/linux_chromium_component_updater" - category: "week3a|linux" - short_name: "cc_upd" - } - builders { - name: "buildbucket/luci.chromium.ci/linux-code-coverage" - category: "week3a|linux" - short_name: "code" - } - builders { - name: "buildbucket/luci.chromium.ci/linux-blink-animation-use-time-delta" - category: "week3a|linux|blink" - short_name: "anim" - } - builders { - name: "buildbucket/luci.chromium.ci/linux-blink-heap-concurrent-marking-tsan-rel" - category: "week3a|linux|blink" - short_name: "tsan" - } - builders { - name: "buildbucket/luci.chromium.ci/linux-blink-heap-unified-gc" - category: "week3a|linux|blink" - short_name: "gc" - } - builders { - name: "buildbucket/luci.chromium.ci/linux-blink-heap-verification" - category: "week3a|linux|blink" - short_name: "ver" - } - builders { - name: "buildbucket/luci.chromium.ci/linux-chromium-tests-staging-builder" - category: "week3a|linux|crtests" - short_name: "bld" - } - builders { - name: "buildbucket/luci.chromium.ci/linux-chromium-tests-staging-tests" - category: "week3a|linux|crtests" - short_name: "test" - } } consoles {
diff --git a/infra/config/luci-scheduler.cfg b/infra/config/luci-scheduler.cfg index f763f7a..09fe2090 100644 --- a/infra/config/luci-scheduler.cfg +++ b/infra/config/luci-scheduler.cfg
@@ -360,6 +360,7 @@ triggers: "linux-jumbo-rel" triggers: "linux-ozone-rel" triggers: "linux-archive-rel" + triggers: "linux-fieldtrial-rel" triggers: "linux-tcmalloc-rel" triggers: "linux-win_cross-rel" triggers: "mac-code-coverage-generation" @@ -1810,6 +1811,16 @@ } job { + id: "linux-fieldtrial-rel" + acl_sets: "default" + buildbucket: { + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "linux-fieldtrial-rel" + } +} + +job { id: "Linux ASan LSan Builder" acl_sets: "default" buildbucket: {
diff --git a/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm b/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm index 72773fa..74df298 100644 --- a/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm +++ b/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm
@@ -7,7 +7,6 @@ #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" -#import "ios/chrome/test/earl_grey/chrome_error_util.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/web/public/test/http_server/html_response_provider.h" @@ -49,19 +48,20 @@ // Clear history and verify that the tile does not exist. [ChromeEarlGrey clearBrowsingHistory]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); + [ChromeEarlGrey openNewTab]; [[EarlGrey selectElementWithMatcher: chrome_test_util::StaticTextWithAccessibilityLabel(@"title1")] assertWithMatcher:grey_nil()]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]); + [ChromeEarlGrey loadURL:URL]; // After loading URL, need to do another action before opening a new tab // with the icon present. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]); + [ChromeEarlGrey goBack]; + [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); + [ChromeEarlGrey openNewTab]; [[EarlGrey selectElementWithMatcher: chrome_test_util::StaticTextWithAccessibilityLabel(@"title1")] @@ -93,20 +93,21 @@ // Clear history and verify that the tile does not exist. [ChromeEarlGrey clearBrowsingHistory]; - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); + [ChromeEarlGrey openNewTab]; [[EarlGrey selectElementWithMatcher: chrome_test_util::StaticTextWithAccessibilityLabel(@"title2")] assertWithMatcher:grey_nil()]; // Load first URL and expect redirect to destination URL. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:firstRedirectURL]); - CHROME_EG_ASSERT_NO_ERROR( - [ChromeEarlGrey waitForWebStateContainingText:"redirect complete"]); + [ChromeEarlGrey loadURL:firstRedirectURL]; + [ChromeEarlGrey waitForWebStateContainingText:"redirect complete"]; // After loading URL, need to do another action before opening a new tab // with the icon present. - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]); - CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]); + [ChromeEarlGrey goBack]; + [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; + + [ChromeEarlGrey openNewTab]; // Which of the two tiles that is displayed is an implementation detail, and // this test helps document it. The purpose of the test is to verify that only
diff --git a/ios/chrome/browser/overlays/overlay_presenter_impl.mm b/ios/chrome/browser/overlays/overlay_presenter_impl.mm index ab199cb..63392f3 100644 --- a/ios/chrome/browser/overlays/overlay_presenter_impl.mm +++ b/ios/chrome/browser/overlays/overlay_presenter_impl.mm
@@ -63,6 +63,10 @@ // destruction. DCHECK(!ui_delegate_); DCHECK(!web_state_list_); + + for (auto& observer : observers_) { + observer.OverlayPresenterDestroyed(this); + } } #pragma mark - Public @@ -182,6 +186,12 @@ presenting_ = true; + // Notify the observers that the overlay UI is about to be shown. + for (auto& observer : observers_) { + observer.WillShowOverlay(this, request); + } + + // Present the overlay UI via the UI delegate. OverlayDismissalCallback dismissal_callback = base::BindOnce( &OverlayPresenterImpl::OverlayWasDismissed, weak_factory_.GetWeakPtr(), ui_delegate_, request, GetActiveQueue()->GetWeakPtr()); @@ -211,6 +221,11 @@ presenting_ = false; + // Notify the observers that the overlay UI was hidden. + for (auto& observer : observers_) { + observer.DidHideOverlay(this); + } + // Only show the next overlay if the active request has changed, either // because the frontmost request was popped or because the active WebState has // changed.
diff --git a/ios/chrome/browser/overlays/overlay_presenter_impl_unittest.mm b/ios/chrome/browser/overlays/overlay_presenter_impl_unittest.mm index 12f01b7..1abd5c1 100644 --- a/ios/chrome/browser/overlays/overlay_presenter_impl_unittest.mm +++ b/ios/chrome/browser/overlays/overlay_presenter_impl_unittest.mm
@@ -16,12 +16,36 @@ #import "ios/chrome/browser/web_state_list/web_state_opener.h" #import "ios/web/public/test/fakes/test_web_state.h" #include "ios/web/public/test/test_web_thread_bundle.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/platform_test.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif +namespace { +// Mock queue observer. +class MockOverlayPresenterObserver : public OverlayPresenter::Observer { + public: + MockOverlayPresenterObserver() {} + ~MockOverlayPresenterObserver() {} + + MOCK_METHOD2(WillShowOverlay, void(OverlayPresenter*, OverlayRequest*)); + MOCK_METHOD1(DidHideOverlay, void(OverlayPresenter*)); + + // OverlayPresenter's ObserverList checks that it is empty upon deallocation, + // so a custom verification implemetation must be created. + void OverlayPresenterDestroyed(OverlayPresenter* presenter) override { + presenter_destroyed_ = true; + presenter->RemoveObserver(this); + } + bool presenter_destroyed() const { return presenter_destroyed_; } + + private: + bool presenter_destroyed_ = false; +}; +} // namespace + // Test fixture for OverlayPresenterImpl. class OverlayPresenterImplTest : public PlatformTest { public: @@ -32,6 +56,11 @@ &web_state_list_); OverlayPresenterImpl::Container::CreateForUserData(browser_.get(), browser_.get()); + presenter().AddObserver(&observer_); + } + ~OverlayPresenterImplTest() override { + if (browser_) + presenter().RemoveObserver(&observer_); } WebStateList& web_state_list() { return web_state_list_; } @@ -43,6 +72,7 @@ ->PresenterForModality(OverlayModality::kWebContentArea); } FakeOverlayPresenterUIDelegate& ui_delegate() { return ui_delegate_; } + MockOverlayPresenterObserver& observer() { return observer_; } OverlayRequestQueueImpl* GetQueueForWebState(web::WebState* web_state) { if (!web_state) @@ -52,22 +82,28 @@ ->QueueForModality(OverlayModality::kWebContentArea); } - OverlayRequest* AddRequest(web::WebState* web_state) { + OverlayRequest* AddRequest(web::WebState* web_state, + bool expect_presentation = true) { OverlayRequestQueueImpl* queue = GetQueueForWebState(web_state); if (!queue) return nullptr; std::unique_ptr<OverlayRequest> passed_request = OverlayRequest::CreateWithConfig<FakeOverlayUserData>(nullptr); OverlayRequest* request = passed_request.get(); + if (expect_presentation) + EXPECT_CALL(observer(), WillShowOverlay(&presenter(), request)); GetQueueForWebState(web_state)->AddRequest(std::move(passed_request)); return request; } + void DeleteBrowser() { browser_ = nullptr; } + private: web::TestWebThreadBundle thread_bundle_; FakeWebStateListDelegate web_state_list_delegate_; WebStateList web_state_list_; FakeOverlayPresenterUIDelegate ui_delegate_; + MockOverlayPresenterObserver observer_; std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; std::unique_ptr<Browser> browser_; }; @@ -121,6 +157,8 @@ // Reset the UI delegate and verify that the overlay UI is cancelled in the // previous delegate's context and presented in the new delegate's context. FakeOverlayPresenterUIDelegate new_ui_delegate; + EXPECT_CALL(observer(), WillShowOverlay(&presenter(), request)); + EXPECT_CALL(observer(), DidHideOverlay(&presenter())); presenter().SetUIDelegate(&new_ui_delegate); EXPECT_EQ(FakeOverlayPresenterUIDelegate::PresentationState::kCancelled, ui_delegate().GetPresentationState(request)); @@ -130,6 +168,7 @@ // Reset the UI delegate to nullptr and verify that the overlay UI is // cancelled in |new_ui_delegate|'s context. + EXPECT_CALL(observer(), DidHideOverlay(&presenter())); presenter().SetUIDelegate(nullptr); EXPECT_EQ(FakeOverlayPresenterUIDelegate::PresentationState::kCancelled, new_ui_delegate.GetPresentationState(request)); @@ -178,6 +217,7 @@ std::make_unique<web::TestWebState>(); web::WebState* second_web_state = passed_web_state.get(); OverlayRequest* second_request = AddRequest(second_web_state); + EXPECT_CALL(observer(), DidHideOverlay(&presenter())); web_state_list().InsertWebState(/*index=*/1, std::move(passed_web_state), WebStateList::InsertionFlags::INSERT_ACTIVATE, WebStateOpener()); @@ -191,6 +231,8 @@ // Reactivate the first WebState and verify that its overlay is presented // while the second WebState's overlay is hidden. + EXPECT_CALL(observer(), WillShowOverlay(&presenter(), first_request)); + EXPECT_CALL(observer(), DidHideOverlay(&presenter())); web_state_list().ActivateWebStateAt(0); EXPECT_EQ(FakeOverlayPresenterUIDelegate::PresentationState::kPresented, ui_delegate().GetPresentationState(first_request)); @@ -215,6 +257,7 @@ std::make_unique<web::TestWebState>(); web::WebState* replacement_web_state = passed_web_state.get(); OverlayRequest* replacement_request = AddRequest(replacement_web_state); + EXPECT_CALL(observer(), DidHideOverlay(&presenter())); web_state_list().ReplaceWebStateAt(/*index=*/0, std::move(passed_web_state)); // Verify that the previously shown overlay is canceled and that the overlay @@ -238,6 +281,7 @@ ui_delegate().GetPresentationState(request)); // Remove the WebState and verify that its overlay was cancelled. + EXPECT_CALL(observer(), DidHideOverlay(&presenter())); web_state_list().CloseWebStateAt(/*index=*/0, /* close_flags= */ 0); EXPECT_EQ(FakeOverlayPresenterUIDelegate::PresentationState::kCancelled, ui_delegate().GetPresentationState(request)); @@ -262,6 +306,7 @@ // Dismiss the overlay and check that the second request's overlay is // presented. + EXPECT_CALL(observer(), DidHideOverlay(&presenter())); ui_delegate().SimulateDismissalForRequest( first_request, OverlayDismissalReason::kUserInteraction); @@ -282,15 +327,23 @@ WebStateOpener()); OverlayRequestQueueImpl* queue = GetQueueForWebState(active_web_state()); OverlayRequest* active_request = AddRequest(active_web_state()); - OverlayRequest* queued_request = AddRequest(active_web_state()); + OverlayRequest* queued_request = + AddRequest(active_web_state(), /*expect_presentation=*/false); EXPECT_EQ(FakeOverlayPresenterUIDelegate::PresentationState::kPresented, ui_delegate().GetPresentationState(active_request)); // Cancel the queue's requests and verify that the UI is also cancelled. + EXPECT_CALL(observer(), DidHideOverlay(&presenter())); queue->CancelAllRequests(); EXPECT_EQ(FakeOverlayPresenterUIDelegate::PresentationState::kCancelled, ui_delegate().GetPresentationState(active_request)); EXPECT_EQ(FakeOverlayPresenterUIDelegate::PresentationState::kCancelled, ui_delegate().GetPresentationState(queued_request)); } + +// Tests that deleting the presenter +TEST_F(OverlayPresenterImplTest, PresenterWasDestroyed) { + DeleteBrowser(); + EXPECT_TRUE(observer().presenter_destroyed()); +}
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm index 159d26e..8a54196 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm
@@ -606,8 +606,7 @@ // Open a tab in incognito. [ChromeEarlGrey openNewIncognitoTab]; const GURL URL = self.testServer->GetURL(kFormHTMLFile); - NSString* omniboxText = base::SysUTF8ToNSString(URL.spec() + "\n"); - [ChromeEarlGreyUI focusOmniboxAndType:omniboxText]; + [ChromeEarlGrey loadURL:URL]; [ChromeEarlGrey waitForWebStateContainingText:"Profile form"]; // Bring up the keyboard by tapping the city, which is the element before the @@ -627,7 +626,6 @@ // autorelease pool, and some times a DCHECK will be hit. - (void)testOpeningIncognitoTabsDoNotLeak { const GURL URL = self.testServer->GetURL(kFormHTMLFile); - NSString* omniboxText = base::SysUTF8ToNSString(URL.spec() + "\n"); std::string webViewText("Profile form"); AddAutofillProfile(_personalDataManager); @@ -642,7 +640,7 @@ // Open a tab in incognito. [ChromeEarlGrey openNewIncognitoTab]; - [ChromeEarlGreyUI focusOmniboxAndType:omniboxText]; + [ChromeEarlGrey loadURL:URL]; [ChromeEarlGrey waitForWebStateContainingText:webViewText]; [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()] @@ -672,7 +670,7 @@ // Open a tab in incognito. [ChromeEarlGrey openNewIncognitoTab]; - [ChromeEarlGreyUI focusOmniboxAndType:omniboxText]; + [ChromeEarlGrey loadURL:URL]; [ChromeEarlGrey waitForWebStateContainingText:webViewText]; // Bring up the keyboard by tapping the city, which is the element before the @@ -716,8 +714,7 @@ // Open a tab in incognito. [ChromeEarlGrey openNewIncognitoTab]; const GURL URL = self.testServer->GetURL(kFormHTMLFile); - NSString* omniboxText = base::SysUTF8ToNSString(URL.spec() + "\n"); - [ChromeEarlGreyUI focusOmniboxAndType:omniboxText]; + [ChromeEarlGrey loadURL:URL]; [ChromeEarlGrey waitForWebStateContainingText:"Profile form"]; // Bring up the keyboard by tapping the city, which is the element before the
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_confirm_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_confirm_coordinator.mm index c4765850d..b27465f 100644 --- a/ios/chrome/browser/ui/infobars/coordinators/infobar_confirm_coordinator.mm +++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_confirm_coordinator.mm
@@ -102,7 +102,7 @@ self.modalViewController = nil; } -- (CGFloat)infobarModalContentHeight { +- (CGFloat)infobarModalHeight { // TODO(crbug.com/911864): Implement, this is a temporary value. If // InfobarConfirmCoordinator ends up having no Modal this should DCHECK or // NOTREACHED.
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm index c498aaf..4a3238c 100644 --- a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm +++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
@@ -98,8 +98,9 @@ animated:animated completion:^{ [weakSelf - configureBannerAccessibilityUsingPresentingViewController: - weakSelf.baseViewController]; + configureAccessibilityForBannerInViewController: + weakSelf.baseViewController + presenting:YES]; weakSelf.presentingInfobarBanner = YES; weakSelf.bannerWasPresented = YES; [weakSelf infobarBannerWasPresented]; @@ -189,6 +190,8 @@ - (void)infobarBannerWasDismissed { self.presentingInfobarBanner = NO; + [self configureAccessibilityForBannerInViewController:self.baseViewController + presenting:NO]; [self.badgeDelegate infobarBannerWasDismissed]; self.bannerTransitionDriver = nil; animatedFullscreenDisabler_ = nullptr; @@ -283,7 +286,7 @@ #pragma mark InfobarModalPositioner - (CGFloat)modalHeight { - return [self infobarModalContentHeight]; + return [self infobarModalHeight]; } #pragma mark InfobarCoordinatorImplementation @@ -312,7 +315,7 @@ NOTREACHED() << "Subclass must implement."; } -- (CGFloat)infobarModalContentHeight { +- (CGFloat)infobarModalHeight { NOTREACHED() << "Subclass must implement."; return 0; } @@ -335,22 +338,30 @@ // Configures the Banner Accessibility in order to give VoiceOver users the // ability to select other elements while the banner is presented. Call this -// method after the Banner has been presented. -- (void)configureBannerAccessibilityUsingPresentingViewController: - (UIViewController*)presentingViewController { - // Set the banner's superview accessibilityViewIsModal property to NO. This - // will allow the selection of the banner sibling views e.g. the - // presentingViewController views. - self.bannerViewController.view.superview.accessibilityViewIsModal = NO; +// method after the Banner has been presented or dismissed. |presenting| is YES +// if banner was presented, NO if dismissed. +- (void)configureAccessibilityForBannerInViewController: + (UIViewController*)presentingViewController + presenting:(BOOL)presenting { + if (presenting) { + // Set the banner's superview accessibilityViewIsModal property to NO. This + // will allow the selection of the banner sibling views e.g. the + // presentingViewController views. + self.bannerViewController.view.superview.accessibilityViewIsModal = NO; - // Make sure the banner is an accessibility element of the - // PresentingViewController. - self.baseViewController.accessibilityElements = - @[ self.bannerViewController.view, presentingViewController.view ]; + // Make sure the banner is an accessibility element of the + // PresentingViewController. + presentingViewController.accessibilityElements = + @[ self.bannerViewController.view, presentingViewController.view ]; - // Finally, focus the banner. - UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, - self.bannerViewController.view); + // Finally, focus the banner. + UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, + self.bannerViewController.view); + } else { + // Remove the Banner as an A11y element. + presentingViewController.accessibilityElements = + @[ presentingViewController.view ]; + } } @end
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator_implementation.h b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator_implementation.h index b4184ec..6ee33e0 100644 --- a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator_implementation.h +++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator_implementation.h
@@ -33,8 +33,9 @@ // Transitioning from Banner to Modal won't call this method. - (void)infobarWasDismissed; -// The infobar modal content height. Used to calculate its container height. -- (CGFloat)infobarModalContentHeight; +// The infobar modal height. Used to calculate its presentation container +// height. +- (CGFloat)infobarModalHeight; @end
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm index c6af82b..e4ff59f 100644 --- a/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm +++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm
@@ -173,11 +173,17 @@ self.passwordInfoBarDelegate->InfobarDismissed(); } -- (CGFloat)infobarModalContentHeight { +- (CGFloat)infobarModalHeight { UITableView* tableView = self.modalViewController.tableView; [tableView setNeedsLayout]; [tableView layoutIfNeeded]; - return tableView.contentSize.height; + + // Since the TableView is contained in a NavigationController get the + // navigation bar height. + CGFloat navigationBarHeight = self.modalViewController.navigationController + .navigationBar.frame.size.height; + + return tableView.contentSize.height + navigationBarHeight; } #pragma mark - InfobarPasswordModalDelegate
diff --git a/ios/chrome/browser/ui/infobars/presentation/infobar_modal_presentation_controller.mm b/ios/chrome/browser/ui/infobars/presentation/infobar_modal_presentation_controller.mm index 955b8d8..822e8a85 100644 --- a/ios/chrome/browser/ui/infobars/presentation/infobar_modal_presentation_controller.mm +++ b/ios/chrome/browser/ui/infobars/presentation/infobar_modal_presentation_controller.mm
@@ -23,8 +23,6 @@ const int kContainerBackgroundColor = 0x2F2F2F; // The alpha component for the container view background color. const CGFloat kContainerBackgroundColorAlpha = 0.5; -// The modal view content vertical padding. -const CGFloat kModalViewVerticalPadding = 20; } // namespace @implementation InfobarModalPresentationController @@ -58,10 +56,9 @@ CGFloat frameWidth = fmin(maxAvailableWidth, kPresentedViewMaxWidth); // Calculate the frame height needed to fit the content. - CGFloat contentHeight = [self.modalPositioner modalHeight]; + CGFloat modalTargetHeight = [self.modalPositioner modalHeight]; CGFloat maxAvailableHeight = containerHeight - 2 * kPresentedViewMargin; - CGFloat frameHeight = - fmin(maxAvailableHeight, contentHeight + kModalViewVerticalPadding); + CGFloat frameHeight = fmin(maxAvailableHeight, modalTargetHeight); // Based on the container width calculate the values in order to center the // frame in the X and Y axis.
diff --git a/ipc/ipc_message_start.h b/ipc/ipc_message_start.h index ec19b74..480ae36 100644 --- a/ipc/ipc_message_start.h +++ b/ipc/ipc_message_start.h
@@ -51,7 +51,6 @@ ChromeExtensionMsgStart, GinJavaBridgeMsgStart, ChromeUtilityPrintingMsgStart, - AecDumpMsgStart, OzoneGpuMsgStart, WebTestMsgStart, NetworkHintsMsgStart,
diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc index 53514b6..d945f04 100644 --- a/ipc/ipc_message_utils.cc +++ b/ipc/ipc_message_utils.cc
@@ -266,8 +266,7 @@ break; } default: - // TODO(crbug.com/859477): Remove after root cause is found. - CHECK(false); + NOTREACHED(); return false; }
diff --git a/media/base/android/media_codec_bridge.h b/media/base/android/media_codec_bridge.h index 7e5e327..f1a0003 100644 --- a/media/base/android/media_codec_bridge.h +++ b/media/base/android/media_codec_bridge.h
@@ -156,6 +156,9 @@ JNIEnv* env, const base::android::JavaParamRef<jobject>& obj) = 0; + // Returns the CodecType this codec was created with. + virtual CodecType GetCodecType() const = 0; + DISALLOW_COPY_AND_ASSIGN(MediaCodecBridge); };
diff --git a/media/base/android/media_codec_bridge_impl.cc b/media/base/android/media_codec_bridge_impl.cc index 83cf68a7..2180454 100644 --- a/media/base/android/media_codec_bridge_impl.cc +++ b/media/base/android/media_codec_bridge_impl.cc
@@ -179,6 +179,9 @@ } // namespace +VideoCodecConfig::VideoCodecConfig() = default; +VideoCodecConfig::~VideoCodecConfig() = default; + // static std::unique_ptr<MediaCodecBridge> MediaCodecBridgeImpl::CreateAudioDecoder( const AudioDecoderConfig& config, @@ -231,56 +234,45 @@ if (j_bridge.is_null()) return nullptr; - return base::WrapUnique(new MediaCodecBridgeImpl( - std::move(j_bridge), std::move(on_buffers_available_cb))); + return base::WrapUnique( + new MediaCodecBridgeImpl(CodecType::kAny, std::move(j_bridge), + std::move(on_buffers_available_cb))); } // static std::unique_ptr<MediaCodecBridge> MediaCodecBridgeImpl::CreateVideoDecoder( - VideoCodec codec, - CodecType codec_type, - const gfx::Size& size, - const JavaRef<jobject>& surface, - const JavaRef<jobject>& media_crypto, - const CodecSpecificData& csd0, - const CodecSpecificData& csd1, - const VideoColorSpace& color_space, - const base::Optional<HDRMetadata>& hdr_metadata, - bool allow_adaptive_playback, - base::RepeatingClosure on_buffers_available_cb) { + const VideoCodecConfig& config) { if (!MediaCodecUtil::IsMediaCodecAvailable()) return nullptr; - const std::string mime = MediaCodecUtil::CodecToAndroidMimeType(codec); + const std::string mime = MediaCodecUtil::CodecToAndroidMimeType(config.codec); if (mime.empty()) return nullptr; JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime); - - ScopedJavaLocalRef<jbyteArray> j_csd0 = - ToJavaByteArray(env, csd0.data(), csd0.size()); - ScopedJavaLocalRef<jbyteArray> j_csd1 = - ToJavaByteArray(env, csd1.data(), csd1.size()); + auto j_mime = ConvertUTF8ToJavaString(env, mime); + auto j_csd0 = ToJavaByteArray(env, config.csd0.data(), config.csd0.size()); + auto j_csd1 = ToJavaByteArray(env, config.csd1.data(), config.csd1.size()); std::unique_ptr<JniHdrMetadata> jni_hdr_metadata; - if (hdr_metadata.has_value()) { - jni_hdr_metadata.reset( - new JniHdrMetadata(color_space, hdr_metadata.value())); + if (config.hdr_metadata.has_value()) { + jni_hdr_metadata = std::make_unique<JniHdrMetadata>( + config.container_color_space, config.hdr_metadata.value()); } - ScopedJavaLocalRef<jobject> j_hdr_metadata( - jni_hdr_metadata ? jni_hdr_metadata->obj() : nullptr); + auto j_hdr_metadata = jni_hdr_metadata ? jni_hdr_metadata->obj() : nullptr; ScopedJavaGlobalRef<jobject> j_bridge( Java_MediaCodecBridgeBuilder_createVideoDecoder( - env, j_mime, static_cast<int>(codec_type), media_crypto, size.width(), - size.height(), surface, j_csd0, j_csd1, j_hdr_metadata, - allow_adaptive_playback, !!on_buffers_available_cb)); + env, j_mime, static_cast<int>(config.codec_type), config.media_crypto, + config.initial_expected_coded_size.width(), + config.initial_expected_coded_size.height(), config.surface, j_csd0, + j_csd1, j_hdr_metadata, true /* allow_adaptive_playback */, + !!config.on_buffers_available_cb)); if (j_bridge.is_null()) return nullptr; return base::WrapUnique(new MediaCodecBridgeImpl( - std::move(j_bridge), std::move(on_buffers_available_cb))); + config.codec_type, std::move(j_bridge), config.on_buffers_available_cb)); } // static @@ -308,7 +300,8 @@ if (j_bridge.is_null()) return nullptr; - return base::WrapUnique(new MediaCodecBridgeImpl(std::move(j_bridge))); + return base::WrapUnique( + new MediaCodecBridgeImpl(CodecType::kAny, std::move(j_bridge))); } // static @@ -324,9 +317,11 @@ } MediaCodecBridgeImpl::MediaCodecBridgeImpl( + CodecType codec_type, ScopedJavaGlobalRef<jobject> j_bridge, base::RepeatingClosure on_buffers_available_cb) - : on_buffers_available_cb_(std::move(on_buffers_available_cb)), + : codec_type_(codec_type), + on_buffers_available_cb_(std::move(on_buffers_available_cb)), j_bridge_(std::move(j_bridge)) { DCHECK(!j_bridge_.is_null()); @@ -618,6 +613,10 @@ Java_MediaCodecBridge_requestKeyFrameSoon(env, j_bridge_); } +CodecType MediaCodecBridgeImpl::GetCodecType() const { + return codec_type_; +} + bool MediaCodecBridgeImpl::FillInputBuffer(int index, const uint8_t* data, size_t size) {
diff --git a/media/base/android/media_codec_bridge_impl.h b/media/base/android/media_codec_bridge_impl.h index ba541b1..3497ca5b 100644 --- a/media/base/android/media_codec_bridge_impl.h +++ b/media/base/android/media_codec_bridge_impl.h
@@ -26,33 +26,54 @@ class VideoColorSpace; struct HDRMetadata; +// Configuration info for MediaCodec. +class MEDIA_EXPORT VideoCodecConfig { + public: + VideoCodecConfig(); + ~VideoCodecConfig(); + + VideoCodec codec = kUnknownVideoCodec; + + CodecType codec_type = CodecType::kAny; + + // The initial coded size. The actual size might change at any time, so this + // is only a hint. + gfx::Size initial_expected_coded_size; + + // The surface that MediaCodec is configured to output to. + base::android::ScopedJavaGlobalRef<jobject> surface; + + // The MediaCrypto that MediaCodec is configured with for an encrypted stream. + base::android::ScopedJavaGlobalRef<jobject> media_crypto; + + // Codec specific data (SPS and PPS for H264). See MediaCodec docs. + std::vector<uint8_t> csd0; + std::vector<uint8_t> csd1; + + VideoColorSpace container_color_space; + + // VP9 HDR metadata is only embedded in the container. HDR10 metadata is + // embedded in the video stream. + base::Optional<HDRMetadata> hdr_metadata; + + // Enables the async MediaCodec.Callback API. |on_buffers_available_cb| + // will be called when input or output buffers are available. This will be + // called on an arbitrary thread, so use BindToCurrentLoop if needed. + // + // May only be used on API level 23 and higher. + base::RepeatingClosure on_buffers_available_cb; + + private: + DISALLOW_COPY_AND_ASSIGN(VideoCodecConfig); +}; + // A bridge to a Java MediaCodec. class MEDIA_EXPORT MediaCodecBridgeImpl : public MediaCodecBridge { public: // Creates and starts a new MediaCodec configured for decoding. Returns // nullptr on failure. static std::unique_ptr<MediaCodecBridge> CreateVideoDecoder( - VideoCodec codec, - CodecType codec_type, - const gfx::Size& size, // Output frame size. - const base::android::JavaRef<jobject>& - surface, // Output surface, optional. - const base::android::JavaRef<jobject>& - media_crypto, // MediaCrypto object, optional. - // Codec specific data. See MediaCodec docs. - const std::vector<uint8_t>& csd0, - const std::vector<uint8_t>& csd1, - const VideoColorSpace& color_space, - const base::Optional<HDRMetadata>& hdr_metadata, - // Should adaptive playback be allowed if supported. - bool allow_adaptive_playback = true, - // Enables the async MediaCodec.Callback API. |on_buffers_available_cb| - // will be called when input or output buffers are available. This will be - // called on an arbitrary thread, so use BindToCurrentLoop if needed. - // - // May only be used on API level 23 and higher. - base::RepeatingClosure on_buffers_available_cb = - base::RepeatingClosure()); + const VideoCodecConfig& config); // Creates and starts a new MediaCodec configured for encoding. Returns // nullptr on failure. @@ -125,9 +146,11 @@ bool SetSurface(const base::android::JavaRef<jobject>& surface) override; void SetVideoBitrate(int bps, int frame_rate) override; void RequestKeyFrameSoon() override; + CodecType GetCodecType() const override; private: - MediaCodecBridgeImpl(base::android::ScopedJavaGlobalRef<jobject> j_bridge, + MediaCodecBridgeImpl(CodecType codec_type, + base::android::ScopedJavaGlobalRef<jobject> j_bridge, base::RepeatingClosure on_buffers_available_cb = base::RepeatingClosure()); @@ -150,6 +173,8 @@ JNIEnv* /* env */, const base::android::JavaParamRef<jobject>& /* obj */) override; + const CodecType codec_type_; + base::RepeatingClosure on_buffers_available_cb_; // The Java MediaCodecBridge instance.
diff --git a/media/base/android/media_codec_bridge_impl_unittest.cc b/media/base/android/media_codec_bridge_impl_unittest.cc index f4097fc..8278cf1 100644 --- a/media/base/android/media_codec_bridge_impl_unittest.cc +++ b/media/base/android/media_codec_bridge_impl_unittest.cc
@@ -288,10 +288,12 @@ TEST(MediaCodecBridgeTest, CreateH264Decoder) { SKIP_TEST_IF_MEDIA_CODEC_IS_NOT_AVAILABLE(); - MediaCodecBridgeImpl::CreateVideoDecoder( - kCodecH264, CodecType::kAny, gfx::Size(640, 480), nullptr, nullptr, - std::vector<uint8_t>(), std::vector<uint8_t>(), VideoColorSpace(), - HDRMetadata()); + VideoCodecConfig config; + config.codec = kCodecH264; + config.codec_type = CodecType::kAny; + config.initial_expected_coded_size = gfx::Size(640, 480); + + MediaCodecBridgeImpl::CreateVideoDecoder(config); } TEST(MediaCodecBridgeTest, DoNormal) { @@ -397,11 +399,12 @@ return; } - std::unique_ptr<MediaCodecBridge> media_codec( - MediaCodecBridgeImpl::CreateVideoDecoder( - kCodecVP8, CodecType::kAny, gfx::Size(320, 240), nullptr, nullptr, - std::vector<uint8_t>(), std::vector<uint8_t>(), VideoColorSpace(), - HDRMetadata())); + VideoCodecConfig config; + config.codec = kCodecVP8; + config.codec_type = CodecType::kAny; + config.initial_expected_coded_size = gfx::Size(320, 240); + + auto media_codec = MediaCodecBridgeImpl::CreateVideoDecoder(config); ASSERT_THAT(media_codec, NotNull()); scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("vp8-I-frame-320x240"); DecodeMediaFrame(media_codec.get(), buffer->data(), buffer->data_size(), @@ -428,11 +431,12 @@ EXPECT_THAT(MediaCodecBridgeImpl::CreateAudioDecoder( NewAudioConfig(kUnknownAudioCodec), nullptr), IsNull()); - EXPECT_THAT(MediaCodecBridgeImpl::CreateVideoDecoder( - kUnknownVideoCodec, CodecType::kAny, gfx::Size(320, 240), - nullptr, nullptr, std::vector<uint8_t>(), - std::vector<uint8_t>(), VideoColorSpace(), HDRMetadata()), - IsNull()); + + VideoCodecConfig config; + config.codec = kUnknownVideoCodec; + config.codec_type = CodecType::kAny; + config.initial_expected_coded_size = gfx::Size(320, 240); + EXPECT_THAT(MediaCodecBridgeImpl::CreateVideoDecoder(config), IsNull()); } // Test MediaCodec HW H264 encoding and validate the format of encoded frames.
diff --git a/media/base/android/mock_media_codec_bridge.cc b/media/base/android/mock_media_codec_bridge.cc index 6a008d3..3799d0c 100644 --- a/media/base/android/mock_media_codec_bridge.cc +++ b/media/base/android/mock_media_codec_bridge.cc
@@ -4,14 +4,12 @@ #include "media/base/android/mock_media_codec_bridge.h" -#include "base/synchronization/waitable_event.h" -#include "media/base/encryption_scheme.h" #include "media/base/subsample_entry.h" +using ::testing::_; using ::testing::DoAll; using ::testing::Return; using ::testing::SetArgPointee; -using ::testing::_; namespace media { @@ -22,10 +20,7 @@ .WillByDefault(Return(MEDIA_CODEC_TRY_AGAIN_LATER)); } -MockMediaCodecBridge::~MockMediaCodecBridge() { - if (destruction_event_) - destruction_event_->Signal(); -} +MockMediaCodecBridge::~MockMediaCodecBridge() = default; void MockMediaCodecBridge::AcceptOneInput(IsEos eos) { EXPECT_CALL(*this, DequeueInputBuffer(_, _)) @@ -46,27 +41,20 @@ .WillRepeatedly(Return(MEDIA_CODEC_TRY_AGAIN_LATER)); } -void MockMediaCodecBridge::SetCodecDestroyedEvent(base::WaitableEvent* event) { - destruction_event_ = event; -} - bool MockMediaCodecBridge::IsDrained() const { return is_drained_; } +CodecType MockMediaCodecBridge::GetCodecType() const { + return codec_type_; +} + +// static std::unique_ptr<MediaCodecBridge> MockMediaCodecBridge::CreateVideoDecoder( - VideoCodec codec, - CodecType codec_type, - const gfx::Size& size, // Output frame size. - const base::android::JavaRef<jobject>& surface, - const base::android::JavaRef<jobject>& media_crypto, - const std::vector<uint8_t>& csd0, - const std::vector<uint8_t>& csd1, - const VideoColorSpace& color_space, - const base::Optional<HDRMetadata>& hdr_metadata, - bool allow_adaptive_playback, - base::RepeatingClosure on_buffers_available_cb) { - return std::make_unique<MockMediaCodecBridge>(); + const VideoCodecConfig& config) { + auto bridge = std::make_unique<MockMediaCodecBridge>(); + bridge->codec_type_ = config.codec_type; + return bridge; } } // namespace media
diff --git a/media/base/android/mock_media_codec_bridge.h b/media/base/android/mock_media_codec_bridge.h index f8d2537..c6e2b4fc 100644 --- a/media/base/android/mock_media_codec_bridge.h +++ b/media/base/android/mock_media_codec_bridge.h
@@ -7,16 +7,11 @@ #include "base/android/scoped_java_ref.h" #include "media/base/android/media_codec_bridge.h" +#include "media/base/android/media_codec_bridge_impl.h" #include "media/base/android/test_destruction_observable.h" -#include "media/base/hdr_metadata.h" -#include "media/base/video_codecs.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -namespace base { -class WaitableEvent; -} - namespace media { class MockMediaCodecBridge : public MediaCodecBridge, @@ -76,30 +71,21 @@ MOCK_METHOD0(IsAdaptivePlaybackSupported, bool()); MOCK_METHOD2(OnBuffersAvailable, void(JNIEnv*, const base::android::JavaParamRef<jobject>&)); - - // Set an optional WaitableEvent that we'll signal on destruction. - void SetCodecDestroyedEvent(base::WaitableEvent* event); + CodecType GetCodecType() const override; // Return true if the codec is already drained. bool IsDrained() const; static std::unique_ptr<MediaCodecBridge> CreateVideoDecoder( - VideoCodec codec, - CodecType codec_type, - const gfx::Size& size, // Output frame size. - const base::android::JavaRef<jobject>& surface, - const base::android::JavaRef<jobject>& media_crypto, - const std::vector<uint8_t>& csd0, - const std::vector<uint8_t>& csd1, - const VideoColorSpace& color_space, - const base::Optional<HDRMetadata>& hdr_metadata, - bool allow_adaptive_playback, - base::RepeatingClosure on_buffers_available_cb); + const VideoCodecConfig& config); private: - base::WaitableEvent* destruction_event_ = nullptr; // Is the codec in the drained state? bool is_drained_ = true; + + CodecType codec_type_ = CodecType::kAny; + + DISALLOW_COPY_AND_ASSIGN(MockMediaCodecBridge); }; } // namespace media
diff --git a/media/base/android/test_destruction_observable.h b/media/base/android/test_destruction_observable.h index b6291668..aec50cb 100644 --- a/media/base/android/test_destruction_observable.h +++ b/media/base/android/test_destruction_observable.h
@@ -16,7 +16,8 @@ // DestructionObservable is a base class for testing that lets you set // expectations on its lifetime without keeping a reference to it. Each // observable can create a single DestructionObserver pointing to it. -struct DestructionObservable { +class DestructionObservable { + public: DestructionObservable(); virtual ~DestructionObservable(); std::unique_ptr<DestructionObserver> CreateDestructionObserver();
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index 4652a24..d889d209 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc
@@ -400,6 +400,10 @@ const base::Feature kDisableSurfaceLayerForVideo{ "DisableSurfaceLayerForVideo", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enable picture in picture web api for android. +const base::Feature kPictureInPictureAPI{"PictureInPictureAPI", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables CanPlayType() (and other queries) for HLS MIME types. Note that // disabling this also causes navigation to .m3u8 files to trigger downloading // instead of playback.
diff --git a/media/base/media_switches.h b/media/base/media_switches.h index 040a7dc..b411219 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h
@@ -146,6 +146,7 @@ MEDIA_EXPORT extern const base::Feature kAImageReaderVideoOutput; MEDIA_EXPORT extern const base::Feature kDisableSurfaceLayerForVideo; MEDIA_EXPORT extern const base::Feature kCanPlayHls; +MEDIA_EXPORT extern const base::Feature kPictureInPictureAPI; MEDIA_EXPORT extern const base::Feature kHlsPlayer; #endif // defined(OS_ANDROID)
diff --git a/media/gpu/android/codec_allocator.cc b/media/gpu/android/codec_allocator.cc index b65ada28..c6eee5a1 100644 --- a/media/gpu/android/codec_allocator.cc +++ b/media/gpu/android/codec_allocator.cc
@@ -6,469 +6,203 @@ #include <stddef.h> +#include <algorithm> #include <memory> #include "base/bind_helpers.h" #include "base/logging.h" -#include "base/single_thread_task_runner.h" -#include "base/system/sys_info.h" +#include "base/task/post_task.h" #include "base/task/task_traits.h" #include "base/task_runner_util.h" -#include "base/threading/thread.h" -#include "base/threading/thread_checker.h" -#include "base/threading/thread_task_runner_handle.h" +#include "base/threading/scoped_blocking_call.h" #include "base/time/default_tick_clock.h" #include "base/trace_event/trace_event.h" #include "media/base/android/media_codec_bridge_impl.h" +#include "media/base/bind_to_current_loop.h" #include "media/base/limits.h" -#include "media/base/media.h" #include "media/base/timestamp_constants.h" namespace media { namespace { -// Give tasks 800ms before considering them hung. MediaCodec.configure() calls -// typically take 100-200ms on a N5, so 800ms is expected to very rarely result -// in false positives. Also, false positives have low impact because we resume -// using the thread when the task completes. -constexpr base::TimeDelta kHungTaskDetectionTimeout = - base::TimeDelta::FromMilliseconds(800); - // This must be safe to call on any thread. Returns nullptr on failure. std::unique_ptr<MediaCodecBridge> CreateMediaCodecInternal( CodecAllocator::CodecFactoryCB factory_cb, - scoped_refptr<CodecConfig> codec_config, - bool requires_software_codec) { + std::unique_ptr<VideoCodecConfig> codec_config) { TRACE_EVENT0("media", "CodecAllocator::CreateMediaCodec"); - - const base::android::JavaRef<jobject>& media_crypto = - codec_config->media_crypto ? *codec_config->media_crypto : nullptr; - - // |requires_secure_codec| implies that it's an encrypted stream. - DCHECK(!codec_config->requires_secure_codec || !media_crypto.is_null()); - - CodecType codec_type = CodecType::kAny; - if (codec_config->requires_secure_codec && requires_software_codec) { - DVLOG(1) << "Secure software codec doesn't exist."; - return nullptr; - } else if (codec_config->requires_secure_codec) { - codec_type = CodecType::kSecure; - } else if (requires_software_codec) { - codec_type = CodecType::kSoftware; - } - - std::unique_ptr<MediaCodecBridge> codec(factory_cb.Run( - codec_config->codec, codec_type, - codec_config->initial_expected_coded_size, - codec_config->surface_bundle->GetJavaSurface(), media_crypto, - codec_config->csd0, codec_config->csd1, - codec_config->container_color_space, codec_config->hdr_metadata, true, - codec_config->on_buffers_available_cb)); - - return codec; + base::ScopedBlockingCall scoped_block(FROM_HERE, + base::BlockingType::MAY_BLOCK); + return factory_cb.Run(*codec_config); } // Delete |codec| and signal |done_event| if it's not null. -void DeleteMediaCodecAndSignal(std::unique_ptr<MediaCodecBridge> codec, - base::WaitableEvent* done_event) { - TRACE_EVENT0("media", "CodecAllocator::DeleteMediaCodec"); +void ReleaseMediaCodecInternal(std::unique_ptr<MediaCodecBridge> codec) { + TRACE_EVENT0("media", "CodecAllocator::ReleaseMediaCodec"); + base::ScopedBlockingCall scoped_block(FROM_HERE, + base::BlockingType::MAY_BLOCK); codec.reset(); - if (done_event) - done_event->Signal(); +} + +scoped_refptr<base::SequencedTaskRunner> CreateCodecTaskRunner() { + return base::CreateSequencedTaskRunnerWithTraits( + {base::TaskPriority::USER_VISIBLE, base::MayBlock(), + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); } } // namespace -CodecConfig::CodecConfig() {} -CodecConfig::~CodecConfig() {} - -CodecAllocator::HangDetector::HangDetector(const base::TickClock* tick_clock) - : tick_clock_(tick_clock) {} - -void CodecAllocator::HangDetector::WillProcessTask( - const base::PendingTask& pending_task) { - base::AutoLock l(lock_); - task_start_time_ = tick_clock_->NowTicks(); -} - -void CodecAllocator::HangDetector::DidProcessTask( - const base::PendingTask& pending_task) { - base::AutoLock l(lock_); - task_start_time_ = base::TimeTicks(); -} - -bool CodecAllocator::HangDetector::IsThreadLikelyHung() { - base::AutoLock l(lock_); - if (task_start_time_.is_null()) - return false; - - return (tick_clock_->NowTicks() - task_start_time_) > - kHungTaskDetectionTimeout; -} - // static CodecAllocator* CodecAllocator::GetInstance( scoped_refptr<base::SequencedTaskRunner> task_runner) { - static CodecAllocator* allocator = new CodecAllocator( + static base::NoDestructor<CodecAllocator> allocator( base::BindRepeating(&MediaCodecBridgeImpl::CreateVideoDecoder), task_runner); // Verify that this caller agrees on the task runner, if one was specified. DCHECK(!task_runner || allocator->task_runner_ == task_runner); - - return allocator; -} - -void CodecAllocator::StartThread(CodecAllocatorClient* client) { - if (!task_runner_->RunsTasksInCurrentSequence()) { - task_runner_->PostTask(FROM_HERE, - base::BindOnce(&CodecAllocator::StartThread, - base::Unretained(this), client)); - return; - } - - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - - // NOTE: |client| might not be a valid pointer anymore. All we know is that - // no other client is aliased to it, as long as |client| called StopThread - // before it was destroyed. The reason is that any re-use of |client| would - // have to also post StartThread to this thread. Since the re-use must be - // ordered later with respect to deleting the original |client|, the post must - // also be ordered later. So, there might be an aliased client posted, but it - // won't have started yet. - - // Cancel any pending StopThreadTask()s because we need the threads now. - weak_this_factory_.InvalidateWeakPtrs(); - - // Try to start the threads if they haven't been started. - for (auto* thread : threads_) { - if (thread->thread.IsRunning()) - continue; - - if (!thread->thread.Start()) - return; - - // Register the hang detector to observe the thread's MessageLoop. - thread->thread.task_runner()->PostTask( - FROM_HERE, - base::BindOnce( - [](base::MessageLoop::TaskObserver* observer) { - base::MessageLoopCurrent::Get()->AddTaskObserver(observer); - }, - base::Unretained(&thread->hang_detector))); - } - - clients_.insert(client); - return; -} - -void CodecAllocator::StopThread(CodecAllocatorClient* client) { - if (!task_runner_->RunsTasksInCurrentSequence()) { - task_runner_->PostTask(FROM_HERE, - base::BindOnce(&CodecAllocator::StopThread, - base::Unretained(this), client)); - return; - } - - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - - clients_.erase(client); - if (!clients_.empty()) { - // If we aren't stopping, then signal immediately. - if (stop_event_for_testing_) - stop_event_for_testing_->Signal(); - return; - } - - // Post a task to stop each thread through its task runner and back to this - // thread. This ensures that all pending tasks are run first. If a new AVDA - // calls StartThread() before StopThreadTask() runs, it's canceled by - // invalidating its weak pointer. As a result we're guaranteed to only call - // Thread::Stop() while there are no tasks on its queue. We don't try to stop - // hung threads. But if it recovers it will be stopped the next time a client - // calls this. - for (size_t i = 0; i < threads_.size(); i++) { - if (threads_[i]->thread.IsRunning() && - !threads_[i]->hang_detector.IsThreadLikelyHung()) { - threads_[i]->thread.task_runner()->PostTaskAndReply( - FROM_HERE, base::DoNothing(), - base::BindOnce(&CodecAllocator::StopThreadTask, - weak_this_factory_.GetWeakPtr(), i)); - } - } -} - -// Return the task runner for tasks of type |type|. -scoped_refptr<base::SingleThreadTaskRunner> CodecAllocator::TaskRunnerFor( - TaskType task_type) { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - return threads_[task_type]->thread.task_runner(); + return allocator.get(); } void CodecAllocator::CreateMediaCodecAsync( - base::WeakPtr<CodecAllocatorClient> client, - scoped_refptr<CodecConfig> codec_config) { + CodecCreatedCB codec_created_cb, + std::unique_ptr<VideoCodecConfig> codec_config) { if (!task_runner_->RunsTasksInCurrentSequence()) { - // We need to be ordered with respect to any Start/StopThread from this - // client. Otherwise, we might post work to the worker thread before the - // posted task to start the worker threads (on |task_runner_|) has run yet. - // We also need to avoid data races, since our member variables are all - // supposed to be accessed from the main thread only. task_runner_->PostTask( FROM_HERE, - base::BindOnce(&CodecAllocator::CreateMediaCodecAsyncInternal, + base::BindOnce(&CodecAllocator::CreateMediaCodecAsync, base::Unretained(this), - base::ThreadTaskRunnerHandle::Get(), client, - codec_config)); + BindToCurrentLoop(std::move(codec_created_cb)), + std::move(codec_config))); return; } - // We're on the right thread, so just send in |task_runner_|. - CreateMediaCodecAsyncInternal(task_runner_, client, codec_config); -} + DCHECK(codec_created_cb); + DCHECK(codec_config); -void CodecAllocator::CreateMediaCodecAsyncInternal( - scoped_refptr<base::SequencedTaskRunner> client_task_runner, - base::WeakPtr<CodecAllocatorClient> client, - scoped_refptr<CodecConfig> codec_config) { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - DCHECK(client_task_runner); + // Select the task runner before adding the PendingOperation and before + // querying the |force_sw_codecs_| state. + auto* task_runner = SelectCodecTaskRunner(); - // TODO(liberato): BindOnce more often if possible. - - // Allocate the codec on the appropriate thread, and reply to this one with - // the result. If |client| is gone by then, we handle cleanup. - auto task_type = - TaskTypeForAllocation(codec_config->software_codec_forbidden); - scoped_refptr<base::SingleThreadTaskRunner> task_runner = - task_type ? TaskRunnerFor(*task_type) : nullptr; - if (!task_type || !task_runner) { - // The allocator threads didn't start or are stuck. - // Post even if it's the current thread, to avoid re-entrancy. - client_task_runner->PostTask( - FROM_HERE, - base::BindOnce(&CodecAllocatorClient::OnCodecConfigured, client, - nullptr, codec_config->surface_bundle)); + // If we can't satisfy the request, fail the creation. + if (codec_config->codec_type == CodecType::kSecure && force_sw_codecs_) { + DLOG(ERROR) << "Secure software codec doesn't exist."; + std::move(codec_created_cb).Run(nullptr); return; } + if (force_sw_codecs_) + codec_config->codec_type = CodecType::kSoftware; + + const auto start_time = tick_clock_->NowTicks(); + pending_operations_.push_back(start_time); + + // Post creation to the task runner. This may hang on broken platforms; if it + // hangs, we will detect it on the next creation request, and future creations + // will fallback to software. base::PostTaskAndReplyWithResult( - task_runner.get(), FROM_HERE, - base::BindOnce(&CreateMediaCodecInternal, factory_cb_, codec_config, - task_type == SW_CODEC), - base::BindOnce(&CodecAllocator::ForwardOrDropCodec, - base::Unretained(this), client_task_runner, client, - *task_type, codec_config->surface_bundle)); + std::move(task_runner), FROM_HERE, + base::BindOnce(&CreateMediaCodecInternal, factory_cb_, + std::move(codec_config)), + base::BindOnce(&CodecAllocator::OnCodecCreated, base::Unretained(this), + start_time, std::move(codec_created_cb))); } -void CodecAllocator::ForwardOrDropCodec( - scoped_refptr<base::SequencedTaskRunner> client_task_runner, - base::WeakPtr<CodecAllocatorClient> client, - TaskType task_type, - scoped_refptr<CodecSurfaceBundle> surface_bundle, - std::unique_ptr<MediaCodecBridge> media_codec) { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - - // Remember: we are not necessarily on the right thread to use |client|. - - if (media_codec) - codec_task_types_[media_codec.get()] = task_type; - - // We could call directly if |task_runner_| is the current thread. Also note - // that there's no guarantee that |client_task_runner|'s thread is still - // running. That's okay; MediaCodecAndSurface will handle it. - client_task_runner->PostTask( - FROM_HERE, - base::BindOnce(&CodecAllocator::ForwardOrDropCodecOnClientThread, - base::Unretained(this), client, - std::make_unique<MediaCodecAndSurface>( - std::move(media_codec), std::move(surface_bundle)))); -} - -void CodecAllocator::ForwardOrDropCodecOnClientThread( - base::WeakPtr<CodecAllocatorClient> client, - std::unique_ptr<MediaCodecAndSurface> codec_and_surface) { - // Note that if |client| has been destroyed, MediaCodecAndSurface will clean - // up properly on the correct thread. Also note that |surface_bundle| will be - // preserved at least as long as the codec. - if (!client) - return; - - client->OnCodecConfigured(std::move(codec_and_surface->media_codec), - std::move(codec_and_surface->surface_bundle)); -} - -CodecAllocator::MediaCodecAndSurface::MediaCodecAndSurface( - std::unique_ptr<MediaCodecBridge> codec, - scoped_refptr<CodecSurfaceBundle> surface) - : media_codec(std::move(codec)), surface_bundle(std::move(surface)) {} - -CodecAllocator::MediaCodecAndSurface::~MediaCodecAndSurface() { - // This code may be run on any thread. - - if (!media_codec) - return; - - // If there are no registered clients, then the threads are stopped or are - // stopping. We must restart them / cancel any pending stop requests before - // we can post codec destruction to them. In the "restart them" case, the - // threads aren't running. In the "cancel...requests" case, the threads are - // running, but we're trying to clear them out via a DoNothing task posted - // there. Once that completes, there will be a join on the main thread. If - // we post, then it will be ordered after the DoNothing, but before the join - // on the main thread (this thread). If the destruction task hangs, then so - // will the join. - // - // We register a fake client to make sure that the threads are ready. - // - // If we can't start the thread, then ReleaseMediaCodec will free it on the - // current thread. - CodecAllocator* allocator = GetInstance(nullptr); - allocator->StartThread(nullptr); - allocator->ReleaseMediaCodec(std::move(media_codec), - std::move(surface_bundle)); - - // We can stop the threads immediately. If other clients are around, then - // this will do nothing. Otherwise, this will order the join after the - // release completes successfully. - allocator->StopThread(nullptr); -} - -void CodecAllocator::ReleaseMediaCodec( - std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<CodecSurfaceBundle> surface_bundle) { - DCHECK(media_codec); - +void CodecAllocator::ReleaseMediaCodec(std::unique_ptr<MediaCodecBridge> codec, + base::OnceClosure codec_released_cb) { if (!task_runner_->RunsTasksInCurrentSequence()) { - // See CreateMediaCodecAsync task_runner_->PostTask( FROM_HERE, base::BindOnce(&CodecAllocator::ReleaseMediaCodec, - base::Unretained(this), std::move(media_codec), - std::move(surface_bundle))); + base::Unretained(this), std::move(codec), + BindToCurrentLoop(std::move(codec_released_cb)))); return; } - DCHECK(task_runner_->RunsTasksInCurrentSequence()); + DCHECK(codec); - auto task_type = codec_task_types_[media_codec.get()]; - int erased = codec_task_types_.erase(media_codec.get()); - DCHECK(erased); + // Update |force_sw_codecs_| status. + auto* task_runner = SelectCodecTaskRunner(); - // Save a waitable event for the release if the codec is attached to an - // overlay so we can block on it in WaitForPendingReleaseForTesting(). - base::WaitableEvent* released_event = nullptr; - if (surface_bundle->overlay()) { - pending_codec_releases_.emplace( - std::piecewise_construct, - std::forward_as_tuple(surface_bundle->overlay()), - std::forward_as_tuple(base::WaitableEvent::ResetPolicy::MANUAL, - base::WaitableEvent::InitialState::NOT_SIGNALED)); - released_event = - &pending_codec_releases_.find(surface_bundle->overlay())->second; - } + // We always return non-software codecs to the primary task runner regardless + // of whether it's hung or not. We don't want any non-sw codecs to hang the + // the secondary task runner upon release. + // + // It's okay to release a software codec back to the primary task runner, we + // just don't want to release non-sw codecs to the secondary task runner. + if (codec->GetCodecType() != CodecType::kSoftware) + task_runner = primary_task_runner_.get(); - // Note that we forward |surface_bundle|, too, so that the surface outlasts - // the codec. - scoped_refptr<base::SingleThreadTaskRunner> task_runner = - TaskRunnerFor(task_type); - if (!task_runner) { - // Thread isn't running, so just delete it now and hope for the best. - DeleteMediaCodecAndSignal(std::move(media_codec), nullptr); - OnMediaCodecReleased(std::move(surface_bundle)); - return; - } + const auto start_time = tick_clock_->NowTicks(); + pending_operations_.push_back(start_time); task_runner->PostTaskAndReply( - FROM_HERE, - base::BindOnce(&DeleteMediaCodecAndSignal, std::move(media_codec), - released_event), - base::BindOnce(&CodecAllocator::OnMediaCodecReleased, - base::Unretained(this), std::move(surface_bundle))); -} - -void CodecAllocator::OnMediaCodecReleased( - scoped_refptr<CodecSurfaceBundle> surface_bundle) { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - - // This is a no-op if it's a non overlay bundle. - pending_codec_releases_.erase(surface_bundle->overlay()); -} - -bool CodecAllocator::IsAnyRegisteredAVDA() { - return !clients_.empty(); -} - -base::Optional<TaskType> CodecAllocator::TaskTypeForAllocation( - bool software_codec_forbidden) { - if (!threads_[AUTO_CODEC]->hang_detector.IsThreadLikelyHung()) - return AUTO_CODEC; - - if (!threads_[SW_CODEC]->hang_detector.IsThreadLikelyHung() && - !software_codec_forbidden) { - return SW_CODEC; - } - - return base::nullopt; -} - -base::Thread& CodecAllocator::GetThreadForTesting(TaskType task_type) { - return threads_[task_type]->thread; -} - -bool CodecAllocator::WaitForPendingReleaseForTesting(AndroidOverlay* overlay) { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - if (!pending_codec_releases_.count(overlay)) - return true; - - // The codec is being released so we have to wait for it here. It's a - // TimedWait() because the MediaCodec release may hang due to framework bugs. - // And in that case we don't want to hang the browser UI thread. Android ANRs - // occur when the UI thread is blocked for 5 seconds, so waiting for 2 seconds - // gives us leeway to avoid an ANR. Verified no ANR on a Nexus 7. - base::WaitableEvent& released = pending_codec_releases_.find(overlay)->second; - released.TimedWait(base::TimeDelta::FromSeconds(2)); - if (released.IsSignaled()) - return true; - - DLOG(WARNING) << __func__ << ": timed out waiting for MediaCodec#release()"; - return false; + FROM_HERE, base::BindOnce(&ReleaseMediaCodecInternal, std::move(codec)), + base::BindOnce(&CodecAllocator::OnCodecReleased, base::Unretained(this), + start_time, std::move(codec_released_cb))); } CodecAllocator::CodecAllocator( - CodecAllocator::CodecFactoryCB factory_cb, - scoped_refptr<base::SequencedTaskRunner> task_runner, - const base::TickClock* tick_clock, - base::WaitableEvent* stop_event) - : task_runner_(task_runner), - stop_event_for_testing_(stop_event), + CodecFactoryCB factory_cb, + scoped_refptr<base::SequencedTaskRunner> task_runner) + : task_runner_(std::move(task_runner)), factory_cb_(std::move(factory_cb)), - weak_this_factory_(this) { - // We leak the clock we create, but that's okay because we're a singleton. - auto* clock = tick_clock ? tick_clock : base::DefaultTickClock::GetInstance(); + tick_clock_(base::DefaultTickClock::GetInstance()) {} - // Create threads with names and indices that match up with TaskType. - threads_.push_back(new ThreadAndHangDetector("AVDAAutoThread", clock)); - threads_.push_back(new ThreadAndHangDetector("AVDASWThread", clock)); - static_assert(AUTO_CODEC == 0 && SW_CODEC == 1, - "TaskType values are not ordered correctly."); +CodecAllocator::~CodecAllocator() = default; + +void CodecAllocator::OnCodecCreated(base::TimeTicks start_time, + CodecCreatedCB codec_created_cb, + std::unique_ptr<MediaCodecBridge> codec) { + DCHECK(task_runner_->RunsTasksInCurrentSequence()); + CompletePendingOperation(start_time); + std::move(codec_created_cb).Run(std::move(codec)); } -CodecAllocator::~CodecAllocator() { - // Only tests should reach here. Shut down threads so that we guarantee that - // nothing will use the threads. - for (auto* thread : threads_) - thread->thread.Stop(); +void CodecAllocator::OnCodecReleased(base::TimeTicks start_time, + base::OnceClosure codec_released_cb) { + DCHECK(task_runner_->RunsTasksInCurrentSequence()); + CompletePendingOperation(start_time); + std::move(codec_released_cb).Run(); } -void CodecAllocator::StopThreadTask(size_t index) { - threads_[index]->thread.Stop(); - // Signal the stop event after both threads are stopped. - if (stop_event_for_testing_ && !threads_[AUTO_CODEC]->thread.IsRunning() && - !threads_[SW_CODEC]->thread.IsRunning()) { - stop_event_for_testing_->Signal(); +bool CodecAllocator::IsPrimaryTaskRunnerLikelyHung() const { + DCHECK(task_runner_->RunsTasksInCurrentSequence()); + + // Give tasks 800ms before considering them hung. MediaCodec.configure() calls + // typically take 100-200ms on a N5, so 800ms is expected to very rarely + // result in false positives. Also, false positives have low impact because we + // resume using the thread when the task completes. + constexpr base::TimeDelta kHungTaskDetectionTimeout = + base::TimeDelta::FromMilliseconds(800); + + return !pending_operations_.empty() && + tick_clock_->NowTicks() - *pending_operations_.begin() > + kHungTaskDetectionTimeout; +} + +base::SequencedTaskRunner* CodecAllocator::SelectCodecTaskRunner() { + DCHECK(task_runner_->RunsTasksInCurrentSequence()); + + if (IsPrimaryTaskRunnerLikelyHung()) { + force_sw_codecs_ = true; + if (!secondary_task_runner_) + secondary_task_runner_ = CreateCodecTaskRunner(); + return secondary_task_runner_.get(); } + + if (!primary_task_runner_) + primary_task_runner_ = CreateCodecTaskRunner(); + + force_sw_codecs_ = false; + return primary_task_runner_.get(); +} + +void CodecAllocator::CompletePendingOperation(base::TimeTicks start_time) { + // Note: This intentionally only erases the first instance, since there may be + // multiple instances of the same value. + pending_operations_.erase(std::find(pending_operations_.begin(), + pending_operations_.end(), start_time)); } } // namespace media
diff --git a/media/gpu/android/codec_allocator.h b/media/gpu/android/codec_allocator.h index c98e8ad..1340d8bc 100644 --- a/media/gpu/android/codec_allocator.h +++ b/media/gpu/android/codec_allocator.h
@@ -9,117 +9,26 @@ #include <memory> -#include "base/android/build_info.h" -#include "base/bind.h" -#include "base/logging.h" -#include "base/message_loop/message_loop.h" -#include "base/optional.h" +#include "base/callback.h" +#include "base/containers/circular_deque.h" +#include "base/no_destructor.h" #include "base/sequenced_task_runner.h" -#include "base/synchronization/waitable_event.h" -#include "base/system/sys_info.h" -#include "base/task/post_task.h" -#include "base/threading/thread.h" -#include "base/time/tick_clock.h" -#include "base/trace_event/trace_event.h" -#include "media/base/android/android_overlay.h" +#include "media/base/android/android_util.h" +#include "media/base/android/media_codec_bridge.h" #include "media/base/android/media_codec_bridge_impl.h" -#include "media/base/android/media_crypto_context.h" -#include "media/base/media.h" -#include "media/base/video_codecs.h" -#include "media/gpu/android/codec_surface_bundle.h" #include "media/gpu/media_gpu_export.h" -#include "ui/gfx/geometry/size.h" #include "ui/gl/android/scoped_java_surface.h" +namespace base { +class TickClock; +} + namespace media { -// For TaskRunnerFor. These are used as vector indices, so please update -// CodecAllocator's constructor if you add / change them. -enum TaskType { - // Task for an autodetected MediaCodec instance. - AUTO_CODEC = 0, - - // Task for a software-codec-required MediaCodec. - SW_CODEC = 1, -}; - -// Configuration info for MediaCodec. -// This is used to shuttle configuration info between threads without needing -// to worry about the lifetime of the AVDA instance. -class MEDIA_GPU_EXPORT CodecConfig - : public base::RefCountedThreadSafe<CodecConfig> { - public: - CodecConfig(); - - VideoCodec codec = kUnknownVideoCodec; - - // The surface that MediaCodec is configured to output to. - scoped_refptr<CodecSurfaceBundle> surface_bundle; - - // The MediaCrypto that MediaCodec is configured with for an encrypted stream. - JavaObjectPtr media_crypto; - - // Whether MediaCrypto requires a secure codec. - bool requires_secure_codec = false; - - // The initial coded size. The actual size might change at any time, so this - // is only a hint. - gfx::Size initial_expected_coded_size; - - // Whether creating a software decoder backed MediaCodec is forbidden. - bool software_codec_forbidden = false; - - // Codec specific data (SPS and PPS for H264). - std::vector<uint8_t> csd0; - std::vector<uint8_t> csd1; - - // VP9 HDR metadata is only embedded in the container - // HDR10 meta data is embedded in the video stream - VideoColorSpace container_color_space; - base::Optional<HDRMetadata> hdr_metadata; - - base::RepeatingClosure on_buffers_available_cb; - - protected: - friend class base::RefCountedThreadSafe<CodecConfig>; - virtual ~CodecConfig(); - - private: - DISALLOW_COPY_AND_ASSIGN(CodecConfig); -}; - -class AVDASurfaceAllocatorClient { - public: - // Called when the requested SurfaceView becomes available after a call to - // AllocateSurface() - virtual void OnSurfaceAvailable(bool success) = 0; - - // Called when the allocated surface is being destroyed. This must either - // replace the surface with MediaCodec#setSurface, or release the MediaCodec - // it's attached to. The client no longer owns the surface and doesn't - // need to call DeallocateSurface(); - virtual void OnSurfaceDestroyed() = 0; - - protected: - ~AVDASurfaceAllocatorClient() {} -}; - -class CodecAllocatorClient { - public: - // Called on the main thread when a new MediaCodec is configured. - // |media_codec| will be null if configuration failed. - virtual void OnCodecConfigured( - std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<CodecSurfaceBundle> surface_bundle) = 0; - - protected: - ~CodecAllocatorClient() {} -}; - -// CodecAllocator manages threads for allocating and releasing MediaCodec -// instances. These activities can hang, depending on android version, due -// to mediaserver bugs. CodecAllocator detects these cases, and reports -// on them to allow software fallback if the HW path is hung up. +// CodecAllocator manages allocating and releasing MediaCodec instances. These +// activities can hang, depending on android version, due to mediaserver bugs. +// CodecAllocator detects these cases, and allows software fallback if the HW +// path is hung up. class MEDIA_GPU_EXPORT CodecAllocator { public: static CodecAllocator* GetInstance( @@ -127,172 +36,74 @@ using CodecFactoryCB = base::RepeatingCallback<std::unique_ptr<MediaCodecBridge>( - VideoCodec codec, - CodecType codec_type, - const gfx::Size& size, // Output frame size. - const base::android::JavaRef<jobject>& surface, - const base::android::JavaRef<jobject>& media_crypto, - const std::vector<uint8_t>& csd0, - const std::vector<uint8_t>& csd1, - const VideoColorSpace& color_space, - const base::Optional<HDRMetadata>& hdr_metadata, - bool allow_adaptive_playback, - base::RepeatingClosure on_buffers_available_cb)>; - - // Make sure the construction threads are started for |client|. If the - // threads fail to start, then codec allocation may fail. - virtual void StartThread(CodecAllocatorClient* client); - virtual void StopThread(CodecAllocatorClient* client); + const VideoCodecConfig& config)>; // Create and configure a MediaCodec asynchronously. The result is delivered - // via OnCodecConfigured(). - virtual void CreateMediaCodecAsync(base::WeakPtr<CodecAllocatorClient> client, - scoped_refptr<CodecConfig> codec_config); + // via OnCodecCreated(). Will modify VideoCodecConfig::codec_type (but no + // other field) as needed if hardware codecs can't currently be created. + using CodecCreatedCB = + base::OnceCallback<void(std::unique_ptr<MediaCodecBridge>)>; + virtual void CreateMediaCodecAsync( + CodecCreatedCB codec_created_cb, + std::unique_ptr<VideoCodecConfig> codec_config); - // Asynchronously release |media_codec| with the attached surface. We will - // drop our reference to |surface_bundle| on the main thread after the codec - // is deallocated, since the codec isn't using it anymore. We will not take - // other action on it (e.g., calling ReleaseSurfaceTexture if it has one), - // since some other codec might be going to use it. We just want to be sure - // that it outlives |media_codec|. - virtual void ReleaseMediaCodec( - std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<CodecSurfaceBundle> surface_bundle); - - // Return true if and only if there is any AVDA registered. - bool IsAnyRegisteredAVDA(); - - // Return a reference to the thread for unit tests. - base::Thread& GetThreadForTesting(TaskType task_type); - - // Wait for a bounded amount of time for |overlay| to be freed, if it's - // in use pending release of a codec. Returns true on success, or false if - // the wait times out. - bool WaitForPendingReleaseForTesting(AndroidOverlay* overlay); + // Asynchronously release |codec|, |codec_released_cb| will be called after + // the release has been completed. + virtual void ReleaseMediaCodec(std::unique_ptr<MediaCodecBridge> codec, + base::OnceClosure codec_released_cb); protected: - // |tick_clock| and |stop_event| are for tests only. - CodecAllocator(CodecAllocator::CodecFactoryCB factory_cb, - scoped_refptr<base::SequencedTaskRunner> task_runner, - const base::TickClock* tick_clock = nullptr, - base::WaitableEvent* stop_event = nullptr); + friend class base::NoDestructor<CodecAllocator>; + + CodecAllocator(CodecFactoryCB factory_cb, + scoped_refptr<base::SequencedTaskRunner> task_runner); virtual ~CodecAllocator(); - // Struct to own a codec and surface bundle, with a custom deleter to post - // destruction to the right thread. - struct MediaCodecAndSurface { - MediaCodecAndSurface(std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<CodecSurfaceBundle> surface_bundle); - ~MediaCodecAndSurface(); - std::unique_ptr<MediaCodecBridge> media_codec; - scoped_refptr<CodecSurfaceBundle> surface_bundle; - }; - - // Forward |media_codec|, which is configured to output to |surface_bundle|, - // to |client| if |client| is still around. Otherwise, release the codec and - // then drop our ref to |surface_bundle|. This is called on |task_runner_|. - // It may only reference |client| from |client_task_runner|. - void ForwardOrDropCodec( - scoped_refptr<base::SequencedTaskRunner> client_task_runner, - base::WeakPtr<CodecAllocatorClient> client, - TaskType task_type, - scoped_refptr<CodecSurfaceBundle> surface_bundle, - std::unique_ptr<MediaCodecBridge> media_codec); - - // Forward |surface_bundle| and |media_codec| to |client| on the right thread - // to access |client|. - void ForwardOrDropCodecOnClientThread( - base::WeakPtr<CodecAllocatorClient> client, - std::unique_ptr<MediaCodecAndSurface> codec_and_surface); - private: friend class CodecAllocatorTest; - struct OwnerRecord { - AVDASurfaceAllocatorClient* owner = nullptr; - AVDASurfaceAllocatorClient* waiter = nullptr; - }; + // Called on |task_runner_| after the codec has been created. + void OnCodecCreated(base::TimeTicks start_time, + CodecCreatedCB codec_created_cb, + std::unique_ptr<MediaCodecBridge> codec); - class HangDetector : public base::MessageLoop::TaskObserver { - public: - HangDetector(const base::TickClock* tick_clock); - void WillProcessTask(const base::PendingTask& pending_task) override; - void DidProcessTask(const base::PendingTask& pending_task) override; - bool IsThreadLikelyHung(); + // Called on |task_runner_| after a codec is freed. + void OnCodecReleased(base::TimeTicks start_time, + base::OnceClosure codec_released_cb); - private: - base::Lock lock_; + // Indicates if we have likely hung |primary_task_runner_| and should fall + // back to the secondary task runner for software only codecs. + bool IsPrimaryTaskRunnerLikelyHung() const; - // Non-null when a task is currently running. - base::TimeTicks task_start_time_; + // Returns either |primary_task_runner_| or |secondary_task_runner_| depending + // on if |primary_task_runner_| is hung. Sets or clears |force_sw_codecs_| + // based on that same information. + base::SequencedTaskRunner* SelectCodecTaskRunner(); - const base::TickClock* tick_clock_; + // Erases the first entry for |start_time| in |pending_operations_|. + void CompletePendingOperation(base::TimeTicks start_time); - DISALLOW_COPY_AND_ASSIGN(HangDetector); - }; - - // Handy combination of a thread and hang detector for it. - struct ThreadAndHangDetector { - ThreadAndHangDetector(const std::string& name, - const base::TickClock* tick_clock) - : thread(name), hang_detector(tick_clock) {} - base::Thread thread; - HangDetector hang_detector; - }; - - // Helper function for CreateMediaCodecAsync which takes the task runner on - // which it should post the reply to |client|. - void CreateMediaCodecAsyncInternal( - scoped_refptr<base::SequencedTaskRunner> client_task_runner, - base::WeakPtr<CodecAllocatorClient> client, - scoped_refptr<CodecConfig> codec_config); - - // Return the task type to use for a new codec allocation, or nullopt if - // both threads are hung. - base::Optional<TaskType> TaskTypeForAllocation(bool software_codec_forbidden); - - // Return the task runner for tasks of type |type|. - scoped_refptr<base::SingleThreadTaskRunner> TaskRunnerFor(TaskType task_type); - - // Called on the gpu main thread when a codec is freed on a codec thread. - // |surface_bundle| is the surface bundle that the codec was using. It's - // important to pass this through to ensure a) it outlives the codec, and b) - // it's deleted on the right thread. - void OnMediaCodecReleased(scoped_refptr<CodecSurfaceBundle> surface_bundle); - - // Stop the thread indicated by |index|. This signals stop_event_for_testing_ - // after both threads are stopped. - void StopThreadTask(size_t index); - - // Task runner on which we do all our work. All members should be accessed - // only from this task runner. |task_runner_| itself may be referenced from + // Task runner on which we do all our work. All members should be accessed + // only from this task runner. |task_runner_| itself may be referenced from // any thread (hence const). const scoped_refptr<base::SequencedTaskRunner> task_runner_; - // All registered AVDAs. - std::set<CodecAllocatorClient*> clients_; + // Low-level codec factory. + const CodecFactoryCB factory_cb_; - // Waitable events for ongoing release tasks indexed by overlay so we can - // wait on the codec release if the surface attached to it is being destroyed. - // This really is needed only for ContentVideoViewOverlay, since it requires - // synchronous releases with respect to the main thread. - std::map<AndroidOverlay*, base::WaitableEvent> pending_codec_releases_; + // Tick clock which can be replaced for test purposes. + const base::TickClock* tick_clock_; - // Threads for each of TaskType. They are started / stopped as avda instances - // show and and request them. The vector indicies must match TaskType. - std::vector<ThreadAndHangDetector*> threads_; + // The two task runners used for codec operations. The primary is allowed to + // create CodecType::kAny MediaCodec instances, while the secondary one is + // only allowed to create CodecType::kSoftware instances. + scoped_refptr<base::SequencedTaskRunner> primary_task_runner_; + scoped_refptr<base::SequencedTaskRunner> secondary_task_runner_; - base::WaitableEvent* stop_event_for_testing_; + base::circular_deque<base::TimeTicks> pending_operations_; - // Saves the TaskType used to create a given codec so it can later be released - // on the same thread. - std::map<MediaCodecBridge*, TaskType> codec_task_types_; - - // Low-level codec factory, for testing. - CodecFactoryCB factory_cb_; - - // For canceling pending StopThreadTask()s. - base::WeakPtrFactory<CodecAllocator> weak_this_factory_; + // True if only software codec creation is currently allowed due to hangs. + bool force_sw_codecs_ = false; DISALLOW_COPY_AND_ASSIGN(CodecAllocator); };
diff --git a/media/gpu/android/codec_allocator_unittest.cc b/media/gpu/android/codec_allocator_unittest.cc index 1406d52..d57e7b43 100644 --- a/media/gpu/android/codec_allocator_unittest.cc +++ b/media/gpu/android/codec_allocator_unittest.cc
@@ -9,255 +9,106 @@ #include <memory> #include "base/bind.h" +#include "base/bind_helpers.h" #include "base/logging.h" #include "base/single_thread_task_runner.h" #include "base/test/scoped_task_environment.h" #include "base/test/simple_test_tick_clock.h" #include "base/threading/sequenced_task_runner_handle.h" +#include "base/threading/thread.h" #include "base/time/tick_clock.h" -#include "media/base/android/mock_android_overlay.h" #include "media/base/android/mock_media_codec_bridge.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +using testing::_; using testing::Invoke; using testing::NiceMock; using testing::ReturnRef; -using testing::_; namespace media { -namespace { -template <typename ReturnType> -void RunAndSignalTask(base::WaitableEvent* event, - ReturnType* return_value, - base::OnceCallback<ReturnType(void)> cb) { - *return_value = std::move(cb).Run(); - event->Signal(); -} - -void WaitUntilRestarted(base::WaitableEvent* about_to_wait_event, - base::WaitableEvent* wait_event) { - // Notify somebody that we've started. - if (about_to_wait_event) - about_to_wait_event->Signal(); - wait_event->Wait(); -} - -void SignalImmediately(base::WaitableEvent* event) { - event->Signal(); -} -} // namespace - -class MockClient : public CodecAllocatorClient { - public: - MockClient() - : codec_arrived_event_(base::WaitableEvent::ResetPolicy::AUTOMATIC, - base::WaitableEvent::InitialState::NOT_SIGNALED), - weak_factory_(this) {} - - // Gmock doesn't let us mock methods taking move-only types. - MOCK_METHOD1(OnCodecConfiguredMock, void(MediaCodecBridge* media_codec)); - void OnCodecConfigured( - std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<CodecSurfaceBundle> surface_bundle) override { - media_codec_ = std::move(media_codec); - OnCodecConfiguredMock(media_codec.get()); - codec_arrived_event_.Signal(); - } - - base::WeakPtr<CodecAllocatorClient> GetWeakPtr() { - return weak_factory_.GetWeakPtr(); - } - - // Most recently provided codec. - std::unique_ptr<MediaCodecBridge> media_codec_; - - base::WaitableEvent codec_arrived_event_; - - base::WeakPtrFactory<CodecAllocatorClient> weak_factory_; -}; class CodecAllocatorTest : public testing::Test { public: - CodecAllocatorTest() - : allocator_thread_("AllocatorThread"), - stop_event_(base::WaitableEvent::ResetPolicy::AUTOMATIC, - base::WaitableEvent::InitialState::NOT_SIGNALED) { + CodecAllocatorTest() : allocator_thread_("AllocatorThread") { // Don't start the clock at null. tick_clock_.Advance(base::TimeDelta::FromSeconds(1)); + allocator_ = new CodecAllocator( + base::BindRepeating(&MockMediaCodecBridge::CreateVideoDecoder), + base::SequencedTaskRunnerHandle::Get()); + allocator_->tick_clock_ = &tick_clock_; } - ~CodecAllocatorTest() override {} + ~CodecAllocatorTest() override { + if (allocator_thread_.IsRunning()) { + // Don't leave any threads hung, or this will hang too. It would be nice + // if we could let a unique ptr handle this, but the destructor is + // private. We also have to destroy it on the right thread. + allocator_thread_.task_runner()->PostTask( + FROM_HERE, + base::BindOnce([](CodecAllocator* allocator) { delete allocator; }, + allocator_)); - // Utility fn to test out threading. - void AllocateCodec() { - allocator_->StartThread(avda1_); - scoped_refptr<CodecConfig> codec_config(new CodecConfig); - codec_config->surface_bundle = surface_bundle_; - EXPECT_CALL(*avda1_, OnCodecConfiguredMock(_)); - allocator_->CreateMediaCodecAsync(avda1_->GetWeakPtr(), codec_config); + allocator_thread_.Stop(); + return; + } + + delete allocator_; } - void DestroyCodec() { - // Make sure that we got a codec. - ASSERT_NE(avda1_->media_codec_, nullptr); - base::WaitableEvent destruction_event( - base::WaitableEvent::ResetPolicy::AUTOMATIC, - base::WaitableEvent::InitialState::NOT_SIGNALED); - static_cast<MockMediaCodecBridge*>(avda1_->media_codec_.get()) - ->SetCodecDestroyedEvent(&destruction_event); - allocator_->ReleaseMediaCodec(std::move(avda1_->media_codec_), - surface_bundle_); + void CreateAllocatorOnAnotherThread() { + delete allocator_; - // This won't wait for the threads to stop, which means that the release - // might not have completed yet. Even once we are signalled that the codec - // has been destroyed, we can't be sure that OnMediaCodecReleased has run - // on the allocator thread. To get around this, one should wait on - // |stop_event_|, but not here. If we're run on the allocator's thread, - // then that's where |stop_event_| will be signalled from. - allocator_->StopThread(avda1_); - // The codec destruction should be async with respect to us. - destruction_event.Wait(); - - // Important: we don't know that OnMediaCodecReleased has completed. - // If we clean up the test and post the allocator's destruction to the - // allocator thread, before the "and reply" posts the codec release, then - // the codec release will be run on a destructed allocator. Either we - // should synchronize on that, or quit using base::Unretained(). - // Waiting for |stop_event_| and then for |allocator_thread_| should be - // sufficent to avoid this. - // Waiting for the overlay to be released is probably also enough, since - // that happens to be run on OnMediaCodecReleased also. + // Start a thread for the allocator. This would normally be the GPU main + // thread. + CHECK(allocator_thread_.Start()); + allocator_ = new CodecAllocator( + base::BindRepeating(&MockMediaCodecBridge::CreateVideoDecoder), + allocator_thread_.task_runner()); + allocator_->tick_clock_ = &tick_clock_; } - void WaitForSurfaceDestruction() { - // This may be called from any thread. - PostAndWait(FROM_HERE, - base::BindOnce( - [](CodecAllocator* allocator, AndroidOverlay* overlay) { - allocator->WaitForPendingReleaseForTesting(overlay); - return true; - }, - allocator_, surface_bundle_->overlay())); + void OnCodecCreatedInternal(base::OnceClosure quit_closure, + std::unique_ptr<MediaCodecBridge> codec) { + // This should always be called on the main thread, despite whatever thread + // the allocator happens to be running on. + ASSERT_TRUE(scoped_task_environment_.GetMainThreadTaskRunner() + ->BelongsToCurrentThread()); + + last_created_codec_.reset( + reinterpret_cast<MockMediaCodecBridge*>(codec.release())); + + OnCodecCreated(last_created_codec_->GetCodecType()); + std::move(quit_closure).Run(); } + void OnCodecReleasedInternal(base::OnceClosure quit_closure) { + // This should always be called on the main thread, despite whatever thread + // the allocator happens to be running on. + ASSERT_TRUE(scoped_task_environment_.GetMainThreadTaskRunner() + ->BelongsToCurrentThread()); + OnCodecReleased(); + std::move(quit_closure).Run(); + } + + bool IsPrimaryTaskRunnerLikelyHung() const { + CHECK(!allocator_thread_.IsRunning()); + return allocator_->IsPrimaryTaskRunnerLikelyHung(); + } + + void VerifyOnPrimaryTaskRunner() { + ASSERT_TRUE(allocator_->primary_task_runner_->RunsTasksInCurrentSequence()); + } + + void VerifyOnSecondaryTaskRunner() { + ASSERT_TRUE( + allocator_->secondary_task_runner_->RunsTasksInCurrentSequence()); + } + + MOCK_METHOD1(OnCodecCreated, void(CodecType)); + MOCK_METHOD0(OnCodecReleased, void()); + protected: - void SetUp() override { - // Start the main thread for the allocator. This would normally be the GPU - // main thread. - ASSERT_TRUE(allocator_thread_.Start()); - - CodecAllocator::CodecFactoryCB factory_cb( - base::BindRepeating(&MockMediaCodecBridge::CreateVideoDecoder)); - - // Create the first allocator on the allocator thread. - allocator_ = PostAndWait( - FROM_HERE, - base::BindOnce( - [](CodecAllocator::CodecFactoryCB factory_cb, - scoped_refptr<base::SequencedTaskRunner> task_runner, - const base::TickClock* clock, base::WaitableEvent* event) { - return new CodecAllocator(factory_cb, task_runner, clock, event); - }, - factory_cb, allocator_thread_.task_runner(), &tick_clock_, - &stop_event_)); - allocator2_ = - new CodecAllocator(factory_cb, base::SequencedTaskRunnerHandle::Get()); - - // Create a SurfaceBundle that provides an overlay. It will provide a null - // java ref if requested. - std::unique_ptr<MockAndroidOverlay> overlay = - std::make_unique<NiceMock<MockAndroidOverlay>>(); - scoped_refptr<CodecConfig> codec_config(new CodecConfig); - ON_CALL(*overlay, GetJavaSurface()) - .WillByDefault(ReturnRef(null_java_ref_)); - surface_bundle_ = new CodecSurfaceBundle(std::move(overlay)); - } - - void TearDown() override { - // Don't leave any threads hung, or this will hang too. - // It would be nice if we could let a unique ptr handle this, but the - // destructor is private. We also have to destroy it on the right thread. - PostAndWait(FROM_HERE, base::BindOnce( - [](CodecAllocator* allocator) { - delete allocator; - return true; - }, - allocator_)); - - allocator_thread_.Stop(); - delete allocator2_; - } - - protected: - // Start / stop the threads for |avda| on the right thread. - void StartThread(CodecAllocatorClient* avda) { - PostAndWait(FROM_HERE, - base::BindOnce( - [](CodecAllocator* allocator, CodecAllocatorClient* avda) { - allocator->StartThread(avda); - return true; // void won't work. - }, - allocator_, avda)); - } - - void StopThread(CodecAllocatorClient* avda) { - // Note that we also wait for the stop event, so that we know that the - // stop has completed. It's async with respect to the allocator thread. - PostAndWait(FROM_HERE, - base::BindOnce( - [](CodecAllocator* allocator, CodecAllocatorClient* avda) { - allocator->StopThread(avda); - return true; - }, - allocator_, avda)); - // Note that we don't do this on the allocator thread, since that's the - // thread that will signal it. - stop_event_.Wait(); - } - - // Return the running state of |task_type|, doing the necessary thread hops. - bool IsThreadRunning(TaskType task_type) { - return PostAndWait( - FROM_HERE, - base::BindOnce( - [](CodecAllocator* allocator, TaskType task_type) { - return allocator->GetThreadForTesting(task_type).IsRunning(); - }, - allocator_, task_type)); - } - - base::Optional<TaskType> TaskTypeForAllocation( - bool software_codec_forbidden) { - return PostAndWait( - FROM_HERE, - base::BindOnce(&CodecAllocator::TaskTypeForAllocation, - base::Unretained(allocator_), software_codec_forbidden)); - } - - scoped_refptr<base::SingleThreadTaskRunner> TaskRunnerFor( - TaskType task_type) { - return PostAndWait(FROM_HERE, - base::BindOnce(&CodecAllocator::TaskRunnerFor, - base::Unretained(allocator_), task_type)); - } - - // Post |cb| to the allocator thread, and wait for a response. Note that we - // don't have a specialization for void, and void won't work as written. So, - // be sure to return something. - template <typename ReturnType> - ReturnType PostAndWait(const base::Location& from_here, - base::OnceCallback<ReturnType(void)> cb) { - base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL, - base::WaitableEvent::InitialState::NOT_SIGNALED); - ReturnType return_value = ReturnType(); - allocator_thread_.task_runner()->PostTask( - from_here, base::BindOnce(&RunAndSignalTask<ReturnType>, &event, - &return_value, std::move(cb))); - event.Wait(); - return return_value; - } - // So that we can get the thread's task runner. base::test::ScopedTaskEnvironment scoped_task_environment_; @@ -265,120 +116,264 @@ // The test params for |allocator_|. base::SimpleTestTickClock tick_clock_; - base::WaitableEvent stop_event_; - // Allocators that we own. The first is intialized to be used on the allocator - // thread and the second one is initialized on the test thread. Each test - // should only be using one of the two. They are not unique_ptrs because the - // destructor is private and they need to be destructed on the right thread. + // Allocators that we own. They are not unique_ptrs because the destructor is + // private and they need to be destructed on the right thread. CodecAllocator* allocator_ = nullptr; - CodecAllocator* allocator2_ = nullptr; - NiceMock<MockClient> client1_, client2_, client3_; - NiceMock<MockClient>* avda1_ = &client1_; - NiceMock<MockClient>* avda2_ = &client2_; - NiceMock<MockClient>* avda3_ = &client3_; + std::unique_ptr<MockMediaCodecBridge> last_created_codec_; - // Surface bundle that has an overlay. - scoped_refptr<CodecSurfaceBundle> surface_bundle_; - base::android::JavaRef<jobject> null_java_ref_; + private: + DISALLOW_COPY_AND_ASSIGN(CodecAllocatorTest); }; -TEST_F(CodecAllocatorTest, ThreadsStartWhenClientsStart) { - ASSERT_FALSE(IsThreadRunning(AUTO_CODEC)); - ASSERT_FALSE(IsThreadRunning(SW_CODEC)); - StartThread(avda1_); - ASSERT_TRUE(IsThreadRunning(AUTO_CODEC)); - ASSERT_TRUE(IsThreadRunning(SW_CODEC)); +TEST_F(CodecAllocatorTest, NormalCreation) { + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); + + auto config = std::make_unique<VideoCodecConfig>(); + config->codec_type = CodecType::kAny; + + base::RunLoop run_loop; + allocator_->CreateMediaCodecAsync( + base::BindOnce(&CodecAllocatorTest::OnCodecCreatedInternal, + base::Unretained(this), run_loop.QuitClosure()), + std::move(config)); + + EXPECT_CALL(*this, OnCodecCreated(CodecType::kAny)); + run_loop.Run(); + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); } -TEST_F(CodecAllocatorTest, ThreadsStopAfterAllClientsStop) { - StartThread(avda1_); - StartThread(avda2_); - StopThread(avda1_); - ASSERT_TRUE(IsThreadRunning(AUTO_CODEC)); - StopThread(avda2_); - ASSERT_FALSE(IsThreadRunning(AUTO_CODEC)); - ASSERT_FALSE(IsThreadRunning(SW_CODEC)); +TEST_F(CodecAllocatorTest, NormalSecureCreation) { + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); + + auto config = std::make_unique<VideoCodecConfig>(); + config->codec_type = CodecType::kSecure; + + base::RunLoop run_loop; + allocator_->CreateMediaCodecAsync( + base::BindOnce(&CodecAllocatorTest::OnCodecCreatedInternal, + base::Unretained(this), run_loop.QuitClosure()), + std::move(config)); + + EXPECT_CALL(*this, OnCodecCreated(CodecType::kSecure)); + run_loop.Run(); + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); } -TEST_F(CodecAllocatorTest, TestHangThread) { - StartThread(avda1_); - ASSERT_EQ(AUTO_CODEC, TaskTypeForAllocation(false)); +TEST_F(CodecAllocatorTest, MultipleCreation) { + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); - // Hang the AUTO_CODEC thread. - base::WaitableEvent about_to_wait_event( - base::WaitableEvent::ResetPolicy::MANUAL, - base::WaitableEvent::InitialState::NOT_SIGNALED); - base::WaitableEvent wait_event( - base::WaitableEvent::ResetPolicy::MANUAL, - base::WaitableEvent::InitialState::NOT_SIGNALED); - TaskRunnerFor(AUTO_CODEC) - ->PostTask(FROM_HERE, base::BindOnce(&WaitUntilRestarted, - &about_to_wait_event, &wait_event)); - // Wait until the task starts, so that |allocator_| starts the hang timer. - about_to_wait_event.Wait(); + auto config = std::make_unique<VideoCodecConfig>(); + config->codec_type = CodecType::kAny; - // Verify that we've failed over after a long time has passed. + base::RunLoop run_loop; + allocator_->CreateMediaCodecAsync( + base::BindOnce(&CodecAllocatorTest::OnCodecCreatedInternal, + base::Unretained(this), base::DoNothing::Once()), + std::move(config)); + + // Advance some time, but not enough to trigger hang detection. + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); + tick_clock_.Advance(base::TimeDelta::FromMilliseconds(400)); + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); + + auto config_secure = std::make_unique<VideoCodecConfig>(); + config_secure->codec_type = CodecType::kSecure; + + allocator_->CreateMediaCodecAsync( + base::BindOnce(&CodecAllocatorTest::OnCodecCreatedInternal, + base::Unretained(this), run_loop.QuitClosure()), + std::move(config_secure)); + + EXPECT_CALL(*this, OnCodecCreated(CodecType::kAny)); + EXPECT_CALL(*this, OnCodecCreated(CodecType::kSecure)); + + run_loop.Run(); + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); +} + +TEST_F(CodecAllocatorTest, MultipleRelease) { + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); + + base::RunLoop run_loop; + allocator_->ReleaseMediaCodec( + std::make_unique<MockMediaCodecBridge>(), + base::BindOnce(&CodecAllocatorTest::OnCodecReleasedInternal, + base::Unretained(this), base::DoNothing::Once())); + + // Advance some time, but not enough to trigger hang detection. + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); + tick_clock_.Advance(base::TimeDelta::FromMilliseconds(400)); + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); + + allocator_->ReleaseMediaCodec( + std::make_unique<MockMediaCodecBridge>(), + base::BindOnce(&CodecAllocatorTest::OnCodecReleasedInternal, + base::Unretained(this), run_loop.QuitClosure())); + + EXPECT_CALL(*this, OnCodecReleased()).Times(2); + + run_loop.Run(); + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); +} + +TEST_F(CodecAllocatorTest, StalledReleaseCountsAsHung) { + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); + + // Release null codec, but don't pump message loop. + allocator_->ReleaseMediaCodec(std::make_unique<MockMediaCodecBridge>(), + base::DoNothing()); tick_clock_.Advance(base::TimeDelta::FromSeconds(1)); - ASSERT_EQ(SW_CODEC, TaskTypeForAllocation(false)); - - // Un-hang the thread and wait for it to let another task run. This will - // notify |allocator_| that the thread is no longer hung. - base::WaitableEvent done_waiting_event( - base::WaitableEvent::ResetPolicy::MANUAL, - base::WaitableEvent::InitialState::NOT_SIGNALED); - TaskRunnerFor(AUTO_CODEC) - ->PostTask(FROM_HERE, - base::BindOnce(&SignalImmediately, &done_waiting_event)); - wait_event.Signal(); - done_waiting_event.Wait(); - - // Verify that we've un-failed over. - ASSERT_EQ(AUTO_CODEC, TaskTypeForAllocation(false)); + ASSERT_TRUE(IsPrimaryTaskRunnerLikelyHung()); } +TEST_F(CodecAllocatorTest, StalledCreateCountsAsHung) { + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); + + // Create codec, but don't pump message loop. + auto config = std::make_unique<VideoCodecConfig>(); + config->codec_type = CodecType::kSecure; + allocator_->CreateMediaCodecAsync(base::DoNothing(), std::move(config)); + tick_clock_.Advance(base::TimeDelta::FromSeconds(1)); + ASSERT_TRUE(IsPrimaryTaskRunnerLikelyHung()); +} + +TEST_F(CodecAllocatorTest, SecureCreationFailsWhenHung) { + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); + + // Release null codec, but don't pump message loop. + allocator_->ReleaseMediaCodec(std::make_unique<MockMediaCodecBridge>(), + base::DoNothing()); + tick_clock_.Advance(base::TimeDelta::FromSeconds(1)); + ASSERT_TRUE(IsPrimaryTaskRunnerLikelyHung()); + + // Secure creation should fail since we're now using software codecs. + auto config = std::make_unique<VideoCodecConfig>(); + config->codec_type = CodecType::kSecure; + base::RunLoop run_loop; + allocator_->CreateMediaCodecAsync( + base::BindOnce( + [](base::OnceClosure quit_closure, + std::unique_ptr<MediaCodecBridge> codec) { + ASSERT_FALSE(codec); + std::move(quit_closure).Run(); + }, + run_loop.QuitClosure()), + std::move(config)); + run_loop.Run(); + + // QuitClosure may run before the initial release processes, so RunUntilIdle + // here such that hung status is cleared. + scoped_task_environment_.RunUntilIdle(); + + // Running the loop should clear hung status. + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); +} + +TEST_F(CodecAllocatorTest, SoftwareCodecUsedWhenHung) { + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); + + // Release null codec, but don't pump message loop. + allocator_->ReleaseMediaCodec(std::make_unique<MockMediaCodecBridge>(), + base::DoNothing()); + tick_clock_.Advance(base::TimeDelta::FromSeconds(1)); + ASSERT_TRUE(IsPrimaryTaskRunnerLikelyHung()); + + // Secure creation should fail since we're now using software codecs. + auto config = std::make_unique<VideoCodecConfig>(); + config->codec_type = CodecType::kAny; + base::RunLoop run_loop; + allocator_->CreateMediaCodecAsync( + base::BindOnce(&CodecAllocatorTest::OnCodecCreatedInternal, + base::Unretained(this), run_loop.QuitClosure()), + std::move(config)); + + EXPECT_CALL(*this, OnCodecCreated(CodecType::kSoftware)); + run_loop.Run(); + + // QuitClosure may run before the initial release processes, so RunUntilIdle + // here such that hung status is cleared. + scoped_task_environment_.RunUntilIdle(); + + // Running the loop should clear hung status. + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); +} + +// Verifies that software codecs are released on the secondary task runner when +// hung and that non-sw codecs are always released on the primary task runner. +TEST_F(CodecAllocatorTest, CodecReleasedOnRightTaskRunnerWhenHung) { + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); + + // Release null codec, but don't pump message loop. + allocator_->ReleaseMediaCodec(std::make_unique<MockMediaCodecBridge>(), + base::DoNothing()); + tick_clock_.Advance(base::TimeDelta::FromSeconds(1)); + ASSERT_TRUE(IsPrimaryTaskRunnerLikelyHung()); + + // Release software codec, ensure it runs on secondary task runner. + auto config = std::make_unique<VideoCodecConfig>(); + config->codec_type = CodecType::kSoftware; + auto sw_codec = MockMediaCodecBridge::CreateVideoDecoder(*config); + reinterpret_cast<MockMediaCodecBridge*>(sw_codec.get()) + ->destruction_cb.ReplaceClosure( + base::BindOnce(&CodecAllocatorTest::VerifyOnSecondaryTaskRunner, + base::Unretained(this))); + allocator_->ReleaseMediaCodec(std::move(sw_codec), base::DoNothing()); + + // Release hardware codec, ensure it runs on primary task runner. + config->codec_type = CodecType::kAny; + auto hw_codec = MockMediaCodecBridge::CreateVideoDecoder(*config); + reinterpret_cast<MockMediaCodecBridge*>(hw_codec.get()) + ->destruction_cb.ReplaceClosure( + base::BindOnce(&CodecAllocatorTest::VerifyOnPrimaryTaskRunner, + base::Unretained(this))); + allocator_->ReleaseMediaCodec(std::move(hw_codec), base::DoNothing()); + + // Release secure (hardware) codec, ensure it runs on primary task runner. + config->codec_type = CodecType::kSecure; + auto secure_codec = MockMediaCodecBridge::CreateVideoDecoder(*config); + reinterpret_cast<MockMediaCodecBridge*>(secure_codec.get()) + ->destruction_cb.ReplaceClosure( + base::BindOnce(&CodecAllocatorTest::VerifyOnPrimaryTaskRunner, + base::Unretained(this))); + allocator_->ReleaseMediaCodec(std::move(secure_codec), base::DoNothing()); + + // QuitClosure may run before the initial release processes, so RunUntilIdle + // here such that hung status is cleared. + scoped_task_environment_.RunUntilIdle(); + + // Running the loop should clear hung status. + ASSERT_FALSE(IsPrimaryTaskRunnerLikelyHung()); +} + +// Make sure that allocating / freeing a codec on the allocator's thread +// completes, and doesn't DCHECK. TEST_F(CodecAllocatorTest, AllocateAndDestroyCodecOnAllocatorThread) { - // Make sure that allocating / freeing a codec on the allocator's thread - // completes, and doesn't DCHECK. - allocator_thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&CodecAllocatorTest::AllocateCodec, - base::Unretained(this))); + CreateAllocatorOnAnotherThread(); - // Wait for the codec on this thread, rather than the allocator thread, since - // that's where the codec will be posted. - avda1_->codec_arrived_event_.Wait(); + { + base::RunLoop run_loop; + auto config = std::make_unique<VideoCodecConfig>(); + config->codec_type = CodecType::kAny; - allocator_thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&CodecAllocatorTest::DestroyCodec, - base::Unretained(this))); + allocator_->CreateMediaCodecAsync( + base::BindOnce(&CodecAllocatorTest::OnCodecCreatedInternal, + base::Unretained(this), run_loop.QuitClosure()), + std::move(config)); + EXPECT_CALL(*this, OnCodecCreated(CodecType::kAny)); + run_loop.Run(); + } - // Note that TearDown will join |allocator_thread_|. - WaitForSurfaceDestruction(); - - // Wait for threads to stop, now that we're not on the allocator thread. - stop_event_.Wait(); -} - -TEST_F(CodecAllocatorTest, AllocateAndDestroyCodecOnNewThread) { - // Make sure that allocating / freeing a codec on a random thread completes, - // and doesn't DCHECK. - base::Thread new_thread("NewThreadForTesting"); - ASSERT_TRUE(new_thread.Start()); - new_thread.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&CodecAllocatorTest::AllocateCodec, - base::Unretained(this))); - - // Wait for the codec on this thread, rather than |new_thread|, since that's - // where the codec will be posted. - avda1_->codec_arrived_event_.Wait(); - - new_thread.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&CodecAllocatorTest::DestroyCodec, - base::Unretained(this))); - new_thread.Stop(); - WaitForSurfaceDestruction(); - stop_event_.Wait(); + { + base::RunLoop run_loop; + allocator_->ReleaseMediaCodec( + std::move(last_created_codec_), + base::BindOnce(&CodecAllocatorTest::OnCodecReleasedInternal, + base::Unretained(this), run_loop.QuitClosure())); + EXPECT_CALL(*this, OnCodecReleased()); + run_loop.Run(); + } } } // namespace media
diff --git a/media/gpu/android/fake_codec_allocator.cc b/media/gpu/android/fake_codec_allocator.cc index f20e9fa..612dfc04 100644 --- a/media/gpu/android/fake_codec_allocator.cc +++ b/media/gpu/android/fake_codec_allocator.cc
@@ -19,79 +19,46 @@ scoped_refptr<base::SequencedTaskRunner> task_runner) : testing::NiceMock<CodecAllocator>( base::BindRepeating(&MockMediaCodecBridge::CreateVideoDecoder), - task_runner), - most_recent_config(new CodecConfig()) {} + std::move(task_runner)) {} FakeCodecAllocator::~FakeCodecAllocator() = default; -void FakeCodecAllocator::StartThread(CodecAllocatorClient* client) {} - -void FakeCodecAllocator::StopThread(CodecAllocatorClient* client) {} - void FakeCodecAllocator::CreateMediaCodecAsync( - base::WeakPtr<CodecAllocatorClient> client, - scoped_refptr<CodecConfig> config) { + CodecCreatedCB codec_created_cb, + std::unique_ptr<VideoCodecConfig> config) { // Clear |most_recent_codec| until somebody calls Provide*CodecAsync(). most_recent_codec = nullptr; most_recent_codec_destruction_observer = nullptr; - CopyCodecConfig(config); - pending_surface_bundle_ = config->surface_bundle; - client_ = client; - codec_creation_pending_ = true; - - MockCreateMediaCodecAsync(most_recent_overlay, most_recent_texture_owner); + most_recent_config = std::move(config); + pending_codec_created_cb_ = std::move(codec_created_cb); + MockCreateMediaCodecAsync(); } void FakeCodecAllocator::ReleaseMediaCodec( std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<CodecSurfaceBundle> surface_bundle) { - MockReleaseMediaCodec(media_codec.get(), surface_bundle->overlay(), - surface_bundle->texture_owner().get()); + base::OnceClosure codec_released_cb) { + std::move(codec_released_cb).Run(); + MockReleaseMediaCodec(media_codec.get()); } MockMediaCodecBridge* FakeCodecAllocator::ProvideMockCodecAsync( std::unique_ptr<MockMediaCodecBridge> codec) { - DCHECK(codec_creation_pending_); - codec_creation_pending_ = false; - - if (!client_) - return nullptr; - + DCHECK(pending_codec_created_cb_); auto mock_codec = codec ? std::move(codec) : std::make_unique<NiceMock<MockMediaCodecBridge>>(); auto* raw_codec = mock_codec.get(); most_recent_codec = raw_codec; most_recent_codec_destruction_observer = mock_codec->CreateDestructionObserver(); - client_->OnCodecConfigured(std::move(mock_codec), - std::move(pending_surface_bundle_)); + + std::move(pending_codec_created_cb_).Run(std::move(mock_codec)); return raw_codec; } void FakeCodecAllocator::ProvideNullCodecAsync() { - DCHECK(codec_creation_pending_); - codec_creation_pending_ = false; + DCHECK(pending_codec_created_cb_); most_recent_codec = nullptr; - if (client_) - client_->OnCodecConfigured(nullptr, std::move(pending_surface_bundle_)); -} - -void FakeCodecAllocator::CopyCodecConfig(scoped_refptr<CodecConfig> config) { - // CodecConfig isn't copyable, since it has unique_ptrs and such. - most_recent_overlay = config->surface_bundle->overlay(); - most_recent_texture_owner = config->surface_bundle->texture_owner().get(); - most_recent_config->media_crypto = - config->media_crypto - ? std::make_unique<base::android::ScopedJavaGlobalRef<jobject>>( - *config->media_crypto) - : nullptr; - most_recent_config->requires_secure_codec = config->requires_secure_codec; - most_recent_config->initial_expected_coded_size = - config->initial_expected_coded_size; - most_recent_config->software_codec_forbidden = - config->software_codec_forbidden; - most_recent_config->csd0 = config->csd0; - most_recent_config->csd1 = config->csd1; + std::move(pending_codec_created_cb_).Run(nullptr); } } // namespace media
diff --git a/media/gpu/android/fake_codec_allocator.h b/media/gpu/android/fake_codec_allocator.h index e2a3714..6816c0a7 100644 --- a/media/gpu/android/fake_codec_allocator.h +++ b/media/gpu/android/fake_codec_allocator.h
@@ -10,7 +10,6 @@ #include "base/sequenced_task_runner.h" #include "media/base/android/mock_media_codec_bridge.h" #include "media/gpu/android/codec_allocator.h" -#include "media/gpu/android/codec_surface_bundle.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/android/surface_texture.h" @@ -21,28 +20,23 @@ // and lets you set expecations on the "Mock*" methods. class FakeCodecAllocator : public testing::NiceMock<CodecAllocator> { public: - FakeCodecAllocator(scoped_refptr<base::SequencedTaskRunner> task_runner); + explicit FakeCodecAllocator( + scoped_refptr<base::SequencedTaskRunner> task_runner); ~FakeCodecAllocator() override; - void StartThread(CodecAllocatorClient* client) override; - void StopThread(CodecAllocatorClient* client) override; - // These are called with some parameters of the codec config by our // implementation of their respective functions. This allows tests to set // expectations on them. - MOCK_METHOD2(MockCreateMediaCodecAsync, void(AndroidOverlay*, TextureOwner*)); + MOCK_METHOD0(MockCreateMediaCodecAsync, void()); // Note that this doesn't exactly match the signature, since unique_ptr - // doesn't work. plus, we expand |surface_bundle| a bit to make it more - // convenient to set expectations. - MOCK_METHOD3(MockReleaseMediaCodec, - void(MediaCodecBridge*, AndroidOverlay*, TextureOwner*)); + // doesn't work. + MOCK_METHOD1(MockReleaseMediaCodec, void(MediaCodecBridge*)); - void CreateMediaCodecAsync(base::WeakPtr<CodecAllocatorClient> client, - scoped_refptr<CodecConfig> config) override; - void ReleaseMediaCodec( - std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<CodecSurfaceBundle> surface_bundle) override; + void CreateMediaCodecAsync(CodecCreatedCB codec_created_cb, + std::unique_ptr<VideoCodecConfig> config) override; + void ReleaseMediaCodec(std::unique_ptr<MediaCodecBridge> media_codec, + base::OnceClosure codec_released_cb) override; // Satisfies the pending codec creation with |codec| if given, or a new // MockMediaCodecBridge if not. Returns a raw pointer to the codec, or nullptr @@ -60,29 +54,11 @@ // The DestructionObserver for |most_recent_codec|. std::unique_ptr<DestructionObserver> most_recent_codec_destruction_observer; - // The most recent overlay provided during codec allocation. - AndroidOverlay* most_recent_overlay = nullptr; - - // The most recent texture owner provided during codec allocation. - TextureOwner* most_recent_texture_owner = nullptr; - - // Whether CreateMediaCodecSync() is allowed to succeed. - bool allow_sync_creation = true; - // Copy of most of the fields in the most recent config, except for the ptrs. - scoped_refptr<CodecConfig> most_recent_config; + std::unique_ptr<VideoCodecConfig> most_recent_config; private: - // Copy |config| to |most_recent_config| etc. - void CopyCodecConfig(scoped_refptr<CodecConfig> config); - - // Whether CreateMediaCodecAsync() has been called but a codec hasn't been - // provided yet. - bool codec_creation_pending_ = false; - base::WeakPtr<CodecAllocatorClient> client_; - - // The surface bundle of the pending codec creation. - scoped_refptr<CodecSurfaceBundle> pending_surface_bundle_; + CodecCreatedCB pending_codec_created_cb_; DISALLOW_COPY_AND_ASSIGN(FakeCodecAllocator); };
diff --git a/media/gpu/android/media_codec_video_decoder.cc b/media/gpu/android/media_codec_video_decoder.cc index f483d64..a774417 100644 --- a/media/gpu/android/media_codec_video_decoder.cc +++ b/media/gpu/android/media_codec_video_decoder.cc
@@ -15,6 +15,7 @@ #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_macros.h" #include "base/threading/sequenced_task_runner_handle.h" +#include "base/trace_event/trace_event.h" #include "media/base/android/media_codec_bridge_impl.h" #include "media/base/android/media_codec_util.h" #include "media/base/bind_to_current_loop.h" @@ -231,7 +232,6 @@ DVLOG(2) << __func__; TRACE_EVENT0("media", "MediaCodecVideoDecoder::~MediaCodecVideoDecoder"); ReleaseCodec(); - codec_allocator_->StopThread(this); } void MediaCodecVideoDecoder::Destroy() { @@ -393,7 +393,6 @@ DVLOG(2) << __func__; TRACE_EVENT0("media", "MediaCodecVideoDecoder::StartLazyInit"); lazy_init_pending_ = false; - codec_allocator_->StartThread(this); // Only ask for promotion hints if we can actually switch surfaces, since we // wouldn't be able to do anything with them. Also, if threaded texture @@ -538,17 +537,15 @@ DCHECK(target_surface_bundle_); DCHECK_EQ(state_, State::kRunning); - scoped_refptr<CodecConfig> config = new CodecConfig(); + auto config = std::make_unique<VideoCodecConfig>(); + if (requires_secure_codec_) + config->codec_type = CodecType::kSecure; config->codec = decoder_config_.codec(); config->csd0 = csd0_; config->csd1 = csd1_; - config->requires_secure_codec = requires_secure_codec_; - // TODO(liberato): per android_util.h, remove JavaObjectPtr. - config->media_crypto = - std::make_unique<base::android::ScopedJavaGlobalRef<jobject>>( - media_crypto_); + config->surface = target_surface_bundle_->GetJavaSurface(); + config->media_crypto = media_crypto_; config->initial_expected_coded_size = decoder_config_.coded_size(); - config->surface_bundle = target_surface_bundle_; config->container_color_space = decoder_config_.color_space_info(); config->hdr_metadata = decoder_config_.hdr_metadata(); @@ -564,12 +561,33 @@ // we're reinitializing the codec without changing surfaces. That's fine. video_frame_factory_->SetSurfaceBundle(target_surface_bundle_); codec_allocator_->CreateMediaCodecAsync( - codec_allocator_weak_factory_.GetWeakPtr(), std::move(config)); + base::BindOnce(&MediaCodecVideoDecoder::OnCodecConfiguredInternal, + codec_allocator_weak_factory_.GetWeakPtr(), + codec_allocator_, target_surface_bundle_), + std::move(config)); +} + +// static +void MediaCodecVideoDecoder::OnCodecConfiguredInternal( + base::WeakPtr<MediaCodecVideoDecoder> weak_this, + CodecAllocator* codec_allocator, + scoped_refptr<CodecSurfaceBundle> surface_bundle, + std::unique_ptr<MediaCodecBridge> codec) { + if (!weak_this) { + codec_allocator->ReleaseMediaCodec( + std::move(codec), + base::BindOnce( + &base::SequencedTaskRunner::ReleaseSoon<CodecSurfaceBundle>, + base::SequencedTaskRunnerHandle::Get(), FROM_HERE, + std::move(surface_bundle))); + return; + } + weak_this->OnCodecConfigured(std::move(surface_bundle), std::move(codec)); } void MediaCodecVideoDecoder::OnCodecConfigured( - std::unique_ptr<MediaCodecBridge> codec, - scoped_refptr<CodecSurfaceBundle> surface_bundle) { + scoped_refptr<CodecSurfaceBundle> surface_bundle, + std::unique_ptr<MediaCodecBridge> codec) { DCHECK(!codec_); DCHECK_EQ(state_, State::kRunning); @@ -985,8 +1003,12 @@ return; auto pair = codec_->TakeCodecSurfacePair(); codec_ = nullptr; - codec_allocator_->ReleaseMediaCodec(std::move(pair.first), - std::move(pair.second)); + codec_allocator_->ReleaseMediaCodec( + std::move(pair.first), + base::BindOnce( + &base::SequencedTaskRunner::ReleaseSoon<CodecSurfaceBundle>, + base::SequencedTaskRunnerHandle::Get(), FROM_HERE, + std::move(pair.second))); } AndroidOverlayFactoryCB MediaCodecVideoDecoder::CreateOverlayFactoryCb() {
diff --git a/media/gpu/android/media_codec_video_decoder.h b/media/gpu/android/media_codec_video_decoder.h index 329da3a..4c2c17b 100644 --- a/media/gpu/android/media_codec_video_decoder.h +++ b/media/gpu/android/media_codec_video_decoder.h
@@ -14,9 +14,11 @@ #include "base/timer/timer.h" #include "gpu/config/gpu_feature_info.h" #include "gpu/config/gpu_preferences.h" +#include "media/base/android/media_crypto_context.h" #include "media/base/android_overlay_mojo_factory.h" #include "media/base/overlay_info.h" #include "media/base/video_decoder.h" +#include "media/base/video_decoder_config.h" #include "media/gpu/android/android_video_surface_chooser.h" #include "media/gpu/android/codec_allocator.h" #include "media/gpu/android/codec_wrapper.h" @@ -55,8 +57,7 @@ // playbacks that need them. // TODO: Lazy initialization should be handled at a higher layer of the media // stack for both simplicity and cross platform support. -class MEDIA_GPU_EXPORT MediaCodecVideoDecoder : public VideoDecoder, - public CodecAllocatorClient { +class MEDIA_GPU_EXPORT MediaCodecVideoDecoder : public VideoDecoder { public: static std::vector<SupportedVideoDecoderConfig> GetSupportedConfigs(); @@ -148,10 +149,15 @@ // Creates a codec asynchronously. void CreateCodec(); - // CodecAllocatorClient implementation. - void OnCodecConfigured( - std::unique_ptr<MediaCodecBridge> media_codec, - scoped_refptr<CodecSurfaceBundle> surface_bundle) override; + // Trampoline helper which ensures correct release of MediaCodecBridge and + // CodecSurfaceBundle even if this class goes away. + static void OnCodecConfiguredInternal( + base::WeakPtr<MediaCodecVideoDecoder> weak_this, + CodecAllocator* codec_allocator, + scoped_refptr<CodecSurfaceBundle> surface_bundle, + std::unique_ptr<MediaCodecBridge> codec); + void OnCodecConfigured(scoped_refptr<CodecSurfaceBundle> surface_bundle, + std::unique_ptr<MediaCodecBridge> media_codec); // Flushes the codec, or if flush() is not supported, releases it and creates // a new one.
diff --git a/media/gpu/android/media_codec_video_decoder_unittest.cc b/media/gpu/android/media_codec_video_decoder_unittest.cc index 2da147dc..f801bc2 100644 --- a/media/gpu/android/media_codec_video_decoder_unittest.cc +++ b/media/gpu/android/media_codec_video_decoder_unittest.cc
@@ -33,6 +33,7 @@ using testing::NiceMock; using testing::NotNull; using testing::Return; +using testing::ReturnRef; using testing::SaveArg; namespace media { @@ -217,6 +218,14 @@ provide_overlay_info_cb_.Run(info); auto overlay_ptr = std::make_unique<MockAndroidOverlay>(); auto* overlay = overlay_ptr.get(); + + if (!java_surface_) { + java_surface_ = base::android::ScopedJavaGlobalRef<jobject>( + gl::SurfaceTexture::Create(0)->j_surface_texture()); + } + EXPECT_CALL(*overlay, GetJavaSurface()) + .WillRepeatedly(ReturnRef(java_surface_)); + surface_chooser_->ProvideOverlay(std::move(overlay_ptr)); return overlay; } @@ -269,6 +278,7 @@ protected: const VideoCodec codec_; base::test::ScopedTaskEnvironment scoped_task_environment_; + base::android::ScopedJavaGlobalRef<jobject> java_surface_; scoped_refptr<DecoderBuffer> fake_decoder_buffer_; std::unique_ptr<MockDeviceInfo> device_info_; std::unique_ptr<FakeCodecAllocator> codec_allocator_; @@ -322,7 +332,7 @@ EXPECT_CALL(*video_frame_factory_, Initialize(ExpectedOverlayMode(), _)) .Times(0); EXPECT_CALL(*surface_chooser_, MockUpdateState()).Times(0); - EXPECT_CALL(*codec_allocator_, MockCreateMediaCodecAsync(_, _)).Times(0); + EXPECT_CALL(*codec_allocator_, MockCreateMediaCodecAsync()).Times(0); Initialize(TestVideoConfig::Large(codec_)); } @@ -376,7 +386,7 @@ Initialize(TestVideoConfig::Large(codec_)); mcvd_->Decode(fake_decoder_buffer_, decode_cb_.Get()); provide_overlay_info_cb_.Run(OverlayInfo()); - EXPECT_CALL(*codec_allocator_, MockCreateMediaCodecAsync(_, NotNull())); + EXPECT_CALL(*codec_allocator_, MockCreateMediaCodecAsync()); surface_chooser_->ProvideTextureOwner(); } @@ -423,7 +433,7 @@ TEST_P(MediaCodecVideoDecoderTest, CodecIsReleasedOnDestruction) { auto* codec = InitializeFully_OneDecodePending(TestVideoConfig::Large(codec_)); - EXPECT_CALL(*codec_allocator_, MockReleaseMediaCodec(codec, _, _)); + EXPECT_CALL(*codec_allocator_, MockReleaseMediaCodec(codec)); } TEST_P(MediaCodecVideoDecoderTest, SurfaceChooserIsUpdatedOnOverlayChanges) { @@ -462,12 +472,11 @@ } TEST_P(MediaCodecVideoDecoderTest, CodecIsCreatedWithChosenOverlay) { - AndroidOverlay* overlay_passed_to_codec = nullptr; - EXPECT_CALL(*codec_allocator_, MockCreateMediaCodecAsync(_, _)) - .WillOnce(SaveArg<0>(&overlay_passed_to_codec)); - auto* overlay = - InitializeWithOverlay_OneDecodePending(TestVideoConfig::Large(codec_)); - DCHECK_EQ(overlay, overlay_passed_to_codec); + EXPECT_CALL(*codec_allocator_, MockCreateMediaCodecAsync()); + InitializeWithOverlay_OneDecodePending(TestVideoConfig::Large(codec_)); + EXPECT_TRUE(base::android::AttachCurrentThread()->IsSameObject( + java_surface_.obj(), + codec_allocator_->most_recent_config->surface.obj())); } TEST_P(MediaCodecVideoDecoderTest, @@ -478,10 +487,10 @@ InitializeWithOverlay_OneDecodePending(TestVideoConfig::Large(codec_)); overlay->OnSurfaceDestroyed(); - // MCVD should invalidate its CodecAllocatorClient WeakPtr so that it doesn't - // receive the codec after surface destroyed. FakeCodecAllocator returns - // nullptr if the client pointer was invalidated. - ASSERT_FALSE(codec_allocator_->ProvideMockCodecAsync()); + // MCVD handles release of the MediaCodec after WeakPtr invalidation. + EXPECT_CALL(*codec_allocator_, MockReleaseMediaCodec(NotNull())); + auto* codec = codec_allocator_->ProvideMockCodecAsync(); + ASSERT_TRUE(!!codec); } TEST_P(MediaCodecVideoDecoderTest, SurfaceChangedWhileCodecCreationPending) { @@ -519,7 +528,7 @@ // MCVD must synchronously release the codec. EXPECT_CALL(*codec, SetSurface(_)).Times(0); - EXPECT_CALL(*codec_allocator_, MockReleaseMediaCodec(codec, NotNull(), _)); + EXPECT_CALL(*codec_allocator_, MockReleaseMediaCodec(codec)); overlay->OnSurfaceDestroyed(); // Verify expectations before we delete the MCVD. testing::Mock::VerifyAndClearExpectations(codec_allocator_.get()); @@ -543,7 +552,7 @@ surface_chooser_->ProvideTextureOwner(); EXPECT_CALL(*codec, SetSurface(_)).WillOnce(Return(false)); EXPECT_CALL(decode_cb_, Run(DecodeStatus::DECODE_ERROR)).Times(2); - EXPECT_CALL(*codec_allocator_, MockReleaseMediaCodec(codec, NotNull(), _)); + EXPECT_CALL(*codec_allocator_, MockReleaseMediaCodec(codec)); mcvd_->Decode(fake_decoder_buffer_, decode_cb_.Get()); // Verify expectations before we delete the MCVD. testing::Mock::VerifyAndClearExpectations(codec_allocator_.get()); @@ -788,8 +797,9 @@ mcvd_.reset(); // DeleteSoon() is now pending. Ensure it's safe if the codec creation // completes before it runs. - ASSERT_FALSE(codec_allocator_->ProvideMockCodecAsync()); destruction_observer_->ExpectDestruction(); + EXPECT_CALL(*codec_allocator_, MockReleaseMediaCodec(NotNull())); + ASSERT_TRUE(codec_allocator_->ProvideMockCodecAsync()); } TEST_P(MediaCodecVideoDecoderTest, TeardownDoesNotDrainFlushedCodecs) { @@ -848,9 +858,9 @@ ASSERT_TRUE(!!cdm_->ran_media_crypto_ready_cb); ASSERT_EQ(surface_chooser_->current_state_.is_secure, true); ASSERT_EQ(surface_chooser_->current_state_.is_required, false); - ASSERT_FALSE(codec_allocator_->most_recent_config->requires_secure_codec); + ASSERT_EQ(codec_allocator_->most_recent_config->codec_type, CodecType::kAny); // We can't check for equality safely, but verify that something was provided. - ASSERT_TRUE(codec_allocator_->most_recent_config->media_crypto->obj()); + ASSERT_TRUE(codec_allocator_->most_recent_config->media_crypto); // When |mcvd_| is destroyed, expect that it will unregister itself. EXPECT_CALL(*cdm_, UnregisterPlayer(MockMediaCryptoContext::kRegistrationId)); @@ -867,8 +877,9 @@ ASSERT_TRUE(!!cdm_->ran_media_crypto_ready_cb); ASSERT_EQ(surface_chooser_->current_state_.is_secure, true); ASSERT_EQ(surface_chooser_->current_state_.is_required, true); - ASSERT_TRUE(codec_allocator_->most_recent_config->requires_secure_codec); - ASSERT_TRUE(codec_allocator_->most_recent_config->media_crypto->obj()); + ASSERT_EQ(codec_allocator_->most_recent_config->codec_type, + CodecType::kSecure); + ASSERT_TRUE(codec_allocator_->most_recent_config->media_crypto); // When |mcvd_| is destroyed, expect that it will unregister itself. EXPECT_CALL(*cdm_, UnregisterPlayer(MockMediaCryptoContext::kRegistrationId)); @@ -886,9 +897,10 @@ ASSERT_TRUE(!!cdm_->ran_media_crypto_ready_cb); ASSERT_EQ(surface_chooser_->current_state_.is_secure, true); ASSERT_EQ(surface_chooser_->current_state_.is_required, false); - ASSERT_FALSE(codec_allocator_->most_recent_config->requires_secure_codec); + ASSERT_NE(codec_allocator_->most_recent_config->codec_type, + CodecType::kSecure); // We can't check for equality safely, but verify that something was provided. - ASSERT_TRUE(codec_allocator_->most_recent_config->media_crypto->obj()); + ASSERT_TRUE(codec_allocator_->most_recent_config->media_crypto); // When |mcvd_| is destroyed, expect that it will unregister itself. EXPECT_CALL(*cdm_, UnregisterPlayer(MockMediaCryptoContext::kRegistrationId)); @@ -905,7 +917,9 @@ ASSERT_FALSE(!!cdm_->ran_media_crypto_ready_cb); ASSERT_EQ(surface_chooser_->current_state_.is_secure, false); ASSERT_EQ(surface_chooser_->current_state_.is_required, false); - ASSERT_FALSE(codec_allocator_->most_recent_config->requires_secure_codec); + ASSERT_NE(codec_allocator_->most_recent_config->codec_type, + CodecType::kSecure); + ASSERT_FALSE(codec_allocator_->most_recent_config->media_crypto); } TEST_P(MediaCodecVideoDecoderTest, NoMediaCryptoContext_EncryptedStream) {
diff --git a/mojo/public/java/system/base_run_loop.cc b/mojo/public/java/system/base_run_loop.cc index 5b14852..a39f2db 100644 --- a/mojo/public/java/system/base_run_loop.cc +++ b/mojo/public/java/system/base_run_loop.cc
@@ -8,9 +8,9 @@ #include "base/android/scoped_java_ref.h" #include "base/bind.h" #include "base/logging.h" -#include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" +#include "base/task/single_thread_task_executor.h" #include "jni/BaseRunLoop_jni.h" using base::android::JavaParamRef; @@ -21,8 +21,9 @@ static jlong JNI_BaseRunLoop_CreateBaseRunLoop( JNIEnv* env, const JavaParamRef<jobject>& jcaller) { - base::MessageLoop* message_loop = new base::MessageLoop; - return reinterpret_cast<uintptr_t>(message_loop); + base::SingleThreadTaskExecutor* task_executor = + new base::SingleThreadTaskExecutor; + return reinterpret_cast<uintptr_t>(task_executor); } static void JNI_BaseRunLoop_Run(JNIEnv* env, @@ -57,7 +58,7 @@ // use it across threads. |RunJavaRunnable| will acquire a new JNIEnv before // running the Runnable. runnable_ref.Reset(env, runnable); - reinterpret_cast<base::MessageLoop*>(runLoopID) + reinterpret_cast<base::SingleThreadTaskExecutor*>(runLoopID) ->task_runner() ->PostDelayedTask(FROM_HERE, base::BindOnce(&RunJavaRunnable, runnable_ref), @@ -68,9 +69,9 @@ JNIEnv* env, const JavaParamRef<jobject>& jcaller, jlong runLoopID) { - base::MessageLoop* message_loop = - reinterpret_cast<base::MessageLoop*>(runLoopID); - delete message_loop; + base::SingleThreadTaskExecutor* task_executor = + reinterpret_cast<base::SingleThreadTaskExecutor*>(runLoopID); + delete task_executor; } } // namespace android
diff --git a/net/quic/quic_test_packet_maker.cc b/net/quic/quic_test_packet_maker.cc index b552c33c..43ea3ee 100644 --- a/net/quic/quic_test_packet_maker.cc +++ b/net/quic/quic_test_packet_maker.cc
@@ -9,6 +9,7 @@ #include "net/quic/mock_crypto_client_stream.h" #include "net/quic/quic_http_utils.h" +#include "net/third_party/quiche/src/quic/core/http/quic_spdy_session.h" #include "net/third_party/quiche/src/quic/core/quic_framer.h" #include "net/third_party/quiche/src/quic/core/quic_utils.h" #include "net/third_party/quiche/src/quic/test_tools/mock_random.h" @@ -1204,17 +1205,43 @@ QuicTestPacketMaker::MakeInitialSettingsPacketAndSaveData( uint64_t packet_number, std::string* stream_data) { - spdy::SpdySettingsIR settings_frame; - settings_frame.AddSetting(spdy::SETTINGS_MAX_HEADER_LIST_SIZE, - quic::kDefaultMaxUncompressedHeaderSize); - spdy::SpdySerializedFrame spdy_frame( - spdy_request_framer_.SerializeFrame(settings_frame)); + if (!quic::VersionHasStreamType(version_.transport_version)) { + spdy::SpdySettingsIR settings_frame; + settings_frame.AddSetting(spdy::SETTINGS_MAX_HEADER_LIST_SIZE, + quic::kDefaultMaxUncompressedHeaderSize); + spdy::SpdySerializedFrame spdy_frame( + spdy_request_framer_.SerializeFrame(settings_frame)); + InitializeHeader(packet_number, /*should_include_version*/ true); + *stream_data = std::string(spdy_frame.data(), spdy_frame.size()); + quic::QuicStreamFrame quic_frame = GenerateNextStreamFrame( + quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, + quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())); + return MakePacket(header_, quic::QuicFrame(quic_frame)); + } + quic::QuicFrames frames; + // A stream frame containing stream type will be written on the control stream + // first. + char type[] = {0x00}; + quic::QuicStreamFrame type_frame = + GenerateNextStreamFrame(quic::QuicUtils::GetFirstUnidirectionalStreamId( + version_.transport_version, perspective_), + false, quic::QuicStringPiece(type, 1)); + frames.push_back(quic::QuicFrame(type_frame)); + + quic::SettingsFrame settings; + settings.values[quic::kSettingsMaxHeaderListSize] = + quic::kDefaultMaxUncompressedHeaderSize; + std::unique_ptr<char[]> buffer; + quic::QuicByteCount frame_length = + encoder_.SerializeSettingsFrame(settings, &buffer); InitializeHeader(packet_number, /*should_include_version*/ true); - *stream_data = std::string(spdy_frame.data(), spdy_frame.size()); + *stream_data = std::string(type, 1) + std::string(buffer.get(), frame_length); quic::QuicStreamFrame quic_frame = GenerateNextStreamFrame( - quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, - quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())); - return MakePacket(header_, quic::QuicFrame(quic_frame)); + quic::QuicUtils::GetFirstUnidirectionalStreamId( + version_.transport_version, perspective_), + false, quic::QuicStringPiece(buffer.get(), frame_length)); + frames.push_back(quic::QuicFrame(quic_frame)); + return MakeMultipleFramesPacket(header_, frames, nullptr); } std::unique_ptr<quic::QuicReceivedPacket>
diff --git a/net/quic/quic_test_packet_maker.h b/net/quic/quic_test_packet_maker.h index 06ebb9c9..dd9d6062 100644 --- a/net/quic/quic_test_packet_maker.h +++ b/net/quic/quic_test_packet_maker.h
@@ -15,6 +15,7 @@ #include "base/macros.h" #include "net/base/request_priority.h" +#include "net/third_party/quiche/src/quic/core/http/http_encoder.h" #include "net/third_party/quiche/src/quic/core/quic_packets.h" #include "net/third_party/quiche/src/quic/core/quic_stream_frame_data_producer.h" #include "net/third_party/quiche/src/quic/core/quic_utils.h" @@ -386,6 +387,7 @@ std::string host_; spdy::SpdyFramer spdy_request_framer_; spdy::SpdyFramer spdy_response_framer_; + quic::HttpEncoder encoder_; quic::test::MockRandom random_generator_; std::map<quic::QuicStreamId, quic::QuicStreamOffset> stream_offsets_; quic::QuicPacketHeader header_;
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc index 3b23b56..50751a9 100644 --- a/net/url_request/url_request_unittest.cc +++ b/net/url_request/url_request_unittest.cc
@@ -8658,6 +8658,39 @@ } } +TEST_F(URLRequestTestHTTP, AuthChallengeCancelCookieCollect) { + ASSERT_TRUE(http_test_server()->Start()); + GURL url_requiring_auth = + http_test_server()->GetURL("/auth-basic?set-cookie-if-challenged"); + + FilteringTestLayeredNetworkDelegate filtering_network_delegate( + std::make_unique<TestNetworkDelegate>()); + filtering_network_delegate.SetCookieFilter("got_challenged"); + TestURLRequestContext context(true); + context.set_network_delegate(&filtering_network_delegate); + context.Init(); + + TestDelegate delegate; + + std::unique_ptr<URLRequest> request( + context.CreateRequest(url_requiring_auth, DEFAULT_PRIORITY, &delegate, + TRAFFIC_ANNOTATION_FOR_TESTS)); + request->set_site_for_cookies(url_requiring_auth); + request->Start(); + + delegate.RunUntilAuthRequired(); + ASSERT_EQ(1u, request->not_stored_cookies().size()); + EXPECT_EQ( + net::CanonicalCookie::CookieInclusionStatus::EXCLUDE_USER_PREFERENCES, + request->not_stored_cookies()[0].status); + EXPECT_EQ("got_challenged=true", + request->not_stored_cookies()[0].cookie_string); + + // This shouldn't DCHECK-fail. + request->CancelAuth(); + delegate.RunUntilComplete(); +} + TEST_F(URLRequestTestHTTP, AuthChallengeWithFilteredCookies) { ASSERT_TRUE(http_test_server()->Start());
diff --git a/sandbox/linux/seccomp-bpf-helpers/baseline_policy_android.cc b/sandbox/linux/seccomp-bpf-helpers/baseline_policy_android.cc index ba2d363..ab194e2b 100644 --- a/sandbox/linux/seccomp-bpf-helpers/baseline_policy_android.cc +++ b/sandbox/linux/seccomp-bpf-helpers/baseline_policy_android.cc
@@ -94,6 +94,7 @@ case __NR_getdents64: case __NR_getpriority: case __NR_ioctl: + case __NR_membarrier: // https://crbug.com/966433 case __NR_mremap: #if defined(__i386__) // Used on pre-N to initialize threads in ART.
diff --git a/services/device/wake_lock/power_save_blocker/android/java/src/org/chromium/device/power_save_blocker/PowerSaveBlocker.java b/services/device/wake_lock/power_save_blocker/android/java/src/org/chromium/device/power_save_blocker/PowerSaveBlocker.java index f83cb43..9a547ad 100644 --- a/services/device/wake_lock/power_save_blocker/android/java/src/org/chromium/device/power_save_blocker/PowerSaveBlocker.java +++ b/services/device/wake_lock/power_save_blocker/android/java/src/org/chromium/device/power_save_blocker/PowerSaveBlocker.java
@@ -10,9 +10,14 @@ import org.chromium.base.annotations.JNINamespace; import java.lang.ref.WeakReference; +import java.util.HashMap; @JNINamespace("device") class PowerSaveBlocker { + // Counter associated to a view to know how many PowerSaveBlocker are + // currently registered. + private static HashMap<View, Integer> sBlockViewCounter = new HashMap<View, Integer>(); + // WeakReference to prevent leaks in Android WebView. private WeakReference<View> mKeepScreenOnView; @@ -27,7 +32,17 @@ private void applyBlock(View view) { assert mKeepScreenOnView == null; mKeepScreenOnView = new WeakReference<>(view); - view.setKeepScreenOn(true); + + Integer prev_counter = sBlockViewCounter.get(view); + + if (prev_counter == null) { + sBlockViewCounter.put(view, 1); + } else { + assert prev_counter.intValue() >= 0; + sBlockViewCounter.put(view, prev_counter.intValue() + 1); + } + + if (prev_counter == null || prev_counter.intValue() == 0) view.setKeepScreenOn(true); } @CalledByNative @@ -35,10 +50,15 @@ // mKeepScreenOnView may be null since it's possible that |applyBlock()| was // not invoked due to having failed to get a view to call |setKeepScrenOn| on. if (mKeepScreenOnView == null) return; + View view = mKeepScreenOnView.get(); mKeepScreenOnView = null; - if (view == null) return; - view.setKeepScreenOn(false); + Integer prev_counter = sBlockViewCounter.get(view); + assert prev_counter != null; + assert prev_counter.intValue() > 0; + sBlockViewCounter.put(view, prev_counter.intValue() - 1); + + if (prev_counter.intValue() == 1) view.setKeepScreenOn(false); } }
diff --git a/services/media_session/audio_focus_manager.cc b/services/media_session/audio_focus_manager.cc index 0e63a06..88a5c61 100644 --- a/services/media_session/audio_focus_manager.cc +++ b/services/media_session/audio_focus_manager.cc
@@ -106,6 +106,8 @@ bool was_top_most_session = audio_focus_stack_.back()->id() == id; auto row = RemoveFocusEntryIfPresent(id); + if (!row) + return; EnforceAudioFocus(); MaybeUpdateActiveSession();
diff --git a/services/network/cors/cors_url_loader.cc b/services/network/cors/cors_url_loader.cc index 2da9dc78..01e606ed 100644 --- a/services/network/cors/cors_url_loader.cc +++ b/services/network/cors/cors_url_loader.cc
@@ -9,6 +9,7 @@ #include "base/stl_util.h" #include "net/base/load_flags.h" #include "services/network/cors/preflight_controller.h" +#include "services/network/loader_util.h" #include "services/network/public/cpp/cors/cors.h" #include "services/network/public/cpp/cors/origin_access_list.h" #include "url/url_util.h" @@ -161,6 +162,11 @@ } request_.headers.MergeFrom(modified_headers); + if (!AreRequestHeadersSafe(request_.headers)) { + HandleComplete(URLLoaderCompletionStatus(net::ERR_INVALID_ARGUMENT)); + return; + } + const std::string original_method = std::move(request_.method); request_.url = redirect_info_.new_url; request_.method = redirect_info_.new_method;
diff --git a/services/network/cors/cors_url_loader_factory.cc b/services/network/cors/cors_url_loader_factory.cc index 20daf7b..7c3f7c28 100644 --- a/services/network/cors/cors_url_loader_factory.cc +++ b/services/network/cors/cors_url_loader_factory.cc
@@ -14,6 +14,7 @@ #include "services/network/cors/cors_url_loader.h" #include "services/network/cors/preflight_controller.h" #include "services/network/initiator_lock_compatibility.h" +#include "services/network/loader_util.h" #include "services/network/network_context.h" #include "services/network/public/cpp/cors/cors.h" #include "services/network/public/cpp/features.h" @@ -215,10 +216,8 @@ } } - // Disallow setting the Host header over mojo::URLLoaderFactory interface - // because it can conflict with specified URL and make servers confused. - if (request.headers.HasHeader(net::HttpRequestHeaders::kHost)) { - LOG(WARNING) << "Host header should be set inside the network service"; + if (!AreRequestHeadersSafe(request.headers) || + !AreRequestHeadersSafe(request.cors_exempt_headers)) { return false; }
diff --git a/services/network/cors/cors_url_loader_unittest.cc b/services/network/cors/cors_url_loader_unittest.cc index cc35cd9c..3e465cb4 100644 --- a/services/network/cors/cors_url_loader_unittest.cc +++ b/services/network/cors/cors_url_loader_unittest.cc
@@ -227,6 +227,15 @@ base::nullopt /*new_url*/); } + void AddHostHeaderAndFollowRedirect() { + DCHECK(url_loader_); + net::HttpRequestHeaders modified_headers; + modified_headers.SetHeader(net::HttpRequestHeaders::kHost, "bar.test"); + url_loader_->FollowRedirect({}, // removed_headers + modified_headers, + base::nullopt); // new_url + } + const ResourceRequest& GetRequest() const { DCHECK(test_url_loader_factory_); return test_url_loader_factory_->request(); @@ -1584,6 +1593,49 @@ true, &origin_access_list)); } +TEST_F(CorsURLLoaderTest, RequestWithHostHeaderFails) { + ResourceRequest request; + request.fetch_request_mode = mojom::FetchRequestMode::kCors; + request.fetch_credentials_mode = mojom::FetchCredentialsMode::kOmit; + request.allow_credentials = false; + request.method = net::HttpRequestHeaders::kGetMethod; + request.url = GURL("https://foo.test/path"); + request.request_initiator = url::Origin::Create(GURL("https://foo.test")); + request.headers.SetHeader(net::HttpRequestHeaders::kHost, "bar.test"); + CreateLoaderAndStart(request); + + RunUntilComplete(); + + EXPECT_FALSE(client().has_received_response()); + EXPECT_TRUE(client().has_received_completion()); + EXPECT_EQ(net::ERR_INVALID_ARGUMENT, client().completion_status().error_code); +} + +TEST_F(CorsURLLoaderTest, SetHostHeaderOnRedirectFails) { + CreateLoaderAndStart(GURL("http://foo.test/"), GURL("http://foo.test/path"), + mojom::FetchRequestMode::kCors); + + NotifyLoaderClientOnReceiveRedirect( + CreateRedirectInfo(301, "GET", GURL("https://redirect.test/"))); + RunUntilRedirectReceived(); + + EXPECT_TRUE(IsNetworkLoaderStarted()); + EXPECT_TRUE(client().has_received_redirect()); + EXPECT_FALSE(client().has_received_response()); + EXPECT_FALSE(client().has_received_completion()); + + ClearHasReceivedRedirect(); + // This should cause the request to fail. + AddHostHeaderAndFollowRedirect(); + + RunUntilComplete(); + + EXPECT_FALSE(client().has_received_redirect()); + EXPECT_FALSE(client().has_received_response()); + EXPECT_TRUE(client().has_received_completion()); + EXPECT_EQ(net::ERR_INVALID_ARGUMENT, client().completion_status().error_code); +} + } // namespace } // namespace cors
diff --git a/services/network/loader_util.cc b/services/network/loader_util.cc index 598cab4..e1e104e 100644 --- a/services/network/loader_util.cc +++ b/services/network/loader_util.cc
@@ -7,10 +7,12 @@ #include <string> #include "base/command_line.h" +#include "base/logging.h" #include "base/strings/stringprintf.h" #include "net/base/load_flags.h" #include "net/base/mime_sniffer.h" #include "net/http/http_raw_request_headers.h" +#include "net/http/http_request_headers.h" #include "net/http/http_util.h" #include "net/url_request/url_request.h" #include "services/network/public/cpp/http_raw_request_response_info.h" @@ -107,4 +109,15 @@ return referrer.spec(); } +bool AreRequestHeadersSafe(const net::HttpRequestHeaders& request_headers) { + // Disallow setting the Host header because it can conflict with specified URL + // and logic related to isolating sites. + if (request_headers.HasHeader(net::HttpRequestHeaders::kHost)) { + LOG(WARNING) + << "Host header should not be set from outside the network service"; + return false; + } + return true; +} + } // namespace network
diff --git a/services/network/loader_util.h b/services/network/loader_util.h index 5f41716..d73f315 100644 --- a/services/network/loader_util.h +++ b/services/network/loader_util.h
@@ -12,6 +12,7 @@ namespace net { class HttpRawRequestHeaders; +class HttpRequestHeaders; class HttpResponseHeaders; class URLRequest; } // namespace net @@ -54,6 +55,12 @@ COMPONENT_EXPORT(NETWORK_SERVICE) std::string ComputeReferrer(const GURL& referrer); +// Any single headers in a set of request headers are not safe to send. When +// adding sets of headers together, it's safe to call this on each set +// individually. +COMPONENT_EXPORT(NETWORK_SERVICE) +bool AreRequestHeadersSafe(const net::HttpRequestHeaders& request_headers); + } // namespace network #endif // SERVICES_NETWORK_LOADER_UTIL_H_
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc index 23780c6..b7b3a67 100644 --- a/services/network/url_loader.cc +++ b/services/network/url_loader.cc
@@ -400,6 +400,9 @@ // they should be ignored by CORS checks. net::HttpRequestHeaders merged_headers = request.headers; merged_headers.MergeFrom(request.cors_exempt_headers); + // This should be ensured by the CorsURLLoaderFactory(), which is called + // before URLLoaders are created. + DCHECK(AreRequestHeadersSafe(merged_headers)); url_request_->SetExtraRequestHeaders(merged_headers); url_request_->SetUserData(kUserDataKey, @@ -652,6 +655,14 @@ return; } + // Removing headers can't make the set of pre-existing headers unsafe, but + // adding headers can. + if (!AreRequestHeadersSafe(modified_headers)) { + NotifyCompleted(net::ERR_INVALID_ARGUMENT); + // |this| may have been deleted. + return; + } + deferred_redirect_url_.reset(); new_redirect_url_ = new_url; @@ -734,6 +745,8 @@ raw_response_headers_ = nullptr; } + ReportFlaggedResponseCookies(); + // Enforce the Cross-Origin-Resource-Policy (CORP) header. if (CrossOriginResourcePolicy::kBlock == CrossOriginResourcePolicy::Verify( @@ -841,6 +854,8 @@ void URLLoader::OnResponseStarted(net::URLRequest* url_request, int net_error) { DCHECK(url_request == url_request_.get()); + ReportFlaggedResponseCookies(); + if (net_error != net::OK) { NotifyCompleted(net_error); // |this| may have been deleted. @@ -1123,32 +1138,6 @@ const net::HttpResponseHeaders* original_response_headers, scoped_refptr<net::HttpResponseHeaders>* override_response_headers, GURL* allowed_unsafe_redirect_url) { - if (network_service_client_) { - // For now we're only using excluded/flagged cookies pertaining to the - // samesite-by-default and samesite-none-must-be-secure features, so the - // flagged cookies are being further filtered beofre sending. - net::CookieAndLineStatusList flagged_cookies; - for (const auto& cookie_line_and_status : - url_request_->not_stored_cookies()) { - if (cookie_line_and_status.status == - net::CanonicalCookie::CookieInclusionStatus:: - EXCLUDE_SAMESITE_UNSPECIFIED_TREATED_AS_LAX || - cookie_line_and_status.status == - net::CanonicalCookie::CookieInclusionStatus:: - EXCLUDE_SAMESITE_NONE_INSECURE) { - flagged_cookies.emplace_back(cookie_line_and_status.cookie, - cookie_line_and_status.cookie_string, - cookie_line_and_status.status); - } - } - - if (!flagged_cookies.empty()) { - // TODO(crbug.com/856777): add OnRawResponse once implemented - network_service_client_->OnFlaggedResponseCookies( - GetProcessId(), GetRenderFrameId(), flagged_cookies); - } - } - if (header_client_) { header_client_->OnHeadersReceived( original_response_headers->raw_headers(), @@ -1216,6 +1205,9 @@ if (!credentials.has_value()) { url_request_->CancelAuth(); } else { + // CancelAuth will proceed to the body, so cookies only need to be reported + // here. + ReportFlaggedResponseCookies(); url_request_->SetAuth(credentials.value()); } } @@ -1542,4 +1534,33 @@ return kWillCancelRequest; } +void URLLoader::ReportFlaggedResponseCookies() { + if (network_service_client_) { + // For now we're only using excluded/flagged cookies pertaining to the + // samesite-by-default and samesite-none-must-be-secure features, so the + // flagged cookies are being further filtered beofre sending. + net::CookieAndLineStatusList flagged_cookies; + for (const auto& cookie_line_and_status : + url_request_->not_stored_cookies()) { + if (cookie_line_and_status.status == + net::CanonicalCookie::CookieInclusionStatus:: + EXCLUDE_SAMESITE_UNSPECIFIED_TREATED_AS_LAX || + cookie_line_and_status.status == + net::CanonicalCookie::CookieInclusionStatus:: + EXCLUDE_SAMESITE_NONE_INSECURE) { + flagged_cookies.emplace_back(cookie_line_and_status.cookie, + cookie_line_and_status.cookie_string, + cookie_line_and_status.status); + } + } + + if (!flagged_cookies.empty()) { + // TODO(crbug.com/856777): add OnRawResponse once implemented. + // (might want to change method name at that point). + network_service_client_->OnFlaggedResponseCookies( + GetProcessId(), GetRenderFrameId(), flagged_cookies); + } + } +} + } // namespace network
diff --git a/services/network/url_loader.h b/services/network/url_loader.h index 04f6226..3c8f97ec 100644 --- a/services/network/url_loader.h +++ b/services/network/url_loader.h
@@ -232,6 +232,8 @@ }; BlockResponseForCorbResult BlockResponseForCorb(); + void ReportFlaggedResponseCookies(); + net::URLRequestContext* url_request_context_; mojom::NetworkServiceClient* network_service_client_; DeleteCallback delete_callback_;
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc index b918634..b342d64 100644 --- a/services/network/url_loader_unittest.cc +++ b/services/network/url_loader_unittest.cc
@@ -1896,6 +1896,40 @@ EXPECT_EQ("Value3", request_headers2.find("Header3")->second); } +// Make sure requests are failed when the consumer tries to modify the host +// header. +TEST_F(URLLoaderTest, RedirectFailsOnModifyHostHeader) { + ResourceRequest request = CreateResourceRequest( + "GET", test_server()->GetURL("/redirect307-to-echo")); + + base::RunLoop delete_run_loop; + mojom::URLLoaderPtr loader; + std::unique_ptr<URLLoader> url_loader; + mojom::URLLoaderFactoryParams params; + params.process_id = mojom::kBrowserProcessId; + params.is_corb_enabled = false; + url_loader = std::make_unique<URLLoader>( + context(), nullptr /* network_service_client */, + DeleteLoaderCallback(&delete_run_loop, &url_loader), + mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, + client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, ¶ms, + 0 /* request_id */, resource_scheduler_client(), nullptr, + nullptr /* network_usage_accumulator */, nullptr /* header_client */); + + client()->RunUntilRedirectReceived(); + + net::HttpRequestHeaders redirect_headers; + redirect_headers.SetHeader(net::HttpRequestHeaders::kHost, "foo.test"); + loader->FollowRedirect({}, redirect_headers, base::nullopt); + + client()->RunUntilComplete(); + delete_run_loop.Run(); + + EXPECT_TRUE(client()->has_received_completion()); + EXPECT_EQ(net::ERR_INVALID_ARGUMENT, + client()->completion_status().error_code); +} + // Test the client can remove headers during a redirect. TEST_F(URLLoaderTest, RedirectRemoveHeader) { ResourceRequest request = CreateResourceRequest( @@ -2333,6 +2367,7 @@ // A mock NetworkServiceClient that does the following: // 1. Responds auth challenges with previously set credentials. // 2. Responds certificate request with previously set responses. +// 3. Record any reported flagged cookies. class MockNetworkServiceClient : public TestNetworkServiceClient { public: MockNetworkServiceClient() = default; @@ -2420,6 +2455,54 @@ ++on_certificate_requested_counter_; } + void OnFlaggedRequestCookies( + int32_t process_id, + int32_t routing_id, + const net::CookieStatusList& excluded_cookies) override { + flagged_request_cookies_.insert(flagged_request_cookies_.end(), + excluded_cookies.begin(), + excluded_cookies.end()); + if (wait_for_flagged_request_cookies_ && + flagged_request_cookies_.size() >= + wait_for_flagged_request_cookies_goal_) { + std::move(wait_for_flagged_request_cookies_).Run(); + } + } + + void OnFlaggedResponseCookies( + int32_t process_id, + int32_t routing_id, + const net::CookieAndLineStatusList& excluded_cookies) override { + flagged_response_cookies_.insert(flagged_response_cookies_.end(), + excluded_cookies.begin(), + excluded_cookies.end()); + if (wait_for_flagged_response_cookies_ && + flagged_response_cookies_.size() >= + wait_for_flagged_response_cookies_goal_) { + std::move(wait_for_flagged_response_cookies_).Run(); + } + } + + void WaitUntilFlaggedRequestCookies(size_t goal) { + if (flagged_request_cookies_.size() < goal) { + wait_for_flagged_request_cookies_goal_ = goal; + base::RunLoop run_loop; + wait_for_flagged_request_cookies_ = run_loop.QuitClosure(); + run_loop.Run(); + } + EXPECT_EQ(goal, flagged_request_cookies_.size()); + } + + void WaitUntilFlaggedResponseCookies(size_t goal) { + if (flagged_response_cookies_.size() < goal) { + wait_for_flagged_response_cookies_goal_ = goal; + base::RunLoop run_loop; + wait_for_flagged_response_cookies_ = run_loop.QuitClosure(); + run_loop.Run(); + } + EXPECT_EQ(goal, flagged_response_cookies_.size()); + } + void set_credentials_response(CredentialsResponse credentials_response) { credentials_response_ = credentials_response; } @@ -2456,8 +2539,17 @@ return on_certificate_requested_counter_; } + const net::CookieStatusList& flagged_request_cookies() const { + return flagged_request_cookies_; + } + + const net::CookieAndLineStatusList& flagged_response_cookies() const { + return flagged_response_cookies_; + } + private: - CredentialsResponse credentials_response_; + CredentialsResponse credentials_response_ = + CredentialsResponse::NO_CREDENTIALS; base::Optional<net::AuthCredentials> auth_credentials_; int on_auth_required_call_counter_ = 0; scoped_refptr<net::HttpResponseHeaders> last_seen_response_headers_; @@ -2469,6 +2561,12 @@ std::string provider_name_; std::vector<uint16_t> algorithm_preferences_; int on_certificate_requested_counter_ = 0; + net::CookieStatusList flagged_request_cookies_; + net::CookieAndLineStatusList flagged_response_cookies_; + base::OnceClosure wait_for_flagged_request_cookies_; + size_t wait_for_flagged_request_cookies_goal_ = 0u; + base::OnceClosure wait_for_flagged_response_cookies_; + size_t wait_for_flagged_response_cookies_goal_ = 0u; DISALLOW_COPY_AND_ASSIGN(MockNetworkServiceClient); }; @@ -3307,4 +3405,171 @@ } #endif // !defined(OS_IOS) +TEST_F(URLLoaderTest, FlaggedCookieReporting) { + MockNetworkServiceClient network_service_client; + + { + TestURLLoaderClient loader_client; + ResourceRequest request = + CreateResourceRequest("GET", test_server()->GetURL("/set-cookie?a=b")); + // Make this a third-party request. + request.site_for_cookies = GURL("http://www.example.com"); + + base::RunLoop delete_run_loop; + mojom::URLLoaderPtr loader; + mojom::URLLoaderFactoryParams params; + params.process_id = kProcessId; + params.is_corb_enabled = false; + std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>( + context(), &network_service_client, + DeleteLoaderCallback(&delete_run_loop, &url_loader), + mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, + loader_client.CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, + ¶ms, 0 /* request_id */, resource_scheduler_client(), nullptr, + nullptr /* network_usage_accumulator */, nullptr /* header_client */); + + delete_run_loop.Run(); + loader_client.RunUntilComplete(); + EXPECT_EQ(net::OK, loader_client.completion_status().error_code); + + network_service_client.WaitUntilFlaggedResponseCookies(1u); + EXPECT_EQ( + "a", + network_service_client.flagged_response_cookies()[0].cookie->Name()); + EXPECT_EQ( + "b", + network_service_client.flagged_response_cookies()[0].cookie->Value()); + EXPECT_EQ(net::CanonicalCookie::CookieInclusionStatus:: + EXCLUDE_SAMESITE_UNSPECIFIED_TREATED_AS_LAX, + network_service_client.flagged_response_cookies()[0].status); + } + + // Test the warning on sending a cookie. + // Since kSameSiteByDefaultCookies hasn't launched yet, the above test + // actually sets a cookie suitable for the task. + + { + TestURLLoaderClient loader_client; + ResourceRequest request = + CreateResourceRequest("GET", test_server()->GetURL("/nocontent")); + // Make this a third-party request. + request.site_for_cookies = GURL("http://www.example.com"); + + base::RunLoop delete_run_loop; + mojom::URLLoaderPtr loader; + mojom::URLLoaderFactoryParams params; + params.process_id = kProcessId; + params.is_corb_enabled = false; + std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>( + context(), &network_service_client, + DeleteLoaderCallback(&delete_run_loop, &url_loader), + mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, + loader_client.CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, + ¶ms, 0 /* request_id */, resource_scheduler_client(), nullptr, + nullptr /* network_usage_accumulator */, nullptr /* header_client */); + + delete_run_loop.Run(); + loader_client.RunUntilComplete(); + EXPECT_EQ(net::OK, loader_client.completion_status().error_code); + + network_service_client.WaitUntilFlaggedRequestCookies(1u); + EXPECT_EQ( + "a", network_service_client.flagged_request_cookies()[0].cookie.Name()); + EXPECT_EQ( + "b", + network_service_client.flagged_request_cookies()[0].cookie.Value()); + EXPECT_EQ(net::CanonicalCookie::CookieInclusionStatus:: + EXCLUDE_SAMESITE_UNSPECIFIED_TREATED_AS_LAX, + network_service_client.flagged_request_cookies()[0].status); + } +} + +TEST_F(URLLoaderTest, FlaggedCookieRedirect) { + MockNetworkServiceClient network_service_client; + + GURL dest_url = test_server()->GetURL("/nocontent"); + GURL redirecting_url = + test_server()->GetURL("/server-redirect-with-cookie?" + dest_url.spec()); + + TestURLLoaderClient loader_client; + ResourceRequest request = CreateResourceRequest("GET", redirecting_url); + // Make this a third-party request. + request.site_for_cookies = GURL("http://www.example.com"); + + base::RunLoop delete_run_loop; + mojom::URLLoaderPtr loader; + mojom::URLLoaderFactoryParams params; + params.process_id = kProcessId; + params.is_corb_enabled = false; + std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>( + context(), &network_service_client, + DeleteLoaderCallback(&delete_run_loop, &url_loader), + mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, + loader_client.CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, ¶ms, + 0 /* request_id */, resource_scheduler_client(), nullptr, + nullptr /* network_usage_accumulator */, nullptr /* header_client */); + + loader_client.RunUntilRedirectReceived(); + loader->FollowRedirect({}, {}, base::nullopt); + loader_client.RunUntilComplete(); + delete_run_loop.Run(); + EXPECT_EQ(net::OK, loader_client.completion_status().error_code); + + ASSERT_EQ(1u, network_service_client.flagged_response_cookies().size()); + EXPECT_EQ( + "server-redirect", + network_service_client.flagged_response_cookies()[0].cookie->Name()); + EXPECT_EQ( + "true", + network_service_client.flagged_response_cookies()[0].cookie->Value()); + EXPECT_EQ(net::CanonicalCookie::CookieInclusionStatus:: + EXCLUDE_SAMESITE_UNSPECIFIED_TREATED_AS_LAX, + network_service_client.flagged_response_cookies()[0].status); +} + +TEST_F(URLLoaderTest, FlaggedCookieAuth) { + for (auto mode : + {MockNetworkServiceClient::CredentialsResponse::NO_CREDENTIALS, + MockNetworkServiceClient::CredentialsResponse::CORRECT_CREDENTIALS}) { + MockNetworkServiceClient network_service_client; + network_service_client.set_credentials_response(mode); + + GURL url = test_server()->GetURL( + "/auth-basic?set-cookie-if-challenged&password=PASS"); + + TestURLLoaderClient loader_client; + ResourceRequest request = CreateResourceRequest("GET", url); + // Make this a third-party request. + request.site_for_cookies = GURL("http://www.example.com"); + + base::RunLoop delete_run_loop; + mojom::URLLoaderPtr loader; + mojom::URLLoaderFactoryParams params; + params.process_id = kProcessId; + params.is_corb_enabled = false; + std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>( + context(), &network_service_client, + DeleteLoaderCallback(&delete_run_loop, &url_loader), + mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, + loader_client.CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, + ¶ms, 0 /* request_id */, resource_scheduler_client(), nullptr, + nullptr /* network_usage_accumulator */, nullptr /* header_client */); + + loader_client.RunUntilComplete(); + delete_run_loop.Run(); + EXPECT_EQ(net::OK, loader_client.completion_status().error_code); + + ASSERT_EQ(1u, network_service_client.flagged_response_cookies().size()); + EXPECT_EQ( + "got_challenged", + network_service_client.flagged_response_cookies()[0].cookie->Name()); + EXPECT_EQ( + "true", + network_service_client.flagged_response_cookies()[0].cookie->Value()); + EXPECT_EQ(net::CanonicalCookie::CookieInclusionStatus:: + EXCLUDE_SAMESITE_UNSPECIFIED_TREATED_AS_LAX, + network_service_client.flagged_response_cookies()[0].status); + } +} + } // namespace network
diff --git a/services/viz/README.md b/services/viz/README.md index 9609eb6..536e6c3 100644 --- a/services/viz/README.md +++ b/services/viz/README.md
@@ -119,9 +119,6 @@ `//services/viz/...`. `//components/viz/host` will move to `//services/viz/privileged/<language>/{compositing, gl, hit_test, media}`. -Once the content module is gone, and `//services/ws` is the only privileged -client, then perhaps the privileged client library may move to `//services/ws`. - ## Acceptable Dependencies Note: `=>` means can depend on
diff --git a/services/ws/DEPS b/services/ws/DEPS deleted file mode 100644 index fd6143b..0000000 --- a/services/ws/DEPS +++ /dev/null
@@ -1,12 +0,0 @@ -include_rules = [ - "+cc", - "+components/discardable_memory/service", - "+components/discardable_memory/public", - "+components/viz/common", - "+components/viz/host", - "+components/viz/test", - "+services/viz/public/cpp", - "+services/viz/public/interfaces", - "+third_party/skia/include", - "+ui", -]
diff --git a/services/ws/public/cpp/DEPS b/services/ws/public/cpp/DEPS deleted file mode 100644 index 90ba774..0000000 --- a/services/ws/public/cpp/DEPS +++ /dev/null
@@ -1,6 +0,0 @@ -include_rules = [ - "+components/viz/common/gpu", - "+gpu", - "+mojo/gpu", - "+skia/public/interfaces" -]
diff --git a/services/ws/public/cpp/OWNERS b/services/ws/public/cpp/OWNERS deleted file mode 100644 index 1bb2565..0000000 --- a/services/ws/public/cpp/OWNERS +++ /dev/null
@@ -1,7 +0,0 @@ -per-file *_type_converter*.*=set noparent -per-file *_type_converter*.*=file://ipc/SECURITY_OWNERS -per-file *compositor_frame_sink*.*=fsamuel@chromium.org -per-file manifest.cc=set noparent -per-file manifest.cc=file://ipc/SECURITY_OWNERS -per-file manifest.h=set noparent -per-file manifest.h=file://ipc/SECURITY_OWNERS
diff --git a/services/ws/public/mojom/BUILD.gn b/services/ws/public/mojom/BUILD.gn deleted file mode 100644 index 0841445..0000000 --- a/services/ws/public/mojom/BUILD.gn +++ /dev/null
@@ -1,12 +0,0 @@ -# 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. - -import("//mojo/public/tools/bindings/mojom.gni") -import("//testing/test.gni") - -mojom("constants") { - sources = [ - "constants.mojom", - ] -}
diff --git a/services/ws/public/mojom/OWNERS b/services/ws/public/mojom/OWNERS deleted file mode 100644 index 08850f4..0000000 --- a/services/ws/public/mojom/OWNERS +++ /dev/null
@@ -1,2 +0,0 @@ -per-file *.mojom=set noparent -per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/services/ws/public/mojom/constants.mojom b/services/ws/public/mojom/constants.mojom deleted file mode 100644 index 32f8e575..0000000 --- a/services/ws/public/mojom/constants.mojom +++ /dev/null
@@ -1,7 +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. - -module ws.mojom; - -const string kServiceName = "ui";
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 6037e29..f9d61b9 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -596,6 +596,9 @@ ], "junit_tests": [ { + "test": "android_webview_junit_tests" + }, + { "test": "base_junit_tests" }, { @@ -22810,6 +22813,9 @@ ], "junit_tests": [ { + "test": "android_webview_junit_tests" + }, + { "test": "base_junit_tests" }, {
diff --git a/testing/buildbot/chromium.chrome.json b/testing/buildbot/chromium.chrome.json index f395ee1..2ce91ee 100644 --- a/testing/buildbot/chromium.chrome.json +++ b/testing/buildbot/chromium.chrome.json
@@ -2175,7 +2175,25 @@ }, "name": "chrome_sizes", "swarming": { - "can_use_on_swarming_builders": false + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Mac-10.14.4", + "pool": "chrome.tests" + } + ], + "optional_dimensions": { + "300": [ + { + "os": "Mac-10.14.3" + } + ], + "600": [ + { + "os": "Mac-10.14.5" + } + ] + } } } ]
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index 38f85c4..baf3e15 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -7424,6 +7424,9 @@ ], "junit_tests": [ { + "test": "android_webview_junit_tests" + }, + { "test": "base_junit_tests" }, {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index f0138adf..e338a3b3 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -5622,6 +5622,9 @@ ], "junit_tests": [ { + "test": "android_webview_junit_tests" + }, + { "test": "base_junit_tests" }, { @@ -21413,6 +21416,30 @@ } ] }, + "linux-fieldtrial-rel": { + "gtest_tests": [ + { + "args": [ + "--disable-field-trial-config" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "no_fieldtrial_browser_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-16.04" + } + ], + "shards": 10 + }, + "test": "browser_tests" + } + ] + }, "linux-tcmalloc-rel": { "gtest_tests": [ {
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 770c5c91..de43befc 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -23555,6 +23555,370 @@ ] }, "Win10 FYI Exp LinuxVM Testing (NVIDIA)": { + "gtest_tests": [ + { + "args": [ + "--use-gpu-in-tests", + "--test-launcher-retry-limit=0" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "shards": 4 + }, + "test": "angle_end2end_tests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "angle_gles1_conformance_tests" + }, + { + "args": [ + "--use-gpu-in-tests", + "--test-launcher-retry-limit=0" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "angle_unittests" + }, + { + "args": [ + "--test-launcher-retry-limit=0" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "angle_white_box_tests" + }, + { + "args": [ + "--enable-gpu", + "--test-launcher-bot-mode", + "--test-launcher-jobs=1", + "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "tab_capture_end2end_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "browser_tests" + }, + { + "args": [ + "--use-gpu-in-tests", + "--use-cmd-decoder=validating" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "gl_tests" + }, + { + "args": [ + "--use-gpu-in-tests", + "--use-cmd-decoder=passthrough" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "gl_tests_passthrough", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "gl_tests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "gl_unittests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "gles2_conform_test" + }, + { + "args": [ + "--use-gpu-in-tests", + "--use-angle=d3d9" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "gles2_conform_d3d9_test", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "gles2_conform_test" + }, + { + "args": [ + "--use-gpu-in-tests", + "--use-angle=gl", + "--disable-gpu-sandbox" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "gles2_conform_gl_test", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "gles2_conform_test" + }, + { + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "gpu_unittests" + }, + { + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "swiftshader_unittests" + }, + { + "args": [ + "--use-angle=d3d11", + "--use-test-data-path", + "--test_video_data=test-25fps.h264:320:240:250:258:::1" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "video_decode_accelerator_d3d11_unittest", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "video_decode_accelerator_unittest" + }, + { + "args": [ + "--use-angle=d3d9", + "--use-test-data-path", + "--test_video_data=test-25fps.h264:320:240:250:258:::1" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "video_decode_accelerator_d3d9_unittest", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "video_decode_accelerator_unittest" + }, + { + "args": [ + "--use-angle=gl", + "--use-test-data-path", + "--test_video_data=test-25fps.h264:320:240:250:258:::1" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "video_decode_accelerator_gl_unittest", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "video_decode_accelerator_unittest" + }, + { + "args": [ + "--ignore-runtime-requirements=*" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "xr_browser_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ] + }, + "test": "xr_browser_tests" + } + ], "isolated_scripts": [ { "args": [ @@ -23583,6 +23947,185 @@ }, { "args": [ + "context_lost", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "context_lost_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false + } + }, + { + "args": [ + "depth_capture", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "depth_capture_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false + } + }, + { + "args": [ + "gpu_process", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gpu_process_launch_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false + } + }, + { + "args": [ + "hardware_accelerated_feature", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "hardware_accelerated_feature_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false + } + }, + { + "args": [ + "info_collection", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", + "--expected-vendor-id", + "10de", + "--expected-device-id", + "1cb3" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "info_collection_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false + } + }, + { + "args": [ + "maps", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", + "--dont-restore-color-profile-after-test", + "--os-type", + "win", + "--build-revision", + "${got_revision}", + "--test-machine-name", + "${buildername}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "maps_pixel_test", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false + } + }, + { + "args": [ "--gtest-benchmark-name=passthrough_command_buffer_perftests", "-v", "--use-cmd-decoder=passthrough", @@ -23611,6 +24154,106 @@ }, { "args": [ + "pixel", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", + "--dont-restore-color-profile-after-test", + "--refimg-cloud-storage-bucket", + "chromium-gpu-archive/reference-images", + "--os-type", + "win", + "--build-revision", + "${got_revision}", + "--test-machine-name", + "${buildername}" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "pixel_test", + "non_precommit_args": [ + "--upload-refimg-to-cloud-storage" + ], + "precommit_args": [ + "--download-refimg-from-cloud-storage" + ], + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false + } + }, + { + "args": [ + "screenshot_sync", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", + "--dont-restore-color-profile-after-test" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "screenshot_sync_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false + } + }, + { + "args": [ + "trace_test", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "trace_test", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false + } + }, + { + "args": [ "--gtest-benchmark-name=validating_command_buffer_perftests", "-v", "--use-cmd-decoder=validating", @@ -23636,6 +24279,242 @@ } ] } + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough", + "--webgl-conformance-version=2.0.1", + "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl2_conformance_gl_passthrough_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false, + "shards": 20 + } + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", + "--webgl-conformance-version=2.0.1", + "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl2_conformance_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false, + "shards": 20 + } + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=validating" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_d3d11_validating_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false, + "shards": 2 + } + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=d3d9 --use-cmd-decoder=passthrough" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_d3d9_passthrough_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false, + "shards": 2 + } + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d9 --use-cmd-decoder=validating" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_d3d9_validating_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false, + "shards": 2 + } + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_gl_passthrough_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false, + "shards": 2 + } + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false, + "shards": 2 + } + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=vulkan --use-cmd-decoder=passthrough" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_vulkan_passthrough_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "nvidia-quadro-p400-win10-stable", + "os": "Windows-10", + "pool": "Chrome-GPU" + } + ], + "idempotent": false, + "shards": 2 + } } ] },
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json index 92073f5a..30b0efc0 100644 --- a/testing/buildbot/chromium.perf.fyi.json +++ b/testing/buildbot/chromium.perf.fyi.json
@@ -47,6 +47,53 @@ } ] }, + "android-pixel2-perf-fyi": { + "isolated_scripts": [ + { + "args": [ + "-v", + "--browser=exact", + "--upload-results", + "--browser-executable=../../out/Release/bin/monochrome_64_32_bundle", + "--device=android", + "--test-shard-map-filename=android-pixel2-perf-fyi_map.json" + ], + "isolate_name": "performance_test_suite", + "merge": { + "script": "//tools/perf/process_perf_results.py" + }, + "name": "performance_test_suite", + "override_compile_targets": [ + "performance_test_suite" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "device_os": "O", + "device_os_flavor": "google", + "device_type": "walleye", + "os": "Android", + "pool": "chrome.tests.perf-fyi" + } + ], + "expiration": 7200, + "hard_timeout": 36000, + "ignore_task_failure": false, + "io_timeout": 14400, + "shards": 7 + }, + "trigger_script": { + "args": [ + "--multiple-dimension-script-verbose", + "True" + ], + "requires_simultaneous_shard_dispatch": true, + "script": "//testing/trigger_scripts/perf_device_trigger.py" + } + } + ] + }, "linux-perf-fyi": { "isolated_scripts": [ {
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index e9202b1..df04fda 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -93,6 +93,10 @@ "label": "//third_party/android_crazy_linker:android_crazy_linker_zip_fuzzer", "type": "fuzzer", }, + "android_webview_junit_tests": { + "label": "//android_webview/test:android_webview_junit_tests", + "type": "junit_test", + }, "android_webview_unittests": { "label": "//android_webview/test:android_webview_unittests", "type": "console_test_launcher",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 2aadec8..e546dbb 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -363,17 +363,6 @@ } } }, - 'chrome_sizes': { - 'modifications': { - # TODO(crbug.com/961548): Swarm this if/when there's available Mac - # capacity in chrome-swarming's general test pool. - 'mac-google-rel': { - 'swarming': { - 'can_use_on_swarming_builders': False, - }, - }, - }, - }, 'chromedriver_py_tests': { 'remove_from': [ # Timeout happens sometimes (crbug.com/951799).
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 88922304..50c479be 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -2263,6 +2263,7 @@ }, 'chromium_junit_tests': { + 'android_webview_junit_tests': {}, 'base_junit_tests': {}, 'chrome_junit_tests': {}, 'components_background_task_scheduler_junit_tests': {}, @@ -2645,6 +2646,18 @@ 'blink_python_tests': {}, }, + 'fieldtrial_browser_tests': { + 'no_fieldtrial_browser_tests': { + 'args': [ + '--disable-field-trial-config', + ], + 'swarming': { + 'shards': 10, + }, + 'test': 'browser_tests', + }, + }, + 'fuchsia_gtests': { 'angle_unittests': {}, 'base_unittests': {},
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index e16d60c..c746636 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -601,6 +601,7 @@ ], 'mixins': [ 'chrome-swarming-pool', + 'mac_10.14', ], 'test_suites': { 'isolated_scripts': 'chrome_sizes', @@ -1823,6 +1824,14 @@ 'isolated_scripts': 'chromium_code_coverage_isolated_scripts_and_fuzzers', } }, + 'linux-fieldtrial-rel': { + 'mixins': [ + 'linux-xenial', + ], + 'test_suites': { + 'gtest_tests': 'fieldtrial_browser_tests', + }, + }, 'linux-tcmalloc-rel': { 'mixins': [ 'linux-trusty', @@ -3062,12 +3071,9 @@ 'win10_nvidia_quadro_p400_stable', ], 'test_suites': { - # TODO(crbug.com/952071): once the perftests are green, - # re-enable the rest of these tests for a couple of builds - # to ensure they're green. - # 'gtest_tests': 'gpu_fyi_win_gtests', + 'gtest_tests': 'gpu_fyi_win_gtests', 'isolated_scripts': 'gpu_angle_fyi_win_optional_isolated_scripts', - # 'gpu_telemetry_tests': 'gpu_fyi_win_release_telemetry_tests', + 'gpu_telemetry_tests': 'gpu_fyi_win_release_telemetry_tests', }, }, 'Win10 FYI Exp Release (Intel HD 630)': {
diff --git a/third_party/blink/public/web/web_ax_object.h b/third_party/blink/public/web/web_ax_object.h index a1985d2d..7014923 100644 --- a/third_party/blink/public/web/web_ax_object.h +++ b/third_party/blink/public/web/web_ax_object.h
@@ -133,6 +133,7 @@ BLINK_EXPORT bool IsFocused() const; BLINK_EXPORT WebAXGrabbedState IsGrabbed() const; BLINK_EXPORT bool IsHovered() const; + BLINK_EXPORT bool IsLineBreakingObject() const; BLINK_EXPORT bool IsLinked() const; BLINK_EXPORT bool IsLoaded() const; BLINK_EXPORT bool IsModal() const;
diff --git a/third_party/blink/renderer/core/css/BUILD.gn b/third_party/blink/renderer/core/css/BUILD.gn index c479cb69..660258c 100644 --- a/third_party/blink/renderer/core/css/BUILD.gn +++ b/third_party/blink/renderer/core/css/BUILD.gn
@@ -621,6 +621,7 @@ "resolver/match_result_test.cc", "resolver/selector_filter_parent_scope_test.cc", "resolver/style_adjuster_test.cc", + "resolver/style_resolver_test.cc", "rule_feature_set_test.cc", "rule_set_test.cc", "selector_query_test.cc",
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc index e94df1b..65f30e4 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -1064,8 +1064,11 @@ scoped_refptr<const ComputedStyle> StyleResolver::StyleForText( Text* text_node) { DCHECK(text_node); - if (Node* parent_node = LayoutTreeBuilderTraversal::Parent(*text_node)) - return parent_node->GetComputedStyle(); + if (Node* parent_node = LayoutTreeBuilderTraversal::Parent(*text_node)) { + const ComputedStyle* style = parent_node->GetComputedStyle(); + if (style && !style->IsEnsuredInDisplayNone()) + return style; + } return nullptr; }
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc b/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc new file mode 100644 index 0000000..0dddc495 --- /dev/null +++ b/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc
@@ -0,0 +1,36 @@ +// 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 "third_party/blink/renderer/core/css/resolver/style_resolver.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/core/css/style_engine.h" +#include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/dom/node_computed_style.h" +#include "third_party/blink/renderer/core/dom/text.h" +#include "third_party/blink/renderer/core/testing/page_test_base.h" + +namespace blink { + +class StyleResolverTest : public PageTestBase { + protected: +}; + +TEST_F(StyleResolverTest, StyleForTextInDisplayNone) { + GetDocument().documentElement()->SetInnerHTMLFromString(R"HTML( + <body style="display:none">Text</body> + )HTML"); + + UpdateAllLifecyclePhasesForTest(); + + GetDocument().body()->EnsureComputedStyle(); + + ASSERT_TRUE(GetDocument().body()->GetComputedStyle()); + EXPECT_TRUE( + GetDocument().body()->GetComputedStyle()->IsEnsuredInDisplayNone()); + EXPECT_FALSE(GetStyleEngine().Resolver()->StyleForText( + To<Text>(GetDocument().body()->firstChild()))); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc index ac7356b..84bea325 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -208,8 +208,15 @@ layout_object->SetNeedsLayoutAndPrefWidthsRecalc( layout_invalidation_reason::kDisplayLock); is_horizontal_writing_mode_ = layout_object->IsHorizontalWritingMode(); + // GraphicsLayer collection would normally skip layers if paint is blocked + // by display-locking (see: CollectDrawableLayersForLayerListRecursively + // in LocalFrameView). However, if we don't trigger this collection, then + // we might use the cached result instead. In order to ensure we skip the + // newly locked layers, we need to set |need_graphics_layer_collection_| + // before marking the layer for repaint. + needs_graphics_layer_collection_ = true; + MarkPaintLayerNeedsRepaint(); } - MarkPaintLayerNeedsRepaint(); ScheduleAnimation(); // TODO(vmpstr): This needs to be set after invalidation above, since we // want the object to layout once. After the changes to separate self and
diff --git a/third_party/blink/renderer/core/html/html_frame_owner_element.cc b/third_party/blink/renderer/core/html/html_frame_owner_element.cc index 8629f58..db9facf 100644 --- a/third_party/blink/renderer/core/html/html_frame_owner_element.cc +++ b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
@@ -358,6 +358,7 @@ embedded_content_view_ = embedded_content_view; FrameOwnerPropertiesChanged(); + SetNeedsCompositingUpdate(); GetDocument().GetRootScrollerController().DidUpdateIFrameFrameView(*this);
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.cc index 79b3726c..b06be8be 100644 --- a/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.cc +++ b/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.cc
@@ -161,6 +161,10 @@ // TODO(layout-dev) Transfroms also need to be applied to compute overflow // correctly. NG is not yet transform-aware. crbug.com/855965 if (!physical_fragment->Children().empty()) { + LayoutUnit border_inline_start = + LayoutUnit(Base::StyleRef().BorderStartWidth()); + LayoutUnit border_block_start = + LayoutUnit(Base::StyleRef().BorderBeforeWidth()); for (const auto& child : physical_fragment->Children()) { PhysicalRect child_scrollable_overflow; if (child->IsOutOfFlowPositioned()) { @@ -177,7 +181,18 @@ continue; } child_scrollable_overflow.offset += child.Offset(); - children_overflow.Unite(child_scrollable_overflow); + + // Do not add overflow if fragment is not reachable by scrolling. + WritingMode writing_mode = Base::StyleRef().GetWritingMode(); + LogicalOffset child_logical_end = + child_scrollable_overflow.offset.ConvertToLogical( + writing_mode, Base::StyleRef().Direction(), + physical_fragment->Size(), child_scrollable_overflow.size) + + child_scrollable_overflow.size.ConvertToLogical(writing_mode); + + if (child_logical_end.inline_offset > border_inline_start && + child_logical_end.block_offset > border_block_start) + children_overflow.Unite(child_scrollable_overflow); } }
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc index 3f9a72e..0efccaf 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -30,6 +30,7 @@ #include "cc/input/overscroll_behavior.h" #include "cc/layers/picture_layer.h" #include "third_party/blink/renderer/core/accessibility/apply_dark_mode.h" +#include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h" #include "third_party/blink/renderer/core/dom/dom_node_ids.h" #include "third_party/blink/renderer/core/exported/web_plugin_container_impl.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" @@ -3518,13 +3519,18 @@ } bool CompositedLayerMapping::PaintBlockedByDisplayLock() const { - return GetLayoutObject().PaintBlockedByDisplayLock(); + auto* node = GetLayoutObject().GetNode(); + return node && DisplayLockUtilities::NearestLockedInclusiveAncestor(*node); } void CompositedLayerMapping::NotifyDisplayLockNeedsGraphicsLayerCollection() { - auto* context = GetLayoutObject().GetDisplayLockContext(); - DCHECK(context); - context->NotifyNeedsGraphicsLayerCollection(); + if (auto* node = GetLayoutObject().GetNode()) { + if (auto* locked_element = + DisplayLockUtilities::NearestLockedInclusiveAncestor(*node)) { + locked_element->GetDisplayLockContext() + ->NotifyNeedsGraphicsLayerCollection(); + } + } } #if DCHECK_IS_ON()
diff --git a/third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_as_text.cc b/third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_as_text.cc index 1edca85..4de6550 100644 --- a/third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_as_text.cc +++ b/third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_as_text.cc
@@ -222,7 +222,8 @@ } #if DCHECK_IS_ON() - if (layer->DrawsContent() && (flags & kLayerTreeIncludesPaintRecords)) + if (layer->HasLayerState() && layer->DrawsContent() && + (flags & kLayerTreeIncludesPaintRecords)) json->SetValue("paintRecord", RecordAsJSON(*layer->CapturePaintRecord())); #endif
diff --git a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc b/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc index 34e44534..c5ced0c8 100644 --- a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc +++ b/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc
@@ -129,6 +129,9 @@ bool PaintLayerCompositor::RootShouldAlwaysComposite() const { if (!has_accelerated_compositing_) return false; + // Should not composite if not attached to a frame view. + if (!layout_view_.GetFrameView()) + return false; return layout_view_.GetFrame()->IsLocalRoot() || CompositingReasonFinder::RequiresCompositingForScrollableFrame( layout_view_);
diff --git a/third_party/blink/renderer/devtools/front_end/security/SecurityPanel.js b/third_party/blink/renderer/devtools/front_end/security/SecurityPanel.js index 8227c47..c5cc6e33 100644 --- a/third_party/blink/renderer/devtools/front_end/security/SecurityPanel.js +++ b/third_party/blink/renderer/devtools/front_end/security/SecurityPanel.js
@@ -794,7 +794,7 @@ ]); }, 'origin-button')); - if (originState.securityDetails) { + if (originState.securityDetails && originState.securityDetails.protocol.length > 0) { const connectionSection = this.element.createChild('div', 'origin-view-section'); connectionSection.createChild('div', 'origin-view-section-title').textContent = Common.UIString('Connection');
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc index f314727..dca46716 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -420,6 +420,21 @@ return AXNodeObject::IsRichlyEditable(); } +bool AXLayoutObject::IsLineBreakingObject() const { + if (IsDetached()) + return AXNodeObject::IsLineBreakingObject(); + + const LayoutObject* layout_object = GetLayoutObject(); + if (layout_object->IsBR() || layout_object->IsLayoutBlock() || + layout_object->IsAnonymousBlock() || + (layout_object->IsLayoutBlockFlow() && + layout_object->StyleRef().IsDisplayBlockContainer())) { + return true; + } + + return AXNodeObject::IsLineBreakingObject(); +} + bool AXLayoutObject::IsLinked() const { if (!IsLinkable(*this)) return false; @@ -678,7 +693,7 @@ if (alt_text) return alt_text->IsEmpty(); - if (IsWebArea() || layout_object_->IsListMarkerIncludingNG()) + if (IsWebArea() || layout_object_->IsListMarkerIncludingNGInside()) return false; // Positioned elements and scrollable containers are important for @@ -2083,6 +2098,8 @@ return false; if (GetCSSAltText(GetNode())) return false; + if (layout_object_->IsListMarkerIncludingNGInside()) + return false; return AXNodeObject::CanHaveChildren(); }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.h b/third_party/blink/renderer/modules/accessibility/ax_layout_object.h index df8445d..96868bd 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.h
@@ -81,6 +81,7 @@ bool IsDefault() const override; bool IsEditable() const override; bool IsRichlyEditable() const override; + bool IsLineBreakingObject() const override; bool IsLinked() const override; bool IsLoaded() const override; bool IsOffScreen() const override;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc index a1743d2..f4af7fd 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -489,6 +489,7 @@ parent_(nullptr), last_modification_count_(-1), cached_is_ignored_(false), + cached_is_ignored_pass_through_(false), cached_is_inert_or_aria_hidden_(false), cached_is_descendant_of_leaf_node_(false), cached_is_descendant_of_disabled_node_(false), @@ -862,35 +863,21 @@ } bool AXObject::AccessibilityIsIgnored() const { - Node* node = GetNode(); - if (!node) { - AXObject* parent = this->ParentObject(); - while (!node && parent) { - node = parent->GetNode(); - parent = parent->ParentObject(); - } - } - - if (node) - node->UpdateDistributionForFlatTreeTraversal(); - - // TODO(aboxhall): Instead of this, propagate inert down through frames - Document* document = GetDocument(); - while (document && document->LocalOwner()) { - document->LocalOwner()->UpdateDistributionForFlatTreeTraversal(); - document = document->LocalOwner()->ownerDocument(); - } - + UpdateDistributionForFlatTreeTraversal(); UpdateCachedAttributeValuesIfNeeded(); return cached_is_ignored_; } -// TODO(janewman) AccessibilityIsIncludedInTree should be true for all nodes -// that should be included in the tree, even if they are ignored +bool AXObject::AccessibilityIsIgnoredButIncludedInTree() const { + UpdateDistributionForFlatTreeTraversal(); + UpdateCachedAttributeValuesIfNeeded(); + return cached_is_ignored_pass_through_; +} + +// AccessibilityIsIncludedInTree should be true for all nodes that should be +// included in the tree, even if they are ignored bool AXObject::AccessibilityIsIncludedInTree() const { - // TODO(janewman) add DCHECK to ensure we do not disallow unignored nodes from - // being in the tree. - return !AccessibilityIsIgnored(); + return !AccessibilityIsIgnored() || AccessibilityIsIgnoredButIncludedInTree(); } void AXObject::UpdateCachedAttributeValuesIfNeeded() const { @@ -923,12 +910,24 @@ : nullptr); cached_aria_column_index_ = ComputeAriaColumnIndex(); cached_aria_row_index_ = ComputeAriaRowIndex(); + + bool ignored_states_changed = false; if (cached_is_ignored_ != LastKnownIsIgnoredValue()) { last_known_is_ignored_value_ = cached_is_ignored_ ? kIgnoreObject : kIncludeObject; + ignored_states_changed = true; + } - AXObject* parent = ParentObjectIfExists(); - if (parent) + const bool new_is_ignored_pass_through = + cached_is_ignored_ && + ComputeAccessibilityIsIgnoredPassThrough(ignored_reasons); + if (cached_is_ignored_pass_through_ != new_is_ignored_pass_through) { + cached_is_ignored_pass_through_ = new_is_ignored_pass_through; + ignored_states_changed = true; + } + + if (ignored_states_changed) { + if (AXObject* parent = ParentObjectIfExists()) parent->ChildrenChanged(); } @@ -1173,6 +1172,21 @@ return nullptr; } +bool AXObject::ComputeAccessibilityIsIgnoredPassThrough( + const IgnoredReasons& ignored_reasons) const { + if (!GetNode()) + return false; + + // Always pass through Line Breaking objects, this is necessary to + // detect paragraph edges, which are defined as hard-line breaks. + // + // Though if the node is part of the shadow dom, or has the explicit + // internal Role::kIgnored, they aren't interesting for paragraph + // navigation so exclude those cases. + return RoleValue() != ax::mojom::Role::kIgnored && + !GetNode()->IsInShadowTree() && IsLineBreakingObject(); +} + const AXObject* AXObject::DatetimeAncestor(int max_levels_to_check) const { switch (RoleValue()) { case ax::mojom::Role::kDateTime: @@ -1291,6 +1305,27 @@ AncestorExposesActiveDescendant(); } +void AXObject::UpdateDistributionForFlatTreeTraversal() const { + Node* node = GetNode(); + if (!node) { + AXObject* parent = this->ParentObject(); + while (!node && parent) { + node = parent->GetNode(); + parent = parent->ParentObject(); + } + } + + if (node) + node->UpdateDistributionForFlatTreeTraversal(); + + // TODO(aboxhall): Instead of this, propagate inert down through frames + Document* document = GetDocument(); + while (document && document->LocalOwner()) { + document->LocalOwner()->UpdateDistributionForFlatTreeTraversal(); + document = document->LocalOwner()->ownerDocument(); + } +} + bool AXObject::IsARIAControlledByTextboxWithActiveDescendant() const { // This situation should mostly arise when using an active descendant on a // textbox inside an ARIA 1.1 combo box widget, which points to the selected @@ -1888,11 +1923,14 @@ } int AXObject::IndexInParent() const { - if (!ParentObjectUnignored()) + DCHECK(AccessibilityIsIncludedInTree()) + << "IndexInParent is only valid when a node is included in the tree"; + if (!ParentObjectIncludedInTree()) return 0; - const AXObjectVector& siblings = ParentObjectUnignored()->Children(); + const AXObjectVector& siblings = ParentObjectIncludedInTree()->Children(); wtf_size_t index = siblings.Find(this); + DCHECK(index != kNotFound); return (index == kNotFound) ? 0 : static_cast<int>(index); } @@ -2150,29 +2188,59 @@ } AXObject* AXObject::NextSibling() const { - AXObject* parent = ParentObjectUnignored(); - if (!parent) - return nullptr; - if (AccessibilityIsIgnored()) NOTREACHED() << "We don't support finding siblings for ignored objects."; - if (IndexInParent() < parent->ChildCount() - 1) - return *(parent->Children().begin() + IndexInParent() + 1); + // Find the ancestor which is a direct descendant of the unignored object, + // and use its IndexInParent, which is invalid for out-of-tree nodes. + const AXObject* parent_unignored = nullptr; + const AXObject* child_of_unignored = this; + while (child_of_unignored) { + const AXObject* parent = child_of_unignored->ParentObjectIncludedInTree(); + if (parent && !parent->AccessibilityIsIgnored()) { + parent_unignored = parent; + break; + } + + child_of_unignored = parent; + } + + if (parent_unignored && child_of_unignored) { + const int index_in_parent_unignored = child_of_unignored->IndexInParent(); + if (index_in_parent_unignored < parent_unignored->ChildCount() - 1) { + return *(parent_unignored->Children().begin() + + index_in_parent_unignored + 1); + } + } return nullptr; } AXObject* AXObject::PreviousSibling() const { - AXObject* parent = ParentObjectUnignored(); - if (!parent) - return nullptr; - if (AccessibilityIsIgnored()) NOTREACHED() << "We don't support finding siblings for ignored objects."; - if (IndexInParent() > 0) - return *(parent->Children().begin() + IndexInParent() - 1); + // Find the ancestor which is a direct descendant of the unignored object, + // and use its IndexInParent, which is invalid for out-of-tree nodes. + const AXObject* parent_unignored = nullptr; + const AXObject* child_of_unignored = this; + while (child_of_unignored) { + const AXObject* parent = child_of_unignored->ParentObjectIncludedInTree(); + if (parent && !parent->AccessibilityIsIgnored()) { + parent_unignored = parent; + break; + } + + child_of_unignored = parent; + } + + if (parent_unignored && child_of_unignored) { + const int index_in_parent_unignored = child_of_unignored->IndexInParent(); + if (index_in_parent_unignored > 0) { + return *(parent_unignored->Children().begin() + + index_in_parent_unignored - 1); + } + } return nullptr; } @@ -2249,6 +2317,16 @@ return parent; } +AXObject* AXObject::ParentObjectIncludedInTree() const { + AXObject* parent; + for (parent = ParentObject(); + parent && !parent->AccessibilityIsIncludedInTree(); + parent = parent->ParentObject()) { + } + + return parent; +} + // Container widgets are those that a user tabs into and arrows around // sub-widgets bool AXObject::IsContainerWidget() const { @@ -3352,12 +3430,12 @@ HeapVector<Member<const AXObject>> ancestors1; ancestors1.push_back(&first); while (ancestors1.back()) - ancestors1.push_back(ancestors1.back()->ParentObjectUnignored()); + ancestors1.push_back(ancestors1.back()->ParentObjectIncludedInTree()); HeapVector<Member<const AXObject>> ancestors2; ancestors2.push_back(&second); while (ancestors2.back()) - ancestors2.push_back(ancestors2.back()->ParentObjectUnignored()); + ancestors2.push_back(ancestors2.back()->ParentObjectIncludedInTree()); const AXObject* common_ancestor = nullptr; while (!ancestors1.IsEmpty() && !ancestors2.IsEmpty() &&
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h index 2df6e99..7b65659 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -478,6 +478,7 @@ return kGrabbedStateUndefined; } virtual bool IsHovered() const { return false; } + virtual bool IsLineBreakingObject() const { return false; } virtual bool IsLinked() const { return false; } virtual bool IsLoaded() const { return false; } virtual bool IsModal() const { return false; } @@ -498,9 +499,9 @@ bool CanSetValueAttribute() const; // Whether objects are ignored, i.e. hidden from the AT. - // TODO(janewman) Ignored nodes that are included in the tree should be marked - // with ax::mojom::State::kIgnored bool AccessibilityIsIgnored() const; + // Whether objects are ignored but included in the tree. + bool AccessibilityIsIgnoredButIncludedInTree() const; // Whether objects are included in the tree. Nodes that are included in the // tree are serialized, even if they are ignored. This allows browser-side @@ -522,6 +523,8 @@ bool IsDescendantOfLeafNode() const; AXObject* LeafNodeAncestor() const; bool IsDescendantOfDisabledNode() const; + bool ComputeAccessibilityIsIgnoredPassThrough( + const IgnoredReasons& ignored_reasons) const; const AXObject* DatetimeAncestor(int max_levels_to_check = 3) const; const AXObject* DisabledAncestor() const; bool LastKnownIsIgnoredValue() const; @@ -810,6 +813,7 @@ virtual AXObject* ComputeParentIfExists() const { return nullptr; } AXObject* CachedParentObject() const { return parent_; } AXObject* ParentObjectUnignored() const; + AXObject* ParentObjectIncludedInTree() const; AXObject* ContainerWidget() const; bool IsContainerWidget() const; @@ -1038,6 +1042,7 @@ mutable int last_modification_count_; mutable RGBA32 cached_background_color_; mutable bool cached_is_ignored_ : 1; + mutable bool cached_is_ignored_pass_through_ : 1; mutable bool cached_is_inert_or_aria_hidden_ : 1; mutable bool cached_is_descendant_of_leaf_node_ : 1; @@ -1057,6 +1062,7 @@ void UpdateCachedAttributeValuesIfNeeded() const; private: + void UpdateDistributionForFlatTreeTraversal() const; bool IsARIAControlledByTextboxWithActiveDescendant() const; bool AncestorExposesActiveDescendant() const; bool IsCheckable() const;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index 27b114f..beb0efc 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -520,7 +520,6 @@ inline_text_box_object_mapping_.Set(inline_text_box, axid); new_obj->Init(); new_obj->SetLastKnownIsIgnoredValue(new_obj->AccessibilityIsIgnored()); - return new_obj; } @@ -827,10 +826,10 @@ // hidden element's focusable state changes, it's ignored state must be // recomputed. ChildrenChangedWithCleanLayout(element->parentNode()); - } else { - // Refresh the focusable state on the exposed object. - MarkAXObjectDirty(obj, false); } + + // Refresh the focusable state and State::kIgnored on the exposed object. + MarkAXObjectDirty(obj, false); } void AXObjectCacheImpl::DocumentTitleChanged() {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_test.cc b/third_party/blink/renderer/modules/accessibility/ax_object_test.cc index dd2de0bc..480d0d7 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_test.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_test.cc
@@ -45,7 +45,7 @@ <p id="paragraph">hello<br id="br">there</p> <button id="button">button</button>)HTML"); - const AXObject* root = GetAXRootObject(); + const AXObject* root = GetAXRootObject()->FirstChild(); ASSERT_NE(nullptr, root); const AXObject* input = GetAXObjectByElementId("input"); ASSERT_NE(nullptr, input); @@ -71,8 +71,8 @@ EXPECT_EQ(ax::mojom::Role::kStaticText, paragraph->DeepestLastChild()->RoleValue()); - EXPECT_EQ(paragraph->PreviousSibling(), input); - EXPECT_EQ(paragraph, input->NextSibling()); + EXPECT_EQ(nullptr, paragraph->PreviousSibling()); + EXPECT_EQ(nullptr, input->NextSibling()); ASSERT_NE(nullptr, br->NextSibling()); EXPECT_EQ(ax::mojom::Role::kStaticText, br->NextSibling()->RoleValue()); ASSERT_NE(nullptr, br->PreviousSibling());
diff --git a/third_party/blink/renderer/modules/accessibility/ax_position.cc b/third_party/blink/renderer/modules/accessibility/ax_position.cc index 27464e9..ca52113 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_position.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_position.cc
@@ -36,7 +36,7 @@ if (child.IsTextObject()) return CreateFirstPositionInObject(child, adjustment_behavior); - const AXObject* parent = child.ParentObjectUnignored(); + const AXObject* parent = child.ParentObjectIncludedInTree(); DCHECK(parent); AXPosition position(*parent); position.text_offset_or_child_index_ = child.IndexInParent(); @@ -58,7 +58,7 @@ if (child.IsTextObject()) return CreateLastPositionInObject(child, adjustment_behavior); - const AXObject* parent = child.ParentObjectUnignored(); + const AXObject* parent = child.ParentObjectIncludedInTree(); DCHECK(parent); AXPosition position(*parent); position.text_offset_or_child_index_ = child.IndexInParent() + 1; @@ -83,9 +83,10 @@ // If the container is not a text object, creating a position inside an // ignored container might result in an invalid position, because child count // is inaccurate. - const AXObject* unignored_container = container.AccessibilityIsIgnored() - ? container.ParentObjectUnignored() - : &container; + const AXObject* unignored_container = + !container.AccessibilityIsIncludedInTree() + ? container.ParentObjectIncludedInTree() + : &container; DCHECK(unignored_container); AXPosition position(*unignored_container); position.text_offset_or_child_index_ = 0; @@ -110,9 +111,10 @@ // If the container is not a text object, creating a position inside an // ignored container might result in an invalid position, because child count // is inaccurate. - const AXObject* unignored_container = container.AccessibilityIsIgnored() - ? container.ParentObjectUnignored() - : &container; + const AXObject* unignored_container = + !container.AccessibilityIsIncludedInTree() + ? container.ParentObjectIncludedInTree() + : &container; DCHECK(unignored_container); AXPosition position(*unignored_container); position.text_offset_or_child_index_ = unignored_container->ChildCount(); @@ -163,7 +165,7 @@ return {}; if (container_node->IsTextNode()) { - if (container->AccessibilityIsIgnored()) { + if (!container->AccessibilityIsIncludedInTree()) { // Find the closest DOM sibling that is unignored in the accessibility // tree. switch (adjustment_behavior) { @@ -178,10 +180,10 @@ // Do the next best thing by moving up to the unignored parent if it // exists. - if (!container || !container->ParentObjectUnignored()) + if (!container || !container->ParentObjectIncludedInTree()) return {}; - return CreateLastPositionInObject(*container->ParentObjectUnignored(), - adjustment_behavior); + return CreateLastPositionInObject( + *container->ParentObjectIncludedInTree(), adjustment_behavior); } case AXPositionAdjustmentBehavior::kMoveLeft: { @@ -195,10 +197,10 @@ // Do the next best thing by moving up to the unignored parent if it // exists. - if (!container || !container->ParentObjectUnignored()) + if (!container || !container->ParentObjectIncludedInTree()) return {}; return CreateFirstPositionInObject( - *container->ParentObjectUnignored(), adjustment_behavior); + *container->ParentObjectIncludedInTree(), adjustment_behavior); } } } @@ -221,8 +223,8 @@ } DCHECK(container_node->IsContainerNode()); - if (container->AccessibilityIsIgnored()) { - container = container->ParentObjectUnignored(); + if (!container->AccessibilityIsIncludedInTree()) { + container = container->ParentObjectIncludedInTree(); if (!container) return {}; @@ -244,7 +246,7 @@ // |ax_child| might be nullptr because not all DOM nodes can have AX // objects. For example, the "head" element has no corresponding AX // object. - if (!ax_child || ax_child->AccessibilityIsIgnored()) { + if (!ax_child || !ax_child->AccessibilityIsIncludedInTree()) { // Find the closest DOM sibling that is present and unignored in the // accessibility tree. switch (adjustment_behavior) { @@ -443,14 +445,14 @@ const AXObject* child = ChildAfterTreePosition(); if (!child) { const AXObject* next_in_order = container_object_->NextInTreeObject(); - if (!next_in_order || !next_in_order->ParentObjectUnignored()) + if (!next_in_order || !next_in_order->ParentObjectIncludedInTree()) return {}; return CreatePositionBeforeObject(*next_in_order, AXPositionAdjustmentBehavior::kMoveRight); } - if (!child->ParentObjectUnignored()) + if (!child->ParentObjectIncludedInTree()) return {}; return CreatePositionAfterObject(*child, @@ -490,7 +492,7 @@ } if (!object_before_position || - !object_before_position->ParentObjectUnignored()) { + !object_before_position->ParentObjectIncludedInTree()) { return {}; } @@ -539,17 +541,17 @@ // Case 1. // Neither text positions nor "after children" positions have a |child| // object. - if (container->AccessibilityIsIgnored() && child) { + if (!container->AccessibilityIsIncludedInTree() && child) { // |CreatePositionBeforeObject| already finds the unignored parent before // creating the new position, so we don't need to replicate the logic here. return CreatePositionBeforeObject(*child, adjustment_behavior); } // Cases 2 and 3. - if (container->AccessibilityIsIgnored()) { + if (!container->AccessibilityIsIncludedInTree()) { // Case 2. if (IsTextPosition()) { - if (!container->ParentObjectUnignored()) + if (!container->ParentObjectIncludedInTree()) return {}; // Calling |CreateNextPosition| or |CreatePreviousPosition| is not @@ -558,11 +560,11 @@ // any unignored siblings. switch (adjustment_behavior) { case AXPositionAdjustmentBehavior::kMoveRight: - return CreateLastPositionInObject(*container->ParentObjectUnignored(), - adjustment_behavior); + return CreateLastPositionInObject( + *container->ParentObjectIncludedInTree(), adjustment_behavior); case AXPositionAdjustmentBehavior::kMoveLeft: return CreateFirstPositionInObject( - *container->ParentObjectUnignored(), adjustment_behavior); + *container->ParentObjectIncludedInTree(), adjustment_behavior); } } @@ -577,7 +579,7 @@ } // Case 4. - if (child && child->AccessibilityIsIgnored()) { + if (child && !child->AccessibilityIsIncludedInTree()) { switch (adjustment_behavior) { case AXPositionAdjustmentBehavior::kMoveRight: return CreateLastPositionInObject(*container); @@ -657,7 +659,7 @@ ax_object_cache_impl.GetOrCreate(container_node); DCHECK(new_container); AXPosition position(*new_container); - if (new_container == container->ParentObjectUnignored()) { + if (new_container == container->ParentObjectIncludedInTree()) { position.text_offset_or_child_index_ = container->IndexInParent(); } else { switch (adjustment_behavior) { @@ -788,7 +790,7 @@ *next_node, container_node))) { const AXObject* next_object = ax_object_cache_impl->GetOrCreate(next_node); - if (next_object && !next_object->AccessibilityIsIgnored()) + if (next_object && next_object->AccessibilityIsIncludedInTree()) return next_object; } return nullptr; @@ -800,7 +802,7 @@ *previous_node, container_node))) { const AXObject* previous_object = ax_object_cache_impl->GetOrCreate(previous_node); - if (previous_object && !previous_object->AccessibilityIsIgnored()) + if (previous_object && previous_object->AccessibilityIsIncludedInTree()) return previous_object; } return nullptr;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_position_test.cc b/third_party/blink/renderer/modules/accessibility/ax_position_test.cc index f521f7a..cf32e0b8 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_position_test.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_position_test.cc
@@ -316,10 +316,10 @@ SetBodyInnerHTML(R"HTML(<input id="input" type="text" value="value"> <p id="paragraph">hello<br>there</p>)HTML"); - const AXObject* root = GetAXRootObject(); - ASSERT_NE(nullptr, root); - const auto root_first = AXPosition::CreateFirstPositionInObject(*root); - const auto root_last = AXPosition::CreateLastPositionInObject(*root); + const AXObject* body = GetAXRootObject()->FirstChild(); + ASSERT_NE(nullptr, body); + const auto root_first = AXPosition::CreateFirstPositionInObject(*body); + const auto root_last = AXPosition::CreateLastPositionInObject(*body); const AXObject* input = GetAXObjectByElementId("input"); ASSERT_NE(nullptr, input); @@ -674,9 +674,10 @@ const Node* paragraph = GetElementById("paragraph"); ASSERT_NE(nullptr, paragraph); - const AXObject* ax_root = GetAXRootObject(); - ASSERT_NE(nullptr, ax_root); - ASSERT_EQ(ax::mojom::Role::kRootWebArea, ax_root->RoleValue()); + const AXObject* ax_body = GetAXRootObject()->FirstChild(); + ASSERT_NE(nullptr, ax_body); + ASSERT_EQ(ax::mojom::Role::kGenericContainer, ax_body->RoleValue()); + // The HTML label element should be ignored. const AXObject* ax_label = GetAXObjectByElementId("label"); ASSERT_NE(nullptr, ax_label); @@ -698,7 +699,7 @@ AXPosition::FromPosition(position, TextAffinity::kDownstream, AXPositionAdjustmentBehavior::kMoveLeft); EXPECT_FALSE(ax_position.IsTextPosition()); - EXPECT_EQ(ax_root, ax_position.ContainerObject()); + EXPECT_EQ(ax_body, ax_position.ContainerObject()); EXPECT_EQ(0, ax_position.ChildIndex()); EXPECT_EQ(ax_paragraph, ax_position.ChildAfterTreePosition()); @@ -729,7 +730,17 @@ ASSERT_NE(nullptr, ax_root); ASSERT_EQ(ax::mojom::Role::kRootWebArea, ax_root->RoleValue()); ASSERT_EQ(1, ax_root->ChildCount()); - const AXObject* ax_visible = ax_root->FirstChild(); + + const AXObject* ax_body = ax_root->FirstChild(); + ASSERT_NE(nullptr, ax_body); + ASSERT_EQ(ax::mojom::Role::kGenericContainer, ax_body->RoleValue()); + ASSERT_EQ(1, ax_body->ChildCount()); + + const AXObject* ax_hidden = GetAXObjectByElementId("hidden"); + ASSERT_NE(nullptr, ax_hidden); + ASSERT_EQ(ax::mojom::Role::kGenericContainer, ax_hidden->RoleValue()); + + const AXObject* ax_visible = GetAXObjectByElementId("visible"); ASSERT_NE(nullptr, ax_visible); ASSERT_EQ(ax::mojom::Role::kParagraph, ax_visible->RoleValue()); @@ -758,22 +769,23 @@ const auto ax_position_first = AXPosition::CreateFirstPositionInObject(*ax_root); const auto position_first = ax_position_first.ToPositionWithAffinity(); - EXPECT_EQ(GetDocument().body(), position_first.AnchorNode()); + EXPECT_EQ(GetDocument().body()->parentElement(), position_first.AnchorNode()); EXPECT_FALSE(position_first.GetPosition().IsBeforeChildren()); - EXPECT_EQ(2, position_first.GetPosition().OffsetInContainerNode()); - EXPECT_EQ(visible, position_first.GetPosition().ComputeNodeAfterPosition()); + EXPECT_EQ(1, position_first.GetPosition().OffsetInContainerNode()); + EXPECT_EQ(GetDocument().body(), + position_first.GetPosition().ComputeNodeAfterPosition()); const auto ax_position_first_from_dom = AXPosition::FromPosition(position_first); EXPECT_EQ(ax_position_first, ax_position_first_from_dom); - EXPECT_EQ(ax_visible, ax_position_first_from_dom.ChildAfterTreePosition()); + EXPECT_EQ(ax_body, ax_position_first_from_dom.ChildAfterTreePosition()); // A DOM position before |hidden| should convert to an accessibility position // before |visible|. const auto position_before = Position::BeforeNode(*hidden); const auto ax_position_before_from_dom = AXPosition::FromPosition(position_before); - EXPECT_EQ(ax_root, ax_position_before_from_dom.ContainerObject()); + EXPECT_EQ(ax_body, ax_position_before_from_dom.ContainerObject()); EXPECT_EQ(0, ax_position_before_from_dom.ChildIndex()); EXPECT_EQ(ax_visible, ax_position_before_from_dom.ChildAfterTreePosition()); @@ -782,7 +794,7 @@ const auto position_after = Position::AfterNode(*hidden); const auto ax_position_after_from_dom = AXPosition::FromPosition(position_after); - EXPECT_EQ(ax_root, ax_position_after_from_dom.ContainerObject()); + EXPECT_EQ(ax_body, ax_position_after_from_dom.ContainerObject()); EXPECT_EQ(0, ax_position_after_from_dom.ChildIndex()); EXPECT_EQ(ax_visible, ax_position_after_from_dom.ChildAfterTreePosition()); } @@ -791,7 +803,7 @@ // Aria-hidden can cause things in the DOM to be hidden from accessibility. // -TEST_F(AccessibilityTest, BeforePositionInARIAHiddenShouldSkipARIAHidden) { +TEST_F(AccessibilityTest, BeforePositionInARIAHiddenShouldNotSkipARIAHidden) { SetBodyInnerHTML(R"HTML( <div role="main" id="container"> <p id="before">Before aria-hidden.</p> @@ -804,6 +816,8 @@ ASSERT_NE(nullptr, container); const Node* after = GetElementById("after"); ASSERT_NE(nullptr, after); + const Node* hidden = GetElementById("ariaHidden"); + ASSERT_NE(nullptr, hidden); const AXObject* ax_before = GetAXObjectByElementId("before"); ASSERT_NE(nullptr, ax_before); @@ -811,18 +825,19 @@ const AXObject* ax_after = GetAXObjectByElementId("after"); ASSERT_NE(nullptr, ax_after); ASSERT_EQ(ax::mojom::Role::kParagraph, ax_after->RoleValue()); - ASSERT_NE(nullptr, GetAXObjectByElementId("ariaHidden")); - ASSERT_TRUE(GetAXObjectByElementId("ariaHidden")->AccessibilityIsIgnored()); + const AXObject* ax_hidden = GetAXObjectByElementId("ariaHidden"); + ASSERT_NE(nullptr, ax_hidden); + ASSERT_TRUE(ax_hidden->AccessibilityIsIgnored()); const auto ax_position = AXPosition::CreatePositionAfterObject(*ax_before); const auto position = ax_position.ToPositionWithAffinity(); EXPECT_EQ(container, position.AnchorNode()); - EXPECT_EQ(5, position.GetPosition().OffsetInContainerNode()); - EXPECT_EQ(after, position.GetPosition().ComputeNodeAfterPosition()); + EXPECT_EQ(3, position.GetPosition().OffsetInContainerNode()); + EXPECT_EQ(hidden, position.GetPosition().ComputeNodeAfterPosition()); const auto ax_position_from_dom = AXPosition::FromPosition(position); EXPECT_EQ(ax_position, ax_position_from_dom); - EXPECT_EQ(ax_after, ax_position_from_dom.ChildAfterTreePosition()); + EXPECT_EQ(ax_hidden, ax_position_from_dom.ChildAfterTreePosition()); } TEST_F(AccessibilityTest, PreviousPositionAfterARIAHiddenShouldSkipARIAHidden) { @@ -857,14 +872,13 @@ const auto ax_position_previous = ax_position.CreatePreviousPosition(); const auto position_previous = ax_position_previous.ToPositionWithAffinity(); - EXPECT_EQ(before->firstChild(), position_previous.AnchorNode()); - EXPECT_EQ(19, position_previous.GetPosition().OffsetInContainerNode()); + EXPECT_EQ(nullptr, position_previous.AnchorNode()); + EXPECT_EQ(0, position_previous.GetPosition().OffsetInContainerNode()); EXPECT_EQ(nullptr, position_previous.GetPosition().ComputeNodeAfterPosition()); const auto ax_position_previous_from_dom = AXPosition::FromPosition(position_previous); - EXPECT_EQ(ax_position_previous, ax_position_previous_from_dom); EXPECT_EQ(nullptr, ax_position_previous_from_dom.ChildAfterTreePosition()); } @@ -883,7 +897,7 @@ const AXObject* ax_container = GetAXObjectByElementId("container"); ASSERT_NE(nullptr, ax_container); ASSERT_EQ(ax::mojom::Role::kMain, ax_container->RoleValue()); - ASSERT_EQ(2, ax_container->ChildCount()); + ASSERT_EQ(3, ax_container->ChildCount()); const AXObject* ax_before = GetAXObjectByElementId("before"); ASSERT_NE(nullptr, ax_before); ASSERT_EQ(ax::mojom::Role::kParagraph, ax_before->RoleValue()); @@ -891,41 +905,68 @@ ASSERT_NE(nullptr, ax_after); ASSERT_EQ(ax::mojom::Role::kParagraph, ax_after->RoleValue()); ASSERT_NE(nullptr, GetAXObjectByElementId("ariaHidden")); - ASSERT_TRUE(GetAXObjectByElementId("ariaHidden")->AccessibilityIsIgnored()); + const AXObject* ax_hidden = GetAXObjectByElementId("ariaHidden"); + ASSERT_TRUE(ax_hidden->AccessibilityIsIgnored()); const auto position_first = Position::FirstPositionInNode(*hidden); + auto ax_position_left = + AXPosition::FromPosition(position_first, TextAffinity::kDownstream, + AXPositionAdjustmentBehavior::kMoveLeft); + EXPECT_TRUE(ax_position_left.IsValid()); + EXPECT_FALSE(ax_position_left.IsTextPosition()); + EXPECT_EQ(ax_hidden, ax_position_left.ContainerObject()); + EXPECT_EQ(0, ax_position_left.ChildIndex()); + // This is an "after children" position. + EXPECT_EQ(nullptr, ax_position_left.ChildAfterTreePosition()); + + auto ax_position_right = + AXPosition::FromPosition(position_first, TextAffinity::kDownstream, + AXPositionAdjustmentBehavior::kMoveRight); + EXPECT_TRUE(ax_position_right.IsValid()); + EXPECT_FALSE(ax_position_right.IsTextPosition()); + EXPECT_EQ(ax_hidden, ax_position_right.ContainerObject()); + EXPECT_EQ(0, ax_position_right.ChildIndex()); + EXPECT_EQ(nullptr, ax_position_right.ChildAfterTreePosition()); + const auto position_before = Position::BeforeNode(*hidden); + ax_position_left = + AXPosition::FromPosition(position_before, TextAffinity::kDownstream, + AXPositionAdjustmentBehavior::kMoveLeft); + EXPECT_TRUE(ax_position_left.IsValid()); + EXPECT_FALSE(ax_position_left.IsTextPosition()); + EXPECT_EQ(ax_container, ax_position_left.ContainerObject()); + EXPECT_EQ(1, ax_position_left.ChildIndex()); + // This is an "after children" position. + EXPECT_EQ(ax_hidden, ax_position_left.ChildAfterTreePosition()); + + ax_position_right = + AXPosition::FromPosition(position_before, TextAffinity::kDownstream, + AXPositionAdjustmentBehavior::kMoveRight); + EXPECT_TRUE(ax_position_right.IsValid()); + EXPECT_FALSE(ax_position_right.IsTextPosition()); + EXPECT_EQ(ax_container, ax_position_right.ContainerObject()); + EXPECT_EQ(1, ax_position_right.ChildIndex()); + EXPECT_EQ(ax_hidden, ax_position_right.ChildAfterTreePosition()); + const auto position_after = Position::AfterNode(*hidden); - const auto positions = {position_first, position_before, position_after}; + ax_position_left = + AXPosition::FromPosition(position_after, TextAffinity::kDownstream, + AXPositionAdjustmentBehavior::kMoveLeft); + EXPECT_TRUE(ax_position_left.IsValid()); + EXPECT_FALSE(ax_position_left.IsTextPosition()); + EXPECT_EQ(ax_hidden, ax_position_left.ContainerObject()); + EXPECT_EQ(0, ax_position_left.ChildIndex()); + // This is an "after children" position. + EXPECT_EQ(nullptr, ax_position_left.ChildAfterTreePosition()); - for (const auto& position : positions) { - // - // |kMoveLeft| will create "after children" positions that are anchored to - // the paragraph before the element that is aria-hidden. - // - // |kMoveRight| will create positions that are anchored to the paragraph - // after the element that is aria-hidden. - // - - const auto ax_position_left = - AXPosition::FromPosition(position, TextAffinity::kDownstream, - AXPositionAdjustmentBehavior::kMoveLeft); - EXPECT_TRUE(ax_position_left.IsValid()); - EXPECT_FALSE(ax_position_left.IsTextPosition()); - EXPECT_EQ(ax_before, ax_position_left.ContainerObject()); - EXPECT_EQ(1, ax_position_left.ChildIndex()); - // This is an "after children" position. - EXPECT_EQ(nullptr, ax_position_left.ChildAfterTreePosition()); - - const auto ax_position_right = - AXPosition::FromPosition(position, TextAffinity::kDownstream, - AXPositionAdjustmentBehavior::kMoveRight); - EXPECT_TRUE(ax_position_right.IsValid()); - EXPECT_FALSE(ax_position_right.IsTextPosition()); - EXPECT_EQ(ax_container, ax_position_right.ContainerObject()); - EXPECT_EQ(1, ax_position_right.ChildIndex()); - EXPECT_EQ(ax_after, ax_position_right.ChildAfterTreePosition()); - } + ax_position_right = + AXPosition::FromPosition(position_after, TextAffinity::kDownstream, + AXPositionAdjustmentBehavior::kMoveRight); + EXPECT_TRUE(ax_position_right.IsValid()); + EXPECT_FALSE(ax_position_right.IsTextPosition()); + EXPECT_EQ(ax_container, ax_position_right.ContainerObject()); + EXPECT_EQ(2, ax_position_right.ChildIndex()); + EXPECT_EQ(ax_after, ax_position_right.ChildAfterTreePosition()); } //
diff --git a/third_party/blink/renderer/modules/accessibility/ax_range_test.cc b/third_party/blink/renderer/modules/accessibility/ax_range_test.cc index 2fef56e..a8a73f7 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_range_test.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_range_test.cc
@@ -19,6 +19,8 @@ const AXObject* root = GetAXRootObject(); ASSERT_NE(nullptr, root); + const AXObject* body = root->FirstChild(); + ASSERT_NE(nullptr, body); const AXObject* input = GetAXObjectByElementId("input"); ASSERT_NE(nullptr, input); const AXObject* paragraph = GetAXObjectByElementId("paragraph"); @@ -34,10 +36,10 @@ const AXObject* button = GetAXObjectByElementId("button"); ASSERT_NE(nullptr, button); - EXPECT_EQ(root, AXRange(AXPosition::CreateFirstPositionInObject(*input), + EXPECT_EQ(body, AXRange(AXPosition::CreateFirstPositionInObject(*input), AXPosition::CreateLastPositionInObject(*button)) .CommonAncestorContainer()); - EXPECT_EQ(root, AXRange(AXPosition::CreateFirstPositionInObject(*br), + EXPECT_EQ(body, AXRange(AXPosition::CreateFirstPositionInObject(*br), AXPosition::CreateFirstPositionInObject(*button)) .CommonAncestorContainer()); EXPECT_EQ(paragraph, AXRange(AXPosition::CreatePositionBeforeObject(*text1),
diff --git a/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc b/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc index 45eddd0..a1fcb05 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc
@@ -81,10 +81,11 @@ EXPECT_EQ(1, ax_selection.Extent().ChildIndex()); EXPECT_EQ( - "++<Paragraph>\n" - "++++<StaticText: Hel^lo.>\n" - "++<Paragraph>\n" - "++++<StaticText: How are you?>\n|", + "++<GenericContainer>\n" + "++++<Paragraph>\n" + "++++++<StaticText: Hel^lo.>\n" + "++++<Paragraph>\n" + "++++++<StaticText: How are you?>\n|", GetSelectionText(ax_selection)); } @@ -112,10 +113,11 @@ ax_selection.Extent().ChildIndex()); EXPECT_EQ( - "^++<Paragraph>\n" - "++++<StaticText: Hello.>\n" - "++<Paragraph>\n" - "++++<StaticText: How are you?>\n|", + "^++<GenericContainer>\n" + "++++<Paragraph>\n" + "++++++<StaticText: Hello.>\n" + "++++<Paragraph>\n" + "++++++<StaticText: How are you?>\n|", GetSelectionText(ax_selection)); } @@ -196,10 +198,11 @@ EXPECT_TRUE(ax_selection.Select()) << "The operation should now go through."; EXPECT_FALSE(Selection().GetSelectionInDOMTree().IsNone()); EXPECT_EQ( - "++<Paragraph>\n" - "++++<StaticText: Hel^lo.>\n" - "++<Paragraph>\n" - "++++<StaticText: How are you?>\n|", + "++<GenericContainer>\n" + "++++<Paragraph>\n" + "++++++<StaticText: Hel^lo.>\n" + "++++<Paragraph>\n" + "++++++<StaticText: How are you?>\n|", GetSelectionText(AXSelection::FromCurrentSelection(GetDocument()))); } @@ -255,8 +258,9 @@ EXPECT_EQ(text, dom_selection.Extent().AnchorNode()); EXPECT_EQ(5, dom_selection.Extent().OffsetInContainerNode()); EXPECT_EQ( - "++<Paragraph>\n" - "++++<StaticText: Hel^lo|>\n", + "++<GenericContainer>\n" + "++++<Paragraph>\n" + "++++++<StaticText: Hel^lo|>\n", GetSelectionText(ax_selection)); } @@ -285,8 +289,9 @@ EXPECT_EQ(text, dom_selection.Extent().AnchorNode()); EXPECT_EQ(10, dom_selection.Extent().OffsetInContainerNode()); EXPECT_EQ( - "++<Paragraph>\n" - "++++<StaticText: Hel^lo|>\n", + "++<GenericContainer>\n" + "++++<Paragraph>\n" + "++++++<StaticText: Hel^lo|>\n", GetSelectionText(ax_selection)); } @@ -327,10 +332,11 @@ // The selection anchor marker '^' should be before the line break and the // selection focus marker '|' should be after it. EXPECT_EQ( - "++<Paragraph>\n" - "++++<StaticText: Hello>\n" - "^++++<LineBreak: \n>\n" - "|++++<StaticText: |How are you.>\n", + "++<GenericContainer>\n" + "++++<Paragraph>\n" + "++++++<StaticText: Hello>\n" + "^++++++<LineBreak: \n>\n" + "|++++++<StaticText: |How are you.>\n", GetSelectionText(ax_selection)); } @@ -373,10 +379,11 @@ // The selection anchor marker '^' should be before the line break and the // selection focus marker '|' should be after it. EXPECT_EQ( - "++<Paragraph>\n" - "++++<StaticText: Hello>\n" - "^++++<LineBreak: \n>\n" - "|++++<StaticText: |How are you.>\n", + "++<GenericContainer>\n" + "++++<Paragraph>\n" + "++++++<StaticText: Hello>\n" + "^++++++<LineBreak: \n>\n" + "|++++++<StaticText: |How are you.>\n", GetSelectionText(ax_selection)); } @@ -391,9 +398,9 @@ SetBodyInnerHTML(R"HTML( <div id="main" role="main"> <p id="beforeHidden">Before aria-hidden.</p> - <p id="hidden1" aria-hidden="true">Aria-hidden 1.</p> + <p id="hidden1" aria-hidden="true" style="display:inline">Aria-hidden 1.</p> <p id="betweenHidden">In between two aria-hidden elements.</p> - <p id="hidden2" aria-hidden="true">Aria-hidden 2.</p> + <p id="hidden2" aria-hidden="true" style="display:inline">Aria-hidden 2.</p> <p id="afterHidden">After aria-hidden.</p> </div> )HTML"); @@ -409,18 +416,23 @@ const AXObject* ax_before = GetAXObjectByElementId("beforeHidden"); ASSERT_NE(nullptr, ax_before); ASSERT_EQ(ax::mojom::Role::kParagraph, ax_before->RoleValue()); + const AXObject* ax_hidden1 = GetAXObjectByElementId("hidden1"); + ASSERT_NE(nullptr, ax_hidden1); + ASSERT_EQ(ax::mojom::Role::kParagraph, ax_hidden1->RoleValue()); + ASSERT_TRUE(ax_hidden1->AccessibilityIsIgnored()); + ASSERT_FALSE(ax_hidden1->AccessibilityIsIncludedInTree()); const AXObject* ax_between = GetAXObjectByElementId("betweenHidden"); ASSERT_NE(nullptr, ax_between); ASSERT_EQ(ax::mojom::Role::kParagraph, ax_between->RoleValue()); + const AXObject* ax_hidden2 = GetAXObjectByElementId("hidden2"); + ASSERT_NE(nullptr, ax_hidden2); + ASSERT_EQ(ax::mojom::Role::kParagraph, ax_hidden2->RoleValue()); + ASSERT_TRUE(ax_hidden2->AccessibilityIsIgnored()); + ASSERT_FALSE(ax_hidden2->AccessibilityIsIncludedInTree()); const AXObject* ax_after = GetAXObjectByElementId("afterHidden"); ASSERT_NE(nullptr, ax_after); ASSERT_EQ(ax::mojom::Role::kParagraph, ax_after->RoleValue()); - ASSERT_NE(nullptr, GetAXObjectByElementId("hidden1")); - ASSERT_TRUE(GetAXObjectByElementId("hidden1")->AccessibilityIsIgnored()); - ASSERT_NE(nullptr, GetAXObjectByElementId("hidden2")); - ASSERT_TRUE(GetAXObjectByElementId("hidden2")->AccessibilityIsIgnored()); - const auto hidden_1_first = Position::FirstPositionInNode(*hidden_1); const auto hidden_2_first = Position::FirstPositionInNode(*hidden_2); const auto selection = SelectionInDOMTree::Builder() @@ -460,13 +472,14 @@ // aria-hidden. However, the AX selections should still differ if converted to // DOM selections. const std::string selection_text( - "++<Main>\n" - "++++<Paragraph>\n" - "++++++<StaticText: Before aria-hidden.>\n" - "^++++<Paragraph>\n" - "++++++<StaticText: In between two aria-hidden elements.>\n" - "|++++<Paragraph>\n" - "++++++<StaticText: After aria-hidden.>\n"); + "++<GenericContainer>\n" + "++++<Main>\n" + "++++++<Paragraph>\n" + "++++++++<StaticText: Before aria-hidden.>\n" + "^++++++<Paragraph>\n" + "++++++++<StaticText: In between two aria-hidden elements.>\n" + "|++++++<Paragraph>\n" + "++++++++<StaticText: After aria-hidden.>\n"); EXPECT_EQ(selection_text, GetSelectionText(ax_selection_shrink)); EXPECT_EQ(selection_text, GetSelectionText(ax_selection_extend)); } @@ -553,14 +566,15 @@ // The |AXSelection| should remain unaffected by any shrinking and should // include both list bullets. EXPECT_EQ( - "++<Main>\n" - "++++<List>\n" - "++++++<ListItem>\n" - "++++++++<ListMarker: \xE2\x80\xA2 >\n" - "^++++++++<StaticText: Item 1.>\n" - "++++++<ListItem>\n" - "++++++++<ListMarker: \xE2\x80\xA2 >\n" - "++++++++<StaticText: Item 2.|>\n", + "++<GenericContainer>\n" + "++++<Main>\n" + "++++++<List>\n" + "++++++++<ListItem>\n" + "++++++++++<ListMarker: \xE2\x80\xA2 >\n" + "^++++++++++<StaticText: Item 1.>\n" + "++++++++<ListItem>\n" + "++++++++++<ListMarker: \xE2\x80\xA2 >\n" + "++++++++++<StaticText: Item 2.|>\n", GetSelectionText(ax_selection)); }
diff --git a/third_party/blink/renderer/modules/accessibility/testing/data/selection/aria-hidden-ax.txt b/third_party/blink/renderer/modules/accessibility/testing/data/selection/aria-hidden-ax.txt index a3ac8395..4bca54e 100644 --- a/third_party/blink/renderer/modules/accessibility/testing/data/selection/aria-hidden-ax.txt +++ b/third_party/blink/renderer/modules/accessibility/testing/data/selection/aria-hidden-ax.txt
@@ -2,10 +2,11 @@ ================================================================================ AXSelection from AX object anchored position in "Main": "", 1 to AX object anchored position in "Main": "", 2 ================================================================================ -++<Main> -++++<Paragraph> -++++++<StaticText: Before aria-hidden.> -^++++<Paragraph> -++++++<StaticText: In the middle of aria-hidden.> -|++++<Paragraph> -++++++<StaticText: After aria-hidden.> +++<GenericContainer> +++++<Main> +++++++<Paragraph> +++++++++<StaticText: Before aria-hidden.> +^++++++<Paragraph> +++++++++<StaticText: In the middle of aria-hidden.> +|++++++<Paragraph> +++++++++<StaticText: After aria-hidden.>
diff --git a/third_party/blink/renderer/modules/accessibility/testing/data/selection/aria-hidden.html b/third_party/blink/renderer/modules/accessibility/testing/data/selection/aria-hidden.html index 88f9d7a..ecf690e0 100644 --- a/third_party/blink/renderer/modules/accessibility/testing/data/selection/aria-hidden.html +++ b/third_party/blink/renderer/modules/accessibility/testing/data/selection/aria-hidden.html
@@ -3,9 +3,9 @@ <body> <div role="main"> <p>Before aria-hidden.</p> - ^<p aria-hidden="true">Aria-hidden 1.</p> + ^<p aria-hidden="true" style="display:inline">Aria-hidden 1.</p> <p>In the middle of aria-hidden.</p> - <p aria-hidden="true">Aria-hidden 2.</p>| + <p aria-hidden="true" style="display:inline">Aria-hidden 2.</p>| <p>After aria-hidden.</p> </div> </body>
diff --git a/third_party/blink/renderer/modules/accessibility/testing/data/selection/list-ax.txt b/third_party/blink/renderer/modules/accessibility/testing/data/selection/list-ax.txt index cdb8cd6d..2d576b50 100644 --- a/third_party/blink/renderer/modules/accessibility/testing/data/selection/list-ax.txt +++ b/third_party/blink/renderer/modules/accessibility/testing/data/selection/list-ax.txt
@@ -2,46 +2,48 @@ ================================================================================ AXSelection from AX object anchored position in "List": "", 1 to AX object anchored position in "List": "", 3 ================================================================================ -++<List> -++++<ListItem> -++++++<ListMarker: 1. > -++++++<StaticText: tic> -^++++<ListItem> -++++++<ListMarker: 2. > -++++++<StaticText: tac> -++++<ListItem> -++++++<ListMarker: 3. > -++++++<StaticText: toe> -|++<List> -++++<ListItem> -++++++<StaticText: tic> -++++<StaticText: > -++++<ListItem> -++++++<StaticText: tac> -++++<StaticText: > -++++<ListItem> -++++++<StaticText: toe> +++<GenericContainer> +++++<List> +++++++<ListItem> +++++++++<ListMarker: 1. > +++++++++<StaticText: tic> +^++++++<ListItem> +++++++++<ListMarker: 2. > +++++++++<StaticText: tac> +++++++<ListItem> +++++++++<ListMarker: 3. > +++++++++<StaticText: toe> +|++++<List> +++++++<ListItem> +++++++++<StaticText: tic> +++++++<StaticText: > +++++++<ListItem> +++++++++<StaticText: tac> +++++++<StaticText: > +++++++<ListItem> +++++++++<StaticText: toe> ================================================================================ -AXSelection from AX object anchored position in "WebArea": "", 1 to AX object anchored position in "WebArea": "", 2 +AXSelection from AX object anchored position in "GenericContainer": "", 1 to AX object anchored position in "GenericContainer": "", 2 ================================================================================ -++<List> -++++<ListItem> -++++++<ListMarker: 1. > -++++++<StaticText: tic> -++++<ListItem> -++++++<ListMarker: 2. > -++++++<StaticText: tac> -++++<ListItem> -++++++<ListMarker: 3. > -++++++<StaticText: toe> -^++<List> -++++<ListItem> -++++++<StaticText: tic> -++++<StaticText: > -++++<ListItem> -++++++<StaticText: tac> -++++<StaticText: > -++++<ListItem> -++++++<StaticText: toe> +++<GenericContainer> +++++<List> +++++++<ListItem> +++++++++<ListMarker: 1. > +++++++++<StaticText: tic> +++++++<ListItem> +++++++++<ListMarker: 2. > +++++++++<StaticText: tac> +++++++<ListItem> +++++++++<ListMarker: 3. > +++++++++<StaticText: toe> +^++++<List> +++++++<ListItem> +++++++++<StaticText: tic> +++++++<StaticText: > +++++++<ListItem> +++++++++<StaticText: tac> +++++++<StaticText: > +++++++<ListItem> +++++++++<StaticText: toe> | \ No newline at end of file
diff --git a/third_party/blink/renderer/modules/accessibility/testing/data/selection/svg-ax.txt b/third_party/blink/renderer/modules/accessibility/testing/data/selection/svg-ax.txt index 7a736f17..1f7d0fd 100644 --- a/third_party/blink/renderer/modules/accessibility/testing/data/selection/svg-ax.txt +++ b/third_party/blink/renderer/modules/accessibility/testing/data/selection/svg-ax.txt
@@ -3,25 +3,28 @@ AXSelection from AX text position in "StaticText": "Some text. ", 0 to AX text position in "StaticText": " More text.", 0 ================================================================================ ++<GenericContainer> -++++<Paragraph> -^++++++<StaticText: ^Some text. > -++++++<Image: Square> -|++++++<StaticText: | More text.> +++++<GenericContainer> +++++++<Paragraph> +^++++++++<StaticText: ^Some text. > +++++++++<Image: Square> +|++++++++<StaticText: | More text.> ================================================================================ AXSelection from AX text position in "StaticText": "Some text. ", 10 to AX text position in "StaticText": " More text.", 1 ================================================================================ ++<GenericContainer> -++++<Paragraph> -++++++<StaticText: Some text.^ > -++++++<Image: Square> -++++++<StaticText: |More text.> +++++<GenericContainer> +++++++<Paragraph> +++++++++<StaticText: Some text.^ > +++++++++<Image: Square> +++++++++<StaticText: |More text.> ================================================================================ AXSelection from AX text position in "StaticText": "Some text. ", 11 to AX text position in "StaticText": " More text.", 11 ================================================================================ ++<GenericContainer> -++++<Paragraph> -++++++<StaticText: Some text. ^> -++++++<Image: Square> -++++++<StaticText: More text.|> +++++<GenericContainer> +++++++<Paragraph> +++++++++<StaticText: Some text. ^> +++++++++<Image: Square> +++++++++<StaticText: More text.|>
diff --git a/third_party/blink/renderer/modules/accessibility/testing/data/selection/table-ax.txt b/third_party/blink/renderer/modules/accessibility/testing/data/selection/table-ax.txt index 670a7cbf..ce4a68b 100644 --- a/third_party/blink/renderer/modules/accessibility/testing/data/selection/table-ax.txt +++ b/third_party/blink/renderer/modules/accessibility/testing/data/selection/table-ax.txt
@@ -2,99 +2,103 @@ ================================================================================ AXSelection from AX text position in "StaticText": "Sum", 0 to AX text position in "StaticText": "Subtraction", 11 ================================================================================ -++<Table> -++++<Row> -++++++<ColumnHeader: Sum> -^++++++++<StaticText: ^Sum> -++++++<ColumnHeader: Subtraction> -++++++++<StaticText: Subtraction|> -++++<Row> -++++++<Cell: 10> -++++++++<StaticText: 10> -++++++<Cell: 7> -++++++++<StaticText: 7> -++++<Row> -++++++<Cell: 2> -++++++++<StaticText: 2> -++++++<Cell: 4> -++++++++<StaticText: 4> -++++<Row> -++++++<Cell: 12> -++++++++<StaticText: 12> -++++++<Cell: 3> -++++++++<StaticText: 3> +++<GenericContainer> +++++<Table> +++++++<Row> +++++++++<ColumnHeader: Sum> +^++++++++++<StaticText: ^Sum> +++++++++<ColumnHeader: Subtraction> +++++++++++<StaticText: Subtraction|> +++++++<Row> +++++++++<Cell: 10> +++++++++++<StaticText: 10> +++++++++<Cell: 7> +++++++++++<StaticText: 7> +++++++<Row> +++++++++<Cell: 2> +++++++++++<StaticText: 2> +++++++++<Cell: 4> +++++++++++<StaticText: 4> +++++++<Row> +++++++++<Cell: 12> +++++++++++<StaticText: 12> +++++++++<Cell: 3> +++++++++++<StaticText: 3> ================================================================================ AXSelection from AX text position in "StaticText": "7", 1 to AX text position in "StaticText": "10", 0 ================================================================================ -++<Table> -++++<Row> -++++++<ColumnHeader: Sum> -++++++++<StaticText: Sum> -++++++<ColumnHeader: Subtraction> -++++++++<StaticText: Subtraction> -++++<Row> -++++++<Cell: 10> -|++++++++<StaticText: |10> -++++++<Cell: 7> -++++++++<StaticText: 7^> -++++<Row> -++++++<Cell: 2> -++++++++<StaticText: 2> -++++++<Cell: 4> -++++++++<StaticText: 4> -++++<Row> -++++++<Cell: 12> -++++++++<StaticText: 12> -++++++<Cell: 3> -++++++++<StaticText: 3> +++<GenericContainer> +++++<Table> +++++++<Row> +++++++++<ColumnHeader: Sum> +++++++++++<StaticText: Sum> +++++++++<ColumnHeader: Subtraction> +++++++++++<StaticText: Subtraction> +++++++<Row> +++++++++<Cell: 10> +|++++++++++<StaticText: |10> +++++++++<Cell: 7> +++++++++++<StaticText: 7^> +++++++<Row> +++++++++<Cell: 2> +++++++++++<StaticText: 2> +++++++++<Cell: 4> +++++++++++<StaticText: 4> +++++++<Row> +++++++++<Cell: 12> +++++++++++<StaticText: 12> +++++++++<Cell: 3> +++++++++++<StaticText: 3> ================================================================================ AXSelection from AX text position in "StaticText": "2", 1 to AX text position in "StaticText": "4", 0 ================================================================================ -++<Table> -++++<Row> -++++++<ColumnHeader: Sum> -++++++++<StaticText: Sum> -++++++<ColumnHeader: Subtraction> -++++++++<StaticText: Subtraction> -++++<Row> -++++++<Cell: 10> -++++++++<StaticText: 10> -++++++<Cell: 7> -++++++++<StaticText: 7> -++++<Row> -++++++<Cell: 2> -++++++++<StaticText: 2^> -++++++<Cell: 4> -|++++++++<StaticText: |4> -++++<Row> -++++++<Cell: 12> -++++++++<StaticText: 12> -++++++<Cell: 3> -++++++++<StaticText: 3> +++<GenericContainer> +++++<Table> +++++++<Row> +++++++++<ColumnHeader: Sum> +++++++++++<StaticText: Sum> +++++++++<ColumnHeader: Subtraction> +++++++++++<StaticText: Subtraction> +++++++<Row> +++++++++<Cell: 10> +++++++++++<StaticText: 10> +++++++++<Cell: 7> +++++++++++<StaticText: 7> +++++++<Row> +++++++++<Cell: 2> +++++++++++<StaticText: 2^> +++++++++<Cell: 4> +|++++++++++<StaticText: |4> +++++++<Row> +++++++++<Cell: 12> +++++++++++<StaticText: 12> +++++++++<Cell: 3> +++++++++++<StaticText: 3> ================================================================================ AXSelection from AX text position in "StaticText": "12", 0 to AX text position in "StaticText": "3", 1 ================================================================================ -++<Table> -++++<Row> -++++++<ColumnHeader: Sum> -++++++++<StaticText: Sum> -++++++<ColumnHeader: Subtraction> -++++++++<StaticText: Subtraction> -++++<Row> -++++++<Cell: 10> -++++++++<StaticText: 10> -++++++<Cell: 7> -++++++++<StaticText: 7> -++++<Row> -++++++<Cell: 2> -++++++++<StaticText: 2> -++++++<Cell: 4> -++++++++<StaticText: 4> -++++<Row> -++++++<Cell: 12> -^++++++++<StaticText: ^12> -++++++<Cell: 3> -++++++++<StaticText: 3|> +++<GenericContainer> +++++<Table> +++++++<Row> +++++++++<ColumnHeader: Sum> +++++++++++<StaticText: Sum> +++++++++<ColumnHeader: Subtraction> +++++++++++<StaticText: Subtraction> +++++++<Row> +++++++++<Cell: 10> +++++++++++<StaticText: 10> +++++++++<Cell: 7> +++++++++++<StaticText: 7> +++++++<Row> +++++++++<Cell: 2> +++++++++++<StaticText: 2> +++++++++<Cell: 4> +++++++++++<StaticText: 4> +++++++<Row> +++++++++<Cell: 12> +^++++++++++<StaticText: ^12> +++++++++<Cell: 3> +++++++++++<StaticText: 3|>
diff --git a/third_party/blink/renderer/modules/exported/web_ax_object.cc b/third_party/blink/renderer/modules/exported/web_ax_object.cc index 47d9fac1..65d1065e 100644 --- a/third_party/blink/renderer/modules/exported/web_ax_object.cc +++ b/third_party/blink/renderer/modules/exported/web_ax_object.cc
@@ -330,6 +330,13 @@ return private_->IsHovered(); } +bool WebAXObject::IsLineBreakingObject() const { + if (IsDetached()) + return false; + + return private_->IsLineBreakingObject(); +} + bool WebAXObject::IsLinked() const { if (IsDetached()) return false;
diff --git a/third_party/blink/renderer/platform/wtf/vector.h b/third_party/blink/renderer/platform/wtf/vector.h index 1f920fd..0b07e0c 100644 --- a/third_party/blink/renderer/platform/wtf/vector.h +++ b/third_party/blink/renderer/platform/wtf/vector.h
@@ -1141,13 +1141,13 @@ // Insert a single element constructed as T(args...) to the back. The // element is constructed directly on the backing buffer with placement // new. - // append(buffer, size) - // appendVector(vector) - // appendRange(begin, end) + // Append(buffer, size) + // AppendVector(vector) + // AppendRange(begin, end) // Insert multiple elements represented by (1) |buffer| and |size| - // (for append), (2) |vector| (for appendVector), or (3) a pair of - // iterators (for appendRange) to the back. The elements will be copied. - // uncheckedAppend(value) + // (for append), (2) |vector| (for AppendVector), or (3) a pair of + // iterators (for AppendRange) to the back. The elements will be copied. + // UncheckedAppend(value) // Insert a single element like push_back(), but this function assumes // the vector has enough capacity such that it can store the new element // without a reallocation. Using this function could improve the @@ -1197,7 +1197,7 @@ // push_front(value) // Insert a single element to the front. // push_front(buffer, size) - // prependVector(vector) + // PrependVector(vector) // Insert multiple elements represented by either |buffer| and |size| or // |vector| to the front. The elements will be copied. template <typename U> @@ -1227,10 +1227,10 @@ // growed as a result of this call, those events may invalidate some // iterators. See comments for shrink() and grow(). // - // fill(value, size) will resize the Vector to |size|, and then copy-assign + // Fill(value, size) will resize the Vector to |size|, and then copy-assign // or copy-initialize all the elements. // - // fill(value) is a synonym for fill(value, size()). + // Fill(value) is a synonym for Fill(value, size()). void Fill(const T&, wtf_size_t); void Fill(const T& val) { Fill(val, size()); }
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index a3f635f..cc8077e 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -257,6 +257,9 @@ crbug.com/926276 virtual/display-lock/wpt_internal/display-lock/lock-after-append/nested-update.html [ Timeout ] crbug.com/926276 virtual/display-lock/wpt_internal/display-lock/lock-after-append/nested-update-and-commit.html [ Timeout ] crbug.com/955533 virtual/display-lock/wpt_internal/display-lock/sizing/overflow-auto-with-overflow.html [ Failure ] +crbug.com/973555 virtual/display-lock/wpt_internal/display-lock/paint/hit-testing-001.html [ Failure Crash ] +crbug.com/973555 virtual/display-lock/wpt_internal/display-lock/paint/hit-testing-002.html [ Failure Crash ] +crbug.com/973555 virtual/display-lock/wpt_internal/display-lock/paint/hit-testing-003.html [ Failure Crash ] # Sheriff 2018/05/25 crbug.com/846747 http/tests/navigation/navigation-interrupted-by-fragment.html [ Pass Timeout ] @@ -5734,7 +5737,6 @@ # Sheriff 2019-05-06 crbug.com/959372 [ Win ] external/wpt/import-maps/fallback.sub.tentative.html [ Pass Timeout ] -crbug.com/959129 [ Win Linux ] http/tests/devtools/tracing/timeline-script-parse.js [ Pass Failure ] # Sheriff 2019-05-07 crbug.com/960443 [ Mac10.10 Mac10.11 ] external/wpt/animation-worklet/worklet-animation-with-scroll-timeline.https.html [ Failure Pass ] @@ -5859,6 +5861,7 @@ crbug.com/973726 [ Mac ] fast/css/large-list-of-rules-crash.html [ Pass Timeout ] crbug.com/937546 [ Win7 ] http/tests/security/xss-DENIED-cross-origin-stack-overflow.html [ Pass Timeout ] crbug.com/937546 [ Win7 ] virtual/blink-cors/http/tests/security/xss-DENIED-cross-origin-stack-overflow.html [ Pass Timeout ] +crbug.com/959129 http/tests/devtools/tracing/timeline-script-parse.js [ Pass Failure ] # Flaky on Linux crbug.com/973769 [ Linux ] http/tests/media/video-seek-to-duration.html [ Pass Failure ]
diff --git a/third_party/blink/web_tests/accessibility/adjacent-continuations-cause-assertion-failure-expected.txt b/third_party/blink/web_tests/accessibility/adjacent-continuations-cause-assertion-failure-expected.txt index 1c825a75..7e8c4fa 100644 --- a/third_party/blink/web_tests/accessibility/adjacent-continuations-cause-assertion-failure-expected.txt +++ b/third_party/blink/web_tests/accessibility/adjacent-continuations-cause-assertion-failure-expected.txt
@@ -8,15 +8,17 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". AXRole: AXWebArea - AXRole: AXStaticText "x" - AXRole: AXInlineTextBox "x" AXRole: AXGenericContainer - AXRole: AXStaticText "y" - AXRole: AXInlineTextBox "y" - AXRole: AXStaticText "z" - AXRole: AXInlineTextBox "z" - AXRole: AXGenericContainer - AXRole: AXStaticText "End of test" + AXRole: AXGenericContainer + AXRole: AXStaticText "x" + AXRole: AXInlineTextBox "x" + AXRole: AXGenericContainer + AXRole: AXStaticText "y" + AXRole: AXInlineTextBox "y" + AXRole: AXStaticText "z" + AXRole: AXInlineTextBox "z" + AXRole: AXGenericContainer + AXRole: AXStaticText "End of test" PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/accessibility/aria-hidden-hides-all-elements.html b/third_party/blink/web_tests/accessibility/aria-hidden-hides-all-elements.html index 4db72a7..f094bf5 100644 --- a/third_party/blink/web_tests/accessibility/aria-hidden-hides-all-elements.html +++ b/third_party/blink/web_tests/accessibility/aria-hidden-hides-all-elements.html
@@ -26,17 +26,45 @@ <script> test(function(t) { - var content = accessibilityController.accessibleElementById("content"); - assert_equals(content.childrenCount, 6); + var content = accessibilityController.accessibleElementById("main"); + assert_equals(content.childrenCount, 8); + assert_true(content.isIgnored); + assert_false(content.childAtIndex(0).isIgnored); + assert_false(content.childAtIndex(1).isIgnored); + assert_false(content.childAtIndex(2).isIgnored); + assert_false(content.childAtIndex(3).isIgnored); + assert_true(content.childAtIndex(4).isIgnored); + assert_true(content.childAtIndex(5).isIgnored); + assert_false(content.childAtIndex(6).isIgnored); + assert_false(content.childAtIndex(7).isIgnored); document.getElementById("ul").tabIndex = -1; - assert_equals(content.childrenCount, 7, - "Making list focusable should make it not hidden"); + assert_equals(content.childrenCount, 8, + "Making list focusable should not impact if it's hidden"); + assert_true(content.isIgnored); + assert_false(content.childAtIndex(0).isIgnored); + assert_false(content.childAtIndex(1).isIgnored); + assert_false(content.childAtIndex(2).isIgnored); + assert_false(content.childAtIndex(3).isIgnored); + assert_true(content.childAtIndex(4).isIgnored); + assert_false(content.childAtIndex(5).isIgnored); + assert_false(content.childAtIndex(6).isIgnored); + assert_false(content.childAtIndex(7).isIgnored); + document.getElementById("ul").removeAttribute("tabindex"); - assert_equals(content.childrenCount, 6, + assert_equals(content.childrenCount, 8, "Making list unfocusable should make it hidden again"); + assert_true(content.isIgnored); + assert_false(content.childAtIndex(0).isIgnored); + assert_false(content.childAtIndex(1).isIgnored); + assert_false(content.childAtIndex(2).isIgnored); + assert_false(content.childAtIndex(3).isIgnored); + assert_true(content.childAtIndex(4).isIgnored); + assert_true(content.childAtIndex(5).isIgnored); + assert_false(content.childAtIndex(6).isIgnored); + assert_false(content.childAtIndex(7).isIgnored); }); </script>
diff --git a/third_party/blink/web_tests/accessibility/aria-hidden-update.html b/third_party/blink/web_tests/accessibility/aria-hidden-update.html index 7c1a1a0b..539e5f16 100644 --- a/third_party/blink/web_tests/accessibility/aria-hidden-update.html +++ b/third_party/blink/web_tests/accessibility/aria-hidden-update.html
@@ -30,24 +30,43 @@ assert_equals(parent.childAtIndex(0).name, button1.name, "button1 is first"); assert_equals(parent.childAtIndex(1).name, button2.name, "button2 is second"); assert_equals(parent.childAtIndex(2).name, button3.name, "button3 is third"); + assert_false(parent.childAtIndex(0).isIgnored); + assert_false(parent.childAtIndex(1).isIgnored); + assert_false(parent.childAtIndex(2).isIgnored); - // Make the 2nd button hidden. Only 1 and 3 should be present. + // Make the 2nd button hidden. All 3 children should still be present. document.getElementById("button2").setAttribute("aria-hidden", "true"); - assert_equals(parent.childAtIndex(0).name, button1.name, "button1 is first after setting button2 aria-hidden"); - assert_equals(parent.childAtIndex(1).name, button3.name, "button3 is second after setting button2 aria-hidden"); + // Verify that the 3 children are present. + assert_equals(parent.childAtIndex(0).name, button1.name, "button1 is first"); + assert_equals(parent.childAtIndex(1).name, button2.name, "button2 is second"); + assert_equals(parent.childAtIndex(2).name, button3.name, "button3 is third"); + assert_false(parent.childAtIndex(0).isIgnored); + assert_true(parent.childAtIndex(1).isIgnored); + assert_false(parent.childAtIndex(2).isIgnored); - // Make the 1st button hidden. Only 3 should be present. + // Make the 1st button hidden. All 3 children should still be present. document.getElementById("button1").setAttribute("aria-hidden", "true"); - assert_equals(parent.childAtIndex(0).name, button3.name, "button3 is first after setting button1 aria-hidden"); + // Verify that the 3 children are present. + assert_equals(parent.childAtIndex(0).name, button1.name, "button1 is first"); + assert_equals(parent.childAtIndex(1).name, button2.name, "button2 is second"); + assert_equals(parent.childAtIndex(2).name, button3.name, "button3 is third"); + assert_true(parent.childAtIndex(0).isIgnored); + assert_true(parent.childAtIndex(1).isIgnored); + assert_false(parent.childAtIndex(2).isIgnored); - // Make the 2nd button not hidden. 2 and 3 should be present. + // Make the 2nd button not hidden. All 3 children should still be present. document.getElementById("button2").setAttribute("aria-hidden", "false"); - assert_equals(parent.childAtIndex(0).name, button2.name, "button2 is first after clearning button2 aria-hidden"); - assert_equals(parent.childAtIndex(1).name, button3.name, "button3 is second after clearing button2 aria-hidden"); -}, "This test makes sure that when aria-hidden changes, the AX hierarchy is updated."); + // Verify that the 3 children are present. + assert_equals(parent.childAtIndex(0).name, button1.name, "button1 is first"); + assert_equals(parent.childAtIndex(1).name, button2.name, "button2 is second"); + assert_equals(parent.childAtIndex(2).name, button3.name, "button3 is third"); + assert_true(parent.childAtIndex(0).isIgnored); + assert_false(parent.childAtIndex(1).isIgnored); + assert_false(parent.childAtIndex(2).isIgnored); +}, "This test makes sure that when aria-hidden changes, the AX hierarchy does not change."); </script> </body>
diff --git a/third_party/blink/web_tests/accessibility/aria-hidden-updates-alldescendants.html b/third_party/blink/web_tests/accessibility/aria-hidden-updates-alldescendants.html index 50fc3d5cf..7f2b3c9 100644 --- a/third_party/blink/web_tests/accessibility/aria-hidden-updates-alldescendants.html +++ b/third_party/blink/web_tests/accessibility/aria-hidden-updates-alldescendants.html
@@ -30,14 +30,22 @@ test((t) => { var main = axElementById("main"); - assert_equals(main.childrenCount, 1); + assert_equals(main.childrenCount, 4); + assert_false(main.childAtIndex(0).isIgnored); + assert_true(main.childAtIndex(1).isIgnored); + assert_true(main.childAtIndex(2).isIgnored); + assert_true(main.childAtIndex(3).isIgnored); var group = document.getElementsByTagName('main')[0]; var items = group.getElementsByTagName('div'); items[0].removeAttribute('aria-hidden'); - assert_equals(main.childrenCount, 2, - "After removing aria-hidden, the new count should be 2."); + assert_equals(main.childrenCount, 4, + "After removing aria-hidden, the count should still be 4."); + assert_false(main.childAtIndex(0).isIgnored); + assert_false(main.childAtIndex(1).isIgnored); + assert_true(main.childAtIndex(2).isIgnored); + assert_true(main.childAtIndex(3).isIgnored); // And most importantly... assert_equals(main.childAtIndex(1).childrenCount, 1,
diff --git a/third_party/blink/web_tests/accessibility/aria-hidden-with-elements-expected.txt b/third_party/blink/web_tests/accessibility/aria-hidden-with-elements-expected.txt index f8c28a8..f1d3109 100644 --- a/third_party/blink/web_tests/accessibility/aria-hidden-with-elements-expected.txt +++ b/third_party/blink/web_tests/accessibility/aria-hidden-with-elements-expected.txt
@@ -11,7 +11,14 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -PASS child.childrenCount is 0 +PASS child.childrenCount is 6 +PASS child.childAtIndex(0).isIgnored is true +PASS child.childAtIndex(1).isIgnored is true +PASS child.childAtIndex(2).isIgnored is true +PASS child.childAtIndex(3).isIgnored is true +PASS child.childAtIndex(4).isIgnored is true +PASS child.childAtIndex(5).isIgnored is true +PASS child.role is 'AXRole: AXGenericContainer' PASS child.role is 'AXRole: AXHeading' PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/accessibility/aria-hidden-with-elements.html b/third_party/blink/web_tests/accessibility/aria-hidden-with-elements.html index dbd0385..573b1f6 100644 --- a/third_party/blink/web_tests/accessibility/aria-hidden-with-elements.html +++ b/third_party/blink/web_tests/accessibility/aria-hidden-with-elements.html
@@ -42,18 +42,24 @@ description("This tests that aria-hidden works as expected on elements that are subclasses of AccessibilityRenderObject"); if (window.accessibilityController) { + var container = accessibilityController.accessibleElementById("container"); + // first child is an AXGroup that has 0 unignored children + var child = container.childAtIndex(0); + shouldBe("child.childrenCount", "6") + for(let i = 0; i < child.childrenCount; ++i) { + shouldBeTrue("child.childAtIndex(" + i +").isIgnored"); + } - - var container = accessibilityController.accessibleElementById("container"); - - // first child is an AXGroup that has no children - var child = container.childAtIndex(0); - shouldBe("child.childrenCount", "0"); - - // The second child we ask for from the web area should be the heading, and we should have skipped over everything else. - child = container.childAtIndex(1); - shouldBe("child.role", "'AXRole: AXHeading'"); + let i = 1; + for(; i < container.childrenCount; ++i) { + child = container.childAtIndex(i); + if (!child.isIgnored) + break; + } + shouldBe("child.role", "'AXRole: AXGenericContainer'"); + child = container.childAtIndex(++i); + shouldBe("child.role", "'AXRole: AXHeading'"); } </script>
diff --git a/third_party/blink/web_tests/accessibility/aria-hidden.html b/third_party/blink/web_tests/accessibility/aria-hidden.html index 157d480..35e5fd36 100644 --- a/third_party/blink/web_tests/accessibility/aria-hidden.html +++ b/third_party/blink/web_tests/accessibility/aria-hidden.html
@@ -14,9 +14,9 @@ test((t) => { var body = document.getElementById("body"); body.focus(); - var h2 = accessibilityController.focusedElement.childAtIndex(0); - assert_equals(h2.name, "h2"); -}, "This tests that the aria-hidden attribute works correctly with accessibility. The H1 element (and its children) should not appear in the AX hierarchy. The H2 element should be the first child"); + var h2 = accessibilityController.focusedElement.childAtIndex(0).childAtIndex(0); + assert_equals(h2.name, "h1 test"); +}, "This tests that the aria-hidden attribute works correctly with accessibility. The H1 element (and its children) should appear in the AX hierarchy. The H1 element should be the first child"); </script>
diff --git a/third_party/blink/web_tests/accessibility/aria-list-and-listitem-expected.txt b/third_party/blink/web_tests/accessibility/aria-list-and-listitem-expected.txt index 1c39c22..e810782 100644 --- a/third_party/blink/web_tests/accessibility/aria-list-and-listitem-expected.txt +++ b/third_party/blink/web_tests/accessibility/aria-list-and-listitem-expected.txt
@@ -2,9 +2,9 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -obj.childAtIndex(0).role = AXRole: AXList -obj.childAtIndex(0).childAtIndex(0).role = AXRole: AXListItem -obj.childAtIndex(0).childAtIndex(1).role = AXRole: AXListItem +obj.childAtIndex(0).childAtIndex(0).role = AXRole: AXList +obj.childAtIndex(0).childAtIndex(0).childAtIndex(0).role = AXRole: AXListItem +obj.childAtIndex(0).childAtIndex(0).childAtIndex(1).role = AXRole: AXListItem PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/accessibility/aria-list-and-listitem.html b/third_party/blink/web_tests/accessibility/aria-list-and-listitem.html index f0274ef6..1d766b2e 100644 --- a/third_party/blink/web_tests/accessibility/aria-list-and-listitem.html +++ b/third_party/blink/web_tests/accessibility/aria-list-and-listitem.html
@@ -23,9 +23,9 @@ document.getElementById("body").focus(); var obj = accessibilityController.focusedElement; - debug("obj.childAtIndex(0).role = " + obj.childAtIndex(0).role); debug("obj.childAtIndex(0).childAtIndex(0).role = " + obj.childAtIndex(0).childAtIndex(0).role); - debug("obj.childAtIndex(0).childAtIndex(1).role = " + obj.childAtIndex(0).childAtIndex(1).role); + debug("obj.childAtIndex(0).childAtIndex(0).childAtIndex(0).role = " + obj.childAtIndex(0).childAtIndex(0).childAtIndex(0).role); + debug("obj.childAtIndex(0).childAtIndex(0).childAtIndex(1).role = " + obj.childAtIndex(0).childAtIndex(0).childAtIndex(1).role); } </script>
diff --git a/third_party/blink/web_tests/accessibility/aria-none-role-expected.txt b/third_party/blink/web_tests/accessibility/aria-none-role-expected.txt index 68842a4..59f83276 100644 --- a/third_party/blink/web_tests/accessibility/aria-none-role-expected.txt +++ b/third_party/blink/web_tests/accessibility/aria-none-role-expected.txt
@@ -1,10 +1,10 @@ Link and text -This tests that the aria 'none' role works by successfully removing the element from the AX tree. +This tests that the aria 'none' role works by successfully ignoring the element in the AX tree. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -PASS firstChild.role is 'AXRole: AXLink' +PASS firstChild.isIgnored is true PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/accessibility/aria-none-role.html b/third_party/blink/web_tests/accessibility/aria-none-role.html index d5f86e3..be277bd 100644 --- a/third_party/blink/web_tests/accessibility/aria-none-role.html +++ b/third_party/blink/web_tests/accessibility/aria-none-role.html
@@ -14,7 +14,7 @@ <script> - description("This tests that the aria 'none' role works by successfully removing the element from the AX tree."); + description("This tests that the aria 'none' role works by successfully ignoring the element in the AX tree."); if (window.accessibilityController) { @@ -22,7 +22,7 @@ body.focus(); var firstChild = accessibilityController.focusedElement.childAtIndex(0); - shouldBe("firstChild.role", "'AXRole: AXLink'"); + shouldBeTrue("firstChild.isIgnored"); } </script>
diff --git a/third_party/blink/web_tests/accessibility/aria-option-role.html b/third_party/blink/web_tests/accessibility/aria-option-role.html index 9d35a251..7b1cdd2 100644 --- a/third_party/blink/web_tests/accessibility/aria-option-role.html +++ b/third_party/blink/web_tests/accessibility/aria-option-role.html
@@ -16,7 +16,9 @@ var body = document.getElementById("body"); body.focus(); - var listBox = accessibilityController.focusedElement.childAtIndex(0); + var listBox = accessibilityController.focusedElement.childAtIndex(0).childAtIndex(0); + assert_equals(listBox.role, "AXRole: AXListBox"); + var firstChild = listBox.childAtIndex(0); var secondChild = listBox.childAtIndex(1); assert_equals(firstChild.role, "AXRole: AXListBoxOption");
diff --git a/third_party/blink/web_tests/accessibility/aria-owns-dynamic-changes.html b/third_party/blink/web_tests/accessibility/aria-owns-dynamic-changes.html index aa9b6bc..73db0a8 100644 --- a/third_party/blink/web_tests/accessibility/aria-owns-dynamic-changes.html +++ b/third_party/blink/web_tests/accessibility/aria-owns-dynamic-changes.html
@@ -31,7 +31,8 @@ assert_equals(axFutureParent.childrenCount, 1, "after setting aria-oens"); child.style.visibility = 'hidden'; - assert_equals(axFutureParent.childrenCount, 0, "after setting hidden"); + assert_equals(axFutureParent.childrenCount, 1, "after setting hidden"); + assert_true(axFutureParent.childAtIndex(0).isIgnored); child.style.visibility = 'visible'; assert_equals(axFutureParent.childrenCount, 1, "after setting visible");
diff --git a/third_party/blink/web_tests/accessibility/aria-presentational-role-expected.txt b/third_party/blink/web_tests/accessibility/aria-presentational-role-expected.txt index 3bd56fd..5447d45 100644 --- a/third_party/blink/web_tests/accessibility/aria-presentational-role-expected.txt +++ b/third_party/blink/web_tests/accessibility/aria-presentational-role-expected.txt
@@ -4,7 +4,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -PASS firstChild.role is 'AXRole: AXLink' +PASS firstChild.isIgnored is true PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/accessibility/aria-presentational-role.html b/third_party/blink/web_tests/accessibility/aria-presentational-role.html index fa02d05..0a73d9b4 100644 --- a/third_party/blink/web_tests/accessibility/aria-presentational-role.html +++ b/third_party/blink/web_tests/accessibility/aria-presentational-role.html
@@ -22,7 +22,7 @@ body.focus(); var firstChild = accessibilityController.focusedElement.childAtIndex(0); - shouldBe("firstChild.role", "'AXRole: AXLink'"); + shouldBeTrue("firstChild.isIgnored"); } </script>
diff --git a/third_party/blink/web_tests/accessibility/aria-tab-roles.html b/third_party/blink/web_tests/accessibility/aria-tab-roles.html index 3a98f96..aae1cdd 100644 --- a/third_party/blink/web_tests/accessibility/aria-tab-roles.html +++ b/third_party/blink/web_tests/accessibility/aria-tab-roles.html
@@ -21,10 +21,10 @@ var body = document.getElementById("body"); body.focus(); - var tabList = accessibilityController.focusedElement.childAtIndex(0); + var tabList = accessibilityController.focusedElement.childAtIndex(0).childAtIndex(0); var tab1 = tabList.childAtIndex(0); var tab2 = tabList.childAtIndex(1); - var tabPanel = accessibilityController.focusedElement.childAtIndex(1); + var tabPanel = accessibilityController.focusedElement.childAtIndex(0).childAtIndex(1); assert_equals(tabList.role, "AXRole: AXTabList"); assert_equals(tab1.role, "AXRole: AXTab");
diff --git a/third_party/blink/web_tests/accessibility/aria-tables-expected.txt b/third_party/blink/web_tests/accessibility/aria-tables-expected.txt index 08d817b..dd0f33a 100644 --- a/third_party/blink/web_tests/accessibility/aria-tables-expected.txt +++ b/third_party/blink/web_tests/accessibility/aria-tables-expected.txt
@@ -11,39 +11,40 @@ End of test AXRole: AXWebArea - AXRole: AXGrid - AXRole: AXRow - AXRole: AXColumnHeader "col head" - AXRole: AXStaticText "col head" - AXRole: AXInlineTextBox "col head" - AXRole: AXColumnHeader "col head" - AXRole: AXStaticText "col head" - AXRole: AXInlineTextBox "col head" - AXRole: AXColumnHeader "col head" - AXRole: AXStaticText "col head" - AXRole: AXInlineTextBox "col head" - AXRole: AXRow - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXCell "data" - AXRole: AXStaticText "data" - AXRole: AXInlineTextBox "data" - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXRow - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXColumnHeader "col head" - AXRole: AXStaticText "col head" - AXRole: AXInlineTextBox "col head" - AXRole: AXParagraph - AXRole: AXStaticText "End of test" + AXRole: AXGenericContainer + AXRole: AXGrid + AXRole: AXRow + AXRole: AXColumnHeader "col head" + AXRole: AXStaticText "col head" + AXRole: AXInlineTextBox "col head" + AXRole: AXColumnHeader "col head" + AXRole: AXStaticText "col head" + AXRole: AXInlineTextBox "col head" + AXRole: AXColumnHeader "col head" + AXRole: AXStaticText "col head" + AXRole: AXInlineTextBox "col head" + AXRole: AXRow + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXCell "data" + AXRole: AXStaticText "data" + AXRole: AXInlineTextBox "data" + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXRow + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXColumnHeader "col head" + AXRole: AXStaticText "col head" + AXRole: AXInlineTextBox "col head" + AXRole: AXParagraph + AXRole: AXStaticText "End of test" PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/accessibility/description-calc-aria-describedby.html b/third_party/blink/web_tests/accessibility/description-calc-aria-describedby.html index abb9be6..f4bfed4 100644 --- a/third_party/blink/web_tests/accessibility/description-calc-aria-describedby.html +++ b/third_party/blink/web_tests/accessibility/description-calc-aria-describedby.html
@@ -117,7 +117,7 @@ <script> test(function(t){ - assert_equals(accessibilityController.accessibleElementById("description6"), undefined); + assert_true(accessibilityController.accessibleElementById("description6").isIgnored); var axDescribedby6 = accessibilityController.accessibleElementById("describedby6"); assert_equals(axDescribedby6.name, "Contents"); assert_equals(axDescribedby6.nameFrom, "contents");
diff --git a/third_party/blink/web_tests/accessibility/div-within-anchors-causes-crash-expected.txt b/third_party/blink/web_tests/accessibility/div-within-anchors-causes-crash-expected.txt index 44279c2..67de7884 100644 --- a/third_party/blink/web_tests/accessibility/div-within-anchors-causes-crash-expected.txt +++ b/third_party/blink/web_tests/accessibility/div-within-anchors-causes-crash-expected.txt
@@ -6,13 +6,20 @@ Before: AXRole: AXWebArea - AXRole: AXLink AXRole: AXGenericContainer - AXRole: AXStaticText "End of test" + AXRole: AXGenericContainer + AXRole: AXGenericContainer + AXRole: AXLink + AXRole: AXGenericContainer + AXRole: AXGenericContainer + AXRole: AXStaticText "End of test" After: AXRole: AXWebArea AXRole: AXGenericContainer - AXRole: AXStaticText "End of test" + AXRole: AXGenericContainer + AXRole: AXGenericContainer + AXRole: AXGenericContainer + AXRole: AXStaticText "End of test" PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/accessibility/element-role-mapping-normal-expected.txt b/third_party/blink/web_tests/accessibility/element-role-mapping-normal-expected.txt index 43c1f2a..3f24e2f 100644 --- a/third_party/blink/web_tests/accessibility/element-role-mapping-normal-expected.txt +++ b/third_party/blink/web_tests/accessibility/element-role-mapping-normal-expected.txt
@@ -50,149 +50,150 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". AXRole: AXWebArea - AXRole: AXBanner - AXRole: AXStaticText "This is a Header for this page" - AXRole: AXInlineTextBox "This is a Header for this page" - AXRole: AXHeading "Heading" - AXRole: AXStaticText "Heading" - AXRole: AXInlineTextBox "Heading" AXRole: AXGenericContainer - AXRole: AXStaticText "Division" - AXRole: AXInlineTextBox "Division" - AXRole: AXParagraph - AXRole: AXStaticText "Paragraph" - AXRole: AXInlineTextBox "Paragraph" - AXRole: AXRuby - AXRole: AXAnnotation - AXRole: AXStaticText "한êµ" - AXRole: AXInlineTextBox "한êµ" - AXRole: AXStaticText "韓國" - AXRole: AXInlineTextBox "韓國" - AXRole: AXDescriptionList - AXRole: AXDescriptionListTerm - AXRole: AXStaticText "Coffee" - AXRole: AXInlineTextBox "Coffee" - AXRole: AXDescriptionListDetail - AXRole: AXStaticText "- black hot drink" - AXRole: AXInlineTextBox "- black hot drink" - AXRole: AXDescriptionListTerm - AXRole: AXStaticText "Milk" - AXRole: AXInlineTextBox "Milk" - AXRole: AXDescriptionListDetail - AXRole: AXStaticText "- white cold drink" - AXRole: AXInlineTextBox "- white cold drink" - AXRole: AXMath - AXRole: AXStaticText "x " - AXRole: AXInlineTextBox "x " - AXRole: AXStaticText "+ " - AXRole: AXInlineTextBox "+ " - AXRole: AXStaticText "a " - AXRole: AXInlineTextBox "a " - AXRole: AXStaticText "/ " - AXRole: AXInlineTextBox "/ " - AXRole: AXStaticText "b" - AXRole: AXInlineTextBox "b" - AXRole: AXMain - AXRole: AXArticle + AXRole: AXBanner + AXRole: AXStaticText "This is a Header for this page" + AXRole: AXInlineTextBox "This is a Header for this page" + AXRole: AXHeading "Heading" + AXRole: AXStaticText "Heading" + AXRole: AXInlineTextBox "Heading" + AXRole: AXGenericContainer + AXRole: AXStaticText "Division" + AXRole: AXInlineTextBox "Division" + AXRole: AXParagraph + AXRole: AXStaticText "Paragraph" + AXRole: AXInlineTextBox "Paragraph" + AXRole: AXRuby + AXRole: AXAnnotation + AXRole: AXStaticText "한êµ" + AXRole: AXInlineTextBox "한êµ" + AXRole: AXStaticText "韓國" + AXRole: AXInlineTextBox "韓國" + AXRole: AXDescriptionList + AXRole: AXDescriptionListTerm + AXRole: AXStaticText "Coffee" + AXRole: AXInlineTextBox "Coffee" + AXRole: AXDescriptionListDetail + AXRole: AXStaticText "- black hot drink" + AXRole: AXInlineTextBox "- black hot drink" + AXRole: AXDescriptionListTerm + AXRole: AXStaticText "Milk" + AXRole: AXInlineTextBox "Milk" + AXRole: AXDescriptionListDetail + AXRole: AXStaticText "- white cold drink" + AXRole: AXInlineTextBox "- white cold drink" + AXRole: AXMath + AXRole: AXStaticText "x " + AXRole: AXInlineTextBox "x " + AXRole: AXStaticText "+ " + AXRole: AXInlineTextBox "+ " + AXRole: AXStaticText "a " + AXRole: AXInlineTextBox "a " + AXRole: AXStaticText "/ " + AXRole: AXInlineTextBox "/ " + AXRole: AXStaticText "b" + AXRole: AXInlineTextBox "b" + AXRole: AXMain + AXRole: AXArticle + AXRole: AXGenericContainer + AXRole: AXHeading "Most important heading here" + AXRole: AXStaticText "Most important heading here" + AXRole: AXInlineTextBox "Most important heading here" + AXRole: AXHeading "Google Chrome" + AXRole: AXStaticText "Google Chrome" + AXRole: AXInlineTextBox "Google Chrome" + AXRole: AXParagraph + AXRole: AXStaticText "Google Chrome is a free, open-source web browser developed by Google, released in 2008." + AXRole: AXInlineTextBox "Google Chrome is a free, open-source web browser developed by Google, " + AXRole: AXInlineTextBox "released in 2008." + AXRole: AXGenericContainer + AXRole: AXParagraph + AXRole: AXStaticText "Footer in article" + AXRole: AXInlineTextBox "Footer in article" + AXRole: AXNavigation + AXRole: AXLink "HTML" + AXRole: AXStaticText "HTML" + AXRole: AXInlineTextBox "HTML" + AXRole: AXStaticText " | " + AXRole: AXInlineTextBox " | " + AXRole: AXLink "CSS" + AXRole: AXStaticText "CSS" + AXRole: AXInlineTextBox "CSS" + AXRole: AXStaticText " | " + AXRole: AXInlineTextBox " | " + AXRole: AXLink "JavaScript" + AXRole: AXStaticText "JavaScript" + AXRole: AXInlineTextBox "JavaScript" + AXRole: AXStaticText " |" + AXRole: AXInlineTextBox " |" + AXRole: AXComplementary + AXRole: AXParagraph + AXRole: AXStaticText "Text that appears under aside" + AXRole: AXInlineTextBox "Text that appears under aside" + AXRole: AXPre + AXRole: AXStaticText "Text in a pre +element +" + AXRole: AXInlineTextBox "Text in a pre" + AXRole: AXInlineTextBox " +" + AXRole: AXInlineTextBox "element" + AXRole: AXInlineTextBox " +" + AXRole: AXRegion AXRole: AXGenericContainer AXRole: AXHeading "Most important heading here" AXRole: AXStaticText "Most important heading here" AXRole: AXInlineTextBox "Most important heading here" - AXRole: AXHeading "Google Chrome" - AXRole: AXStaticText "Google Chrome" - AXRole: AXInlineTextBox "Google Chrome" AXRole: AXParagraph - AXRole: AXStaticText "Google Chrome is a free, open-source web browser developed by Google, released in 2008." - AXRole: AXInlineTextBox "Google Chrome is a free, open-source web browser developed by Google, " - AXRole: AXInlineTextBox "released in 2008." + AXRole: AXStaticText "Section" + AXRole: AXInlineTextBox "Section" AXRole: AXGenericContainer AXRole: AXParagraph - AXRole: AXStaticText "Footer in article" - AXRole: AXInlineTextBox "Footer in article" - AXRole: AXNavigation - AXRole: AXLink "HTML" - AXRole: AXStaticText "HTML" - AXRole: AXInlineTextBox "HTML" - AXRole: AXStaticText " | " - AXRole: AXInlineTextBox " | " - AXRole: AXLink "CSS" - AXRole: AXStaticText "CSS" - AXRole: AXInlineTextBox "CSS" - AXRole: AXStaticText " | " - AXRole: AXInlineTextBox " | " - AXRole: AXLink "JavaScript" - AXRole: AXStaticText "JavaScript" - AXRole: AXInlineTextBox "JavaScript" - AXRole: AXStaticText " |" - AXRole: AXInlineTextBox " |" - AXRole: AXComplementary - AXRole: AXParagraph - AXRole: AXStaticText "Text that appears under aside" - AXRole: AXInlineTextBox "Text that appears under aside" - AXRole: AXPre - AXRole: AXStaticText "Text in a pre -element -" - AXRole: AXInlineTextBox "Text in a pre" - AXRole: AXInlineTextBox " -" - AXRole: AXInlineTextBox "element" - AXRole: AXInlineTextBox " -" - AXRole: AXRegion + AXRole: AXStaticText "Footer in section" + AXRole: AXInlineTextBox "Footer in section" AXRole: AXGenericContainer - AXRole: AXHeading "Most important heading here" - AXRole: AXStaticText "Most important heading here" - AXRole: AXInlineTextBox "Most important heading here" + AXRole: AXStaticText "Written by Julie" + AXRole: AXInlineTextBox "Written by Julie" + AXRole: AXLineBreak " +" + AXRole: AXInlineTextBox " +" + AXRole: AXStaticText "Visit us at:www.chromium.org" + AXRole: AXInlineTextBox "Visit us at:www.chromium.org" + AXRole: AXLineBreak " +" + AXRole: AXInlineTextBox " +" AXRole: AXParagraph - AXRole: AXStaticText "Section" - AXRole: AXInlineTextBox "Section" - AXRole: AXGenericContainer + AXRole: AXStaticText "January" + AXRole: AXInlineTextBox "January" + AXRole: AXDialog + AXRole: AXStaticText "This is an open dialog window" + AXRole: AXInlineTextBox "This is an open dialog window" + AXRole: AXTable "Caption" + AXRole: AXCaption + AXRole: AXStaticText "Caption" + AXRole: AXInlineTextBox "Caption" + AXRole: AXRow + AXRole: AXCell "Cell1" + AXRole: AXStaticText "Cell1" + AXRole: AXInlineTextBox "Cell1" + AXRole: AXCell "Cell2" + AXRole: AXStaticText "Cell2" + AXRole: AXInlineTextBox "Cell2" + AXRole: AXFigure "Fig1. - Blue Box" + AXRole: AXImage "blue" + AXRole: AXFigcaption + AXRole: AXStaticText "Fig1. - Blue Box" + AXRole: AXInlineTextBox "Fig1. - Blue Box" + AXRole: AXEmbeddedObject + AXRole: AXFooter AXRole: AXParagraph - AXRole: AXStaticText "Footer in section" - AXRole: AXInlineTextBox "Footer in section" - AXRole: AXGenericContainer - AXRole: AXStaticText "Written by Julie" - AXRole: AXInlineTextBox "Written by Julie" - AXRole: AXLineBreak " -" - AXRole: AXInlineTextBox " -" - AXRole: AXStaticText "Visit us at:www.chromium.org" - AXRole: AXInlineTextBox "Visit us at:www.chromium.org" - AXRole: AXLineBreak " -" - AXRole: AXInlineTextBox " -" - AXRole: AXParagraph - AXRole: AXStaticText "January" - AXRole: AXInlineTextBox "January" - AXRole: AXDialog - AXRole: AXStaticText "This is an open dialog window" - AXRole: AXInlineTextBox "This is an open dialog window" - AXRole: AXTable "Caption" - AXRole: AXCaption - AXRole: AXStaticText "Caption" - AXRole: AXInlineTextBox "Caption" - AXRole: AXRow - AXRole: AXCell "Cell1" - AXRole: AXStaticText "Cell1" - AXRole: AXInlineTextBox "Cell1" - AXRole: AXCell "Cell2" - AXRole: AXStaticText "Cell2" - AXRole: AXInlineTextBox "Cell2" - AXRole: AXFigure "Fig1. - Blue Box" - AXRole: AXImage "blue" - AXRole: AXFigcaption - AXRole: AXStaticText "Fig1. - Blue Box" - AXRole: AXInlineTextBox "Fig1. - Blue Box" - AXRole: AXEmbeddedObject - AXRole: AXFooter + AXRole: AXStaticText "This is a footer." + AXRole: AXInlineTextBox "This is a footer." AXRole: AXParagraph - AXRole: AXStaticText "This is a footer." - AXRole: AXInlineTextBox "This is a footer." - AXRole: AXParagraph - AXRole: AXStaticText "End of test" + AXRole: AXStaticText "End of test" PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/accessibility/first-letter-text-transform-causes-crash-expected.txt b/third_party/blink/web_tests/accessibility/first-letter-text-transform-causes-crash-expected.txt index 7ed39de..0574dc6 100644 --- a/third_party/blink/web_tests/accessibility/first-letter-text-transform-causes-crash-expected.txt +++ b/third_party/blink/web_tests/accessibility/first-letter-text-transform-causes-crash-expected.txt
@@ -7,11 +7,12 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". AXRole: AXWebArea - AXRole: AXDescriptionListTerm - AXRole: AXStaticText "Dt" - AXRole: AXInlineTextBox "Dt" - AXRole: AXParagraph - AXRole: AXStaticText "End of test" + AXRole: AXGenericContainer + AXRole: AXDescriptionListTerm + AXRole: AXStaticText "Dt" + AXRole: AXInlineTextBox "Dt" + AXRole: AXParagraph + AXRole: AXStaticText "End of test" PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/accessibility/image-map1-expected.txt b/third_party/blink/web_tests/accessibility/image-map1-expected.txt index b41347d5..d7afe984 100644 --- a/third_party/blink/web_tests/accessibility/image-map1-expected.txt +++ b/third_party/blink/web_tests/accessibility/image-map1-expected.txt
@@ -2,12 +2,12 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -PASS body.childAtIndex(0).role is 'AXRole: AXLink' -PASS body.childAtIndex(0).name is 'Link1' -PASS body.childAtIndex(1).role is 'AXRole: AXLink' -PASS body.childAtIndex(1).name is 'Link2' -PASS body.childAtIndex(2).role is 'AXRole: AXLink' -PASS body.childAtIndex(2).name is 'Link3' +PASS container.childAtIndex(0).role is 'AXRole: AXLink' +PASS container.childAtIndex(0).name is 'Link1' +PASS container.childAtIndex(1).role is 'AXRole: AXLink' +PASS container.childAtIndex(1).name is 'Link2' +PASS container.childAtIndex(2).role is 'AXRole: AXLink' +PASS container.childAtIndex(2).name is 'Link3' PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/accessibility/image-map1.html b/third_party/blink/web_tests/accessibility/image-map1.html index b19498b5a..3e4e4ab1 100644 --- a/third_party/blink/web_tests/accessibility/image-map1.html +++ b/third_party/blink/web_tests/accessibility/image-map1.html
@@ -27,15 +27,15 @@ if (window.accessibilityController) { document.getElementById("body").focus(); - var body = accessibilityController.focusedElement; - shouldBe("body.childAtIndex(0).role", "'AXRole: AXLink'"); - shouldBe("body.childAtIndex(0).name", "'Link1'"); + var container = accessibilityController.focusedElement.childAtIndex(0); + shouldBe("container.childAtIndex(0).role", "'AXRole: AXLink'"); + shouldBe("container.childAtIndex(0).name", "'Link1'"); - shouldBe("body.childAtIndex(1).role", "'AXRole: AXLink'"); - shouldBe("body.childAtIndex(1).name", "'Link2'"); + shouldBe("container.childAtIndex(1).role", "'AXRole: AXLink'"); + shouldBe("container.childAtIndex(1).name", "'Link2'"); - shouldBe("body.childAtIndex(2).role", "'AXRole: AXLink'"); - shouldBe("body.childAtIndex(2).name", "'Link3'"); + shouldBe("container.childAtIndex(2).role", "'AXRole: AXLink'"); + shouldBe("container.childAtIndex(2).name", "'Link3'"); } </script>
diff --git a/third_party/blink/web_tests/accessibility/image-map2.html b/third_party/blink/web_tests/accessibility/image-map2.html index dff9001..1a29b48 100644 --- a/third_party/blink/web_tests/accessibility/image-map2.html +++ b/third_party/blink/web_tests/accessibility/image-map2.html
@@ -24,7 +24,7 @@ body.focus(); result.innerText += "Image map - test 2 - 2 Links (alt tags)\n"; result.innerText += "----------------------\n"; - result.innerText += accessibilityController.focusedElement.attributesOfChildren() + "\n\n"; + result.innerText += accessibilityController.focusedElement.childAtIndex(0).attributesOfChildren() + "\n\n"; } </script> </body>
diff --git a/third_party/blink/web_tests/accessibility/is-ignored-change-sends-notification.html b/third_party/blink/web_tests/accessibility/is-ignored-change-sends-notification.html index d9c6c71..abeb687e 100644 --- a/third_party/blink/web_tests/accessibility/is-ignored-change-sends-notification.html +++ b/third_party/blink/web_tests/accessibility/is-ignored-change-sends-notification.html
@@ -76,7 +76,7 @@ document.getElementById('hiddenDiv').hidden = false; assert_true(accessibleElementById('invisibleDivContainer') != null); - assert_false(accessibleElementById('invisibleDiv') != null); + assert_true(accessibleElementById('invisibleDiv').isIgnored); accessibleElementById('invisibleDivContainer').addNotificationListener(t.step_func((notification) => { console.log('Got ' + notification + ' notification on invisibleDivContainer');
diff --git a/third_party/blink/web_tests/accessibility/legend-expected.txt b/third_party/blink/web_tests/accessibility/legend-expected.txt index 403ca87..bc026954 100644 --- a/third_party/blink/web_tests/accessibility/legend-expected.txt +++ b/third_party/blink/web_tests/accessibility/legend-expected.txt
@@ -7,16 +7,17 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". AXRole: AXWebArea - AXRole: AXGroup "Choose a shipping method:" - AXRole: AXLegend << fieldset's titleUIElement - AXRole: AXStaticText "Choose a shipping method:" - AXRole: AXInlineTextBox "Choose a shipping method:" - AXRole: AXGroup - AXRole: AXRadioButton - AXRole: AXStaticText "Overnight" - AXRole: AXInlineTextBox "Overnight" AXRole: AXGenericContainer - AXRole: AXStaticText "End of test" + AXRole: AXGroup "Choose a shipping method:" + AXRole: AXLegend << fieldset's titleUIElement + AXRole: AXStaticText "Choose a shipping method:" + AXRole: AXInlineTextBox "Choose a shipping method:" + AXRole: AXGroup + AXRole: AXRadioButton + AXRole: AXStaticText "Overnight" + AXRole: AXInlineTextBox "Overnight" + AXRole: AXGenericContainer + AXRole: AXStaticText "End of test" PASS titleUIElement != null is true PASS titleUIElementText.name is 'Choose a shipping method:'
diff --git a/third_party/blink/web_tests/accessibility/listitem-presentation-inherited-expected.txt b/third_party/blink/web_tests/accessibility/listitem-presentation-inherited-expected.txt index 5b4af7f1..e767491f 100644 --- a/third_party/blink/web_tests/accessibility/listitem-presentation-inherited-expected.txt +++ b/third_party/blink/web_tests/accessibility/listitem-presentation-inherited-expected.txt
@@ -12,26 +12,32 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". AXRole: AXWebArea - AXRole: AXListItem - AXRole: AXListMarker "• " - AXRole: AXStaticText "Item 1" - AXRole: AXInlineTextBox "Item 1" - AXRole: AXListItem - AXRole: AXListMarker "• " - AXRole: AXStaticText "Item 2" - AXRole: AXInlineTextBox "Item 2" - AXRole: AXListItem - AXRole: AXListMarker "• " - AXRole: AXStaticText "Item 3" - AXRole: AXInlineTextBox "Item 3" - AXRole: AXStaticText "Plain Text 1" - AXRole: AXInlineTextBox "Plain Text 1" - AXRole: AXStaticText "Plain Text 2" - AXRole: AXInlineTextBox "Plain Text 2" - AXRole: AXStaticText "Plain Text 3" - AXRole: AXInlineTextBox "Plain Text 3" - AXRole: AXParagraph - AXRole: AXStaticText "End of test" + AXRole: AXGenericContainer + AXRole: AXPresentational + AXRole: AXListItem + AXRole: AXListMarker "• " + AXRole: AXStaticText "Item 1" + AXRole: AXInlineTextBox "Item 1" + AXRole: AXListItem + AXRole: AXListMarker "• " + AXRole: AXStaticText "Item 2" + AXRole: AXInlineTextBox "Item 2" + AXRole: AXListItem + AXRole: AXListMarker "• " + AXRole: AXStaticText "Item 3" + AXRole: AXInlineTextBox "Item 3" + AXRole: AXPresentational + AXRole: AXListItem + AXRole: AXStaticText "Plain Text 1" + AXRole: AXInlineTextBox "Plain Text 1" + AXRole: AXListItem + AXRole: AXStaticText "Plain Text 2" + AXRole: AXInlineTextBox "Plain Text 2" + AXRole: AXListItem + AXRole: AXStaticText "Plain Text 3" + AXRole: AXInlineTextBox "Plain Text 3" + AXRole: AXParagraph + AXRole: AXStaticText "End of test" PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/accessibility/name-calc-aria-hidden.html b/third_party/blink/web_tests/accessibility/name-calc-aria-hidden.html index 02be35c..ee893dc 100644 --- a/third_party/blink/web_tests/accessibility/name-calc-aria-hidden.html +++ b/third_party/blink/web_tests/accessibility/name-calc-aria-hidden.html
@@ -50,7 +50,7 @@ <script> test(function(t) { var axHeading3 = accessibilityController.accessibleElementById("heading3"); - assert_equals(axHeading3, undefined); + assert_true(axHeading3.isIgnored); var axButton3 = accessibilityController.accessibleElementById("button3"); assert_equals(axButton3.name, "Text within hidden subtree"); }, "Aria-labelledby can get accessible text from within aria-hidden subtree");
diff --git a/third_party/blink/web_tests/accessibility/name-calc-aria-labelledby.html b/third_party/blink/web_tests/accessibility/name-calc-aria-labelledby.html index 21715c4..d3de7a9a 100644 --- a/third_party/blink/web_tests/accessibility/name-calc-aria-labelledby.html +++ b/third_party/blink/web_tests/accessibility/name-calc-aria-labelledby.html
@@ -121,7 +121,7 @@ <script> test(function(t){ - assert_equals(accessibilityController.accessibleElementById("label7"), undefined); + assert_true(accessibilityController.accessibleElementById("label7").isIgnored); var axLabelledby7 = accessibilityController.accessibleElementById("labelledby7"); assert_equals(axLabelledby7.name, "Invisible label"); assert_equals(axLabelledby7.nameFrom, "relatedElement");
diff --git a/third_party/blink/web_tests/accessibility/nochildren-elements.html b/third_party/blink/web_tests/accessibility/nochildren-elements.html index 117af13..b8c30e3 100644 --- a/third_party/blink/web_tests/accessibility/nochildren-elements.html +++ b/third_party/blink/web_tests/accessibility/nochildren-elements.html
@@ -20,6 +20,14 @@ <script> + function allChildrenAreIgnored(element) { + for(let i = 0; i < element.childCount; ++i) { + if (!element.childAtIndex(i).isIgnored) + return false; + } + return true; + } + if (window.accessibilityController) { var result = document.getElementById("result"); @@ -35,19 +43,19 @@ var element4Children = element4.attributesOfChildren(); var element5Children = element5.attributesOfChildren(); - result.innerText += element1Children != "" ? "FAIL#1 " + element1Children : "PASS"; + result.innerText += allChildrenAreIgnored(element1) ? "PASS" : "FAIL#1 " + element1Children; result.innerText += "\n"; - result.innerText += element2Children != "" ? "FAIL#2 " + element2Children : "PASS"; + result.innerText += allChildrenAreIgnored(element2) ? "PASS" : "FAIL#2 " + element2Children; result.innerText += "\n"; - result.innerText += element3Children != "" ? "FAIL#3 " + element3Children : "PASS"; + result.innerText += allChildrenAreIgnored(element3) ? "PASS" : "FAIL#3 " + element3Children; result.innerText += "\n"; - result.innerText += element4Children == "" ? "FAIL#4 " : "PASS"; + result.innerText += allChildrenAreIgnored(element4) ? "PASS" : "FAIL#4 " + element4Children; result.innerText += "\n"; - result.innerText += element5Children == "" ? "FAIL#5 " : "PASS"; + result.innerText += allChildrenAreIgnored(element5) ? "PASS" : "FAIL#5 " + element5Children; result.innerText += "\n"; } </script>
diff --git a/third_party/blink/web_tests/accessibility/onclick-handlers.html b/third_party/blink/web_tests/accessibility/onclick-handlers.html index 7c12ae4..3d802c7b 100644 --- a/third_party/blink/web_tests/accessibility/onclick-handlers.html +++ b/third_party/blink/web_tests/accessibility/onclick-handlers.html
@@ -17,7 +17,7 @@ var body = document.getElementById("body"); body.focus(); var focusedElement = accessibilityController.focusedElement; - var textElement = focusedElement.childAtIndex(1).childAtIndex(0); + var textElement = focusedElement.childAtIndex(0).childAtIndex(1).childAtIndex(0); if (textElement.isPressActionSupported()) { result.innerText += "Test passed\n";
diff --git a/third_party/blink/web_tests/accessibility/presentation-owned-elements-expected.txt b/third_party/blink/web_tests/accessibility/presentation-owned-elements-expected.txt index a09e421..c2af6141 100644 --- a/third_party/blink/web_tests/accessibility/presentation-owned-elements-expected.txt +++ b/third_party/blink/web_tests/accessibility/presentation-owned-elements-expected.txt
@@ -30,83 +30,98 @@ AXRole: AXWebArea AXRole: AXGenericContainer - AXRole: AXStaticText "These lists have a static text role because they have a presentation role." - AXRole: AXInlineTextBox "These lists have a static text role because they have a presentation role." - AXRole: AXStaticText "Presentation Item 1" - AXRole: AXInlineTextBox "Presentation Item 1" - AXRole: AXStaticText "Presentation Item 2" - AXRole: AXInlineTextBox "Presentation Item 2" - AXRole: AXGenericContainer - AXRole: AXStaticText "The first list item has a listitem role even if ul has a presentation role because it has an explicit role." - AXRole: AXInlineTextBox "The first list item has a listitem role even if ul has a presentation role because it has an explicit role." - AXRole: AXListItem - AXRole: AXListMarker "• " - AXRole: AXStaticText "Explicit Item 1" - AXRole: AXInlineTextBox "Explicit Item 1" - AXRole: AXStaticText "Implicit Item 2" - AXRole: AXInlineTextBox "Implicit Item 2" - AXRole: AXGenericContainer - AXRole: AXStaticText "These two tables have static text roles because they have presentation roles." - AXRole: AXInlineTextBox "These two tables have static text roles because they have presentation roles." - AXRole: AXGenericContainer - AXRole: AXStaticText "Presentation th" - AXRole: AXInlineTextBox "Presentation th" - AXRole: AXGenericContainer - AXRole: AXStaticText "Presentation th" - AXRole: AXInlineTextBox "Presentation th" - AXRole: AXGenericContainer - AXRole: AXStaticText "Presentation th" - AXRole: AXInlineTextBox "Presentation th" - AXRole: AXGenericContainer - AXRole: AXStaticText "The "Presentation th" has a static text role because it has a presentation role." - AXRole: AXInlineTextBox "The "Presentation th" has a static text role because it has a presentation role." - AXRole: AXTable - AXRole: AXStaticText "Presentation th" - AXRole: AXInlineTextBox "Presentation th" - AXRole: AXRow - AXRole: AXCell "Normal td" - AXRole: AXStaticText "Normal td" - AXRole: AXInlineTextBox "Normal td" - AXRole: AXGenericContainer - AXRole: AXStaticText "The row for "Explicit th" has a row role even if table has a presentation role because it has an explicit role." - AXRole: AXInlineTextBox "The row for "Explicit th" has a row role even if table has a presentation role because it has an explicit role." - AXRole: AXRow AXRole: AXGenericContainer - AXRole: AXStaticText "Explicit th" - AXRole: AXInlineTextBox "Explicit th" - AXRole: AXGenericContainer - AXRole: AXStaticText "Implicit td" - AXRole: AXInlineTextBox "Implicit td" - AXRole: AXGenericContainer - AXRole: AXStaticText "The menu items except button have a static text role because it has a presentation role and is disabled." - AXRole: AXInlineTextBox "The menu items except button have a static text role because it has a presentation role and is disabled." - AXRole: AXLineBreak " + AXRole: AXStaticText "These lists have a static text role because they have a presentation role." + AXRole: AXInlineTextBox "These lists have a static text role because they have a presentation role." + AXRole: AXPresentational + AXRole: AXListItem + AXRole: AXStaticText "Presentation Item 1" + AXRole: AXInlineTextBox "Presentation Item 1" + AXRole: AXListItem + AXRole: AXStaticText "Presentation Item 2" + AXRole: AXInlineTextBox "Presentation Item 2" + AXRole: AXGenericContainer + AXRole: AXStaticText "The first list item has a listitem role even if ul has a presentation role because it has an explicit role." + AXRole: AXInlineTextBox "The first list item has a listitem role even if ul has a presentation role because it has an explicit role." + AXRole: AXPresentational + AXRole: AXListItem + AXRole: AXListMarker "• " + AXRole: AXStaticText "Explicit Item 1" + AXRole: AXInlineTextBox "Explicit Item 1" + AXRole: AXListItem + AXRole: AXStaticText "Implicit Item 2" + AXRole: AXInlineTextBox "Implicit Item 2" + AXRole: AXGenericContainer + AXRole: AXStaticText "These two tables have static text roles because they have presentation roles." + AXRole: AXInlineTextBox "These two tables have static text roles because they have presentation roles." + AXRole: AXPresentational + AXRole: AXGenericContainer + AXRole: AXStaticText "Presentation th" + AXRole: AXInlineTextBox "Presentation th" + AXRole: AXGenericContainer + AXRole: AXStaticText "Presentation th" + AXRole: AXInlineTextBox "Presentation th" + AXRole: AXPresentational + AXRole: AXGenericContainer + AXRole: AXStaticText "Presentation th" + AXRole: AXInlineTextBox "Presentation th" + AXRole: AXGenericContainer + AXRole: AXStaticText "The "Presentation th" has a static text role because it has a presentation role." + AXRole: AXInlineTextBox "The "Presentation th" has a static text role because it has a presentation role." + AXRole: AXTable + AXRole: AXGenericContainer + AXRole: AXStaticText "Presentation th" + AXRole: AXInlineTextBox "Presentation th" + AXRole: AXRow + AXRole: AXCell "Normal td" + AXRole: AXStaticText "Normal td" + AXRole: AXInlineTextBox "Normal td" + AXRole: AXGenericContainer + AXRole: AXStaticText "The row for "Explicit th" has a row role even if table has a presentation role because it has an explicit role." + AXRole: AXInlineTextBox "The row for "Explicit th" has a row role even if table has a presentation role because it has an explicit role." + AXRole: AXPresentational + AXRole: AXRow + AXRole: AXGenericContainer + AXRole: AXStaticText "Explicit th" + AXRole: AXInlineTextBox "Explicit th" + AXRole: AXGenericContainer + AXRole: AXStaticText "Implicit td" + AXRole: AXInlineTextBox "Implicit td" + AXRole: AXGenericContainer + AXRole: AXStaticText "The menu items except button have a static text role because it has a presentation role and is disabled." + AXRole: AXInlineTextBox "The menu items except button have a static text role because it has a presentation role and is disabled." + AXRole: AXLineBreak " " - AXRole: AXInlineTextBox " + AXRole: AXInlineTextBox " " - AXRole: AXStaticText "Button has a button role because it has an explicit role." - AXRole: AXInlineTextBox "Button has a button role because it has an explicit role." - AXRole: AXStaticText " I have a bike " - AXRole: AXInlineTextBox " I have a bike " - AXRole: AXButton "Click me" - AXRole: AXStaticText " Male " - AXRole: AXInlineTextBox " Male " - AXRole: AXStaticText " Female" - AXRole: AXInlineTextBox " Female" - AXRole: AXGenericContainer - AXRole: AXStaticText "The option A has a static text role because it has a presentation role and is disabled." - AXRole: AXInlineTextBox "The option A has a static text role because it has a presentation role and is disabled." - AXRole: AXLineBreak " + AXRole: AXStaticText "Button has a button role because it has an explicit role." + AXRole: AXInlineTextBox "Button has a button role because it has an explicit role." + AXRole: AXPresentational + AXRole: AXMenuItemCheckBox + AXRole: AXStaticText " I have a bike " + AXRole: AXInlineTextBox " I have a bike " + AXRole: AXButton "Click me" + AXRole: AXMenuItemRadio + AXRole: AXStaticText " Male " + AXRole: AXInlineTextBox " Male " + AXRole: AXMenuItemRadio + AXRole: AXStaticText " Female" + AXRole: AXInlineTextBox " Female" + AXRole: AXGenericContainer + AXRole: AXStaticText "The option A has a static text role because it has a presentation role and is disabled." + AXRole: AXInlineTextBox "The option A has a static text role because it has a presentation role and is disabled." + AXRole: AXLineBreak " " - AXRole: AXInlineTextBox " + AXRole: AXInlineTextBox " " - AXRole: AXStaticText "The option B has option role because it has an explicit role." - AXRole: AXInlineTextBox "The option B has option role because it has an explicit role." - AXRole: AXGroup - AXRole: AXStaticText "A" - AXRole: AXListBoxOption "B" - AXRole: AXParagraph - AXRole: AXStaticText "End of test" + AXRole: AXStaticText "The option B has option role because it has an explicit role." + AXRole: AXInlineTextBox "The option B has option role because it has an explicit role." + AXRole: AXGroup + AXRole: AXPresentational + AXRole: AXStaticText "A" + AXRole: AXListBoxOption "B" + AXRole: AXParagraph + AXRole: AXStaticText "End of test" PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/accessibility/role-attribute-expected.txt b/third_party/blink/web_tests/accessibility/role-attribute-expected.txt index e8f6a23..645af0a20 100644 --- a/third_party/blink/web_tests/accessibility/role-attribute-expected.txt +++ b/third_party/blink/web_tests/accessibility/role-attribute-expected.txt
@@ -24,46 +24,47 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". AXRole: AXWebArea - AXRole: AXRadioGroup - AXRole: AXRadioButton "Explicit Item 1" - AXRole: AXRadioButton "Explicit Item 2" - AXRole: AXRadioButton "Explicit Item 3" - AXRole: AXList - AXRole: AXListItem - AXRole: AXListMarker "1. " - AXRole: AXStaticText "Implicit Item 1" - AXRole: AXInlineTextBox "Implicit Item 1" - AXRole: AXListItem - AXRole: AXListMarker "2. " - AXRole: AXStaticText "Implicit Item 2" - AXRole: AXInlineTextBox "Implicit Item 2" - AXRole: AXListItem - AXRole: AXListMarker "3. " - AXRole: AXStaticText "Implicit Item 3" - AXRole: AXInlineTextBox "Implicit Item 3" - AXRole: AXGroup + AXRole: AXGenericContainer + AXRole: AXRadioGroup + AXRole: AXRadioButton "Explicit Item 1" + AXRole: AXRadioButton "Explicit Item 2" + AXRole: AXRadioButton "Explicit Item 3" + AXRole: AXList + AXRole: AXListItem + AXRole: AXListMarker "1. " + AXRole: AXStaticText "Implicit Item 1" + AXRole: AXInlineTextBox "Implicit Item 1" + AXRole: AXListItem + AXRole: AXListMarker "2. " + AXRole: AXStaticText "Implicit Item 2" + AXRole: AXInlineTextBox "Implicit Item 2" + AXRole: AXListItem + AXRole: AXListMarker "3. " + AXRole: AXStaticText "Implicit Item 3" + AXRole: AXInlineTextBox "Implicit Item 3" AXRole: AXGroup - AXRole: AXTextField "Explicit Option 1" - AXRole: AXTextField "Explicit Option 2" - AXRole: AXListBox - AXRole: AXListBoxOption "Implicit Option 1" - AXRole: AXListBoxOption "Implicit Option 2" - AXRole: AXGroup - AXRole: AXMenuListPopup - AXRole: AXTextField "Explicit dropdown 1" - AXRole: AXTextField "Explicit dropdown 2" - AXRole: AXPopUpButton - AXRole: AXMenuListPopup - AXRole: AXMenuListOption "Implicit dropdown 1" - AXRole: AXMenuListOption "Implicit dropdown 2" - AXRole: AXStatus - AXRole: AXProgressIndicator - AXRole: AXStatus - AXRole: AXSliderThumb - AXRole: AXSlider - AXRole: AXSliderThumb - AXRole: AXParagraph - AXRole: AXStaticText "End of test" + AXRole: AXGroup + AXRole: AXTextField "Explicit Option 1" + AXRole: AXTextField "Explicit Option 2" + AXRole: AXListBox + AXRole: AXListBoxOption "Implicit Option 1" + AXRole: AXListBoxOption "Implicit Option 2" + AXRole: AXGroup + AXRole: AXMenuListPopup + AXRole: AXTextField "Explicit dropdown 1" + AXRole: AXTextField "Explicit dropdown 2" + AXRole: AXPopUpButton + AXRole: AXMenuListPopup + AXRole: AXMenuListOption "Implicit dropdown 1" + AXRole: AXMenuListOption "Implicit dropdown 2" + AXRole: AXStatus + AXRole: AXProgressIndicator + AXRole: AXStatus + AXRole: AXSliderThumb + AXRole: AXSlider + AXRole: AXSliderThumb + AXRole: AXParagraph + AXRole: AXStaticText "End of test" PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/accessibility/role-change.html b/third_party/blink/web_tests/accessibility/role-change.html index ab29560..627438dc 100644 --- a/third_party/blink/web_tests/accessibility/role-change.html +++ b/third_party/blink/web_tests/accessibility/role-change.html
@@ -33,7 +33,7 @@ test(function(t) { const axPresentation = axElementById('row1'); - assert_equals(axPresentation, undefined); + assert_true(axPresentation.isIgnored); // Change role attribute document.getElementById('row1').setAttribute('role', 'row');
diff --git a/third_party/blink/web_tests/accessibility/table-cell-for-column-and-row-crash.html b/third_party/blink/web_tests/accessibility/table-cell-for-column-and-row-crash.html index fe886be..efbcb6fe 100644 --- a/third_party/blink/web_tests/accessibility/table-cell-for-column-and-row-crash.html +++ b/third_party/blink/web_tests/accessibility/table-cell-for-column-and-row-crash.html
@@ -22,7 +22,7 @@ document.getElementById("body").focus(); var axBody = accessibilityController.focusedElement; - var axTable = axBody.childAtIndex(0); + var axTable = axBody.childAtIndex(0).childAtIndex(0); shouldBe("axTable.role", "'AXRole: AXTable'"); // Trying to reference the same cell for the table
diff --git a/third_party/blink/web_tests/accessibility/table-cell-spans.html b/third_party/blink/web_tests/accessibility/table-cell-spans.html index 5ab96075..8192620 100644 --- a/third_party/blink/web_tests/accessibility/table-cell-spans.html +++ b/third_party/blink/web_tests/accessibility/table-cell-spans.html
@@ -41,7 +41,7 @@ var body = document.getElementById("body"); body.focus(); - var table = accessibilityController.focusedElement.childAtIndex(0); + var table = accessibilityController.focusedElement.childAtIndex(0).childAtIndex(0); var cell = table.cellForColumnAndRow(0,0); result.innerText += "----------------------\n";
diff --git a/third_party/blink/web_tests/accessibility/table-cells.html b/third_party/blink/web_tests/accessibility/table-cells.html index a31b20b3..b2aba83 100644 --- a/third_party/blink/web_tests/accessibility/table-cells.html +++ b/third_party/blink/web_tests/accessibility/table-cells.html
@@ -56,7 +56,7 @@ var body = document.getElementById("body"); body.focus(); - var table = accessibilityController.focusedElement.childAtIndex(0); + var table = accessibilityController.focusedElement.childAtIndex(0).childAtIndex(0); result.innerText += "------------------------\n"; result.innerText += "[0,0]\n" + table.cellForColumnAndRow(0,0).allAttributes() + "\n";
diff --git a/third_party/blink/web_tests/accessibility/table-header-column-row-expected.txt b/third_party/blink/web_tests/accessibility/table-header-column-row-expected.txt index 093399882..0aa24184 100644 --- a/third_party/blink/web_tests/accessibility/table-header-column-row-expected.txt +++ b/third_party/blink/web_tests/accessibility/table-header-column-row-expected.txt
@@ -25,151 +25,152 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". AXRole: AXWebArea - AXRole: AXTable "scope test" - AXRole: AXCaption - AXRole: AXStaticText "scope test" - AXRole: AXInlineTextBox "scope test" - AXRole: AXRow - AXRole: AXColumnHeader "col head" - AXRole: AXStaticText "col head" - AXRole: AXInlineTextBox "col head" - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXColumnHeader "col head" - AXRole: AXStaticText "col head" - AXRole: AXInlineTextBox "col head" - AXRole: AXRow - AXRole: AXColumnHeader "col head" - AXRole: AXStaticText "col head" - AXRole: AXInlineTextBox "col head" - AXRole: AXCell "data" - AXRole: AXStaticText "data" - AXRole: AXInlineTextBox "data" - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXRow - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXCell "data" - AXRole: AXStaticText "data" - AXRole: AXInlineTextBox "data" - AXRole: AXColumnHeader "col head" - AXRole: AXStaticText "col head" - AXRole: AXInlineTextBox "col head" - AXRole: AXTable "row header and column header (1)" - AXRole: AXCaption - AXRole: AXStaticText "row header and column header (1)" - AXRole: AXInlineTextBox "row header and column header (1)" - AXRole: AXRow - AXRole: AXCell "data" - AXRole: AXStaticText "data" - AXRole: AXInlineTextBox "data" - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXRow - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXCell "data" - AXRole: AXStaticText "data" - AXRole: AXInlineTextBox "data" - AXRole: AXRow - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXCell "data" - AXRole: AXStaticText "data" - AXRole: AXInlineTextBox "data" - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXTable "row header and column header (2)" - AXRole: AXCaption - AXRole: AXStaticText "row header and column header (2)" - AXRole: AXInlineTextBox "row header and column header (2)" - AXRole: AXRow - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXCell "data" - AXRole: AXStaticText "data" - AXRole: AXInlineTextBox "data" - AXRole: AXCell "data" - AXRole: AXStaticText "data" - AXRole: AXInlineTextBox "data" - AXRole: AXRow - AXRole: AXColumnHeader "column head" - AXRole: AXStaticText "column head" - AXRole: AXInlineTextBox "column head" - AXRole: AXColumnHeader "column head" - AXRole: AXStaticText "column head" - AXRole: AXInlineTextBox "column head" - AXRole: AXColumnHeader "column head" - AXRole: AXStaticText "column head" - AXRole: AXInlineTextBox "column head" - AXRole: AXRow - AXRole: AXCell "data" - AXRole: AXStaticText "data" - AXRole: AXInlineTextBox "data" - AXRole: AXCell "data" - AXRole: AXStaticText "data" - AXRole: AXInlineTextBox "data" - AXRole: AXCell "data" - AXRole: AXStaticText "data" - AXRole: AXInlineTextBox "data" - AXRole: AXTable "row header and column header (3)" - AXRole: AXCaption - AXRole: AXStaticText "row header and column header (3)" - AXRole: AXInlineTextBox "row header and column header (3)" - AXRole: AXRow - AXRole: AXCell - AXRole: AXColumnHeader "col head" - AXRole: AXStaticText "col head" - AXRole: AXInlineTextBox "col head" - AXRole: AXRow - AXRole: AXColumnHeader "col head" - AXRole: AXStaticText "col head" - AXRole: AXInlineTextBox "col head" - AXRole: AXColumnHeader "col head" - AXRole: AXStaticText "col head" - AXRole: AXInlineTextBox "col head" - AXRole: AXRow - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXCell "data" - AXRole: AXStaticText "data" - AXRole: AXInlineTextBox "data" - AXRole: AXCell "data" - AXRole: AXStaticText "data" - AXRole: AXInlineTextBox "data" - AXRole: AXTable "row header and column header (4)" - AXRole: AXCaption - AXRole: AXStaticText "row header and column header (4)" - AXRole: AXInlineTextBox "row header and column header (4)" - AXRole: AXRow - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXColumnHeader "col head" - AXRole: AXStaticText "col head" - AXRole: AXInlineTextBox "col head" - AXRole: AXRow - AXRole: AXRowHeader "row head" - AXRole: AXStaticText "row head" - AXRole: AXInlineTextBox "row head" - AXRole: AXParagraph - AXRole: AXStaticText "End of test" + AXRole: AXGenericContainer + AXRole: AXTable "scope test" + AXRole: AXCaption + AXRole: AXStaticText "scope test" + AXRole: AXInlineTextBox "scope test" + AXRole: AXRow + AXRole: AXColumnHeader "col head" + AXRole: AXStaticText "col head" + AXRole: AXInlineTextBox "col head" + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXColumnHeader "col head" + AXRole: AXStaticText "col head" + AXRole: AXInlineTextBox "col head" + AXRole: AXRow + AXRole: AXColumnHeader "col head" + AXRole: AXStaticText "col head" + AXRole: AXInlineTextBox "col head" + AXRole: AXCell "data" + AXRole: AXStaticText "data" + AXRole: AXInlineTextBox "data" + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXRow + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXCell "data" + AXRole: AXStaticText "data" + AXRole: AXInlineTextBox "data" + AXRole: AXColumnHeader "col head" + AXRole: AXStaticText "col head" + AXRole: AXInlineTextBox "col head" + AXRole: AXTable "row header and column header (1)" + AXRole: AXCaption + AXRole: AXStaticText "row header and column header (1)" + AXRole: AXInlineTextBox "row header and column header (1)" + AXRole: AXRow + AXRole: AXCell "data" + AXRole: AXStaticText "data" + AXRole: AXInlineTextBox "data" + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXRow + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXCell "data" + AXRole: AXStaticText "data" + AXRole: AXInlineTextBox "data" + AXRole: AXRow + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXCell "data" + AXRole: AXStaticText "data" + AXRole: AXInlineTextBox "data" + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXTable "row header and column header (2)" + AXRole: AXCaption + AXRole: AXStaticText "row header and column header (2)" + AXRole: AXInlineTextBox "row header and column header (2)" + AXRole: AXRow + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXCell "data" + AXRole: AXStaticText "data" + AXRole: AXInlineTextBox "data" + AXRole: AXCell "data" + AXRole: AXStaticText "data" + AXRole: AXInlineTextBox "data" + AXRole: AXRow + AXRole: AXColumnHeader "column head" + AXRole: AXStaticText "column head" + AXRole: AXInlineTextBox "column head" + AXRole: AXColumnHeader "column head" + AXRole: AXStaticText "column head" + AXRole: AXInlineTextBox "column head" + AXRole: AXColumnHeader "column head" + AXRole: AXStaticText "column head" + AXRole: AXInlineTextBox "column head" + AXRole: AXRow + AXRole: AXCell "data" + AXRole: AXStaticText "data" + AXRole: AXInlineTextBox "data" + AXRole: AXCell "data" + AXRole: AXStaticText "data" + AXRole: AXInlineTextBox "data" + AXRole: AXCell "data" + AXRole: AXStaticText "data" + AXRole: AXInlineTextBox "data" + AXRole: AXTable "row header and column header (3)" + AXRole: AXCaption + AXRole: AXStaticText "row header and column header (3)" + AXRole: AXInlineTextBox "row header and column header (3)" + AXRole: AXRow + AXRole: AXCell + AXRole: AXColumnHeader "col head" + AXRole: AXStaticText "col head" + AXRole: AXInlineTextBox "col head" + AXRole: AXRow + AXRole: AXColumnHeader "col head" + AXRole: AXStaticText "col head" + AXRole: AXInlineTextBox "col head" + AXRole: AXColumnHeader "col head" + AXRole: AXStaticText "col head" + AXRole: AXInlineTextBox "col head" + AXRole: AXRow + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXCell "data" + AXRole: AXStaticText "data" + AXRole: AXInlineTextBox "data" + AXRole: AXCell "data" + AXRole: AXStaticText "data" + AXRole: AXInlineTextBox "data" + AXRole: AXTable "row header and column header (4)" + AXRole: AXCaption + AXRole: AXStaticText "row header and column header (4)" + AXRole: AXInlineTextBox "row header and column header (4)" + AXRole: AXRow + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXColumnHeader "col head" + AXRole: AXStaticText "col head" + AXRole: AXInlineTextBox "col head" + AXRole: AXRow + AXRole: AXRowHeader "row head" + AXRole: AXStaticText "row head" + AXRole: AXInlineTextBox "row head" + AXRole: AXParagraph + AXRole: AXStaticText "End of test" PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/accessibility/table-one-cell.html b/third_party/blink/web_tests/accessibility/table-one-cell.html index d5eb9cbc..3b188635 100644 --- a/third_party/blink/web_tests/accessibility/table-one-cell.html +++ b/third_party/blink/web_tests/accessibility/table-one-cell.html
@@ -24,7 +24,7 @@ var body = document.getElementById("body"); body.focus(); - var table = accessibilityController.focusedElement.childAtIndex(0); + var table = accessibilityController.focusedElement.childAtIndex(0).childAtIndex(0); result.innerText += table.allAttributes(); }
diff --git a/third_party/blink/web_tests/accessibility/table-with-aria-role.html b/third_party/blink/web_tests/accessibility/table-with-aria-role.html index ebbce6a..8a7056f1 100644 --- a/third_party/blink/web_tests/accessibility/table-with-aria-role.html +++ b/third_party/blink/web_tests/accessibility/table-with-aria-role.html
@@ -21,7 +21,7 @@ if (window.accessibilityController) { var body = document.getElementById("body"); body.focus(); - result.innerText += accessibilityController.focusedElement.attributesOfChildren(); + result.innerText += accessibilityController.focusedElement.childAtIndex(0).attributesOfChildren(); } </script> </body>
diff --git a/third_party/blink/web_tests/accessibility/table-with-empty-thead-causes-crash-expected.txt b/third_party/blink/web_tests/accessibility/table-with-empty-thead-causes-crash-expected.txt index 84782eab0..273f5e46 100644 --- a/third_party/blink/web_tests/accessibility/table-with-empty-thead-causes-crash-expected.txt +++ b/third_party/blink/web_tests/accessibility/table-with-empty-thead-causes-crash-expected.txt
@@ -7,16 +7,17 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". AXRole: AXWebArea - AXRole: AXTable "table" - AXRole: AXRow - AXRole: AXCell "1" - AXRole: AXStaticText "1" - AXRole: AXInlineTextBox "1" - AXRole: AXCell "2" - AXRole: AXStaticText "2" - AXRole: AXInlineTextBox "2" - AXRole: AXParagraph - AXRole: AXStaticText "End of test" + AXRole: AXGenericContainer + AXRole: AXTable "table" + AXRole: AXRow + AXRole: AXCell "1" + AXRole: AXStaticText "1" + AXRole: AXInlineTextBox "1" + AXRole: AXCell "2" + AXRole: AXStaticText "2" + AXRole: AXInlineTextBox "2" + AXRole: AXParagraph + AXRole: AXStaticText "End of test" PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/accessibility/table-with-presentation-role.html b/third_party/blink/web_tests/accessibility/table-with-presentation-role.html index 16bc714..39a147fc 100644 --- a/third_party/blink/web_tests/accessibility/table-with-presentation-role.html +++ b/third_party/blink/web_tests/accessibility/table-with-presentation-role.html
@@ -15,7 +15,7 @@ <script> test(() => { - var axTableContainer = accessibilityController.accessibleElementById('container'); + var axTableContainer = accessibilityController.accessibleElementById('container').childAtIndex(0); assert_equals(axTableContainer.childrenCount, 4); var axTextContainer1 = axTableContainer.childAtIndex(0); assert_equals(axTextContainer1.role, "AXRole: AXGenericContainer");
diff --git a/third_party/blink/web_tests/accessibility/table-with-rules.html b/third_party/blink/web_tests/accessibility/table-with-rules.html index 2d89383b..e4f371df 100644 --- a/third_party/blink/web_tests/accessibility/table-with-rules.html +++ b/third_party/blink/web_tests/accessibility/table-with-rules.html
@@ -24,7 +24,7 @@ // these should be the tables. in this order // the last table should not show up as a table. for (var k = 0; k < 5; k++) { - var table = accessibilityController.focusedElement.childAtIndex(k); + var table = accessibilityController.focusedElement.childAtIndex(0).childAtIndex(k); result.innerText += table.allAttributes() + "\n\n"; } }
diff --git a/third_party/blink/web_tests/css3/filters/backdrop-filter-basic-blur-expected.png b/third_party/blink/web_tests/css3/filters/backdrop-filter-basic-blur-expected.png index d3be83b..cb19a6e9 100644 --- a/third_party/blink/web_tests/css3/filters/backdrop-filter-basic-blur-expected.png +++ b/third_party/blink/web_tests/css3/filters/backdrop-filter-basic-blur-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/css3/filters/backdrop-filter-boundary-expected.png deleted file mode 100644 index f5794ba2..0000000 --- a/third_party/blink/web_tests/css3/filters/backdrop-filter-boundary-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/css3/filters/backdrop-filter-boundary.html b/third_party/blink/web_tests/css3/filters/backdrop-filter-boundary.html index 325f1976..2e5b8ac0 100644 --- a/third_party/blink/web_tests/css3/filters/backdrop-filter-boundary.html +++ b/third_party/blink/web_tests/css3/filters/backdrop-filter-boundary.html
@@ -27,5 +27,5 @@ <div class="bg"><div class="fg" style="backdrop-filter: blur(96px);"></div></div> </div> -<!-- This should show an increasing series of blurred blocks, with the higher - blur values bringing in lime green from the edges. --> +<!-- This should show an increasing series of blurred blocks. No lime green should + be brought in to the blurred regions. -->
diff --git a/third_party/blink/web_tests/css3/filters/backdrop-filter-edge-pixels-expected.png b/third_party/blink/web_tests/css3/filters/backdrop-filter-edge-pixels-expected.png index 7e810e0..f8bda03 100644 --- a/third_party/blink/web_tests/css3/filters/backdrop-filter-edge-pixels-expected.png +++ b/third_party/blink/web_tests/css3/filters/backdrop-filter-edge-pixels-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/css3/filters/backdrop-filter-plus-filter-expected.png b/third_party/blink/web_tests/css3/filters/backdrop-filter-plus-filter-expected.png index 50c0a55f..89c49dc 100644 --- a/third_party/blink/web_tests/css3/filters/backdrop-filter-plus-filter-expected.png +++ b/third_party/blink/web_tests/css3/filters/backdrop-filter-plus-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overflow/overfow-outside-padding.html b/third_party/blink/web_tests/external/wpt/css/css-overflow/overfow-outside-padding.html new file mode 100644 index 0000000..792f7b8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-overflow/overfow-outside-padding.html
@@ -0,0 +1,69 @@ +<!DOCTYPE html> +<title>CSS Overflow and Transforms: css-overflow-3</title> +<link rel="author" href="mailto:atotic@google.com"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://www.w3.org/TR/css-overflow-3/#scrollable"> +<meta name="assert" content="blocks wholly outside padding edges should not contribute to overflow"> +<style> +.container { + position: relative; + display: inline-block; + border: 5px solid rgba(0,0,0,0.5); + border-width: 0px 0px 50px 80px; + overflow: auto; + width: 200px; + height: 200px; + background: gray; +} +.target { + position: absolute; + width: 1000px; + height: 1000px; + background: red; +} +.htb { + writing-mode: horizontal-tb; +} +.vrl { + writing-mode: vertical-rl; +} +.vlr { + writing-mode: vertical-lr; +} +.rtl { + direction: rtl; +} +</style> +<!-- --> +<div class="container htb"> + <div class="target" style="top: -1000px"></div> + htb +</div> +<div class="container htb rtl"> + <div class="target" style="right: -1000px" ></div> + htb rtl +</div> +<div class="container vrl"> + <div class="target" style="top: -1000px"></div> + vrl +</div> +<div class="container vrl rtl"> + <div class="target" style="bottom: -1000px"></div> + vrl rtl +</div> +<div class="container vlr"> + <div class="target" style="top: -1000px"></div> + vlr +</div> +<div class="container vlr rtl"> + <div class="target" style="left: -1000px"></div> + vlr rtl +</div> +<script> +test(() => { + Array.from(document.querySelectorAll(".container")).forEach( el => { + assert_equals(el.scrollWidth, 200); + }); +}, '#target did not trigger scroll overflow'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-clipping.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-clipping.html new file mode 100644 index 0000000..5d09c414 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-clipping.html
@@ -0,0 +1,62 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Filter input is at element bounds</title> +<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty"> +<link rel="match" href="backdrop-filter-paint-order-ref.html"> + +<div> + <p>Expected: A pure white box with a blue border, surrounded by green.<br> + No green should be observed within the white box.<br> + No dark/black should be observed within the white box either.</p> +</div> + +<div class="greenbox top"></div> +<div class="greenbox right"></div> +<div class="greenbox bottom"></div> +<div class="filterbox"> + <div class="children" style="top:-31px;left:35px;"></div> + <div class="children" style="top:101px;left:35px;"></div> + <div class="children" style="top:35px;left:101px;"></div> + <div class="children" style="top:35px;left:-31px;"></div> +</div> +<style> +.filterbox { + position: absolute; + width: 100px; + height: 100px; + top: 150px; + left: 0px; + border: 1px solid blue; + backdrop-filter: blur(20px); +} +.greenbox { + position:absolute; + width: 150px; + height: 50px; + background: green; +} +.top { + top:100px; + left: 10px; +} +.right { + top:130px; + left: 102px; + width: 58px; + height: 150px; +} +.bottom { + top:252px; + left: 10px; +} +.children { + position: absolute; + width: 30px; + height: 30px; + top: 0px; + left: 0px; + background: green; +} +</style> +
diff --git a/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-expected.txt b/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-expected.txt index aa23359..b8d61a92 100644 --- a/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-expected.txt +++ b/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-expected.txt
@@ -2,10 +2,11 @@ WebArea GenericContainer - text "Some text in a div, also a" - InlineTextBox - link "link" - text "link" + GenericContainer + text "Some text in a div, also a" InlineTextBox - button "Hello Button" + link "link" + text "link" + InlineTextBox + button "Hello Button"
diff --git a/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt b/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt index 115af994..c2a3769 100644 --- a/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt +++ b/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt
@@ -22,8 +22,6 @@ } WebArea - img - *Ignored { "nodeId": "<string>", "ignored": true, @@ -48,8 +46,6 @@ } WebArea - button "Buttons are leaf nodes" - *Ignored { "nodeId": "<string>", "ignored": true, @@ -167,18 +163,6 @@ WebArea GenericContainer - img - button "Buttons are leaf nodes" - text "List item also presentational" - *GenericContainer - text "Div in list isn't presentational" - checkbox "Content within label refers to label container" - button "aria-hidden false button" - GenericContainer - combobox - GenericContainer "span with ARIA label" - text "div with display contents - should be ignored, but text should be included" - GenericContainer { "nodeId": "<string>", "ignored": false, @@ -357,21 +341,6 @@ WebArea GenericContainer - img - button "Buttons are leaf nodes" - text "List item also presentational" - GenericContainer - checkbox "Content within label refers to label container" - button "aria-hidden false button" - GenericContainer - *combobox - MenuListPopup - menuitem "Options should be" - menuitem "sent down even though" - menuitem "they are grandchildren" - GenericContainer "span with ARIA label" - text "div with display contents - should be ignored, but text should be included" - GenericContainer { "nodeId": "<string>", "ignored": false, @@ -432,11 +401,6 @@ } WebArea - combobox - MenuListPopup - *menuitem "Options should be" - menuitem "sent down even though" - menuitem "they are grandchildren" { "nodeId": "<string>", "ignored": false, @@ -533,18 +497,6 @@ WebArea GenericContainer - img - button "Buttons are leaf nodes" - text "List item also presentational" - GenericContainer - checkbox "Content within label refers to label container" - button "aria-hidden false button" - GenericContainer - combobox - *GenericContainer "span with ARIA label" - text "should not be ignored" - text "div with display contents - should be ignored, but text should be included" - GenericContainer { "nodeId": "<string>", "ignored": false, @@ -606,18 +558,6 @@ WebArea GenericContainer - img - button "Buttons are leaf nodes" - text "List item also presentational" - GenericContainer - checkbox "Content within label refers to label container" - button "aria-hidden false button" - GenericContainer - combobox - GenericContainer "span with ARIA label" - text "div with display contents - should be ignored, but text should be included" - *GenericContainer - text "summary element without details parent is ignored" { "nodeId": "<string>", "ignored": false,
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png index 3f18468f..a42e0c5d 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png deleted file mode 100644 index 3f18468f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png deleted file mode 100644 index 79f4913..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png deleted file mode 100644 index 3f18468f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png deleted file mode 100644 index 79f4913..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png deleted file mode 100644 index 3f18468f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png deleted file mode 100644 index 79f4913..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png deleted file mode 100644 index 3f18468f..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png deleted file mode 100644 index 79f4913..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/mac/css3/filters/backdrop-filter-boundary-expected.png index 0bb8a47f..d07c43a 100644 --- a/third_party/blink/web_tests/platform/mac/css3/filters/backdrop-filter-boundary-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/filters/backdrop-filter-boundary-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png index 3f18468f..a42e0c5d 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png index 79f4913..46558de6 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/win/css3/filters/backdrop-filter-boundary-expected.png new file mode 100644 index 0000000..7b4acc9 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/css3/filters/backdrop-filter-boundary-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png index f76fe3d9..dc263a1 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png new file mode 100644 index 0000000..d6b716e8 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png deleted file mode 100644 index f76fe3d9..0000000 --- a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/backdrop-filter-basic-blur-expected.png b/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/backdrop-filter-basic-blur-expected.png index 17a95872..24a2623 100644 --- a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/backdrop-filter-basic-blur-expected.png +++ b/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/backdrop-filter-basic-blur-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png b/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png deleted file mode 100644 index 5afe8db..0000000 --- a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/backdrop-filter-plus-filter-expected.png b/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/backdrop-filter-plus-filter-expected.png index 141896f39..398cdce 100644 --- a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/backdrop-filter-plus-filter-expected.png +++ b/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/backdrop-filter-plus-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/paint/hit-testing-001.html b/third_party/blink/web_tests/wpt_internal/display-lock/paint/hit-testing-001.html new file mode 100644 index 0000000..62915f8 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/display-lock/paint/hit-testing-001.html
@@ -0,0 +1,51 @@ +<!doctype HTML> +<html> +<meta charset="utf8"> +<title>Display Locking: hit testing</title> +<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> +<link rel="help" href="https://github.com/WICG/display-locking"> +<link rel="match" href="scroll-into-view-ref.html"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<style> +body { + margin: 0; + padding: 0; +} +#outer { + contain: style layout; + width: 100px; + height: 100px; + background: lightblue; +} +#inner { + margin: 25px; + width: 50px; + height: 50px; + background lightgreen; +} +</style> + +<body id="body"> +<div id="outer"><div id="inner"></div></div> +</body> + +<script> +async_test((t) => { + async function runTest() { + const container = document.getElementById("outer"); + await container.displayLock.acquire({ timeout: Infinity }); + let target = document.elementFromPoint(50, 50); + t.step(() => assert_equals(target.id, "outer", "center hits outer")); + target = document.elementFromPoint(10, 50); + t.step(() => assert_equals(target.id, "outer", "edge hits outer")); + target = document.elementFromPoint(100, 50); + t.step(() => assert_equals(target.id, "body", "elsewhere hits body")); + } + window.onload = () => { requestAnimationFrame(runTest); }; +}); + +</script> +</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/paint/hit-testing-002.html b/third_party/blink/web_tests/wpt_internal/display-lock/paint/hit-testing-002.html new file mode 100644 index 0000000..271abf5d --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/display-lock/paint/hit-testing-002.html
@@ -0,0 +1,52 @@ +<!doctype HTML> +<html> +<meta charset="utf8"> +<title>Display Locking: hit testing (composited outer)</title> +<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> +<link rel="help" href="https://github.com/WICG/display-locking"> +<link rel="match" href="scroll-into-view-ref.html"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<style> +body { + margin: 0; + padding: 0; +} +#outer { + will-change: transform; + contain: style layout; + width: 100px; + height: 100px; + background: lightblue; +} +#inner { + margin: 25px; + width: 50px; + height: 50px; + background lightgreen; +} +</style> + +<body id="body"> +<div id="outer"><div id="inner"></div></div> +</body> + +<script> +async_test((t) => { + async function runTest() { + const container = document.getElementById("outer"); + await container.displayLock.acquire({ timeout: Infinity }); + let target = document.elementFromPoint(50, 50); + t.step(() => assert_equals(target.id, "outer", "center hits outer")); + target = document.elementFromPoint(10, 50); + t.step(() => assert_equals(target.id, "outer", "edge hits outer")); + target = document.elementFromPoint(100, 50); + t.step(() => assert_equals(target.id, "body", "elsewhere hits body")); + } + window.onload = () => { requestAnimationFrame(runTest); }; +}); + +</script> +</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/paint/hit-testing-003.html b/third_party/blink/web_tests/wpt_internal/display-lock/paint/hit-testing-003.html new file mode 100644 index 0000000..7eb5053 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/display-lock/paint/hit-testing-003.html
@@ -0,0 +1,52 @@ +<!doctype HTML> +<html> +<meta charset="utf8"> +<title>Display Locking: hit testing (composited inner)</title> +<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> +<link rel="help" href="https://github.com/WICG/display-locking"> +<link rel="match" href="scroll-into-view-ref.html"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<style> +body { + margin: 0; + padding: 0; +} +#outer { + contain: style layout; + width: 100px; + height: 100px; + background: lightblue; +} +#inner { + will-change: transform; + margin: 25px; + width: 50px; + height: 50px; + background lightgreen; +} +</style> + +<body id="body"> +<div id="outer"><div id="inner"></div></div> +</body> + +<script> +async_test((t) => { + async function runTest() { + const container = document.getElementById("outer"); + await container.displayLock.acquire({ timeout: Infinity }); + let target = document.elementFromPoint(50, 50); + t.step(() => assert_equals(target.id, "outer", "center hits outer")); + target = document.elementFromPoint(10, 50); + t.step(() => assert_equals(target.id, "outer", "edge hits outer")); + target = document.elementFromPoint(100, 50); + t.step(() => assert_equals(target.id, "body", "elsewhere hits body")); + } + window.onload = () => { requestAnimationFrame(runTest); }; +}); + +</script> +</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/paint/non-composited-lock-composited-descendant-001.html b/third_party/blink/web_tests/wpt_internal/display-lock/paint/non-composited-lock-composited-descendant-001.html new file mode 100644 index 0000000..adc761f --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/display-lock/paint/non-composited-lock-composited-descendant-001.html
@@ -0,0 +1,48 @@ +<!doctype HTML> +<html class="reftest-wait"> +<meta charset="utf8"> +<title>Display Locking: acquire on a non-composited layer with a composited descendant</title> +<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> +<link rel="help" href="https://github.com/WICG/display-locking"> +<link rel="match" href="pass-if-nothing-below-ref.html"> +<script src="/common/reftest-wait.js"></script> + +<style> +#outer { + contain: style layout; + width: 100px; + height: 100px; + background: lightblue; + color: blue; +} +#inner { + will-change: transform; + width: 50px; + height: 50px; + background: lightgreen; + color: green; +} +</style> + +The test passes if there's nothing below. +<div id="outer"> + Lorem + <div id="inner"> + Ipsum + </div> +</div> + +<script> +async function runTest() { + const container = document.getElementById("outer"); + await container.displayLock.acquire({ timeout: Infinity }); + takeScreenshot(); +} + +window.onload = () => { + requestAnimationFrame(() => { + requestAnimationFrame(runTest); + }); +}; +</script> +</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/paint/non-composited-lock-composited-descendant-002.html b/third_party/blink/web_tests/wpt_internal/display-lock/paint/non-composited-lock-composited-descendant-002.html new file mode 100644 index 0000000..92e1e851 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/display-lock/paint/non-composited-lock-composited-descendant-002.html
@@ -0,0 +1,53 @@ +<!doctype HTML> +<html class="reftest-wait"> +<meta charset="utf8"> +<title>Display Locking: acquire on a non-composited layer with a composited descendant</title> +<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> +<link rel="help" href="https://github.com/WICG/display-locking"> +<link rel="match" href="non-composited-lock-composited-descendant-ref.html"> +<script src="/common/reftest-wait.js"></script> + +<style> +#outer { + contain: style layout; + width: 100px; + height: 100px; + background: lightblue; + color: blue; +} +#inner { + will-change: transform; + width: 50px; + height: 50px; + background: lightgreen; + color: green; +} +</style> + +<div id="outer"> + Lorem + <div id="inner"> + Ipsum + </div> +</div> + +<script> +async function commitAndFinish() { + const container = document.getElementById("outer"); + await container.displayLock.commit(); + takeScreenshot(); +} + +async function runTest() { + const container = document.getElementById("outer"); + await container.displayLock.acquire({ timeout: Infinity }); + requestAnimationFrame(commitAndFinish); +} + +window.onload = () => { + requestAnimationFrame(() => { + requestAnimationFrame(runTest); + }); +}; +</script> +</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/paint/non-composited-lock-composited-descendant-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/paint/non-composited-lock-composited-descendant-ref.html new file mode 100644 index 0000000..497e0ae4 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/display-lock/paint/non-composited-lock-composited-descendant-ref.html
@@ -0,0 +1,28 @@ +<!doctype HTML> +<html> +<meta charset="utf8"> +<title>Display Locking: pass (reference)</title> +<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> +<link rel="help" href="https://github.com/WICG/display-locking"> +<style> +#outer { + width: 100px; + height: 100px; + background: lightblue; + color: blue; +} +#inner { + width: 50px; + height: 50px; + background: lightgreen; + color: green; +} +</style> + +<div id="outer"> + Lorem + <div id="inner"> + Ipsum + </div> +</div> +</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/paint/pass-if-nothing-below-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/paint/pass-if-nothing-below-ref.html new file mode 100644 index 0000000..44236c2 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/display-lock/paint/pass-if-nothing-below-ref.html
@@ -0,0 +1,9 @@ +<!doctype HTML> +<html> +<meta charset="utf8"> +<title>Display Locking: pass (reference)</title> +<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> +<link rel="help" href="https://github.com/WICG/display-locking"> + +The test passes if there's nothing below. +</html>
diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py index 2c5b1248..cde67bd9 100755 --- a/tools/clang/scripts/build.py +++ b/tools/clang/scripts/build.py
@@ -47,7 +47,8 @@ FUCHSIA_SDK_DIR = os.path.join(CHROMIUM_DIR, 'third_party', 'fuchsia-sdk', 'sdk') -BUG_REPORT_URL = ('https://crbug.com and run tools/clang/scripts/upload_crash.py' +BUG_REPORT_URL = ('https://crbug.com and run' + ' tools/clang/scripts/process_crashreports.py' ' (only works inside Google) which will upload a report')
diff --git a/tools/clang/scripts/package.py b/tools/clang/scripts/package.py index a4bb926..d12e632d 100755 --- a/tools/clang/scripts/package.py +++ b/tools/clang/scripts/package.py
@@ -258,6 +258,9 @@ # Add llvm-ar for LTO. 'bin/llvm-ar', + # Add llvm-objcopy for partition extraction on Android. + 'bin/llvm-objcopy', + # AddressSanitizer C runtime (pure C won't link with *_cxx). 'lib/clang/$V/lib/linux/libclang_rt.asan-i386.a', 'lib/clang/$V/lib/linux/libclang_rt.asan-x86_64.a', @@ -396,6 +399,7 @@ if sys.platform.startswith('linux'): stripped_binaries.append('lld') stripped_binaries.append('llvm-ar') + stripped_binaries.append('llvm-objcopy') for f in stripped_binaries: if sys.platform != 'win32': subprocess.call(['strip', os.path.join(pdir, 'bin', f)])
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index a286652..819c39d 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py
@@ -38,7 +38,7 @@ # Reverting problematic clang rolls is safe, though. CLANG_REVISION = '80fee25776c2fb61e74c1ecb1a523375c2500b69' CLANG_SVN_REVISION = '362913' -CLANG_SUB_REVISION = 1 +CLANG_SUB_REVISION = 2 PACKAGE_VERSION = '%s-%s-%s' % (CLANG_SVN_REVISION, CLANG_REVISION[:8], CLANG_SUB_REVISION)
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 09faee2..d3080dc3 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -213,6 +213,7 @@ 'chromeos-vm-code-coverage': 'cros_chrome_sdk_headless_ozone_coverage', 'linux-chromeos-code-coverage': 'chromeos_with_codecs_release_bot_coverage', 'linux-chromeos-oobe-code-coverage': 'chromeos_with_codecs_release_bot_coverage', + 'linux-fieldtrial-rel': 'release_bot_minimal_symbols', 'Linux Builder Goma Canary': 'release_bot', 'Linux Builder Goma Latest Client': 'release_bot',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index e24cc3b..b4c7094 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -11692,6 +11692,12 @@ <int value="2" label="Safe Browsing returns SAFE"/> </enum> +<enum name="DarkModeStatus"> + <int value="0" label="Unavailable"/> + <int value="1" label="Light"/> + <int value="2" label="Dark"/> +</enum> + <enum name="DarkResumeScanRetryResult"> <int value="0" label="Not Connected"/> <int value="1" label="Connected"/> @@ -33793,6 +33799,7 @@ <int value="-1408869905" label="AutofillEnforceMinRequiredFieldsForQuery:disabled"/> <int value="-1408288176" label="enable-account-consistency"/> + <int value="-1405349891" label="PictureInPictureAPI:enabled"/> <int value="-1405048637" label="OfflinePagesResourceBasedSnapshot:enabled"/> <int value="-1399753480" label="disable-harfbuzz-rendertext"/> <int value="-1399419572" label="enable-app-list"/> @@ -33891,6 +33898,7 @@ <int value="-1281465357" label="MacV2GPUSandbox:disabled"/> <int value="-1278796760" label="QueryInOmnibox:enabled"/> <int value="-1276912933" label="enable-quick-unlock-pin"/> + <int value="-1276579737" label="PictureInPictureAPI:disabled"/> <int value="-1272593346" label="NewTabLoadingAnimation:disabled"/> <int value="-1271563519" label="enable-appcontainer"/> <int value="-1269962982" label="SyncUSSPasswords:disabled"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index bb82fc1..2c51a34 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -15313,6 +15313,16 @@ <summary>Maximal amount of memory allocated by decoder.</summary> </histogram> +<histogram name="Browser.DarkModeStatus" enum="DarkModeStatus" + expires_after="2020-06-11"> + <owner>lgrey@chromium.org</owner> + <owner>robliao@chromium.org</owner> + <summary> + Whether the user's system is in dark mode, light mode, or if this choice is + unavailable due to lack of system support. Updated every UMA upload. + </summary> +</histogram> + <histogram name="Browser.Responsiveness.JankyIntervalsPerThirtySeconds" units="janks"> <!-- Name completed by histogram_suffixes name="JankyIntervalsPerThirtySeconds" --> @@ -36742,8 +36752,9 @@ </histogram> <histogram name="ExtensionBubble.DevModeUserSelection" - enum="ExtensionBubbleAction" expires_after="M77"> - <owner>finnur@chromium.org</owner> + enum="ExtensionBubbleAction" expires_after="M82"> + <owner>rdevlin.cronin@chromium.org</owner> + <owner>extensions-core@chromium.org</owner> <summary> The action taken by the user when seeing the bubble, logged right after the action is taken. @@ -36751,8 +36762,9 @@ </histogram> <histogram name="ExtensionBubble.ExtensionsInDevModeCount" - units="Developer Mode Extensions" expires_after="M77"> - <owner>finnur@chromium.org</owner> + units="Developer Mode Extensions" expires_after="M82"> + <owner>rdevlin.cronin@chromium.org</owner> + <owner>extensions-core@chromium.org</owner> <summary> The total number of extensions found to be loaded under Developer Mode, logged when the devmode bubble is shown (once per startup per profile, if @@ -36944,8 +36956,9 @@ </histogram> <histogram name="ExtensionOverrideBubble.NtpOverriddenUserSelection" - enum="ExtensionBubbleAction" expires_after="M77"> - <owner>finnur@chromium.org</owner> + enum="ExtensionBubbleAction" expires_after="M82"> + <owner>rdevlin.cronin@chromium.org</owner> + <owner>extensions-core@chromium.org</owner> <summary> The action taken by the user when seeing the bubble, notifing them of an extension overriding their new tab page. Logged right after the action is @@ -36954,8 +36967,9 @@ </histogram> <histogram name="ExtensionOverrideBubble.SettingsApiUserSelectionHomePage" - enum="ExtensionBubbleAction"> - <owner>finnur@chromium.org</owner> + enum="ExtensionBubbleAction" expires_after="M82"> + <owner>rdevlin.cronin@chromium.org</owner> + <owner>extensions-core@chromium.org</owner> <summary> The action taken by the user when seeing the bubble, notifing them of an extension overriding their homepage. Logged right after the action is taken. @@ -36963,8 +36977,9 @@ </histogram> <histogram name="ExtensionOverrideBubble.SettingsApiUserSelectionSearchEngine" - enum="ExtensionBubbleAction" expires_after="M77"> - <owner>finnur@chromium.org</owner> + enum="ExtensionBubbleAction" expires_after="M82"> + <owner>rdevlin.cronin@chromium.org</owner> + <owner>extensions-core@chromium.org</owner> <summary> The action taken by the user when seeing the bubble, notifing them of an extension overriding their search engine. Logged right after the action is @@ -36973,8 +36988,9 @@ </histogram> <histogram name="ExtensionOverrideBubble.SettingsApiUserSelectionStartupPage" - enum="ExtensionBubbleAction" expires_after="M77"> - <owner>finnur@chromium.org</owner> + enum="ExtensionBubbleAction" expires_after="M82"> + <owner>rdevlin.cronin@chromium.org</owner> + <owner>extensions-core@chromium.org</owner> <summary> The action taken by the user when seeing the bubble, notifing them of an extension overriding their startup page. Logged right after the action is
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index 9c2cd9ae..55738ba 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -130,6 +130,14 @@ 'heap_profiling.mobile.disabled', 'heap_profiling.mobile.native', 'heap_profiling.mobile.pseudo']) +_ANDROID_PIXEL2_FYI_BENCHMARK_NAMES = frozenset([ + 'v8.browsing_mobile', + 'system_health.memory_mobile', + 'system_health.common_mobile', + 'startup.mobile', + 'speedometer2', + 'octane', + 'jetstream']) # Linux LINUX = PerfPlatform( @@ -195,6 +203,10 @@ 'android-nexus5x-perf-fyi', 'Android MMB29Q', _ANDROID_NEXUS5X_FYI_BENCHMARK_NAMES, num_shards=3, is_fyi=True) +ANDROID_PIXEL2_PERF_FYI = PerfPlatform( + 'android-pixel2-perf-fyi', 'Android OPM1.171019.021', + _ANDROID_PIXEL2_FYI_BENCHMARK_NAMES, + num_shards=7, platform_os='android', is_fyi=True) # TODO(crbug.com/902089): Add linux-perf-fyi once the bot is configured to use # the sharding map.
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py index d162ea7..30e65771 100755 --- a/tools/perf/core/perf_data_generator.py +++ b/tools/perf/core/perf_data_generator.py
@@ -107,6 +107,30 @@ 'device_os_flavor': 'google', }, }, + 'android-pixel2-perf-fyi': { + 'tests': [ + { + 'isolate': 'performance_test_suite', + 'extra_args': [ + # TODO(crbug.com/612455): Enable ref builds once can pass both + # --browser=exact (used by this bot to have it run Monochrome6432) + # and --browser=reference together. + #'--run-ref-build', + '--test-shard-map-filename=android-pixel2-perf-fyi_map.json', + ], + 'num_shards': 7 + } + ], + 'platform': 'android-chrome', + 'browser': 'bin/monochrome_64_32_bundle', + 'dimension': { + 'pool': 'chrome.tests.perf-fyi', + 'os': 'Android', + 'device_type': 'walleye', + 'device_os': 'O', + 'device_os_flavor': 'google', + }, + }, 'linux-perf-fyi': { 'tests': [ {
diff --git a/tools/perf/core/shard_maps/android-pixel2-perf-fyi_map.json b/tools/perf/core/shard_maps/android-pixel2-perf-fyi_map.json new file mode 100644 index 0000000..b7f488ad --- /dev/null +++ b/tools/perf/core/shard_maps/android-pixel2-perf-fyi_map.json
@@ -0,0 +1,77 @@ +{ + "0": { + "benchmarks": { + "jetstream": {}, + "octane": {}, + "speedometer2": {}, + "startup.mobile": {}, + "system_health.common_mobile": { + "end": 37 + } + } + }, + "1": { + "benchmarks": { + "system_health.common_mobile": { + "begin": 37 + }, + "system_health.memory_mobile": { + "end": 4 + } + } + }, + "2": { + "benchmarks": { + "system_health.memory_mobile": { + "begin": 4, + "end": 19 + } + } + }, + "3": { + "benchmarks": { + "system_health.memory_mobile": { + "begin": 19, + "end": 34 + } + } + }, + "4": { + "benchmarks": { + "system_health.memory_mobile": { + "begin": 34, + "end": 48 + } + } + }, + "5": { + "benchmarks": { + "system_health.memory_mobile": { + "begin": 48, + "end": 63 + } + } + }, + "6": { + "benchmarks": { + "system_health.memory_mobile": { + "begin": 63 + }, + "v8.browsing_mobile": {} + } + }, + "extra_infos": { + "num_stories": 173, + "predicted_min_shard_time": 84, + "predicted_min_shard_index": 4, + "predicted_max_shard_time": 90, + "predicted_max_shard_index": 2, + "shard #0": 88, + "shard #1": 86, + "shard #2": 90, + "shard #3": 90, + "shard #4": 84, + "shard #5": 90, + "shard #6": 90 + } +} \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/android-pixel2-perf-fyi_timing.json b/tools/perf/core/shard_maps/timing_data/android-pixel2-perf-fyi_timing.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/tools/perf/core/shard_maps/timing_data/android-pixel2-perf-fyi_timing.json
@@ -0,0 +1 @@ +[] \ No newline at end of file
diff --git a/ui/accessibility/ax_assistant_structure.cc b/ui/accessibility/ax_assistant_structure.cc index c749a46..82a302c 100644 --- a/ui/accessibility/ax_assistant_structure.cc +++ b/ui/accessibility/ax_assistant_structure.cc
@@ -24,7 +24,8 @@ namespace { bool HasFocusableChild(const AXNode* node) { - for (auto* child : node->children()) { + for (size_t i = 0; i < node->GetUnignoredChildCount(); ++i) { + AXNode* child = node->GetUnignoredChildAtIndex(i); if (child->data().HasState(ax::mojom::State::kFocusable) || HasFocusableChild(child)) { return true; @@ -34,7 +35,8 @@ } bool HasOnlyTextChildren(const AXNode* node) { - for (auto* child : node->children()) { + for (size_t i = 0; i < node->GetUnignoredChildCount(); ++i) { + AXNode* child = node->GetUnignoredChildAtIndex(i); if (!child->IsText()) return false; } @@ -52,7 +54,7 @@ } bool IsRichTextEditable(const AXNode* node) { - const AXNode* parent = node->parent(); + const AXNode* parent = node->GetUnignoredParent(); return node->data().HasState(ax::mojom::State::kRichlyEditable) && (!parent || !parent->data().HasState(ax::mojom::State::kRichlyEditable)); @@ -102,7 +104,8 @@ return node->data().GetString16Attribute(ax::mojom::StringAttribute::kName); } base::string16 text; - for (auto* child : node->children()) { + for (size_t i = 0; i < node->GetUnignoredChildCount(); ++i) { + AXNode* child = node->GetUnignoredChildAtIndex(i); text += GetInnerText(child); } return text; @@ -129,7 +132,8 @@ } bool HasOnlyTextAndImageChildren(const AXNode* node) { - for (auto* child : node->children()) { + for (size_t i = 0; i < node->GetUnignoredChildCount(); ++i) { + AXNode* child = node->GetUnignoredChildAtIndex(i); if (child->data().role != ax::mojom::Role::kStaticText && child->data().role != ax::mojom::Role::kImage) { return false; @@ -141,7 +145,8 @@ bool IsFocusable(const AXNode* node) { if (node->data().role == ax::mojom::Role::kIframe || node->data().role == ax::mojom::Role::kIframePresentational || - (node->data().role == ax::mojom::Role::kRootWebArea && node->parent())) { + (node->data().role == ax::mojom::Role::kRootWebArea && + node->GetUnignoredParent())) { return node->data().HasStringAttribute(ax::mojom::StringAttribute::kName); } return node->data().HasState(ax::mojom::State::kFocusable); @@ -208,7 +213,8 @@ if (text.empty() && (HasOnlyTextChildren(node) || (IsFocusable(node) && HasOnlyTextAndImageChildren(node)))) { - for (auto* child : node->children()) { + for (size_t i = 0; i < node->GetUnignoredChildCount(); ++i) { + AXNode* child = node->GetUnignoredChildAtIndex(i); text += GetText(child, show_password); } } @@ -286,7 +292,7 @@ AssistantNode* result) { result->text = GetText(node, config->show_password); result->class_name = - AXRoleToAndroidClassName(node->data().role, node->parent() != nullptr); + AXRoleToAndroidClassName(node->data().role, node->GetUnignoredParent()); result->role = AXRoleToString(node->data().role); result->text_size = -1.0; @@ -320,7 +326,7 @@ const gfx::Rect& absolute_rect = gfx::ToEnclosingRect(tree->GetTreeBounds(node)); gfx::Rect parent_relative_rect = absolute_rect; - bool is_root = node->parent() == nullptr; + bool is_root = !node->GetUnignoredParent(); if (!is_root) { parent_relative_rect.Offset(-rect.OffsetFromOrigin()); } @@ -349,7 +355,8 @@ base::make_optional<gfx::Range>(start_selection, end_selection); } - for (auto* child : node->children()) { + for (size_t i = 0; i < node->GetUnignoredChildCount(); ++i) { + AXNode* child = node->GetUnignoredChildAtIndex(i); auto* n = AddChild(assistant_tree); result->children_indices.push_back(assistant_tree->nodes.size() - 1); WalkAXTreeDepthFirst(child, absolute_rect, update, tree, config,
diff --git a/ui/accessibility/ax_enum_util.cc b/ui/accessibility/ax_enum_util.cc index d1a9587..87408f76 100644 --- a/ui/accessibility/ax_enum_util.cc +++ b/ui/accessibility/ax_enum_util.cc
@@ -1725,6 +1725,8 @@ return "selected"; case ax::mojom::BoolAttribute::kSupportsTextLocation: return "supportsTextLocation"; + case ax::mojom::BoolAttribute::kIsLineBreakingObject: + return "isLineBreakingObject"; } return ""; @@ -1761,6 +1763,8 @@ return ax::mojom::BoolAttribute::kSelected; if (0 == strcmp(bool_attribute, "supportsTextLocation")) return ax::mojom::BoolAttribute::kSupportsTextLocation; + if (0 == strcmp(bool_attribute, "isLineBreakingObject")) + return ax::mojom::BoolAttribute::kIsLineBreakingObject; return ax::mojom::BoolAttribute::kNone; }
diff --git a/ui/accessibility/ax_enums.mojom b/ui/accessibility/ax_enums.mojom index bec9f85..ea78039 100644 --- a/ui/accessibility/ax_enums.mojom +++ b/ui/accessibility/ax_enums.mojom
@@ -683,6 +683,10 @@ // Indicates whether this node can be grabbed for drag-and-drop operation. // Note: aria-grabbed is deprecated in WAI-ARIA 1.1. kGrabbed, + + // Indicates whether this node causes a hard line-break + // (e.g. block level elements, or <br>) + kIsLineBreakingObject, }; enum IntListAttribute {
diff --git a/ui/accessibility/ax_event_generator.cc b/ui/accessibility/ax_event_generator.cc index d71e00d..e6a311b 100644 --- a/ui/accessibility/ax_event_generator.cc +++ b/ui/accessibility/ax_event_generator.cc
@@ -108,7 +108,7 @@ return; } - tree_events_[node].insert(EventParams(event, ax::mojom::EventFrom::kNone)); + tree_events_[node].emplace(event, ax::mojom::EventFrom::kNone); } void AXEventGenerator::OnNodeDataWillChange(AXTree* tree, @@ -123,8 +123,16 @@ if (new_node_data.child_ids != old_node_data.child_ids && new_node_data.role != ax::mojom::Role::kStaticText) { AXNode* node = tree_->GetFromId(new_node_data.id); - tree_events_[node].insert( - EventParams(Event::CHILDREN_CHANGED, ax::mojom::EventFrom::kNone)); + + // If this node is ignored, fire the CHILDREN_CHANGED on + // the unignored parent if available. + if (new_node_data.HasState(ax::mojom::State::kIgnored)) + node = node->GetUnignoredParent(); + if (!node) + return; + + tree_events_[node].emplace(Event::CHILDREN_CHANGED, + ax::mojom::EventFrom::kNone); } } @@ -162,6 +170,7 @@ ui::AXNode* unignored_parent = node->GetUnignoredParent(); if (unignored_parent) AddEvent(unignored_parent, Event::CHILDREN_CHANGED); + AddEvent(node, Event::IGNORED_CHANGED); break; } case ax::mojom::State::kMultiline:
diff --git a/ui/accessibility/ax_event_generator.h b/ui/accessibility/ax_event_generator.h index 100dbf2..2ff2228d4 100644 --- a/ui/accessibility/ax_event_generator.h +++ b/ui/accessibility/ax_event_generator.h
@@ -45,6 +45,7 @@ GRABBED_CHANGED, HASPOPUP_CHANGED, HIERARCHICAL_LEVEL_CHANGED, + IGNORED_CHANGED, IMAGE_ANNOTATION_CHANGED, INVALID_STATUS_CHANGED, KEY_SHORTCUTS_CHANGED,
diff --git a/ui/accessibility/ax_event_generator_unittest.cc b/ui/accessibility/ax_event_generator_unittest.cc index 7b47f1bc..dbfa59961 100644 --- a/ui/accessibility/ax_event_generator_unittest.cc +++ b/ui/accessibility/ax_event_generator_unittest.cc
@@ -86,6 +86,9 @@ case AXEventGenerator::Event::HIERARCHICAL_LEVEL_CHANGED: event_name = "HIERARCHICAL_LEVEL_CHANGED"; break; + case ui::AXEventGenerator::Event::IGNORED_CHANGED: + event_name = "IGNORED_CHANGED"; + break; case AXEventGenerator::Event::IMAGE_ANNOTATION_CHANGED: event_name = "IMAGE_ANNOTATION_CHANGED"; break; @@ -935,6 +938,7 @@ ASSERT_TRUE(tree.Unserialize(update)); EXPECT_EQ( "CHILDREN_CHANGED on 2, " + "IGNORED_CHANGED on 4, " "STATE_CHANGED on 4", DumpEvents(&event_generator)); } @@ -968,6 +972,7 @@ ASSERT_TRUE(tree.Unserialize(update)); EXPECT_EQ( "CHILDREN_CHANGED on 2, " + "IGNORED_CHANGED on 4, " "STATE_CHANGED on 4", DumpEvents(&event_generator)); }
diff --git a/ui/accessibility/ax_node_data.cc b/ui/accessibility/ax_node_data.cc index e82402d..7d7772d 100644 --- a/ui/accessibility/ax_node_data.cc +++ b/ui/accessibility/ax_node_data.cc
@@ -1414,6 +1414,9 @@ case ax::mojom::BoolAttribute::kGrabbed: result += " grabbed=" + value; break; + case ax::mojom::BoolAttribute::kIsLineBreakingObject: + result += " is_line_breaking_object=" + value; + break; case ax::mojom::BoolAttribute::kNone: break; }
diff --git a/ui/accessibility/ax_serializable_tree.cc b/ui/accessibility/ax_serializable_tree.cc index a964c17f..f2473aa 100644 --- a/ui/accessibility/ax_serializable_tree.cc +++ b/ui/accessibility/ax_serializable_tree.cc
@@ -44,6 +44,10 @@ return node->parent(); } + bool IsIgnored(const AXNode* node) const override { + return node->data().HasState(ax::mojom::State::kIgnored); + } + bool IsValid(const AXNode* node) const override { return node != nullptr; } bool IsEqual(const AXNode* node1, const AXNode* node2) const override {
diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc index 8742e171..3efd5f05 100644 --- a/ui/accessibility/ax_tree.cc +++ b/ui/accessibility/ax_tree.cc
@@ -12,6 +12,7 @@ #include "base/auto_reset.h" #include "base/command_line.h" #include "base/logging.h" +#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "ui/accessibility/accessibility_switches.h" #include "ui/accessibility/ax_language_info.h" @@ -108,7 +109,7 @@ } // Returns whether this update removes |node|. - bool IsRemovedNode(const AXNode* node) { + bool IsRemovedNode(const AXNode* node) const { return removed_node_ids.find(node->id()) != removed_node_ids.end(); } @@ -117,9 +118,14 @@ return new_nodes.find(node) != new_nodes.end(); } + // If this node is removed, it should be considered reparented. + bool IsPotentiallyReparentedNode(const AXNode* node) const { + return base::Contains(potentially_reparented_ids, node->id()); + } + // Returns whether this update reparents |node|. - bool IsReparentedNode(const AXNode* node) { - return IsNewNode(node) && IsRemovedNode(node); + bool IsReparentedNode(const AXNode* node) const { + return IsPotentiallyReparentedNode(node) && IsRemovedNode(node); } // During an update, this keeps track of all nodes that have been @@ -138,6 +144,11 @@ // caching unignored relationships. std::unordered_set<int> changed_unignored_parent_ids; + // Potentially reparented node ids include any child node ids touched by the + // update, as well as any new root node id. Nodes are considered + // reparented if they are in this list and removed from somewhere else. + std::set<int> potentially_reparented_ids; + // Keeps track of new nodes created during this update. std::set<const AXNode*> new_nodes; @@ -396,6 +407,15 @@ if (update.has_tree_data) UpdateData(update.tree_data); + // Get all of the node ids that are certain to exist after the update. + // These are the nodes that are considered reparented if they are removed from + // somewhere else. + update_state.potentially_reparented_ids.emplace(update.root_id); + for (const AXNodeData& update_node_data : update.nodes) { + update_state.potentially_reparented_ids.insert( + update_node_data.child_ids.begin(), update_node_data.child_ids.end()); + } + // We distinguish between updating the root, e.g. changing its children or // some of its attributes, or replacing the root completely. bool root_updated = false; @@ -576,11 +596,10 @@ AXNode* new_node = new AXNode(this, parent, id, index_in_parent); id_map_[new_node->id()] = new_node; for (AXTreeObserver& observer : observers_) { - if (update_state->IsChangedNode(new_node) && - !update_state->IsRemovedNode(new_node)) - observer.OnNodeCreated(this, new_node); - else + if (update_state->IsReparentedNode(new_node)) observer.OnNodeReparented(this, new_node); + else + observer.OnNodeCreated(this, new_node); } AXNode* unignored_parent = new_node->GetUnignoredParent(); if (unignored_parent) { @@ -847,10 +866,10 @@ AXTreeUpdateState* update_state) { DCHECK(update_state); for (AXTreeObserver& observer : observers_) { - if (!update_state->IsChangedNode(node)) - observer.OnSubtreeWillBeDeleted(this, node); - else + if (update_state->IsPotentiallyReparentedNode(node)) observer.OnSubtreeWillBeReparented(this, node); + else + observer.OnSubtreeWillBeDeleted(this, node); } DestroyNodeAndSubtree(node, update_state); } @@ -870,10 +889,10 @@ } for (AXTreeObserver& observer : observers_) { - if (!update_state || !update_state->IsChangedNode(node)) - observer.OnNodeWillBeDeleted(this, node); - else + if (update_state && update_state->IsPotentiallyReparentedNode(node)) observer.OnNodeWillBeReparented(this, node); + else + observer.OnNodeWillBeDeleted(this, node); } id_map_.erase(node->id()); for (auto* child : node->children()) @@ -887,7 +906,7 @@ update_state->removed_node_ids.insert(node->id()); } - if (update_state && update_state->IsChangedNode(node)) { + if (update_state && update_state->IsReparentedNode(node)) { update_state->reparented_node_id_to_data.insert( std::make_pair(node->id(), node->TakeData())); } @@ -974,6 +993,10 @@ const AXNode* local_parent, std::vector<const AXNode*>& items, const AXNode& original_node) const { + // ignored nodes are not a part of ordered sets. + if (original_node.data().HasState(ax::mojom::State::kIgnored)) + return; + // Stop searching current path if roles of local_parent and ordered set match. // Don't compare the container to itself. if (!(ordered_set == local_parent)) {
diff --git a/ui/accessibility/ax_tree_serializer.h b/ui/accessibility/ax_tree_serializer.h index 12774a0..6aed3474 100644 --- a/ui/accessibility/ax_tree_serializer.h +++ b/ui/accessibility/ax_tree_serializer.h
@@ -208,6 +208,7 @@ int32_t id; ClientTreeNode* parent; std::vector<ClientTreeNode*> children; + bool ignored; bool invalid; }; @@ -500,6 +501,7 @@ // We're about to serialize it, so mark it as valid. client_node->invalid = false; + client_node->ignored = tree_->IsIgnored(node); // Iterate over the ids of the children of |node|. // Create a set of the child ids so we can quickly look @@ -507,6 +509,7 @@ // If we've hit the maximum number of serialized nodes, pretend // this node has no children but keep going so that we get // consistent results. + std::unordered_set<int32_t> new_ignored_ids; std::unordered_set<int32_t> new_child_ids; std::vector<AXSourceNode> children; if (max_node_count_ == 0 || out_update->nodes.size() < max_node_count_) { @@ -523,6 +526,8 @@ AXSourceNode& child = children[i]; int new_child_id = tree_->GetId(child); new_child_ids.insert(new_child_id); + if (tree_->IsIgnored(child)) + new_ignored_ids.insert(new_child_id); // There shouldn't be any reparenting because we've already handled it // above. If this happens, reset and return an error. @@ -591,9 +596,12 @@ if (client_child_id_map.find(child_id) != client_child_id_map.end()) { ClientTreeNode* reused_child = client_child_id_map[child_id]; client_node->children.push_back(reused_child); + const bool ignored_state_changed = + reused_child->ignored != + (new_ignored_ids.find(reused_child->id) != new_ignored_ids.end()); // Re-serialize it if the child is marked as invalid, otherwise // we don't have to because the client already has it. - if (reused_child->invalid) { + if (reused_child->invalid || ignored_state_changed) { if (!SerializeChangedNodes(child, out_update)) return false; } @@ -601,6 +609,7 @@ ClientTreeNode* new_child = new ClientTreeNode(); new_child->id = child_id; new_child->parent = client_node; + new_child->ignored = tree_->IsIgnored(child); new_child->invalid = false; client_node->children.push_back(new_child); client_id_map_[child_id] = new_child;
diff --git a/ui/accessibility/ax_tree_serializer_unittest.cc b/ui/accessibility/ax_tree_serializer_unittest.cc index 1cdce57..d305964 100644 --- a/ui/accessibility/ax_tree_serializer_unittest.cc +++ b/ui/accessibility/ax_tree_serializer_unittest.cc
@@ -262,6 +262,9 @@ AXNode* GetParent(const AXNode* node) const override { return node->parent(); } + bool IsIgnored(const AXNode* node) const override { + return node->data().HasState(ax::mojom::State::kIgnored); + } bool IsValid(const AXNode* node) const override { return node != nullptr && node->id() != invalid_id_; }
diff --git a/ui/accessibility/ax_tree_source.h b/ui/accessibility/ax_tree_source.h index 100b120..7d93b34 100644 --- a/ui/accessibility/ax_tree_source.h +++ b/ui/accessibility/ax_tree_source.h
@@ -48,6 +48,9 @@ // node object representing the null pointer. virtual bool IsValid(AXNodeSource node) const = 0; + // Returns true if |node| is an ignored node + virtual bool IsIgnored(AXNodeSource node) const = 0; + // Returns true if two nodes are equal. virtual bool IsEqual(AXNodeSource node1, AXNodeSource node2) const = 0;
diff --git a/ui/accessibility/ax_tree_unittest.cc b/ui/accessibility/ax_tree_unittest.cc index 7d90bac..b9f017a 100644 --- a/ui/accessibility/ax_tree_unittest.cc +++ b/ui/accessibility/ax_tree_unittest.cc
@@ -79,15 +79,21 @@ subtree_deleted_ids_.push_back(node->id()); } - void OnNodeWillBeReparented(AXTree* tree, AXNode* node) override {} + void OnNodeWillBeReparented(AXTree* tree, AXNode* node) override { + node_will_be_reparented_ids_.push_back(node->id()); + } - void OnSubtreeWillBeReparented(AXTree* tree, AXNode* node) override {} + void OnSubtreeWillBeReparented(AXTree* tree, AXNode* node) override { + subtree_will_be_reparented_ids_.push_back(node->id()); + } void OnNodeCreated(AXTree* tree, AXNode* node) override { created_ids_.push_back(node->id()); } - void OnNodeReparented(AXTree* tree, AXNode* node) override {} + void OnNodeReparented(AXTree* tree, AXNode* node) override { + node_reparented_ids_.push_back(node->id()); + } void OnNodeChanged(AXTree* tree, AXNode* node) override { changed_ids_.push_back(node->id()); @@ -204,6 +210,15 @@ const std::vector<int32_t>& node_reparented_finished_ids() { return node_reparented_finished_ids_; } + const std::vector<int32_t>& subtree_will_be_reparented_ids() { + return subtree_will_be_reparented_ids_; + } + const std::vector<int32_t>& node_will_be_reparented_ids() { + return node_will_be_reparented_ids_; + } + const std::vector<int32_t>& node_reparented_ids() { + return node_reparented_ids_; + } const std::vector<int32_t>& subtree_reparented_finished_ids() { return subtree_reparented_finished_ids_; } @@ -228,8 +243,11 @@ std::vector<int32_t> subtree_deleted_ids_; std::vector<int32_t> created_ids_; std::vector<int32_t> changed_ids_; + std::vector<int32_t> subtree_will_be_reparented_ids_; + std::vector<int32_t> node_will_be_reparented_ids_; std::vector<int32_t> node_creation_finished_ids_; std::vector<int32_t> subtree_creation_finished_ids_; + std::vector<int32_t> node_reparented_ids_; std::vector<int32_t> node_reparented_finished_ids_; std::vector<int32_t> subtree_reparented_finished_ids_; std::vector<int32_t> change_finished_ids_; @@ -473,6 +491,50 @@ EXPECT_FALSE(test_observer.tree_data_changed()); } +TEST(AXTreeTest, NoReparentingIfOnlyRemovedAndChangedNotReAdded) { + AXNodeData root; + root.id = 1; + AXNodeData child1; + child1.id = 2; + AXNodeData child2; + child2.id = 3; + + root.child_ids = {child1.id}; + child1.child_ids = {child2.id}; + + AXTreeUpdate initial_state; + initial_state.root_id = root.id; + initial_state.nodes = {root, child1, child2}; + + AXTree tree(initial_state); + + // Change existing attributes. + AXTreeUpdate update; + update.nodes.resize(2); + update.nodes[0].id = 2; + update.nodes[0].AddIntAttribute(ax::mojom::IntAttribute::kActivedescendantId, + 3); + update.nodes[1].id = 1; + + TestAXTreeObserver test_observer(&tree); + EXPECT_TRUE(tree.Unserialize(update)) << tree.error(); + + EXPECT_EQ(2U, test_observer.deleted_ids().size()); + EXPECT_EQ(2U, test_observer.subtree_deleted_ids().size()); + EXPECT_EQ(0U, test_observer.created_ids().size()); + + EXPECT_EQ(0U, test_observer.node_creation_finished_ids().size()); + EXPECT_EQ(0U, test_observer.subtree_creation_finished_ids().size()); + EXPECT_EQ(0U, test_observer.node_will_be_reparented_ids().size()); + EXPECT_EQ(0U, test_observer.subtree_will_be_reparented_ids().size()); + EXPECT_EQ(0U, test_observer.node_reparented_ids().size()); + EXPECT_EQ(0U, test_observer.node_reparented_finished_ids().size()); + ASSERT_EQ(0U, test_observer.subtree_reparented_finished_ids().size()); + + EXPECT_FALSE(test_observer.root_changed()); + EXPECT_FALSE(test_observer.tree_data_changed()); +} + TEST(AXTreeTest, ReparentRootIfRootChanged) { AXNodeData root; root.id = 1;
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc index faff790..58b301a 100644 --- a/ui/accessibility/platform/ax_platform_node_auralinux.cc +++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -3095,7 +3095,8 @@ void AXPlatformNodeAuraLinux::OnSubtreeCreated() { DCHECK(atk_object_); // We might not have a parent, in that case we don't need to send the event. - if (!GetParent()) + // We also don't want to notify if this is an ignored node + if (!GetParent() || GetData().HasState(ax::mojom::State::kIgnored)) return; g_signal_emit_by_name(GetParent(), "children-changed::add", GetIndexInParent(), atk_object_); @@ -3104,7 +3105,8 @@ void AXPlatformNodeAuraLinux::OnSubtreeWillBeDeleted() { DCHECK(atk_object_); // There is a chance there won't be a parent as we're in the deletion process. - if (!GetParent()) + // We also don't want to notify if this is an ignored node + if (!GetParent() || GetData().HasState(ax::mojom::State::kIgnored)) return; g_signal_emit_by_name(GetParent(), "children-changed::remove",
diff --git a/ui/base/pointer/pointer_device_linux.cc b/ui/base/pointer/pointer_device_linux.cc index 8e538dba..d30054c7 100644 --- a/ui/base/pointer/pointer_device_linux.cc +++ b/ui/base/pointer/pointer_device_linux.cc
@@ -5,24 +5,25 @@ #include "ui/base/pointer/pointer_device.h" #include "base/logging.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" namespace ui { namespace { bool IsTouchDevicePresent() { - return !InputDeviceManager::GetInstance()->GetTouchscreenDevices().empty(); + return !DeviceDataManager::GetInstance()->GetTouchscreenDevices().empty(); } bool IsMouseOrTouchpadPresent() { - InputDeviceManager* input_manager = InputDeviceManager::GetInstance(); - for (const ui::InputDevice& device : input_manager->GetTouchpadDevices()) { + DeviceDataManager* device_data_manager = DeviceDataManager::GetInstance(); + for (const ui::InputDevice& device : + device_data_manager->GetTouchpadDevices()) { if (device.enabled) return true; } // We didn't find a touchpad then let's look if there is a mouse connected. - for (const ui::InputDevice& device : input_manager->GetMouseDevices()) { + for (const ui::InputDevice& device : device_data_manager->GetMouseDevices()) { if (device.enabled) return true; } @@ -57,7 +58,7 @@ if (!IsTouchDevicePresent()) return TouchScreensAvailability::NONE; - return InputDeviceManager::GetInstance()->AreTouchscreensEnabled() + return DeviceDataManager::GetInstance()->AreTouchscreensEnabled() ? TouchScreensAvailability::ENABLED : TouchScreensAvailability::DISABLED; } @@ -65,7 +66,7 @@ int MaxTouchPoints() { int max_touch = 0; const std::vector<ui::TouchscreenDevice>& touchscreen_devices = - ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices(); + ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices(); for (const ui::TouchscreenDevice& device : touchscreen_devices) { if (device.touch_points > max_touch) max_touch = device.touch_points;
diff --git a/ui/chromeos/events/event_rewriter_chromeos.cc b/ui/chromeos/events/event_rewriter_chromeos.cc index 0c9b4c7..126f39d 100644 --- a/ui/chromeos/events/event_rewriter_chromeos.cc +++ b/ui/chromeos/events/event_rewriter_chromeos.cc
@@ -26,7 +26,7 @@ #include "ui/base/ime/chromeos/input_method_manager.h" #include "ui/chromeos/events/modifier_key.h" #include "ui/chromeos/events/pref_names.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/event.h" #include "ui/events/event_utils.h" #include "ui/events/keycodes/dom/dom_code.h" @@ -265,7 +265,7 @@ // Returns true if |mouse_event| was generated from a touchpad device. bool IsFromTouchpadDevice(const ui::MouseEvent& mouse_event) { for (const ui::InputDevice& touchpad : - ui::InputDeviceManager::GetInstance()->GetTouchpadDevices()) { + ui::DeviceDataManager::GetInstance()->GetTouchpadDevices()) { if (touchpad.id == mouse_event.source_device_id()) return true; } @@ -1605,10 +1605,10 @@ EventRewriterChromeOS::DeviceType EventRewriterChromeOS::KeyboardDeviceAdded( int device_id) { - if (!ui::InputDeviceManager::HasInstance()) + if (!ui::DeviceDataManager::HasInstance()) return kDeviceUnknown; const std::vector<ui::InputDevice>& keyboard_devices = - ui::InputDeviceManager::GetInstance()->GetKeyboardDevices(); + ui::DeviceDataManager::GetInstance()->GetKeyboardDevices(); for (const auto& keyboard : keyboard_devices) { if (keyboard.id == device_id) { const DeviceType type = GetDeviceType(keyboard);
diff --git a/ui/chromeos/events/keyboard_layout_util.cc b/ui/chromeos/events/keyboard_layout_util.cc index 093ed2f..31abd870 100644 --- a/ui/chromeos/events/keyboard_layout_util.cc +++ b/ui/chromeos/events/keyboard_layout_util.cc
@@ -5,13 +5,13 @@ #include "ui/chromeos/events/keyboard_layout_util.h" #include "ui/chromeos/events/event_rewriter_chromeos.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" namespace ui { bool DeviceUsesKeyboardLayout2() { for (const InputDevice& keyboard : - InputDeviceManager::GetInstance()->GetKeyboardDevices()) { + DeviceDataManager::GetInstance()->GetKeyboardDevices()) { EventRewriterChromeOS::KeyboardTopRowLayout layout; if (EventRewriterChromeOS::GetKeyboardTopRowLayout(keyboard.sys_path, &layout) && @@ -25,7 +25,7 @@ bool DeviceKeyboardHasAssistantKey() { for (const InputDevice& keyboard : - InputDeviceManager::GetInstance()->GetKeyboardDevices()) { + DeviceDataManager::GetInstance()->GetKeyboardDevices()) { bool has_assistant_key = false; if (EventRewriterChromeOS::HasAssistantKeyOnKeyboard(keyboard.sys_path, &has_assistant_key) &&
diff --git a/ui/chromeos/user_activity_power_manager_notifier.cc b/ui/chromeos/user_activity_power_manager_notifier.cc index d28cc106..39c64aa 100644 --- a/ui/chromeos/user_activity_power_manager_notifier.cc +++ b/ui/chromeos/user_activity_power_manager_notifier.cc
@@ -7,7 +7,7 @@ #include "services/device/public/mojom/constants.mojom.h" #include "services/service_manager/public/cpp/connector.h" #include "ui/base/user_activity/user_activity_detector.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/stylus_state.h" #include "ui/events/event.h" #include "ui/events/event_constants.h" @@ -48,7 +48,7 @@ service_manager::Connector* connector) : detector_(detector), fingerprint_observer_binding_(this) { detector_->AddObserver(this); - ui::InputDeviceManager::GetInstance()->AddObserver(this); + ui::DeviceDataManager::GetInstance()->AddObserver(this); chromeos::PowerManagerClient::Get()->AddObserver(this); // Connector can be null in tests. @@ -64,7 +64,7 @@ UserActivityPowerManagerNotifier::~UserActivityPowerManagerNotifier() { chromeos::PowerManagerClient::Get()->RemoveObserver(this); - ui::InputDeviceManager::GetInstance()->RemoveObserver(this); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); detector_->RemoveObserver(this); }
diff --git a/ui/compositor/layer_unittest.cc b/ui/compositor/layer_unittest.cc index 4b4f48e..252f92a 100644 --- a/ui/compositor/layer_unittest.cc +++ b/ui/compositor/layer_unittest.cc
@@ -1833,20 +1833,23 @@ base::FilePath ref_img2 = test_data_dir().AppendASCII("BackgroundBlur2.png"); SkBitmap bitmap; + // 25% of image can have up to a difference of 3. + cc::FuzzyPixelComparator fuzzy_comparator(true, 25.f, 0.0f, 3.f, 3, 0); + l0->Add(l1.get()); l0->Add(l2.get()); DrawTree(l0.get()); ReadPixels(&bitmap); ASSERT_FALSE(bitmap.empty()); // WritePNGFile(bitmap, ref_img1, false); - EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img1, cc::ExactPixelComparator(true))); + EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img1, fuzzy_comparator)); l0->StackAtTop(l1.get()); DrawTree(l0.get()); ReadPixels(&bitmap); ASSERT_FALSE(bitmap.empty()); // WritePNGFile(bitmap, ref_img2, false); - EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img2, cc::ExactPixelComparator(true))); + EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img2, fuzzy_comparator)); } // Checks that background blur bounds rect gets properly updated when device @@ -1875,6 +1878,9 @@ test_data_dir().AppendASCII("BackgroundBlur1_zoom.png"); SkBitmap bitmap; + // 25% of image can have up to a difference of 3. + cc::FuzzyPixelComparator fuzzy_comparator(true, 25.f, 0.0f, 3.f, 3, 0); + l0->Add(l1.get()); l0->Add(l2.get()); DrawTree(l0.get()); @@ -1882,7 +1888,7 @@ ASSERT_FALSE(bitmap.empty()); // See LayerWithRealCompositorTest.BackgroundBlur test to rewrite this // baseline. - EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img1, cc::ExactPixelComparator(true))); + EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img1, fuzzy_comparator)); allocator.GenerateId(); // Now change the scale, and make sure the bounds are still correct. @@ -1893,7 +1899,7 @@ ReadPixels(&bitmap); ASSERT_FALSE(bitmap.empty()); // WritePNGFile(bitmap, ref_img2, false); - EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img2, cc::ExactPixelComparator(true))); + EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img2, fuzzy_comparator)); } // It is really hard to write pixel test on text rendering,
diff --git a/ui/display/manager/DEPS b/ui/display/manager/DEPS index c75536d..c4cefa35 100644 --- a/ui/display/manager/DEPS +++ b/ui/display/manager/DEPS
@@ -5,18 +5,4 @@ "+ui/events/devices", "+ui/events/platform_event.h", "+ui/strings", - # DeviceDataManager is not created in all environments (such as ash when - # running in mus/mash). - "-ui/events/devices/device_data_manager.h", ] - -specific_include_rules = { - "default_touch_transform_setter.cc": [ - # DefaultTouchTransformSetter only runs in environments where - # DeviceDataManager exists. - "+ui/events/devices/device_data_manager.h", - ], - "touch_transform_controller_unittest.cc": [ - "+ui/events/devices/device_data_manager.h", - ], -}
diff --git a/ui/display/manager/display_change_observer.cc b/ui/display/manager/display_change_observer.cc index 11445d4..dd961135 100644 --- a/ui/display/manager/display_change_observer.cc +++ b/ui/display/manager/display_change_observer.cc
@@ -28,7 +28,7 @@ #include "ui/display/types/display_snapshot.h" #include "ui/display/util/display_util.h" #include "ui/display/util/edid_parser.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/touchscreen_device.h" #include "ui/strings/grit/ui_strings.h" @@ -161,11 +161,11 @@ DisplayChangeObserver::DisplayChangeObserver(DisplayManager* display_manager) : display_manager_(display_manager) { - ui::InputDeviceManager::GetInstance()->AddObserver(this); + ui::DeviceDataManager::GetInstance()->AddObserver(this); } DisplayChangeObserver::~DisplayChangeObserver() { - ui::InputDeviceManager::GetInstance()->RemoveObserver(this); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); } MultipleDisplayState DisplayChangeObserver::GetStateForDisplayIds( @@ -203,8 +203,7 @@ } display_manager_->touch_device_manager()->AssociateTouchscreens( - &displays, - ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices()); + &displays, ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices()); display_manager_->OnNativeDisplaysChanged(displays); // For the purposes of user activity detection, ignore synthetic mouse events
diff --git a/ui/display/manager/touch_device_manager.cc b/ui/display/manager/touch_device_manager.cc index ca19e78..1ffeb3f 100644 --- a/ui/display/manager/touch_device_manager.cc +++ b/ui/display/manager/touch_device_manager.cc
@@ -15,8 +15,8 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "ui/display/manager/managed_display_info.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/input_device.h" -#include "ui/events/devices/input_device_manager.h" #include "ui/events/devices/touchscreen_device.h" namespace display { @@ -721,7 +721,7 @@ bool HasExternalTouchscreenDevice() { for (const auto& device : - ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices()) { + ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices()) { if (device.type == ui::InputDeviceType::INPUT_DEVICE_USB || device.type == ui::InputDeviceType::INPUT_DEVICE_BLUETOOTH) { return true; @@ -732,7 +732,7 @@ bool IsInternalTouchscreenDevice(const TouchDeviceIdentifier& identifier) { for (const auto& device : - ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices()) { + ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices()) { if (TouchDeviceIdentifier::FromDevice(device) == identifier) return device.type == ui::InputDeviceType::INPUT_DEVICE_INTERNAL; }
diff --git a/ui/display/manager/touch_transform_controller.cc b/ui/display/manager/touch_transform_controller.cc index 50b55ffa..8f49a268 100644 --- a/ui/display/manager/touch_transform_controller.cc +++ b/ui/display/manager/touch_transform_controller.cc
@@ -16,7 +16,7 @@ #include "ui/display/screen.h" #include "ui/display/types/display_constants.h" #include "ui/display/types/display_snapshot.h" -#include "ui/events/devices/input_device_manager.h" +#include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/touch_device_transform.h" namespace display { @@ -26,7 +26,7 @@ ui::TouchscreenDevice FindTouchscreenByIdentifier( const TouchDeviceIdentifier& identifier) { const std::vector<ui::TouchscreenDevice>& touchscreens = - ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices(); + ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices(); for (const auto& touchscreen : touchscreens) { if (TouchDeviceIdentifier::FromDevice(touchscreen) == identifier) return touchscreen;
diff --git a/ui/events/devices/BUILD.gn b/ui/events/devices/BUILD.gn index e899f7a..3c8bbd4 100644 --- a/ui/events/devices/BUILD.gn +++ b/ui/events/devices/BUILD.gn
@@ -22,8 +22,6 @@ "input_device.cc", "input_device.h", "input_device_event_observer.h", - "input_device_manager.cc", - "input_device_manager.h", "input_device_observer_android.cc", "input_device_observer_android.h", "input_device_observer_win.cc",
diff --git a/ui/events/devices/device_data_manager.cc b/ui/events/devices/device_data_manager.cc index 0e37033..42ccc9eda 100644 --- a/ui/events/devices/device_data_manager.cc +++ b/ui/events/devices/device_data_manager.cc
@@ -33,28 +33,20 @@ DeviceDataManager* DeviceDataManager::instance_ = nullptr; DeviceDataManager::DeviceDataManager() { - InputDeviceManager::SetInstance(this); + DCHECK(!instance_); + instance_ = this; } DeviceDataManager::~DeviceDataManager() { - InputDeviceManager::ClearInstance(); instance_ = nullptr; } // static -void DeviceDataManager::set_instance(DeviceDataManager* instance) { - DCHECK(instance) - << "Must reset the DeviceDataManager using DeleteInstance()."; - DCHECK(!instance_) << "Can not set multiple instances of DeviceDataManager."; - instance_ = instance; -} - -// static void DeviceDataManager::CreateInstance() { if (instance_) return; - set_instance(new DeviceDataManager()); + new DeviceDataManager(); // TODO(bruthig): Replace the DeleteInstance callbacks with explicit calls. base::AtExitManager::RegisterTask(base::Bind(DeleteInstance));
diff --git a/ui/events/devices/device_data_manager.h b/ui/events/devices/device_data_manager.h index 6e4a08a..362778d 100644 --- a/ui/events/devices/device_data_manager.h +++ b/ui/events/devices/device_data_manager.h
@@ -15,7 +15,6 @@ #include "base/observer_list.h" #include "ui/events/devices/device_hotplug_event_observer.h" #include "ui/events/devices/events_devices_export.h" -#include "ui/events/devices/input_device_manager.h" #include "ui/events/devices/touch_device_transform.h" #include "ui/events/devices/touchscreen_device.h" @@ -26,8 +25,7 @@ // Keeps track of device mappings and event transformations. class EVENTS_DEVICES_EXPORT DeviceDataManager - : public InputDeviceManager, - public DeviceHotplugEventObserver { + : public DeviceHotplugEventObserver { public: static const int kMaxDeviceNum = 128; ~DeviceDataManager() override; @@ -51,23 +49,27 @@ void SetTouchscreensEnabled(bool enabled); - // InputDeviceManager: - const std::vector<TouchscreenDevice>& GetTouchscreenDevices() const override; - const std::vector<InputDevice>& GetKeyboardDevices() const override; - const std::vector<InputDevice>& GetMouseDevices() const override; - const std::vector<InputDevice>& GetTouchpadDevices() const override; - const std::vector<InputDevice>& GetUncategorizedDevices() const override; - bool AreDeviceListsComplete() const override; - bool AreTouchscreensEnabled() const override; - bool AreTouchscreenTargetDisplaysValid() const override; - void AddObserver(InputDeviceEventObserver* observer) override; - void RemoveObserver(InputDeviceEventObserver* observer) override; + const std::vector<TouchscreenDevice>& GetTouchscreenDevices() const; + const std::vector<InputDevice>& GetKeyboardDevices() const; + const std::vector<InputDevice>& GetMouseDevices() const; + const std::vector<InputDevice>& GetTouchpadDevices() const; + + // Returns all the uncategorized input devices, which means input devices + // besides keyboards, touchscreens, mice and touchpads. + const std::vector<InputDevice>& GetUncategorizedDevices() const; + bool AreDeviceListsComplete() const; + bool AreTouchscreensEnabled() const; + + // Returns true if the |target_display_id| of the TouchscreenDevices returned + // from GetTouchscreenDevices() is valid. + bool AreTouchscreenTargetDisplaysValid() const; + + void AddObserver(InputDeviceEventObserver* observer); + void RemoveObserver(InputDeviceEventObserver* observer); protected: DeviceDataManager(); - static void set_instance(DeviceDataManager* instance); - // DeviceHotplugEventObserver: void OnTouchscreenDevicesUpdated( const std::vector<TouchscreenDevice>& devices) override;
diff --git a/ui/events/devices/input_device_manager.cc b/ui/events/devices/input_device_manager.cc deleted file mode 100644 index 12c47b9..0000000 --- a/ui/events/devices/input_device_manager.cc +++ /dev/null
@@ -1,37 +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 "ui/events/devices/input_device_manager.h" - -namespace ui { -namespace { - -InputDeviceManager* g_instance = nullptr; - -} // namespace - -// static -InputDeviceManager* InputDeviceManager::GetInstance() { - DCHECK(g_instance) << "InputDeviceManager::SetInstance must be called before " - "getting the instance of InputDeviceManager."; - return g_instance; -} - -// static -bool InputDeviceManager::HasInstance() { - return g_instance; -} - -// static -void InputDeviceManager::SetInstance(InputDeviceManager* instance) { - DCHECK(!g_instance); - g_instance = instance; -} - -// static -void InputDeviceManager::ClearInstance() { - g_instance = nullptr; -} - -} // namespace ui
diff --git a/ui/events/devices/input_device_manager.h b/ui/events/devices/input_device_manager.h deleted file mode 100644 index 0a4317e9..0000000 --- a/ui/events/devices/input_device_manager.h +++ /dev/null
@@ -1,65 +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 UI_EVENTS_DEVICES_INPUT_DEVICE_MANAGER_H_ -#define UI_EVENTS_DEVICES_INPUT_DEVICE_MANAGER_H_ - -#include <vector> - -#include "base/macros.h" -#include "ui/events/devices/events_devices_export.h" -#include "ui/events/devices/input_device.h" -#include "ui/events/devices/input_device_event_observer.h" -#include "ui/events/devices/touchscreen_device.h" - -namespace ui { - -// Interface to query available input devices. The implementation, which is a -// singleton, could be DeviceDataManager or something that mirrors the necessary -// state if DeviceDataManager is in a different process. -class EVENTS_DEVICES_EXPORT InputDeviceManager { - public: - InputDeviceManager() = default; - virtual ~InputDeviceManager() = default; - - static InputDeviceManager* GetInstance(); - static bool HasInstance(); - - virtual const std::vector<InputDevice>& GetKeyboardDevices() const = 0; - virtual const std::vector<TouchscreenDevice>& GetTouchscreenDevices() - const = 0; - virtual const std::vector<InputDevice>& GetMouseDevices() const = 0; - virtual const std::vector<InputDevice>& GetTouchpadDevices() const = 0; - - // Returns all the uncategorized input devices, which means input devices - // besides keyboards, touchscreens, mice and touchpads. - virtual const std::vector<InputDevice>& GetUncategorizedDevices() const = 0; - - virtual bool AreDeviceListsComplete() const = 0; - virtual bool AreTouchscreensEnabled() const = 0; - - // Returns true if the |target_display_id| of the TouchscreenDevices returned - // from GetTouchscreenDevices() is valid. - virtual bool AreTouchscreenTargetDisplaysValid() const = 0; - - virtual void AddObserver(InputDeviceEventObserver* observer) = 0; - virtual void RemoveObserver(InputDeviceEventObserver* observer) = 0; - - protected: - // Sets the instance. This should only be set once per thread. - static void SetInstance(InputDeviceManager* instance); - - // Clears the instance. InputDeviceManager doesn't own the instance and won't - // destroy it, so it should be cleared before it is destroyed elsewhere. - static void ClearInstance(); - - private: - static InputDeviceManager* instance_; // Not owned. - - DISALLOW_COPY_AND_ASSIGN(InputDeviceManager); -}; - -} // namespace ui - -#endif // UI_EVENTS_DEVICES_INPUT_DEVICE_MANAGER_H_
diff --git a/ui/events/devices/touchscreen_device.h b/ui/events/devices/touchscreen_device.h index 9dcf15c..f786bda 100644 --- a/ui/events/devices/touchscreen_device.h +++ b/ui/events/devices/touchscreen_device.h
@@ -43,9 +43,9 @@ // True if the specified touchscreen device is stylus capable. bool has_stylus = false; // Id of the display the touch device targets. - // NOTE: when obtaining TouchscreenDevice from InputDeviceManager this value + // NOTE: when obtaining TouchscreenDevice from DeviceDataManager this value // may not have been updated. See - // InputDeviceManager::AreTouchscreenTargetDisplaysValid() for details. + // DeviceDataManager::AreTouchscreenTargetDisplaysValid() for details. int64_t target_display_id = display::kInvalidDisplayId; // NOTE: If adding fields please update mojo/input_devices.mojom.
diff --git a/ui/events/devices/x11/device_data_manager_x11.cc b/ui/events/devices/x11/device_data_manager_x11.cc index 9b52d3ae..7a37554 100644 --- a/ui/events/devices/x11/device_data_manager_x11.cc +++ b/ui/events/devices/x11/device_data_manager_x11.cc
@@ -150,13 +150,11 @@ if (HasInstance()) return; - DeviceDataManagerX11* device_data_manager = new DeviceDataManagerX11(); + new DeviceDataManagerX11(); // TODO(bruthig): Replace the DeleteInstance callbacks with explicit calls. base::AtExitManager::RegisterTask( base::Bind(DeviceDataManager::DeleteInstance)); - - set_instance(device_data_manager); } // static
diff --git a/ui/events/platform/x11/x11_event_source.cc b/ui/events/platform/x11/x11_event_source.cc index 7e9f6df..45dd452 100644 --- a/ui/events/platform/x11/x11_event_source.cc +++ b/ui/events/platform/x11/x11_event_source.cc
@@ -12,6 +12,7 @@ #include "ui/events/event_utils.h" #include "ui/events/platform/platform_event_dispatcher.h" #include "ui/events/platform/x11/x11_hotplug_event_handler.h" +#include "ui/events/x/events_x_utils.h" #include "ui/gfx/x/x11.h" #include "ui/gfx/x/x11_atom_cache.h" @@ -193,7 +194,6 @@ return GetCurrentServerTime(); } -#if !defined(USE_OZONE) base::Optional<gfx::Point> X11EventSource::GetRootCursorLocationFromCurrentEvent() const { if (!dispatching_event_) @@ -226,10 +226,9 @@ } if (is_valid_event) - return ui::EventSystemLocationFromNative(event); + return ui::EventSystemLocationFromXEvent(*event); return base::nullopt; } -#endif //////////////////////////////////////////////////////////////////////////////// // X11EventSource, protected
diff --git a/ui/events/platform/x11/x11_event_source.h b/ui/events/platform/x11/x11_event_source.h index e818c4ac..fdc28c7 100644 --- a/ui/events/platform/x11/x11_event_source.h +++ b/ui/events/platform/x11/x11_event_source.h
@@ -12,7 +12,6 @@ #include "base/macros.h" #include "base/optional.h" -#include "build/build_config.h" #include "ui/events/events_export.h" #include "ui/gfx/x/x11_types.h" @@ -71,11 +70,9 @@ // current event does not have a timestamp. Time GetTimestamp(); -#if !defined(USE_OZONE) // Returns the root pointer location only if there is an event being // dispatched that contains that information. base::Optional<gfx::Point> GetRootCursorLocationFromCurrentEvent() const; -#endif void StopCurrentEventStream(); void OnDispatcherListChanged();
diff --git a/ui/file_manager/file_manager/foreground/js/main_scripts.js b/ui/file_manager/file_manager/foreground/js/main_scripts.js index f2610ecd..f33d0df 100644 --- a/ui/file_manager/file_manager/foreground/js/main_scripts.js +++ b/ui/file_manager/file_manager/foreground/js/main_scripts.js
@@ -54,13 +54,13 @@ // <include src="../../../../webui/resources/js/cr/ui/autocomplete_list.js"> // <include src="../../../../webui/resources/js/cr/ui/splitter.js"> -// <include src="../../../../webui/resources/js/cr/ui/table/table_splitter.js"> +// <include src="ui/table/table_splitter.js"> // -// <include src="../../../../webui/resources/js/cr/ui/table/table_column.js"> -// <include src="../../../../webui/resources/js/cr/ui/table/table_column_model.js"> -// <include src="../../../../webui/resources/js/cr/ui/table/table_header.js"> -// <include src="../../../../webui/resources/js/cr/ui/table/table_list.js"> -// <include src="../../../../webui/resources/js/cr/ui/table.js"> +// <include src="ui/table/table_column.js"> +// <include src="ui/table/table_column_model.js"> +// <include src="ui/table/table_header.js"> +// <include src="ui/table/table_list.js"> +// <include src="ui/table/table.js"> // // <include src="../../../../webui/resources/js/cr/ui/grid.js"> //
diff --git a/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn b/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn index ba0c7d39..03b0eff 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn +++ b/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn
@@ -50,6 +50,12 @@ ":providers_menu", ":search_box", ":suggest_apps_dialog", + "table:table", + "table:table_column", + "table:table_column_model", + "table:table_header", + "table:table_list", + "table:table_splitter", ] } @@ -279,8 +285,8 @@ ":file_table_list", "..:file_list_model", "..:list_thumbnail_loader", + "table:table", "//ui/webui/resources/js:cr", - "//ui/webui/resources/js/cr/ui:table", ] externs_list = [ "../../../../externs/background/import_history.js" ] } @@ -298,9 +304,9 @@ ":file_tap_handler", "../../../common/js:file_type", "../metadata:metadata_model", + "table:table_list", "//ui/webui/resources/js/cr:ui", "//ui/webui/resources/js/cr/ui:list_selection_controller", - "//ui/webui/resources/js/cr/ui/table:table_list", ] }
diff --git a/ui/file_manager/file_manager/foreground/js/ui/table/BUILD.gn b/ui/file_manager/file_manager/foreground/js/ui/table/BUILD.gn new file mode 100644 index 0000000..04c89fe --- /dev/null +++ b/ui/file_manager/file_manager/foreground/js/ui/table/BUILD.gn
@@ -0,0 +1,52 @@ +# Copyright 2018 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("//third_party/closure_compiler/compile_js.gni") + +js_library("table_column") { + deps = [ + "//ui/webui/resources/js:cr", + "//ui/webui/resources/js/cr:event_target", + ] +} + +js_library("table") { + deps = [ + ":table_column_model", + ":table_header", + ":table_list", + "//ui/webui/resources/js/cr/ui:list", + "//ui/webui/resources/js/cr/ui:list_single_selection_model", + ] +} + +js_library("table_column_model") { + deps = [ + ":table_column", + "//ui/webui/resources/js:cr", + ] +} + +js_library("table_header") { + deps = [ + ":table_splitter", + "//ui/webui/resources/js:cr", + ] +} + +js_library("table_list") { + deps = [ + ":table_column_model", + "//ui/webui/resources/js:cr", + "//ui/webui/resources/js/cr/ui:list", + ] +} + +js_library("table_splitter") { + deps = [ + ":table_column_model", + "//ui/webui/resources/js:cr", + "//ui/webui/resources/js/cr/ui:splitter", + ] +}
diff --git a/ui/webui/resources/js/cr/ui/table.js b/ui/file_manager/file_manager/foreground/js/ui/table/table.js similarity index 100% rename from ui/webui/resources/js/cr/ui/table.js rename to ui/file_manager/file_manager/foreground/js/ui/table/table.js
diff --git a/ui/webui/resources/js/cr/ui/table/table_column.js b/ui/file_manager/file_manager/foreground/js/ui/table/table_column.js similarity index 100% rename from ui/webui/resources/js/cr/ui/table/table_column.js rename to ui/file_manager/file_manager/foreground/js/ui/table/table_column.js
diff --git a/ui/webui/resources/js/cr/ui/table/table_column_model.js b/ui/file_manager/file_manager/foreground/js/ui/table/table_column_model.js similarity index 100% rename from ui/webui/resources/js/cr/ui/table/table_column_model.js rename to ui/file_manager/file_manager/foreground/js/ui/table/table_column_model.js
diff --git a/ui/webui/resources/js/cr/ui/table/table_header.js b/ui/file_manager/file_manager/foreground/js/ui/table/table_header.js similarity index 100% rename from ui/webui/resources/js/cr/ui/table/table_header.js rename to ui/file_manager/file_manager/foreground/js/ui/table/table_header.js
diff --git a/ui/webui/resources/js/cr/ui/table/table_list.js b/ui/file_manager/file_manager/foreground/js/ui/table/table_list.js similarity index 100% rename from ui/webui/resources/js/cr/ui/table/table_list.js rename to ui/file_manager/file_manager/foreground/js/ui/table/table_list.js
diff --git a/ui/webui/resources/js/cr/ui/table/table_splitter.js b/ui/file_manager/file_manager/foreground/js/ui/table/table_splitter.js similarity index 100% rename from ui/webui/resources/js/cr/ui/table/table_splitter.js rename to ui/file_manager/file_manager/foreground/js/ui/table/table_splitter.js
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn index f1c69fa..4a2cf135 100644 --- a/ui/gl/BUILD.gn +++ b/ui/gl/BUILD.gn
@@ -498,7 +498,7 @@ deps += [ "//mojo/core/embedder", "//services/service_manager/public/cpp/test:test_support", - "//services/ws/public/mojom:constants", + "//services/viz/public/interfaces:constants", "//ui/ozone", ] }
diff --git a/ui/gl/gl_surface_glx.cc b/ui/gl/gl_surface_glx.cc index 0aa6892..cc92f623 100644 --- a/ui/gl/gl_surface_glx.cc +++ b/ui/gl/gl_surface_glx.cc
@@ -181,6 +181,20 @@ class SGIVideoSyncThread : public base::Thread, public base::RefCounted<SGIVideoSyncThread> { public: + // Create a connection to the X server for use on g_video_sync_thread before + // the sandbox starts. + static bool InitializeBeforeSandboxStarts() { + auto* display = GetDisplayImpl(); + if (!display) + return false; + + if (!CreateDummyWindow(display)) { + LOG(ERROR) << "CreateDummyWindow(display) failed"; + return false; + } + return true; + } + static scoped_refptr<SGIVideoSyncThread> Create() { if (!g_video_sync_thread) { g_video_sync_thread = new SGIVideoSyncThread(); @@ -189,6 +203,32 @@ return g_video_sync_thread; } + Display* GetDisplay() { + DCHECK(task_runner()->BelongsToCurrentThread()); + return GetDisplayImpl(); + } + + void MaybeCreateGLXContext(GLXFBConfig config) { + DCHECK(task_runner()->BelongsToCurrentThread()); + if (!context_) { + context_ = glXCreateNewContext(GetDisplay(), config, GLX_RGBA_TYPE, + nullptr, x11::True); + } + LOG_IF(ERROR, !context_) << "video_sync: glXCreateNewContext failed"; + } + + // Destroy |context_| on the thread where it is used. + void CleanUp() override { + DCHECK(task_runner()->BelongsToCurrentThread()); + if (context_) + glXDestroyContext(GetDisplay(), context_); + } + + GLXContext GetGLXContext() { + DCHECK(task_runner()->BelongsToCurrentThread()); + return context_; + } + private: friend class base::RefCounted<SGIVideoSyncThread>; @@ -202,7 +242,13 @@ Stop(); } + static Display* GetDisplayImpl() { + static Display* display = gfx::OpenNewXDisplay(); + return display; + } + static SGIVideoSyncThread* g_video_sync_thread; + GLXContext context_ = 0; THREAD_CHECKER(thread_checker_); @@ -211,8 +257,10 @@ class SGIVideoSyncProviderThreadShim { public: - explicit SGIVideoSyncProviderThreadShim(gfx::AcceleratedWidget parent_window) + SGIVideoSyncProviderThreadShim(gfx::AcceleratedWidget parent_window, + SGIVideoSyncThread* vsync_thread) : parent_window_(parent_window), + vsync_thread_(vsync_thread), window_(0), glx_window_(0), task_runner_(base::ThreadTaskRunnerHandle::Get()), @@ -223,12 +271,12 @@ XSync(gfx::GetXDisplay(), x11::False); } - virtual ~SGIVideoSyncProviderThreadShim() { + ~SGIVideoSyncProviderThreadShim() { if (glx_window_) - glXDestroyWindow(display_, glx_window_); + glXDestroyWindow(vsync_thread_->GetDisplay(), glx_window_); if (window_) - XDestroyWindow(display_, window_); + XDestroyWindow(vsync_thread_->GetDisplay(), window_); } base::CancellationFlag* cancel_vsync_flag() { return &cancel_vsync_flag_; } @@ -236,35 +284,31 @@ base::Lock* vsync_lock() { return &vsync_lock_; } void Initialize() { - DCHECK(display_); + DCHECK(vsync_thread_->GetDisplay()); - window_ = - XCreateWindow(display_, parent_window_, 0, 0, 1, 1, 0, CopyFromParent, - InputOutput, CopyFromParent, 0, nullptr); + window_ = XCreateWindow(vsync_thread_->GetDisplay(), parent_window_, 0, 0, + 1, 1, 0, CopyFromParent, InputOutput, + CopyFromParent, 0, nullptr); if (!window_) { LOG(ERROR) << "video_sync: XCreateWindow failed"; return; } - GLXFBConfig config = GetConfigForWindow(display_, window_); + GLXFBConfig config = + GetConfigForWindow(vsync_thread_->GetDisplay(), window_); if (!config) { LOG(ERROR) << "video_sync: Failed to get GLXConfig"; return; } - glx_window_ = glXCreateWindow(display_, config, window_, nullptr); + glx_window_ = + glXCreateWindow(vsync_thread_->GetDisplay(), config, window_, nullptr); if (!glx_window_) { LOG(ERROR) << "video_sync: glXCreateWindow failed"; return; } - // Create the context only once for all vsync providers. - if (!context_) { - context_ = glXCreateNewContext(display_, config, GLX_RGBA_TYPE, nullptr, - x11::True); - if (!context_) - LOG(ERROR) << "video_sync: glXCreateNewContext failed"; - } + vsync_thread_->MaybeCreateGLXContext(config); } void GetVSyncParameters(gfx::VSyncProvider::UpdateVSyncCallback callback) { @@ -273,10 +317,11 @@ // Don't allow |window_| destruction while we're probing vsync. base::AutoLock locked(vsync_lock_); - if (!context_ || cancel_vsync_flag_.IsSet()) + if (!vsync_thread_->GetGLXContext() || cancel_vsync_flag_.IsSet()) return; - glXMakeContextCurrent(display_, glx_window_, glx_window_, context_); + glXMakeContextCurrent(vsync_thread_->GetDisplay(), glx_window_, + glx_window_, vsync_thread_->GetGLXContext()); unsigned int retrace_count = 0; if (glXWaitVideoSyncSGI(1, 0, &retrace_count) != 0) @@ -285,7 +330,7 @@ TRACE_EVENT_INSTANT0("gpu", "vblank", TRACE_EVENT_SCOPE_THREAD); now = base::TimeTicks::Now(); - glXMakeContextCurrent(display_, 0, 0, nullptr); + glXMakeContextCurrent(vsync_thread_->GetDisplay(), 0, 0, nullptr); } const base::TimeDelta kDefaultInterval = @@ -296,18 +341,8 @@ } private: - // For initialization of display_ in GLSurface::InitializeOneOff before - // the sandbox goes up. - friend class gl::GLSurfaceGLX; - - // We only need one Display and GLXContext because we only use one thread for - // SGI_video_sync. The display is created in GLSurfaceGLX::InitializeOneOff - // and the context is created the first time a vsync provider is initialized. - static Display* display_; - static GLXContext context_; - gfx::AcceleratedWidget parent_window_; - + SGIVideoSyncThread* vsync_thread_; gfx::AcceleratedWidget window_; GLXWindow glx_window_; @@ -325,7 +360,8 @@ public: explicit SGIVideoSyncVSyncProvider(gfx::AcceleratedWidget parent_window) : vsync_thread_(SGIVideoSyncThread::Create()), - shim_(new SGIVideoSyncProviderThreadShim(parent_window)), + shim_(new SGIVideoSyncProviderThreadShim(parent_window, + vsync_thread_.get())), cancel_vsync_flag_(shim_->cancel_vsync_flag()), vsync_lock_(shim_->vsync_lock()) { vsync_thread_->task_runner()->PostTask( @@ -392,12 +428,6 @@ SGIVideoSyncThread* SGIVideoSyncThread::g_video_sync_thread = nullptr; -// In order to take advantage of GLX_SGI_video_sync, we need a display -// for use on a separate thread. We must allocate this before the sandbox -// goes up (rather than on-demand when we start the thread). -Display* SGIVideoSyncProviderThreadShim::display_ = nullptr; -GLXContext SGIVideoSyncProviderThreadShim::context_ = 0; - } // namespace bool GLSurfaceGLX::initialized_ = false; @@ -475,16 +505,8 @@ g_glx_sgi_video_sync_supported = HasGLXExtension("GLX_SGI_video_sync"); if (!g_glx_get_msc_rate_oml_supported && g_glx_sgi_video_sync_supported) { - Display* video_sync_display = gfx::OpenNewXDisplay(); - if (!video_sync_display) { - LOG(ERROR) << "Could not open video sync display"; + if (!SGIVideoSyncThread::InitializeBeforeSandboxStarts()) return false; - } - if (!CreateDummyWindow(video_sync_display)) { - LOG(ERROR) << "CreateDummyWindow(video_sync_display) failed"; - return false; - } - SGIVideoSyncProviderThreadShim::display_ = video_sync_display; } return true; }
diff --git a/ui/gl/test/DEPS b/ui/gl/test/DEPS index 589233e5..8330a13 100644 --- a/ui/gl/test/DEPS +++ b/ui/gl/test/DEPS
@@ -4,5 +4,5 @@ "+ui/platform_window/x11", "+mojo/core/embedder", "+services/service_manager/public", - "+services/ws/public", + "+services/viz/public", ]
diff --git a/ui/gl/test/run_all_unittests.cc b/ui/gl/test/run_all_unittests.cc index 505fdd08..b2a5de32 100644 --- a/ui/gl/test/run_all_unittests.cc +++ b/ui/gl/test/run_all_unittests.cc
@@ -21,7 +21,7 @@ #include "services/service_manager/public/cpp/service.h" // nogncheck #include "services/service_manager/public/cpp/service_binding.h" // nogncheck #include "services/service_manager/public/cpp/test/test_connector_factory.h" // nogncheck -#include "services/ws/public/mojom/constants.mojom.h" // nogncheck +#include "services/viz/public/interfaces/constants.mojom.h" // nogncheck #include "ui/ozone/public/ozone_platform.h" #endif @@ -69,10 +69,10 @@ base::test::ScopedTaskEnvironment::MainThreadType::UI); #if defined(USE_OZONE) - // OzonePlatform DRM implementation may attempt to connect to the ws service - // to acquire interfaces. + // OzonePlatform DRM implementation may attempt to connect to the viz + // service to acquire interfaces. service_ = std::make_unique<OzoneDrmTestService>( - connector_factory_.RegisterInstance(ws::mojom::kServiceName)); + connector_factory_.RegisterInstance(viz::mojom::kVizServiceName)); // Make Ozone run in single-process mode, where it doesn't expect a GPU // process and it spawns and starts its own DRM thread. Note that this mode
diff --git a/ui/native_theme/native_theme.cc b/ui/native_theme/native_theme.cc index 44e4aca4..bffca9c 100644 --- a/ui/native_theme/native_theme.cc +++ b/ui/native_theme/native_theme.cc
@@ -48,6 +48,10 @@ return is_dark_mode_; } +bool NativeTheme::SystemDarkModeSupported() const { + return false; +} + bool NativeTheme::UsesHighContrastColors() const { return is_high_contrast_; }
diff --git a/ui/native_theme/native_theme.h b/ui/native_theme/native_theme.h index b8a8872..6f37e30 100644 --- a/ui/native_theme/native_theme.h +++ b/ui/native_theme/native_theme.h
@@ -415,6 +415,9 @@ // Whether OS-level dark mode (as in macOS Mojave or Windows 10) is enabled. virtual bool SystemDarkModeEnabled() const; + // Whether OS-level dark mode is available in the current OS. + virtual bool SystemDarkModeSupported() const; + // Returns the system's caption style. virtual CaptionStyle GetSystemCaptionStyle() const;
diff --git a/ui/native_theme/native_theme_mac.h b/ui/native_theme/native_theme_mac.h index cad6079..817bb7c 100644 --- a/ui/native_theme/native_theme_mac.h +++ b/ui/native_theme/native_theme_mac.h
@@ -49,6 +49,7 @@ State state, const gfx::Rect& rect, const MenuItemExtraParams& menu_item) const override; + bool SystemDarkModeSupported() const override; // Paints the styled button shape used for default controls on Mac. The basic // style is used for dialog buttons, comboboxes, and tabbed pane tabs.
diff --git a/ui/native_theme/native_theme_mac.mm b/ui/native_theme/native_theme_mac.mm index 9881259e..f2ea606 100644 --- a/ui/native_theme/native_theme_mac.mm +++ b/ui/native_theme/native_theme_mac.mm
@@ -266,6 +266,13 @@ } } +bool NativeThemeMac::SystemDarkModeSupported() const { + if (@available(macOS 10.14, *)) { + return true; + } + return false; +} + NativeThemeMac::NativeThemeMac() { InitializeDarkModeStateAndObserver();
diff --git a/ui/native_theme/native_theme_win.cc b/ui/native_theme/native_theme_win.cc index 4cc71da..ed5b1ef 100644 --- a/ui/native_theme/native_theme_win.cc +++ b/ui/native_theme/native_theme_win.cc
@@ -593,6 +593,10 @@ return NativeTheme::SystemDarkModeEnabled(); } +bool NativeThemeWin::SystemDarkModeSupported() const { + return hkcu_themes_regkey_.Valid(); +} + void NativeThemeWin::PaintIndirect(cc::PaintCanvas* destination_canvas, Part part, State state,
diff --git a/ui/native_theme/native_theme_win.h b/ui/native_theme/native_theme_win.h index cabb8bc..6794de1d 100644 --- a/ui/native_theme/native_theme_win.h +++ b/ui/native_theme/native_theme_win.h
@@ -81,6 +81,7 @@ gfx::Size GetNinePatchCanvasSize(Part part) const override; gfx::Rect GetNinePatchAperture(Part part) const override; bool SystemDarkModeEnabled() const override; + bool SystemDarkModeSupported() const override; protected: friend class NativeTheme;
diff --git a/ui/ozone/platform/drm/BUILD.gn b/ui/ozone/platform/drm/BUILD.gn index d95bd9b7..0770d56 100644 --- a/ui/ozone/platform/drm/BUILD.gn +++ b/ui/ozone/platform/drm/BUILD.gn
@@ -130,7 +130,6 @@ "//mojo/public/cpp/system", "//services/service_manager/public/cpp", "//services/viz/public/interfaces:constants", - "//services/ws/public/mojom:constants", "//skia", "//third_party/libsync", "//third_party/minigbm",
diff --git a/ui/ozone/platform/drm/DEPS b/ui/ozone/platform/drm/DEPS index 6eafbc9..0cf49b437 100644 --- a/ui/ozone/platform/drm/DEPS +++ b/ui/ozone/platform/drm/DEPS
@@ -2,7 +2,6 @@ "+mojo/public", "+services/service_manager", "+services/viz/public/interfaces", - "+services/ws/public/mojom", "+ui/base/buildflags.h", # Doesn't bring in all of ui/base. "+ui/base/ui_base_features.h", "+ui/base/ui_base_switches.h",
diff --git a/ui/ozone/platform/drm/ozone_platform_gbm.cc b/ui/ozone/platform/drm/ozone_platform_gbm.cc index c35ea84..b451e778 100644 --- a/ui/ozone/platform/drm/ozone_platform_gbm.cc +++ b/ui/ozone/platform/drm/ozone_platform_gbm.cc
@@ -18,7 +18,6 @@ #include "base/threading/thread_task_runner_handle.h" #include "services/service_manager/public/cpp/binder_registry.h" #include "services/viz/public/interfaces/constants.mojom.h" -#include "services/ws/public/mojom/constants.mojom.h" #include "ui/base/buildflags.h" #include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h" #include "ui/events/ozone/device/device_manager.h" @@ -224,12 +223,9 @@ GpuThreadAdapter* adapter; if (using_mojo_) { - const std::string& service_name = single_process_ - ? ws::mojom::kServiceName - : viz::mojom::kVizServiceName; host_drm_device_ = base::MakeRefCounted<HostDrmDevice>(cursor_.get()); drm_device_connector_ = std::make_unique<DrmDeviceConnector>( - args.connector, service_name, host_drm_device_); + args.connector, viz::mojom::kVizServiceName, host_drm_device_); adapter = host_drm_device_.get(); } else { gpu_platform_support_host_.reset(
diff --git a/ui/views/accessibility/ax_tree_source_views.cc b/ui/views/accessibility/ax_tree_source_views.cc index 1cb8e7cf..a7512e2 100644 --- a/ui/views/accessibility/ax_tree_source_views.cc +++ b/ui/views/accessibility/ax_tree_source_views.cc
@@ -99,6 +99,10 @@ return parent; } +bool AXTreeSourceViews::IsIgnored(AXAuraObjWrapper* node) const { + return node && node->IsIgnored(); +} + bool AXTreeSourceViews::IsValid(AXAuraObjWrapper* node) const { return node && !node->IsIgnored(); }
diff --git a/ui/views/accessibility/ax_tree_source_views.h b/ui/views/accessibility/ax_tree_source_views.h index 12d1f3b5..d7256c6d 100644 --- a/ui/views/accessibility/ax_tree_source_views.h +++ b/ui/views/accessibility/ax_tree_source_views.h
@@ -46,6 +46,7 @@ void GetChildren(AXAuraObjWrapper* node, std::vector<AXAuraObjWrapper*>* out_children) const override; AXAuraObjWrapper* GetParent(AXAuraObjWrapper* node) const override; + bool IsIgnored(AXAuraObjWrapper* node) const override; bool IsValid(AXAuraObjWrapper* node) const override; bool IsEqual(AXAuraObjWrapper* node1, AXAuraObjWrapper* node2) const override; AXAuraObjWrapper* GetNull() const override;
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.cc b/ui/views/bubble/bubble_dialog_delegate_view.cc index 96d3642..b938db3 100644 --- a/ui/views/bubble/bubble_dialog_delegate_view.cc +++ b/ui/views/bubble/bubble_dialog_delegate_view.cc
@@ -162,7 +162,7 @@ frame->set_footnote_margins( provider->GetInsetsMetric(INSETS_DIALOG_SUBSECTION)); - frame->SetFootnoteView(CreateFootnoteView()); + frame->SetFootnoteView(CreateFootnoteView().release()); std::unique_ptr<BubbleBorder> border = std::make_unique<BubbleBorder>(arrow(), GetShadow(), color());
diff --git a/ui/views/corewm/tooltip_controller_unittest.cc b/ui/views/corewm/tooltip_controller_unittest.cc index 96851116..600f6bde 100644 --- a/ui/views/corewm/tooltip_controller_unittest.cc +++ b/ui/views/corewm/tooltip_controller_unittest.cc
@@ -629,7 +629,7 @@ std::unique_ptr<ui::test::EventGenerator> generator_; private: - // Needed to make sure the InputDeviceManager is cleaned up between test runs. + // Needed to make sure the DeviceDataManager is cleaned up between test runs. std::unique_ptr<base::ShadowingAtExitManager> at_exit_manager_; std::unique_ptr<TooltipController> controller_;
diff --git a/ui/views/examples/widget_example.cc b/ui/views/examples/widget_example.cc index 2ee82e2..5429fe6 100644 --- a/ui/views/examples/widget_example.cc +++ b/ui/views/examples/widget_example.cc
@@ -29,7 +29,7 @@ ~WidgetDialogExample() override; base::string16 GetWindowTitle() const override; std::unique_ptr<View> CreateExtraView() override; - View* CreateFootnoteView() override; + std::unique_ptr<View> CreateFootnoteView() override; }; class ModalDialogExample : public WidgetDialogExample { @@ -62,8 +62,8 @@ return view; } -View* WidgetDialogExample::CreateFootnoteView() { - return new Label(ASCIIToUTF16("Footnote label!")); +std::unique_ptr<View> WidgetDialogExample::CreateFootnoteView() { + return std::make_unique<Label>(ASCIIToUTF16("Footnote label!")); } } // namespace
diff --git a/ui/views/window/dialog_delegate.cc b/ui/views/window/dialog_delegate.cc index 54dacf74f..7553b45 100644 --- a/ui/views/window/dialog_delegate.cc +++ b/ui/views/window/dialog_delegate.cc
@@ -130,7 +130,7 @@ return false; } -View* DialogDelegate::CreateFootnoteView() { +std::unique_ptr<View> DialogDelegate::CreateFootnoteView() { return nullptr; } @@ -229,7 +229,7 @@ ? provider->GetCornerRadiusMetric(views::EMPHASIS_HIGH) : 2); } - frame->SetFootnoteView(delegate->CreateFootnoteView()); + frame->SetFootnoteView(delegate->CreateFootnoteView().release()); } frame->SetBubbleBorder(std::move(border)); return frame;
diff --git a/ui/views/window/dialog_delegate.h b/ui/views/window/dialog_delegate.h index 67fbab6a..114e1f97 100644 --- a/ui/views/window/dialog_delegate.h +++ b/ui/views/window/dialog_delegate.h
@@ -80,7 +80,7 @@ // Override this function to display a footnote view below the buttons. // Overrides may construct the view; this will only be called once per dialog. - virtual View* CreateFootnoteView(); + virtual std::unique_ptr<View> CreateFootnoteView(); // For Dialog boxes, if there is a "Cancel" button or no dialog button at all, // this is called when the user presses the "Cancel" button.
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js index 8545122..b8455ca 100644 --- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js +++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js
@@ -207,6 +207,7 @@ case PageName.START: if (this.delegate.isPasswordRequiredToSetHost()) { this.visiblePageName = PageName.PASSWORD; + this.$$('password-page').focusPasswordTextInput(); } else { this.setHostDevice_(); }
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.html b/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.html index a12f238..428fe3f8 100644 --- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.html +++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.html
@@ -41,8 +41,7 @@ error-message="[[i18nDynamic(locale, 'wrongPassword')]]" value="{{inputValue_}}" aria-disabled="false" - on-keypress="onInputKeypress_" - autofocus> + on-keypress="onInputKeypress_"> </cr-input> </div> </ui-page>
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.js b/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.js index 8f73387..5470159d 100644 --- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.js +++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.js
@@ -96,6 +96,10 @@ this.$.passwordInput.value = ''; }, + focusPasswordTextInput: function() { + this.$.passwordInput.focus(); + }, + /** @override */ created: function() { this.browserProxy_ = multidevice_setup.BrowserProxyImpl.getInstance();
diff --git a/ui/webui/resources/js/cr/ui/BUILD.gn b/ui/webui/resources/js/cr/ui/BUILD.gn index a855424..e860195 100644 --- a/ui/webui/resources/js/cr/ui/BUILD.gn +++ b/ui/webui/resources/js/cr/ui/BUILD.gn
@@ -39,7 +39,6 @@ ":splitter", ":store", ":store_client", - ":table", ":tabs", ":tree", ] @@ -257,16 +256,6 @@ ] } -js_library("table") { - deps = [ - ":list", - ":list_single_selection_model", - "table:table_column_model", - "table:table_header", - "table:table_list", - ] -} - js_library("tabs") { deps = [ ":focus_outline_manager",
diff --git a/ui/webui/resources/js/cr/ui/table/BUILD.gn b/ui/webui/resources/js/cr/ui/table/BUILD.gn deleted file mode 100644 index 95a7d16..0000000 --- a/ui/webui/resources/js/cr/ui/table/BUILD.gn +++ /dev/null
@@ -1,42 +0,0 @@ -# Copyright 2018 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("//third_party/closure_compiler/compile_js.gni") - -js_library("table_column") { - deps = [ - "../..:event_target", - "../../..:cr", - ] -} - -js_library("table_column_model") { - deps = [ - ":table_column", - "../../..:cr", - ] -} - -js_library("table_header") { - deps = [ - ":table_splitter", - "../../..:cr", - ] -} - -js_library("table_list") { - deps = [ - ":table_column_model", - "..:list", - "../../..:cr", - ] -} - -js_library("table_splitter") { - deps = [ - ":table_column_model", - "..:splitter", - "../../..:cr", - ] -}