diff --git a/DEPS b/DEPS index 902630cd..5c114093 100644 --- a/DEPS +++ b/DEPS
@@ -181,11 +181,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': '1d457b7d9533d229dc1d22d0768878f0e468bf36', + 'skia_revision': 'f5bc8fba95737140784435f5f6e22aaa0ce0340b', # 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': '1c30f07c92a6ad9849ce0da9d8e8602827314ab4', + 'v8_revision': 'b6f9b1b907ddcae6b920e1b1ee3701ad76715f3f', # 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. @@ -193,11 +193,11 @@ # 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': 'c431d59626e1e878022703f79585fddae8c0cfe7', + 'angle_revision': '1c40e03a42159c54b6be655eabac7fb39f2aaef6', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '77c89ff847b623b76f8b559562dc4b8f767a621f', + 'swiftshader_revision': '73bcece48b0c7dd52b8577c982284974a1f9a7a9', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. @@ -244,7 +244,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '52175631d301a98a7c0580343d5e6771fe0f5fb0', + 'catapult_revision': '85c4a438f6f1a86137b109db6b6283d1f084f2be', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -252,7 +252,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': 'b629ec3917dad4e715ef4db128f7838e3e0fb3ed', + 'devtools_frontend_revision': '6a46fc9f347cf62a9ddc36aaeed1a1eea1699271', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -690,7 +690,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_build_tools/aapt2', - 'version': 'by7YdhjwRQYtrv0Q_q_fPsqptrm5ib-SXmiNfgJYp50C', + 'version': 'TM6ESkOFwhdEwjsIxbY3m6j7BIhg8mpY_X9Pg0nwb1AC', }, ], 'condition': 'checkout_android', @@ -894,7 +894,7 @@ # For Linux and Chromium OS. 'src/third_party/cros_system_api': { - 'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + 'cdae7443f8cf261d8b078d5294ce89c841598172', + 'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + 'e831a312c4ab87704a1139852c276797c47f7e4a', 'condition': 'checkout_linux', }, @@ -1297,7 +1297,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '9553930c2093fd36cd79e2756294cec2e55bd624', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '0e2896bef11409b1a02ad0ca4601da00230733f0', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1498,7 +1498,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '88d715c9115a5ce65c0bf660209dfeee9131ccd0', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '293d46c31c84ba4e8841b0ec3ed0156ec499e353', + Var('webrtc_git') + '/src.git' + '@' + '26e1b7ac01757895a6edf198362a4405c7edc79e', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1568,7 +1568,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@72cd27a2044107c376e5f85a2cbd22c986d6cb5e', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@4d4d40b08d201865b6a02e74a97d6b6284239dac', 'condition': 'checkout_src_internal', },
diff --git a/base/android/java/src/org/chromium/base/process_launcher/ChildConnectionAllocator.java b/base/android/java/src/org/chromium/base/process_launcher/ChildConnectionAllocator.java index c460b31..b8d77d3b 100644 --- a/base/android/java/src/org/chromium/base/process_launcher/ChildConnectionAllocator.java +++ b/base/android/java/src/org/chromium/base/process_launcher/ChildConnectionAllocator.java
@@ -56,6 +56,15 @@ // Delay between the call to freeConnection and the connection actually beeing freed. private static final long FREE_CONNECTION_DELAY_MILLIS = 1; + // Max number of connections allocated for variable allocator. + private static final int MAX_VARIABLE_ALLOCATED = 100; + + // Runnable which will be called when allocator wants to allocate a new connection, but does + // not have any more free slots. May be null. + private final Runnable mFreeSlotCallback; + + private final Queue<Runnable> mPendingAllocations = new ArrayDeque<>(); + // The handler of the thread on which all interations should happen. private final Handler mLauncherHandler; @@ -112,11 +121,13 @@ } public static ChildConnectionAllocator createVariableSize(Context context, - Handler launcherHandler, String packageName, String serviceClassName, - boolean bindToCaller, boolean bindAsExternalService, boolean useStrongBinding) { + Handler launcherHandler, Runnable freeSlotCallback, String packageName, + String serviceClassName, boolean bindToCaller, boolean bindAsExternalService, + boolean useStrongBinding) { checkServiceExists(context, packageName, serviceClassName); - return new VariableSizeAllocatorImpl(launcherHandler, packageName, serviceClassName, - bindToCaller, bindAsExternalService, useStrongBinding); + return new VariableSizeAllocatorImpl(launcherHandler, freeSlotCallback, packageName, + serviceClassName, bindToCaller, bindAsExternalService, useStrongBinding, + MAX_VARIABLE_ALLOCATED); } /** @@ -134,17 +145,20 @@ @VisibleForTesting public static VariableSizeAllocatorImpl createVariableSizeForTesting(Handler launcherHandler, - String packageName, String serviceClassName, boolean bindToCaller, - boolean bindAsExternalService, boolean useStrongBinding) { - return new VariableSizeAllocatorImpl(launcherHandler, packageName, serviceClassName + "0", - bindToCaller, bindAsExternalService, useStrongBinding); + String packageName, Runnable freeSlotCallback, String serviceClassName, + boolean bindToCaller, boolean bindAsExternalService, boolean useStrongBinding, + int maxAllocated) { + return new VariableSizeAllocatorImpl(launcherHandler, freeSlotCallback, packageName, + serviceClassName + "0", bindToCaller, bindAsExternalService, useStrongBinding, + maxAllocated); } - private ChildConnectionAllocator(Handler launcherHandler, String packageName, - String serviceClassName, boolean bindToCaller, boolean bindAsExternalService, - boolean useStrongBinding) { + private ChildConnectionAllocator(Handler launcherHandler, Runnable freeSlotCallback, + String packageName, String serviceClassName, boolean bindToCaller, + boolean bindAsExternalService, boolean useStrongBinding) { mLauncherHandler = launcherHandler; assert isRunningOnLauncherThread(); + mFreeSlotCallback = freeSlotCallback; mPackageName = packageName; mServiceClassName = serviceClassName; mBindToCaller = bindToCaller; @@ -232,15 +246,19 @@ private void free(ChildProcessConnection connection) { assert isRunningOnLauncherThread(); doFree(connection); + + if (mPendingAllocations.isEmpty()) return; + mPendingAllocations.remove().run(); + if (!mPendingAllocations.isEmpty() && mFreeSlotCallback != null) { + mFreeSlotCallback.run(); + } } - // Can only be called once all slots are full, ie when allocate returns null. Note - // this should not be called in if created with createVariableSize. - // The callback will be called when a slot becomes free, and should synchronous call - // allocate to take the slot. - public void queueAllocation(Runnable runnable) { + public final void queueAllocation(Runnable runnable) { assert isRunningOnLauncherThread(); - doQueueAllocation(runnable); + boolean wasEmpty = mPendingAllocations.isEmpty(); + mPendingAllocations.add(runnable); + if (wasEmpty && mFreeSlotCallback != null) mFreeSlotCallback.run(); } /** May return -1 if size is not fixed. */ @@ -264,30 +282,22 @@ /* package */ abstract ChildProcessConnection doAllocate(Context context, Bundle serviceBundle); /* package */ abstract void doFree(ChildProcessConnection connection); - /* package */ abstract void doQueueAllocation(Runnable runnable); /** Implementation class accessed directly by tests. */ @VisibleForTesting public static class FixedSizeAllocatorImpl extends ChildConnectionAllocator { - // Runnable which will be called when allocator wants to allocate a new connection, but does - // not have any more free slots. May be null. - private final Runnable mFreeSlotCallback; - // Connections to services. Indices of the array correspond to the service numbers. private final ChildProcessConnection[] mChildProcessConnections; // The list of free (not bound) service indices. private final ArrayList<Integer> mFreeConnectionIndices; - private final Queue<Runnable> mPendingAllocations = new ArrayDeque<>(); - private FixedSizeAllocatorImpl(Handler launcherHandler, Runnable freeSlotCallback, String packageName, String serviceClassName, boolean bindToCaller, boolean bindAsExternalService, boolean useStrongBinding, int numChildServices) { - super(launcherHandler, packageName, serviceClassName, bindToCaller, + super(launcherHandler, freeSlotCallback, packageName, serviceClassName, bindToCaller, bindAsExternalService, useStrongBinding); - mFreeSlotCallback = freeSlotCallback; mChildProcessConnections = new ChildProcessConnection[numChildServices]; mFreeConnectionIndices = new ArrayList<Integer>(numChildServices); @@ -330,21 +340,11 @@ Log.d(TAG, "Allocator freed a connection, name: %s, slot: %d", mServiceClassName, slot); } - - if (mPendingAllocations.isEmpty()) return; - mPendingAllocations.remove().run(); - assert mFreeConnectionIndices.isEmpty(); - if (!mPendingAllocations.isEmpty() && mFreeSlotCallback != null) { - mFreeSlotCallback.run(); - } } - @Override - /* package */ void doQueueAllocation(Runnable runnable) { - assert mFreeConnectionIndices.isEmpty(); - boolean wasEmpty = mPendingAllocations.isEmpty(); - mPendingAllocations.add(runnable); - if (wasEmpty && mFreeSlotCallback != null) mFreeSlotCallback.run(); + @VisibleForTesting + public boolean isFreeConnectionAvailable() { + return !mFreeConnectionIndices.isEmpty(); } @Override @@ -362,11 +362,6 @@ return mChildProcessConnections[slotNumber]; } - @VisibleForTesting - public boolean isFreeConnectionAvailable() { - return !mFreeConnectionIndices.isEmpty(); - } - @Override public boolean anyConnectionAllocated() { return mFreeConnectionIndices.size() < mChildProcessConnections.length; @@ -375,6 +370,7 @@ @VisibleForTesting /* package */ static class VariableSizeAllocatorImpl extends ChildConnectionAllocator { + private final int mMaxAllocated; private final ArraySet<ChildProcessConnection> mAllocatedConnections = new ArraySet<>(); private int mNextInstance; @@ -394,15 +390,22 @@ return "0"; } - private VariableSizeAllocatorImpl(Handler launcherHandler, String packageName, - String serviceClassName, boolean bindToCaller, boolean bindAsExternalService, - boolean useStrongBinding) { - super(launcherHandler, packageName, serviceClassName + getServiceSuffix(), bindToCaller, - bindAsExternalService, useStrongBinding); + private VariableSizeAllocatorImpl(Handler launcherHandler, Runnable freeSlotCallback, + String packageName, String serviceClassName, boolean bindToCaller, + boolean bindAsExternalService, boolean useStrongBinding, int maxAllocated) { + super(launcherHandler, freeSlotCallback, packageName, + serviceClassName + getServiceSuffix(), bindToCaller, bindAsExternalService, + useStrongBinding); + assert maxAllocated > 0; + mMaxAllocated = maxAllocated; } @Override /* package */ ChildProcessConnection doAllocate(Context context, Bundle serviceBundle) { + if (mAllocatedConnections.size() >= mMaxAllocated) { + Log.d(TAG, "Ran out of UIDs to allocate."); + return null; + } ComponentName serviceName = new ComponentName(mPackageName, mServiceClassName); String instanceName = Integer.toString(mNextInstance); mNextInstance++; @@ -420,11 +423,6 @@ } @Override - /* package */ void doQueueAllocation(Runnable runnable) { - assert false; - } - - @Override public int getNumberOfServices() { return -1; }
diff --git a/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java b/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java index 64a31a22..599fd0e 100644 --- a/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java +++ b/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java
@@ -149,8 +149,9 @@ mAllocator.setConnectionFactoryForTesting(mTestConnectionFactory); mVariableSizeAllocator = ChildConnectionAllocator.createVariableSizeForTesting( - new Handler(), TEST_PACKAGE_NAME, "AllocatorTest", true /* bindTocall */, - false /* bindAsExternalService */, false /* useStrongBinding */); + new Handler(), TEST_PACKAGE_NAME, null /* freeSlotCallback */, "AllocatorTest", + true /* bindTocall */, false /* bindAsExternalService */, + false /* useStrongBinding */, 10); mVariableSizeAllocator.setConnectionFactoryForTesting(mTestConnectionFactory); } @@ -196,24 +197,40 @@ mAllocator = ChildConnectionAllocator.createFixedForTesting(freeConnectionCallback, TEST_PACKAGE_NAME, "AllocatorTest", 1, true /* bindToCaller */, false /* bindAsExternalService */, false /* useStrongBinding */); - mAllocator.setConnectionFactoryForTesting(mTestConnectionFactory); + doTestQueueAllocation(mAllocator, freeConnectionCallback); + } + + @Test + @Feature({"ProcessManagement"}) + public void testQueueAllocationVariableSize() { + Runnable freeConnectionCallback = mock(Runnable.class); + mVariableSizeAllocator = ChildConnectionAllocator.createVariableSizeForTesting( + new Handler(), TEST_PACKAGE_NAME, freeConnectionCallback, "AllocatorTest", + true /* bindToCaller */, false /* bindAsExternalService */, + false /* useStrongBinding */, 1); + doTestQueueAllocation(mVariableSizeAllocator, freeConnectionCallback); + } + + private void doTestQueueAllocation( + ChildConnectionAllocator allocator, Runnable freeConnectionCallback) { + allocator.setConnectionFactoryForTesting(mTestConnectionFactory); // Occupy all slots. ChildProcessConnection connection = - mAllocator.allocate(null /* context */, null /* serviceBundle */, mServiceCallback); + allocator.allocate(null /* context */, null /* serviceBundle */, mServiceCallback); assertNotNull(connection); - assertFalse(mAllocator.isFreeConnectionAvailable()); + assertEquals(1, allocator.allocatedConnectionsCountForTesting()); final ChildProcessConnection newConnection[] = new ChildProcessConnection[2]; Runnable allocate1 = () -> { - newConnection[0] = mAllocator.allocate( + newConnection[0] = allocator.allocate( null /* context */, null /* serviceBundle */, mServiceCallback); }; Runnable allocate2 = () -> { - newConnection[1] = mAllocator.allocate( + newConnection[1] = allocator.allocate( null /* context */, null /* serviceBundle */, mServiceCallback); }; - mAllocator.queueAllocation(allocate1); - mAllocator.queueAllocation(allocate2); + allocator.queueAllocation(allocate1); + allocator.queueAllocation(allocate2); verify(freeConnectionCallback, times(1)).run(); assertNull(newConnection[0]);
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py index 2d4b96d..c1ddee3 100755 --- a/build/android/gyp/compile_resources.py +++ b/build/android/gyp/compile_resources.py
@@ -844,13 +844,13 @@ config.write('{}#no_obfuscate\n'.format(resource)) optimize_command += [ - '--enable-resource-obfuscation', + '--collapse-resource-names', '--resources-config-path', gen_config_path, ] if options.short_resource_paths: - optimize_command += ['--enable-resource-path-shortening'] + optimize_command += ['--shorten-resource-paths'] if options.resources_path_map_out_path: optimize_command += [ '--resource-path-shortening-map', options.resources_path_map_out_path
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 1b0218d..e9c3fe57 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -8891801759347717888 \ No newline at end of file +8891760011566027456 \ No newline at end of file
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index 3d1102aa..9fee4fd1 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -224,6 +224,7 @@ "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabBarControl.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCaptionControl.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java", + "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabSheetContent.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabTitleControl.java", @@ -1393,7 +1394,6 @@ "java/src/org/chromium/chrome/browser/settings/autofill/AutofillServerCardEditor.java", "java/src/org/chromium/chrome/browser/settings/autofill/AutofillServerProfileFragment.java", "java/src/org/chromium/chrome/browser/settings/autofill/CreditCardNumberFormattingTextWatcher.java", - "java/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettings.java", "java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionDataUseItem.java", "java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionPreferenceFragment.java", "java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionSiteBreakdownView.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index 5e16b9ed..d575736 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -411,7 +411,6 @@ "javatests/src/org/chromium/chrome/browser/settings/accessibility/AccessibilitySettingsTest.java", "javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillProfilesFragmentTest.java", "javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillTestRule.java", - "javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettingsTest.java", "javatests/src/org/chromium/chrome/browser/settings/datareduction/DataReductionStatsPreferenceTest.java", "javatests/src/org/chromium/chrome/browser/settings/developer/TracingSettingsTest.java", "javatests/src/org/chromium/chrome/browser/settings/notifications/NotificationsSettingsTest.java",
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java index 2990301b..c85512841 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java +++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java
@@ -16,7 +16,7 @@ import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip; import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChipViewHolder; import org.chromium.chrome.browser.settings.SettingsLauncher; -import org.chromium.chrome.browser.settings.autofill_assistant.AutofillAssistantSettings; +import org.chromium.chrome.browser.settings.sync.SyncAndServicesPreferences; import org.chromium.chrome.browser.ui.widget.textbubble.TextBubble; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; @@ -142,7 +142,7 @@ int itemId = item.getItemId(); if (itemId == R.id.settings) { SettingsLauncher.launchSettingsPage( - view.mHeader.getContext(), AutofillAssistantSettings.class); + view.mHeader.getContext(), SyncAndServicesPreferences.class); return true; } else if (itemId == R.id.send_feedback) { if (feedbackCallback != null) {
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java index c529ed8..dbfd567a 100644 --- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java +++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
@@ -7,9 +7,10 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.ContextUtils; -import org.chromium.chrome.browser.settings.autofill_assistant.AutofillAssistantSettings; +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; /** Autofill Assistant related preferences util class. */ +@SuppressWarnings("UseSharedPreferencesManagerFromChromeCheck") class AutofillAssistantPreferencesUtil { // Avoid instatiation by accident. private AutofillAssistantPreferencesUtil() {} @@ -26,7 +27,7 @@ /** Checks whether the Autofill Assistant switch preference in settings is on. */ static boolean isAutofillAssistantSwitchOn() { return ContextUtils.getAppSharedPreferences().getBoolean( - AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH, true); + ChromePreferenceKeys.AUTOFILL_ASSISTANT_ENABLED, true); } /** Checks whether the Autofill Assistant onboarding has been accepted. */ @@ -53,7 +54,7 @@ static void setInitialPreferences(boolean accept) { ContextUtils.getAppSharedPreferences() .edit() - .putBoolean(AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH, accept) + .putBoolean(ChromePreferenceKeys.AUTOFILL_ASSISTANT_ENABLED, accept) .apply(); ContextUtils.getAppSharedPreferences() .edit()
diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml index 5ab37eb..d9e55c1 100644 --- a/chrome/android/java/res/xml/main_preferences.xml +++ b/chrome/android/java/res/xml/main_preferences.xml
@@ -45,70 +45,65 @@ android:key="autofill_addresses" android:order="7" android:title="@string/autofill_addresses_settings_title"/> - <org.chromium.chrome.browser.settings.ChromeBasePreference - android:fragment="org.chromium.chrome.browser.settings.autofill_assistant.AutofillAssistantSettings" - android:key="autofill_assistant" - android:order="8" - android:title="@string/prefs_autofill_assistant_title"/> <Preference android:fragment="org.chromium.chrome.browser.settings.notifications.NotificationsSettings" android:key="notifications" - android:order="9" + android:order="8" android:title="@string/prefs_notifications"/> <Preference android:fragment="org.chromium.chrome.browser.settings.homepage.HomepageSettings" android:key="homepage" - android:order="10" + android:order="9" android:title="@string/options_homepage_title"/> <Preference android:fragment="org.chromium.chrome.browser.settings.themes.ThemeSettingsFragment" android:key="ui_theme" - android:order="11" + android:order="10" android:title="@string/theme_settings" /> <PreferenceCategory android:key="advanced_section" - android:order="12" + android:order="11" android:title="@string/prefs_section_advanced"/> <Preference android:fragment="org.chromium.chrome.browser.settings.privacy.PrivacySettings" android:key="privacy" - android:order="13" + android:order="12" android:title="@string/prefs_privacy"/> <Preference android:fragment="org.chromium.chrome.browser.settings.accessibility.AccessibilitySettings" android:key="accessibility" - android:order="14" + android:order="13" android:title="@string/prefs_accessibility"/> <Preference android:fragment="org.chromium.chrome.browser.settings.website.SiteSettings" android:key="content_settings" - android:order="15" + android:order="14" android:title="@string/prefs_site_settings"/> <Preference android:fragment="org.chromium.chrome.browser.settings.languages.LanguageSettings" android:key="languages" - android:order="16" + android:order="15" android:title="@string/language_settings"/> <org.chromium.chrome.browser.settings.ChromeBasePreference android:fragment="org.chromium.chrome.browser.settings.datareduction.DataReductionPreferenceFragment" android:key="data_reduction" - android:order="17" + android:order="16" android:title="@string/data_reduction_title_lite_mode"/> <org.chromium.chrome.browser.settings.ChromeBasePreference android:fragment="org.chromium.chrome.browser.settings.download.DownloadSettings" android:key="downloads" - android:order="18" + android:order="17" android:title="@string/menu_downloads"/> <Preference android:fragment="org.chromium.chrome.browser.settings.developer.DeveloperSettings" android:key="developer" - android:order="19" + android:order="18" android:title="Developer options"/> <Preference android:fragment="org.chromium.chrome.browser.settings.about.AboutChromeSettings" android:key="about_chrome" - android:order="20" + android:order="19" android:title="@string/prefs_about_chrome"/> </PreferenceScreen>
diff --git a/chrome/android/java/res/xml/sync_and_services_preferences.xml b/chrome/android/java/res/xml/sync_and_services_preferences.xml index c082183..7c5a7c4 100644 --- a/chrome/android/java/res/xml/sync_and_services_preferences.xml +++ b/chrome/android/java/res/xml/sync_and_services_preferences.xml
@@ -79,6 +79,11 @@ android:title="@string/url_keyed_anonymized_data_title" android:summary="@string/url_keyed_anonymized_data_summary" android:persistent="false"/> + <org.chromium.chrome.browser.settings.ChromeSwitchPreference + android:key="autofill_assistant" + android:title="@string/prefs_autofill_assistant_title" + android:summary="@string/prefs_autofill_assistant_summary" + android:persistent="false"/> <org.chromium.chrome.browser.settings.ChromeBasePreference android:key="contextual_search" android:title="@string/contextual_search_title"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index 603cad0..54adc1c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -672,10 +672,16 @@ } }; OnClickListener newTabClickHandler = v -> { - getTabModelSelector().getModel(false).commitAllTabClosures(); - // This assumes that the keyboard can not be seen at the same time as the - // newtab button on the toolbar. - getCurrentTabCreator().launchNTP(); + // If Start Surface should be shown as the home page, show the start surface home + // page. + if (ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage()) { + showOverview(OverviewModeState.SHOWING_HOMEPAGE); + } else { + getTabModelSelector().getModel(false).commitAllTabClosures(); + // This assumes that the keyboard can not be seen at the same time as the + // newtab button on the toolbar. + getCurrentTabCreator().launchNTP(); + } mLocaleManager.showSearchEnginePromoIfNeeded(ChromeTabbedActivity.this, null); if (getTabModelSelector().isIncognitoSelected()) { RecordUserAction.record("MobileToolbarStackViewNewIncognitoTab"); @@ -1686,7 +1692,14 @@ RecordUserAction.record("MobileNewTabOpened"); reportNewTabShortcutUsed(false); if (fromMenu) RecordUserAction.record("MobileMenuNewTab.AppMenu"); - getTabCreator(false).launchNTP(); + + // If Start Surface should be shown as the home page, show the start surface home page. + if (ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage()) { + getTabModelSelector().selectModel(false); + showOverview(OverviewModeState.SHOWING_HOMEPAGE); + } else { + getTabCreator(false).launchNTP(); + } mLocaleManager.showSearchEnginePromoIfNeeded(this, null); } else if (id == R.id.new_incognito_tab_menu_id) { @@ -1698,7 +1711,15 @@ RecordUserAction.record("MobileNewTabOpened"); reportNewTabShortcutUsed(true); if (fromMenu) RecordUserAction.record("MobileMenuNewIncognitoTab.AppMenu"); - getTabCreator(true).launchNTP(); + + // If Start Surface should be shown as the home page, show the start surface home + // page. + if (ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage()) { + getTabModelSelector().selectModel(true); + showOverview(OverviewModeState.SHOWING_HOMEPAGE); + } else { + getTabCreator(true).launchNTP(); + } } } else if (id == R.id.all_bookmarks_menu_id) { // Note that 'currentTab' could be null in overview mode when start surface is
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java index c907e91f..5b9fc4d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java
@@ -49,6 +49,7 @@ private final ChromeActivity mActivity; private final BottomSheetController mBottomSheetController; private final FaviconLoader mFaviconLoader; + private final EphemeralTabMetrics mMetrics = new EphemeralTabMetrics(); private OverlayPanelContent mPanelContent; private WebContentsObserver mWebContentsObserver; private EphemeralTabSheetContent mSheetContent; @@ -67,6 +68,8 @@ mBottomSheetController = bottomSheetController; mFaviconLoader = new FaviconLoader(mActivity); mBottomSheetController.addObserver(new EmptyBottomSheetObserver() { + private int mCloseReason; + @Override public void onSheetContentChanged(BottomSheetContent newContent) { if (newContent != mSheetContent) destroyContent(); @@ -76,6 +79,28 @@ public void onSheetStateChanged(int newState) { if (mSheetContent == null) return; mSheetContent.showOpenInNewTabButton(newState == SheetState.FULL); + switch (newState) { + case SheetState.PEEK: + mMetrics.recordMetricsForPeeked(); + break; + case SheetState.FULL: + mMetrics.recordMetricsForOpened(); + break; + } + } + + @Override + public void onSheetClosed(int reason) { + // "Closed" actually means "Peek" for bottom sheet. Save the reason to log + // when the sheet goes to hidden state. + mCloseReason = reason; + } + + @Override + public void onSheetOffsetChanged(float heightFraction, float offsetPx) { + if (heightFraction == 0.0f) { + mMetrics.recordMetricsForClosed(mCloseReason); + } } }); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java new file mode 100644 index 0000000..cdf514b2 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java
@@ -0,0 +1,89 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.compositor.bottombar.ephemeraltab; + +import org.chromium.base.TimeUtils; +import org.chromium.base.metrics.RecordHistogram; +import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController.StateChangeReason; + +/** + * Metrics util class for ephemeral tab. + */ +public class EphemeralTabMetrics { + /** Remembers whether the panel was opened to the peeking state. */ + private boolean mDidRecordFirstPeek; + + /** The timestamp when the panel entered the peeking state for the first time. */ + private long mPanelPeekedNanoseconds; + + /** Remembers whether the panel was opened beyond the peeking state. */ + private boolean mDidRecordFirstOpen; + + /** The timestamp when the panel entered the opened state for the first time. */ + private long mPanelOpenedNanoseconds; + + /** Records metrics for the peeked panel state. */ + public void recordMetricsForPeeked() { + startPeekTimer(); + // Could be returning to Peek from Open. + finishOpenTimer(); + } + + /** Records metrics when the panel has been fully opened. */ + public void recordMetricsForOpened() { + startOpenTimer(); + finishPeekTimer(); + } + + /** Records metrics when the panel has been closed. */ + public void recordMetricsForClosed(@StateChangeReason int stateChangeReason) { + finishPeekTimer(); + finishOpenTimer(); + RecordHistogram.recordBooleanHistogram("EphemeralTab.Ctr", mDidRecordFirstOpen); + RecordHistogram.recordEnumeratedHistogram("EphemeralTab.BottomSheet.CloseReason", + stateChangeReason, StateChangeReason.MAX_VALUE + 1); + resetTimers(); + } + + /** Resets the metrics used by the timers. */ + private void resetTimers() { + mDidRecordFirstPeek = false; + mPanelPeekedNanoseconds = 0; + mDidRecordFirstOpen = false; + mPanelOpenedNanoseconds = 0; + } + + /** Starts timing the peek state if it's not already been started. */ + private void startPeekTimer() { + if (mPanelPeekedNanoseconds == 0) mPanelPeekedNanoseconds = System.nanoTime(); + } + + /** Finishes timing metrics for the first peek state, unless that has already been done. */ + private void finishPeekTimer() { + if (!mDidRecordFirstPeek && mPanelPeekedNanoseconds != 0) { + mDidRecordFirstPeek = true; + long durationPeeking = (System.nanoTime() - mPanelPeekedNanoseconds) + / TimeUtils.NANOSECONDS_PER_MILLISECOND; + RecordHistogram.recordMediumTimesHistogram( + "EphemeralTab.DurationPeeked", durationPeeking); + } + } + + /** Starts timing the open state if it's not already been started. */ + private void startOpenTimer() { + if (mPanelOpenedNanoseconds == 0) mPanelOpenedNanoseconds = System.nanoTime(); + } + + /** Finishes timing metrics for the first open state, unless that has already been done. */ + private void finishOpenTimer() { + if (!mDidRecordFirstOpen && mPanelOpenedNanoseconds != 0) { + mDidRecordFirstOpen = true; + long durationOpened = (System.nanoTime() - mPanelOpenedNanoseconds) + / TimeUtils.NANOSECONDS_PER_MILLISECOND; + RecordHistogram.recordMediumTimesHistogram( + "EphemeralTab.DurationOpened", durationOpened); + } + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java index 4c7490cc..bd92e50 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java
@@ -10,8 +10,6 @@ import android.view.MotionEvent; import org.chromium.base.SysUtils; -import org.chromium.base.TimeUtils; -import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.compositor.LayerTitleCache; @@ -50,18 +48,6 @@ /** The compositor layer used for drawing the panel. */ private EphemeralTabSceneLayer mSceneLayer; - /** Remembers whether the panel was opened to the peeking state. */ - private boolean mDidRecordFirstPeek; - - /** The timestamp when the panel entered the peeking state for the first time. */ - private long mPanelPeekedNanoseconds; - - /** Remembers whether the panel was opened beyond the peeking state. */ - private boolean mDidRecordFirstOpen; - - /** The timestamp when the panel entered the opened state for the first time. */ - private long mPanelOpenedNanoseconds; - /** True if the Tab from which the panel is opened is in incognito mode. */ private boolean mIsIncognito; @@ -248,18 +234,6 @@ return 1.0f; } - @Override - public void setPanelState(@PanelState int toState, @StateChangeReason int reason) { - super.setPanelState(toState, reason); - if (toState == PanelState.PEEKED) { - recordMetricsForPeeked(); - } else if (toState == PanelState.CLOSED) { - recordMetricsForClosed(reason); - } else if (toState == PanelState.EXPANDED || toState == PanelState.MAXIMIZED) { - recordMetricsForOpened(); - } - } - // Scene Overlay @Override @@ -451,70 +425,4 @@ mEphemeralTabBarControl = null; } } - - //-------- - // METRICS - //-------- - /** Records metrics for the peeked panel state. */ - private void recordMetricsForPeeked() { - startPeekTimer(); - // Could be returning to Peek from Open. - finishOpenTimer(); - } - - /** Records metrics when the panel has been fully opened. */ - private void recordMetricsForOpened() { - startOpenTimer(); - finishPeekTimer(); - } - - /** Records metrics when the panel has been closed. */ - private void recordMetricsForClosed(@StateChangeReason int stateChangeReason) { - finishPeekTimer(); - finishOpenTimer(); - RecordHistogram.recordBooleanHistogram("EphemeralTab.Ctr", mDidRecordFirstOpen); - RecordHistogram.recordEnumeratedHistogram( - "EphemeralTab.CloseReason", stateChangeReason, StateChangeReason.MAX_VALUE + 1); - resetTimers(); - } - - /** Resets the metrics used by the timers. */ - private void resetTimers() { - mDidRecordFirstPeek = false; - mPanelPeekedNanoseconds = 0; - mDidRecordFirstOpen = false; - mPanelOpenedNanoseconds = 0; - } - - /** Starts timing the peek state if it's not already been started. */ - private void startPeekTimer() { - if (mPanelPeekedNanoseconds == 0) mPanelPeekedNanoseconds = System.nanoTime(); - } - - /** Finishes timing metrics for the first peek state, unless that has already been done. */ - private void finishPeekTimer() { - if (!mDidRecordFirstPeek && mPanelPeekedNanoseconds != 0) { - mDidRecordFirstPeek = true; - long durationPeeking = (System.nanoTime() - mPanelPeekedNanoseconds) - / TimeUtils.NANOSECONDS_PER_MILLISECOND; - RecordHistogram.recordMediumTimesHistogram( - "EphemeralTab.DurationPeeked", durationPeeking); - } - } - - /** Starts timing the open state if it's not already been started. */ - private void startOpenTimer() { - if (mPanelOpenedNanoseconds == 0) mPanelOpenedNanoseconds = System.nanoTime(); - } - - /** Finishes timing metrics for the first open state, unless that has already been done. */ - private void finishOpenTimer() { - if (!mDidRecordFirstOpen && mPanelOpenedNanoseconds != 0) { - mDidRecordFirstOpen = true; - long durationOpened = (System.nanoTime() - mPanelOpenedNanoseconds) - / TimeUtils.NANOSECONDS_PER_MILLISECOND; - RecordHistogram.recordMediumTimesHistogram( - "EphemeralTab.DurationOpened", durationOpened); - } - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainPreferences.java index 731f98f..45de2bb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainPreferences.java
@@ -26,7 +26,6 @@ import org.chromium.chrome.browser.password_manager.ManagePasswordsReferrer; import org.chromium.chrome.browser.password_manager.PasswordManagerLauncher; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; -import org.chromium.chrome.browser.settings.autofill_assistant.AutofillAssistantSettings; import org.chromium.chrome.browser.settings.datareduction.DataReductionPreferenceFragment; import org.chromium.chrome.browser.settings.developer.DeveloperSettings; import org.chromium.chrome.browser.settings.sync.SignInPreference; @@ -58,7 +57,6 @@ public static final String PREF_LANGUAGES = "languages"; public static final String PREF_DOWNLOADS = "downloads"; public static final String PREF_DEVELOPER = "developer"; - public static final String PREF_AUTOFILL_ASSISTANT = "autofill_assistant"; public static final String AUTOFILL_GUID = "guid"; // Needs to be in sync with kSettingsOrigin[] in @@ -170,14 +168,6 @@ if (!ChromeFeatureList.isEnabled(ChromeFeatureList.DOWNLOADS_LOCATION_CHANGE)) { getPreferenceScreen().removePreference(findPreference(PREF_DOWNLOADS)); } - - // This checks whether Autofill Assistant is enabled and was shown at least once (only then - // will the AA switch be assigned a value). - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_ASSISTANT) - || !ContextUtils.getAppSharedPreferences().contains( - AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH)) { - getPreferenceScreen().removePreference(findPreference(PREF_AUTOFILL_ASSISTANT)); - } } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettings.java deleted file mode 100644 index 42300e38..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettings.java +++ /dev/null
@@ -1,57 +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. - -package org.chromium.chrome.browser.settings.autofill_assistant; - -import android.content.Context; -import android.os.Bundle; -import android.support.v7.preference.PreferenceFragmentCompat; -import android.support.v7.preference.PreferenceScreen; - -import org.chromium.base.ContextUtils; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.settings.ChromeSwitchPreference; - -/** The "Autofill Assistant" Settings screen. */ -public class AutofillAssistantSettings extends PreferenceFragmentCompat { - /** Autofill Assistant switch preference key name. */ - public static final String PREF_AUTOFILL_ASSISTANT_SWITCH = "autofill_assistant_switch"; - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - getActivity().setTitle(R.string.prefs_autofill_assistant_title); - - PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getStyledContext()); - setPreferenceScreen(screen); - createAutofillAssistantSwitch(); - } - - private void createAutofillAssistantSwitch() { - ChromeSwitchPreference autofillAssistantSwitch = - new ChromeSwitchPreference(getStyledContext(), null); - autofillAssistantSwitch.setKey(PREF_AUTOFILL_ASSISTANT_SWITCH); - autofillAssistantSwitch.setTitle(R.string.prefs_autofill_assistant_switch); - autofillAssistantSwitch.setSummaryOn(R.string.text_on); - autofillAssistantSwitch.setSummaryOff(R.string.text_off); - autofillAssistantSwitch.setOnPreferenceChangeListener((preference, newValue) -> { - ContextUtils.getAppSharedPreferences() - .edit() - .putBoolean(PREF_AUTOFILL_ASSISTANT_SWITCH, (boolean) newValue) - .apply(); - return true; - }); - getPreferenceScreen().addPreference(autofillAssistantSwitch); - - // Note: setting the switch state before the preference is added to the screen results in - // some odd behavior where the switch state doesn't always match the internal enabled state - // (e.g. the switch will say "On" when it is really turned off), so .setChecked() should be - // called after .addPreference() - autofillAssistantSwitch.setChecked(ContextUtils.getAppSharedPreferences().getBoolean( - PREF_AUTOFILL_ASSISTANT_SWITCH, true)); - } - - private Context getStyledContext() { - return getPreferenceManager().getContext(); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS deleted file mode 100644 index 829eb83..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://components/autofill_assistant/OWNERS \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncAndServicesPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncAndServicesPreferences.java index 5608e62..286a864 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncAndServicesPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncAndServicesPreferences.java
@@ -42,8 +42,10 @@ import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager; import org.chromium.chrome.browser.help.HelpAndFeedback; import org.chromium.chrome.browser.metrics.UmaSessionStats; +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.preferences.PrefServiceBridge; +import org.chromium.chrome.browser.preferences.SharedPreferencesManager; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.safe_browsing.SafeBrowsingBridge; import org.chromium.chrome.browser.settings.ChromeBasePreference; @@ -111,6 +113,8 @@ private static final String PREF_USAGE_AND_CRASH_REPORTING = "usage_and_crash_reports"; private static final String PREF_URL_KEYED_ANONYMIZED_DATA = "url_keyed_anonymized_data"; private static final String PREF_CONTEXTUAL_SEARCH = "contextual_search"; + @VisibleForTesting + public static final String PREF_AUTOFILL_ASSISTANT = "autofill_assistant"; @IntDef({SyncError.NO_ERROR, SyncError.ANDROID_SYNC_DISABLED, SyncError.AUTH_ERROR, SyncError.PASSPHRASE_REQUIRED, SyncError.CLIENT_OUT_OF_DATE, @@ -134,6 +138,8 @@ PrivacyPreferencesManager.getInstance(); private final ManagedPreferenceDelegate mManagedPreferenceDelegate = createManagedPreferenceDelegate(); + private final SharedPreferencesManager mSharedPreferencesManager = + SharedPreferencesManager.getInstance(); private boolean mIsFromSigninScreen; @@ -153,6 +159,7 @@ private ChromeSwitchPreference mSafeBrowsingReporting; private ChromeSwitchPreference mUsageAndCrashReporting; private ChromeSwitchPreference mUrlKeyedAnonymizedData; + private @Nullable ChromeSwitchPreference mAutofillAssistant; private @Nullable Preference mContextualSearch; private ProfileSyncService.SyncSetupInProgressHandle mSyncSetupInProgressHandle; @@ -246,6 +253,15 @@ mUrlKeyedAnonymizedData.setOnPreferenceChangeListener(this); mUrlKeyedAnonymizedData.setManagedPreferenceDelegate(mManagedPreferenceDelegate); + mAutofillAssistant = (ChromeSwitchPreference) findPreference(PREF_AUTOFILL_ASSISTANT); + if (shouldShowAutofillAssistantPreference()) { + mAutofillAssistant.setOnPreferenceChangeListener(this); + mAutofillAssistant.setManagedPreferenceDelegate(mManagedPreferenceDelegate); + } else { + removePreference(servicesCategory, mAutofillAssistant); + mAutofillAssistant = null; + } + mContextualSearch = findPreference(PREF_CONTEXTUAL_SEARCH); if (!ContextualSearchFieldTrial.isEnabled()) { removePreference(servicesCategory, mContextualSearch); @@ -383,6 +399,8 @@ } else if (PREF_URL_KEYED_ANONYMIZED_DATA.equals(key)) { UnifiedConsentServiceBridge.setUrlKeyedAnonymizedDataCollectionEnabled( (boolean) newValue); + } else if (PREF_AUTOFILL_ASSISTANT.equals(key)) { + setAutofillAssistantSwitchValue((boolean) newValue); } return true; } @@ -610,6 +628,9 @@ mUrlKeyedAnonymizedData.setChecked( UnifiedConsentServiceBridge.isUrlKeyedAnonymizedDataCollectionEnabled()); + if (mAutofillAssistant != null) { + mAutofillAssistant.setChecked(isAutofillAssistantSwitchOn()); + } if (mContextualSearch != null) { boolean isContextualSearchEnabled = !ContextualSearchManager.isContextualSearchDisabled(); @@ -783,4 +804,24 @@ fragment.cancelSync(); } } + + /** + * This checks whether Autofill Assistant is enabled and was shown at least once (only then + * will the AA switch be assigned a value). + */ + private boolean shouldShowAutofillAssistantPreference() { + return ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_ASSISTANT) + && mSharedPreferencesManager.contains( + ChromePreferenceKeys.AUTOFILL_ASSISTANT_ENABLED); + } + + public boolean isAutofillAssistantSwitchOn() { + return mSharedPreferencesManager.readBoolean( + ChromePreferenceKeys.AUTOFILL_ASSISTANT_ENABLED, false); + } + + public void setAutofillAssistantSwitchValue(boolean newValue) { + mSharedPreferencesManager.writeBoolean( + ChromePreferenceKeys.AUTOFILL_ASSISTANT_ENABLED, newValue); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java index 4accea4..841b12f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java
@@ -45,6 +45,16 @@ */ @Nullable Intent createKeyRetrievalIntent(); + + /** + * Invoked when the result of fetchKeys() represents keys that cannot decrypt Nigori, which + * should only be possible if the provided keys are not up-to-date. + * + * @param gaiaId String representation of the Gaia ID. + * @return a promise which indicates completion and also represents whether the operation + * took any effect (false positives acceptable). + */ + Promise<Boolean> markKeysAsStale(String gaiaId); } /** @@ -60,6 +70,11 @@ public Intent createKeyRetrievalIntent() { return null; } + + @Override + public Promise<Boolean> markKeysAsStale(String gaiaId) { + return Promise.fulfilled(false); + } }; private static TrustedVaultClient sInstance; @@ -162,8 +177,35 @@ }); } + /** + * Forwards calls to Backend.markKeysAsStale() and upon completion invokes native method + * markKeysAsStaleCompleted(). + */ + @CalledByNative + private static void markKeysAsStale(long nativeTrustedVaultClientAndroid, String gaiaId) { + assert isNativeRegistered(nativeTrustedVaultClientAndroid); + get().mBackend.markKeysAsStale(gaiaId).then( + (result) + -> { + if (isNativeRegistered(nativeTrustedVaultClientAndroid)) { + TrustedVaultClientJni.get().markKeysAsStaleCompleted( + nativeTrustedVaultClientAndroid, result); + } + }, + (exception) -> { + if (isNativeRegistered(nativeTrustedVaultClientAndroid)) { + // There's no certainty about whether the operation made any difference so + // let's return true indicating that it might have, since false positives + // are allowed. + TrustedVaultClientJni.get().markKeysAsStaleCompleted( + nativeTrustedVaultClientAndroid, true); + } + }); + } + @NativeMethods interface Natives { void fetchKeysCompleted(long nativeTrustedVaultClientAndroid, String gaiaId, byte[][] keys); + void markKeysAsStaleCompleted(long nativeTrustedVaultClientAndroid, boolean result); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java index 2efb2aef..6117aed 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java
@@ -8,6 +8,7 @@ import android.view.ViewStub; import org.chromium.chrome.R; +import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.toolbar.IncognitoStateProvider; import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper; @@ -103,6 +104,14 @@ mToolbarMediator.onBottomToolbarVisibilityChanged(isVisible); } + /** + * @param overviewModeBehavior The {@link OverviewModeBehavior} to observe overview state + * changes. + */ + void setOverviewModeBehavior(OverviewModeBehavior overviewModeBehavior) { + mToolbarMediator.setOverviewModeBehavior(overviewModeBehavior); + } + void onNativeLibraryReady() { mToolbarMediator.onNativeLibraryReady(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java index ffd03cc9..da33654 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java
@@ -11,10 +11,15 @@ import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IS_VISIBLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.LOGO_IS_VISIBLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.MENU_IS_VISIBLE; +import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_BUTTON_IS_VISIBLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_CLICK_HANDLER; import android.view.View; +import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver; +import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; +import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver; +import org.chromium.chrome.browser.compositor.layouts.OverviewModeState; import org.chromium.chrome.browser.flags.FeatureUtilities; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; @@ -32,6 +37,8 @@ private TabModelSelector mTabModelSelector; private TemplateUrlServiceObserver mTemplateUrlObserver; private TabModelSelectorObserver mTabModelSelectorObserver; + private OverviewModeBehavior mOverviewModeBehavior; + private OverviewModeObserver mOverviewModeObserver; StartSurfaceToolbarMediator(PropertyModel model) { mPropertyModel = model; @@ -61,6 +68,9 @@ if (mTabModelSelectorObserver != null) { mTabModelSelector.removeObserver(mTabModelSelectorObserver); } + if (mOverviewModeObserver != null) { + mOverviewModeBehavior.removeOverviewModeObserver(mOverviewModeObserver); + } } void setAppMenuButtonHelper(AppMenuButtonHelper appMenuButtonHelper) { @@ -105,4 +115,23 @@ void onBottomToolbarVisibilityChanged(boolean isVisible) { mPropertyModel.set(MENU_IS_VISIBLE, !isVisible); } + + void setOverviewModeBehavior(OverviewModeBehavior overviewModeBehavior) { + assert mOverviewModeBehavior == null; + + mOverviewModeBehavior = overviewModeBehavior; + if (mOverviewModeObserver == null) { + mOverviewModeObserver = new EmptyOverviewModeObserver() { + @Override + public void onOverviewModeStateChanged( + @OverviewModeState int overviewModeState, boolean showTabSwitcherToolbar) { + boolean isShownTabswitcherState = + overviewModeState == OverviewModeState.SHOWN_TABSWITCHER; + mPropertyModel.set(LOGO_IS_VISIBLE, !isShownTabswitcherState); + mPropertyModel.set(NEW_TAB_BUTTON_IS_VISIBLE, isShownTabswitcherState); + } + }; + } + mOverviewModeBehavior.addOverviewModeObserver(mOverviewModeObserver); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java index 1ae0472..d4d8d8b7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java
@@ -34,8 +34,11 @@ new PropertyModel.WritableBooleanPropertyKey(); public static final PropertyModel.WritableBooleanPropertyKey MENU_IS_VISIBLE = new PropertyModel.WritableBooleanPropertyKey(); + public static final PropertyModel.WritableBooleanPropertyKey NEW_TAB_BUTTON_IS_VISIBLE = + new PropertyModel.WritableBooleanPropertyKey(); - public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {APP_MENU_BUTTON_HELPER, - NEW_TAB_CLICK_HANDLER, IS_VISIBLE, LOGO_IS_VISIBLE, IS_INCOGNITO, - INCOGNITO_STATE_PROVIDER, ACCESSIBILITY_ENABLED, MENU_IS_VISIBLE}; + public static final PropertyKey[] ALL_KEYS = + new PropertyKey[] {APP_MENU_BUTTON_HELPER, NEW_TAB_CLICK_HANDLER, IS_VISIBLE, + LOGO_IS_VISIBLE, IS_INCOGNITO, INCOGNITO_STATE_PROVIDER, ACCESSIBILITY_ENABLED, + MENU_IS_VISIBLE, NEW_TAB_BUTTON_IS_VISIBLE}; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarView.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarView.java index 3e2ecf4..601dc9e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarView.java
@@ -77,6 +77,13 @@ mMenuButton.setVisibility(isVisible ? View.VISIBLE : View.GONE); } + /** + * @param isVisible Whether the new tab button is visible. + */ + void setNewTabButtonVisibility(boolean isVisible) { + mNewTabButton.setVisibility(isVisible ? View.VISIBLE : View.GONE); + } + /** Called when incognito mode changes. */ void updateIncognito(boolean isIncognito) { updatePrimaryColorAndTint(isIncognito);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java index 935e598..59d37da 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java
@@ -11,6 +11,7 @@ import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IS_VISIBLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.LOGO_IS_VISIBLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.MENU_IS_VISIBLE; +import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_BUTTON_IS_VISIBLE; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_CLICK_HANDLER; import android.view.View; @@ -38,6 +39,8 @@ view.onAccessibilityStatusChanged(model.get(ACCESSIBILITY_ENABLED)); } else if (propertyKey == MENU_IS_VISIBLE) { view.setMenuButtonVisibility(model.get(MENU_IS_VISIBLE)); + } else if (propertyKey == NEW_TAB_BUTTON_IS_VISIBLE) { + view.setNewTabButtonVisibility(model.get(NEW_TAB_BUTTON_IS_VISIBLE)); } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java index 804f372..56148813 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -144,6 +144,7 @@ } else if (mStartSurfaceToolbarCoordinator != null) { mStartSurfaceToolbarCoordinator.setOnNewTabClickHandler(newTabClickHandler); mStartSurfaceToolbarCoordinator.setTabModelSelector(tabModelSelector); + mStartSurfaceToolbarCoordinator.setOverviewModeBehavior(overviewModeBehavior); mStartSurfaceToolbarCoordinator.onNativeLibraryReady(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettingsTest.java deleted file mode 100644 index 31bcef9..0000000 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettingsTest.java +++ /dev/null
@@ -1,175 +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. - -package org.chromium.chrome.browser.settings.autofill_assistant; - -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.nullValue; - -import android.support.test.InstrumentationRegistry; -import android.support.test.espresso.intent.rule.IntentsTestRule; -import android.support.test.filters.SmallTest; - -import org.junit.Assert; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TestRule; -import org.junit.runner.RunWith; - -import org.chromium.base.ContextUtils; -import org.chromium.base.test.BaseJUnit4ClassRunner; -import org.chromium.base.test.util.Feature; -import org.chromium.chrome.browser.ChromeFeatureList; -import org.chromium.chrome.browser.history.HistoryActivity; -import org.chromium.chrome.browser.settings.ChromeSwitchPreference; -import org.chromium.chrome.browser.settings.MainPreferences; -import org.chromium.chrome.browser.settings.SettingsActivity; -import org.chromium.chrome.browser.settings.SettingsActivityTest; -import org.chromium.chrome.test.ChromeBrowserTestRule; -import org.chromium.chrome.test.util.browser.Features; -import org.chromium.chrome.test.util.browser.Features.DisableFeatures; -import org.chromium.chrome.test.util.browser.Features.EnableFeatures; -import org.chromium.content_public.browser.test.util.TestThreadUtils; - -/** - * Tests for the "Autofill Assisatnt" settings screen. - */ -@RunWith(BaseJUnit4ClassRunner.class) -public class AutofillAssistantSettingsTest { - @Rule - public final ChromeBrowserTestRule mBrowserTestRule = new ChromeBrowserTestRule(); - - @Rule - public TestRule mProcessor = new Features.InstrumentationProcessor(); - - @Rule - public IntentsTestRule<HistoryActivity> mHistoryActivityTestRule = - new IntentsTestRule<>(HistoryActivity.class, false, false); - - /** - * Set the |PREF_AUTOFILL_ASSISTANT_SWITCH| shared preference to the given |value|. - * @param value The value to set the preference to. - */ - private void setAutofillAssistantSwitch(boolean value) { - ContextUtils.getAppSharedPreferences() - .edit() - .putBoolean(AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH, value) - .apply(); - } - - /** - * Get the |PREF_AUTOFILL_ASSISTANT_SWITCH| shared preference. - * @param defaultValue The default value to use if the preference does not exist. - * @return The value of the shared preference. - */ - private boolean getAutofillAssistantSwitch(boolean defaultValue) { - return ContextUtils.getAppSharedPreferences().getBoolean( - AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH, defaultValue); - } - - /** - * Ensure that the on/off switch in "Autofill Assistant" settings works. - */ - @Test - @SmallTest - @Feature({"Preferences"}) - @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT) - public void testAutofillAssistantSwitch() { - TestThreadUtils.runOnUiThreadBlocking(() -> { setAutofillAssistantSwitch(true); }); - - final SettingsActivity settingsActivity = SettingsActivityTest.startSettingsActivity( - InstrumentationRegistry.getInstrumentation(), - AutofillAssistantSettings.class.getName()); - - TestThreadUtils.runOnUiThreadBlocking(() -> { - AutofillAssistantSettings autofillAssistantPrefs = - (AutofillAssistantSettings) settingsActivity.getMainFragment(); - ChromeSwitchPreference onOffSwitch = - (ChromeSwitchPreference) autofillAssistantPrefs.findPreference( - AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH); - Assert.assertTrue(onOffSwitch.isChecked()); - - onOffSwitch.performClick(); - Assert.assertFalse(getAutofillAssistantSwitch(true)); - onOffSwitch.performClick(); - Assert.assertTrue(getAutofillAssistantSwitch(false)); - - settingsActivity.finish(); - setAutofillAssistantSwitch(false); - }); - - final SettingsActivity settingsActivity2 = SettingsActivityTest.startSettingsActivity( - InstrumentationRegistry.getInstrumentation(), - AutofillAssistantSettings.class.getName()); - TestThreadUtils.runOnUiThreadBlocking(() -> { - AutofillAssistantSettings autofillAssistantPrefs = - (AutofillAssistantSettings) settingsActivity2.getMainFragment(); - ChromeSwitchPreference onOffSwitch = - (ChromeSwitchPreference) autofillAssistantPrefs.findPreference( - AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH); - Assert.assertFalse(onOffSwitch.isChecked()); - }); - } - - /** - * Test: if the onboarding was never shown, the AA chrome preference should not exist. - * - * Note: presence of the |PREF_AUTOFILL_ASSISTANT_SWITCH| shared preference indicates whether - * onboarding was shown or not. - */ - @Test - @SmallTest - @Feature({"Preferences"}) - @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT) - public void testAutofillAssistantNoPreferenceIfOnboardingNeverShown() { - // Note: |PREF_AUTOFILL_ASSISTANT_SWITCH| is cleared in setUp(). - final SettingsActivity settingsActivity = SettingsActivityTest.startSettingsActivity( - InstrumentationRegistry.getInstrumentation(), MainPreferences.class.getName()); - TestThreadUtils.runOnUiThreadBlocking(() -> { - MainPreferences mainPrefs = (MainPreferences) settingsActivity.getMainFragment(); - Assert.assertThat(mainPrefs.findPreference(MainPreferences.PREF_AUTOFILL_ASSISTANT), - is(nullValue())); - }); - } - - /** - * Test: if the onboarding was shown at least once, the AA chrome preference should also exist. - * - * Note: presence of the |PREF_AUTOFILL_ASSISTANT_SWITCH| shared preference indicates whether - * onboarding was shown or not. - */ - @Test - @SmallTest - @Feature({"Preferences"}) - @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT) - public void testAutofillAssistantPreferenceShownIfOnboardingShown() { - setAutofillAssistantSwitch(false); - final SettingsActivity settingsActivity = SettingsActivityTest.startSettingsActivity( - InstrumentationRegistry.getInstrumentation(), MainPreferences.class.getName()); - TestThreadUtils.runOnUiThreadBlocking(() -> { - MainPreferences mainPrefs = (MainPreferences) settingsActivity.getMainFragment(); - Assert.assertThat(mainPrefs.findPreference(MainPreferences.PREF_AUTOFILL_ASSISTANT), - is(not(nullValue()))); - }); - } - - /** - * Ensure that the "Autofill Assistant" setting is not shown when the feature is disabled. - */ - @Test - @SmallTest - @Feature({"Preferences"}) - @DisableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT) - public void testAutofillAssistantNoPreferenceIfFeatureDisabled() { - final SettingsActivity settingsActivity = SettingsActivityTest.startSettingsActivity( - InstrumentationRegistry.getInstrumentation(), MainPreferences.class.getName()); - - TestThreadUtils.runOnUiThreadBlocking(() -> { - MainPreferences mainPrefs = (MainPreferences) settingsActivity.getMainFragment(); - Assert.assertThat(mainPrefs.findPreference(MainPreferences.PREF_AUTOFILL_ASSISTANT), - is(nullValue())); - }); - } -}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS deleted file mode 100644 index 829eb83..0000000 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://components/autofill_assistant/OWNERS \ No newline at end of file
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java index c8b43ca..310d04fe 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java
@@ -9,6 +9,7 @@ import android.content.Intent; import android.os.Bundle; import android.support.test.InstrumentationRegistry; +import android.support.test.filters.LargeTest; import android.support.test.filters.SmallTest; import android.support.test.uiautomator.UiDevice; import android.support.v4.app.FragmentTransaction; @@ -24,13 +25,18 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; +import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeSwitches; +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; +import org.chromium.chrome.browser.preferences.SharedPreferencesManager; import org.chromium.chrome.browser.settings.ChromeSwitchPreference; import org.chromium.chrome.browser.settings.SettingsActivity; import org.chromium.chrome.browser.settings.SettingsLauncher; import org.chromium.chrome.browser.settings.sync.SyncAndServicesPreferences; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.ApplicationTestUtils; +import org.chromium.chrome.test.util.browser.Features.DisableFeatures; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.chrome.test.util.browser.sync.SyncTestUtil; import org.chromium.components.sync.AndroidSyncSettings; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -256,6 +262,106 @@ Assert.assertNotNull("Sync error card should be shown", getSyncErrorCard(fragment)); } + /** + * Test: if the onboarding was never shown, the AA chrome preference should not exist. + * + * Note: presence of the {@link SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT} + * shared preference indicates whether onboarding was shown or not. + */ + @Test + @LargeTest + @Feature({"Sync"}) + @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT) + public void testAutofillAssistantNoPreferenceIfOnboardingNeverShown() { + final SyncAndServicesPreferences syncPrefs = startSyncAndServicesPreferences(); + TestThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertNull( + syncPrefs.findPreference(SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT)); + }); + } + + /** + * Test: if the onboarding was shown at least once, the AA chrome preference should also exist. + * + * Note: presence of the {@link SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT} + * shared preference indicates whether onboarding was shown or not. + */ + @Test + @LargeTest + @Feature({"Sync"}) + @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT) + public void testAutofillAssistantPreferenceShownIfOnboardingShown() { + setAutofillAssistantSwitchValue(true); + final SyncAndServicesPreferences syncPrefs = startSyncAndServicesPreferences(); + TestThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertNotNull( + syncPrefs.findPreference(SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT)); + }); + } + + /** + * Ensure that the "Autofill Assistant" setting is not shown when the feature is disabled. + */ + @Test + @LargeTest + @Feature({"Sync"}) + @DisableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT) + public void testAutofillAssistantNoPreferenceIfFeatureDisabled() { + setAutofillAssistantSwitchValue(true); + final SyncAndServicesPreferences syncPrefs = startSyncAndServicesPreferences(); + TestThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertNull( + syncPrefs.findPreference(SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT)); + }); + } + + /** + * Ensure that the "Autofill Assistant" on/off switch works. + */ + @Test + @LargeTest + @Feature({"Sync"}) + @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT) + public void testAutofillAssistantSwitchOn() { + TestThreadUtils.runOnUiThreadBlocking(() -> { setAutofillAssistantSwitchValue(true); }); + final SyncAndServicesPreferences syncAndServicesPreferences = + startSyncAndServicesPreferences(); + + TestThreadUtils.runOnUiThreadBlocking(() -> { + ChromeSwitchPreference autofillAssistantSwitch = + (ChromeSwitchPreference) syncAndServicesPreferences.findPreference( + SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT); + Assert.assertTrue(autofillAssistantSwitch.isChecked()); + + autofillAssistantSwitch.performClick(); + Assert.assertFalse(syncAndServicesPreferences.isAutofillAssistantSwitchOn()); + autofillAssistantSwitch.performClick(); + Assert.assertTrue(syncAndServicesPreferences.isAutofillAssistantSwitchOn()); + }); + } + + @Test + @LargeTest + @Feature({"Sync"}) + @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT) + public void testAutofillAssistantSwitchOff() { + TestThreadUtils.runOnUiThreadBlocking(() -> { setAutofillAssistantSwitchValue(false); }); + final SyncAndServicesPreferences syncAndServicesPreferences = + startSyncAndServicesPreferences(); + + TestThreadUtils.runOnUiThreadBlocking(() -> { + ChromeSwitchPreference autofillAssistantSwitch = + (ChromeSwitchPreference) syncAndServicesPreferences.findPreference( + SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT); + Assert.assertFalse(autofillAssistantSwitch.isChecked()); + }); + } + + private void setAutofillAssistantSwitchValue(boolean newValue) { + SharedPreferencesManager.getInstance().writeBoolean( + ChromePreferenceKeys.AUTOFILL_ASSISTANT_ENABLED, newValue); + } + // TODO(crbug.com/1030725): SyncTestRule should support overriding ProfileSyncService. private FakeProfileSyncService overrideProfileSyncService() { return TestThreadUtils.runOnUiThreadBlockingNoException(() -> {
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 6512b5eb..b3a90e17 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -88,6 +88,7 @@ "//chrome/services/app_service/public/cpp:app_update", "//chrome/services/app_service/public/cpp:instance_update", "//chrome/services/file_util/public/cpp", + "//chrome/services/keymaster/public/mojom", "//chrome/services/printing/public/mojom", "//chrome/services/wilco_dtc_supportd/public/mojom", "//chromeos", @@ -528,6 +529,8 @@ "arc/enterprise/cert_store/arc_cert_store_bridge.h", "arc/enterprise/cert_store/arc_smart_card_manager_bridge.cc", "arc/enterprise/cert_store/arc_smart_card_manager_bridge.h", + "arc/enterprise/cert_store/security_token_operation_bridge.cc", + "arc/enterprise/cert_store/security_token_operation_bridge.h", "arc/extensions/arc_support_message_host.cc", "arc/extensions/arc_support_message_host.h", "arc/file_system_watcher/arc_file_system_watcher_service.cc", @@ -613,6 +616,10 @@ "arc/intent_helper/open_with_menu.h", "arc/intent_helper/start_smart_selection_action_menu.cc", "arc/intent_helper/start_smart_selection_action_menu.h", + "arc/keymaster/arc_keymaster_bridge.cc", + "arc/keymaster/arc_keymaster_bridge.h", + "arc/keymaster/cert_store_bridge.cc", + "arc/keymaster/cert_store_bridge.h", "arc/kiosk/arc_kiosk_bridge.cc", "arc/kiosk/arc_kiosk_bridge.h", "arc/metrics/arc_metrics_service_proxy.cc", @@ -2602,6 +2609,7 @@ "arc/enterprise/cert_store/arc_cert_installer_unittest.cc", "arc/enterprise/cert_store/arc_cert_installer_utils_unittest.cc", "arc/enterprise/cert_store/arc_smart_card_manager_bridge_unittest.cc", + "arc/enterprise/cert_store/security_token_operation_bridge_unittest.cc", "arc/extensions/arc_support_message_host_unittest.cc", "arc/file_system_watcher/arc_file_system_watcher_service_unittest.cc", "arc/file_system_watcher/arc_file_system_watcher_util_unittest.cc", @@ -3075,6 +3083,7 @@ "//chrome/browser/ui:ash_test_support", "//chrome/browser/web_applications/components", "//chrome/common", + "//chrome/services/keymaster/public/mojom", "//chrome/services/wilco_dtc_supportd/public/mojom", "//chrome/test:test_support", "//chrome/test:test_support_ui",
diff --git a/chrome/browser/chromeos/DEPS b/chrome/browser/chromeos/DEPS index f68c057..ebf3424e 100644 --- a/chrome/browser/chromeos/DEPS +++ b/chrome/browser/chromeos/DEPS
@@ -5,6 +5,7 @@ "+chrome/browser/ui/views/chrome_layout_provider.h", "+chrome/services/app_service/public", + "+chrome/services/keymaster/public", "+chrome/services/wilco_dtc_supportd/public", "+components/guest_os", "+cros",
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc index 04ce995a..7b697203 100644 --- a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc +++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
@@ -516,16 +516,6 @@ return true; } -bool KioskAppManager::GetDisableBailoutShortcut() const { - bool enable; - if (CrosSettings::Get()->GetBoolean( - kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled, &enable)) { - return !enable; - } - - return false; -} - void KioskAppManager::ClearAppData(const std::string& app_id) { KioskAppData* app_data = GetAppDataMutable(app_id); if (!app_data)
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager.h b/chrome/browser/chromeos/app_mode/kiosk_app_manager.h index 963307f..ca7c628 100644 --- a/chrome/browser/chromeos/app_mode/kiosk_app_manager.h +++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager.h
@@ -151,9 +151,6 @@ // |app| is populated. Otherwise, return false. bool GetApp(const std::string& app_id, App* app) const; - // Gets whether the bailout shortcut is disabled. - bool GetDisableBailoutShortcut() const; - // Clears locally cached Gdata. void ClearAppData(const std::string& app_id);
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.cc b/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.cc index 3aca5bb..c333edf 100644 --- a/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.cc +++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.cc
@@ -71,6 +71,16 @@ observer.OnKioskAppDataLoadFailure(app_id); } +bool KioskAppManagerBase::GetDisableBailoutShortcut() const { + bool enable; + if (CrosSettings::Get()->GetBoolean( + kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled, &enable)) { + return !enable; + } + + return false; +} + void KioskAppManagerBase::NotifyKioskAppsChanged() const { for (auto& observer : observers_) observer.OnKioskAppsSettingsChanged();
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.h b/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.h index 4d9f9cb..2614f7f 100644 --- a/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.h +++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.h
@@ -63,6 +63,9 @@ void OnKioskAppDataChanged(const std::string& app_id) const override; void OnKioskAppDataLoadFailure(const std::string& app_id) const override; + // Gets whether the bailout shortcut is disabled. + bool GetDisableBailoutShortcut() const; + bool current_app_was_auto_launched_with_zero_delay() const { return auto_launched_with_zero_delay_; }
diff --git a/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.cc b/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.cc new file mode 100644 index 0000000..bf5e829 --- /dev/null +++ b/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.cc
@@ -0,0 +1,115 @@ +// 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/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.h" + +#include <utility> + +#include "base/bind.h" +#include "base/callback.h" +#include "base/logging.h" +#include "base/optional.h" +#include "chrome/browser/chromeos/certificate_provider/certificate_provider_service.h" +#include "chrome/browser/chromeos/certificate_provider/certificate_provider_service_factory.h" +#include "third_party/boringssl/src/include/openssl/ssl.h" + +namespace arc { +namespace keymaster { + +namespace { + +base::Optional<uint16_t> ConvertMojoAlgorithmToTls(mojom::Algorithm algorithm, + mojom::Digest digest) { + // Currently, only RSA algorithm is supported. + if (algorithm != mojom::Algorithm::kRsaPkcs1) + return base::nullopt; + switch (digest) { + case mojom::Digest::kSha1: + return SSL_SIGN_RSA_PKCS1_SHA1; + case mojom::Digest::kSha256: + return SSL_SIGN_RSA_PKCS1_SHA256; + case mojom::Digest::kSha384: + return SSL_SIGN_RSA_PKCS1_SHA384; + case mojom::Digest::kSha512: + return SSL_SIGN_RSA_PKCS1_SHA512; + } + return base::nullopt; +} + +mojom::SignatureResult ConvertNetToMojomError(net::Error error) { + switch (error) { + case net::OK: + return mojom::SignatureResult::kOk; + case net::ERR_FAILED: + LOG(ERROR) << "Signature operation failed due to generic reason"; + return mojom::SignatureResult::kFailed; + default: + LOG(ERROR) << "Signature operation failed with error=" << error; + return mojom::SignatureResult::kFailed; + } +} + +} // namespace + +SecurityTokenOperationBridge::SecurityTokenOperationBridge( + content::BrowserContext* context, + mojo::PendingReceiver<mojom::SecurityTokenOperation> receiver) + : receiver_(this, std::move(receiver)), + certificate_provider_service_( + chromeos::CertificateProviderServiceFactory::GetForBrowserContext( + context)), + weak_ptr_factory_(this) { + VLOG(2) << "SecurityTokenOperationBridge::SecurityTokenOperationBridge"; + DCHECK(certificate_provider_service_); +} + +SecurityTokenOperationBridge::SecurityTokenOperationBridge( + chromeos::CertificateProviderService* certificate_provider_service) + : receiver_(this), + certificate_provider_service_(certificate_provider_service), + weak_ptr_factory_(this) { + VLOG(2) << "SecurityTokenOperationBridge::SecurityTokenOperationBridge"; + DCHECK(certificate_provider_service_); +} + +SecurityTokenOperationBridge::~SecurityTokenOperationBridge() { + VLOG(2) << "SecurityTokenOperationBridge::~SecurityTokenOperationBridge"; +} + +void SecurityTokenOperationBridge::SignDigest( + const std::string& subject_public_key_info, + mojom::Algorithm algorithm, + mojom::Digest digest, + const std::vector<uint8_t>& data, + SignDigestCallback callback) { + VLOG(2) << "SecurityTokenOperationBridge::SignDigest"; + base::Optional<uint16_t> crypto_algorithm = + ConvertMojoAlgorithmToTls(algorithm, digest); + if (!crypto_algorithm.has_value()) { + LOG(ERROR) << "Unsupported security token signature algorithm: " + << algorithm << " digest: " << digest; + std::move(callback).Run(mojom::SignatureResult::kUnsupportedAlgorithm, + base::nullopt); + return; + } + certificate_provider_service_->RequestSignatureBySpki( + subject_public_key_info, crypto_algorithm.value(), data, base::nullopt, + base::BindOnce(&SecurityTokenOperationBridge::OnSignCompleted, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); +} + +void SecurityTokenOperationBridge::OnSignCompleted( + SignDigestCallback callback, + net::Error error, + const std::vector<uint8_t>& signature) { + VLOG(2) << "SecurityTokenOperationBridge::OnSignCompleted"; + base::Optional<std::vector<uint8_t>> opt_signature; + if (error == net::OK) + opt_signature = signature; + std::move(callback).Run(ConvertNetToMojomError(error), + std::move(opt_signature)); +} + +} // namespace keymaster +} // namespace arc
diff --git a/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.h b/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.h new file mode 100644 index 0000000..71eb350 --- /dev/null +++ b/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.h
@@ -0,0 +1,71 @@ +// 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_CHROMEOS_ARC_ENTERPRISE_CERT_STORE_SECURITY_TOKEN_OPERATION_BRIDGE_H_ +#define CHROME_BROWSER_CHROMEOS_ARC_ENTERPRISE_CERT_STORE_SECURITY_TOKEN_OPERATION_BRIDGE_H_ + +#include <stdint.h> + +#include <string> +#include <vector> + +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "chrome/services/keymaster/public/mojom/cert_store.mojom.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "net/base/net_errors.h" + +namespace chromeos { + +class CertificateProviderService; + +} // namespace chromeos + +namespace content { + +class BrowserContext; + +} // namespace content + +namespace arc { +namespace keymaster { + +class SecurityTokenOperationBridge : public mojom::SecurityTokenOperation { + public: + SecurityTokenOperationBridge( + content::BrowserContext* context, + mojo::PendingReceiver<mojom::SecurityTokenOperation> receiver); + + // This constructor is used only for testing. + explicit SecurityTokenOperationBridge( + chromeos::CertificateProviderService* certificate_provider_service); + SecurityTokenOperationBridge(const SecurityTokenOperationBridge&) = delete; + SecurityTokenOperationBridge& operator=(const SecurityTokenOperationBridge&) = + delete; + ~SecurityTokenOperationBridge() override; + + // mojom::SecurityTokenOperation overrides. + void SignDigest(const std::string& subject_public_key_info, + mojom::Algorithm algorithm, + mojom::Digest digest, + const std::vector<uint8_t>& data, + SignDigestCallback callback) override; + + private: + void OnSignCompleted(SignDigestCallback callback, + net::Error error, + const std::vector<uint8_t>& signature); + + mojo::Receiver<mojom::SecurityTokenOperation> receiver_; + + chromeos::CertificateProviderService* + certificate_provider_service_; // Not owned. + + base::WeakPtrFactory<SecurityTokenOperationBridge> weak_ptr_factory_; +}; + +} // namespace keymaster +} // namespace arc + +#endif // CHROME_BROWSER_CHROMEOS_ARC_ENTERPRISE_CERT_STORE_SECURITY_TOKEN_OPERATION_BRIDGE_H_
diff --git a/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge_unittest.cc b/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge_unittest.cc new file mode 100644 index 0000000..3c3b9cee --- /dev/null +++ b/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge_unittest.cc
@@ -0,0 +1,193 @@ +// 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 <string> +#include <tuple> +#include <vector> + +#include "base//strings/string_piece.h" +#include "base/bind.h" +#include "base/memory/ptr_util.h" +#include "base/threading/sequenced_task_runner_handle.h" +#include "chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.h" +#include "chrome/browser/chromeos/certificate_provider/certificate_info.h" +#include "chrome/browser/chromeos/certificate_provider/certificate_provider.h" +#include "chrome/browser/chromeos/certificate_provider/certificate_provider_service.h" +#include "chrome/services/keymaster/public/mojom/cert_store.mojom.h" +#include "content/public/test/browser_task_environment.h" +#include "net/cert/asn1_util.h" +#include "net/cert/x509_certificate.h" +#include "net/cert/x509_util.h" +#include "net/test/cert_test_util.h" +#include "net/test/test_data_directory.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/boringssl/src/include/openssl/ssl.h" + +namespace arc { +namespace keymaster { + +constexpr char kCertFileName[] = "client_1.pem"; +constexpr char kExtensionId[] = "extension"; + +namespace { + +void ReplyToSignRequest(chromeos::CertificateProviderService* service, + int sign_request_id, + const std::vector<uint8_t>* signature) { + service->ReplyToSignRequest(kExtensionId, sign_request_id, *signature); +} + +class FakeDelegate : public chromeos::CertificateProviderService::Delegate { + public: + // * |cert_file_name| - should be empty if there is no certificates. + // * |expected_signature| - should be empty to cause an error. + FakeDelegate(chromeos::CertificateProviderService* service, + const std::string& cert_file_name, + const std::vector<uint8_t> expected_signature) + : service_(service), + cert_file_name_(cert_file_name), + expected_signature_(expected_signature) {} + + std::vector<std::string> CertificateProviderExtensions() override { + return std::vector<std::string>{kExtensionId}; + } + + void BroadcastCertificateRequest(int cert_request_id) override { + chromeos::certificate_provider::CertificateInfoList infos; + if (!cert_file_name_.empty()) { + chromeos::certificate_provider::CertificateInfo cert_info; + cert_info.certificate = net::ImportCertFromFile( + net::GetTestCertsDirectory(), cert_file_name_); + EXPECT_TRUE(cert_info.certificate) + << "Could not load " << cert_file_name_; + cert_info.supported_algorithms.push_back(SSL_SIGN_RSA_PKCS1_SHA256); + infos.push_back(cert_info); + } + service_->SetCertificatesProvidedByExtension(kExtensionId, cert_request_id, + infos); + } + + bool DispatchSignRequestToExtension( + const std::string& extension_id, + int sign_request_id, + uint16_t algorithm, + const scoped_refptr<net::X509Certificate>& certificate, + base::span<const uint8_t> digest) override { + EXPECT_EQ(kExtensionId, extension_id); + + // Reply after the method result is returned. + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&ReplyToSignRequest, service_, + sign_request_id, &expected_signature_)); + return true; + } + + private: + chromeos::CertificateProviderService* service_; // Not owned. + std::string cert_file_name_; + std::vector<uint8_t> expected_signature_; + + DISALLOW_COPY_AND_ASSIGN(FakeDelegate); +}; + +} // namespace + +class SecurityTokenOperationBridgeTest + : public testing::TestWithParam<std::tuple<mojom::SignatureResult, + std::string, + std::vector<uint8_t>>> { + public: + SecurityTokenOperationBridgeTest() = default; + SecurityTokenOperationBridgeTest(const SecurityTokenOperationBridgeTest&) = + delete; + SecurityTokenOperationBridgeTest& operator=( + const SecurityTokenOperationBridgeTest&) = delete; + + void SetUp() override { + certificate_provider_service_.SetDelegate( + std::make_unique<FakeDelegate>(&certificate_provider_service_, + cert_file_name(), expected_signature())); + bridge_ = std::make_unique<SecurityTokenOperationBridge>( + &certificate_provider_service_); + + // Request available certificates. + auto certificate_provider = + certificate_provider_service()->CreateCertificateProvider(); + base::RunLoop run_loop; + certificate_provider->GetCertificates(base::BindOnce( + [](base::RepeatingClosure quit_closure, + net::ClientCertIdentityList certs) { quit_closure.Run(); }, + run_loop.QuitClosure())); + run_loop.Run(); + } + + void TearDown() override { bridge_ = nullptr; } + + chromeos::CertificateProviderService* certificate_provider_service() { + return &certificate_provider_service_; + } + + SecurityTokenOperationBridge* bridge() { return bridge_.get(); } + mojom::SignatureResult expected_result() { return std::get<0>(GetParam()); } + std::string cert_file_name() { return std::get<1>(GetParam()); } + std::vector<uint8_t> expected_signature() { return std::get<2>(GetParam()); } + + // Extract SPKI from certificate stored in |kCertFileName|. + std::string spki() { + auto certificate = + net::ImportCertFromFile(net::GetTestCertsDirectory(), kCertFileName); + base::StringPiece spki_bytes; + if (!net::asn1::ExtractSPKIFromDERCert( + net::x509_util::CryptoBufferAsStringPiece( + certificate->cert_buffer()), + &spki_bytes)) { + return ""; + } + return spki_bytes.as_string(); + } + + private: + content::BrowserTaskEnvironment browser_task_environment_; + chromeos::CertificateProviderService certificate_provider_service_; + std::unique_ptr<SecurityTokenOperationBridge> bridge_; +}; + +TEST_P(SecurityTokenOperationBridgeTest, BasicTest) { + base::RunLoop run_loop; + + bridge()->SignDigest( + spki(), mojom::Algorithm::kRsaPkcs1, mojom::Digest::kSha256, + std::vector<uint8_t>(), + base::BindOnce( + [](mojom::SignatureResult expected_result, + const std::vector<uint8_t>& expected_signature, + base::RepeatingClosure quit_closure, mojom::SignatureResult result, + const base::Optional<std::vector<uint8_t>>& signature) { + quit_closure.Run(); + EXPECT_EQ(expected_result, result); + if (result == mojom::SignatureResult::kOk) { + EXPECT_EQ(expected_signature, signature); + } else { + EXPECT_FALSE(signature.has_value()); + } + }, + expected_result(), expected_signature(), run_loop.QuitClosure())); + run_loop.Run(); +} + +INSTANTIATE_TEST_SUITE_P( + SecurityTokenOperationBridgeTest, + SecurityTokenOperationBridgeTest, + ::testing::Values(std::make_tuple(mojom::SignatureResult::kOk, + kCertFileName, + std::vector<uint8_t>(1)), + std::make_tuple(mojom::SignatureResult::kFailed, + kCertFileName, + std::vector<uint8_t>()), + std::make_tuple(mojom::SignatureResult::kFailed, + "", + std::vector<uint8_t>(1)))); +} // namespace keymaster +} // namespace arc
diff --git a/components/arc/keymaster/arc_keymaster_bridge.cc b/chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.cc similarity index 89% rename from components/arc/keymaster/arc_keymaster_bridge.cc rename to chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.cc index 12d57a2..bb54484 100644 --- a/components/arc/keymaster/arc_keymaster_bridge.cc +++ b/chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/arc/keymaster/arc_keymaster_bridge.h" +#include "chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.h" #include <utility> @@ -49,7 +49,9 @@ ArcKeymasterBridge::ArcKeymasterBridge(content::BrowserContext* context, ArcBridgeService* bridge_service) - : arc_bridge_service_(bridge_service), weak_factory_(this) { + : arc_bridge_service_(bridge_service), + cert_store_bridge_(std::make_unique<keymaster::CertStoreBridge>(context)), + weak_factory_(this) { arc_bridge_service_->keymaster()->SetHost(this); } @@ -67,6 +69,7 @@ void ArcKeymasterBridge::OnBootstrapMojoConnection(GetServerCallback callback, bool result) { + cert_store_bridge_->OnBootstrapMojoConnection(result); if (!result) { LOG(ERROR) << "Error bootstrapping Mojo in arc-keymasterd."; keymaster_server_proxy_.reset(); @@ -79,10 +82,15 @@ void ArcKeymasterBridge::BootstrapMojoConnection(GetServerCallback callback) { DVLOG(1) << "Bootstrapping arc-keymasterd Mojo connection via D-Bus."; + mojo::OutgoingInvitation invitation; mojo::PlatformChannel channel; mojo::ScopedMessagePipeHandle server_pipe = invitation.AttachMessagePipe("arc-keymaster-pipe"); + + // Bootstrap cert_store channel attached to the same invitation. + cert_store_bridge_->BindToInvitation(&invitation); + mojo::OutgoingInvitation::Send(std::move(invitation), base::kNullProcessHandle, channel.TakeLocalEndpoint());
diff --git a/components/arc/keymaster/arc_keymaster_bridge.h b/chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.h similarity index 81% rename from components/arc/keymaster/arc_keymaster_bridge.h rename to chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.h index a5ed47e..aa42431 100644 --- a/components/arc/keymaster/arc_keymaster_bridge.h +++ b/chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.h
@@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_ARC_KEYMASTER_ARC_KEYMASTER_BRIDGE_H_ -#define COMPONENTS_ARC_KEYMASTER_ARC_KEYMASTER_BRIDGE_H_ +#ifndef CHROME_BROWSER_CHROMEOS_ARC_KEYMASTER_ARC_KEYMASTER_BRIDGE_H_ +#define CHROME_BROWSER_CHROMEOS_ARC_KEYMASTER_ARC_KEYMASTER_BRIDGE_H_ #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "chrome/browser/chromeos/arc/keymaster/cert_store_bridge.h" #include "components/arc/mojom/keymaster.mojom.h" #include "components/keyed_service/core/keyed_service.h" @@ -47,6 +48,9 @@ // Points to a proxy bound to the implementation in arc-keymasterd. mojom::KeymasterServerPtr keymaster_server_proxy_; + // Points to a proxy bound to the implementation in arc-keymasterd. + std::unique_ptr<keymaster::CertStoreBridge> cert_store_bridge_; + // WeakPtrFactory to use for callbacks. base::WeakPtrFactory<ArcKeymasterBridge> weak_factory_; @@ -55,4 +59,4 @@ } // namespace arc -#endif // COMPONENTS_ARC_KEYMASTER_ARC_KEYMASTER_BRIDGE_H_ +#endif // CHROME_BROWSER_CHROMEOS_ARC_KEYMASTER_ARC_KEYMASTER_BRIDGE_H_
diff --git a/chrome/browser/chromeos/arc/keymaster/cert_store_bridge.cc b/chrome/browser/chromeos/arc/keymaster/cert_store_bridge.cc new file mode 100644 index 0000000..fb08dbe --- /dev/null +++ b/chrome/browser/chromeos/arc/keymaster/cert_store_bridge.cc
@@ -0,0 +1,88 @@ +// 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/chromeos/arc/keymaster/cert_store_bridge.h" + +#include <utility> + +#include "base/bind.h" +#include "base/callback.h" +#include "base/logging.h" + +#include "mojo/public/cpp/bindings/interface_ptr.h" +#include "mojo/public/cpp/bindings/interface_request.h" +#include "mojo/public/cpp/platform/platform_channel.h" + +namespace arc { +namespace keymaster { + +CertStoreBridge::CertStoreBridge(content::BrowserContext* context) + : context_(context), weak_ptr_factory_(this) { + VLOG(2) << "CertStoreBridge::CertStoreBridge"; +} + +CertStoreBridge::~CertStoreBridge() { + VLOG(2) << "CertStoreBridge::~CertStoreBridge"; + security_token_operation_.reset(); +} + +void CertStoreBridge::GetSecurityTokenOperation( + mojom::SecurityTokenOperationRequest operation_request, + GetSecurityTokenOperationCallback callback) { + VLOG(2) << "CertStoreBridge::GetSecurityTokenOperation"; + security_token_operation_ = std::make_unique<SecurityTokenOperationBridge>( + context_, mojo::PendingReceiver<mojom::SecurityTokenOperation>( + std::move(operation_request))); + std::move(callback).Run(); +} + +void CertStoreBridge::BindToInvitation(mojo::OutgoingInvitation* invitation) { + VLOG(2) << "CertStoreBridge::BootstrapMojoConnection"; + + mojo::ScopedMessagePipeHandle pipe = + invitation->AttachMessagePipe("arc-cert-store-pipe"); + + cert_store_proxy_.Bind( + mojo::InterfacePtrInfo<keymaster::mojom::CertStoreInstance>( + std::move(pipe), 0u)); + VLOG(2) << "Bound remote CertStoreInstance interface to pipe."; + cert_store_proxy_.set_connection_error_handler(base::BindOnce( + &mojo::InterfacePtr<keymaster::mojom::CertStoreInstance>::reset, + base::Unretained(&cert_store_proxy_))); +} + +void CertStoreBridge::OnBootstrapMojoConnection(bool result) { + if (!result) { + cert_store_proxy_.reset(); + return; + } + + auto binding = + std::make_unique<mojo::Binding<keymaster::mojom::CertStoreHost>>(this); + mojo::InterfacePtr<keymaster::mojom::CertStoreHost> host_proxy; + binding->Bind(mojo::MakeRequest(&host_proxy)); + + cert_store_proxy_->Init( + std::move(host_proxy), + base::BindOnce(&CertStoreBridge::OnConnectionReady, + weak_ptr_factory_.GetWeakPtr(), std::move(binding))); +} + +void CertStoreBridge::OnConnectionReady( + std::unique_ptr<mojo::Binding<mojom::CertStoreHost>> binding) { + VLOG(2) << "CertStoreBridge::OnConnectionReady"; + DCHECK(!binding_); + binding->set_connection_error_handler(base::BindOnce( + &CertStoreBridge::OnConnectionClosed, base::Unretained(this))); + binding_ = std::move(binding); +} + +void CertStoreBridge::OnConnectionClosed() { + VLOG(2) << "CertStoreBridge::OnConnectionClosed"; + DCHECK(binding_); + binding_.reset(); +} + +} // namespace keymaster +} // namespace arc
diff --git a/chrome/browser/chromeos/arc/keymaster/cert_store_bridge.h b/chrome/browser/chromeos/arc/keymaster/cert_store_bridge.h new file mode 100644 index 0000000..e444798 --- /dev/null +++ b/chrome/browser/chromeos/arc/keymaster/cert_store_bridge.h
@@ -0,0 +1,62 @@ +// 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_CHROMEOS_ARC_KEYMASTER_CERT_STORE_BRIDGE_H_ +#define CHROME_BROWSER_CHROMEOS_ARC_KEYMASTER_CERT_STORE_BRIDGE_H_ + +#include <memory> + +#include "base/memory/weak_ptr.h" +#include "chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.h" +#include "chrome/services/keymaster/public/mojom/cert_store.mojom.h" +#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/system/invitation.h" + +namespace content { + +class BrowserContext; + +} // namespace content + +namespace arc { +namespace keymaster { + +class CertStoreBridge : public mojom::CertStoreHost { + public: + explicit CertStoreBridge(content::BrowserContext* context); + CertStoreBridge(const CertStoreBridge&) = delete; + CertStoreBridge& operator=(const CertStoreBridge&) = delete; + ~CertStoreBridge() override; + + // Attaches a new message pipe to the invitation and binds it to the cert + // store instance proxy. + void BindToInvitation(mojo::OutgoingInvitation* invitation); + void OnBootstrapMojoConnection(bool result); + + // CertStoreHost overrides. + void GetSecurityTokenOperation( + mojom::SecurityTokenOperationRequest operation_request, + GetSecurityTokenOperationCallback callback) override; + + private: + void OnConnectionReady( + std::unique_ptr<mojo::Binding<mojom::CertStoreHost>> binding); + void OnConnectionClosed(); + + content::BrowserContext* context_; // not owned. + + // Points to a proxy bound to the implementation in arc-keymasterd. + keymaster::mojom::CertStoreInstancePtr cert_store_proxy_; + + std::unique_ptr<SecurityTokenOperationBridge> security_token_operation_; + + std::unique_ptr<mojo::Binding<mojom::CertStoreHost>> binding_; + + base::WeakPtrFactory<CertStoreBridge> weak_ptr_factory_; +}; + +} // namespace keymaster +} // namespace arc + +#endif // CHROME_BROWSER_CHROMEOS_ARC_KEYMASTER_CERT_STORE_BRIDGE_H_
diff --git a/chrome/browser/chromeos/arc/session/arc_service_launcher.cc b/chrome/browser/chromeos/arc/session/arc_service_launcher.cc index a8a9c7b..ca9e02d 100644 --- a/chrome/browser/chromeos/arc/session/arc_service_launcher.cc +++ b/chrome/browser/chromeos/arc/session/arc_service_launcher.cc
@@ -28,6 +28,7 @@ #include "chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.h" #include "chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.h" #include "chrome/browser/chromeos/arc/intent_helper/arc_settings_service.h" +#include "chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.h" #include "chrome/browser/chromeos/arc/kiosk/arc_kiosk_bridge.h" #include "chrome/browser/chromeos/arc/metrics/arc_metrics_service_proxy.h" #include "chrome/browser/chromeos/arc/notification/arc_boot_error_notification.h" @@ -63,7 +64,6 @@ #include "components/arc/disk_quota/arc_disk_quota_bridge.h" #include "components/arc/ime/arc_ime_service.h" #include "components/arc/intent_helper/arc_intent_helper_bridge.h" -#include "components/arc/keymaster/arc_keymaster_bridge.h" #include "components/arc/lock_screen/arc_lock_screen_bridge.h" #include "components/arc/media_session/arc_media_session_bridge.h" #include "components/arc/metrics/arc_metrics_service.h"
diff --git a/chrome/browser/chromeos/assistant/assistant_util.cc b/chrome/browser/chromeos/assistant/assistant_util.cc index 60f9d48f..82edd61 100644 --- a/chrome/browser/chromeos/assistant/assistant_util.cc +++ b/chrome/browser/chromeos/assistant/assistant_util.cc
@@ -14,6 +14,7 @@ #include "chrome/browser/signin/identity_manager_factory.h" #include "chromeos/constants/chromeos_features.h" #include "chromeos/constants/chromeos_switches.h" +#include "chromeos/constants/devicetype.h" #include "chromeos/services/assistant/public/cpp/assistant_prefs.h" #include "components/language/core/browser/pref_names.h" #include "components/prefs/pref_service.h" @@ -24,35 +25,6 @@ #include "third_party/icu/source/common/unicode/locid.h" #include "ui/chromeos/events/keyboard_layout_util.h" -namespace { - -constexpr char kAtlasBoardType[] = "atlas"; -constexpr char kEveBoardType[] = "eve"; -constexpr char kNocturneBoardType[] = "nocturne"; - -bool IsBoardType(const std::string& board_name, const std::string& board_type) { - // The sub-types of the board will have the form boardtype-XXX. - // To prevent the possibility of common prefix in board names we check the - // board type with '-' here. For example there might be two board types with - // codename boardtype1 and boardtype123. - return board_name == board_type || - base::StartsWith(board_name, board_type + '-', - base::CompareCase::SENSITIVE); -} - -// TODO(updowndota): Merge this method with the IsGoogleDevice method in -// ash::assistant::util, probably move to ash::public:cpp. -// -// Returns whether the device has a dedicated Assistant key. -bool IsAssistantDevice() { - const std::string board_name = base::SysInfo::GetLsbReleaseBoard(); - return IsBoardType(board_name, kAtlasBoardType) || - IsBoardType(board_name, kEveBoardType) || - IsBoardType(board_name, kNocturneBoardType); -} - -} // namespace - namespace assistant { ash::mojom::AssistantAllowedState IsAssistantAllowedForProfile( @@ -126,7 +98,8 @@ // Bypass the account type check when using fake gaia login, e.g. in Tast // tests, or the account is logged in a device with dedicated Assistant key. - if (!chromeos::switches::IsGaiaServicesDisabled() && !(IsAssistantDevice())) { + if (!chromeos::switches::IsGaiaServicesDisabled() && + !chromeos::IsGoogleBrandedDevice()) { // Only enable non-dasher accounts for devices without physical key. bool account_supported = false; auto* identity_manager =
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc index cc76f53..6df1a59 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -2503,6 +2503,27 @@ } /////////////////////////////////////////////////////////////////////////////// +// AutotestPrivateIsArcPackageListInitialRefreshedFunction +/////////////////////////////////////////////////////////////////////////////// + +AutotestPrivateIsArcPackageListInitialRefreshedFunction:: + AutotestPrivateIsArcPackageListInitialRefreshedFunction() = default; + +AutotestPrivateIsArcPackageListInitialRefreshedFunction:: + ~AutotestPrivateIsArcPackageListInitialRefreshedFunction() = default; + +ExtensionFunction::ResponseAction +AutotestPrivateIsArcPackageListInitialRefreshedFunction::Run() { + DVLOG(1) << "AutotestPrivateIsArcPackageListInitialRefreshedFunction"; + + ArcAppListPrefs* const prefs = + ArcAppListPrefs::Get(Profile::FromBrowserContext(browser_context())); + + return RespondNow(OneArgument( + std::make_unique<base::Value>(prefs->package_list_initial_refreshed()))); +} + +/////////////////////////////////////////////////////////////////////////////// // AutotestPrivateSetWhitelistedPrefFunction ///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h index 3d0bab7..9901885f 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
@@ -643,6 +643,18 @@ base::OneShotTimer timeout_timer_; }; +class AutotestPrivateIsArcPackageListInitialRefreshedFunction + : public ExtensionFunction { + public: + AutotestPrivateIsArcPackageListInitialRefreshedFunction(); + DECLARE_EXTENSION_FUNCTION("autotestPrivate.isArcPackageListInitialRefreshed", + AUTOTESTPRIVATE_ISARCPACKAGELISTINITIALREFRESHED) + + private: + ~AutotestPrivateIsArcPackageListInitialRefreshedFunction() override; + ResponseAction Run() override; +}; + // Set user pref value in the pref tree. class AutotestPrivateSetWhitelistedPrefFunction : public ExtensionFunction { public:
diff --git a/chrome/browser/chromeos/login/arc_kiosk_controller.cc b/chrome/browser/chromeos/login/arc_kiosk_controller.cc index 9074f11..8bee0c6 100644 --- a/chrome/browser/chromeos/login/arc_kiosk_controller.cc +++ b/chrome/browser/chromeos/login/arc_kiosk_controller.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/time/time.h" #include "base/timer/timer.h" +#include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h" #include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h" #include "chrome/browser/chromeos/login/auth/chrome_login_performer.h" #include "chrome/browser/chromeos/login/screens/encryption_migration_screen.h" @@ -56,6 +57,9 @@ } void ArcKioskController::OnCancelArcKioskLaunch() { + if (ArcKioskAppManager::Get()->GetDisableBailoutShortcut()) + return; + KioskAppLaunchError::Save(KioskAppLaunchError::USER_CANCEL); CleanUp(); chrome::AttemptUserExit();
diff --git a/chrome/browser/chromeos/login/web_kiosk_controller.cc b/chrome/browser/chromeos/login/web_kiosk_controller.cc index 301aa64..146e741 100644 --- a/chrome/browser/chromeos/login/web_kiosk_controller.cc +++ b/chrome/browser/chromeos/login/web_kiosk_controller.cc
@@ -80,6 +80,9 @@ } void WebKioskController::OnCancelAppLaunch() { + if (WebKioskAppManager::Get()->GetDisableBailoutShortcut()) + return; + KioskAppLaunchError::Save(KioskAppLaunchError::USER_CANCEL); CleanUp(); chrome::AttemptUserExit();
diff --git a/chrome/browser/extensions/api/braille_display_private/brlapi_keycode_map.cc b/chrome/browser/extensions/api/braille_display_private/brlapi_keycode_map.cc index aa4e913a..a827864 100644 --- a/chrome/browser/extensions/api/braille_display_private/brlapi_keycode_map.cc +++ b/chrome/browser/extensions/api/braille_display_private/brlapi_keycode_map.cc
@@ -24,7 +24,7 @@ const brlapi_keyCode_t kMaxLatin1KeySym = 0xff; // Range of function keys that we support. -// See ui/events/keycodes/dom/keycode_converter_data.inc for the list of all +// See ui/events/keycodes/dom/dom_code_data.inc for the list of all // key codes. const brlapi_keyCode_t kMinFunctionKey = BRLAPI_KEY_SYM_FUNCTION; const brlapi_keyCode_t kMaxFunctionKey = BRLAPI_KEY_SYM_FUNCTION + 23; @@ -42,7 +42,7 @@ // Maps a brlapi keysym, which is similar to an X keysym into the // provided event. -// See ui/events/keycodes/dom/keycode_converter_data.cc for the full +// See ui/events/keycodes/dom/dom_code_data.cc for the full // list of key codes. void MapKeySym(brlapi_keyCode_t code, KeyEvent* event) { brlapi_keyCode_t key_sym = code & BRLAPI_KEY_CODE_MASK;
diff --git a/chrome/browser/extensions/api/sessions/sessions_apitest.cc b/chrome/browser/extensions/api/sessions/sessions_apitest.cc index 533703cc..a32ab21 100644 --- a/chrome/browser/extensions/api/sessions/sessions_apitest.cc +++ b/chrome/browser/extensions/api/sessions/sessions_apitest.cc
@@ -234,19 +234,19 @@ // sessions (anything older than 14 days), so we cannot use // MockModelTypeWorker's convenience functions, which internally use very // old timestamps. - auto header_entity_data = std::make_unique<syncer::EntityData>(); - header_entity_data->client_tag_hash = + syncer::EntityData header_entity_data; + header_entity_data.client_tag_hash = TagHashFromSpecifics(header_entity.session()); - header_entity_data->id = - "FakeId:" + header_entity_data->client_tag_hash.value(); - header_entity_data->specifics = header_entity; - header_entity_data->creation_time = + header_entity_data.id = + "FakeId:" + header_entity_data.client_tag_hash.value(); + header_entity_data.specifics = header_entity; + header_entity_data.creation_time = time_now - base::TimeDelta::FromSeconds(index); - header_entity_data->modification_time = header_entity_data->creation_time; + header_entity_data.modification_time = header_entity_data.creation_time; - auto header_update = std::make_unique<syncer::UpdateResponseData>(); - header_update->entity = std::move(header_entity_data); - header_update->response_version = 1; + syncer::UpdateResponseData header_update; + header_update.entity = std::move(header_entity_data); + header_update.response_version = 1; syncer::UpdateResponseDataList updates; updates.push_back(std::move(header_update)); worker.UpdateFromServer(std::move(updates));
diff --git a/chrome/browser/notifications/web_page_notifier_controller_unittest.cc b/chrome/browser/notifications/web_page_notifier_controller_unittest.cc new file mode 100644 index 0000000..40b51e0b --- /dev/null +++ b/chrome/browser/notifications/web_page_notifier_controller_unittest.cc
@@ -0,0 +1,121 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <memory> +#include <utility> + +#include "base/bind.h" +#include "chrome/browser/content_settings/host_content_settings_map_factory.h" +#include "chrome/browser/favicon/favicon_service_factory.h" +#include "chrome/browser/notifications/web_page_notifier_controller.h" +#include "chrome/test/base/testing_profile.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/content_settings/core/common/content_settings.h" +#include "components/content_settings/core/common/content_settings_pattern.h" +#include "components/content_settings/core/test/content_settings_mock_provider.h" +#include "components/content_settings/core/test/content_settings_test_utils.h" +#include "components/favicon/core/test/mock_favicon_service.h" +#include "content/public/test/browser_task_environment.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace { + +// Note that so far it is only working for full URLs with a scheme e.g. https. +// For every other pattern type it doesn't work (without a scheme or with +// wildcards). +// TODO(tomdobro): enable other test cases after the problem is fixed. +constexpr const char* kTestPatterns[] = { + "https://full.test.com", + //"no_scheme.test.com", + //"[*.]any.test.com", + //"*://any_scheme.test.com", + //"https://[*.]scheme_any.test.com", + //"*://[*.]any_any.test.com", +}; + +class MockObserver : public NotifierController::Observer { + public: + MockObserver() = default; + + MOCK_METHOD2(OnIconImageUpdated, + void(const message_center::NotifierId& id, + const gfx::ImageSkia& image)); + + MOCK_METHOD2(OnNotifierEnabledChanged, + void(const message_center::NotifierId& id, bool enabled)); +}; + +std::unique_ptr<KeyedService> BuildMockFaviconService( + content::BrowserContext* context) { + return std::make_unique<testing::NiceMock<favicon::MockFaviconService>>(); +} + +} // namespace + +class WebPageNotifierControllerTest : public testing::Test { + protected: + void TestGetNotifiersList(ContentSetting content_setting, + HostContentSettingsMap::ProviderType provider_type, + bool expect_enabled, + bool expect_enforced); + + content::BrowserTaskEnvironment task_environment_; + + MockObserver mock_observer_; +}; + +void WebPageNotifierControllerTest::TestGetNotifiersList( + ContentSetting content_setting, + HostContentSettingsMap::ProviderType provider_type, + bool expect_enabled, + bool expect_enforced) { + WebPageNotifierController controller(&mock_observer_); + std::unique_ptr<TestingProfile> profile; + + TestingProfile::Builder builder; + builder.AddTestingFactory(FaviconServiceFactory::GetInstance(), + base::BindRepeating(&BuildMockFaviconService)); + profile = builder.Build(); + + auto* host_content_settings_map = + HostContentSettingsMapFactory::GetForProfile(profile.get()); + + auto provider = std::make_unique<content_settings::MockProvider>(); + + for (const char* pattern : kTestPatterns) { + provider->SetWebsiteSetting( + ContentSettingsPattern::FromString(pattern), + ContentSettingsPattern::Wildcard(), ContentSettingsType::NOTIFICATIONS, + std::string(), std::make_unique<base::Value>(content_setting)); + } + + content_settings::TestUtils::OverrideProvider( + host_content_settings_map, std::move(provider), provider_type); + + const auto list = controller.GetNotifierList(profile.get()); + + for (const auto& el : list) { + SCOPED_TRACE(el.name); + EXPECT_EQ(expect_enabled, el.enabled); + EXPECT_EQ(expect_enforced, el.enforced); + } +} + +TEST_F(WebPageNotifierControllerTest, TestGetNotifiersListPrefs) { + // Test URL patterns as they were given by PREF_PROVIDER imitating + // notifications enabled by the user (as opposed to admin), thus not enforced. + TestGetNotifiersList(CONTENT_SETTING_ALLOW, + HostContentSettingsMap::PREF_PROVIDER, + /*expect_enabled=*/true, /*expect_enforced=*/false); +} + +TEST_F(WebPageNotifierControllerTest, TestGetNotifiersListEnforced) { + // Test URL patterns as they were given by POLICY_PROVIDER imitating + // notifications enabled by the admin, thus enforced. + TestGetNotifiersList(CONTENT_SETTING_ALLOW, + HostContentSettingsMap::POLICY_PROVIDER, + /*expect_enabled=*/true, /*expect_enforced=*/true); +}
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java index 4a0f2d15..622b010 100644 --- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java +++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -46,6 +46,9 @@ */ public static final String ACCESSIBILITY_TAB_SWITCHER = "accessibility_tab_switcher"; + /** Whether Autofill Assistant is enabled */ + public static final String AUTOFILL_ASSISTANT_ENABLED = "autofill_assistant_switch"; + public static final String BOOKMARKS_LAST_USED_URL = "enhanced_bookmark_last_used_url"; public static final String BOOKMARKS_LAST_USED_PARENT = "enhanced_bookmark_last_used_parent_folder"; @@ -569,6 +572,7 @@ // clang-format off return Arrays.asList( ACCESSIBILITY_TAB_SWITCHER, + AUTOFILL_ASSISTANT_ENABLED, BOOKMARKS_LAST_USED_URL, BOOKMARKS_LAST_USED_PARENT, CHROME_DEFAULT_BROWSER,
diff --git a/chrome/browser/resources/chromeos/camera/.clang-format b/chrome/browser/resources/chromeos/camera/.clang-format new file mode 100644 index 0000000..7defeab --- /dev/null +++ b/chrome/browser/resources/chromeos/camera/.clang-format
@@ -0,0 +1,3 @@ +BasedOnStyle: Chromium +Standard: Cpp11 +JavaScriptWrapImports: true
diff --git a/chrome/browser/resources/chromeos/camera/src/js/background.js b/chrome/browser/resources/chromeos/camera/src/js/background.js index 1c60e3f..704024a 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/background.js +++ b/chrome/browser/resources/chromeos/camera/src/js/background.js
@@ -2,71 +2,62 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -'use strict'; - -/** - * Namespace for the Camera app. - */ -var cca = cca || {}; - -/** - * Namespace for the background page. - */ -cca.bg = {}; +import { + BackgroundOps, // eslint-disable-line no-unused-vars + ForegroundOps, // eslint-disable-line no-unused-vars +} from './background_ops.js'; +import {Intent} from './intent.js'; +import {PerfEvent, PerfLogger} from './perf.js'; /** * Fixed minimum width of the window inner-bounds in pixels. * @type {number} - * @const */ -cca.bg.MIN_WIDTH = 768; +const MIN_WIDTH = 768; /** * Initial apsect ratio of the window inner-bounds. * @type {number} - * @const */ -cca.bg.INITIAL_ASPECT_RATIO = 1.7777777777; +const INITIAL_ASPECT_RATIO = 1.7777777777; /** * Top bar color of the window. * @type {string} - * @const */ -cca.bg.TOPBAR_COLOR = '#000000'; +const TOPBAR_COLOR = '#000000'; /** * The id of the test app used in Tast. * @type {string} - * @const */ -cca.bg.TEST_API_ID = 'behllobkkfkfnphdnhnkndlbkcpglgmj'; +const TEST_API_ID = 'behllobkkfkfnphdnhnkndlbkcpglgmj'; /** * It's used in test to ensure that we won't connect to the main.html target * before the window is created, otherwise the window might disappear. * @type {?function(string): undefined} */ -cca.bg.onAppWindowCreatedForTesting = null; +let onAppWindowCreatedForTesting = null; /** * It's used in test to catch the perf event before the creation of app window * for time measurement before launch. - * @type {?cca.perf.PerfLogger} + * @type {?PerfLogger} */ -cca.bg.perfLoggerForTesting = null; +let perfLoggerForTesting = null; /** * Background object for handling launch event. - * @type {?cca.bg.Background} + * @type {?Background} */ -cca.bg.background = null; +let background = null; /** - * State of cca.bg.Window. + * State of CCAWindow. * @enum {string} */ -cca.bg.WindowState = { +const WindowState = { UNINIT: 'uninitialized', LAUNCHING: 'launching', ACTIVE: 'active', @@ -79,51 +70,51 @@ /** * Wrapper of AppWindow for tracking its state. - * @implements {cca.bg.BackgroundOps} + * @implements {BackgroundOps} */ -cca.bg.Window = class { +class CCAWindow { /** - * @param {!function(cca.bg.Window)} onActive Called when window become active + * @param {!function(CCAWindow)} onActive Called when window become active * state. - * @param {!function(cca.bg.Window)} onSuspended Called when window become + * @param {!function(CCAWindow)} onSuspended Called when window become * suspended state. - * @param {!function(cca.bg.Window)} onClosed Called when window become closed + * @param {!function(CCAWindow)} onClosed Called when window become closed * state. - * @param {?cca.perf.PerfLogger} perfLogger The logger for perf events. If it + * @param {?PerfLogger} perfLogger The logger for perf events. If it * is null, we will create a new one for the window. - * @param {cca.intent.Intent=} intent Intent to be handled by the app window. + * @param {Intent=} intent Intent to be handled by the app window. * Set to null for app window not launching from intent. */ constructor(onActive, onSuspended, onClosed, perfLogger, intent = null) { /** - * @type {!function(!cca.bg.Window)} + * @type {!function(!CCAWindow)} * @private */ this.onActive_ = onActive; /** - * @type {!function(!cca.bg.Window)} + * @type {!function(!CCAWindow)} * @private */ this.onSuspended_ = onSuspended; /** - * @type {!function(!cca.bg.Window)} + * @type {!function(!CCAWindow)} * @private */ this.onClosed_ = onClosed; /** - * @type {?cca.intent.Intent} + * @type {?Intent} * @private */ this.intent_ = intent; /** - * @type {!cca.perf.PerfLogger} + * @type {!PerfLogger} * @private */ - this.perfLogger_ = perfLogger || new cca.perf.PerfLogger(); + this.perfLogger_ = perfLogger || new PerfLogger(); /** * @type {?chrome.app.window.AppWindow} @@ -132,21 +123,21 @@ this.appWindow_ = null; /** - * @type {?cca.bg.ForegroundOps} + * @type {?ForegroundOps} * @private */ this.foregroundOps_ = null; /** - * @type {!cca.bg.WindowState} + * @type {!WindowState} * @private */ - this.state_ = cca.bg.WindowState.UNINIT; + this.state_ = WindowState.UNINIT; } /** * Gets state of the window. - * @return {cca.bg.WindowState} + * @return {WindowState} */ get state() { return this.state_; @@ -156,12 +147,11 @@ * Creates app window and launches app. */ launch() { - this.state_ = cca.bg.WindowState.LAUNCHING; + this.state_ = WindowState.LAUNCHING; // The height will be later calculated to match video aspect ratio once the // stream is available. - var initialHeight = - Math.round(cca.bg.MIN_WIDTH / cca.bg.INITIAL_ASPECT_RATIO); + const initialHeight = Math.round(MIN_WIDTH / INITIAL_ASPECT_RATIO); const windowId = this.intent_ !== null ? `main-${this.intent_.intentId}` : 'main'; @@ -171,32 +161,31 @@ chrome.app.window.create( windowUrl, { id: windowId, - frame: {color: cca.bg.TOPBAR_COLOR}, + frame: {color: TOPBAR_COLOR}, hidden: true, // Will be shown from main.js once loaded. innerBounds: { - width: cca.bg.MIN_WIDTH, + width: MIN_WIDTH, height: initialHeight, - minWidth: cca.bg.MIN_WIDTH, - left: Math.round((window.screen.availWidth - cca.bg.MIN_WIDTH) / 2), + minWidth: MIN_WIDTH, + left: Math.round((window.screen.availWidth - MIN_WIDTH) / 2), top: Math.round((window.screen.availHeight - initialHeight) / 2), }, }, (appWindow) => { - this.perfLogger_.start( - cca.perf.PerfEvent.LAUNCHING_FROM_WINDOW_CREATION); + this.perfLogger_.start(PerfEvent.LAUNCHING_FROM_WINDOW_CREATION); this.appWindow_ = appWindow; this.appWindow_.onClosed.addListener(() => { chrome.storage.local.set({maximized: appWindow.isMaximized()}); chrome.storage.local.set({fullscreen: appWindow.isFullscreen()}); - this.state_ = cca.bg.WindowState.CLOSED; + this.state_ = WindowState.CLOSED; if (this.intent_ !== null && !this.intent_.done) { this.intent_.cancel(); } this.onClosed_(this); }); appWindow.contentWindow.backgroundOps = this; - if (cca.bg.onAppWindowCreatedForTesting !== null) { - cca.bg.onAppWindowCreatedForTesting(windowUrl); + if (onAppWindowCreatedForTesting !== null) { + onAppWindowCreatedForTesting(windowUrl); } }); } @@ -219,7 +208,7 @@ * @override */ notifyActivation() { - this.state_ = cca.bg.WindowState.ACTIVE; + this.state_ = WindowState.ACTIVE; // For intent only requiring open camera with specific mode without // returning the capture result, called onIntentHandled() right // after app successfully launched. @@ -233,7 +222,7 @@ * @override */ notifySuspension() { - this.state_ = cca.bg.WindowState.SUSPENDED; + this.state_ = WindowState.SUSPENDED; this.onSuspended_(this); } @@ -248,11 +237,11 @@ * Suspends the app window. */ suspend() { - if (this.state_ === cca.bg.WindowState.LAUNCHING) { + if (this.state_ === WindowState.LAUNCHING) { console.error('Call suspend() while window is still launching.'); return; } - this.state_ = cca.bg.WindowState.SUSPENDING; + this.state_ = WindowState.SUSPENDING; this.foregroundOps_.suspend(); } @@ -260,7 +249,7 @@ * Resumes the app window. */ resume() { - this.state_ = cca.bg.WindowState.RESUMING; + this.state_ = WindowState.RESUMING; this.foregroundOps_.resume(); } @@ -268,35 +257,35 @@ * Closes the app window. */ close() { - this.state_ = cca.bg.WindowState.CLOSING; + this.state_ = WindowState.CLOSING; this.appWindow_.close(); } -}; +} /** * Launch event handler runs in background. */ -cca.bg.Background = class { +class Background { /** */ constructor() { /** * Launch window handles launch event triggered from app launcher. - * @type {?cca.bg.Window} + * @type {?CCAWindow} * @private */ this.launcherWindow_ = null; /** * Intent window handles launch event triggered from ARC++ intent. - * @type {?cca.bg.Window} + * @type {?CCAWindow} * @private */ this.intentWindow_ = null; /** * The pending intent arrived when foreground window is busy. - * @type {?cca.intent.Intent} + * @type {?Intent} */ this.pendingIntent_ = null; } @@ -330,7 +319,7 @@ /** * Returns a Window object handling launch event triggered from app launcher. - * @return {!cca.bg.Window} + * @return {!CCAWindow} * @private */ createLauncherWindow_() { @@ -364,16 +353,16 @@ this.processPendingIntent_(); } }; - const wnd = new cca.bg.Window( - onActive, onSuspended, onClosed, cca.bg.perfLoggerForTesting); - cca.bg.perfLoggerForTesting = null; + const wnd = + new CCAWindow(onActive, onSuspended, onClosed, perfLoggerForTesting); + perfLoggerForTesting = null; return wnd; } /** * Returns a Window object handling launch event triggered from ARC++ intent. - * @param {!cca.intent.Intent} intent Intent forwarding from ARC++. - * @return {!cca.bg.Window} + * @param {!Intent} intent Intent forwarding from ARC++. + * @return {!CCAWindow} * @private */ createIntentWindow_(intent) { @@ -381,7 +370,7 @@ this.assert_(wnd === this.intentWindow_, 'Wrong active intent window.'); this.assert_( !this.launcherWindow_ || - this.launcherWindow_.state === cca.bg.WindowState.SUSPENDED, + this.launcherWindow_.state === WindowState.SUSPENDED, () => `Launch window is ${ this.launcherWindow_.state} when intent window is active.`); if (this.pendingIntent_) { @@ -397,7 +386,7 @@ this.assert_(wnd === this.intentWindow_, 'Wrong closed intent window.'); this.assert_( !this.launcherWindow_ || - this.launcherWindow_.state === cca.bg.WindowState.SUSPENDED, + this.launcherWindow_.state === WindowState.SUSPENDED, () => `Launch window is ${ this.launcherWindow_.state} when intent window is closed.`); this.intentWindow_ = null; @@ -407,9 +396,9 @@ this.launcherWindow_.resume(); } }; - const wnd = new cca.bg.Window( - onActive, onSuspended, onClosed, cca.bg.perfLoggerForTesting, intent); - cca.bg.perfLoggerForTesting = null; + const wnd = new CCAWindow( + onActive, onSuspended, onClosed, perfLoggerForTesting, intent); + perfLoggerForTesting = null; return wnd; } @@ -430,7 +419,7 @@ /** * Closes the existing pending intent and replaces it with a new incoming * intent. - * @param {!cca.intent.Intent} intent New incoming intent. + * @param {!Intent} intent New incoming intent. * @private */ replacePendingIntent_(intent) { @@ -442,16 +431,16 @@ /** * Handles launch event triggered from ARC++ intent. - * @param {!cca.intent.Intent} intent Intent forwarding from ARC++. + * @param {!Intent} intent Intent forwarding from ARC++. */ launchIntent(intent) { if (this.intentWindow_) { switch (this.intentWindow_.state) { - case cca.bg.WindowState.LAUNCHING: - case cca.bg.WindowState.CLOSING: + case WindowState.LAUNCHING: + case WindowState.CLOSING: this.replacePendingIntent_(intent); break; - case cca.bg.WindowState.ACTIVE: + case WindowState.ACTIVE: this.replacePendingIntent_(intent); this.intentWindow_.close(); break; @@ -463,13 +452,13 @@ } } else if (this.launcherWindow_) { switch (this.launcherWindow_.state) { - case cca.bg.WindowState.LAUNCHING: - case cca.bg.WindowState.SUSPENDING: - case cca.bg.WindowState.RESUMING: - case cca.bg.WindowState.CLOSING: + case WindowState.LAUNCHING: + case WindowState.SUSPENDING: + case WindowState.RESUMING: + case WindowState.CLOSING: this.replacePendingIntent_(intent); break; - case cca.bg.WindowState.ACTIVE: + case WindowState.ACTIVE: this.assert_( !this.pendingIntent_, 'Pending intent is not processed when launch window is active.'); @@ -487,7 +476,7 @@ this.intentWindow_.launch(); } } -}; +} /** * Handles messages from the test extension used in Tast. @@ -499,72 +488,70 @@ * @return {boolean|undefined} True to indicate the response is sent * asynchronously. */ -cca.bg.handleExternalMessageFromTest = function(message, sender, sendResponse) { - if (sender.id !== cca.bg.TEST_API_ID) { +function handleExternalMessageFromTest(message, sender, sendResponse) { + if (sender.id !== TEST_API_ID) { console.warn(`Unknown sender id: ${sender.id}`); return; } switch (message.action) { case 'SET_WINDOW_CREATED_CALLBACK': - cca.bg.onAppWindowCreatedForTesting = sendResponse; + onAppWindowCreatedForTesting = sendResponse; return true; default: console.warn(`Unknown action: ${message.action}`); } -}; +} /** * Handles connection from the test extension used in Tast. * @param {Port} port The port that used to do two-way communication. */ -cca.bg.handleExternalConnectionFromTest = function(port) { - if (port.sender.id !== cca.bg.TEST_API_ID) { +function handleExternalConnectionFromTest(port) { + if (port.sender.id !== TEST_API_ID) { console.warn(`Unknown sender id: ${port.sender.id}`); return; } switch (port.name) { case 'SET_PERF_CONNECTION': port.onMessage.addListener((event) => { - if (cca.bg.perfLoggerForTesting === null) { - cca.bg.perfLoggerForTesting = new cca.perf.PerfLogger(); + if (perfLoggerForTesting === null) { + perfLoggerForTesting = new PerfLogger(); - cca.bg.perfLoggerForTesting.addListener((event, duration, extras) => { + perfLoggerForTesting.addListener((event, duration, extras) => { port.postMessage({event, duration, extras}); }); } const {name} = event; - if (name !== cca.perf.PerfEvent.LAUNCHING_FROM_LAUNCH_APP_COLD && - name !== cca.perf.PerfEvent.LAUNCHING_FROM_LAUNCH_APP_WARM) { + if (name !== PerfEvent.LAUNCHING_FROM_LAUNCH_APP_COLD && + name !== PerfEvent.LAUNCHING_FROM_LAUNCH_APP_WARM) { console.warn(`Unknown event name from test: ${name}`); return; } - cca.bg.perfLoggerForTesting.start(name); + perfLoggerForTesting.start(name); }); return; default: console.warn(`Unknown port name: ${port.name}`); } -}; +} chrome.app.runtime.onLaunched.addListener((launchData) => { - if (!cca.bg.background) { - cca.bg.background = new cca.bg.Background(); + if (!background) { + background = new Background(); } try { if (launchData.url) { - const intent = cca.intent.Intent.create(new URL(launchData.url)); - cca.bg.background.launchIntent(intent); + const intent = Intent.create(new URL(launchData.url)); + background.launchIntent(intent); } else { - cca.bg.background.launchApp(); + background.launchApp(); } } catch (e) { console.error(e.stack); } }); -chrome.runtime.onMessageExternal.addListener( - cca.bg.handleExternalMessageFromTest); +chrome.runtime.onMessageExternal.addListener(handleExternalMessageFromTest); -chrome.runtime.onConnectExternal.addListener( - cca.bg.handleExternalConnectionFromTest); +chrome.runtime.onConnectExternal.addListener(handleExternalConnectionFromTest);
diff --git a/chrome/browser/resources/chromeos/camera/src/js/main.js b/chrome/browser/resources/chromeos/camera/src/js/main.js index ec74a39..8065937 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/main.js +++ b/chrome/browser/resources/chromeos/camera/src/js/main.js
@@ -2,70 +2,94 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -'use strict'; - -/** - * Namespace for the Camera app. - */ -var cca = cca || {}; +import { + BackgroundOps, // eslint-disable-line no-unused-vars + ForegroundOps, // eslint-disable-line no-unused-vars +} from './background_ops.js'; +import {browserProxy} from './browser_proxy/browser_proxy.js'; +import {assert, assertInstanceof} from './chrome_util.js'; +import { + PhotoConstraintsPreferrer, + VideoConstraintsPreferrer, +} from './device/constraints_preferrer.js'; +import {DeviceInfoUpdater} from './device/device_info_updater.js'; +import {GalleryButton} from './gallerybutton.js'; +import * as metrics from './metrics.js'; +import * as filesystem from './models/filesystem.js'; +import * as nav from './nav.js'; +import {PerfEvent} from './perf.js'; +import * as state from './state.js'; +import * as tooltip from './tooltip.js'; +import {Mode} from './type.js'; +import * as util from './util.js'; +import {Camera} from './views/camera.js'; +import {CameraIntent} from './views/camera_intent.js'; +import {Dialog} from './views/dialog.js'; +import { + BaseSettings, + MasterSettings, + ResolutionSettings, +} from './views/settings.js'; +import {ViewName} from './views/view.js'; +import {Warning} from './views/warning.js'; /** * Creates the Camera App main object. - * @implements {cca.bg.ForegroundOps} + * @implements {ForegroundOps} */ -cca.App = class { +export class App { /** - * @param {!cca.bg.BackgroundOps} backgroundOps + * @param {!BackgroundOps} backgroundOps */ constructor(backgroundOps) { /** - * @type {!cca.bg.BackgroundOps} + * @type {!BackgroundOps} * @private */ this.backgroundOps_ = backgroundOps; /** - * @type {!cca.device.PhotoConstraintsPreferrer} + * @type {!PhotoConstraintsPreferrer} * @private */ - this.photoPreferrer_ = new cca.device.PhotoConstraintsPreferrer( - () => this.cameraView_.start()); + this.photoPreferrer_ = + new PhotoConstraintsPreferrer(() => this.cameraView_.start()); /** - * @type {!cca.device.VideoConstraintsPreferrer} + * @type {!VideoConstraintsPreferrer} * @private */ - this.videoPreferrer_ = new cca.device.VideoConstraintsPreferrer( - () => this.cameraView_.start()); + this.videoPreferrer_ = + new VideoConstraintsPreferrer(() => this.cameraView_.start()); /** - * @type {!cca.device.DeviceInfoUpdater} + * @type {!DeviceInfoUpdater} * @private */ - this.infoUpdater_ = new cca.device.DeviceInfoUpdater( - this.photoPreferrer_, this.videoPreferrer_); + this.infoUpdater_ = + new DeviceInfoUpdater(this.photoPreferrer_, this.videoPreferrer_); /** - * @type {!cca.GalleryButton} + * @type {!GalleryButton} * @private */ - this.galleryButton_ = new cca.GalleryButton(); + this.galleryButton_ = new GalleryButton(); /** - * @type {!cca.views.Camera} + * @type {!Camera} * @private */ this.cameraView_ = (() => { const intent = this.backgroundOps_.getIntent(); const perfLogger = this.backgroundOps_.getPerfLogger(); if (intent !== null && intent.shouldHandleResult) { - cca.state.set(cca.state.State.SHOULD_HANDLE_INTENT_RESULT, true); - return new cca.views.CameraIntent( + state.set(state.State.SHOULD_HANDLE_INTENT_RESULT, true); + return new CameraIntent( intent, this.infoUpdater_, this.photoPreferrer_, this.videoPreferrer_, perfLogger); } else { - const mode = intent !== null ? intent.mode : cca.Mode.PHOTO; - return new cca.views.Camera( + const mode = intent !== null ? intent.mode : Mode.PHOTO; + return new Camera( this.galleryButton_, this.infoUpdater_, this.photoPreferrer_, this.videoPreferrer_, mode, perfLogger); } @@ -74,22 +98,22 @@ document.body.addEventListener('keydown', this.onKeyPressed_.bind(this)); document.title = chrome.i18n.getMessage('name'); - cca.util.setupI18nElements(document.body); + util.setupI18nElements(document.body); this.setupToggles_(); // Set up views navigation by their DOM z-order. - cca.nav.setup([ + nav.setup([ this.cameraView_, - new cca.views.MasterSettings(), - new cca.views.BaseSettings(cca.views.ViewName.GRID_SETTINGS), - new cca.views.BaseSettings(cca.views.ViewName.TIMER_SETTINGS), - new cca.views.ResolutionSettings( + new MasterSettings(), + new BaseSettings(ViewName.GRID_SETTINGS), + new BaseSettings(ViewName.TIMER_SETTINGS), + new ResolutionSettings( this.infoUpdater_, this.photoPreferrer_, this.videoPreferrer_), - new cca.views.BaseSettings(cca.views.ViewName.PHOTO_RESOLUTION_SETTINGS), - new cca.views.BaseSettings(cca.views.ViewName.VIDEO_RESOLUTION_SETTINGS), - new cca.views.BaseSettings(cca.views.ViewName.EXPERT_SETTINGS), - new cca.views.Warning(), - new cca.views.Dialog(cca.views.ViewName.MESSAGE_DIALOG), + new BaseSettings(ViewName.PHOTO_RESOLUTION_SETTINGS), + new BaseSettings(ViewName.VIDEO_RESOLUTION_SETTINGS), + new BaseSettings(ViewName.EXPERT_SETTINGS), + new Warning(), + new Dialog(ViewName.MESSAGE_DIALOG), ]); this.backgroundOps_.bindForegroundOps(this); @@ -100,25 +124,23 @@ * @private */ setupToggles_() { - cca.proxy.browserProxy.localStorageGet( - {expert: false}, - ({expert}) => cca.state.set(cca.state.State.EXPERT, expert)); + browserProxy.localStorageGet( + {expert: false}, ({expert}) => state.set(state.State.EXPERT, expert)); document.querySelectorAll('input').forEach((element) => { element.addEventListener( 'keypress', - (event) => cca.util.getShortcutIdentifier(event) === 'Enter' && - element.click()); + (event) => + util.getShortcutIdentifier(event) === 'Enter' && element.click()); const payload = (element) => ({[element.dataset.key]: element.checked}); const save = (element) => { if (element.dataset.key !== undefined) { - cca.proxy.browserProxy.localStorageSet(payload(element)); + browserProxy.localStorageSet(payload(element)); } }; element.addEventListener('change', (event) => { if (element.dataset.state !== undefined) { - cca.state.set( - cca.state.assertState(element.dataset.state), element.checked); + state.set(state.assertState(element.dataset.state), element.checked); } if (event.isTrusted) { save(element); @@ -134,10 +156,10 @@ }); if (element.dataset.key !== undefined) { // Restore the previously saved state on startup. - cca.proxy.browserProxy.localStorageGet( + browserProxy.localStorageGet( payload(element), - (values) => cca.util.toggleChecked( - cca.assertInstanceof(element, HTMLInputElement), + (values) => util.toggleChecked( + assertInstanceof(element, HTMLInputElement), values[element.dataset.key])); } }); @@ -149,11 +171,11 @@ */ async start() { var ackMigrate = false; - cca.models.FileSystem + filesystem .initialize(() => { // Prompt to migrate pictures if needed. var message = chrome.i18n.getMessage('migrate_pictures_msg'); - return cca.nav.open('message-dialog', {message, cancellable: false}) + return nav.open('message-dialog', {message, cancellable: false}) .then((acked) => { if (!acked) { throw new Error('no-migrate'); @@ -162,10 +184,10 @@ }); }) .then((external) => { - const externalDir = cca.models.FileSystem.getExternalDirectory(); - cca.assert(externalDir !== null); + const externalDir = filesystem.getExternalDirectory(); + assert(externalDir !== null); this.galleryButton_.initialize(externalDir); - cca.nav.open(cca.views.ViewName.CAMERA); + nav.open(ViewName.CAMERA); }) .catch((error) => { console.error(error); @@ -173,13 +195,13 @@ chrome.app.window.current().close(); return; } - cca.nav.open('warning', 'filesystem-failure'); + nav.open('warning', 'filesystem-failure'); }) .finally(() => { - cca.metrics.log(cca.metrics.Type.LAUNCH, ackMigrate); + metrics.log(metrics.Type.LAUNCH, ackMigrate); }); const showWindow = (async () => { - await cca.util.fitWindow(); + await util.fitWindow(); chrome.app.window.current().show(); this.backgroundOps_.notifyActivation(); })(); @@ -196,8 +218,8 @@ * @private */ onKeyPressed_(event) { - cca.tooltip.hide(); // Hide shown tooltip on any keypress. - cca.nav.onKeyPressed(event); + tooltip.hide(); // Hide shown tooltip on any keypress. + nav.onKeyPressed(event); } /** @@ -205,7 +227,7 @@ * @return {!Promise} */ async suspend() { - cca.state.set(cca.state.State.SUSPEND, true); + state.set(state.State.SUSPEND, true); await this.cameraView_.start(); chrome.app.window.current().hide(); this.backgroundOps_.notifySuspension(); @@ -215,47 +237,46 @@ * Resumes app from suspension and shows app window. */ resume() { - cca.state.set(cca.state.State.SUSPEND, false); + state.set(state.State.SUSPEND, false); chrome.app.window.current().show(); this.backgroundOps_.notifyActivation(); } -}; +} /** * Singleton of the App object. - * @type {?cca.App} - * @private + * @type {?App} */ -cca.App.instance_ = null; +let instance = null; /** * Creates the App object and starts camera stream. */ document.addEventListener('DOMContentLoaded', async () => { - if (cca.App.instance_ !== null) { + if (instance !== null) { return; } - cca.assert(window['backgroundOps'] !== undefined); - const /** !cca.bg.BackgroundOps */ bgOps = window['backgroundOps']; + assert(window['backgroundOps'] !== undefined); + const /** !BackgroundOps */ bgOps = window['backgroundOps']; const perfLogger = bgOps.getPerfLogger(); // Setup listener for performance events. perfLogger.addListener((event, duration, extras) => { - cca.metrics.log(cca.metrics.Type.PERF, event, duration, extras); + metrics.log(metrics.Type.PERF, event, duration, extras); }); - const states = Object.values(cca.perf.PerfEvent); - states.push(cca.state.State.TAKING); - states.forEach((state) => { - cca.state.addObserver(state, (val, extras) => { - let event = state; - if (state === cca.state.State.TAKING) { + const states = Object.values(PerfEvent); + states.push(state.State.TAKING); + states.forEach((s) => { + state.addObserver(s, (val, extras) => { + let event = s; + if (s === state.State.TAKING) { // 'taking' state indicates either taking photo or video. Skips for // video-taking case since we only want to collect the metrics of // photo-taking. - if (cca.state.get(cca.Mode.VIDEO)) { + if (state.get(Mode.VIDEO)) { return; } - event = cca.perf.PerfEvent.PHOTO_TAKING; + event = PerfEvent.PHOTO_TAKING; } if (val) { @@ -265,7 +286,7 @@ } }); }); - cca.App.instance_ = new cca.App( - /** @type {!cca.bg.BackgroundOps} */ (bgOps)); - await cca.App.instance_.start(); + instance = new App( + /** @type {!BackgroundOps} */ (bgOps)); + await instance.start(); });
diff --git a/chrome/browser/resources/chromeos/camera/src/views/background.html b/chrome/browser/resources/chromeos/camera/src/views/background.html index 4a4e914..521725a2 100644 --- a/chrome/browser/resources/chromeos/camera/src/views/background.html +++ b/chrome/browser/resources/chromeos/camera/src/views/background.html
@@ -4,14 +4,10 @@ found in the LICENSE file. --> <html> <head> - <script src="../js/namespace.js"></script> <script src="../js/mojo/mojo_bindings_lite.js"></script> <script src="../js/mojo/camera_intent.mojom-lite.js"></script> <script src="../js/mojo/camera_app_helper.mojom-lite.js"></script> - <script type="module" src="../js/mojo/chrome_helper.js"></script> - <script type="module" src="../js/type.js"></script> - <script type="module" src="../js/perf.js"></script> - <script type="module" src="../js/intent.js"></script> - <script defer src="../js/background.js"></script> + <script src="../js/namespace.js"></script> + <script type="module" src="../js/background.js"></script> </head> </html>
diff --git a/chrome/browser/resources/chromeos/camera/src/views/main.html b/chrome/browser/resources/chromeos/camera/src/views/main.html index d50a7ac..e5d02b3 100644 --- a/chrome/browser/resources/chromeos/camera/src/views/main.html +++ b/chrome/browser/resources/chromeos/camera/src/views/main.html
@@ -10,57 +10,18 @@ <meta charset="utf-8"> <link rel="stylesheet" href="../css/main.css"> <script src="../js/namespace.js"></script> - <script type="module" src="../js/chrome_util.js"></script> - <script type="module" src="../js/browser_proxy/browser_proxy.js"></script> <script src="../js/google-analytics-bundle.js"></script> - <script type="module" src="../js/type.js"></script> - <script type="module" src="../js/perf.js"></script> - <script type="module" src="../js/metrics.js"></script> - <script type="module" src="../js/intent.js"></script> - <script type="module" src="../js/util.js"></script> - <script type="module" src="../js/toast.js"></script> - <script type="module" src="../js/tooltip.js"></script> - <script type="module" src="../js/state.js"></script> - <script type="module" src="../js/sound.js"></script> - <script type="module" src="../js/device/error.js"></script> - <script type="module" src="../js/device/camera3_device_info.js"></script> - <script type="module" src="../js/device/constraints_preferrer.js"></script> - <script type="module" src="../js/device/device_info_updater.js"></script> - <script type="module" src="../js/models/filenamer.js"></script> - <script type="module" src="../js/gallerybutton.js"></script> - <script type="module" src="../js/models/filesystem.js"></script> - <script type="module" src="../js/models/result_saver.js"></script> - <script type="module" src="../js/models/video_saver_interface.js"></script> - <script type="module" src="../js/models/file_video_saver.js"></script> - <script type="module" src="../js/models/intent_video_saver.js"></script> - <script defer src="../js/mojo/mojo_bindings_lite.js"></script> - <script defer src="../js/mojo/camera_metadata_tags.mojom-lite.js"></script> - <script defer src="../js/mojo/camera_metadata.mojom-lite.js"></script> - <script defer src="../js/mojo/camera_common.mojom-lite.js"></script> - <script defer src="../js/mojo/image_capture.mojom-lite.js"></script> - <script defer src="../js/mojo/geometry.mojom-lite.js"></script> - <script defer src="../js/mojo/range.mojom-lite.js"></script> - <script defer src="../js/mojo/camera_intent.mojom-lite.js"></script> - <script defer src="../js/mojo/camera_app.mojom-lite.js"></script> - <script defer src="../js/mojo/camera_app_helper.mojom-lite.js"></script> - <script type="module" src="../js/mojo/chrome_helper.js"></script> - <script type="module" src="../js/mojo/device_operator.js"></script> - <script type="module" src="../js/mojo/image_capture.js"></script> - <script type="module" src="../js/views/view.js"></script> - <script type="module" src="../js/views/camera.js"></script> - <script type="module" src="../js/views/camera_intent.js"></script> - <script type="module" src="../js/views/camera/layout.js"></script> - <script type="module" src="../js/views/camera/options.js"></script> - <script type="module" src="../js/views/camera/preview.js"></script> - <script type="module" src="../js/views/camera/recordtime.js"></script> - <script type="module" src="../js/views/camera/review_result.js"></script> - <script type="module" src="../js/views/camera/timertick.js"></script> - <script type="module" src="../js/views/camera/modes.js"></script> - <script type="module" src="../js/views/dialog.js"></script> - <script type="module" src="../js/views/settings.js"></script> - <script type="module" src="../js/views/warning.js"></script> - <script type="module" src="../js/nav.js"></script> - <script defer src="../js/main.js"></script> + <script src="../js/mojo/mojo_bindings_lite.js"></script> + <script src="../js/mojo/camera_metadata_tags.mojom-lite.js"></script> + <script src="../js/mojo/camera_metadata.mojom-lite.js"></script> + <script src="../js/mojo/camera_common.mojom-lite.js"></script> + <script src="../js/mojo/image_capture.mojom-lite.js"></script> + <script src="../js/mojo/geometry.mojom-lite.js"></script> + <script src="../js/mojo/range.mojom-lite.js"></script> + <script src="../js/mojo/camera_intent.mojom-lite.js"></script> + <script src="../js/mojo/camera_app.mojom-lite.js"></script> + <script src="../js/mojo/camera_app_helper.mojom-lite.js"></script> + <script type="module" src="../js/main.js"></script> </head> <body class="sound mirror mic _3x3"> <div id="camera">
diff --git a/chrome/browser/sync/trusted_vault_client_android.cc b/chrome/browser/sync/trusted_vault_client_android.cc index 002da8b..a1af9f84 100644 --- a/chrome/browser/sync/trusted_vault_client_android.cc +++ b/chrome/browser/sync/trusted_vault_client_android.cc
@@ -50,6 +50,18 @@ std::move(cb).Run(converted_keys); } +void TrustedVaultClientAndroid::MarkKeysAsStaleCompleted(JNIEnv* env, + jboolean result) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + DCHECK(ongoing_mark_keys_as_stale_) << "No ongoing MarkKeysAsStale() request"; + + // Make a copy of the callback and reset |ongoing_mark_keys_as_stale_| before + // invoking the callback, in case it has side effects. + base::OnceCallback<void(bool)> cb = std::move(ongoing_mark_keys_as_stale_); + + std::move(cb).Run(!!result); +} + std::unique_ptr<TrustedVaultClientAndroid::Subscription> TrustedVaultClientAndroid::AddKeysChangedObserver( const base::RepeatingClosure& cb) { @@ -62,6 +74,8 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK(!ongoing_fetch_keys_) << "Only one FetchKeys() request is allowed at any time"; + DCHECK(!ongoing_mark_keys_as_stale_) + << "FetchKeys() not allowed while ongoing MarkKeysAsStale()"; // Store for later completion when Java invokes FetchKeysCompleted(). ongoing_fetch_keys_ = @@ -83,3 +97,25 @@ // Not supported on Android, where keys are fetched outside the browser. NOTREACHED(); } + +void TrustedVaultClientAndroid::MarkKeysAsStale( + const std::string& gaia_id, + base::OnceCallback<void(bool)> cb) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + DCHECK(cb); + DCHECK(!ongoing_mark_keys_as_stale_) + << "Only one MarkKeysAsStale() request is allowed at any time"; + DCHECK(!ongoing_fetch_keys_) + << "MarkKeysAsStale() not allowed while ongoing FetchKeys()"; + + // Store for later completion when Java invokes MarkKeysAsStaleCompleted(). + ongoing_mark_keys_as_stale_ = std::move(cb); + + JNIEnv* const env = base::android::AttachCurrentThread(); + const base::android::ScopedJavaLocalRef<jstring> java_gaia_id = + base::android::ConvertUTF8ToJavaString(env, gaia_id); + + // The Java implementation will eventually call MarkKeysAsStaleCompleted(). + Java_TrustedVaultClient_markKeysAsStale(env, reinterpret_cast<intptr_t>(this), + java_gaia_id); +}
diff --git a/chrome/browser/sync/trusted_vault_client_android.h b/chrome/browser/sync/trusted_vault_client_android.h index c371f86..0141e4e 100644 --- a/chrome/browser/sync/trusted_vault_client_android.h +++ b/chrome/browser/sync/trusted_vault_client_android.h
@@ -36,6 +36,11 @@ const base::android::JavaParamRef<jstring>& gaia_id, const base::android::JavaParamRef<jobjectArray>& keys); + // Called from Java to notify the completion of MarkKeysAsStale() + // operation previously initiated from C++. This must correspond to an + // ongoing MarkKeysAsStale() request. + void MarkKeysAsStaleCompleted(JNIEnv* env, jboolean result); + // TrustedVaultClient implementation. std::unique_ptr<Subscription> AddKeysChangedObserver( const base::RepeatingClosure& cb) override; @@ -45,6 +50,8 @@ override; void StoreKeys(const std::string& gaia_id, const std::vector<std::vector<uint8_t>>& keys) override; + void MarkKeysAsStale(const std::string& gaia_id, + base::OnceCallback<void(bool)> cb) override; private: // Struct representing an in-flight FetchKeys() call invoked from C++. @@ -62,6 +69,10 @@ // Null if no in-flight FetchKeys(). std::unique_ptr<OngoingFetchKeys> ongoing_fetch_keys_; + // Completion callback of an in-flight MarkKeysAsStale() call invoked from + // C++. + base::OnceCallback<void(bool)> ongoing_mark_keys_as_stale_; + CallbackList observer_list_; };
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index ae32bcd..dbc4bdb 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -3890,6 +3890,9 @@ <message name="IDS_PREFS_AUTOFILL_ASSISTANT_SWITCH" desc="Title for the switch toggling whether Autofill Assistant is enabled. [CHAR-LIMIT=32]"> Assistant Triggered Checkout </message> + <message name="IDS_PREFS_AUTOFILL_ASSISTANT_SUMMARY" desc="Description for the Autofill Assistant toggle."> + To complete tasks on the web via Google Assistant, Chrome sends a site's URL, site content, and relevant personal information to Google + </message> <!-- Usage Stats strings --> <message name="IDS_USAGE_STATS_CONSENT_TITLE" desc="Title for activity authorizing Digital Wellbeing to access Chrome usage data"> Show your Chrome activity in Digital Wellbeing?
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_AUTOFILL_ASSISTANT_SUMMARY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_AUTOFILL_ASSISTANT_SUMMARY.png.sha1 new file mode 100644 index 0000000..21d0737 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_AUTOFILL_ASSISTANT_SUMMARY.png.sha1
@@ -0,0 +1 @@ +24bb6483881babd5d1fe4008947d4e34b289d6e9 \ No newline at end of file
diff --git a/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc b/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc index 8936a013..a95f9ed 100644 --- a/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc +++ b/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc
@@ -94,16 +94,6 @@ } bool LaunchFlashFullscreenInSubframe() { - // Start the embedded test server and set it up to serve PPAPI test case - // URLs. - base::FilePath document_root; - EXPECT_TRUE(ui_test_utils::GetRelativeBuildDirectory(&document_root)); - embedded_test_server()->AddDefaultHandlers(document_root); - if (!embedded_test_server()->Start()) { - ADD_FAILURE() << "Failed to launch embedded test server."; - return false; - } - // Load a page with an <iframe> that points to the test case URL, which // runs the simulated fullscreen Flash plugin. In OOPIF modes, the frame // will render in a separate process. Block until the plugin has completed
diff --git a/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc b/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc index dd5237e..f0c7abc 100644 --- a/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc +++ b/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc
@@ -301,20 +301,19 @@ return specifics; } -std::unique_ptr<syncer::UpdateResponseData> -RecentTabsBuilderTestHelper::BuildUpdateResponseData( +syncer::UpdateResponseData RecentTabsBuilderTestHelper::BuildUpdateResponseData( const sync_pb::SessionSpecifics& specifics, base::Time timestamp) { - auto entity = std::make_unique<syncer::EntityData>(); - *entity->specifics.mutable_session() = specifics; - entity->creation_time = timestamp; - entity->modification_time = timestamp; - entity->client_tag_hash = syncer::ClientTagHash::FromUnhashed( + syncer::EntityData entity; + *entity.specifics.mutable_session() = specifics; + entity.creation_time = timestamp; + entity.modification_time = timestamp; + entity.client_tag_hash = syncer::ClientTagHash::FromUnhashed( syncer::SESSIONS, sync_sessions::SessionStore::GetClientTag(specifics)); - entity->id = entity->client_tag_hash.value(); + entity.id = entity.client_tag_hash.value(); - auto update = std::make_unique<syncer::UpdateResponseData>(); - update->entity = std::move(entity); - update->response_version = ++next_response_version_; + syncer::UpdateResponseData update; + update.entity = std::move(entity); + update.response_version = ++next_response_version_; return update; }
diff --git a/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h b/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h index b8dae09..17cacd5 100644 --- a/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h +++ b/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h
@@ -67,7 +67,7 @@ sync_pb::SessionSpecifics BuildTabSpecifics(int session_index, int window_index, int tab_index); - std::unique_ptr<syncer::UpdateResponseData> BuildUpdateResponseData( + syncer::UpdateResponseData BuildUpdateResponseData( const sync_pb::SessionSpecifics& specifics, base::Time timestamp);
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc index 6f11796..a6dea5bf 100644 --- a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc +++ b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc
@@ -300,6 +300,9 @@ readable_paths_model_({}, usage_.readable_directories) { DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_DONE)); + DialogDelegate::set_button_label( + ui::DIALOG_BUTTON_CANCEL, + l10n_util::GetStringUTF16(IDS_NATIVE_FILE_SYSTEM_USAGE_REMOVE_ACCESS)); } NativeFileSystemUsageBubbleView::~NativeFileSystemUsageBubbleView() = default; @@ -317,14 +320,6 @@ ->GetTextForTooltipAndAccessibleName(); } -base::string16 NativeFileSystemUsageBubbleView::GetDialogButtonLabel( - ui::DialogButton button) const { - int message_id = IDS_DONE; - if (button == ui::DIALOG_BUTTON_CANCEL) - message_id = IDS_NATIVE_FILE_SYSTEM_USAGE_REMOVE_ACCESS; - return l10n_util::GetStringUTF16(message_id); -} - bool NativeFileSystemUsageBubbleView::ShouldShowCloseButton() const { return true; }
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.h b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.h index da9cf5e..32c8982 100644 --- a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.h +++ b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.h
@@ -61,7 +61,6 @@ // LocationBarBubbleDelegateView: base::string16 GetAccessibleWindowTitle() const override; - base::string16 GetDialogButtonLabel(ui::DialogButton button) const override; bool ShouldShowCloseButton() const override; void Init() override; bool Cancel() override;
diff --git a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc index d7c124c..e98c39c7 100644 --- a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc +++ b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc
@@ -59,6 +59,10 @@ platform_util::GetViewForWindow(browser->window()->GetNativeWindow())); } DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); + DialogDelegate::set_button_label( + ui::DIALOG_BUTTON_OK, + l10n_util::GetStringUTF16( + IDS_SETTINGS_STORAGE_PRESSURE_BUBBLE_VIEW_BUTTON_LABEL)); } base::string16 StoragePressureBubbleView::GetWindowTitle() const { @@ -80,14 +84,6 @@ return true; } -base::string16 StoragePressureBubbleView::GetDialogButtonLabel( - ui::DialogButton button) const { - if (button == ui::DIALOG_BUTTON_OK) - return l10n_util::GetStringUTF16( - IDS_SETTINGS_STORAGE_PRESSURE_BUBBLE_VIEW_BUTTON_LABEL); - return views::DialogDelegateView::GetDialogButtonLabel(button); -} - void StoragePressureBubbleView::Init() { ChromeLayoutProvider* provider = ChromeLayoutProvider::Get(); SetLayoutManager(std::make_unique<views::BoxLayout>(
diff --git a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.h b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.h index dfc6e528..6769d83 100644 --- a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.h +++ b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.h
@@ -24,7 +24,6 @@ base::string16 GetWindowTitle() const override; bool Accept() override; bool Close() override; - base::string16 GetDialogButtonLabel(ui::DialogButton button) const override; // views::BubbleDialogDelegateView: void Init() override;
diff --git a/chrome/browser/web_applications/web_app_sync_bridge_unittest.cc b/chrome/browser/web_applications/web_app_sync_bridge_unittest.cc index 8fe5ad2..28b531b4 100644 --- a/chrome/browser/web_applications/web_app_sync_bridge_unittest.cc +++ b/chrome/browser/web_applications/web_app_sync_bridge_unittest.cc
@@ -140,11 +140,11 @@ switch (change_type) { case syncer::EntityChange::ACTION_ADD: entity_change = syncer::EntityChange::CreateAdd( - app.app_id(), CreateSyncEntityData(app)); + app.app_id(), std::move(*CreateSyncEntityData(app))); break; case syncer::EntityChange::ACTION_UPDATE: entity_change = syncer::EntityChange::CreateUpdate( - app.app_id(), CreateSyncEntityData(app)); + app.app_id(), std::move(*CreateSyncEntityData(app))); break; case syncer::EntityChange::ACTION_DELETE: entity_change = syncer::EntityChange::CreateDelete(app.app_id());
diff --git a/chrome/common/extensions/api/autotest_private.idl b/chrome/common/extensions/api/autotest_private.idl index e132af655..6c090b9 100644 --- a/chrome/common/extensions/api/autotest_private.idl +++ b/chrome/common/extensions/api/autotest_private.idl
@@ -239,6 +239,8 @@ callback IsArcProvisionedCallback = void (boolean arcProvisioned); + callback IsArcPackageListInitialRefreshedCallback = void (boolean refreshed); + dictionary ArcAppDict { DOMString name; DOMString packageName; @@ -662,6 +664,11 @@ long timeout_s, AssistantQueryStatusCallback callback); + // Whether the local list of installed ARC packages has been refreshed for + // the first time after user login. + static void isArcPackageListInitialRefreshed( + IsArcPackageListInitialRefreshedCallback callback); + // Set value for the specified user pref in the pref tree. static void setWhitelistedPref(DOMString pref_name, any value, VoidCallback callback);
diff --git a/chrome/services/keymaster/public/mojom/BUILD.gn b/chrome/services/keymaster/public/mojom/BUILD.gn new file mode 100644 index 0000000..d49f4c27 --- /dev/null +++ b/chrome/services/keymaster/public/mojom/BUILD.gn
@@ -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. + +import("//mojo/public/tools/bindings/mojom.gni") + +assert(is_chromeos) + +mojom("mojom") { + sources = [ + "cert_store.mojom", + ] + + public_deps = [ + "//mojo/public/mojom/base", + ] +}
diff --git a/chrome/services/keymaster/public/mojom/OWNERS b/chrome/services/keymaster/public/mojom/OWNERS new file mode 100644 index 0000000..08850f4 --- /dev/null +++ b/chrome/services/keymaster/public/mojom/OWNERS
@@ -0,0 +1,2 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/services/keymaster/public/mojom/cert_store.mojom b/chrome/services/keymaster/public/mojom/cert_store.mojom new file mode 100644 index 0000000..976d21e9 --- /dev/null +++ b/chrome/services/keymaster/public/mojom/cert_store.mojom
@@ -0,0 +1,63 @@ +// 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. + +// Next MinVersion: 1 + +// This file defines the mojo interface between arc-keymaster and Chrome for the +// keys hardware-backed and accessible by Chrome. + +module arc.keymaster.mojom; + +// Enumerates the crypto algorithms supported by Host. +[Extensible] +enum Algorithm { + kRsaPkcs1, +}; + +// Enumerates the digests supported by Host. +[Extensible] +enum Digest { + kSha1, + kSha256, + kSha384, + kSha512, +}; + +// Enumerates the result codes of signature operation. +[Extensible] +enum SignatureResult { + kOk, + // Failed with error. + kFailed, + // Inspect Chrome's logs for the exact net::Error. + kNetError, + kUnsupportedAlgorithm, +}; + +// Interface exposed by Chrome. +// Next method ID: 1 +interface CertStoreHost { + // Returns an interface to SecurityTokenOperation. + GetSecurityTokenOperation@0(SecurityTokenOperation& operation) => (); +}; + +// Interface exposed by arc-keymaster daemon. +// Next method ID: 1 +interface CertStoreInstance { + // Establishes full-duplex communication with the host. + Init@0(CertStoreHost host_ptr) => (); +}; + +// Implemented in Chrome. +// Next method ID: 1 +interface SecurityTokenOperation { + // Signs input |data| pre-hashed with the given |digest|. + // Retrieves a |signature| signed by a certificate identified by + // |subject_public_key_info| by |algorithm| (currently, only RSA is + // supported). + // In case of any error, |signature| is null. + SignDigest@0(string subject_public_key_info, Algorithm algorithm, + Digest digest, array<uint8> data) => (SignatureResult result, + array<uint8>? signature); +};
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 00dd673..1b746a4 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -4294,6 +4294,7 @@ "../browser/metrics/perf/profile_provider_chromeos_unittest.cc", "../browser/metrics/perf/windowed_incognito_observer_unittest.cc", "../browser/notifications/chrome_ash_message_center_client_unittest.cc", + "../browser/notifications/web_page_notifier_controller_unittest.cc", "../browser/signin/signin_error_notifier_ash_unittest.cc", "../browser/speech/tts_chromeos_unittest.cc", "../browser/sync/sync_error_notifier_ash_unittest.cc",
diff --git a/chrome/test/ppapi/ppapi_browsertest.cc b/chrome/test/ppapi/ppapi_browsertest.cc index 01cb0b9..7bc18b97 100644 --- a/chrome/test/ppapi/ppapi_browsertest.cc +++ b/chrome/test/ppapi/ppapi_browsertest.cc
@@ -31,6 +31,7 @@ #include "components/nacl/common/buildflags.h" #include "components/nacl/common/nacl_switches.h" #include "content/public/browser/network_service_instance.h" +#include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" #include "content/public/common/network_service_util.h" @@ -47,6 +48,7 @@ #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/system/data_pipe.h" #include "net/base/net_errors.h" +#include "net/base/network_isolation_key.h" #include "net/dns/public/resolve_error_info.h" #include "net/ssl/ssl_info.h" #include "ppapi/shared_impl/test_utils.h" @@ -57,6 +59,7 @@ #include "services/network/public/mojom/tcp_socket.mojom.h" #include "services/network/public/mojom/tls_socket.mojom.h" #include "services/network/public/mojom/udp_socket.mojom.h" +#include "services/network/test/test_dns_util.h" #include "services/network/test/test_network_context.h" #if defined(OS_MACOSX) @@ -1270,13 +1273,55 @@ TEST_PPAPI_NACL_DISALLOWED_SOCKETS(TCPSocketPrivateDisallowed) TEST_PPAPI_NACL_DISALLOWED_SOCKETS(UDPSocketPrivateDisallowed) -// HostResolver and HostResolverPrivate tests. -#define RUN_HOST_RESOLVER_SUBTESTS \ - RunTestViaHTTP( \ - LIST_TEST(HostResolver_Empty) \ - LIST_TEST(HostResolver_Resolve) \ - LIST_TEST(HostResolver_ResolveIPv4) \ - ) +// Checks that a hostname used by the HostResolver tests ("host_resolver.test") +// is present in the DNS cache with the NetworkIsolationKey associated with the +// foreground WebContents - this is needed so as not to leak what hostnames were +// looked up across tabs with different first party origins. +void CheckTestHostNameUsedWithCorrectNetworkIsolationKey(Browser* browser) { + network::mojom::NetworkContext* network_context = + content::BrowserContext::GetDefaultStoragePartition(browser->profile()) + ->GetNetworkContext(); + const net::HostPortPair kHostPortPair( + net::HostPortPair("host_resolver.test", 80)); + + network::mojom::ResolveHostParametersPtr params = + network::mojom::ResolveHostParameters::New(); + // Cache only lookup. + params->source = net::HostResolverSource::LOCAL_ONLY; + // Match the parameters used by the test. + params->include_canonical_name = true; + net::NetworkIsolationKey network_isolation_key = + browser->tab_strip_model() + ->GetActiveWebContents() + ->GetMainFrame() + ->GetNetworkIsolationKey(); + network::DnsLookupResult result1 = network::BlockingDnsLookup( + network_context, kHostPortPair, std::move(params), network_isolation_key); + EXPECT_EQ(net::OK, result1.error); + ASSERT_TRUE(result1.resolved_addresses.has_value()); + ASSERT_EQ(1u, result1.resolved_addresses->size()); + EXPECT_EQ(browser->tab_strip_model()->GetActiveWebContents()->GetURL().host(), + result1.resolved_addresses.value()[0].ToStringWithoutPort()); + + // Check that the entry isn't present in the cache with the empty + // NetworkIsolationKey(). + params = network::mojom::ResolveHostParameters::New(); + // Cache only lookup. + params->source = net::HostResolverSource::LOCAL_ONLY; + // Match the parameters used by the test. + params->include_canonical_name = true; + network::DnsLookupResult result2 = + network::BlockingDnsLookup(network_context, kHostPortPair, + std::move(params), net::NetworkIsolationKey()); + EXPECT_EQ(net::ERR_DNS_CACHE_MISS, result2.error); +} + +// HostResolver and HostResolverPrivate tests. The PPAPI code used by these +// tests is in ppapi/tests/test_host_resolver.cc. +#define RUN_HOST_RESOLVER_SUBTESTS \ + RunTestViaHTTP(LIST_TEST(HostResolver_Empty) LIST_TEST(HostResolver_Resolve) \ + LIST_TEST(HostResolver_ResolveIPv4)); \ + CheckTestHostNameUsedWithCorrectNetworkIsolationKey(browser()) IN_PROC_BROWSER_TEST_F(OutOfProcessPPAPITest, HostResolverCrash_Basic) { if (content::IsInProcessNetworkService())
diff --git a/chrome/test/ppapi/ppapi_test.cc b/chrome/test/ppapi/ppapi_test.cc index 99981c203..d0b987f 100644 --- a/chrome/test/ppapi/ppapi_test.cc +++ b/chrome/test/ppapi/ppapi_test.cc
@@ -34,7 +34,9 @@ #include "content/public/common/content_switches.h" #include "content/public/test/ppapi_test_utils.h" #include "media/base/media_switches.h" +#include "net/base/features.h" #include "net/base/filename_util.h" +#include "net/dns/mock_host_resolver.h" #include "net/test/spawned_test_server/spawned_test_server.h" #include "net/test/test_data_directory.h" #include "ppapi/shared_impl/ppapi_switches.h" @@ -132,9 +134,21 @@ } PPAPITestBase::PPAPITestBase() { + // These are needed to test that the right NetworkIsolationKey is used. + scoped_feature_list_.InitWithFeatures( + // enabled_features + {net::features::kSplitHostCacheByNetworkIsolationKey, + net::features::kPartitionConnectionsByNetworkIsolationKey}, + // disabled_features + {}); } void PPAPITestBase::SetUp() { + base::FilePath document_root; + ASSERT_TRUE(ui_test_utils::GetRelativeBuildDirectory(&document_root)); + embedded_test_server()->AddDefaultHandlers(document_root); + ASSERT_TRUE(embedded_test_server()->Start()); + EnablePixelOutput(); InProcessBrowserTest::SetUp(); } @@ -149,6 +163,14 @@ } void PPAPITestBase::SetUpOnMainThread() { + host_resolver()->AddRuleWithFlags( + "host_resolver.test", embedded_test_server()->host_port_pair().host(), + net::HOST_RESOLVER_CANONNAME); + + SetUpPPAPIBroker(); +} + +void PPAPITestBase::SetUpPPAPIBroker() { // Always allow access to the PPAPI broker. HostContentSettingsMapFactory::GetForProfile(browser()->profile()) ->SetDefaultContentSetting(ContentSettingsType::PPAPI_BROKER, @@ -182,47 +204,32 @@ void PPAPITestBase::RunTestViaHTTP(const std::string& test_case) { base::FilePath document_root; ASSERT_TRUE(ui_test_utils::GetRelativeBuildDirectory(&document_root)); - net::EmbeddedTestServer http_server; - http_server.AddDefaultHandlers(document_root); - ASSERT_TRUE(http_server.Start()); - RunTestURL(GetTestURL(http_server, test_case, std::string())); + RunTestURL(GetTestURL(*embedded_test_server(), test_case, std::string())); } void PPAPITestBase::RunTestWithSSLServer(const std::string& test_case) { base::FilePath http_document_root; ASSERT_TRUE(ui_test_utils::GetRelativeBuildDirectory(&http_document_root)); - net::EmbeddedTestServer http_server; - http_server.AddDefaultHandlers(http_document_root); net::EmbeddedTestServer ssl_server(net::EmbeddedTestServer::TYPE_HTTPS); ssl_server.AddDefaultHandlers(http_document_root); - - ASSERT_TRUE(http_server.Start()); ASSERT_TRUE(ssl_server.Start()); uint16_t port = ssl_server.host_port_pair().port(); - RunTestURL(GetTestURL(http_server, - test_case, + RunTestURL(GetTestURL(*embedded_test_server(), test_case, base::StringPrintf("ssl_server_port=%d", port))); } void PPAPITestBase::RunTestWithWebSocketServer(const std::string& test_case) { - base::FilePath http_document_root; - ASSERT_TRUE(ui_test_utils::GetRelativeBuildDirectory(&http_document_root)); - net::EmbeddedTestServer http_server; - http_server.AddDefaultHandlers(http_document_root); net::SpawnedTestServer ws_server(net::SpawnedTestServer::TYPE_WS, net::GetWebSocketTestDataDirectory()); - ASSERT_TRUE(http_server.Start()); ASSERT_TRUE(ws_server.Start()); std::string host = ws_server.host_port_pair().HostForURL(); uint16_t port = ws_server.host_port_pair().port(); - RunTestURL(GetTestURL(http_server, - test_case, - base::StringPrintf( - "websocket_host=%s&websocket_port=%d", - host.c_str(), - port))); + RunTestURL( + GetTestURL(*embedded_test_server(), test_case, + base::StringPrintf("websocket_host=%s&websocket_port=%d", + host.c_str(), port))); } void PPAPITestBase::RunTestIfAudioOutputAvailable( @@ -319,8 +326,7 @@ #endif } -void PPAPINaClTest::SetUpOnMainThread() { -} +void PPAPINaClTest::SetUpPPAPIBroker() {} void PPAPINaClTest::RunTest(const std::string& test_case) { #if BUILDFLAG(ENABLE_NACL) @@ -436,7 +442,7 @@ test_case.c_str()); } -void PPAPIBrokerInfoBarTest::SetUpOnMainThread() { +void PPAPIBrokerInfoBarTest::SetUpPPAPIBroker() { // The default content setting for the PPAPI broker is ASK. We purposefully - // don't call PPAPITestBase::SetUpOnMainThread() to keep it that way. + // don't call PPAPITestBase::SetUpPPAPIBroker() to keep it that way. }
diff --git a/chrome/test/ppapi/ppapi_test.h b/chrome/test/ppapi/ppapi_test.h index 744e79d6..838e2b0 100644 --- a/chrome/test/ppapi/ppapi_test.h +++ b/chrome/test/ppapi/ppapi_test.h
@@ -44,6 +44,8 @@ void SetUpCommandLine(base::CommandLine* command_line) override; void SetUpOnMainThread() override; + virtual void SetUpPPAPIBroker(); + virtual std::string BuildQuery(const std::string& base, const std::string& test_case) = 0; @@ -132,8 +134,8 @@ class PPAPINaClTest : public PPAPITestBase { public: void SetUpCommandLine(base::CommandLine* command_line) override; - void SetUpOnMainThread() override; // PPAPITestBase overrides. + void SetUpPPAPIBroker() override; void RunTest(const std::string& test_case) override; void RunTestViaHTTP(const std::string& test_case) override; void RunTestWithSSLServer(const std::string& test_case) override; @@ -205,7 +207,7 @@ class PPAPIBrokerInfoBarTest : public OutOfProcessPPAPITest { public: // PPAPITestBase override: - void SetUpOnMainThread() override; + void SetUpPPAPIBroker() override; }; #endif // CHROME_TEST_PPAPI_PPAPI_TEST_H_
diff --git a/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc b/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc index f263deb..9991cb95 100644 --- a/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc +++ b/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc
@@ -43,13 +43,13 @@ const char kSsidMeow[] = "meow"; const char kSsidWoof[] = "woof"; -std::unique_ptr<syncer::EntityData> GenerateWifiEntityData( +syncer::EntityData GenerateWifiEntityData( const sync_pb::WifiConfigurationSpecificsData& data) { - auto entity_data = std::make_unique<syncer::EntityData>(); - entity_data->specifics.mutable_wifi_configuration() + syncer::EntityData entity_data; + entity_data.specifics.mutable_wifi_configuration() ->mutable_client_only_encrypted_data() ->CopyFrom(data); - entity_data->name = data.hex_ssid(); + entity_data.name = data.hex_ssid(); return entity_data; } @@ -113,13 +113,13 @@ const std::vector<WifiConfigurationSpecificsData>& specifics_list) { syncer::EntityChangeList changes; for (const auto& data : specifics_list) { - auto entity_data = std::make_unique<syncer::EntityData>(); + syncer::EntityData entity_data; sync_pb::WifiConfigurationSpecifics specifics; specifics.mutable_client_only_encrypted_data()->CopyFrom(data); - entity_data->specifics.mutable_wifi_configuration()->CopyFrom(specifics); + entity_data.specifics.mutable_wifi_configuration()->CopyFrom(specifics); - entity_data->name = data.hex_ssid(); + entity_data.name = data.hex_ssid(); changes.push_back(syncer::EntityChange::CreateAdd( data.hex_ssid(), std::move(entity_data)));
diff --git a/chromeos/profiles/airmont.afdo.newest.txt b/chromeos/profiles/airmont.afdo.newest.txt index cefdc43..44933bf 100644 --- a/chromeos/profiles/airmont.afdo.newest.txt +++ b/chromeos/profiles/airmont.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-airmont-81-3987.18-1578309018-benchmark-81.0.4016.0-r1-redacted.afdo.xz \ No newline at end of file +chromeos-chrome-amd64-airmont-81-3987.18-1578309018-benchmark-81.0.4019.0-r1-redacted.afdo.xz \ No newline at end of file
diff --git a/chromeos/profiles/silvermont.afdo.newest.txt b/chromeos/profiles/silvermont.afdo.newest.txt index 730ee9d4..dfed4008 100644 --- a/chromeos/profiles/silvermont.afdo.newest.txt +++ b/chromeos/profiles/silvermont.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-silvermont-81-3987.18-1578307131-benchmark-81.0.4016.0-r1-redacted.afdo.xz \ No newline at end of file +chromeos-chrome-amd64-silvermont-81-3987.18-1578307131-benchmark-81.0.4019.0-r1-redacted.afdo.xz \ No newline at end of file
diff --git a/components/arc/BUILD.gn b/components/arc/BUILD.gn index df59239..a03c956c 100644 --- a/components/arc/BUILD.gn +++ b/components/arc/BUILD.gn
@@ -41,8 +41,6 @@ "intent_helper/link_handler_model.cc", "intent_helper/link_handler_model.h", "intent_helper/open_url_delegate.h", - "keymaster/arc_keymaster_bridge.cc", - "keymaster/arc_keymaster_bridge.h", "lock_screen/arc_lock_screen_bridge.cc", "lock_screen/arc_lock_screen_bridge.h", "metrics/arc_metrics_service.cc",
diff --git a/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc index 66e412c..d559076 100644 --- a/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc +++ b/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc
@@ -220,13 +220,13 @@ } std::string GetClientTag(const AutofillSpecifics& specifics) { - std::string tag = bridge()->GetClientTag(*SpecificsToEntity(specifics)); + std::string tag = bridge()->GetClientTag(SpecificsToEntity(specifics)); EXPECT_FALSE(tag.empty()); return tag; } std::string GetStorageKey(const AutofillSpecifics& specifics) { - std::string key = bridge()->GetStorageKey(*SpecificsToEntity(specifics)); + std::string key = bridge()->GetStorageKey(SpecificsToEntity(specifics)); EXPECT_FALSE(key.empty()); return key; } @@ -241,19 +241,18 @@ return changes; } - std::unique_ptr<EntityData> SpecificsToEntity( - const AutofillSpecifics& specifics) { - auto data = std::make_unique<EntityData>(); - *data->specifics.mutable_autofill() = specifics; - data->client_tag_hash = syncer::ClientTagHash::FromUnhashed( - syncer::AUTOFILL, bridge()->GetClientTag(*data)); + EntityData SpecificsToEntity(const AutofillSpecifics& specifics) { + EntityData data; + *data.specifics.mutable_autofill() = specifics; + data.client_tag_hash = syncer::ClientTagHash::FromUnhashed( + syncer::AUTOFILL, bridge()->GetClientTag(data)); return data; } - std::unique_ptr<syncer::UpdateResponseData> SpecificsToUpdateResponse( + syncer::UpdateResponseData SpecificsToUpdateResponse( const AutofillSpecifics& specifics) { - auto data = std::make_unique<syncer::UpdateResponseData>(); - data->entity = SpecificsToEntity(specifics); + syncer::UpdateResponseData data; + data.entity = SpecificsToEntity(specifics); return data; }
diff --git a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc index 0ebf17d..de79851 100644 --- a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc
@@ -292,19 +292,18 @@ return data; } - std::unique_ptr<EntityData> SpecificsToEntity( - const AutofillProfileSpecifics& specifics) { - auto data = std::make_unique<EntityData>(); - *data->specifics.mutable_autofill_profile() = specifics; - data->client_tag_hash = syncer::ClientTagHash::FromUnhashed( - syncer::AUTOFILL_PROFILE, bridge()->GetClientTag(*data)); + EntityData SpecificsToEntity(const AutofillProfileSpecifics& specifics) { + EntityData data; + *data.specifics.mutable_autofill_profile() = specifics; + data.client_tag_hash = syncer::ClientTagHash::FromUnhashed( + syncer::AUTOFILL_PROFILE, bridge()->GetClientTag(data)); return data; } - std::unique_ptr<syncer::UpdateResponseData> SpecificsToUpdateResponse( + syncer::UpdateResponseData SpecificsToUpdateResponse( const AutofillProfileSpecifics& specifics) { - auto data = std::make_unique<syncer::UpdateResponseData>(); - data->entity = SpecificsToEntity(specifics); + syncer::UpdateResponseData data; + data.entity = SpecificsToEntity(specifics); return data; }
diff --git a/components/autofill/core/browser/webdata/autofill_sync_bridge_util_unittest.cc b/components/autofill/core/browser/webdata/autofill_sync_bridge_util_unittest.cc index 39e44a9a..52e23a4 100644 --- a/components/autofill/core/browser/webdata/autofill_sync_bridge_util_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_sync_bridge_util_unittest.cc
@@ -46,12 +46,11 @@ DISALLOW_COPY_AND_ASSIGN(TestAutofillTable); }; -std::unique_ptr<EntityData> SpecificsToEntity( - const sync_pb::AutofillWalletSpecifics& specifics, - const std::string& client_tag) { - auto data = std::make_unique<syncer::EntityData>(); - *data->specifics.mutable_autofill_wallet() = specifics; - data->client_tag_hash = syncer::ClientTagHash::FromUnhashed( +EntityData SpecificsToEntity(const sync_pb::AutofillWalletSpecifics& specifics, + const std::string& client_tag) { + syncer::EntityData data; + *data.specifics.mutable_autofill_wallet() = specifics; + data.client_tag_hash = syncer::ClientTagHash::FromUnhashed( syncer::AUTOFILL_WALLET_DATA, client_tag); return data; }
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc index 23f973c..fed8e9a 100644 --- a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc
@@ -348,28 +348,27 @@ real_processor_->OnUpdateReceived(state, std::move(updates)); } - std::unique_ptr<EntityData> SpecificsToEntity( - const WalletMetadataSpecifics& specifics, - bool is_deleted = false) { - auto data = std::make_unique<EntityData>(); - *data->specifics.mutable_wallet_metadata() = specifics; - data->client_tag_hash = syncer::ClientTagHash::FromUnhashed( - syncer::AUTOFILL_WALLET_METADATA, bridge()->GetClientTag(*data)); + EntityData SpecificsToEntity(const WalletMetadataSpecifics& specifics, + bool is_deleted = false) { + EntityData data; + *data.specifics.mutable_wallet_metadata() = specifics; + data.client_tag_hash = syncer::ClientTagHash::FromUnhashed( + syncer::AUTOFILL_WALLET_METADATA, bridge()->GetClientTag(data)); if (is_deleted) { // Specifics had to be set in order to generate the client tag. Since // deleted entity is defined by specifics being empty, we need to clear // them now. - data->specifics = sync_pb::EntitySpecifics(); + data.specifics = sync_pb::EntitySpecifics(); } return data; } - std::unique_ptr<syncer::UpdateResponseData> SpecificsToUpdateResponse( + syncer::UpdateResponseData SpecificsToUpdateResponse( const WalletMetadataSpecifics& specifics, bool is_deleted = false) { - auto data = std::make_unique<syncer::UpdateResponseData>(); - data->entity = SpecificsToEntity(specifics, is_deleted); - data->response_version = response_version; + syncer::UpdateResponseData data; + data.entity = SpecificsToEntity(specifics, is_deleted); + data.response_version = response_version; return data; } @@ -467,7 +466,7 @@ ResetBridge(); WalletMetadataSpecifics specifics = CreateWalletMetadataSpecificsForAddress(kAddr1SpecificsId); - EXPECT_EQ(bridge()->GetClientTag(*SpecificsToEntity(specifics)), + EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)), kAddr1SyncTag); } @@ -475,7 +474,7 @@ ResetBridge(); WalletMetadataSpecifics specifics = CreateWalletMetadataSpecificsForCard(kCard1SpecificsId); - EXPECT_EQ(bridge()->GetClientTag(*SpecificsToEntity(specifics)), + EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)), kCard1SyncTag); } @@ -484,7 +483,7 @@ ResetBridge(); WalletMetadataSpecifics specifics = CreateWalletMetadataSpecificsForAddress(kAddr1SpecificsId); - EXPECT_EQ(bridge()->GetStorageKey(*SpecificsToEntity(specifics)), + EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics)), GetAddressStorageKey(kAddr1SpecificsId)); } @@ -492,7 +491,7 @@ ResetBridge(); WalletMetadataSpecifics specifics = CreateWalletMetadataSpecificsForCard(kCard1SpecificsId); - EXPECT_EQ(bridge()->GetStorageKey(*SpecificsToEntity(specifics)), + EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics)), GetCardStorageKey(kCard1SpecificsId)); }
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc index 69d194b..03e489c 100644 --- a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
@@ -278,12 +278,11 @@ EXPECT_EQ(addresses_count, addresses_metadata.size()); } - std::unique_ptr<EntityData> SpecificsToEntity( - const AutofillWalletSpecifics& specifics) { - auto data = std::make_unique<EntityData>(); - *data->specifics.mutable_autofill_wallet() = specifics; - data->client_tag_hash = syncer::ClientTagHash::FromUnhashed( - syncer::AUTOFILL_WALLET_DATA, bridge()->GetClientTag(*data)); + EntityData SpecificsToEntity(const AutofillWalletSpecifics& specifics) { + EntityData data; + *data.specifics.mutable_autofill_wallet() = specifics; + data.client_tag_hash = syncer::ClientTagHash::FromUnhashed( + syncer::AUTOFILL_WALLET_DATA, bridge()->GetClientTag(data)); return data; } @@ -300,10 +299,10 @@ return data; } - std::unique_ptr<syncer::UpdateResponseData> SpecificsToUpdateResponse( + syncer::UpdateResponseData SpecificsToUpdateResponse( const AutofillWalletSpecifics& specifics) { - auto data = std::make_unique<syncer::UpdateResponseData>(); - data->entity = SpecificsToEntity(specifics); + syncer::UpdateResponseData data; + data.entity = SpecificsToEntity(specifics); return data; } @@ -335,14 +334,14 @@ TEST_F(AutofillWalletSyncBridgeTest, GetClientTagForAddress) { AutofillWalletSpecifics specifics = CreateAutofillWalletSpecificsForAddress(kAddr1ClientTag); - EXPECT_EQ(bridge()->GetClientTag(*SpecificsToEntity(specifics)), + EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)), kAddr1ClientTag); } TEST_F(AutofillWalletSyncBridgeTest, GetClientTagForCard) { AutofillWalletSpecifics specifics = CreateAutofillWalletSpecificsForCard(kCard1ClientTag); - EXPECT_EQ(bridge()->GetClientTag(*SpecificsToEntity(specifics)), + EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)), kCard1ClientTag); } @@ -350,7 +349,7 @@ AutofillWalletSpecifics specifics = CreateAutofillWalletSpecificsForPaymentsCustomerData( kCustomerDataClientTag); - EXPECT_EQ(bridge()->GetClientTag(*SpecificsToEntity(specifics)), + EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)), kCustomerDataClientTag); } @@ -358,7 +357,7 @@ AutofillWalletSpecifics specifics = CreateAutofillWalletSpecificsForCreditCardCloudTokenData( kCloudTokenDataClientTag); - EXPECT_EQ(bridge()->GetClientTag(*SpecificsToEntity(specifics)), + EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)), kCloudTokenDataClientTag); } @@ -366,14 +365,14 @@ TEST_F(AutofillWalletSyncBridgeTest, GetStorageKeyForAddress) { AutofillWalletSpecifics specifics1 = CreateAutofillWalletSpecificsForAddress(kAddr1ClientTag); - EXPECT_EQ(bridge()->GetStorageKey(*SpecificsToEntity(specifics1)), + EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics1)), kAddr1ClientTag); } TEST_F(AutofillWalletSyncBridgeTest, GetStorageKeyForCard) { AutofillWalletSpecifics specifics2 = CreateAutofillWalletSpecificsForCard(kCard1ClientTag); - EXPECT_EQ(bridge()->GetStorageKey(*SpecificsToEntity(specifics2)), + EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics2)), kCard1ClientTag); } @@ -381,7 +380,7 @@ AutofillWalletSpecifics specifics3 = CreateAutofillWalletSpecificsForPaymentsCustomerData( kCustomerDataClientTag); - EXPECT_EQ(bridge()->GetStorageKey(*SpecificsToEntity(specifics3)), + EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics3)), kCustomerDataClientTag); } @@ -389,7 +388,7 @@ AutofillWalletSpecifics specifics4 = CreateAutofillWalletSpecificsForCreditCardCloudTokenData( kCloudTokenDataClientTag); - EXPECT_EQ(bridge()->GetStorageKey(*SpecificsToEntity(specifics4)), + EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics4)), kCloudTokenDataClientTag); }
diff --git a/components/autofill/core/common/form_field_data.cc b/components/autofill/core/common/form_field_data.cc index 2f233ce7..31d7284a 100644 --- a/components/autofill/core/common/form_field_data.cc +++ b/components/autofill/core/common/form_field_data.cc
@@ -232,7 +232,8 @@ bool FormFieldData::IsTextInputElement() const { return form_control_type == "text" || form_control_type == "password" || form_control_type == "search" || form_control_type == "tel" || - form_control_type == "url" || form_control_type == "email"; + form_control_type == "url" || form_control_type == "email" || + form_control_type == "number"; } bool FormFieldData::IsPasswordInputElement() const {
diff --git a/components/autofill/core/common/form_field_data_unittest.cc b/components/autofill/core/common/form_field_data_unittest.cc index c0a8bc5..48ae891 100644 --- a/components/autofill/core/common/form_field_data_unittest.cc +++ b/components/autofill/core/common/form_field_data_unittest.cc
@@ -387,12 +387,10 @@ const char* form_control_type; bool expected; } test_data[] = { - {"text", true}, {"search", true}, - {"tel", true}, {"url", true}, - {"email", true}, {"password", true}, - {"select", false}, {"", false}, - {"checkbox", false}, {"random_string", false}, - {"textarea", false}, + {"text", true}, {"search", true}, {"tel", true}, + {"url", true}, {"email", true}, {"password", true}, + {"number", true}, {"select", false}, {"", false}, + {"checkbox", false}, {"random_string", false}, {"textarea", false}, }; for (const auto& test_case : test_data) {
diff --git a/components/autofill/ios/browser/autofill_driver_ios.mm b/components/autofill/ios/browser/autofill_driver_ios.mm index 9f275267..c1bc51a2 100644 --- a/components/autofill/ios/browser/autofill_driver_ios.mm +++ b/components/autofill/ios/browser/autofill_driver_ios.mm
@@ -8,7 +8,6 @@ #include "components/autofill/core/browser/form_structure.h" #include "components/autofill/ios/browser/autofill_driver_ios_bridge.h" #include "components/autofill/ios/browser/autofill_driver_ios_webframe.h" -#import "ios/web/common/origin_util.h" #include "ios/web/public/browser_state.h" #include "ios/web/public/js_messaging/web_frame_util.h" #import "ios/web/public/web_state.h"
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc index a89c3bb..337ca824 100644 --- a/components/history/core/browser/history_service.cc +++ b/components/history/core/browser/history_service.cc
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// The history system runs on a background sequence so that potentially slow +// The history system runs on a background thread so that potentially slow // database operations don't delay the browser. This backend processing is // represented by HistoryBackend. The HistoryService's job is to dispatch to // that thread. // -// Main thread backend_task_runner_ +// Main thread History thread // ----------- -------------- // HistoryService <----------------> HistoryBackend // -> HistoryDatabase @@ -71,7 +71,7 @@ // static const base::Feature HistoryService::kHistoryServiceUsesTaskScheduler{ - "HistoryServiceUsesTaskScheduler", base::FEATURE_ENABLED_BY_DEFAULT}; + "HistoryServiceUsesTaskScheduler", base::FEATURE_DISABLED_BY_DEFAULT}; // Sends messages from the backend to us on the main thread. This must be a // separate class from the history service so that it can hold a reference to
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h index 88dbf07..b8d30d68 100644 --- a/components/history/core/browser/history_service.h +++ b/components/history/core/browser/history_service.h
@@ -468,7 +468,7 @@ // Generic Stuff ------------------------------------------------------------- - // Schedules a HistoryDBTask for running on the history backend. See + // Schedules a HistoryDBTask for running on the history backend thread. See // HistoryDBTask for details on what this does. Takes ownership of |task|. virtual base::CancelableTaskTracker::TaskId ScheduleDBTask( const base::Location& from_here, @@ -493,15 +493,15 @@ // Testing ------------------------------------------------------------------- - // Runs |flushed| after the backend has processed all other pre-existing - // tasks. + // Runs |flushed| after bouncing off the history thread. void FlushForTest(base::OnceClosure flushed); // Designed for unit tests, this passes the given task on to the history // backend to be called once the history backend has terminated. This allows - // callers to know when the history backend has been safely deleted and the - // database files can be deleted and the next test run. - + // callers to know when the history thread is complete and the database files + // can be deleted and the next test run. Otherwise, the history thread may + // still be running, causing problems in subsequent tests. + // // There can be only one closing task, so this will override any previously // set task. We will take ownership of the pointer and delete it when done. // The task will be run on the calling thread (this function is threadsafe). @@ -511,9 +511,9 @@ // into the database. This assumes the URL doesn't exist in the database // // Calling this function many times may be slow because each call will - // post a separate database transaction in a task. If this functionality - // is needed for importing many URLs, callers should use AddPagesWithDetails() - // instead. + // dispatch to the history thread and will be a separate database + // transaction. If this functionality is needed for importing many URLs, + // callers should use AddPagesWithDetails() instead. // // Note that this routine (and AddPageWithDetails()) always adds a single // visit using the |last_visit| timestamp, and a PageTransition type of LINK, @@ -594,9 +594,9 @@ // that is only set by unittests which causes the backend to not init its DB. bool Init(bool no_db, const HistoryDatabaseParams& history_database_params); - // Called by the HistoryURLProvider class to schedule an autocomplete, it will - // be called back with the history database so it can query. See - // history_url_provider.h for a diagram. + // Called by the HistoryURLProvider class to schedule an autocomplete, it + // will be called back on the internal history thread with the history + // database so it can query. See history_url_provider.h for a diagram. void ScheduleAutocomplete( base::OnceCallback<void(HistoryBackend*, URLDatabase*)> callback); @@ -834,8 +834,8 @@ void NotifyProfileError(sql::InitStatus init_status, const std::string& diagnostics); - // Call to post a given task for running on the history backend sequence with - // the specified priority. The task will have ownership taken. + // Call to schedule a given task for running on the history thread with the + // specified priority. The task will have ownership taken. void ScheduleTask(SchedulePriority priority, base::OnceClosure task); // Called when the favicons for the given page URLs (e.g. @@ -858,16 +858,17 @@ // Cleanup() is called. scoped_refptr<base::SequencedTaskRunner> backend_task_runner_; - // This class has most of the implementation. You MUST communicate with this - // class ONLY through |backend_task_runner_|. + // This class has most of the implementation and runs on the 'thread_'. + // You MUST communicate with this class ONLY through the thread_'s + // task_runner(). // // This pointer will be null once Cleanup() has been called, meaning no - // more tasks should be scheduled. + // more calls should be made to the history thread. scoped_refptr<HistoryBackend> history_backend_; // A cache of the user-typed URLs kept in memory that is used by the // autocomplete system. This will be null until the database has been created - // in the backend. + // on the background thread. // TODO(mrossetti): Consider changing ownership. See http://crbug.com/138321 std::unique_ptr<InMemoryHistoryBackend> in_memory_backend_;
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc index 8254afc..e5b6c1f 100644 --- a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc +++ b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
@@ -400,10 +400,9 @@ return bridge()->GetStorageKeyInternal(url); } - std::unique_ptr<EntityData> SpecificsToEntity( - const TypedUrlSpecifics& specifics) { - auto data = std::make_unique<EntityData>(); - *data->specifics.mutable_typed_url() = specifics; + EntityData SpecificsToEntity(const TypedUrlSpecifics& specifics) { + EntityData data; + *data.specifics.mutable_typed_url() = specifics; return data; }
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc index ff93af0..bb38b88f 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
@@ -259,12 +259,12 @@ } // Creates an EntityData around a copy of the given specifics. - std::unique_ptr<syncer::EntityData> SpecificsToEntity( + syncer::EntityData SpecificsToEntity( const sync_pb::PasswordSpecifics& specifics) { - auto data = std::make_unique<syncer::EntityData>(); - *data->specifics.mutable_password() = specifics; - data->client_tag_hash = syncer::ClientTagHash::FromUnhashed( - syncer::PASSWORDS, bridge()->GetClientTag(*data)); + syncer::EntityData data; + *data.specifics.mutable_password() = specifics; + data.client_tag_hash = syncer::ClientTagHash::FromUnhashed( + syncer::PASSWORDS, bridge()->GetClientTag(data)); return data; } @@ -436,7 +436,7 @@ EXPECT_CALL(mock_processor(), UntrackEntityForClientTagHash( - SpecificsToEntity(specifics)->client_tag_hash)); + SpecificsToEntity(specifics).client_tag_hash)); syncer::EntityChangeList entity_change_list; entity_change_list.push_back(syncer::EntityChange::CreateAdd( @@ -732,7 +732,7 @@ EXPECT_CALL(mock_processor(), UntrackEntityForClientTagHash( - SpecificsToEntity(specifics)->client_tag_hash)); + SpecificsToEntity(specifics).client_tag_hash)); syncer::EntityChangeList entity_change_list; entity_change_list.push_back(syncer::EntityChange::CreateAdd(
diff --git a/components/password_manager/ios/DEPS b/components/password_manager/ios/DEPS index 729b9e1..ff975cc 100644 --- a/components/password_manager/ios/DEPS +++ b/components/password_manager/ios/DEPS
@@ -6,4 +6,5 @@ "+components/security_state/ios", "+ios/web/public", "+ios/web/common", + "+services/network/public/cpp", ]
diff --git a/components/password_manager/ios/credential_manager_util.mm b/components/password_manager/ios/credential_manager_util.mm index 78ce592..66b955b9 100644 --- a/components/password_manager/ios/credential_manager_util.mm +++ b/components/password_manager/ios/credential_manager_util.mm
@@ -5,8 +5,8 @@ #include "components/password_manager/ios/credential_manager_util.h" #include "components/security_state/ios/security_state_utils.h" -#import "ios/web/common/origin_util.h" #import "ios/web/public/web_state.h" +#include "services/network/public/cpp/is_potentially_trustworthy.h" #include "url/origin.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -135,7 +135,7 @@ if (json.GetString(kCredentialIconKey, &iconUrl) && !iconUrl.empty()) { credential->icon = GURL(iconUrl); if (!credential->icon.is_valid() || - !web::IsOriginSecure(credential->icon)) { + !network::IsUrlPotentiallyTrustworthy(credential->icon)) { // |iconUrl| is either not a valid URL or not a secure URL. if (reason) { *reason = "iconURL is either invalid or insecure URL"; @@ -189,8 +189,7 @@ const GURL last_committed_url = web_state->GetLastCommittedURL(); - if (!web::IsOriginSecure(last_committed_url) || - last_committed_url.scheme() == url::kDataScheme) { + if (!network::IsUrlPotentiallyTrustworthy(last_committed_url)) { return false; }
diff --git a/components/reading_list/core/reading_list_store_unittest.cc b/components/reading_list/core/reading_list_store_unittest.cc index 89e581d..8e31def 100644 --- a/components/reading_list/core/reading_list_store_unittest.cc +++ b/components/reading_list/core/reading_list_store_unittest.cc
@@ -199,8 +199,8 @@ std::unique_ptr<sync_pb::ReadingListSpecifics> specifics = entry.AsReadingListSpecifics(); - auto data = std::make_unique<syncer::EntityData>(); - *data->specifics.mutable_reading_list() = *specifics; + syncer::EntityData data; + *data.specifics.mutable_reading_list() = *specifics; remote_input.push_back(syncer::EntityChange::CreateAdd( "http://read.example.com/", std::move(data))); @@ -223,8 +223,8 @@ entry.SetRead(true, AdvanceAndGetTime(&clock_)); std::unique_ptr<sync_pb::ReadingListSpecifics> specifics = entry.AsReadingListSpecifics(); - auto data = std::make_unique<syncer::EntityData>(); - *data->specifics.mutable_reading_list() = *specifics; + syncer::EntityData data; + *data.specifics.mutable_reading_list() = *specifics; syncer::EntityChangeList add_changes; @@ -248,8 +248,8 @@ new_entry.SetRead(true, AdvanceAndGetTime(&clock_)); std::unique_ptr<sync_pb::ReadingListSpecifics> specifics = new_entry.AsReadingListSpecifics(); - auto data = std::make_unique<syncer::EntityData>(); - *data->specifics.mutable_reading_list() = *specifics; + syncer::EntityData data; + *data.specifics.mutable_reading_list() = *specifics; EXPECT_CALL(processor_, Put("http://unread.example.com/", _, _)); @@ -277,8 +277,8 @@ std::unique_ptr<sync_pb::ReadingListSpecifics> specifics = old_entry.AsReadingListSpecifics(); - auto data = std::make_unique<syncer::EntityData>(); - *data->specifics.mutable_reading_list() = *specifics; + syncer::EntityData data; + *data.specifics.mutable_reading_list() = *specifics; EXPECT_CALL(processor_, Put("http://unread.example.com/", _, _));
diff --git a/components/security_state/ios/DEPS b/components/security_state/ios/DEPS index 7bbff89..f68780e 100644 --- a/components/security_state/ios/DEPS +++ b/components/security_state/ios/DEPS
@@ -3,4 +3,5 @@ "+components/security_state/core", "+ios/web/common", "+ios/web/public", + "+services/network/public/cpp", ]
diff --git a/components/security_state/ios/insecure_input_tab_helper.mm b/components/security_state/ios/insecure_input_tab_helper.mm index d8cb5bb..c3b048a 100644 --- a/components/security_state/ios/insecure_input_tab_helper.mm +++ b/components/security_state/ios/insecure_input_tab_helper.mm
@@ -12,12 +12,12 @@ #include "components/autofill/ios/form_util/form_activity_params.h" #include "components/autofill/ios/form_util/form_activity_tab_helper.h" #include "components/security_state/ios/ssl_status_input_event_data.h" -#import "ios/web/common/origin_util.h" #import "ios/web/public/navigation/navigation_context.h" #import "ios/web/public/navigation/navigation_item.h" #import "ios/web/public/navigation/navigation_manager.h" #import "ios/web/public/web_state.h" #import "ios/web/public/web_state_user_data.h" +#include "services/network/public/cpp/is_potentially_trustworthy.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -65,7 +65,8 @@ } void InsecureInputTabHelper::DidEditFieldInInsecureContext() { - DCHECK(!web::IsOriginSecure(web_state_->GetLastCommittedURL())); + DCHECK( + !network::IsUrlPotentiallyTrustworthy(web_state_->GetLastCommittedURL())); security_state::SSLStatusInputEventData* input_events = GetOrCreateSSLStatusInputEventData(web_state_); @@ -93,7 +94,7 @@ const autofill::FormActivityParams& params) { DCHECK_EQ(web_state_, web_state); if (params.type == "input" && - !web::IsOriginSecure(web_state->GetLastCommittedURL())) { + !network::IsUrlPotentiallyTrustworthy(web_state->GetLastCommittedURL())) { DidEditFieldInInsecureContext(); } } @@ -104,7 +105,7 @@ DCHECK_EQ(web_state_, web_state); // Check if the navigation should clear insecure input event data (i.e., not a // same-document navigation). - if (!web::IsOriginSecure(web_state->GetLastCommittedURL()) && + if (!network::IsUrlPotentiallyTrustworthy(web_state->GetLastCommittedURL()) && navigation_context->HasCommitted() && !navigation_context->IsSameDocument()) { security_state::SSLStatusInputEventData* input_events =
diff --git a/components/security_state/ios/security_state_utils.mm b/components/security_state/ios/security_state_utils.mm index 6550da7..5978b40 100644 --- a/components/security_state/ios/security_state_utils.mm +++ b/components/security_state/ios/security_state_utils.mm
@@ -8,7 +8,6 @@ #include "components/security_state/core/security_state.h" #include "components/security_state/ios/ssl_status_input_event_data.h" -#import "ios/web/common/origin_util.h" #include "ios/web/public/navigation/navigation_item.h" #import "ios/web/public/navigation/navigation_manager.h" #include "ios/web/public/security/security_style.h"
diff --git a/components/send_tab_to_self/send_tab_to_self_bridge_unittest.cc b/components/send_tab_to_self/send_tab_to_self_bridge_unittest.cc index 0261a61..9ab9917 100644 --- a/components/send_tab_to_self/send_tab_to_self_bridge_unittest.cc +++ b/components/send_tab_to_self/send_tab_to_self_bridge_unittest.cc
@@ -132,15 +132,13 @@ ON_CALL(mock_processor_, IsTrackingMetadata()).WillByDefault(Return(false)); } - std::unique_ptr<syncer::EntityData> MakeEntityData( - const SendTabToSelfEntry& entry) { + syncer::EntityData MakeEntityData(const SendTabToSelfEntry& entry) { SendTabToSelfLocal specifics = entry.AsLocalProto(); - auto entity_data = std::make_unique<syncer::EntityData>(); + syncer::EntityData entity_data; - *(entity_data->specifics.mutable_send_tab_to_self()) = - specifics.specifics(); - entity_data->name = entry.GetURL().spec(); + *entity_data.specifics.mutable_send_tab_to_self() = specifics.specifics(); + entity_data.name = entry.GetURL().spec(); return entity_data; } @@ -151,10 +149,10 @@ const std::vector<sync_pb::SendTabToSelfSpecifics>& specifics_list) { syncer::EntityChangeList changes; for (const auto& specifics : specifics_list) { - auto entity_data = std::make_unique<syncer::EntityData>(); + syncer::EntityData entity_data; - *(entity_data->specifics.mutable_send_tab_to_self()) = specifics; - entity_data->name = specifics.url(); + *entity_data.specifics.mutable_send_tab_to_self() = specifics; + entity_data.name = specifics.url(); changes.push_back(syncer::EntityChange::CreateAdd( specifics.guid(), std::move(entity_data)));
diff --git a/components/sync/driver/file_based_trusted_vault_client.cc b/components/sync/driver/file_based_trusted_vault_client.cc index ca8ece85..3c2e98b 100644 --- a/components/sync/driver/file_based_trusted_vault_client.cc +++ b/components/sync/driver/file_based_trusted_vault_client.cc
@@ -148,6 +148,13 @@ observer_list_.Notify(); } +void FileBasedTrustedVaultClient::MarkKeysAsStale( + const std::string& gaia_id, + base::OnceCallback<void(bool)> cb) { + // Not really supported and not useful for this particular implementation. + std::move(cb).Run(false); +} + void FileBasedTrustedVaultClient::WaitForFlushForTesting( base::OnceClosure cb) const { backend_task_runner_->PostTaskAndReply(FROM_HERE, base::DoNothing(),
diff --git a/components/sync/driver/file_based_trusted_vault_client.h b/components/sync/driver/file_based_trusted_vault_client.h index 9581eeb..e8318b6b 100644 --- a/components/sync/driver/file_based_trusted_vault_client.h +++ b/components/sync/driver/file_based_trusted_vault_client.h
@@ -37,6 +37,8 @@ override; void StoreKeys(const std::string& gaia_id, const std::vector<std::vector<uint8_t>>& keys) override; + void MarkKeysAsStale(const std::string& gaia_id, + base::OnceCallback<void(bool)> cb) override; // Runs |cb| when all requests have completed. void WaitForFlushForTesting(base::OnceClosure cb) const;
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc index 1b6ba53..b466d03 100644 --- a/components/sync/driver/profile_sync_service.cc +++ b/components/sync/driver/profile_sync_service.cc
@@ -1061,7 +1061,7 @@ // (but not all). Care must be taken however for scenarios like custom // passphrase being set. sync_prefs_.ClearDirectoryConsistencyPreferences(); - startup_controller_->TryStart(IsSetupInProgress()); + startup_controller_->TryStart(/*force_immediate=*/true); break; case UNKNOWN_ACTION: NOTREACHED(); @@ -1299,7 +1299,7 @@ // TODO(crbug.com/856179): Evaluate whether we can get away without a full // restart (i.e. just reconfigure plus whatever cleanup is necessary). See // also similar comment in OnSyncRequestedPrefChange(). - startup_controller_->TryStart(/*force_immediate=*/false); + startup_controller_->TryStart(/*force_immediate=*/true); } } @@ -1538,7 +1538,7 @@ } else { // Sync is no longer disabled by policy. Try starting it up if appropriate. DCHECK(!engine_); - startup_controller_->TryStart(IsSetupInProgress()); + startup_controller_->TryStart(/*force_immediate=*/true); } } @@ -1575,6 +1575,11 @@ // restart (i.e. just reconfigure plus whatever cleanup is necessary). // Especially in the CLEAR_DATA case, StopImpl does a lot of cleanup that // might still be required. + // TODO(crbug.com/1035874): There's no real need to delay the startup here, + // i.e. it should be fine to set force_immediate to true. However currently + // some tests depend on the startup *not* happening immediately (because + // they want to check that Sync (the feature) got disabled, which is hard to + // do if the engine starts up again immediately). startup_controller_->TryStart(/*force_immediate=*/false); } }
diff --git a/components/sync/driver/sync_service_crypto.cc b/components/sync/driver/sync_service_crypto.cc index 834ab34..4c188e6 100644 --- a/components/sync/driver/sync_service_crypto.cc +++ b/components/sync/driver/sync_service_crypto.cc
@@ -48,6 +48,11 @@ // Never invoked by SyncServiceCrypto. NOTREACHED(); } + + void MarkKeysAsStale(const std::string& gaia_id, + base::OnceCallback<void(bool)> cb) override { + std::move(cb).Run(false); + } }; // A SyncEncryptionHandler::Observer implementation that simply posts all calls @@ -578,11 +583,11 @@ trusted_vault_client_->FetchKeys( state_.account_info.gaia, - base::BindOnce(&SyncServiceCrypto::TrustedVaultKeysFetched, + base::BindOnce(&SyncServiceCrypto::TrustedVaultKeysFetchedFromClient, weak_factory_.GetWeakPtr())); } -void SyncServiceCrypto::TrustedVaultKeysFetched( +void SyncServiceCrypto::TrustedVaultKeysFetchedFromClient( const std::vector<std::vector<uint8_t>>& keys) { if (state_.required_user_action != RequiredUserAction::kFetchingTrustedVaultKeys && @@ -593,6 +598,14 @@ DCHECK(state_.engine); + if (keys.empty()) { + // Nothing to do if no keys have been fetched from the client (e.g. user + // action is required for fetching additional keys). Let's avoid unnecessary + // steps like marking keys as stale. + FetchTrustedVaultKeysCompletedButInsufficient(); + return; + } + state_.engine->AddTrustedVaultDecryptionKeys( keys, base::BindOnce(&SyncServiceCrypto::TrustedVaultKeysAdded, weak_factory_.GetWeakPtr())); @@ -606,6 +619,35 @@ return; } + // Reaching this codepath indicates OnTrustedVaultKeyAccepted() was not + // triggered, so the fetched trusted vault keys were insufficient. Let the + // trusted vault client know. + trusted_vault_client_->MarkKeysAsStale( + state_.account_info.gaia, + base::BindOnce(&SyncServiceCrypto::TrustedVaultKeysMarkedAsStale, + weak_factory_.GetWeakPtr())); +} + +void SyncServiceCrypto::TrustedVaultKeysMarkedAsStale(bool result) { + if (state_.required_user_action != + RequiredUserAction::kFetchingTrustedVaultKeys && + state_.required_user_action != + RequiredUserAction::kTrustedVaultKeyRequiredButFetching) { + return; + } + + // TODO(crbug.com/1012659): Based on |result|, start a second FetchKeys() + // pass. + + FetchTrustedVaultKeysCompletedButInsufficient(); +} + +void SyncServiceCrypto::FetchTrustedVaultKeysCompletedButInsufficient() { + DCHECK(state_.required_user_action == + RequiredUserAction::kFetchingTrustedVaultKeys || + state_.required_user_action == + RequiredUserAction::kTrustedVaultKeyRequiredButFetching); + // If FetchKeys() was intended to be called during an already existing ongoing // FetchKeys(), it needs to be invoked now that it's possible. if (state_.deferred_trusted_vault_fetch_keys_pending) { @@ -614,9 +656,11 @@ } // Reaching this codepath indicates OnTrustedVaultKeyAccepted() was not - // triggered, so reconfigure without the encrypted types (excluded implicitly - // via the failed datatypes handler). + // triggered, so the fetched trusted vault keys were insufficient. state_.required_user_action = RequiredUserAction::kTrustedVaultKeyRequired; + + // Reconfigure without the encrypted types (excluded implicitly via the failed + // datatypes handler). reconfigure_.Run(CONFIGURE_REASON_CRYPTO); }
diff --git a/components/sync/driver/sync_service_crypto.h b/components/sync/driver/sync_service_crypto.h index 788b75b..a00a26b 100644 --- a/components/sync/driver/sync_service_crypto.h +++ b/components/sync/driver/sync_service_crypto.h
@@ -110,8 +110,11 @@ // Called at various stages of asynchronously fetching and processing trusted // vault encryption keys. - void TrustedVaultKeysFetched(const std::vector<std::vector<uint8_t>>& keys); + void TrustedVaultKeysFetchedFromClient( + const std::vector<std::vector<uint8_t>>& keys); void TrustedVaultKeysAdded(); + void TrustedVaultKeysMarkedAsStale(bool result); + void FetchTrustedVaultKeysCompletedButInsufficient(); // Calls SyncServiceBase::NotifyObservers(). Never null. const base::RepeatingClosure notify_observers_;
diff --git a/components/sync/driver/sync_service_crypto_unittest.cc b/components/sync/driver/sync_service_crypto_unittest.cc index 24fee3f..667c262 100644 --- a/components/sync/driver/sync_service_crypto_unittest.cc +++ b/components/sync/driver/sync_service_crypto_unittest.cc
@@ -68,6 +68,10 @@ // Exposes the total number of calls to FetchKeys(). int fetch_count() const { return fetch_count_; } + // Returns whether MarkKeysAsStale() was called since the last call to + // FetchKeys(). + bool keys_marked_as_stale() const { return keys_marked_as_stale_; } + // Mimics the completion of the next (FIFO) FetchKeys() request. bool CompleteFetchKeysRequest() { if (pending_responses_.empty()) { @@ -91,6 +95,7 @@ base::OnceCallback<void(const std::vector<std::vector<uint8_t>>&)> cb) override { ++fetch_count_; + keys_marked_as_stale_ = false; pending_responses_.push_back( base::BindOnce(std::move(cb), gaia_id_to_keys_[gaia_id])); } @@ -101,10 +106,17 @@ observer_list_.Notify(); } + void MarkKeysAsStale(const std::string& gaia_id, + base::OnceCallback<void(bool)> cb) override { + keys_marked_as_stale_ = true; + std::move(cb).Run(false); + } + private: std::map<std::string, std::vector<std::vector<uint8_t>>> gaia_id_to_keys_; CallbackList observer_list_; int fetch_count_ = 0; + bool keys_marked_as_stale_ = false; std::list<base::OnceClosure> pending_responses_; }; @@ -209,6 +221,7 @@ crypto_.OnTrustedVaultKeyAccepted(); std::move(add_keys_cb).Run(); EXPECT_FALSE(crypto_.IsTrustedVaultKeyRequired()); + EXPECT_FALSE(trusted_vault_client_.keys_marked_as_stale()); } TEST_F(SyncServiceCryptoTest, @@ -248,6 +261,34 @@ crypto_.OnTrustedVaultKeyAccepted(); std::move(add_keys_cb).Run(); EXPECT_FALSE(crypto_.IsTrustedVaultKeyRequired()); + EXPECT_FALSE(trusted_vault_client_.keys_marked_as_stale()); +} + +TEST_F(SyncServiceCryptoTest, + ShouldReadNoTrustedVaultKeysFromClientAfterInitialization) { + const CoreAccountInfo kSyncingAccount = + MakeAccountInfoWithGaia("syncingaccount"); + + EXPECT_CALL(reconfigure_cb_, Run(_)).Times(0); + EXPECT_CALL(engine_, AddTrustedVaultDecryptionKeys(_, _)).Times(0); + + ASSERT_FALSE(crypto_.IsTrustedVaultKeyRequired()); + + // Mimic the engine determining that trusted vault keys are required. + crypto_.SetSyncEngine(kSyncingAccount, &engine_); + ASSERT_THAT(trusted_vault_client_.fetch_count(), Eq(0)); + + crypto_.OnTrustedVaultKeyRequired(); + + // While there is an ongoing fetch, there should be no user action required. + ASSERT_THAT(trusted_vault_client_.fetch_count(), Eq(1)); + ASSERT_FALSE(crypto_.IsTrustedVaultKeyRequired()); + + // Mimic completion of the fetch, which should lead to a reconfiguration. + EXPECT_CALL(reconfigure_cb_, Run(CONFIGURE_REASON_CRYPTO)); + ASSERT_TRUE(trusted_vault_client_.CompleteFetchKeysRequest()); + EXPECT_TRUE(crypto_.IsTrustedVaultKeyRequired()); + EXPECT_FALSE(trusted_vault_client_.keys_marked_as_stale()); } TEST_F(SyncServiceCryptoTest, ShouldReadInvalidTrustedVaultKeysFromClient) { @@ -284,6 +325,7 @@ EXPECT_CALL(reconfigure_cb_, Run(CONFIGURE_REASON_CRYPTO)); std::move(add_keys_cb).Run(); EXPECT_TRUE(crypto_.IsTrustedVaultKeyRequired()); + EXPECT_TRUE(trusted_vault_client_.keys_marked_as_stale()); } // Similar to ShouldReadInvalidTrustedVaultKeysFromClient: the vault @@ -318,6 +360,7 @@ ASSERT_THAT(trusted_vault_client_.fetch_count(), Eq(1)); ASSERT_TRUE(trusted_vault_client_.CompleteFetchKeysRequest()); ASSERT_TRUE(crypto_.IsTrustedVaultKeyRequired()); + ASSERT_TRUE(trusted_vault_client_.keys_marked_as_stale()); // Mimic keys being added to the vault, which triggers a notification to // observers (namely |crypto_|), leading to a second fetch. @@ -326,6 +369,7 @@ EXPECT_CALL(reconfigure_cb_, Run(CONFIGURE_REASON_CRYPTO)); EXPECT_TRUE(trusted_vault_client_.CompleteFetchKeysRequest()); EXPECT_FALSE(crypto_.IsTrustedVaultKeyRequired()); + EXPECT_FALSE(trusted_vault_client_.keys_marked_as_stale()); } // Same as above but the new keys become available during an ongoing FetchKeys()
diff --git a/components/sync/driver/trusted_vault_client.h b/components/sync/driver/trusted_vault_client.h index 9bc379b2..42e07492 100644 --- a/components/sync/driver/trusted_vault_client.h +++ b/components/sync/driver/trusted_vault_client.h
@@ -41,6 +41,16 @@ base::OnceCallback<void(const std::vector<std::vector<uint8_t>>&)> cb) = 0; + // Invoked when the result of FetchKeys() contains keys that cannot decrypt + // the pending cryptographer (Nigori) keys, which should only be possible if + // the provided keys are not up-to-date. |cb| is run upon completion and + // returns false if the call did not make any difference (e.g. the operation + // is unsupported) or true if some change may have occurred (which indicates a + // second FetchKeys() attempt is worth). Concurrent calls to MarkKeysAsStale() + // must not be issued since implementations may not support them. + virtual void MarkKeysAsStale(const std::string& gaia_id, + base::OnceCallback<void(bool)> cb) = 0; + // Allows implementations to store encryption keys fetched by other means such // as Web interactions. Implementations are free to completely ignore these // keys, so callers may not assume that later calls to FetchKeys() would
diff --git a/components/sync/engine/non_blocking_sync_common.h b/components/sync/engine/non_blocking_sync_common.h index 82044a01..89ab448 100644 --- a/components/sync/engine/non_blocking_sync_common.h +++ b/components/sync/engine/non_blocking_sync_common.h
@@ -62,20 +62,22 @@ struct UpdateResponseData { UpdateResponseData(); + UpdateResponseData(UpdateResponseData&&) = default; + UpdateResponseData& operator=(UpdateResponseData&&) = default; ~UpdateResponseData(); - std::unique_ptr<EntityData> entity; + UpdateResponseData(const UpdateResponseData&) = delete; + UpdateResponseData& operator=(const UpdateResponseData&) = delete; + + EntityData entity; int64_t response_version = 0; std::string encryption_key_name; - - private: - DISALLOW_COPY_AND_ASSIGN(UpdateResponseData); }; using CommitRequestDataList = std::vector<std::unique_ptr<CommitRequestData>>; using CommitResponseDataList = std::vector<CommitResponseData>; -using UpdateResponseDataList = std::vector<std::unique_ptr<UpdateResponseData>>; +using UpdateResponseDataList = std::vector<UpdateResponseData>; // Returns the estimate of dynamically allocated memory in bytes. size_t EstimateMemoryUsage(const CommitRequestData& value);
diff --git a/components/sync/engine_impl/model_type_worker.cc b/components/sync/engine_impl/model_type_worker.cc index 3e2b759..383f60d 100644 --- a/components/sync/engine_impl/model_type_worker.cc +++ b/components/sync/engine_impl/model_type_worker.cc
@@ -183,9 +183,9 @@ } } - auto response_data = std::make_unique<UpdateResponseData>(); + UpdateResponseData response_data; switch (PopulateUpdateResponseData(cryptographer_.get(), type_, - *update_entity, response_data.get())) { + *update_entity, &response_data)) { case SUCCESS: pending_updates_.push_back(std::move(response_data)); break; @@ -212,7 +212,7 @@ ModelType model_type, const sync_pb::SyncEntity& update_entity, UpdateResponseData* response_data) { - auto data = std::make_unique<syncer::EntityData>(); + syncer::EntityData data; // Deleted entities must use the default instance of EntitySpecifics in // order for EntityData to correctly reflect that they are deleted. @@ -233,8 +233,7 @@ if (!cryptographer->CanDecrypt(specifics.password().encrypted())) { return DECRYPTION_PENDING; } - if (!DecryptPasswordSpecifics(*cryptographer, specifics, - &data->specifics)) { + if (!DecryptPasswordSpecifics(*cryptographer, specifics, &data.specifics)) { return FAILED_TO_DECRYPT; } response_data->encryption_key_name = @@ -249,41 +248,41 @@ return DECRYPTION_PENDING; } // Encrypted and we know the key. - if (!DecryptSpecifics(*cryptographer, specifics, &data->specifics)) { + if (!DecryptSpecifics(*cryptographer, specifics, &data.specifics)) { return FAILED_TO_DECRYPT; } response_data->encryption_key_name = specifics.encrypted().key_name(); specifics_were_encrypted = true; } else { // No encryption. - data->specifics = specifics; + data.specifics = specifics; } response_data->response_version = update_entity.version(); // Prepare the message for the model thread. - data->id = update_entity.id_string(); - data->client_tag_hash = + data.id = update_entity.id_string(); + data.client_tag_hash = ClientTagHash::FromHashed(update_entity.client_defined_unique_tag()); - data->creation_time = ProtoTimeToTime(update_entity.ctime()); - data->modification_time = ProtoTimeToTime(update_entity.mtime()); - data->name = update_entity.name(); - data->is_folder = update_entity.folder(); - data->parent_id = update_entity.parent_id_string(); - data->server_defined_unique_tag = update_entity.server_defined_unique_tag(); + data.creation_time = ProtoTimeToTime(update_entity.ctime()); + data.modification_time = ProtoTimeToTime(update_entity.mtime()); + data.name = update_entity.name(); + data.is_folder = update_entity.folder(); + data.parent_id = update_entity.parent_id_string(); + data.server_defined_unique_tag = update_entity.server_defined_unique_tag(); // Populate |originator_cache_guid| and |originator_client_item_id|. This is // currently relevant only for bookmarks. - data->originator_cache_guid = update_entity.originator_cache_guid(); - data->originator_client_item_id = update_entity.originator_client_item_id(); + data.originator_cache_guid = update_entity.originator_cache_guid(); + data.originator_client_item_id = update_entity.originator_client_item_id(); // Adapt the update for compatibility. if (model_type == BOOKMARKS) { - AdaptUniquePositionForBookmark(update_entity, data.get()); - AdaptTitleForBookmark(update_entity, &data->specifics, + AdaptUniquePositionForBookmark(update_entity, &data); + AdaptTitleForBookmark(update_entity, &data.specifics, specifics_were_encrypted); - AdaptGuidForBookmark(update_entity, &data->specifics); + AdaptGuidForBookmark(update_entity, &data.specifics); } else if (model_type == AUTOFILL_WALLET_DATA) { - AdaptClientTagForWalletData(data.get()); + AdaptClientTagForWalletData(&data); } response_data->entity = std::move(data); @@ -473,9 +472,9 @@ it != entries_pending_decryption_.end();) { const sync_pb::SyncEntity& encrypted_update = it->second; - auto response_data = std::make_unique<UpdateResponseData>(); + UpdateResponseData response_data; switch (PopulateUpdateResponseData(cryptographer_.get(), type_, - encrypted_update, response_data.get())) { + encrypted_update, &response_data)) { case SUCCESS: pending_updates_.push_back(std::move(response_data)); it = entries_pending_decryption_.erase(it); @@ -500,15 +499,14 @@ pending_updates_.reserve(candidates.size()); std::map<std::string, size_t> id_to_index; - for (std::unique_ptr<UpdateResponseData>& candidate : candidates) { - DCHECK(candidate); - if (candidate->entity->id.empty()) { + for (UpdateResponseData& candidate : candidates) { + if (candidate.entity.id.empty()) { continue; } // Try to insert. If we already saw an item with the same server id, // this will fail but give us its iterator. auto it_and_success = - id_to_index.emplace(candidate->entity->id, pending_updates_.size()); + id_to_index.emplace(candidate.entity.id, pending_updates_.size()); if (it_and_success.second) { // New server id, append at the end. Note that we already inserted // the correct index (|pending_updates_.size()|) above. @@ -527,17 +525,16 @@ pending_updates_.reserve(candidates.size()); std::map<ClientTagHash, size_t> tag_to_index; - for (std::unique_ptr<UpdateResponseData>& candidate : candidates) { - DCHECK(candidate); + for (UpdateResponseData& candidate : candidates) { // Items with empty client tag hash just get passed through. - if (candidate->entity->client_tag_hash.value().empty()) { + if (candidate.entity.client_tag_hash.value().empty()) { pending_updates_.push_back(std::move(candidate)); continue; } // Try to insert. If we already saw an item with the same client tag hash, // this will fail but give us its iterator. - auto it_and_success = tag_to_index.emplace( - candidate->entity->client_tag_hash, pending_updates_.size()); + auto it_and_success = tag_to_index.emplace(candidate.entity.client_tag_hash, + pending_updates_.size()); if (it_and_success.second) { // New client tag hash, append at the end. Note that we already inserted // the correct index (|pending_updates_.size()|) above. @@ -556,18 +553,17 @@ pending_updates_.reserve(candidates.size()); std::map<std::string, size_t> id_to_index; - for (std::unique_ptr<UpdateResponseData>& candidate : candidates) { - DCHECK(candidate); + for (UpdateResponseData& candidate : candidates) { // Items with empty item ID just get passed through (which is the case for // all datatypes except bookmarks). - if (candidate->entity->originator_client_item_id.empty()) { + if (candidate.entity.originator_client_item_id.empty()) { pending_updates_.push_back(std::move(candidate)); continue; } // Try to insert. If we already saw an item with the same originator item // ID, this will fail but give us its iterator. auto it_and_success = id_to_index.emplace( - candidate->entity->originator_client_item_id, pending_updates_.size()); + candidate.entity.originator_client_item_id, pending_updates_.size()); if (it_and_success.second) { // New item ID, append at the end. Note that we already inserted the // correct index (|pending_updates_.size()|) above.
diff --git a/components/sync/engine_impl/model_type_worker_unittest.cc b/components/sync/engine_impl/model_type_worker_unittest.cc index 7cc859c08..3150c26 100644 --- a/components/sync/engine_impl/model_type_worker_unittest.cc +++ b/components/sync/engine_impl/model_type_worker_unittest.cc
@@ -727,7 +727,7 @@ ASSERT_TRUE(processor()->HasUpdateResponse(kHash1)); const UpdateResponseData& update = processor()->GetUpdateResponse(kHash1); - const EntityData& entity = *update.entity; + const EntityData& entity = update.entity; EXPECT_FALSE(entity.id.empty()); EXPECT_EQ(tag_hash, entity.client_tag_hash); @@ -757,11 +757,11 @@ processor()->GetNthUpdateResponse(0); ASSERT_EQ(3u, result.size()); ASSERT_TRUE(result[0]); - EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity->client_tag_hash); + EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity.client_tag_hash); ASSERT_TRUE(result[1]); - EXPECT_EQ(GenerateTagHash(kTag2), result[1]->entity->client_tag_hash); + EXPECT_EQ(GenerateTagHash(kTag2), result[1]->entity.client_tag_hash); ASSERT_TRUE(result[2]); - EXPECT_EQ(GenerateTagHash(kTag3), result[2]->entity->client_tag_hash); + EXPECT_EQ(GenerateTagHash(kTag3), result[2]->entity.client_tag_hash); } TEST_F(ModelTypeWorkerTest, ReceiveUpdates_DuplicateHashWithinPartialUpdate) { @@ -778,8 +778,8 @@ processor()->GetNthUpdateResponse(0); ASSERT_EQ(1u, result.size()); ASSERT_TRUE(result[0]); - EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity->client_tag_hash); - EXPECT_EQ(kValue2, result[0]->entity->specifics.preference().value()); + EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity.client_tag_hash); + EXPECT_EQ(kValue2, result[0]->entity.specifics.preference().value()); } TEST_F(ModelTypeWorkerTest, ReceiveUpdates_DuplicateHashAcrossPartialUpdates) { @@ -797,8 +797,8 @@ processor()->GetNthUpdateResponse(0); ASSERT_EQ(1u, result.size()); ASSERT_TRUE(result[0]); - EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity->client_tag_hash); - EXPECT_EQ(kValue2, result[0]->entity->specifics.preference().value()); + EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity.client_tag_hash); + EXPECT_EQ(kValue2, result[0]->entity.specifics.preference().value()); } TEST_F(ModelTypeWorkerTest, @@ -829,9 +829,9 @@ processor()->GetNthUpdateResponse(0); ASSERT_EQ(2u, result.size()); ASSERT_TRUE(result[0]); - EXPECT_EQ(entity1.id_string(), result[0]->entity->id); + EXPECT_EQ(entity1.id_string(), result[0]->entity.id); ASSERT_TRUE(result[1]); - EXPECT_EQ(entity2.id_string(), result[1]->entity->id); + EXPECT_EQ(entity2.id_string(), result[1]->entity.id); } TEST_F(ModelTypeWorkerTest, ReceiveUpdates_MultipleDuplicateHashes) { @@ -856,12 +856,12 @@ ASSERT_TRUE(result[0]); ASSERT_TRUE(result[1]); ASSERT_TRUE(result[2]); - EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity->client_tag_hash); - EXPECT_EQ(GenerateTagHash(kTag2), result[1]->entity->client_tag_hash); - EXPECT_EQ(GenerateTagHash(kTag3), result[2]->entity->client_tag_hash); - EXPECT_EQ(kValue1, result[0]->entity->specifics.preference().value()); - EXPECT_EQ(kValue2, result[1]->entity->specifics.preference().value()); - EXPECT_EQ(kValue3, result[2]->entity->specifics.preference().value()); + EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity.client_tag_hash); + EXPECT_EQ(GenerateTagHash(kTag2), result[1]->entity.client_tag_hash); + EXPECT_EQ(GenerateTagHash(kTag3), result[2]->entity.client_tag_hash); + EXPECT_EQ(kValue1, result[0]->entity.specifics.preference().value()); + EXPECT_EQ(kValue2, result[1]->entity.specifics.preference().value()); + EXPECT_EQ(kValue3, result[2]->entity.specifics.preference().value()); } // Covers the scenario where two updates have the same client tag hash but @@ -893,7 +893,7 @@ processor()->GetNthUpdateResponse(0); ASSERT_EQ(1u, result.size()); ASSERT_TRUE(result[0]); - EXPECT_EQ(entity2.id_string(), result[0]->entity->id); + EXPECT_EQ(entity2.id_string(), result[0]->entity.id); } // Covers the scenario where two updates have the same originator client item ID @@ -931,7 +931,7 @@ processor()->GetNthUpdateResponse(0); ASSERT_EQ(1u, result.size()); ASSERT_TRUE(result[0]); - EXPECT_EQ(kURL2, result[0]->entity->specifics.bookmark().url()); + EXPECT_EQ(kURL2, result[0]->entity.specifics.bookmark().url()); } // Test that an update download coming in multiple parts gets accumulated into @@ -952,9 +952,9 @@ processor()->GetNthUpdateResponse(0); ASSERT_EQ(2U, updates.size()); ASSERT_TRUE(updates[0]); - EXPECT_EQ(GenerateTagHash(kTag1), updates[0]->entity->client_tag_hash); + EXPECT_EQ(GenerateTagHash(kTag1), updates[0]->entity.client_tag_hash); ASSERT_TRUE(updates[1]); - EXPECT_EQ(GenerateTagHash(kTag2), updates[1]->entity->client_tag_hash); + EXPECT_EQ(GenerateTagHash(kTag2), updates[1]->entity.client_tag_hash); // A subsequent update doesn't pass the same entities again. TriggerUpdateFromServer(10, kTag3, kValue3); @@ -962,7 +962,7 @@ updates = processor()->GetNthUpdateResponse(1); ASSERT_EQ(1U, updates.size()); ASSERT_TRUE(updates[0]); - EXPECT_EQ(GenerateTagHash(kTag3), updates[0]->entity->client_tag_hash); + EXPECT_EQ(GenerateTagHash(kTag3), updates[0]->entity.client_tag_hash); } // Test that updates with no entities behave correctly. @@ -1109,8 +1109,8 @@ // Test some basic properties regarding the update. ASSERT_TRUE(processor()->HasUpdateResponse(kHash1)); const UpdateResponseData& update1 = processor()->GetUpdateResponse(kHash1); - EXPECT_EQ(kTag1, update1.entity->specifics.preference().name()); - EXPECT_EQ(kValue1, update1.entity->specifics.preference().value()); + EXPECT_EQ(kTag1, update1.entity.specifics.preference().name()); + EXPECT_EQ(kValue1, update1.entity.specifics.preference().value()); EXPECT_TRUE(update1.encryption_key_name.empty()); // Set received updates to be encrypted using the new nigori. @@ -1122,8 +1122,8 @@ // Test its basic features and the value of encryption_key_name. ASSERT_TRUE(processor()->HasUpdateResponse(kHash2)); const UpdateResponseData& update2 = processor()->GetUpdateResponse(kHash2); - EXPECT_EQ(kTag2, update2.entity->specifics.preference().name()); - EXPECT_EQ(kValue2, update2.entity->specifics.preference().value()); + EXPECT_EQ(kTag2, update2.entity.specifics.preference().name()); + EXPECT_EQ(kValue2, update2.entity.specifics.preference().value()); EXPECT_FALSE(update2.encryption_key_name.empty()); } @@ -1249,8 +1249,8 @@ EXPECT_EQ(1U, processor()->GetNumUpdateResponses()); ASSERT_TRUE(processor()->HasUpdateResponse(kHash1)); const UpdateResponseData& update = processor()->GetUpdateResponse(kHash1); - EXPECT_EQ(kTag1, update.entity->specifics.preference().name()); - EXPECT_EQ(kValue1, update.entity->specifics.preference().value()); + EXPECT_EQ(kTag1, update.entity.specifics.preference().name()); + EXPECT_EQ(kValue1, update.entity.specifics.preference().value()); EXPECT_EQ(GetLocalCryptographerKeyName(), update.encryption_key_name); } @@ -1383,7 +1383,7 @@ EXPECT_EQ(ModelTypeWorker::SUCCESS, ModelTypeWorker::PopulateUpdateResponseData( &cryptographer, PREFERENCES, entity, &response_data)); - const EntityData& data = *response_data.entity; + const EntityData& data = response_data.entity; EXPECT_FALSE(data.id.empty()); EXPECT_FALSE(data.parent_id.empty()); EXPECT_FALSE(data.is_folder); @@ -1417,7 +1417,7 @@ ModelTypeWorker::PopulateUpdateResponseData( &cryptographer, BOOKMARKS, entity, &response_data)); - const EntityData& data = *response_data.entity; + const EntityData& data = response_data.entity; // A tombstone should remain a tombstone after populating the response data. EXPECT_TRUE(data.is_deleted()); } @@ -1440,7 +1440,7 @@ EXPECT_EQ(ModelTypeWorker::SUCCESS, ModelTypeWorker::PopulateUpdateResponseData( &cryptographer, BOOKMARKS, entity, &response_data)); - const EntityData& data = *response_data.entity; + const EntityData& data = response_data.entity; EXPECT_TRUE( syncer::UniquePosition::FromProto(data.unique_position).IsValid()); @@ -1468,7 +1468,7 @@ EXPECT_EQ(ModelTypeWorker::SUCCESS, ModelTypeWorker::PopulateUpdateResponseData( &cryptographer, BOOKMARKS, entity, &response_data)); - const EntityData& data = *response_data.entity; + const EntityData& data = response_data.entity; EXPECT_TRUE( syncer::UniquePosition::FromProto(data.unique_position).IsValid()); @@ -1496,7 +1496,7 @@ EXPECT_EQ(ModelTypeWorker::SUCCESS, ModelTypeWorker::PopulateUpdateResponseData( &cryptographer, BOOKMARKS, entity, &response_data)); - const EntityData& data = *response_data.entity; + const EntityData& data = response_data.entity; EXPECT_TRUE( syncer::UniquePosition::FromProto(data.unique_position).IsValid()); histogram_tester.ExpectUniqueSample( @@ -1525,7 +1525,7 @@ EXPECT_EQ(ModelTypeWorker::SUCCESS, ModelTypeWorker::PopulateUpdateResponseData( &cryptographer, BOOKMARKS, entity, &response_data)); - const EntityData& data = *response_data.entity; + const EntityData& data = response_data.entity; EXPECT_FALSE( syncer::UniquePosition::FromProto(data.unique_position).IsValid()); histogram_tester.ExpectUniqueSample("Sync.Entities.PositioningScheme", @@ -1549,7 +1549,7 @@ EXPECT_EQ(ModelTypeWorker::SUCCESS, ModelTypeWorker::PopulateUpdateResponseData( &cryptographer, PREFERENCES, entity, &response_data)); - const EntityData& data = *response_data.entity; + const EntityData& data = response_data.entity; EXPECT_FALSE( syncer::UniquePosition::FromProto(data.unique_position).IsValid()); histogram_tester.ExpectTotalCount("Sync.Entities.PositioningScheme", @@ -1576,7 +1576,7 @@ ModelTypeWorker::PopulateUpdateResponseData( &cryptographer, BOOKMARKS, entity, &response_data)); - const EntityData& data = *response_data.entity; + const EntityData& data = response_data.entity; EXPECT_EQ(kGuid1, data.specifics.bookmark().guid()); EXPECT_EQ(kGuid2, data.originator_client_item_id); @@ -1601,7 +1601,7 @@ ModelTypeWorker::PopulateUpdateResponseData( &cryptographer, BOOKMARKS, entity, &response_data)); - const EntityData& data = *response_data.entity; + const EntityData& data = response_data.entity; EXPECT_EQ(kGuid1, data.originator_client_item_id); EXPECT_EQ(kGuid1, data.specifics.bookmark().guid()); @@ -1627,7 +1627,7 @@ ModelTypeWorker::PopulateUpdateResponseData( &cryptographer, BOOKMARKS, entity, &response_data)); - const EntityData& data = *response_data.entity; + const EntityData& data = response_data.entity; EXPECT_EQ(kInvalidOCII, data.originator_client_item_id); EXPECT_TRUE(data.specifics.bookmark().guid().empty()); @@ -1650,7 +1650,7 @@ &cryptographer, AUTOFILL_WALLET_DATA, entity, &response_data)); // The client tag hash gets filled in by the worker. - EXPECT_FALSE(response_data.entity->client_tag_hash.value().empty()); + EXPECT_FALSE(response_data.entity.client_tag_hash.value().empty()); } class GetLocalChangesRequestTest : public testing::Test { @@ -1818,11 +1818,11 @@ // Test its basic features and the value of encryption_key_name. ASSERT_TRUE(processor()->HasUpdateResponse(kHash1)); const UpdateResponseData& update = processor()->GetUpdateResponse(kHash1); - EXPECT_FALSE(update.entity->specifics.password().has_encrypted()); - EXPECT_FALSE(update.entity->specifics.has_encrypted()); + EXPECT_FALSE(update.entity.specifics.password().has_encrypted()); + EXPECT_FALSE(update.entity.specifics.has_encrypted()); ASSERT_TRUE( - update.entity->specifics.password().has_client_only_encrypted_data()); - EXPECT_EQ(kPassword, update.entity->specifics.password() + update.entity.specifics.password().has_client_only_encrypted_data()); + EXPECT_EQ(kPassword, update.entity.specifics.password() .client_only_encrypted_data() .password_value()); } @@ -1895,11 +1895,11 @@ ASSERT_TRUE(processor()->HasUpdateResponse(kHash1)); const UpdateResponseData& update = processor()->GetUpdateResponse(kHash1); // Password should now be decrypted and sent to the processor. - EXPECT_TRUE(update.entity->specifics.has_password()); - EXPECT_FALSE(update.entity->specifics.password().has_encrypted()); + EXPECT_TRUE(update.entity.specifics.has_password()); + EXPECT_FALSE(update.entity.specifics.password().has_encrypted()); ASSERT_TRUE( - update.entity->specifics.password().has_client_only_encrypted_data()); - EXPECT_EQ(kPassword, update.entity->specifics.password() + update.entity.specifics.password().has_client_only_encrypted_data()); + EXPECT_EQ(kPassword, update.entity.specifics.password() .client_only_encrypted_data() .password_value()); } @@ -1985,12 +1985,12 @@ EXPECT_EQ(kGuid1, processor() ->GetNthUpdateResponse(1) .at(0) - ->entity->originator_client_item_id); + ->entity.originator_client_item_id); EXPECT_EQ(kGuid1, processor() ->GetNthUpdateResponse(1) .at(0) - ->entity->specifics.bookmark() + ->entity.specifics.bookmark() .guid()); } @@ -2034,12 +2034,12 @@ EXPECT_EQ(kInvalidOCII, processor() ->GetNthUpdateResponse(1) .at(0) - ->entity->originator_client_item_id); + ->entity.originator_client_item_id); EXPECT_EQ("", processor() ->GetNthUpdateResponse(1) .at(0) - ->entity->specifics.bookmark() + ->entity.specifics.bookmark() .guid()); } @@ -2075,12 +2075,12 @@ EXPECT_EQ(kGuid1, processor() ->GetNthUpdateResponse(0) .at(0) - ->entity->originator_client_item_id); + ->entity.originator_client_item_id); EXPECT_EQ(kGuid1, processor() ->GetNthUpdateResponse(0) .at(0) - ->entity->specifics.bookmark() + ->entity.specifics.bookmark() .guid()); } @@ -2117,12 +2117,12 @@ EXPECT_EQ(kInvalidOCII, processor() ->GetNthUpdateResponse(0) .at(0) - ->entity->originator_client_item_id); + ->entity.originator_client_item_id); EXPECT_TRUE(processor() ->GetNthUpdateResponse(0) .at(0) - ->entity->specifics.bookmark() + ->entity.specifics.bookmark() .guid() .empty()); }
diff --git a/components/sync/engine_impl/uss_migrator_unittest.cc b/components/sync/engine_impl/uss_migrator_unittest.cc index 70d0561..ce9a443 100644 --- a/components/sync/engine_impl/uss_migrator_unittest.cc +++ b/components/sync/engine_impl/uss_migrator_unittest.cc
@@ -135,7 +135,7 @@ const UpdateResponseData* update = std::move(processor()->GetNthUpdateResponse(0).at(0)); ASSERT_TRUE(update); - const EntityData& entity = *update->entity; + const EntityData& entity = update->entity; EXPECT_FALSE(entity.id.empty()); EXPECT_EQ(GenerateTagHash(kTag1), entity.client_tag_hash); @@ -167,11 +167,11 @@ std::vector<const UpdateResponseData*> updates = processor()->GetNthUpdateResponse(0); ASSERT_TRUE(updates.at(0)); - EXPECT_EQ(kTag1, updates.at(0)->entity->specifics.preference().name()); + EXPECT_EQ(kTag1, updates.at(0)->entity.specifics.preference().name()); ASSERT_TRUE(updates.at(1)); - EXPECT_EQ(kTag2, updates.at(1)->entity->specifics.preference().name()); + EXPECT_EQ(kTag2, updates.at(1)->entity.specifics.preference().name()); ASSERT_TRUE(updates.at(2)); - EXPECT_EQ(kTag3, updates.at(2)->entity->specifics.preference().name()); + EXPECT_EQ(kTag3, updates.at(2)->entity.specifics.preference().name()); const sync_pb::ModelTypeState& state = processor()->GetNthUpdateState(0); EXPECT_EQ(kToken1, state.progress_marker().token()); @@ -201,11 +201,11 @@ std::vector<const UpdateResponseData*> updates = processor()->GetNthUpdateResponse(0); ASSERT_TRUE(updates.at(0)); - EXPECT_EQ(kTag1, updates.at(0)->entity->specifics.preference().name()); + EXPECT_EQ(kTag1, updates.at(0)->entity.specifics.preference().name()); ASSERT_TRUE(updates.at(1)); - EXPECT_EQ(kTag2, updates.at(1)->entity->specifics.preference().name()); + EXPECT_EQ(kTag2, updates.at(1)->entity.specifics.preference().name()); ASSERT_TRUE(updates.at(2)); - EXPECT_EQ(kTag3, updates.at(2)->entity->specifics.preference().name()); + EXPECT_EQ(kTag3, updates.at(2)->entity.specifics.preference().name()); const sync_pb::ModelTypeState& state = processor()->GetNthUpdateState(0); EXPECT_EQ(kToken1, state.progress_marker().token());
diff --git a/components/sync/model/entity_change.cc b/components/sync/model/entity_change.cc index b7726d3..95f26381 100644 --- a/components/sync/model/entity_change.cc +++ b/components/sync/model/entity_change.cc
@@ -13,7 +13,7 @@ // static std::unique_ptr<EntityChange> EntityChange::CreateAdd( const std::string& storage_key, - std::unique_ptr<EntityData> data) { + EntityData data) { return base::WrapUnique( new EntityChange(storage_key, ACTION_ADD, std::move(data))); } @@ -21,7 +21,7 @@ // static std::unique_ptr<EntityChange> EntityChange::CreateUpdate( const std::string& storage_key, - std::unique_ptr<EntityData> data) { + EntityData data) { return base::WrapUnique( new EntityChange(storage_key, ACTION_UPDATE, std::move(data))); } @@ -30,12 +30,12 @@ std::unique_ptr<EntityChange> EntityChange::CreateDelete( const std::string& storage_key) { return base::WrapUnique( - new EntityChange(storage_key, ACTION_DELETE, nullptr)); + new EntityChange(storage_key, ACTION_DELETE, EntityData())); } EntityChange::EntityChange(const std::string& storage_key, ChangeType type, - std::unique_ptr<EntityData> data) + EntityData data) : storage_key_(storage_key), type_(type), data_(std::move(data)) {} EntityChange::~EntityChange() {}
diff --git a/components/sync/model/entity_change.h b/components/sync/model/entity_change.h index 01ec2893..be421fd 100644 --- a/components/sync/model/entity_change.h +++ b/components/sync/model/entity_change.h
@@ -18,12 +18,11 @@ public: enum ChangeType { ACTION_ADD, ACTION_UPDATE, ACTION_DELETE }; - static std::unique_ptr<EntityChange> CreateAdd( - const std::string& storage_key, - std::unique_ptr<EntityData> data); + static std::unique_ptr<EntityChange> CreateAdd(const std::string& storage_key, + EntityData data); static std::unique_ptr<EntityChange> CreateUpdate( const std::string& storage_key, - std::unique_ptr<EntityData> data); + EntityData data); static std::unique_ptr<EntityChange> CreateDelete( const std::string& storage_key); @@ -31,16 +30,16 @@ std::string storage_key() const { return storage_key_; } ChangeType type() const { return type_; } - const EntityData& data() const { return *data_; } + const EntityData& data() const { return data_; } private: EntityChange(const std::string& storage_key, ChangeType type, - std::unique_ptr<EntityData> data); + EntityData data); std::string storage_key_; ChangeType type_; - std::unique_ptr<EntityData> data_; + EntityData data_; DISALLOW_COPY_AND_ASSIGN(EntityChange); };
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor.cc b/components/sync/model_impl/client_tag_based_model_type_processor.cc index 49f8284c..ad89860 100644 --- a/components/sync/model_impl/client_tag_based_model_type_processor.cc +++ b/components/sync/model_impl/client_tag_based_model_type_processor.cc
@@ -765,14 +765,13 @@ model_type_state_ = model_type_state; metadata_changes->UpdateModelTypeState(model_type_state_); - for (const std::unique_ptr<syncer::UpdateResponseData>& update : updates) { - DCHECK(update); - const ClientTagHash& client_tag_hash = update->entity->client_tag_hash; + for (syncer::UpdateResponseData& update : updates) { + const ClientTagHash& client_tag_hash = update.entity.client_tag_hash; if (client_tag_hash.value().empty()) { // Ignore updates missing a client tag hash (e.g. permanent nodes). continue; } - if (update->entity->is_deleted()) { + if (update.entity.is_deleted()) { DLOG(WARNING) << "Ignoring tombstone found during initial update: " << "client_tag_hash = " << client_tag_hash << " for " << ModelTypeToString(type_); @@ -780,7 +779,7 @@ } if (bridge_->SupportsGetClientTag() && client_tag_hash != ClientTagHash::FromUnhashed( - type_, bridge_->GetClientTag(*update->entity))) { + type_, bridge_->GetClientTag(update.entity))) { DLOG(WARNING) << "Received unexpected client tag hash: " << client_tag_hash << " for " << ModelTypeToString(type_); continue; @@ -795,11 +794,11 @@ << " for " << ModelTypeToString(type_); } #endif // DCHECK_IS_ON() - ProcessorEntity* entity = CreateEntity(*update->entity); - entity->RecordAcceptedUpdate(*update); + ProcessorEntity* entity = CreateEntity(update.entity); + entity->RecordAcceptedUpdate(update); const std::string& storage_key = entity->storage_key(); entity_data.push_back( - EntityChange::CreateAdd(storage_key, std::move(update->entity))); + EntityChange::CreateAdd(storage_key, std::move(update.entity))); if (!storage_key.empty()) metadata_changes->UpdateMetadata(storage_key, entity->metadata()); }
diff --git a/components/sync/model_impl/client_tag_based_remote_update_handler.cc b/components/sync/model_impl/client_tag_based_remote_update_handler.cc index 19c9830..ef4338d 100644 --- a/components/sync/model_impl/client_tag_based_remote_update_handler.cc +++ b/components/sync/model_impl/client_tag_based_remote_update_handler.cc
@@ -74,8 +74,7 @@ // re-encryption phase at the end. std::unordered_set<std::string> already_updated; - for (std::unique_ptr<syncer::UpdateResponseData>& update : updates) { - DCHECK(update); + for (syncer::UpdateResponseData& update : updates) { std::string storage_key_to_clear; ProcessorEntity* entity = ProcessUpdate(std::move(update), &entity_changes, &storage_key_to_clear); @@ -138,10 +137,10 @@ } ProcessorEntity* ClientTagBasedRemoteUpdateHandler::ProcessUpdate( - std::unique_ptr<UpdateResponseData> update, + UpdateResponseData update, EntityChangeList* entity_changes, std::string* storage_key_to_clear) { - const EntityData& data = *update->entity; + const EntityData& data = update.entity; const ClientTagHash& client_tag_hash = data.client_tag_hash; // Filter out updates without a client tag hash (including permanent nodes, @@ -171,17 +170,17 @@ } if (entity) { - entity->RecordEntityUpdateLatency(update->response_version, type_); + entity->RecordEntityUpdateLatency(update.response_version, type_); } - if (entity && entity->UpdateIsReflection(update->response_version)) { + if (entity && entity->UpdateIsReflection(update.response_version)) { // Seen this update before; just ignore it. return nullptr; } // Cache update encryption key name in case |update| will be moved away into // ResolveConflict(). - const std::string update_encryption_key_name = update->encryption_key_name; + const std::string update_encryption_key_name = update.encryption_key_name; ConflictResolution resolution_type = ConflictResolution::kTypeSize; if (entity && entity->IsUnsynced()) { // Handle conflict resolution. @@ -202,13 +201,13 @@ } else if (!entity->MatchesData(data)) { change_type = EntityChange::ACTION_UPDATE; } - entity->RecordAcceptedUpdate(*update); + entity->RecordAcceptedUpdate(update); // Inform the bridge about the changes if needed. if (change_type) { switch (change_type.value()) { case EntityChange::ACTION_ADD: entity_changes->push_back(EntityChange::CreateAdd( - entity->storage_key(), std::move(update->entity))); + entity->storage_key(), std::move(update.entity))); break; case EntityChange::ACTION_DELETE: // The entity was deleted; inform the bridge. Note that the local data @@ -220,7 +219,7 @@ case EntityChange::ACTION_UPDATE: // Specifics have changed, so update the bridge. entity_changes->push_back(EntityChange::CreateUpdate( - entity->storage_key(), std::move(update->entity))); + entity->storage_key(), std::move(update.entity))); break; } } @@ -262,11 +261,11 @@ } ConflictResolution ClientTagBasedRemoteUpdateHandler::ResolveConflict( - std::unique_ptr<UpdateResponseData> update, + UpdateResponseData update, ProcessorEntity* entity, EntityChangeList* changes, std::string* storage_key_to_clear) { - const EntityData& remote_data = *update->entity; + const EntityData& remote_data = update.entity; ConflictResolution resolution_type = ConflictResolution::kTypeSize; @@ -296,27 +295,27 @@ switch (resolution_type) { case ConflictResolution::kChangesMatch: // Record the update and squash the pending commit. - entity->RecordForcedUpdate(*update); + entity->RecordForcedUpdate(update); break; case ConflictResolution::kUseLocal: case ConflictResolution::kIgnoreRemoteEncryption: // Record that we received the update from the server but leave the // pending commit intact. - entity->RecordIgnoredUpdate(*update); + entity->RecordIgnoredUpdate(update); break; case ConflictResolution::kUseRemote: case ConflictResolution::kIgnoreLocalEncryption: // Update client data to match server. - if (update->entity->is_deleted()) { + if (update.entity.is_deleted()) { DCHECK(!entity->metadata().is_deleted()); // Squash the pending commit. - entity->RecordForcedUpdate(*update); + entity->RecordForcedUpdate(update); changes->push_back(EntityChange::CreateDelete(entity->storage_key())); } else if (!entity->metadata().is_deleted()) { // Squash the pending commit. - entity->RecordForcedUpdate(*update); + entity->RecordForcedUpdate(update); changes->push_back(EntityChange::CreateUpdate( - entity->storage_key(), std::move(update->entity))); + entity->storage_key(), std::move(update.entity))); } else { // Remote undeletion. This could imply a new storage key for some // bridges, so we may need to wait until UpdateStorageKey() is called. @@ -325,9 +324,9 @@ entity->ClearStorageKey(); } // Squash the pending commit. - entity->RecordForcedUpdate(*update); + entity->RecordForcedUpdate(update); changes->push_back(EntityChange::CreateAdd(entity->storage_key(), - std::move(update->entity))); + std::move(update.entity))); } break; case ConflictResolution::kUseNewDEPRECATED:
diff --git a/components/sync/model_impl/client_tag_based_remote_update_handler.h b/components/sync/model_impl/client_tag_based_remote_update_handler.h index 58bcf8d..86f2e97 100644 --- a/components/sync/model_impl/client_tag_based_remote_update_handler.h +++ b/components/sync/model_impl/client_tag_based_remote_update_handler.h
@@ -59,7 +59,7 @@ // |storage_key_to_clear| must not be null and allows the implementation to // indicate that a certain storage key is now obsolete and should be cleared, // which is leveraged in certain conflict resolution scenarios. - ProcessorEntity* ProcessUpdate(std::unique_ptr<UpdateResponseData> update, + ProcessorEntity* ProcessUpdate(UpdateResponseData update, EntityChangeList* entity_changes, std::string* storage_key_to_clear); @@ -69,7 +69,7 @@ MetadataChangeList* metadata_changes); // Resolve a conflict between |update| and the pending commit in |entity|. - ConflictResolution ResolveConflict(std::unique_ptr<UpdateResponseData> update, + ConflictResolution ResolveConflict(UpdateResponseData update, ProcessorEntity* entity, EntityChangeList* changes, std::string* storage_key_to_clear);
diff --git a/components/sync/model_impl/processor_entity.cc b/components/sync/model_impl/processor_entity.cc index dd36b8e..2cefabd 100644 --- a/components/sync/model_impl/processor_entity.cc +++ b/components/sync/model_impl/processor_entity.cc
@@ -179,8 +179,8 @@ void ProcessorEntity::RecordIgnoredUpdate(const UpdateResponseData& update) { DCHECK(metadata_.server_id().empty() || - metadata_.server_id() == update.entity->id); - metadata_.set_server_id(update.entity->id); + metadata_.server_id() == update.entity.id); + metadata_.set_server_id(update.entity.id); metadata_.set_server_version(update.response_version); // Either these already matched, acked was just bumped to squash a pending // commit and this should follow, or the pending commit needs to be requeued. @@ -196,10 +196,10 @@ void ProcessorEntity::RecordAcceptedUpdate(const UpdateResponseData& update) { DCHECK(!IsUnsynced()); RecordIgnoredUpdate(update); - metadata_.set_is_deleted(update.entity->is_deleted()); + metadata_.set_is_deleted(update.entity.is_deleted()); metadata_.set_modification_time( - TimeToProtoTime(update.entity->modification_time)); - UpdateSpecificsHash(update.entity->specifics); + TimeToProtoTime(update.entity.modification_time)); + UpdateSpecificsHash(update.entity.specifics); } void ProcessorEntity::RecordForcedUpdate(const UpdateResponseData& update) {
diff --git a/components/sync/model_impl/processor_entity_unittest.cc b/components/sync/model_impl/processor_entity_unittest.cc index 810dae10..e5f6d40 100644 --- a/components/sync/model_impl/processor_entity_unittest.cc +++ b/components/sync/model_impl/processor_entity_unittest.cc
@@ -47,38 +47,36 @@ return entity_data; } -std::unique_ptr<UpdateResponseData> GenerateUpdate( - const ProcessorEntity& entity, - const ClientTagHash& hash, - const std::string& id, - const std::string& name, - const std::string& value, - const base::Time& mtime, - int64_t version) { +UpdateResponseData GenerateUpdate(const ProcessorEntity& entity, + const ClientTagHash& hash, + const std::string& id, + const std::string& name, + const std::string& value, + const base::Time& mtime, + int64_t version) { std::unique_ptr<EntityData> data = GenerateEntityData(hash, name, value); data->id = id; data->modification_time = mtime; - auto update = std::make_unique<UpdateResponseData>(); - update->entity = std::move(data); - update->response_version = version; + UpdateResponseData update; + update.entity = std::move(*data); + update.response_version = version; return update; } -std::unique_ptr<UpdateResponseData> GenerateTombstone( - const ProcessorEntity& entity, - const ClientTagHash& hash, - const std::string& id, - const std::string& name, - const base::Time& mtime, - int64_t version) { +UpdateResponseData GenerateTombstone(const ProcessorEntity& entity, + const ClientTagHash& hash, + const std::string& id, + const std::string& name, + const base::Time& mtime, + int64_t version) { std::unique_ptr<EntityData> data = std::make_unique<EntityData>(); data->client_tag_hash = hash; data->name = name; data->id = id; data->modification_time = mtime; - auto update = std::make_unique<UpdateResponseData>(); - update->entity = std::move(data); - update->response_version = version; + UpdateResponseData update; + update.entity = std::move(*data); + update.response_version = version; return update; } @@ -121,9 +119,9 @@ std::unique_ptr<ProcessorEntity> CreateSynced() { std::unique_ptr<ProcessorEntity> entity = CreateNew(); - std::unique_ptr<UpdateResponseData> update = + UpdateResponseData update = GenerateUpdate(*entity, kHash, kId, kName, kValue1, ctime_, 1); - entity->RecordAcceptedUpdate(*update); + entity->RecordAcceptedUpdate(update); DCHECK(!entity->IsUnsynced()); return entity; } @@ -238,9 +236,9 @@ std::unique_ptr<ProcessorEntity> entity = CreateNew(); const base::Time mtime = base::Time::Now(); - std::unique_ptr<UpdateResponseData> update = + UpdateResponseData update = GenerateUpdate(*entity, kHash, kId, kName, kValue1, mtime, 10); - entity->RecordAcceptedUpdate(*update); + entity->RecordAcceptedUpdate(update); EXPECT_EQ(kId, entity->metadata().server_id()); EXPECT_FALSE(entity->metadata().is_deleted()); @@ -269,9 +267,9 @@ EXPECT_EQ("", entity->storage_key()); const base::Time mtime = base::Time::Now(); - std::unique_ptr<UpdateResponseData> update = + UpdateResponseData update = GenerateUpdate(*entity, kHash, kId, kName, kValue1, mtime, 10); - entity->RecordAcceptedUpdate(*update); + entity->RecordAcceptedUpdate(update); entity->SetStorageKey(kKey); EXPECT_EQ(kKey, entity->storage_key()); } @@ -281,9 +279,9 @@ std::unique_ptr<ProcessorEntity> entity = CreateNew(); const base::Time mtime = base::Time::Now(); - std::unique_ptr<UpdateResponseData> tombstone = + UpdateResponseData tombstone = GenerateTombstone(*entity, kHash, kId, kName, mtime, 1); - entity->RecordAcceptedUpdate(*tombstone); + entity->RecordAcceptedUpdate(tombstone); EXPECT_EQ(kId, entity->metadata().server_id()); EXPECT_TRUE(entity->metadata().is_deleted()); @@ -309,9 +307,9 @@ std::unique_ptr<ProcessorEntity> entity = CreateSynced(); // A deletion update one version later. const base::Time mtime = base::Time::Now(); - std::unique_ptr<UpdateResponseData> tombstone = + UpdateResponseData tombstone = GenerateTombstone(*entity, kHash, kId, kName, mtime, 2); - entity->RecordAcceptedUpdate(*tombstone); + entity->RecordAcceptedUpdate(tombstone); EXPECT_TRUE(entity->metadata().is_deleted()); EXPECT_EQ(0, entity->metadata().sequence_number()); @@ -577,9 +575,9 @@ // Before anything gets committed, we receive a remote tombstone, but local // would usually win so the remote update is ignored. - std::unique_ptr<UpdateResponseData> tombstone = + UpdateResponseData tombstone = GenerateTombstone(*entity, kHash, kId, kName, base::Time::Now(), 2); - entity->RecordIgnoredUpdate(*tombstone); + entity->RecordIgnoredUpdate(tombstone); EXPECT_EQ(kId, entity->metadata().server_id()); EXPECT_TRUE(entity->IsUnsynced());
diff --git a/components/sync/nigori/nigori_model_type_processor.cc b/components/sync/nigori/nigori_model_type_processor.cc index 0633602..982eba90 100644 --- a/components/sync/nigori/nigori_model_type_processor.cc +++ b/components/sync/nigori/nigori_model_type_processor.cc
@@ -132,12 +132,12 @@ if (updates.empty()) { error = bridge_->MergeSyncData(base::nullopt); } else { - DCHECK(!updates[0]->entity->is_deleted()); + DCHECK(!updates[0].entity.is_deleted()); entity_ = ProcessorEntity::CreateNew( kNigoriStorageKey, ClientTagHash::FromHashed(kRawNigoriClientTagHash), - updates[0]->entity->id, updates[0]->entity->creation_time); - entity_->RecordAcceptedUpdate(*updates[0]); - error = bridge_->MergeSyncData(std::move(*updates[0]->entity)); + updates[0].entity.id, updates[0].entity.creation_time); + entity_->RecordAcceptedUpdate(updates[0]); + error = bridge_->MergeSyncData(std::move(updates[0].entity)); } if (error) { ReportError(*error); @@ -153,9 +153,9 @@ DCHECK(entity_); // We assume the bridge will issue errors in case of deletions. Therefore, we // are adding the following DCHECK to simplify the code. - DCHECK(!updates[0]->entity->is_deleted()); + DCHECK(!updates[0].entity.is_deleted()); - if (entity_->UpdateIsReflection(updates[0]->response_version)) { + if (entity_->UpdateIsReflection(updates[0].response_version)) { // Seen this update before; just ignore it. bridge_->ApplySyncChanges(/*data=*/base::nullopt); return; @@ -164,18 +164,18 @@ if (entity_->IsUnsynced()) { // Remote update always win in case of conflict, because bridge takes care // of reapplying pending local changes after processing the remote update. - entity_->RecordForcedUpdate(*updates[0]); - error = bridge_->ApplySyncChanges(std::move(*updates[0]->entity)); + entity_->RecordForcedUpdate(updates[0]); + error = bridge_->ApplySyncChanges(std::move(updates[0].entity)); UMA_HISTOGRAM_ENUMERATION("Sync.ResolveConflict", ConflictResolution::kUseRemote, ConflictResolution::kTypeSize); UMA_HISTOGRAM_ENUMERATION("Sync.ResolveSimpleConflict", ConflictResolver::NIGORI_MERGE, ConflictResolver::CONFLICT_RESOLUTION_SIZE); - } else if (!entity_->MatchesData(*updates[0]->entity)) { + } else if (!entity_->MatchesData(updates[0].entity)) { // Inform the bridge of the new or updated data. - entity_->RecordAcceptedUpdate(*updates[0]); - error = bridge_->ApplySyncChanges(std::move(*updates[0]->entity)); + entity_->RecordAcceptedUpdate(updates[0]); + error = bridge_->ApplySyncChanges(std::move(updates[0].entity)); } if (error) {
diff --git a/components/sync/nigori/nigori_model_type_processor_unittest.cc b/components/sync/nigori/nigori_model_type_processor_unittest.cc index 46a0995..8bd7033 100644 --- a/components/sync/nigori/nigori_model_type_processor_unittest.cc +++ b/components/sync/nigori/nigori_model_type_processor_unittest.cc
@@ -53,21 +53,21 @@ // Creates a dummy Nigori UpdateResponseData that has the keystore decryptor // token key name set. -std::unique_ptr<syncer::UpdateResponseData> CreateDummyNigoriUpdateResponseData( +syncer::UpdateResponseData CreateDummyNigoriUpdateResponseData( const std::string keystore_decryptor_token_key_name, int response_version) { - auto entity_data = std::make_unique<syncer::EntityData>(); - entity_data->is_folder = true; - entity_data->id = kNigoriServerId; + syncer::EntityData entity_data; + entity_data.is_folder = true; + entity_data.id = kNigoriServerId; sync_pb::NigoriSpecifics* nigori_specifics = - entity_data->specifics.mutable_nigori(); + entity_data.specifics.mutable_nigori(); nigori_specifics->mutable_keystore_decryptor_token()->set_key_name( keystore_decryptor_token_key_name); - entity_data->name = kNigoriNonUniqueName; + entity_data.name = kNigoriNonUniqueName; - auto response_data = std::make_unique<syncer::UpdateResponseData>(); - response_data->entity = std::move(entity_data); - response_data->response_version = response_version; + syncer::UpdateResponseData response_data; + response_data.entity = std::move(entity_data); + response_data.response_version = response_version; return response_data; }
diff --git a/components/sync/test/engine/mock_model_type_processor.cc b/components/sync/test/engine/mock_model_type_processor.cc index b8e133b..03e5606 100644 --- a/components/sync/test/engine/mock_model_type_processor.cc +++ b/components/sync/test/engine/mock_model_type_processor.cc
@@ -137,9 +137,8 @@ MockModelTypeProcessor::GetNthUpdateResponse(size_t n) const { DCHECK_LT(n, GetNumUpdateResponses()); std::vector<const UpdateResponseData*> nth_update_responses; - for (const std::unique_ptr<UpdateResponseData>& response : - received_update_responses_[n]) { - nth_update_responses.push_back(response.get()); + for (const UpdateResponseData& response : received_update_responses_[n]) { + nth_update_responses.push_back(&response); } return nth_update_responses; } @@ -236,12 +235,12 @@ UpdateResponseDataList response_list) { type_states_received_on_update_.push_back(type_state); for (auto it = response_list.begin(); it != response_list.end(); ++it) { - const ClientTagHash& client_tag_hash = (*it)->entity->client_tag_hash; + const ClientTagHash& client_tag_hash = it->entity.client_tag_hash; // Server wins. Set the model's base version. - SetBaseVersion(client_tag_hash, (*it)->response_version); - SetServerAssignedId(client_tag_hash, (*it)->entity->id); + SetBaseVersion(client_tag_hash, it->response_version); + SetServerAssignedId(client_tag_hash, it->entity.id); - update_response_items_.insert(std::make_pair(client_tag_hash, it->get())); + update_response_items_.insert(std::make_pair(client_tag_hash, &(*it))); } received_update_responses_.push_back(std::move(response_list)); }
diff --git a/components/sync/test/engine/mock_model_type_worker.cc b/components/sync/test/engine/mock_model_type_worker.cc index a36e332..eed5c2f5 100644 --- a/components/sync/test/engine/mock_model_type_worker.cc +++ b/components/sync/test/engine/mock_model_type_worker.cc
@@ -151,8 +151,7 @@ processor_->OnUpdateReceived(model_type_state_, std::move(updates)); } -std::unique_ptr<syncer::UpdateResponseData> -MockModelTypeWorker::GenerateUpdateData( +syncer::UpdateResponseData MockModelTypeWorker::GenerateUpdateData( const ClientTagHash& tag_hash, const sync_pb::EntitySpecifics& specifics, int64_t version_offset, @@ -164,51 +163,50 @@ SetServerVersion(tag_hash, version); } - auto data = std::make_unique<syncer::EntityData>(); - data->id = GenerateId(tag_hash); - data->client_tag_hash = tag_hash; - data->specifics = specifics; + syncer::EntityData data; + data.id = GenerateId(tag_hash); + data.client_tag_hash = tag_hash; + data.specifics = specifics; // These elements should have no effect on behavior, but we set them anyway // so we can test they are properly copied around the system if we want to. - data->creation_time = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1); - data->modification_time = - data->creation_time + base::TimeDelta::FromSeconds(version); - data->name = data->specifics.has_encrypted() - ? "encrypted" - : data->specifics.preference().name(); + data.creation_time = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1); + data.modification_time = + data.creation_time + base::TimeDelta::FromSeconds(version); + data.name = data.specifics.has_encrypted() + ? "encrypted" + : data.specifics.preference().name(); - auto response_data = std::make_unique<syncer::UpdateResponseData>(); - response_data->entity = std::move(data); - response_data->response_version = version; - response_data->encryption_key_name = ekn; + syncer::UpdateResponseData response_data; + response_data.entity = std::move(data); + response_data.response_version = version; + response_data.encryption_key_name = ekn; return response_data; } -std::unique_ptr<syncer::UpdateResponseData> -MockModelTypeWorker::GenerateUpdateData( +syncer::UpdateResponseData MockModelTypeWorker::GenerateUpdateData( const ClientTagHash& tag_hash, const sync_pb::EntitySpecifics& specifics) { return GenerateUpdateData(tag_hash, specifics, 1, model_type_state_.encryption_key_name()); } -std::unique_ptr<syncer::UpdateResponseData> -MockModelTypeWorker::GenerateTypeRootUpdateData(const ModelType& model_type) { - auto data = std::make_unique<syncer::EntityData>(); - data->id = syncer::ModelTypeToRootTag(model_type); - data->parent_id = "r"; - data->server_defined_unique_tag = syncer::ModelTypeToRootTag(model_type); - syncer::AddDefaultFieldValue(model_type, &data->specifics); +syncer::UpdateResponseData MockModelTypeWorker::GenerateTypeRootUpdateData( + const ModelType& model_type) { + syncer::EntityData data; + data.id = syncer::ModelTypeToRootTag(model_type); + data.parent_id = "r"; + data.server_defined_unique_tag = syncer::ModelTypeToRootTag(model_type); + syncer::AddDefaultFieldValue(model_type, &data.specifics); // These elements should have no effect on behavior, but we set them anyway // so we can test they are properly copied around the system if we want to. - data->creation_time = base::Time::UnixEpoch(); - data->modification_time = base::Time::UnixEpoch(); + data.creation_time = base::Time::UnixEpoch(); + data.modification_time = base::Time::UnixEpoch(); - auto response_data = std::make_unique<syncer::UpdateResponseData>(); - response_data->entity = std::move(data); + syncer::UpdateResponseData response_data; + response_data.entity = std::move(data); // Similar to what's done in the loopback_server. - response_data->response_version = 0; + response_data.response_version = 0; return response_data; } @@ -217,20 +215,20 @@ int64_t version = old_version + 1; SetServerVersion(tag_hash, version); - auto data = std::make_unique<syncer::EntityData>(); - data->id = GenerateId(tag_hash); - data->client_tag_hash = tag_hash; + syncer::EntityData data; + data.id = GenerateId(tag_hash); + data.client_tag_hash = tag_hash; // These elements should have no effect on behavior, but we set them anyway // so we can test they are properly copied around the system if we want to. - data->creation_time = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1); - data->modification_time = - data->creation_time + base::TimeDelta::FromSeconds(version); - data->name = "Name Non Unique"; + data.creation_time = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1); + data.modification_time = + data.creation_time + base::TimeDelta::FromSeconds(version); + data.name = "Name Non Unique"; - auto response_data = std::make_unique<UpdateResponseData>(); - response_data->entity = std::move(data); - response_data->response_version = version; - response_data->encryption_key_name = model_type_state_.encryption_key_name(); + UpdateResponseData response_data; + response_data.entity = std::move(data); + response_data.response_version = version; + response_data.encryption_key_name = model_type_state_.encryption_key_name(); UpdateResponseDataList list; list.push_back(std::move(response_data));
diff --git a/components/sync/test/engine/mock_model_type_worker.h b/components/sync/test/engine/mock_model_type_worker.h index bc3faff..19df06c3 100644 --- a/components/sync/test/engine/mock_model_type_worker.h +++ b/components/sync/test/engine/mock_model_type_worker.h
@@ -88,7 +88,7 @@ // the same version) or new updates. // // |ekn| is the encryption key name this item will fake having. - std::unique_ptr<syncer::UpdateResponseData> GenerateUpdateData( + syncer::UpdateResponseData GenerateUpdateData( const ClientTagHash& tag_hash, const sync_pb::EntitySpecifics& specifics, int64_t version_offset, @@ -96,13 +96,13 @@ // Mostly same as GenerateUpdateData above, but set 1 as |version_offset|, and // use model_type_state_.encryption_key_name() as |ekn|. - std::unique_ptr<syncer::UpdateResponseData> GenerateUpdateData( + syncer::UpdateResponseData GenerateUpdateData( const ClientTagHash& tag_hash, const sync_pb::EntitySpecifics& specifics); // Returns an UpdateResponseData representing an update received from // the server for a type root node. - std::unique_ptr<syncer::UpdateResponseData> GenerateTypeRootUpdateData( + syncer::UpdateResponseData GenerateTypeRootUpdateData( const ModelType& model_type); // Triggers a server-side deletion of the entity with |tag_hash|; updates
diff --git a/components/sync_bookmarks/bookmark_model_merger.cc b/components/sync_bookmarks/bookmark_model_merger.cc index fc0e358..0c57036e 100644 --- a/components/sync_bookmarks/bookmark_model_merger.cc +++ b/components/sync_bookmarks/bookmark_model_merger.cc
@@ -55,9 +55,8 @@ const char kMobileBookmarksTag[] = "synced_bookmarks"; const char kOtherBookmarksTag[] = "other_bookmarks"; -using UpdatesPerParentId = std::unordered_map<base::StringPiece, - syncer::UpdateResponseDataList, - base::StringPieceHash>; +using UpdatesPerParentId = + std::unordered_map<std::string, syncer::UpdateResponseDataList>; // Gets the bookmark node corresponding to a permanent folder identified by // |server_defined_unique_tag|. |bookmark_model| must not be null. @@ -125,31 +124,25 @@ std::set<std::string> known_guids; // In a first pass we process |originator_client_item_id| which is more // authoritative and cannot run into duplicates. - for (const std::unique_ptr<UpdateResponseData>& update : *updates) { - DCHECK(update); - DCHECK(update->entity); - + for (const UpdateResponseData& update : *updates) { // |originator_client_item_id| is empty for permanent nodes. - if (update->entity->is_deleted() || - update->entity->originator_client_item_id.empty()) { + if (update.entity.is_deleted() || + update.entity.originator_client_item_id.empty()) { continue; } bool success = - known_guids.insert(update->entity->originator_client_item_id).second; + known_guids.insert(update.entity.originator_client_item_id).second; DCHECK(success); } // In a second pass, detect if GUIDs in specifics conflict with each other or // with |originator_client_item_id| values processed earlier. - for (std::unique_ptr<UpdateResponseData>& update : *updates) { - DCHECK(update); - DCHECK(update->entity); - + for (UpdateResponseData& update : *updates) { const std::string& guid_in_specifics = - update->entity->specifics.bookmark().guid(); + update.entity.specifics.bookmark().guid(); if (guid_in_specifics.empty() || - guid_in_specifics == update->entity->originator_client_item_id) { + guid_in_specifics == update.entity.originator_client_item_id) { continue; } @@ -158,7 +151,7 @@ // This GUID conflicts with another one, so let's ignore it for the // purpose of merging. This mimics the data produced by old clients, // without the GUID being populated. - update->entity->specifics.mutable_bookmark()->clear_guid(); + update.entity.specifics.mutable_bookmark()->clear_guid(); } } } @@ -169,11 +162,8 @@ UpdateResponseDataList* updates) { UpdatesPerParentId updates_per_parent_id; - for (std::unique_ptr<UpdateResponseData>& update : *updates) { - DCHECK(update); - DCHECK(update->entity); - - const EntityData& update_entity = *update->entity; + for (UpdateResponseData& update : *updates) { + const EntityData& update_entity = update.entity; if (update_entity.is_deleted()) { continue; } @@ -246,23 +236,19 @@ // static BookmarkModelMerger::RemoteTreeNode BookmarkModelMerger::RemoteTreeNode::BuildTree( - std::unique_ptr<UpdateResponseData> update, + UpdateResponseData update, UpdatesPerParentId* updates_per_parent_id) { DCHECK(updates_per_parent_id); - DCHECK(update); - DCHECK(update->entity); RemoteTreeNode node; node.update_ = std::move(update); // Populate descendants recursively. - for (std::unique_ptr<UpdateResponseData>& child_update : + for (UpdateResponseData& child_update : (*updates_per_parent_id)[node.entity().id]) { - DCHECK(child_update); - DCHECK(child_update->entity); - DCHECK_EQ(child_update->entity->parent_id, node.entity().id); - DCHECK(IsValidBookmarkSpecifics(child_update->entity->specifics.bookmark(), - child_update->entity->is_folder)); + DCHECK_EQ(child_update.entity.parent_id, node.entity().id); + DCHECK(IsValidBookmarkSpecifics(child_update.entity.specifics.bookmark(), + child_update.entity.is_folder)); node.children_.push_back( BuildTree(std::move(child_update), updates_per_parent_id)); @@ -335,14 +321,14 @@ // Construct one tree per permanent entity. RemoteForest update_forest; - for (std::unique_ptr<UpdateResponseData>& update : updates) { - if (!update || update->entity->server_defined_unique_tag.empty()) { + for (UpdateResponseData& update : updates) { + if (update.entity.server_defined_unique_tag.empty()) { continue; } // Make a copy of the string to avoid relying on argument evaluation order. const std::string server_defined_unique_tag = - update->entity->server_defined_unique_tag; + update.entity.server_defined_unique_tag; update_forest.emplace( server_defined_unique_tag, @@ -361,6 +347,10 @@ bookmarks::BookmarkModel* bookmark_model) { DCHECK(bookmark_model); + if (!base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs)) { + return {}; + } + // Build a temporary lookup table for remote GUIDs. std::unordered_map<std::string, const RemoteTreeNode*> guid_to_remote_node_map; @@ -398,14 +388,9 @@ if (node->is_folder() != remote_entity.is_folder || (node->is_url() && - node->url() != remote_entity.specifics.bookmark().url()) || - !base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs)) { + node->url() != remote_entity.specifics.bookmark().url())) { // If local node and its remote node match are conflicting in node type or - // URL, replace local GUID with a random GUID. The logic is applied - // unconditionally if kMergeBookmarksUsingGUIDs is disabled, since no - // GUID-based matches take place and GUIDs need to be reassigned to avoid - // collisions (they will be reassigned once again if there is a semantic - // match). + // URL, replace local GUID with a random GUID. // TODO(crbug.com/978430): Local GUIDs should also be reassigned if they // match a remote originator_client_item_id. ReplaceBookmarkNodeGUID(node, base::GenerateGUID(), bookmark_model); @@ -608,12 +593,10 @@ const bookmarks::BookmarkNode* node = parent->children()[index].get(); DCHECK(!FindMatchingRemoteNodeByGUID(node)); DCHECK(base::IsValidGUID(node->guid())); - - // The node's GUID cannot run into collisions because - // FindGuidMatchesOrReassignLocal() takes care of reassigning local GUIDs if - // they won't actually be merged with the remote bookmark with the same GUID - // (e.g. incompatible types). - const std::string sync_id = node->guid(); + const std::string sync_id = + base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs) + ? node->guid() + : base::GenerateGUID(); const int64_t server_version = syncer::kUncommittedVersion; const base::Time creation_time = base::Time::Now(); const std::string& suffix = syncer::GenerateSyncableBookmarkHash(
diff --git a/components/sync_bookmarks/bookmark_model_merger.h b/components/sync_bookmarks/bookmark_model_merger.h index bf0783ec..9758ee9 100644 --- a/components/sync_bookmarks/bookmark_model_merger.h +++ b/components/sync_bookmarks/bookmark_model_merger.h
@@ -54,9 +54,7 @@ class RemoteTreeNode final { private: using UpdatesPerParentId = - std::unordered_map<base::StringPiece, - syncer::UpdateResponseDataList, - base::StringPieceHash>; + std::unordered_map<std::string, syncer::UpdateResponseDataList>; public: // Constructs a tree given |update| as root and recursively all descendants @@ -65,9 +63,8 @@ // |*updates_per_parent_id| must represent valid updates. Updates // corresponding from descendant nodes are moved away from // |*updates_per_parent_id|. - static RemoteTreeNode BuildTree( - std::unique_ptr<syncer::UpdateResponseData> update, - UpdatesPerParentId* updates_per_parent_id); + static RemoteTreeNode BuildTree(syncer::UpdateResponseData update, + UpdatesPerParentId* updates_per_parent_id); ~RemoteTreeNode(); @@ -75,8 +72,8 @@ RemoteTreeNode(RemoteTreeNode&&); RemoteTreeNode& operator=(RemoteTreeNode&&); - const syncer::EntityData& entity() const { return *update_->entity; } - int64_t response_version() const { return update_->response_version; } + const syncer::EntityData& entity() const { return update_.entity; } + int64_t response_version() const { return update_.response_version; } // Direct children nodes, sorted by ascending unique position. These are // guaranteed to be valid updates (e.g. IsValidBookmarkSpecifics()). @@ -94,7 +91,7 @@ RemoteTreeNode(); - std::unique_ptr<syncer::UpdateResponseData> update_; + syncer::UpdateResponseData update_; std::vector<RemoteTreeNode> children_; };
diff --git a/components/sync_bookmarks/bookmark_model_merger_unittest.cc b/components/sync_bookmarks/bookmark_model_merger_unittest.cc index cba854b..2edf63b 100644 --- a/components/sync_bookmarks/bookmark_model_merger_unittest.cc +++ b/components/sync_bookmarks/bookmark_model_merger_unittest.cc
@@ -50,7 +50,7 @@ return arg[0].get() == expected_raw_ptr0 && arg[1].get() == expected_raw_ptr1; } -std::unique_ptr<syncer::UpdateResponseData> CreateUpdateResponseData( +syncer::UpdateResponseData CreateUpdateResponseData( const std::string& server_id, const std::string& parent_id, const std::string& title, @@ -63,39 +63,39 @@ if (!guid) guid = base::GenerateGUID(); - auto data = std::make_unique<syncer::EntityData>(); - data->id = server_id; - data->originator_client_item_id = *guid; - data->parent_id = parent_id; - data->unique_position = unique_position.ToProto(); + syncer::EntityData data; + data.id = server_id; + data.originator_client_item_id = *guid; + data.parent_id = parent_id; + data.unique_position = unique_position.ToProto(); sync_pb::BookmarkSpecifics* bookmark_specifics = - data->specifics.mutable_bookmark(); + data.specifics.mutable_bookmark(); bookmark_specifics->set_guid(*guid); bookmark_specifics->set_title(title); bookmark_specifics->set_url(url); bookmark_specifics->set_icon_url(icon_url); bookmark_specifics->set_favicon(icon_data); - data->is_folder = is_folder; - auto response_data = std::make_unique<syncer::UpdateResponseData>(); - response_data->entity = std::move(data); + data.is_folder = is_folder; + syncer::UpdateResponseData response_data; + response_data.entity = std::move(data); // Similar to what's done in the loopback_server. - response_data->response_version = 0; + response_data.response_version = 0; return response_data; } -std::unique_ptr<syncer::UpdateResponseData> CreateBookmarkBarNodeUpdateData() { - auto data = std::make_unique<syncer::EntityData>(); - data->id = kBookmarkBarId; - data->server_defined_unique_tag = kBookmarkBarTag; +syncer::UpdateResponseData CreateBookmarkBarNodeUpdateData() { + syncer::EntityData data; + data.id = kBookmarkBarId; + data.server_defined_unique_tag = kBookmarkBarTag; - data->specifics.mutable_bookmark(); + data.specifics.mutable_bookmark(); - auto response_data = std::make_unique<syncer::UpdateResponseData>(); - response_data->entity = std::move(data); + syncer::UpdateResponseData response_data; + response_data.entity = std::move(data); // Similar to what's done in the loopback_server. - response_data->response_version = 0; + response_data.response_version = 0; return response_data; } @@ -1309,7 +1309,7 @@ // |originator_client_item_id| cannot itself be duplicated because // ModelTypeWorker guarantees otherwise. - updates.back()->entity->originator_client_item_id = base::GenerateGUID(); + updates.back().entity.originator_client_item_id = base::GenerateGUID(); std::unique_ptr<SyncedBookmarkTracker> tracker = Merge(std::move(updates), bookmark_model.get()); @@ -1380,7 +1380,7 @@ // |originator_client_item_id| cannot itself be duplicated because // ModelTypeWorker guarantees otherwise. - updates.back()->entity->originator_client_item_id = base::GenerateGUID(); + updates.back().entity.originator_client_item_id = base::GenerateGUID(); std::unique_ptr<SyncedBookmarkTracker> tracker = Merge(std::move(updates), bookmark_model.get());
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl.cc b/components/sync_bookmarks/bookmark_model_observer_impl.cc index aa6e3a4..f063fb1 100644 --- a/components/sync_bookmarks/bookmark_model_observer_impl.cc +++ b/components/sync_bookmarks/bookmark_model_observer_impl.cc
@@ -96,10 +96,10 @@ // Assign a temp server id for the entity. Will be overriden by the actual // server id upon receiving commit response. DCHECK(base::IsValidGUID(node->guid())); - - // Local bookmark creations should have used a random GUID so it's safe to - // use it as originator client item ID, without the risk for collision. - const std::string sync_id = node->guid(); + const std::string sync_id = + base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs) + ? node->guid() + : base::GenerateGUID(); const int64_t server_version = syncer::kUncommittedVersion; const base::Time creation_time = base::Time::Now(); const sync_pb::UniquePosition unique_position =
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc b/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc index 4184ac9..a186cb00 100644 --- a/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc +++ b/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc
@@ -134,8 +134,10 @@ bookmark_tracker()->GetEntitiesWithLocalChanges(kMaxEntries); ASSERT_THAT(local_changes.size(), 1U); EXPECT_THAT(local_changes[0]->bookmark_node(), Eq(bookmark_node)); - EXPECT_THAT(local_changes[0]->metadata()->server_id(), - Eq(bookmark_node->guid())); + if (base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs)) { + EXPECT_THAT(local_changes[0]->metadata()->server_id(), + Eq(bookmark_node->guid())); + } } TEST_F(BookmarkModelObserverImplTest,
diff --git a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc index 90940c5..e8aebfc7 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
@@ -50,34 +50,34 @@ std::string server_tag; }; -std::unique_ptr<syncer::UpdateResponseData> CreateUpdateResponseData( +syncer::UpdateResponseData CreateUpdateResponseData( const BookmarkInfo& bookmark_info, const syncer::UniquePosition& unique_position, int response_version, const std::string& guid) { - auto data = std::make_unique<syncer::EntityData>(); - data->id = bookmark_info.server_id; - data->parent_id = bookmark_info.parent_id; - data->server_defined_unique_tag = bookmark_info.server_tag; - data->unique_position = unique_position.ToProto(); + syncer::EntityData data; + data.id = bookmark_info.server_id; + data.parent_id = bookmark_info.parent_id; + data.server_defined_unique_tag = bookmark_info.server_tag; + data.unique_position = unique_position.ToProto(); sync_pb::BookmarkSpecifics* bookmark_specifics = - data->specifics.mutable_bookmark(); + data.specifics.mutable_bookmark(); bookmark_specifics->set_guid(guid); bookmark_specifics->set_title(bookmark_info.title); if (bookmark_info.url.empty()) { - data->is_folder = true; + data.is_folder = true; } else { bookmark_specifics->set_url(bookmark_info.url); } - auto response_data = std::make_unique<syncer::UpdateResponseData>(); - response_data->entity = std::move(data); - response_data->response_version = response_version; + syncer::UpdateResponseData response_data; + response_data.entity = std::move(data); + response_data.response_version = response_version; return response_data; } -std::unique_ptr<syncer::UpdateResponseData> CreateUpdateResponseData( +syncer::UpdateResponseData CreateUpdateResponseData( const BookmarkInfo& bookmark_info, const syncer::UniquePosition& unique_position, int response_version) { @@ -305,7 +305,7 @@ CreateUpdateResponseData({kNodeId, kTitle, kUrl, kBookmarkBarId, /*server_tag=*/std::string()}, kRandomPosition, /*response_version=*/1)); - updates[0]->response_version++; + updates[0].response_version++; EXPECT_CALL(*schedule_save_closure(), Run()); processor()->OnUpdateReceived(CreateDummyModelTypeState(), @@ -499,14 +499,13 @@ // Push an update that is encrypted with the new encryption key. const std::string kNodeId = "node_id"; - std::unique_ptr<syncer::UpdateResponseData> response_data = - CreateUpdateResponseData( - {kNodeId, "title", "http://www.url.com", /*parent_id=*/kBookmarkBarId, - /*server_tag=*/std::string()}, - syncer::UniquePosition::InitialPosition( - syncer::UniquePosition::RandomSuffix()), - /*response_version=*/0); - response_data->encryption_key_name = kEncryptionKeyName; + syncer::UpdateResponseData response_data = CreateUpdateResponseData( + {kNodeId, "title", "http://www.url.com", /*parent_id=*/kBookmarkBarId, + /*server_tag=*/std::string()}, + syncer::UniquePosition::InitialPosition( + syncer::UniquePosition::RandomSuffix()), + /*response_version=*/0); + response_data.encryption_key_name = kEncryptionKeyName; syncer::UpdateResponseDataList updates; updates.push_back(std::move(response_data));
diff --git a/components/sync_bookmarks/bookmark_remote_updates_handler.cc b/components/sync_bookmarks/bookmark_remote_updates_handler.cc index c3127571..55fb8b6 100644 --- a/components/sync_bookmarks/bookmark_remote_updates_handler.cc +++ b/components/sync_bookmarks/bookmark_remote_updates_handler.cc
@@ -108,7 +108,7 @@ bookmarks::BookmarkModel* model, SyncedBookmarkTracker* tracker, favicon::FaviconService* favicon_service) { - const syncer::EntityData& update_entity = *update.entity; + const syncer::EntityData& update_entity = update.entity; DCHECK(!update_entity.is_deleted()); DCHECK(tracked_entity); DCHECK(new_parent_tracked_entity); @@ -184,7 +184,7 @@ std::unordered_set<std::string> entities_with_up_to_date_encryption; for (const syncer::UpdateResponseData* update : ReorderUpdates(&updates)) { - const syncer::EntityData& update_entity = *update->entity; + const syncer::EntityData& update_entity = update->entity; // Only non deletions and non premanent node should have valid specifics and // unique positions. if (!update_entity.is_deleted() && @@ -368,9 +368,8 @@ parent_to_children; // Add only non-deletions to |id_to_updates|. - for (const std::unique_ptr<syncer::UpdateResponseData>& update : *updates) { - DCHECK(update); - const syncer::EntityData& update_entity = *update->entity; + for (const syncer::UpdateResponseData& update : *updates) { + const syncer::EntityData& update_entity = update.entity; // Ignore updates to root nodes. if (update_entity.parent_id == "0") { continue; @@ -378,13 +377,13 @@ if (update_entity.is_deleted()) { continue; } - id_to_updates[update_entity.id] = update.get(); + id_to_updates[update_entity.id] = &update; } // Iterate over |id_to_updates| and construct |roots| and // |parent_to_children|. for (const std::pair<base::StringPiece, const syncer::UpdateResponseData*>& pair : id_to_updates) { - const syncer::EntityData& update_entity = *pair.second->entity; + const syncer::EntityData& update_entity = pair.second->entity; parent_to_children[update_entity.parent_id].push_back(update_entity.id); // If this entity's parent has no pending update, add it to |roots|. if (id_to_updates.count(update_entity.parent_id) == 0) { @@ -401,16 +400,15 @@ int root_node_updates_count = 0; // Add deletions. - for (const std::unique_ptr<syncer::UpdateResponseData>& update : *updates) { - DCHECK(update); - const syncer::EntityData& update_entity = *update->entity; + for (const syncer::UpdateResponseData& update : *updates) { + const syncer::EntityData& update_entity = update.entity; // Ignore updates to root nodes. if (update_entity.parent_id == "0") { root_node_updates_count++; continue; } if (update_entity.is_deleted()) { - ordered_updates.push_back(update.get()); + ordered_updates.push_back(&update); } } // All non root updates should have been included in |ordered_updates|. @@ -420,7 +418,7 @@ bool BookmarkRemoteUpdatesHandler::ProcessCreate( const syncer::UpdateResponseData& update) { - const syncer::EntityData& update_entity = *update.entity; + const syncer::EntityData& update_entity = update.entity; DCHECK(!update_entity.is_deleted()); if (!update_entity.server_defined_unique_tag.empty()) { DLOG(ERROR) @@ -437,7 +435,11 @@ // not populate GUID field and if the originator_client_item_id is not of // valid GUID format to replace it, the field is left blank. if (!base::IsValidGUID(update_entity.specifics.bookmark().guid())) { - update.entity->specifics.mutable_bookmark()->set_guid(base::GenerateGUID()); + // TODO(crbug.com/978430): Seems that's not the correct place for making any + // changes to |update|, need a proper place for generating GUID. + const_cast<syncer::UpdateResponseData&>(update) + .entity.specifics.mutable_bookmark() + ->set_guid(base::GenerateGUID()); } const bookmarks::BookmarkNode* parent_node = GetParentNode(update_entity); @@ -473,7 +475,7 @@ void BookmarkRemoteUpdatesHandler::ProcessUpdate( const syncer::UpdateResponseData& update, const SyncedBookmarkTracker::Entity* tracked_entity) { - const syncer::EntityData& update_entity = *update.entity; + const syncer::EntityData& update_entity = update.entity; // Can only update existing nodes. DCHECK(tracked_entity); DCHECK_EQ(tracked_entity, @@ -552,7 +554,7 @@ void BookmarkRemoteUpdatesHandler::ProcessConflict( const syncer::UpdateResponseData& update, const SyncedBookmarkTracker::Entity* tracked_entity) { - const syncer::EntityData& update_entity = *update.entity; + const syncer::EntityData& update_entity = update.entity; // TODO(crbug.com/516866): Handle the case of conflict as a result of // re-encryption request.
diff --git a/components/sync_bookmarks/bookmark_remote_updates_handler_unittest.cc b/components/sync_bookmarks/bookmark_remote_updates_handler_unittest.cc index 32d29a8c..1510aab 100644 --- a/components/sync_bookmarks/bookmark_remote_updates_handler_unittest.cc +++ b/components/sync_bookmarks/bookmark_remote_updates_handler_unittest.cc
@@ -47,7 +47,7 @@ const char kOtherBookmarksId[] = "other_bookmarks_id"; const char kOtherBookmarksTag[] = "other_bookmarks"; -std::unique_ptr<syncer::UpdateResponseData> CreateUpdateResponseData( +syncer::UpdateResponseData CreateUpdateResponseData( const std::string& server_id, const std::string& parent_id, const std::string& guid, @@ -55,28 +55,28 @@ bool is_deletion, int version, const syncer::UniquePosition& unique_position) { - auto data = std::make_unique<syncer::EntityData>(); - data->id = server_id; - data->parent_id = parent_id; - data->unique_position = unique_position.ToProto(); + syncer::EntityData data; + data.id = server_id; + data.parent_id = parent_id; + data.unique_position = unique_position.ToProto(); // EntityData would be considered a deletion if its specifics hasn't been set. if (!is_deletion) { sync_pb::BookmarkSpecifics* bookmark_specifics = - data->specifics.mutable_bookmark(); + data.specifics.mutable_bookmark(); bookmark_specifics->set_guid(guid); bookmark_specifics->set_title(title); } - data->is_folder = true; - auto response_data = std::make_unique<syncer::UpdateResponseData>(); - response_data->entity = std::move(data); - response_data->response_version = version; + data.is_folder = true; + syncer::UpdateResponseData response_data; + response_data.entity = std::move(data); + response_data.response_version = version; return response_data; } // Overload that assigns a random GUID. Should only be used when GUID is not // relevant. -std::unique_ptr<syncer::UpdateResponseData> CreateUpdateResponseData( +syncer::UpdateResponseData CreateUpdateResponseData( const std::string& server_id, const std::string& parent_id, const std::string& title, @@ -89,7 +89,7 @@ // Overload that assign a random position. Should only be used when position // is not relevant. -std::unique_ptr<syncer::UpdateResponseData> CreateUpdateResponseData( +syncer::UpdateResponseData CreateUpdateResponseData( const std::string& server_id, const std::string& parent_id, bool is_deletion, @@ -100,36 +100,36 @@ syncer::UniquePosition::RandomSuffix())); } -std::unique_ptr<syncer::UpdateResponseData> CreateBookmarkRootUpdateData() { - auto data = std::make_unique<syncer::EntityData>(); - data->id = syncer::ModelTypeToRootTag(syncer::BOOKMARKS); - data->parent_id = kRootParentId; - data->server_defined_unique_tag = +syncer::UpdateResponseData CreateBookmarkRootUpdateData() { + syncer::EntityData data; + data.id = syncer::ModelTypeToRootTag(syncer::BOOKMARKS); + data.parent_id = kRootParentId; + data.server_defined_unique_tag = syncer::ModelTypeToRootTag(syncer::BOOKMARKS); - data->specifics.mutable_bookmark(); + data.specifics.mutable_bookmark(); - auto response_data = std::make_unique<syncer::UpdateResponseData>(); - response_data->entity = std::move(data); + syncer::UpdateResponseData response_data; + response_data.entity = std::move(data); // Similar to what's done in the loopback_server. - response_data->response_version = 0; + response_data.response_version = 0; return response_data; } -std::unique_ptr<syncer::UpdateResponseData> CreatePermanentFolderUpdateData( +syncer::UpdateResponseData CreatePermanentFolderUpdateData( const std::string& id, const std::string& tag) { - auto data = std::make_unique<syncer::EntityData>(); - data->id = id; - data->parent_id = "root_id"; - data->server_defined_unique_tag = tag; + syncer::EntityData data; + data.id = id; + data.parent_id = "root_id"; + data.server_defined_unique_tag = tag; - data->specifics.mutable_bookmark(); + data.specifics.mutable_bookmark(); - auto response_data = std::make_unique<syncer::UpdateResponseData>(); - response_data->entity = std::move(data); + syncer::UpdateResponseData response_data; + response_data.entity = std::move(data); // Similar to what's done in the loopback_server. - response_data->response_version = 0; + response_data.response_version = 0; return response_data; } @@ -246,12 +246,12 @@ // This is test is over verifying since the order requirements are // within subtrees only. (e.g it doesn't matter whether node1 comes before or // after node4). However, it's implemented this way for simplicity. - EXPECT_THAT(ordered_updates[0]->entity->id, Eq(ids[4])); - EXPECT_THAT(ordered_updates[1]->entity->id, Eq(ids[5])); - EXPECT_THAT(ordered_updates[2]->entity->id, Eq(ids[0])); - EXPECT_THAT(ordered_updates[3]->entity->id, Eq(ids[1])); - EXPECT_THAT(ordered_updates[4]->entity->id, Eq(ids[2])); - EXPECT_THAT(ordered_updates[5]->entity->id, Eq(ids[6])); + EXPECT_THAT(ordered_updates[0]->entity.id, Eq(ids[4])); + EXPECT_THAT(ordered_updates[1]->entity.id, Eq(ids[5])); + EXPECT_THAT(ordered_updates[2]->entity.id, Eq(ids[0])); + EXPECT_THAT(ordered_updates[3]->entity.id, Eq(ids[1])); + EXPECT_THAT(ordered_updates[4]->entity.id, Eq(ids[2])); + EXPECT_THAT(ordered_updates[5]->entity.id, Eq(ids[6])); } TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, @@ -720,25 +720,25 @@ const GURL kIconUrl("http://www.icon-url.com"); syncer::UpdateResponseDataList updates; - auto data = std::make_unique<syncer::EntityData>(); - data->id = "server_id"; - data->parent_id = kBookmarkBarId; - data->unique_position = syncer::UniquePosition::InitialPosition( - syncer::UniquePosition::RandomSuffix()) - .ToProto(); + syncer::EntityData data; + data.id = "server_id"; + data.parent_id = kBookmarkBarId; + data.unique_position = syncer::UniquePosition::InitialPosition( + syncer::UniquePosition::RandomSuffix()) + .ToProto(); sync_pb::BookmarkSpecifics* bookmark_specifics = - data->specifics.mutable_bookmark(); + data.specifics.mutable_bookmark(); bookmark_specifics->set_guid(base::GenerateGUID()); // Use the server id as the title for simplicity. bookmark_specifics->set_title(kTitle); bookmark_specifics->set_url(kUrl.spec()); bookmark_specifics->set_icon_url(kIconUrl.spec()); bookmark_specifics->set_favicon("PNG"); - data->is_folder = false; - auto response_data = std::make_unique<syncer::UpdateResponseData>(); - response_data->entity = std::move(data); + data.is_folder = false; + syncer::UpdateResponseData response_data; + response_data.entity = std::move(data); // Similar to what's done in the loopback_server. - response_data->response_version = 0; + response_data.response_version = 0; updates.push_back(std::move(response_data)); @@ -759,23 +759,23 @@ const GURL kUrl("http://www.url.com"); syncer::UpdateResponseDataList updates; - auto data = std::make_unique<syncer::EntityData>(); - data->id = "server_id"; - data->parent_id = kBookmarkBarId; - data->unique_position = syncer::UniquePosition::InitialPosition( - syncer::UniquePosition::RandomSuffix()) - .ToProto(); + syncer::EntityData data; + data.id = "server_id"; + data.parent_id = kBookmarkBarId; + data.unique_position = syncer::UniquePosition::InitialPosition( + syncer::UniquePosition::RandomSuffix()) + .ToProto(); sync_pb::BookmarkSpecifics* bookmark_specifics = - data->specifics.mutable_bookmark(); + data.specifics.mutable_bookmark(); bookmark_specifics->set_guid(base::GenerateGUID()); // Use the server id as the title for simplicity. bookmark_specifics->set_title(kTitle); bookmark_specifics->set_url(kUrl.spec()); - data->is_folder = false; - auto response_data = std::make_unique<syncer::UpdateResponseData>(); - response_data->entity = std::move(data); + data.is_folder = false; + syncer::UpdateResponseData response_data; + response_data.entity = std::move(data); // Similar to what's done in the loopback_server. - response_data->response_version = 0; + response_data.response_version = 0; updates.push_back(std::move(response_data)); @@ -833,21 +833,21 @@ // Now receive an update with the actual server id. syncer::UpdateResponseDataList updates; - auto data = std::make_unique<syncer::EntityData>(); - data->id = kSyncId; - data->originator_cache_guid = kCacheGuid; - data->originator_client_item_id = kOriginatorClientItemId; + syncer::EntityData data; + data.id = kSyncId; + data.originator_cache_guid = kCacheGuid; + data.originator_client_item_id = kOriginatorClientItemId; // Set the other required fields. - data->unique_position = syncer::UniquePosition::InitialPosition( - syncer::UniquePosition::RandomSuffix()) - .ToProto(); - data->specifics = specifics; - data->is_folder = true; + data.unique_position = syncer::UniquePosition::InitialPosition( + syncer::UniquePosition::RandomSuffix()) + .ToProto(); + data.specifics = specifics; + data.is_folder = true; - auto response_data = std::make_unique<syncer::UpdateResponseData>(); - response_data->entity = std::move(data); + syncer::UpdateResponseData response_data; + response_data.entity = std::move(data); // Similar to what's done in the loopback_server. - response_data->response_version = 0; + response_data.response_version = 0; updates.push_back(std::move(response_data)); testing::NiceMock<favicon::MockFaviconService> favicon_service; @@ -880,11 +880,11 @@ const std::string kId0 = "id0"; syncer::UpdateResponseDataList updates; - std::unique_ptr<syncer::UpdateResponseData> response_data = + syncer::UpdateResponseData response_data = CreateUpdateResponseData(/*server_id=*/kId0, /*parent_id=*/kBookmarkBarId, /*is_deletion=*/false); - response_data->encryption_key_name = "out_of_date_encryption_key_name"; + response_data.encryption_key_name = "out_of_date_encryption_key_name"; updates.push_back(std::move(response_data)); BookmarkRemoteUpdatesHandler updates_handler(bookmark_model.get(), @@ -933,11 +933,11 @@ const std::string kId = "id"; const std::string kTitle = "title"; syncer::UpdateResponseDataList updates; - std::unique_ptr<syncer::UpdateResponseData> response_data = + syncer::UpdateResponseData response_data = CreateUpdateResponseData(/*server_id=*/kId, /*parent_id=*/kBookmarkBarId, /*is_deletion=*/false); - response_data->encryption_key_name = "encryption_key_name"; + response_data.encryption_key_name = "encryption_key_name"; updates.push_back(std::move(response_data)); BookmarkRemoteUpdatesHandler updates_handler(bookmark_model.get(), @@ -961,14 +961,14 @@ // Push a remote deletion for the same entity with an out of date encryption // key name. updates.clear(); - std::unique_ptr<syncer::UpdateResponseData> response_data2 = + syncer::UpdateResponseData response_data2 = CreateUpdateResponseData(/*server_id=*/kId, /*parent_id=*/kBookmarkBarId, /*is_deletion=*/true); - response_data2->encryption_key_name = "out_of_date_encryption_key_name"; + response_data2.encryption_key_name = "out_of_date_encryption_key_name"; // Increment the server version to make sure the update isn't discarded as // reflection. - response_data2->response_version++; + response_data2.response_version++; updates.push_back(std::move(response_data2)); base::HistogramTester histogram_tester; @@ -996,14 +996,14 @@ EXPECT_THAT(tracker()->GetEntityForSyncId(kId0)->IsUnsynced(), Eq(false)); // Push another update to for the same entity. - std::unique_ptr<syncer::UpdateResponseData> response_data = + syncer::UpdateResponseData response_data = CreateUpdateResponseData(/*server_id=*/kId0, /*parent_id=*/kBookmarkBarId, /*is_deletion=*/false); // Increment the server version to make sure the update isn't discarded as // reflection. - response_data->response_version++; + response_data.response_version++; syncer::UpdateResponseDataList new_updates; new_updates.push_back(std::move(response_data)); updates_handler()->Process(new_updates,
diff --git a/components/sync_device_info/device_info_sync_bridge_unittest.cc b/components/sync_device_info/device_info_sync_bridge_unittest.cc index f967316..28c55766 100644 --- a/components/sync_device_info/device_info_sync_bridge_unittest.cc +++ b/components/sync_device_info/device_info_sync_bridge_unittest.cc
@@ -253,10 +253,9 @@ } // Creates an EntityData around a copy of the given specifics. -std::unique_ptr<EntityData> SpecificsToEntity( - const DeviceInfoSpecifics& specifics) { - auto data = std::make_unique<EntityData>(); - *data->specifics.mutable_device_info() = specifics; +EntityData SpecificsToEntity(const DeviceInfoSpecifics& specifics) { + EntityData data; + *data.specifics.mutable_device_info() = specifics; return data; }
diff --git a/components/sync_sessions/session_sync_bridge_unittest.cc b/components/sync_sessions/session_sync_bridge_unittest.cc index fa5198e..aa6305b0 100644 --- a/components/sync_sessions/session_sync_bridge_unittest.cc +++ b/components/sync_sessions/session_sync_bridge_unittest.cc
@@ -78,22 +78,21 @@ result_listener); } -std::unique_ptr<syncer::EntityData> SpecificsToEntity( - const sync_pb::SessionSpecifics& specifics, - base::Time mtime = base::Time::Now()) { - auto data = std::make_unique<syncer::EntityData>(); - data->client_tag_hash = syncer::ClientTagHash::FromUnhashed( +syncer::EntityData SpecificsToEntity(const sync_pb::SessionSpecifics& specifics, + base::Time mtime = base::Time::Now()) { + syncer::EntityData data; + data.client_tag_hash = syncer::ClientTagHash::FromUnhashed( syncer::SESSIONS, SessionStore::GetClientTag(specifics)); - *data->specifics.mutable_session() = specifics; - data->modification_time = mtime; + *data.specifics.mutable_session() = specifics; + data.modification_time = mtime; return data; } -std::unique_ptr<syncer::UpdateResponseData> SpecificsToUpdateResponse( +syncer::UpdateResponseData SpecificsToUpdateResponse( const sync_pb::SessionSpecifics& specifics, base::Time mtime = base::Time::Now()) { - auto data = std::make_unique<syncer::UpdateResponseData>(); - data->entity = SpecificsToEntity(specifics, mtime); + syncer::UpdateResponseData data; + data.entity = SpecificsToEntity(specifics, mtime); return data; } @@ -106,16 +105,15 @@ return storage_key_to_data; } -std::unique_ptr<syncer::UpdateResponseData> CreateTombstone( - const std::string& client_tag) { - auto tombstone = std::make_unique<syncer::EntityData>(); +syncer::UpdateResponseData CreateTombstone(const std::string& client_tag) { + syncer::EntityData tombstone; - tombstone->client_tag_hash = + tombstone.client_tag_hash = syncer::ClientTagHash::FromUnhashed(syncer::SESSIONS, client_tag); - auto data = std::make_unique<syncer::UpdateResponseData>(); - data->entity = std::move(tombstone); - data->response_version = 2; + syncer::UpdateResponseData data; + data.entity = std::move(tombstone); + data.response_version = 2; return data; }
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 0b91939b..c4bc9e5d 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -1671,6 +1671,8 @@ "service_worker/service_worker_new_script_loader.h", "service_worker/service_worker_object_host.cc", "service_worker/service_worker_object_host.h", + "service_worker/service_worker_offline_capability_checker.cc", + "service_worker/service_worker_offline_capability_checker.h", "service_worker/service_worker_ping_controller.cc", "service_worker/service_worker_ping_controller.h", "service_worker/service_worker_process_manager.cc",
diff --git a/content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.cc b/content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.cc index 0af085f..c425175b 100644 --- a/content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.cc +++ b/content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.cc
@@ -17,6 +17,7 @@ #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/storage_partition.h" #include "content/public/common/socket_permission_request.h" @@ -134,11 +135,12 @@ return PP_ERROR_NOACCESS; } - RenderProcessHost* render_process_host = - RenderProcessHost::FromID(render_process_id_); - if (!render_process_host) + RenderFrameHost* render_frame_host = + RenderFrameHost::FromID(render_process_id_, render_frame_id_); + if (!render_frame_host) return PP_ERROR_FAILED; - auto* storage_partition = render_process_host->GetStoragePartition(); + auto* storage_partition = + render_frame_host->GetProcess()->GetStoragePartition(); // Grab a reference to this class to ensure that it's fully alive if a // connection error occurs (i.e. ref count is higher than 0 and there's no @@ -150,10 +152,9 @@ network::mojom::ResolveHostParameters::New(); PrepareRequestInfo(hint, parameters.get()); - // TODO(mmenke): Pass in correct NetworkIsolationKey. storage_partition->GetNetworkContext()->ResolveHost( net::HostPortPair(host_port.host, host_port.port), - net::NetworkIsolationKey::Todo(), std::move(parameters), + render_frame_host->GetNetworkIsolationKey(), std::move(parameters), receiver_.BindNewPipeAndPassRemote()); receiver_.set_disconnect_handler( base::BindOnce(&PepperHostResolverMessageFilter::OnComplete,
diff --git a/content/browser/scheduler/responsiveness/jank_monitor.cc b/content/browser/scheduler/responsiveness/jank_monitor.cc index 8e69441a..46a470a 100644 --- a/content/browser/scheduler/responsiveness/jank_monitor.cc +++ b/content/browser/scheduler/responsiveness/jank_monitor.cc
@@ -290,14 +290,14 @@ base::AutoLock lock(lock_); if (LIKELY(task_execution_metadata_.empty() || - (now - task_execution_metadata_.front().execution_start_time) < + (now - task_execution_metadata_.back().execution_start_time) < jank_threshold)) { // Most tasks are unlikely to be janky. return base::nullopt; } // Mark that the target thread is janky and notify the monitor thread. - return task_execution_metadata_.front().identifier; + return task_execution_metadata_.back().identifier; } void JankMonitor::ThreadExecutionState::WillRunTaskOrEvent(
diff --git a/content/browser/scheduler/responsiveness/jank_monitor_unittest.cc b/content/browser/scheduler/responsiveness/jank_monitor_unittest.cc index 4f393b0..5511f0b 100644 --- a/content/browser/scheduler/responsiveness/jank_monitor_unittest.cc +++ b/content/browser/scheduler/responsiveness/jank_monitor_unittest.cc
@@ -224,6 +224,78 @@ VALIDATE_TEST_OBSERVER_CALLS(); } +// Test that the jank monitor shouldn't report a jank if a nested runloop is +// responsive. +TEST_F(JankMonitorTest, ReentrantResponsive) { + auto enclosing_task = [&]() { + // Run 5 responsive tasks in the inner runloop. + for (int i = 0; i < 5; i++) { + auto nested_responsive_task = [&]() { + task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(999)); + + // The callback shouldn't be called. |expected_jank_started_| and + // |expected_jank_stopped_| should be 0. + VALIDATE_TEST_OBSERVER_CALLS(); + }; + base::PostTask(FROM_HERE, {content::BrowserThread::UI}, + base::BindLambdaForTesting(nested_responsive_task)); + // Spin a nested run loop to run |nested_responsive_task|. + base::RunLoop(base::RunLoop::Type::kNestableTasksAllowed).RunUntilIdle(); + } + }; + + base::PostTask(FROM_HERE, {content::BrowserThread::UI}, + base::BindLambdaForTesting(enclosing_task)); + task_environment_.RunUntilIdle(); + // |expected_jank_started_| and |expected_jank_stopped_| should be 0 even if + // the enclosing task runs much longer than the jank threshold. + VALIDATE_TEST_OBSERVER_CALLS(); +} + +// Test that the jank monitor reports only the janky task running in the nested +// runloop. The enclosing task shouldn't be reported even if its total duration +// is longer than the jank threshold. +TEST_F(JankMonitorTest, JankNestedRunLoop) { + auto enclosing_task = [&]() { + // Run 1 responsive tasks in the inner runloop. + auto nested_responsive_task = [&]() { + task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(999)); + + // The callback shouldn't be called. |expected_jank_started_| should be 0. + VALIDATE_TEST_OBSERVER_CALLS(); + }; + base::PostTask(FROM_HERE, {content::BrowserThread::UI}, + base::BindLambdaForTesting(nested_responsive_task)); + // Spin a nested run loop to run |nested_responsive_task|. + base::RunLoop(base::RunLoop::Type::kNestableTasksAllowed).RunUntilIdle(); + + // Then run 1 responsive tasks in the inner runloop. + auto nested_janky_task = [&]() { + task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1500)); + + // We should detect one jank. + expected_jank_started_++; + // The callback shouldn't be called. |expected_jank_started_| should be 0. + VALIDATE_TEST_OBSERVER_CALLS(); + }; + base::PostTask(FROM_HERE, {content::BrowserThread::UI}, + base::BindLambdaForTesting(nested_janky_task)); + // Spin a nested run loop to run |nested_responsive_task|. + base::RunLoop(base::RunLoop::Type::kNestableTasksAllowed).RunUntilIdle(); + + task_environment_.RunUntilIdle(); + expected_jank_stopped_++; + // The callback shouldn't be called. |expected_jank_started_| should be 1. + VALIDATE_TEST_OBSERVER_CALLS(); + }; + + base::PostTask(FROM_HERE, {content::BrowserThread::UI}, + base::BindLambdaForTesting(enclosing_task)); + task_environment_.RunUntilIdle(); + // |expected_jank_started_| and |expected_jank_stopped_| should still be 1. + VALIDATE_TEST_OBSERVER_CALLS(); +} + // Test monitor with overlapping janks on both threads. Only the jank started // first should be reported. TEST_F(JankMonitorTest, JankUIAndIOThread) {
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc index c3f15d8..c185867 100644 --- a/content/browser/service_worker/service_worker_context_core.cc +++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -28,6 +28,7 @@ #include "content/browser/service_worker/service_worker_context_wrapper.h" #include "content/browser/service_worker/service_worker_info.h" #include "content/browser/service_worker/service_worker_job_coordinator.h" +#include "content/browser/service_worker/service_worker_offline_capability_checker.h" #include "content/browser/service_worker/service_worker_process_manager.h" #include "content/browser/service_worker/service_worker_register_job.h" #include "content/browser/service_worker/service_worker_registration.h" @@ -730,6 +731,23 @@ AsWeakPtr(), std::move(callback))); } +void ServiceWorkerContextCore::CheckOfflineCapability( + const GURL& url, + ServiceWorkerContext::CheckOfflineCapabilityCallback callback) { + auto checker = std::make_unique<ServiceWorkerOfflineCapabilityChecker>(url); + ServiceWorkerOfflineCapabilityChecker* checker_rawptr = checker.get(); + checker_rawptr->Start( + storage(), + // Bind unique_ptr to the |callback| so that + // ServiceWorkerOfflineCapabilityChecker outlives |callback| and is surely + // freed when |callback| is called. + base::BindOnce( + [](std::unique_ptr<ServiceWorkerOfflineCapabilityChecker> checker, + ServiceWorkerContext::CheckOfflineCapabilityCallback callback, + OfflineCapability result) { std::move(callback).Run(result); }, + std::move(checker), std::move(callback))); +} + void ServiceWorkerContextCore::UpdateVersionFailureCount( int64_t version_id, blink::ServiceWorkerStatusCode status) {
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h index c62ed58..e4d57444 100644 --- a/content/browser/service_worker/service_worker_context_core.h +++ b/content/browser/service_worker/service_worker_context_core.h
@@ -273,6 +273,13 @@ const GURL& url, const ServiceWorkerContext::CheckHasServiceWorkerCallback callback); + // Returns OfflineCapability of the service worker matching |url|. + // See ServiceWorkerContext::CheckOfflineCapability for more + // details. + void CheckOfflineCapability( + const GURL& url, + const ServiceWorkerContext::CheckOfflineCapabilityCallback callback); + void UpdateVersionFailureCount(int64_t version_id, blink::ServiceWorkerStatusCode status); // Returns the count of consecutive start worker failures for the given
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc index 4dbda3c..aff5d08 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.cc +++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -638,6 +638,28 @@ this, std::move(callback))); } +void ServiceWorkerContextWrapper::CheckOfflineCapability( + const GURL& url, + CheckOfflineCapabilityCallback callback) { + if (!BrowserThread::CurrentlyOn(GetCoreThreadId())) { + base::PostTask( + FROM_HERE, {GetCoreThreadId()}, + base::BindOnce(&ServiceWorkerContextWrapper::CheckOfflineCapability, + this, url, std::move(callback))); + return; + } + if (!context_core_) { + base::PostTask( + FROM_HERE, {BrowserThread::UI}, + base::BindOnce(std::move(callback), OfflineCapability::kUnsupported)); + return; + } + context()->CheckOfflineCapability( + net::SimplifyUrlForRequest(url), + base::BindOnce(&ServiceWorkerContextWrapper::DidCheckOfflineCapability, + this, std::move(callback))); +} + void ServiceWorkerContextWrapper::ClearAllServiceWorkersForTest( base::OnceClosure callback) { if (!BrowserThread::CurrentlyOn(GetCoreThreadId())) { @@ -1651,6 +1673,14 @@ base::BindOnce(std::move(callback), capability)); } +void ServiceWorkerContextWrapper::DidCheckOfflineCapability( + CheckOfflineCapabilityCallback callback, + OfflineCapability capability) { + DCHECK_CURRENTLY_ON(GetCoreThreadId()); + base::PostTask(FROM_HERE, {BrowserThread::UI}, + base::BindOnce(std::move(callback), capability)); +} + void ServiceWorkerContextWrapper::DidFindRegistrationForUpdate( blink::ServiceWorkerStatusCode status, scoped_refptr<ServiceWorkerRegistration> registration) {
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h index e07510a..e40bc6fe 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.h +++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -159,6 +159,9 @@ void PerformStorageCleanup(base::OnceClosure callback) override; void CheckHasServiceWorker(const GURL& url, CheckHasServiceWorkerCallback callback) override; + void CheckOfflineCapability(const GURL& url, + CheckOfflineCapabilityCallback callback) override; + void ClearAllServiceWorkersForTest(base::OnceClosure callback) override; void StartWorkerForScope(const GURL& scope, StartWorkerCallback info_callback, @@ -388,6 +391,8 @@ void DidCheckHasServiceWorker(CheckHasServiceWorkerCallback callback, content::ServiceWorkerCapability status); + void DidCheckOfflineCapability(CheckOfflineCapabilityCallback callback, + content::OfflineCapability status); void DidFindRegistrationForUpdate( blink::ServiceWorkerStatusCode status,
diff --git a/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc b/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc index 0bf613c2..edce4d3 100644 --- a/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc +++ b/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc
@@ -263,6 +263,32 @@ test_helper.CheckResult(); } + void CheckOfflineCapabilityOnCoreThread( + const std::string& path, + ServiceWorkerContext::CheckOfflineCapabilityCallback callback) { + wrapper()->CheckOfflineCapability(embedded_test_server()->GetURL(path), + std::move(callback)); + } + + OfflineCapability CheckOfflineCapability(const std::string& path) { + base::RunLoop fetch_run_loop; + base::Optional<OfflineCapability> out_offline_capability; + RunOrPostTaskOnThread( + FROM_HERE, ServiceWorkerContext::GetCoreThreadId(), + base::BindOnce(&ServiceWorkerOfflineCapabilityCheckBrowserTest:: + CheckOfflineCapabilityOnCoreThread, + base::Unretained(this), path, + base::BindLambdaForTesting( + [&out_offline_capability, &fetch_run_loop]( + OfflineCapability offline_capability) { + out_offline_capability = offline_capability; + fetch_run_loop.Quit(); + }))); + fetch_run_loop.Run(); + DCHECK(out_offline_capability.has_value()); + return *out_offline_capability; + } + protected: // Expected results which are used in the tests. const FetchEventTestHelper::ExpectedResult kNetworkCompleted = @@ -582,4 +608,80 @@ kNetworkCompleted}}); } +// Sites without a service worker are identified as having no offline capability +// support. +IN_PROC_BROWSER_TEST_F(ServiceWorkerOfflineCapabilityCheckBrowserTest, + CheckOfflineCapabilityForNoServiceWorker) { + // We don't install ServiceWorker in this test. + EXPECT_EQ(OfflineCapability::kUnsupported, + CheckOfflineCapability("/service_worker/empty.html")); + EXPECT_EQ(OfflineCapability::kUnsupported, + CheckOfflineCapability("/service_worker/not_found.html")); +} + +// Sites with a no-fetch-handler service worker are identified as having no +// offline capability support. +IN_PROC_BROWSER_TEST_F(ServiceWorkerOfflineCapabilityCheckBrowserTest, + CheckOfflineCapabilityForNoFetchHandler) { + EXPECT_TRUE(NavigateToURL(shell(), + embedded_test_server()->GetURL( + "/service_worker/create_service_worker.html"))); + // Install ServiceWorker which does not have any event handler. + EXPECT_EQ("DONE", EvalJs(shell(), "register('empty.js')")); + + EXPECT_EQ(OfflineCapability::kUnsupported, + CheckOfflineCapability("/service_worker/empty.html")); + EXPECT_EQ(OfflineCapability::kUnsupported, + CheckOfflineCapability("/service_worker/not_found.html")); +} + +// Sites with a service worker are identified as supporting offline capability +// only when it returns a valid response in the offline mode. +IN_PROC_BROWSER_TEST_F(ServiceWorkerOfflineCapabilityCheckBrowserTest, + CheckOfflineCapability) { + EXPECT_TRUE(NavigateToURL(shell(), + embedded_test_server()->GetURL( + "/service_worker/create_service_worker.html"))); + EXPECT_EQ("DONE", EvalJs(shell(), "register('maybe_offline_support.js')")); + + // At this point, a service worker's status is ACTIVATED because + // register() awaits navigator.serviceWorker.ready promise. + + EXPECT_EQ(OfflineCapability::kUnsupported, + CheckOfflineCapability("/out_of_scope.html")); + + EXPECT_EQ(OfflineCapability::kUnsupported, + CheckOfflineCapability("/out_of_scope.html?offline")); + + EXPECT_EQ(OfflineCapability::kUnsupported, + CheckOfflineCapability("/service_worker/empty.html")); + + EXPECT_EQ(OfflineCapability::kUnsupported, + CheckOfflineCapability("/service_worker/empty.html?fetch")); + + EXPECT_EQ(OfflineCapability::kSupported, + CheckOfflineCapability("/service_worker/empty.html?offline")); + + EXPECT_EQ( + OfflineCapability::kSupported, + CheckOfflineCapability("/service_worker/empty.html?fetch_or_offline")); +} + +// Sites with a service worker which is not activated yet are identified as +// having no offline capability support. +IN_PROC_BROWSER_TEST_F(ServiceWorkerOfflineCapabilityCheckBrowserTest, + CheckOfflineCapabilityForInstallingServiceWorker) { + EXPECT_TRUE(NavigateToURL(shell(), + embedded_test_server()->GetURL( + "/service_worker/create_service_worker.html"))); + // Appends |pendingInstallEvent| URL param to prevent a service worker from + // being activated. + EXPECT_EQ("DONE", + EvalJs(shell(), + "registerWithoutAwaitingReady('maybe_offline_support.js?" + "pendingInstallEvent')")); + EXPECT_EQ(OfflineCapability::kUnsupported, + CheckOfflineCapability("/service_worker/empty.html?offline")); +} + } // namespace content
diff --git a/content/browser/service_worker/service_worker_offline_capability_checker.cc b/content/browser/service_worker/service_worker_offline_capability_checker.cc new file mode 100644 index 0000000..958a1e8 --- /dev/null +++ b/content/browser/service_worker/service_worker_offline_capability_checker.cc
@@ -0,0 +1,120 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/service_worker/service_worker_offline_capability_checker.h" + +#include "base/bind.h" +#include "base/guid.h" +#include "content/browser/service_worker/service_worker_context_core.h" +#include "content/browser/service_worker/service_worker_registration.h" +#include "content/browser/service_worker/service_worker_version.h" +#include "content/browser/storage_partition_impl.h" +#include "url/gurl.h" + +namespace content { + +ServiceWorkerOfflineCapabilityChecker::ServiceWorkerOfflineCapabilityChecker( + const GURL& url) + : url_(url) { + DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); +} + +ServiceWorkerOfflineCapabilityChecker:: + ~ServiceWorkerOfflineCapabilityChecker() = default; + +void ServiceWorkerOfflineCapabilityChecker::Start( + ServiceWorkerStorage* storage, + ServiceWorkerContext::CheckOfflineCapabilityCallback callback) { + callback_ = std::move(callback); + storage->FindRegistrationForClientUrl( + url_, base::BindOnce( + &ServiceWorkerOfflineCapabilityChecker::DidFindRegistration, + // We can use base::Unretained(this) because |this| is expected + // to be alive until the |callback_| is called. + base::Unretained(this))); +} + +void ServiceWorkerOfflineCapabilityChecker::DidFindRegistration( + blink::ServiceWorkerStatusCode status, + scoped_refptr<ServiceWorkerRegistration> registration) { + if (status != blink::ServiceWorkerStatusCode::kOk) { + std::move(callback_).Run(OfflineCapability::kUnsupported); + return; + } + + if (registration->is_uninstalling() || registration->is_uninstalled()) { + std::move(callback_).Run(OfflineCapability::kUnsupported); + return; + } + + scoped_refptr<ServiceWorkerVersion> preferred_version = + registration->active_version(); + if (!preferred_version) { + preferred_version = registration->waiting_version(); + } + if (!preferred_version) { + std::move(callback_).Run(OfflineCapability::kUnsupported); + return; + } + + ServiceWorkerVersion::FetchHandlerExistence existence = + preferred_version->fetch_handler_existence(); + + DCHECK_NE(existence, ServiceWorkerVersion::FetchHandlerExistence::UNKNOWN); + + if (existence != ServiceWorkerVersion::FetchHandlerExistence::EXISTS) { + std::move(callback_).Run(OfflineCapability::kUnsupported); + return; + } + + if (preferred_version->status() != ServiceWorkerVersion::Status::ACTIVATING && + preferred_version->status() != ServiceWorkerVersion::Status::ACTIVATED) { + // ServiceWorkerFetchDispatcher assumes that the version's status is + // ACTIVATING or ACTIVATED. If the version's status is other one, we return + // kUnsupported, without waiting its status becoming ACTIVATING because that + // is not always guaranteed. + // TODO(hayato): We can do a bit better, such as 1) trigger the activation + // and wait, or 2) return a value to indicate the service worker is + // installed but not yet activated. + std::move(callback_).Run(OfflineCapability::kUnsupported); + return; + } + + auto request = blink::mojom::FetchAPIRequest::New(); + request->url = url_; + request->method = "GET"; + request->is_main_resource_load = true; + + fetch_dispatcher_ = std::make_unique<ServiceWorkerFetchDispatcher>( + std::move(request), ResourceType::kMainFrame, + base::GenerateGUID() /* client_id */, std::move(preferred_version), + base::DoNothing() /* prepare callback */, + base::BindOnce(&ServiceWorkerOfflineCapabilityChecker::OnFetchResult, + base::Unretained(this)), + /*is_offline_capability_check=*/true); + fetch_dispatcher_->Run(); +} + +void ServiceWorkerOfflineCapabilityChecker::OnFetchResult( + blink::ServiceWorkerStatusCode status, + ServiceWorkerFetchDispatcher::FetchEventResult result, + blink::mojom::FetchAPIResponsePtr response, + blink::mojom::ServiceWorkerStreamHandlePtr /* stream */, + blink::mojom::ServiceWorkerFetchEventTimingPtr /* timing */, + scoped_refptr<ServiceWorkerVersion>) { + if (status == blink::ServiceWorkerStatusCode::kOk && + result == ServiceWorkerFetchDispatcher::FetchEventResult::kGotResponse && + // TODO(hayato): Investigate whether any 2xx should be accepted or not. + response->status_code == 200) { + std::move(callback_).Run(OfflineCapability::kSupported); + } else { + // TODO(hayato): At present, we return kUnsupported even if the detection + // failed due to internal errors (disk fialures, timeout, etc). In the + // future, we might want to return another enum value so that the callside + // can know whether internal errors happened or not. + std::move(callback_).Run(OfflineCapability::kUnsupported); + } +} + +} // namespace content
diff --git a/content/browser/service_worker/service_worker_offline_capability_checker.h b/content/browser/service_worker/service_worker_offline_capability_checker.h new file mode 100644 index 0000000..a3286ce --- /dev/null +++ b/content/browser/service_worker/service_worker_offline_capability_checker.h
@@ -0,0 +1,67 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_OFFLINE_CAPABILITY_CHECKER_H_ +#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_OFFLINE_CAPABILITY_CHECKER_H_ + +#include "base/memory/weak_ptr.h" +#include "content/browser/service_worker/service_worker_fetch_dispatcher.h" +#include "content/public/browser/service_worker_context.h" +#include "third_party/blink/public/common/service_worker/service_worker_status_code.h" +#include "third_party/blink/public/mojom/service_worker/service_worker_fetch_response_callback.mojom.h" +#include "third_party/blink/public/mojom/service_worker/service_worker_stream_handle.mojom.h" + +class GURL; + +namespace content { + +class ServiceWorkerRegistration; +class ServiceWorkerStorage; +class ServiceWorkerVersion; + +// Utility class used to check a service worker's offline capability. +// Tracking bug is crbug.com/965802. +// +// |this| must outlive |callback_|. +class ServiceWorkerOfflineCapabilityChecker { + public: + explicit ServiceWorkerOfflineCapabilityChecker(const GURL& url); + ~ServiceWorkerOfflineCapabilityChecker(); + + ServiceWorkerOfflineCapabilityChecker( + const ServiceWorkerOfflineCapabilityChecker&) = delete; + ServiceWorkerOfflineCapabilityChecker& operator=( + const ServiceWorkerOfflineCapabilityChecker&) = delete; + + ServiceWorkerOfflineCapabilityChecker( + const ServiceWorkerOfflineCapabilityChecker&&) = delete; + ServiceWorkerOfflineCapabilityChecker& operator=( + const ServiceWorkerOfflineCapabilityChecker&&) = delete; + + // It's the caller's responsibility to make sure that |this| outlives + // |callback|. + void Start(ServiceWorkerStorage* storage, + ServiceWorkerContext::CheckOfflineCapabilityCallback callback); + + private: + void DidFindRegistration( + blink::ServiceWorkerStatusCode status, + scoped_refptr<ServiceWorkerRegistration> registration); + + void OnFetchResult( + blink::ServiceWorkerStatusCode actual_status, + ServiceWorkerFetchDispatcher::FetchEventResult actual_result, + blink::mojom::FetchAPIResponsePtr actual_response, + blink::mojom::ServiceWorkerStreamHandlePtr /* stream */, + blink::mojom::ServiceWorkerFetchEventTimingPtr /* timing */, + scoped_refptr<ServiceWorkerVersion> worker); + + const GURL url_; + ServiceWorkerContext::CheckOfflineCapabilityCallback callback_; + std::unique_ptr<ServiceWorkerFetchDispatcher> fetch_dispatcher_; +}; + +} // namespace content + +#endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_OFFLINE_CAPABILITY_CHECKER_H_
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 9896820b..a3cf15c 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -7140,7 +7140,9 @@ // X-Frame-Options and CSP frame-ancestors behave differently. XFO commits // an error page, while CSP commits a "data:," URL. // TODO(https://crbug.com/870815): Use an error page for both. - if (test.use_error_page) { + if (test.use_error_page || + base::FeatureList::IsEnabled( + network::features::kOutOfBlinkFrameAncestors)) { EXPECT_FALSE(load_observer.last_navigation_succeeded()); EXPECT_EQ(net::ERR_BLOCKED_BY_RESPONSE, load_observer.last_net_error_code());
diff --git a/content/browser/speech/speech_recognizer_impl.cc b/content/browser/speech/speech_recognizer_impl.cc index df50aa84..bd64fae 100644 --- a/content/browser/speech/speech_recognizer_impl.cc +++ b/content/browser/speech/speech_recognizer_impl.cc
@@ -230,7 +230,8 @@ void SpeechRecognizerImpl::AbortRecognition() { base::PostTask(FROM_HERE, {BrowserThread::IO}, - base::BindOnce(&SpeechRecognizerImpl::DispatchEvent, this, + base::BindOnce(&SpeechRecognizerImpl::DispatchEvent, + weak_ptr_factory_.GetWeakPtr(), FSMEventArgs(EVENT_ABORT))); }
diff --git a/content/browser/tracing/tracing_ui.cc b/content/browser/tracing/tracing_ui.cc index 5214880..df50d37 100644 --- a/content/browser/tracing/tracing_ui.cc +++ b/content/browser/tracing/tracing_ui.cc
@@ -15,6 +15,7 @@ #include "base/base64.h" #include "base/bind.h" #include "base/bind_helpers.h" +#include "base/callback_helpers.h" #include "base/command_line.h" #include "base/format_macros.h" #include "base/json/json_reader.h" @@ -69,8 +70,7 @@ } void OnRecordingEnabledAck(WebUIDataSource::GotDataCallback callback) { - std::move(callback).Run( - scoped_refptr<base::RefCountedMemory>(new base::RefCountedString())); + std::move(callback).Run(base::MakeRefCounted<base::RefCountedString>()); } void OnTraceBufferUsageResult(WebUIDataSource::GotDataCallback callback, @@ -103,25 +103,25 @@ } bool OnBeginJSONRequest(const std::string& path, - WebUIDataSource::GotDataCallback* callback) { + WebUIDataSource::GotDataCallback callback) { if (path == "json/categories") { return TracingController::GetInstance()->GetCategories( - base::BindOnce(OnGotCategories, std::move(*callback))); + base::BindOnce(OnGotCategories, std::move(callback))); } const char kBeginRecordingPath[] = "json/begin_recording?"; if (base::StartsWith(path, kBeginRecordingPath, base::CompareCase::SENSITIVE)) { std::string data = path.substr(strlen(kBeginRecordingPath)); - return BeginRecording(data, std::move(*callback)); + return BeginRecording(data, std::move(callback)); } if (path == "json/get_buffer_percent_full") { return TracingController::GetInstance()->GetTraceBufferUsage( - base::BindOnce(OnTraceBufferUsageResult, std::move(*callback))); + base::BindOnce(OnTraceBufferUsageResult, std::move(callback))); } if (path == "json/get_buffer_status") { return TracingController::GetInstance()->GetTraceBufferUsage( - base::BindOnce(OnTraceBufferStatusResult, std::move(*callback))); + base::BindOnce(OnTraceBufferStatusResult, std::move(callback))); } if (path == "json/end_recording_compressed") { if (!TracingController::GetInstance()->IsTracing()) @@ -129,7 +129,7 @@ scoped_refptr<TracingController::TraceDataEndpoint> data_endpoint = TracingControllerImpl::CreateCompressedStringEndpoint( TracingControllerImpl::CreateCallbackEndpoint(base::BindOnce( - TracingCallbackWrapperBase64, std::move(*callback))), + TracingCallbackWrapperBase64, std::move(callback))), false /* compress_with_background_priority */); return TracingController::GetInstance()->StopTracing(data_endpoint); } @@ -145,11 +145,16 @@ void OnTracingRequest(const std::string& path, WebUIDataSource::GotDataCallback callback) { DCHECK(OnShouldHandleRequest(path)); - if (!OnBeginJSONRequest(path, &callback)) { - // OnBeginJSONRequest only consumes |callback| if it returns true. - DCHECK(callback); + // OnBeginJSONRequest() only runs |callback| if it returns true. But it needs + // to take ownership of |callback| even though it won't call |callback| + // sometimes, as it binds |callback| into other callbacks before it makes that + // decision. So we must give it one copy and keep one ourselves. + auto repeating_callback = + base::AdaptCallbackForRepeating(std::move(callback)); + if (!OnBeginJSONRequest(path, repeating_callback)) { std::string error("##ERROR##"); - std::move(callback).Run(base::RefCountedString::TakeString(&error)); + std::move(repeating_callback) + .Run(base::RefCountedString::TakeString(&error)); } }
diff --git a/content/browser/web_contents/web_contents_view_aura_unittest.cc b/content/browser/web_contents/web_contents_view_aura_unittest.cc index a5ade7e..209ba74 100644 --- a/content/browser/web_contents/web_contents_view_aura_unittest.cc +++ b/content/browser/web_contents/web_contents_view_aura_unittest.cc
@@ -315,13 +315,7 @@ #if defined(OS_WIN) -// Flaky crash on ASan: http://crbug.com/1020136 -#if defined(ADDRESS_SANITIZER) -#define MAYBE_DragDropVirtualFiles DISABLED_DragDropVirtualFiles -#else -#define MAYBE_DragDropVirtualFiles DragDropVirtualFiles -#endif -TEST_F(WebContentsViewAuraTest, MAYBE_DragDropVirtualFiles) { +TEST_F(WebContentsViewAuraTest, DragDropVirtualFiles) { WebContentsViewAura* view = GetView(); auto data = std::make_unique<ui::OSExchangeData>();
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java index b389035..8215543 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java
@@ -393,7 +393,7 @@ bindToCaller, bindAsExternalService, false /* useStrongBinding */); } else if (ChildProcessConnection.supportVariableConnections()) { connectionAllocator = ChildConnectionAllocator.createVariableSize(context, - LauncherThread.getHandler(), packageName, + LauncherThread.getHandler(), freeSlotRunnable, packageName, ChildProcessCreationParamsImpl.getSandboxedServicesName(), bindToCaller, bindAsExternalService, false /* useStrongBinding */); } else {
diff --git a/content/public/browser/service_worker_context.h b/content/public/browser/service_worker_context.h index 60035aa8..1544a2f 100644 --- a/content/public/browser/service_worker_context.h +++ b/content/public/browser/service_worker_context.h
@@ -35,6 +35,11 @@ SERVICE_WORKER_WITH_FETCH_HANDLER, }; +enum class OfflineCapability { + kUnsupported, + kSupported, +}; + // Used for UMA. Append only. enum class StartServiceWorkerForNavigationHintResult { // The service worker started successfully. @@ -68,6 +73,9 @@ using CheckHasServiceWorkerCallback = base::OnceCallback<void(ServiceWorkerCapability capability)>; + using CheckOfflineCapabilityCallback = + base::OnceCallback<void(OfflineCapability capability)>; + using CountExternalRequestsCallback = base::OnceCallback<void(size_t external_request_count)>; @@ -175,6 +183,19 @@ const GURL& url, CheckHasServiceWorkerCallback callback) = 0; + // Simulates a navigation request in the offline state and dispatches a fetch + // event. Returns OfflineCapability::kSupported if the response's status code + // is 200. + // + // This function can be called from any thread, but the callback will always + // be called on the UI thread. + // + // TODO(hayato): Re-visit to integrate this function with + // |ServiceWorkerContext::CheckHasServiceWorker|. + virtual void CheckOfflineCapability( + const GURL& url, + CheckOfflineCapabilityCallback callback) = 0; + // Stops all running service workers and unregisters all service worker // registrations. This method is used in web tests to make sure that the // existing service worker will not affect the succeeding tests.
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc index 0a9eca17..1f1186c 100644 --- a/content/public/test/browser_test_base.cc +++ b/content/public/test/browser_test_base.cc
@@ -788,8 +788,9 @@ rule.resolver_type != net::RuleBasedHostResolverProc::Rule::kResolverTypeIPLiteral) || rule.address_family != net::AddressFamily::ADDRESS_FAMILY_UNSPECIFIED || - !!rule.latency_ms) + !!rule.latency_ms) { continue; + } network::mojom::RulePtr mojo_rule = network::mojom::Rule::New(); if (rule.resolver_type == net::RuleBasedHostResolverProc::Rule::kResolverTypeSystem) { @@ -803,6 +804,8 @@ } mojo_rule->host_pattern = rule.host_pattern; mojo_rule->replacement = rule.replacement; + mojo_rule->host_resolver_flags = rule.host_resolver_flags; + mojo_rule->canonical_name = rule.canonical_name; mojo_rules.push_back(std::move(mojo_rule)); }
diff --git a/content/public/test/fake_service_worker_context.cc b/content/public/test/fake_service_worker_context.cc index ab62c2be3..4a21d33 100644 --- a/content/public/test/fake_service_worker_context.cc +++ b/content/public/test/fake_service_worker_context.cc
@@ -72,6 +72,11 @@ CheckHasServiceWorkerCallback callback) { NOTREACHED(); } +void FakeServiceWorkerContext::CheckOfflineCapability( + const GURL& url, + const ServiceWorkerContext::CheckOfflineCapabilityCallback callback) { + NOTREACHED(); +} void FakeServiceWorkerContext::ClearAllServiceWorkersForTest( base::OnceClosure) { NOTREACHED();
diff --git a/content/public/test/fake_service_worker_context.h b/content/public/test/fake_service_worker_context.h index 9fdfdf72..5af8077 100644 --- a/content/public/test/fake_service_worker_context.h +++ b/content/public/test/fake_service_worker_context.h
@@ -53,6 +53,10 @@ void PerformStorageCleanup(base::OnceClosure callback) override; void CheckHasServiceWorker(const GURL& url, CheckHasServiceWorkerCallback callback) override; + void CheckOfflineCapability( + const GURL& url, + const ServiceWorkerContext::CheckOfflineCapabilityCallback callback) + override; void ClearAllServiceWorkersForTest(base::OnceClosure) override; void StartWorkerForScope( const GURL& scope,
diff --git a/content/public/test/network_service_test_helper.cc b/content/public/test/network_service_test_helper.cc index 96a42fd..680eeda0 100644 --- a/content/public/test/network_service_test_helper.cc +++ b/content/public/test/network_service_test_helper.cc
@@ -21,6 +21,7 @@ #include "content/public/common/content_switches.h" #include "content/public/test/test_host_resolver.h" #include "mojo/public/cpp/bindings/receiver_set.h" +#include "net/base/ip_address.h" #include "net/cert/mock_cert_verifier.h" #include "net/cert/test_root_certs.h" #include "net/dns/mock_host_resolver.h" @@ -115,15 +116,21 @@ case network::mojom::ResolverType::kResolverTypeFailTimeout: host_resolver->AddSimulatedTimeoutFailure(rule->host_pattern); break; - case network::mojom::ResolverType::kResolverTypeIPLiteral: - host_resolver->AddIPLiteralRule(rule->host_pattern, rule->replacement, - std::string()); + case network::mojom::ResolverType::kResolverTypeIPLiteral: { + net::IPAddress ip_address; + DCHECK(ip_address.AssignFromIPLiteral(rule->replacement)); + host_resolver->AddRuleWithFlags(rule->host_pattern, rule->replacement, + rule->host_resolver_flags, + rule->canonical_name); break; + } case network::mojom::ResolverType::kResolverTypeDirectLookup: host_resolver->AllowDirectLookup(rule->host_pattern); break; default: - host_resolver->AddRule(rule->host_pattern, rule->replacement); + host_resolver->AddRuleWithFlags(rule->host_pattern, rule->replacement, + rule->host_resolver_flags, + rule->canonical_name); break; } }
diff --git a/content/test/data/service_worker/create_service_worker.html b/content/test/data/service_worker/create_service_worker.html index 2d47c2a..10f550a7 100644 --- a/content/test/data/service_worker/create_service_worker.html +++ b/content/test/data/service_worker/create_service_worker.html
@@ -12,6 +12,17 @@ } } +async function registerWithoutAwaitingReady(worker_url, scope) { + try { + const init = scope ? {scope} : {}; + await navigator.serviceWorker.register(worker_url, init); + // Don't await for navigator.serviceWorker.ready. + return 'DONE'; + } catch (error) { + return `${error}`; + } +} + async function update(scope) { try { const registration =
diff --git a/content/test/data/service_worker/maybe_offline_support.js b/content/test/data/service_worker/maybe_offline_support.js index ec825ee1..b04d302 100644 --- a/content/test/data/service_worker/maybe_offline_support.js +++ b/content/test/data/service_worker/maybe_offline_support.js
@@ -10,6 +10,14 @@ }); } +const scriptUrlParams = new URL(self.serviceWorker.scriptURL).searchParams; +if (scriptUrlParams.has('pendingInstallEvent')) { + // Prevents this SW from being activated. + self.addEventListener('install', e => { + e.waitUntil(new Promise(resolve => {})); + }); +} + self.addEventListener("fetch", event => { const param = new URL(event.request.url).searchParams;
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt index cd8ac015..7178258 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -199,6 +199,9 @@ # Produces blank images on Intel HD 630 w/ Mesa 19.0.2 crbug.com/976861 [ linux intel-0x5912 ] Pixel_OffscreenCanvasTransferToImageBitmap [ Skip ] +# Flakes regularly on Mac. +crbug.com/1040202 [ mac ] Pixel_CSSFilterEffects_NoOverlays [ Failure ] + # Skip swap chain tests on non-Windows [ android ] Pixel_CanvasLowLatency2DSwapChain [ Skip ] [ android ] Pixel_CanvasLowLatencyWebGLSwapChain [ Skip ]
diff --git a/docs/speed/benchmark/harnesses/blink_perf.md b/docs/speed/benchmark/harnesses/blink_perf.md index 6aca9ff..54f2d87 100644 --- a/docs/speed/benchmark/harnesses/blink_perf.md +++ b/docs/speed/benchmark/harnesses/blink_perf.md
@@ -147,6 +147,25 @@ [simple-blob-measure-async.html](https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/perf_tests/test_data/simple-blob-measure-async.html) + +### Service Worker Perf Tests +You can also run perf tests in service workers. You need to trigger the test +with `PerfTestRunner.startMeasureValuesInWorker()` in a page. Within the `run` +method provided to this function, you can initialize a worker and ask the +worker to run the workload by using `measureRunsPerSecond()` defined in +[worker-test-helper.js](https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/perf_tests/resources/worker-test-helper.js). + +`measureRunsPerSecond()` returns a promise which resolves to the test result. +The worker should send the result back to the page, and the page records the +result by `PerfTestRunner.recordResultFromWorker()`. After the result is +recorded, the test finishes. + +Here is an example for testing Cache Storage API of service workers: + +[cache-open-add-delete-10K-service-worker.html](https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/perf_tests/service_worker/cache-open-add-delete-10K-service-worker.html) + +[cache-open-add-delete-10K-service-worker.js](https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-10K-service-worker.js) + ## Canvas Tests The sub-framework [canvas_runner.js](https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/perf_tests/canvas/resources/canvas_runner.js) is used for
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 9d5229fb..bb7e8dc 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1489,6 +1489,7 @@ WEBCAMPRIVATE_SET_HOME = 1426, INPUTMETHODPRIVATE_RESET = 1427, PRINTING_GETPRINTERINFO = 1428, + AUTOTESTPRIVATE_ISARCPACKAGELISTINITIALREFRESHED = 1429, // Last entry: Add new entries above, then run: // python tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/gpu/ipc/client/gpu_channel_host.cc b/gpu/ipc/client/gpu_channel_host.cc index 505affa4..f269259 100644 --- a/gpu/ipc/client/gpu_channel_host.cc +++ b/gpu/ipc/client/gpu_channel_host.cc
@@ -106,12 +106,6 @@ base::TimeDelta::FromSeconds(1), kGpuChannelHostMaxWaitTime, 50); - // Histogram to measure how long the browser UI thread spends blocked. - UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES( - "GPU.GPUChannelHostWaitTime.MicroSeconds", wait_duration, - base::TimeDelta::FromMicroseconds(10), base::TimeDelta::FromSeconds(10), - 50); - // Continue waiting for the event if not signaled if (!signaled) pending_sync.done_event->Wait();
diff --git a/infra/config/buckets/try.star b/infra/config/buckets/try.star index a69dd66..da083493 100644 --- a/infra/config/buckets/try.star +++ b/infra/config/buckets/try.star
@@ -184,7 +184,6 @@ cores = 16, goma_jobs = goma.jobs.J300, ssd = True, - tryjob = tryjob(), ) android_builder(
diff --git a/infra/config/consoles/chromium.android.star b/infra/config/consoles/chromium.android.star index d27286d..ddf15887 100644 --- a/infra/config/consoles/chromium.android.star +++ b/infra/config/consoles/chromium.android.star
@@ -188,7 +188,7 @@ ), luci.console_view_entry( builder = 'ci/android-pie-arm64-rel', - category = 'on_cq', + category = 'on_cq|future', short_name = 'P', ), ],
diff --git a/infra/config/dev/buckets/ci.star b/infra/config/dev/buckets/ci.star index 960b682b..44fe000 100644 --- a/infra/config/dev/buckets/ci.star +++ b/infra/config/dev/buckets/ci.star
@@ -61,10 +61,6 @@ ) ci_builder( - name = 'ChromeOS Swarm', -) - -ci_builder( name = 'Linux Swarm', )
diff --git a/infra/config/dev/consoles/chromium.swarm.star b/infra/config/dev/consoles/chromium.swarm.star index 61f27ed2..e75f2a6 100644 --- a/infra/config/dev/consoles/chromium.swarm.star +++ b/infra/config/dev/consoles/chromium.swarm.star
@@ -5,7 +5,6 @@ entries = [ luci.console_view_entry(builder = 'ci/Android N5 Swarm'), luci.console_view_entry(builder = 'ci/Android N5X Swarm'), - luci.console_view_entry(builder = 'ci/ChromeOS Swarm'), luci.console_view_entry(builder = 'ci/Linux Swarm'), luci.console_view_entry(builder = 'ci/Mac Swarm'), luci.console_view_entry(builder = 'ci/Windows Swarm'),
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg index 61dc987..94cda54 100644 --- a/infra/config/generated/commit-queue.cfg +++ b/infra/config/generated/commit-queue.cfg
@@ -89,6 +89,7 @@ > builders: < name: "chromium/try/android-pie-arm64-rel" + includable_only: true > builders: < name: "chromium/try/android-pie-x86-fyi-rel"
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md index 01bfded..9748939 100644 --- a/infra/config/generated/cq-builders.md +++ b/infra/config/generated/cq-builders.md
@@ -19,8 +19,6 @@ * [android-marshmallow-arm64-rel](https://ci.chromium.org/p/chromium/builders/try/android-marshmallow-arm64-rel) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+android-marshmallow-arm64-rel)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+android-marshmallow-arm64-rel)) -* [android-pie-arm64-rel](https://ci.chromium.org/p/chromium/builders/try/android-pie-arm64-rel) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+android-pie-arm64-rel)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+android-pie-arm64-rel)) - * [android_compile_dbg](https://ci.chromium.org/p/chromium/builders/try/android_compile_dbg) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+android_compile_dbg)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+android_compile_dbg)) * [android_cronet](https://ci.chromium.org/p/chromium/builders/try/android_cronet) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+android_cronet)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+android_cronet))
diff --git a/infra/config/generated/cr-buildbucket-dev.cfg b/infra/config/generated/cr-buildbucket-dev.cfg index d41cbcf..27acbff 100644 --- a/infra/config/generated/cr-buildbucket-dev.cfg +++ b/infra/config/generated/cr-buildbucket-dev.cfg
@@ -55,22 +55,6 @@ service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com" > builders: < - name: "ChromeOS Swarm" - swarming_host: "chromium-swarm-dev.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - recipe: < - name: "swarming/staging" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "mastername:\"chromium.swarm\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < name: "Linux Swarm" swarming_host: "chromium-swarm-dev.appspot.com" swarming_tags: "vpython:native-python-wrapper"
diff --git a/infra/config/generated/luci-milo-dev.cfg b/infra/config/generated/luci-milo-dev.cfg index d805e00..907d3aa 100644 --- a/infra/config/generated/luci-milo-dev.cfg +++ b/infra/config/generated/luci-milo-dev.cfg
@@ -17,9 +17,6 @@ name: "buildbucket/luci.chromium.ci/Android N5X Swarm" > builders: < - name: "buildbucket/luci.chromium.ci/ChromeOS Swarm" - > - builders: < name: "buildbucket/luci.chromium.ci/Linux Swarm" > builders: <
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg index f0586ba..7bfaab8 100644 --- a/infra/config/generated/luci-milo.cfg +++ b/infra/config/generated/luci-milo.cfg
@@ -812,7 +812,7 @@ > builders: < name: "buildbucket/luci.chromium.ci/android-pie-arm64-rel" - category: "on_cq" + category: "on_cq|future" short_name: "P" > header: <
diff --git a/infra/config/generated/luci-scheduler-dev.cfg b/infra/config/generated/luci-scheduler-dev.cfg index b60efc6..f99c0aca 100644 --- a/infra/config/generated/luci-scheduler-dev.cfg +++ b/infra/config/generated/luci-scheduler-dev.cfg
@@ -23,15 +23,6 @@ > > job: < - id: "ChromeOS Swarm" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket-dev.appspot.com" - bucket: "luci.chromium.ci" - builder: "ChromeOS Swarm" - > -> -job: < id: "Linux Swarm" acl_sets: "ci" buildbucket: < @@ -73,7 +64,6 @@ acl_sets: "ci" triggers: "Android N5 Swarm" triggers: "Android N5X Swarm" - triggers: "ChromeOS Swarm" triggers: "Linux Swarm" triggers: "Mac Swarm" triggers: "Windows Swarm"
diff --git a/ios/chrome/browser/browsing_data/browsing_data_features.cc b/ios/chrome/browser/browsing_data/browsing_data_features.cc index cc8a4a3..fe238c0 100644 --- a/ios/chrome/browser/browsing_data/browsing_data_features.cc +++ b/ios/chrome/browser/browsing_data/browsing_data_features.cc
@@ -4,12 +4,5 @@ #include "ios/chrome/browser/browsing_data/browsing_data_features.h" -const base::Feature kNewClearBrowsingDataUI{"NewClearBrowsingDataUI", - base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kWebClearBrowsingData{"WebClearBrowsingData", base::FEATURE_ENABLED_BY_DEFAULT}; - -bool IsNewClearBrowsingDataUIEnabled() { - return base::FeatureList::IsEnabled(kNewClearBrowsingDataUI); -}
diff --git a/ios/chrome/browser/browsing_data/browsing_data_features.h b/ios/chrome/browser/browsing_data/browsing_data_features.h index 64d9bd7..8dbd9f4 100644 --- a/ios/chrome/browser/browsing_data/browsing_data_features.h +++ b/ios/chrome/browser/browsing_data/browsing_data_features.h
@@ -7,14 +7,8 @@ #include "base/feature_list.h" -// Feature flag to enable new Clear Browsing Data UI. -extern const base::Feature kNewClearBrowsingDataUI; - // Feature to use the clear browsing data from web instead of the one from // chrome. extern const base::Feature kWebClearBrowsingData; -// Whether the new Clear Browsing Data UI is enabled. -bool IsNewClearBrowsingDataUIEnabled(); - #endif // IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_FEATURES_H_
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index d25ffbac..9faa2c49 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -314,10 +314,6 @@ flag_descriptions::kAutofillIOSDelayBetweenFieldsName, flag_descriptions::kAutofillIOSDelayBetweenFieldsDescription, flags_ui::kOsIos, MULTI_VALUE_TYPE(kAutofillIOSDelayBetweenFieldsChoices)}, - {"new-clear-browsing-data-ui", - flag_descriptions::kNewClearBrowsingDataUIName, - flag_descriptions::kNewClearBrowsingDataUIDescription, flags_ui::kOsIos, - FEATURE_VALUE_TYPE(kNewClearBrowsingDataUI)}, {"autofill-show-all-profiles-on-prefilled-forms", flag_descriptions::kAutofillShowAllSuggestionsOnPrefilledFormsName, flag_descriptions::kAutofillShowAllSuggestionsOnPrefilledFormsDescription, @@ -604,7 +600,11 @@ FEATURE_VALUE_TYPE(web::kReloadSadTab)}, {"page-info-refactoring", flag_descriptions::kPageInfoRefactoringName, flag_descriptions::kPageInfoRefactoringDescription, flags_ui::kOsIos, - FEATURE_VALUE_TYPE(kPageInfoRefactoring)}}; + FEATURE_VALUE_TYPE(kPageInfoRefactoring)}, + {"contained-browser-bvc", flag_descriptions::kContainedBVCName, + flag_descriptions::kContainedBVCDescription, flags_ui::kOsIos, + FEATURE_VALUE_TYPE(kContainedBVC)}, +}; // Add all switches from experimental flags to |command_line|. void AppendSwitchesFromExperimentalSettings(base::CommandLine* command_line) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index f9cacad..2cacac97 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -130,6 +130,11 @@ const char kConfirmInfobarMessagesUIDescription[] = "When enabled Confirm Infobars use the new Messages UI."; +const char kContainedBVCName[] = "Contained Browser ViewController"; +const char kContainedBVCDescription[] = + "When enabled, the BrowserViewController is contained by the TabGrid " + "instead of being presented"; + const char kCrashRestoreInfobarMessagesUIName[] = "Crash Restore Infobars Messages UI"; const char kCrashRestoreInfobarMessagesUIDescription[] = @@ -261,10 +266,6 @@ "Request the Mobile version of Google SRP by default when the desktop mode " "is requested by default."; -const char kNewClearBrowsingDataUIName[] = "Clear Browsing Data UI"; -const char kNewClearBrowsingDataUIDescription[] = - "Enable new Clear Browsing Data UI."; - const char kNewOmniboxPopupLayoutName[] = "New omnibox popup"; const char kNewOmniboxPopupLayoutDescription[] = "Switches the omnibox suggestions and omnibox itself to display the new "
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index b72755a..be4c91f 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -103,6 +103,11 @@ extern const char kConfirmInfobarMessagesUIName[]; extern const char kConfirmInfobarMessagesUIDescription[]; +// Title and description for the flag that makes the Browser being contained by +// the TabGrid instead of being presented. +extern const char kContainedBVCName[]; +extern const char kContainedBVCDescription[]; + // Title and description for the flag that enables Messages UI on // Crash Restore Infobars. extern const char kCrashRestoreInfobarMessagesUIName[]; @@ -227,10 +232,6 @@ extern const char kMobileGoogleSRPName[]; extern const char kMobileGoogleSRPDescription[]; -// Title and description for the flag to enable new Clear Browsing Data UI. -extern const char kNewClearBrowsingDataUIName[]; -extern const char kNewClearBrowsingDataUIDescription[]; - // Title and description for the flag to display new omnibox popup. extern const char kNewOmniboxPopupLayoutName[]; extern const char kNewOmniboxPopupLayoutDescription[];
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm index 0b8cfe1..22e0299 100644 --- a/ios/chrome/browser/passwords/password_controller.mm +++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -61,7 +61,6 @@ #include "ios/chrome/browser/ui/util/ui_util.h" #include "ios/chrome/browser/web/tab_id_tab_helper.h" #include "ios/chrome/grit/ios_strings.h" -#import "ios/web/common/origin_util.h" #include "ios/web/common/url_scheme_util.h" #import "ios/web/public/deprecated/crw_js_injection_receiver.h" #include "ios/web/public/js_messaging/web_frame.h"
diff --git a/ios/chrome/browser/tabs/tab_model_closing_web_state_observer.mm b/ios/chrome/browser/tabs/tab_model_closing_web_state_observer.mm index 66cf64c8..a30b7ca 100644 --- a/ios/chrome/browser/tabs/tab_model_closing_web_state_observer.mm +++ b/ios/chrome/browser/tabs/tab_model_closing_web_state_observer.mm
@@ -8,6 +8,7 @@ #include "base/strings/string_piece.h" #include "components/sessions/core/tab_restore_service.h" #include "components/sessions/ios/ios_live_tab.h" +#include "components/sessions/ios/ios_restore_live_tab.h" #include "ios/chrome/browser/chrome_url_constants.h" #import "ios/chrome/browser/snapshots/snapshot_tab_helper.h" #import "ios/chrome/browser/tabs/tab_model.h" @@ -78,9 +79,15 @@ if (!_restoreService) return; + web::NavigationManager* navigationManager = webState->GetNavigationManager(); + if (navigationManager->IsRestoreSessionInProgress()) { + auto live_tab = std::make_unique<sessions::RestoreIOSLiveTab>( + webState->BuildSessionStorage()); + _restoreService->CreateHistoricalTab(live_tab.get(), atIndex); + return; + } // No need to record history if the tab has no navigation or has only // presented the NTP or the bookmark UI. - web::NavigationManager* navigationManager = webState->GetNavigationManager(); if (navigationManager->GetItemCount() <= 1) { web::NavigationItem* item = navigationManager->GetLastCommittedItem(); if (!item)
diff --git a/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h b/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h index 054c506..dadaf0db 100644 --- a/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h +++ b/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h
@@ -13,7 +13,6 @@ @class ChromeIdentity; -// TODO(crbug.com/894800): Remove this. // Item for account avatar, used everywhere an account cell is shown. @interface CollectionViewAccountItem : CollectionViewItem
diff --git a/ios/chrome/browser/ui/commands/BUILD.gn b/ios/chrome/browser/ui/commands/BUILD.gn index 6bdec25..23a4bdb 100644 --- a/ios/chrome/browser/ui/commands/BUILD.gn +++ b/ios/chrome/browser/ui/commands/BUILD.gn
@@ -26,7 +26,6 @@ "reading_list_add_command.mm", "send_tab_to_self_command.h", "send_tab_to_self_command.mm", - "settings_main_page_commands.h", "show_signin_command.h", "show_signin_command.mm", "snackbar_commands.h",
diff --git a/ios/chrome/browser/ui/commands/settings_main_page_commands.h b/ios/chrome/browser/ui/commands/settings_main_page_commands.h deleted file mode 100644 index fa975fa..0000000 --- a/ios/chrome/browser/ui/commands/settings_main_page_commands.h +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_UI_COMMANDS_SETTINGS_MAIN_PAGE_COMMANDS_H_ -#define IOS_CHROME_BROWSER_UI_COMMANDS_SETTINGS_MAIN_PAGE_COMMANDS_H_ - -// Command protocol for commands related to the Settings Main Page. -@protocol SettingsMainPageCommands -// Called when the Material Cell Catalog cell is tapped. -- (void)showMaterialCellCatalog; -@end - -#endif // IOS_CHROME_BROWSER_UI_COMMANDS_SETTINGS_MAIN_PAGE_COMMANDS_H_
diff --git a/ios/chrome/browser/ui/payments/payment_request_manager.mm b/ios/chrome/browser/ui/payments/payment_request_manager.mm index 9e88ec02..65f8f3e3 100644 --- a/ios/chrome/browser/ui/payments/payment_request_manager.mm +++ b/ios/chrome/browser/ui/payments/payment_request_manager.mm
@@ -56,7 +56,6 @@ #import "ios/chrome/browser/ui/payments/js_payment_request_manager.h" #import "ios/chrome/browser/ui/payments/payment_request_coordinator.h" #import "ios/chrome/browser/ui/payments/payment_request_error_coordinator.h" -#include "ios/web/common/origin_util.h" #import "ios/web/common/url_scheme_util.h" #import "ios/web/public/deprecated/crw_js_injection_receiver.h" #include "ios/web/public/deprecated/url_verification_constants.h" @@ -70,6 +69,7 @@ #import "ios/web/public/ui/crw_web_view_proxy.h" #import "ios/web/public/web_state.h" #import "ios/web/public/web_state_observer_bridge.h" +#include "services/network/public/cpp/is_potentially_trustworthy.h" #include "third_party/libaddressinput/chromium/chrome_metadata_source.h" #include "third_party/libaddressinput/chromium/chrome_storage_impl.h" #include "url/gurl.h" @@ -995,8 +995,7 @@ const GURL lastCommittedURL = _activeWebState->GetLastCommittedURL(); - if (!web::IsOriginSecure(lastCommittedURL) || - lastCommittedURL.scheme() == url::kDataScheme) { + if (!network::IsUrlPotentiallyTrustworthy(lastCommittedURL)) { DLOG(ERROR) << "Not in a secure context."; return NO; } @@ -1212,10 +1211,8 @@ // Set the JS isContextSecure global variable at the earliest opportunity. [_paymentRequestJsManager - setContextSecure:(web::IsOriginSecure( - _activeWebState->GetLastCommittedURL()) && - _activeWebState->GetLastCommittedURL().scheme() != - url::kDataScheme) + setContextSecure:(network::IsUrlPotentiallyTrustworthy( + _activeWebState->GetLastCommittedURL())) completionHandler:nil]; }
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn index 21d7518..388bb9d3 100644 --- a/ios/chrome/browser/ui/settings/BUILD.gn +++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -8,8 +8,6 @@ "bar_button_activity_indicator.h", "bar_button_activity_indicator.mm", "settings_navigation_controller.h", - "settings_root_collection_view_controller.h", - "settings_root_collection_view_controller.mm", "settings_root_table_view_controller.h", "settings_root_table_view_controller.mm", "settings_root_view_controlling.h", @@ -19,9 +17,6 @@ "//ios/chrome/app/strings", "//ios/chrome/browser/browser_state", "//ios/chrome/browser/ui:feature_flags", - "//ios/chrome/browser/ui/collection_view", - "//ios/chrome/browser/ui/collection_view/cells", - "//ios/chrome/browser/ui/collection_view/cells", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/material_components", "//ios/chrome/browser/ui/settings/cells", @@ -33,7 +28,6 @@ "//ios/chrome/common/ui_util", "//ios/public/provider/chrome/browser", "//ios/public/provider/chrome/browser/user_feedback", - "//ios/third_party/material_components_ios", "//ui/base", ] } @@ -66,8 +60,6 @@ "handoff_table_view_controller.mm", "import_data_table_view_controller.h", "import_data_table_view_controller.mm", - "material_cell_catalog_view_controller.h", - "material_cell_catalog_view_controller.mm", "privacy_table_view_controller.h", "privacy_table_view_controller.mm", "search_engine_table_view_controller.h", @@ -154,7 +146,6 @@ "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication/cells", "//ios/chrome/browser/ui/autofill/cells", - "//ios/chrome/browser/ui/collection_view", "//ios/chrome/browser/ui/colors", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/content_suggestions/cells", @@ -196,14 +187,10 @@ "//ios/public/provider/chrome/browser/signin", "//ios/public/provider/chrome/browser/user_feedback", "//ios/public/provider/chrome/browser/voice", - "//ios/third_party/material_components_ios", "//net", "//ui/base", "//url", ] - public_deps = [ - "//ios/chrome/browser/ui/collection_view/cells", - ] allow_circular_includes_from = [ "//ios/chrome/browser/ui/authentication" ] libs = [ "CoreLocation.framework", @@ -277,7 +264,6 @@ "privacy_table_view_controller_unittest.mm", "search_engine_table_view_controller_unittest.mm", "settings_navigation_controller_unittest.mm", - "settings_root_collection_view_controller_unittest.mm", "settings_root_table_view_controller_unittest.mm", "translate_table_view_controller_unittest.mm", "voice_search_table_view_controller_unittest.mm", @@ -322,9 +308,6 @@ "//ios/chrome/browser/sync", "//ios/chrome/browser/translate", "//ios/chrome/browser/ui:feature_flags", - "//ios/chrome/browser/ui/collection_view", - "//ios/chrome/browser/ui/collection_view:test_support", - "//ios/chrome/browser/ui/collection_view/cells", "//ios/chrome/browser/ui/icons", "//ios/chrome/browser/ui/settings/cells", "//ios/chrome/browser/ui/table_view", @@ -337,7 +320,6 @@ "//ios/chrome/test/app:test_support", "//ios/public/provider/chrome/browser", "//ios/public/provider/chrome/browser/voice", - "//ios/third_party/material_components_ios", "//ios/web/public/test", "//net", "//net:test_support",
diff --git a/ios/chrome/browser/ui/settings/cells/BUILD.gn b/ios/chrome/browser/ui/settings/cells/BUILD.gn index cdd974b..42b6cb11 100644 --- a/ios/chrome/browser/ui/settings/cells/BUILD.gn +++ b/ios/chrome/browser/ui/settings/cells/BUILD.gn
@@ -24,8 +24,6 @@ "settings_switch_cell.mm", "settings_switch_item.h", "settings_switch_item.mm", - "settings_text_item.h", - "settings_text_item.mm", "sync_switch_item.h", "sync_switch_item.mm", "table_view_clear_browsing_data_item.h", @@ -57,7 +55,6 @@ public_deps = [ ":clear_browsing_data_constants", - "//ios/chrome/browser/ui/settings/cells/legacy", ] configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/chrome/browser/ui/settings/cells/legacy/BUILD.gn b/ios/chrome/browser/ui/settings/cells/legacy/BUILD.gn deleted file mode 100644 index 9e325a9..0000000 --- a/ios/chrome/browser/ui/settings/cells/legacy/BUILD.gn +++ /dev/null
@@ -1,24 +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. - -source_set("legacy") { - sources = [ - "legacy_settings_detail_item.h", - "legacy_settings_detail_item.mm", - ] - - deps = [ - "//components/strings", - "//ios/chrome/app/strings", - "//ios/chrome/browser/ui/collection_view/cells", - "//ios/chrome/browser/ui/colors", - "//ios/chrome/browser/ui/icons", - "//ios/chrome/browser/ui/util", - "//ios/chrome/common/colors", - "//ios/chrome/common/ui_util", - "//ui/base", - ] - - configs += [ "//build/config/compiler:enable_arc" ] -}
diff --git a/ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.h b/ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.h deleted file mode 100644 index 8d7f725b..0000000 --- a/ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.h +++ /dev/null
@@ -1,64 +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. - -#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_LEGACY_LEGACY_SETTINGS_DETAIL_ITEM_H_ -#define IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_LEGACY_LEGACY_SETTINGS_DETAIL_ITEM_H_ - -#import <UIKit/UIKit.h> - -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" -#import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h" - -// LegacySettingsDetailItem is a model class that uses LegacySettingsDetailCell. -@interface LegacySettingsDetailItem : CollectionViewItem - -// The filename for the leading icon. If empty, no icon will be shown. -@property(nonatomic, copy) NSString* iconImageName; - -// The accessory type to display on the trailing edge of the cell. -@property(nonatomic) MDCCollectionViewCellAccessoryType accessoryType; - -// The main text string. -@property(nonatomic, copy) NSString* text; - -// The detail text string. -@property(nonatomic, copy) NSString* detailText; - -@end - -// LegacySettingsDetailCell implements an MDCCollectionViewCell subclass -// containing an optional leading icon and two text labels: a "main" label and a -// "detail" label. The two labels are laid out side-by-side and fill the full -// width of the cell. Labels are truncated as needed to fit in the cell. -@interface LegacySettingsDetailCell : MDCCollectionViewCell - -// UILabels corresponding to |text| and |detailText| from the item. -@property(nonatomic, readonly, strong) UILabel* textLabel; -@property(nonatomic, readonly, strong) UILabel* detailTextLabel; - -// Sets the image that should be displayed at the leading edge of the cell. If -// set to nil, the icon will be hidden and the text labels will expand to fill -// the full width of the cell. -- (void)setIconImage:(UIImage*)image; - -// The amount of horizontal space to provide to each of the labels. These values -// are determined with the following logic: -// -// - If there is sufficient room (after accounting for margins) for the full -// width of each label, use the current width of each label. -// - If not, use the current width of the main label and a clipped width for the -// detail label. -// - Unless the main label wants more than 75% of the available width and the -// detail label wants 25% or less of the available width, in which case use a -// clipped width for the main label and the current width of the detail label. -// - If both labels want more width than their guaranteed minimums (75% and -// 25%), use the guaranteed minimum amount for each. -// -// Exposed for testing. -@property(nonatomic, readonly) CGFloat textLabelTargetWidth; -@property(nonatomic, readonly) CGFloat detailTextLabelTargetWidth; - -@end - -#endif // IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_LEGACY_LEGACY_SETTINGS_DETAIL_ITEM_H_
diff --git a/ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.mm b/ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.mm deleted file mode 100644 index d8d7168..0000000 --- a/ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.mm +++ /dev/null
@@ -1,243 +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 "ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.h" - -#include <algorithm> - -#import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h" -#include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h" -#import "ios/chrome/browser/ui/util/uikit_ui_util.h" -#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h" -#import "ios/chrome/common/ui_util/constraints_ui_util.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace { - -// Padding used on the leading and trailing edges of the cell and between the -// two labels. -const CGFloat kHorizontalPadding = 16; - -// Padding used between the icon and the text labels. -const CGFloat kIconTrailingPadding = 12; - -// Padding used on the top and bottom edges of the cell. -const CGFloat kVerticalPadding = 16; - -// Size of the icon image. -const CGFloat kIconImageSize = 28; - -// Minimum proportion of the available width to guarantee to the main and detail -// labels. -const CGFloat kMinTextWidthRatio = 0.75f; -const CGFloat kMinDetailTextWidthRatio = 0.25f; -} // namespace - -@implementation LegacySettingsDetailItem - -@synthesize accessoryType = _accessoryType; -@synthesize iconImageName = _iconImageName; -@synthesize text = _text; -@synthesize detailText = _detailText; - -- (instancetype)initWithType:(NSInteger)type { - self = [super initWithType:type]; - if (self) { - self.cellClass = [LegacySettingsDetailCell class]; - } - return self; -} - -#pragma mark CollectionViewItem - -- (void)configureCell:(LegacySettingsDetailCell*)cell { - [super configureCell:cell]; - [cell cr_setAccessoryType:self.accessoryType]; - cell.textLabel.text = self.text; - cell.detailTextLabel.text = self.detailText; - - // Update the icon image, if one is present. - UIImage* iconImage = nil; - if ([self.iconImageName length]) { - iconImage = [UIImage imageNamed:self.iconImageName]; - } - [cell setIconImage:iconImage]; -} - -@end - -@implementation LegacySettingsDetailCell { - UIImageView* _iconImageView; - UILayoutGuide* _labelContainerGuide; - NSLayoutConstraint* _iconHiddenConstraint; - NSLayoutConstraint* _iconVisibleConstraint; - NSLayoutConstraint* _textLabelWidthConstraint; - NSLayoutConstraint* _detailTextLabelWidthConstraint; -} - -@synthesize detailTextLabel = _detailTextLabel; -@synthesize textLabel = _textLabel; - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - self.isAccessibilityElement = YES; - UIView* contentView = self.contentView; - - _iconImageView = [[UIImageView alloc] init]; - _iconImageView.translatesAutoresizingMaskIntoConstraints = NO; - _iconImageView.hidden = YES; - [contentView addSubview:_iconImageView]; - - // Constrain the labels inside a container view, to make width computations - // easier. - _labelContainerGuide = [[UILayoutGuide alloc] init]; - [contentView addLayoutGuide:_labelContainerGuide]; - - _textLabel = [[UILabel alloc] init]; - _textLabel.translatesAutoresizingMaskIntoConstraints = NO; - _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize]; - _textLabel.textColor = UIColor.cr_labelColor; - _textLabel.backgroundColor = UIColor.clearColor; - [contentView addSubview:_textLabel]; - - _detailTextLabel = [[UILabel alloc] init]; - _detailTextLabel.translatesAutoresizingMaskIntoConstraints = NO; - _detailTextLabel.font = [UIFont systemFontOfSize:kUIKitDetailFontSize]; - _detailTextLabel.textColor = UIColor.cr_secondaryLabelColor; - _detailTextLabel.backgroundColor = UIColor.clearColor; - [contentView addSubview:_detailTextLabel]; - - // Set up the width constraints. They are activated here and updated in - // layoutSubviews. - _textLabelWidthConstraint = - [_textLabel.widthAnchor constraintEqualToConstant:0]; - _detailTextLabelWidthConstraint = - [_detailTextLabel.widthAnchor constraintEqualToConstant:0]; - - // Set up the constraints for when the icon is visible and hidden. One of - // these will be active at a time, defaulting to hidden. - _iconHiddenConstraint = [_labelContainerGuide.leadingAnchor - constraintEqualToAnchor:contentView.leadingAnchor - constant:kHorizontalPadding]; - _iconVisibleConstraint = [_labelContainerGuide.leadingAnchor - constraintEqualToAnchor:_iconImageView.trailingAnchor - constant:kIconTrailingPadding]; - - [NSLayoutConstraint activateConstraints:@[ - [_iconImageView.leadingAnchor - constraintEqualToAnchor:contentView.leadingAnchor - constant:kHorizontalPadding], - [_iconImageView.widthAnchor constraintEqualToConstant:kIconImageSize], - [_iconImageView.heightAnchor constraintEqualToConstant:kIconImageSize], - - // Fix the edges of the text labels. - [_textLabel.leadingAnchor - constraintEqualToAnchor:_labelContainerGuide.leadingAnchor], - [_detailTextLabel.trailingAnchor - constraintEqualToAnchor:_labelContainerGuide.trailingAnchor], - [_labelContainerGuide.trailingAnchor - constraintEqualToAnchor:contentView.trailingAnchor - constant:-kHorizontalPadding], - - // Set up the vertical constraints and align the baselines of the two text - // labels. - [_iconImageView.centerYAnchor - constraintEqualToAnchor:contentView.centerYAnchor], - [_textLabel.centerYAnchor - constraintEqualToAnchor:contentView.centerYAnchor], - [_detailTextLabel.firstBaselineAnchor - constraintEqualToAnchor:_textLabel.firstBaselineAnchor], - - _textLabelWidthConstraint, - _detailTextLabelWidthConstraint, - _iconHiddenConstraint, - ]]; - - AddOptionalVerticalPadding(contentView, _textLabel, kVerticalPadding); - } - return self; -} - -- (void)setIconImage:(UIImage*)image { - BOOL hidden = (image == nil); - if (hidden == _iconImageView.hidden) { - return; - } - - _iconImageView.image = image; - _iconImageView.hidden = hidden; - if (hidden) { - _iconVisibleConstraint.active = NO; - _iconHiddenConstraint.active = YES; - } else { - _iconHiddenConstraint.active = NO; - _iconVisibleConstraint.active = YES; - } -} - -// Updates the layout constraints of the text labels and then calls the -// superclass's implementation of layoutSubviews which can then take account of -// the new constraints. -- (void)layoutSubviews { - [super layoutSubviews]; - - // Size the labels in order to determine how much width they want. - [self.textLabel sizeToFit]; - [self.detailTextLabel sizeToFit]; - - // Update the width constraints. - _textLabelWidthConstraint.constant = self.textLabelTargetWidth; - _detailTextLabelWidthConstraint.constant = self.detailTextLabelTargetWidth; - - // Now invoke the layout. - [super layoutSubviews]; -} - -- (void)prepareForReuse { - [super prepareForReuse]; - - [self setIconImage:nil]; -} - -- (CGFloat)textLabelTargetWidth { - CGFloat availableWidth = - CGRectGetWidth(_labelContainerGuide.layoutFrame) - kHorizontalPadding; - CGFloat textLabelWidth = self.textLabel.frame.size.width; - CGFloat detailTextLabelWidth = self.detailTextLabel.frame.size.width; - - if (textLabelWidth + detailTextLabelWidth <= availableWidth) - return textLabelWidth; - - return std::max( - availableWidth - detailTextLabelWidth, - std::min(availableWidth * kMinTextWidthRatio, textLabelWidth)); -} - -- (CGFloat)detailTextLabelTargetWidth { - CGFloat availableWidth = - CGRectGetWidth(_labelContainerGuide.layoutFrame) - kHorizontalPadding; - CGFloat textLabelWidth = self.textLabel.frame.size.width; - CGFloat detailTextLabelWidth = self.detailTextLabel.frame.size.width; - - if (textLabelWidth + detailTextLabelWidth <= availableWidth) - return detailTextLabelWidth; - - return std::max(availableWidth - textLabelWidth, - std::min(availableWidth * kMinDetailTextWidthRatio, - detailTextLabelWidth)); -} - -- (NSString*)accessibilityLabel { - return self.textLabel.text; -} - -- (NSString*)accessibilityValue { - return self.detailTextLabel.text; -} - -@end
diff --git a/ios/chrome/browser/ui/settings/cells/settings_text_item.h b/ios/chrome/browser/ui/settings/cells/settings_text_item.h deleted file mode 100644 index 230facb0..0000000 --- a/ios/chrome/browser/ui/settings/cells/settings_text_item.h +++ /dev/null
@@ -1,52 +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. - -#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_SETTINGS_TEXT_ITEM_H_ -#define IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_SETTINGS_TEXT_ITEM_H_ - -#import <UIKit/UIKit.h> - -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" -#import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h" - -// Collection view item to represent and configure a CollectionViewTextCell. -// TODO(crbug.com/894800): Remove this. -@interface SettingsTextItem : CollectionViewItem - -// The accessory type for the represented cell. -@property(nonatomic) MDCCollectionViewCellAccessoryType accessoryType; - -// The main text to display. -@property(nonatomic, nullable, copy) NSString* text; - -// The secondary text to display. -@property(nonatomic, nullable, copy) NSString* detailText; - -// The font of the main text. Default is the medium SF font of size 16. -@property(nonatomic, null_resettable, copy) UIFont* textFont; - -// The color of the main text. Default is the 900 tint color of the grey -// palette. -@property(nonatomic, null_resettable, copy) UIColor* textColor; - -@end - -// MDCCollectionViewCell that displays two text fields. -@interface SettingsTextCell : MDCCollectionViewCell - -// The first line of text to display. -@property(nonatomic, readonly, strong, nullable) UILabel* textLabel; - -// The second line of detail text to display. -@property(nonatomic, readonly, strong, nullable) UILabel* detailTextLabel; - -// Returns the height needed for a cell contained in |width| to display -// |titleLabel| and |detailTextLabel|. -+ (CGFloat)heightForTitleLabel:(nullable UILabel*)titleLabel - detailTextLabel:(nullable UILabel*)detailTextLabel - width:(CGFloat)width; - -@end - -#endif // IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_SETTINGS_TEXT_ITEM_H_
diff --git a/ios/chrome/browser/ui/settings/cells/settings_text_item.mm b/ios/chrome/browser/ui/settings/cells/settings_text_item.mm deleted file mode 100644 index 8868fb4..0000000 --- a/ios/chrome/browser/ui/settings/cells/settings_text_item.mm +++ /dev/null
@@ -1,217 +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 "ios/chrome/browser/ui/settings/cells/settings_text_item.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -#import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h" -#include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h" -#import "ios/chrome/browser/ui/util/uikit_ui_util.h" -#import "ios/chrome/common/colors/semantic_color_names.h" -#import "ios/chrome/common/ui_util/constraints_ui_util.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace { -const CGFloat kMargin = 16; -const CGFloat kMinimalHeight = 48; -} - -@interface SettingsTextItem () - -// The maximum number of lines of the main text. Default is 1. -@property(nonatomic, assign) NSInteger numberOfTextLines; - -// The font of the secondary text. Default is the regular Roboto font of size -// 14. -@property(nonatomic, null_resettable, copy) UIFont* detailTextFont; - -// The color of the secondary text. Default is the 500 tint color of the grey -// palette. -@property(nonatomic, null_resettable, copy) UIColor* detailTextColor; - -// The maximum number of lines of the secondary text. Default is 1. -@property(nonatomic, assign) NSInteger numberOfDetailTextLines; - -@end - -@implementation SettingsTextItem - -@synthesize accessoryType = _accessoryType; -@synthesize text = _text; -@synthesize detailText = _detailText; -@synthesize textFont = _textFont; -@synthesize textColor = _textColor; -@synthesize numberOfTextLines = _numberOfTextLines; -@synthesize detailTextFont = _detailTextFont; -@synthesize detailTextColor = _detailTextColor; -@synthesize numberOfDetailTextLines = _numberOfDetailTextLines; - -- (instancetype)initWithType:(NSInteger)type { - self = [super initWithType:type]; - if (self) { - self.cellClass = [SettingsTextCell class]; - _numberOfTextLines = 1; - _numberOfDetailTextLines = 1; - } - return self; -} - -- (UIFont*)textFont { - if (!_textFont) { - _textFont = [UIFont systemFontOfSize:kUIKitMainFontSize]; - } - return _textFont; -} - -- (UIColor*)textColor { - if (!_textColor) { - _textColor = [UIColor colorNamed:kTextPrimaryColor]; - } - return _textColor; -} - -- (UIFont*)detailTextFont { - if (!_detailTextFont) { - _detailTextFont = [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize]; - } - return _detailTextFont; -} - -- (UIColor*)detailTextColor { - if (!_detailTextColor) { - _detailTextColor = [UIColor colorNamed:kTextSecondaryColor]; - } - return _detailTextColor; -} - -#pragma mark CollectionViewItem - -- (void)configureCell:(SettingsTextCell*)cell { - [super configureCell:cell]; - [cell cr_setAccessoryType:self.accessoryType]; - cell.textLabel.text = self.text; - cell.detailTextLabel.text = self.detailText; - cell.isAccessibilityElement = YES; - if ([self.accessibilityLabel length] != 0) { - cell.accessibilityLabel = self.accessibilityLabel; - } else { - if (self.detailText.length == 0) { - cell.accessibilityLabel = self.text; - } else { - cell.accessibilityLabel = - [NSString stringWithFormat:@"%@, %@", self.text, self.detailText]; - } - } - - // Styling. - cell.textLabel.font = self.textFont; - cell.textLabel.textColor = self.textColor; - cell.textLabel.numberOfLines = self.numberOfTextLines; - cell.detailTextLabel.font = self.detailTextFont; - cell.detailTextLabel.textColor = self.detailTextColor; - cell.detailTextLabel.numberOfLines = self.numberOfDetailTextLines; -} - -@end - -@implementation SettingsTextCell - -@synthesize textLabel = _textLabel; -@synthesize detailTextLabel = _detailTextLabel; - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - UIView* containerView = [[UIView alloc] initWithFrame:CGRectZero]; - containerView.translatesAutoresizingMaskIntoConstraints = NO; - [self.contentView addSubview:containerView]; - - _textLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _textLabel.translatesAutoresizingMaskIntoConstraints = NO; - [containerView addSubview:_textLabel]; - - _detailTextLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _detailTextLabel.translatesAutoresizingMaskIntoConstraints = NO; - [containerView addSubview:_detailTextLabel]; - - CGFloat margin = kMargin; - - [NSLayoutConstraint activateConstraints:@[ - // Total height. - // The MDC specs ask for at least 48 pt. - [self.contentView.heightAnchor - constraintGreaterThanOrEqualToConstant:kMinimalHeight], - - // Container. - [containerView.leadingAnchor - constraintEqualToAnchor:self.contentView.leadingAnchor - constant:margin], - [containerView.trailingAnchor - constraintEqualToAnchor:self.contentView.trailingAnchor - constant:-margin], - [containerView.centerYAnchor - constraintEqualToAnchor:self.contentView.centerYAnchor], - - // Labels. - [_textLabel.leadingAnchor - constraintEqualToAnchor:containerView.leadingAnchor], - [_textLabel.trailingAnchor - constraintLessThanOrEqualToAnchor:containerView.trailingAnchor], - [_textLabel.topAnchor constraintEqualToAnchor:containerView.topAnchor], - [_textLabel.bottomAnchor - constraintEqualToAnchor:_detailTextLabel.topAnchor], - [_detailTextLabel.leadingAnchor - constraintEqualToAnchor:_textLabel.leadingAnchor], - [_detailTextLabel.trailingAnchor - constraintLessThanOrEqualToAnchor:containerView.trailingAnchor], - [_detailTextLabel.bottomAnchor - constraintLessThanOrEqualToAnchor:containerView.bottomAnchor], - ]]; - - AddOptionalVerticalPadding(self.contentView, containerView, margin); - } - return self; -} - -+ (CGFloat)heightForTitleLabel:(UILabel*)titleLabel - detailTextLabel:(UILabel*)detailTextLabel - width:(CGFloat)width { - CGSize sizeForLabel = CGSizeMake(width - 2 * kMargin, 500); - - CGFloat cellHeight = 2 * kMargin; - cellHeight += [titleLabel sizeThatFits:sizeForLabel].height; - cellHeight += [detailTextLabel sizeThatFits:sizeForLabel].height; - - return MAX(cellHeight, kMinimalHeight); -} - -// Implement -layoutSubviews as per instructions in documentation for -// +[MDCCollectionViewCell cr_preferredHeightForWidth:forItem:]. -- (void)layoutSubviews { - [super layoutSubviews]; - // Adjust the text and detailText label preferredMaxLayoutWidth when the - // parent's width changes, for instance on screen rotation. - CGFloat preferedMaxLayoutWidth = - CGRectGetWidth(self.contentView.frame) - 2 * kMargin; - _textLabel.preferredMaxLayoutWidth = preferedMaxLayoutWidth; - _detailTextLabel.preferredMaxLayoutWidth = preferedMaxLayoutWidth; - - // Re-layout with the new preferred width to allow the label to adjust its - // height. - [super layoutSubviews]; -} - -- (void)prepareForReuse { - [super prepareForReuse]; - self.textLabel.text = nil; - self.detailTextLabel.text = nil; -} - -@end
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn index bbda0175..f8153560 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
@@ -49,7 +49,6 @@ "//ios/chrome/browser/ui/list_model", "//ios/chrome/browser/ui/settings:settings_root", "//ios/chrome/browser/ui/settings/cells", - "//ios/chrome/browser/ui/settings/cells/legacy", "//ios/chrome/browser/ui/table_view", "//ios/chrome/browser/ui/table_view:styler", "//ios/chrome/browser/ui/table_view/cells",
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h index 119e795e..95dd7673 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h
@@ -23,8 +23,6 @@ enum ClearBrowsingDataSectionIdentifier { // Section holding types of data that can be cleared. SectionIdentifierDataTypes = kSectionIdentifierEnumZero, - // Section containing button to clear browsing data. - SectionIdentifierClearBrowsingDataButton, // Section for informational footnote about user's Google Account data. SectionIdentifierGoogleAccount, // Section for footnote about synced data being cleared. @@ -47,8 +45,6 @@ ItemTypeDataTypeSavedPasswords, // Items representing autofill data. ItemTypeDataTypeAutofill, - // Clear data button. - ItemTypeClearBrowsingDataButton, // Footer noting account will not be signed out. ItemTypeFooterGoogleAccount, // Footer noting user will not be signed out of chrome and other forms of @@ -64,13 +60,6 @@ ItemTypeTimeRange, }; -// Differentiation between two types of view controllers that the -// ClearBrowsingDataManager could be serving. -enum class ClearBrowsingDataListType { - kListTypeTableView, - kListTypeCollectionView, -}; - // Manager that serves as the bulk of the logic for // ClearBrowsingDataConsumer. @interface ClearBrowsingDataManager : NSObject @@ -80,14 +69,11 @@ // Reference to the LinkDelegate for CollectionViewFooterItem. @property(nonatomic, weak) id<CollectionViewFooterLinkDelegate> linkDelegate; -// Default init method. |browserState| can't be nil and -// |listType| determines what kind of items to populate model with. -- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState - listType:(ClearBrowsingDataListType)listType; +// Default init method. |browserState| can't be nil. +- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState; // Designated initializer to allow dependency injection (in tests). - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState - listType:(ClearBrowsingDataListType)listType browsingDataRemover:(BrowsingDataRemover*)remover browsingDataCounterWrapperProducer: (BrowsingDataCounterWrapperProducer*)producer NS_DESIGNATED_INITIALIZER; @@ -103,15 +89,6 @@ // Returns a ActionSheetCoordinator that has action block to clear data of type // |dataTypeMaskToRemove|. -// When action triggered by a UIButton. -- (ActionSheetCoordinator*) - actionSheetCoordinatorWithDataTypesToRemove: - (BrowsingDataRemoveMask)dataTypeMaskToRemove - baseViewController: - (UIViewController*)baseViewController - sourceRect:(CGRect)sourceRect - sourceView:(UIView*)sourceView; -// When action triggered by a UIBarButtonItem. - (ActionSheetCoordinator*) actionSheetCoordinatorWithDataTypesToRemove: (BrowsingDataRemoveMask)dataTypeMaskToRemove
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm index 2f77f372..f687c15 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
@@ -41,7 +41,6 @@ #import "ios/chrome/browser/ui/icons/chrome_icon.h" #import "ios/chrome/browser/ui/list_model/list_model.h" #import "ios/chrome/browser/ui/settings/cells/clear_browsing_data_constants.h" -#import "ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.h" #import "ios/chrome/browser/ui/settings/cells/table_view_clear_browsing_data_item.h" #import "ios/chrome/browser/ui/settings/clear_browsing_data/browsing_data_counter_wrapper_producer.h" #import "ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_consumer.h" @@ -106,16 +105,14 @@ PrefChangeRegistrar _prefChangeRegistrar; // Observer for browsing data removal events and associated ScopedObserver - // used to track registration with BrowsingDataRemover. They both may be - // null if the new Clear Browser Data UI is disabled. + // used to track registration with BrowsingDataRemover. std::unique_ptr<BrowsingDataRemoverObserver> _observer; std::unique_ptr< ScopedObserver<BrowsingDataRemover, BrowsingDataRemoverObserver>> _scoped_observer; // Corresponds browsing data counters to their masks/flags. Items are inserted - // as clear data items are constructed. Remains empty if the new Clear Browser - // Data UI is disabled. + // as clear data items are constructed. std::map<BrowsingDataRemoveMask, std::unique_ptr<BrowsingDataCounterWrapper>> _countersByMasks; } @@ -127,14 +124,6 @@ // Whether to show popup other forms of browsing history. @property(nonatomic, assign) BOOL shouldPopupDialogAboutOtherFormsOfBrowsingHistory; -// Whether the mediator is managing a TableViewController or a -// CollectionsViewController. -@property(nonatomic, assign) ClearBrowsingDataListType listType; - -// TODO(crbug.com/947456): Prune -// ClearBrowsingDataCollectionViewController-related code when it is dropped. -@property(nonatomic, strong) - LegacySettingsDetailItem* collectionViewTimeRangeItem; @property(nonatomic, strong) TableViewDetailIconItem* tableViewTimeRangeItem; @@ -151,12 +140,9 @@ _shouldShowNoticeAboutOtherFormsOfBrowsingHistory; @synthesize shouldPopupDialogAboutOtherFormsOfBrowsingHistory = _shouldPopupDialogAboutOtherFormsOfBrowsingHistory; -@synthesize listType = _listType; -- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState - listType:(ClearBrowsingDataListType)listType { +- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState { return [self initWithBrowserState:browserState - listType:listType browsingDataRemover:BrowsingDataRemoverFactory:: GetForBrowserState(browserState) browsingDataCounterWrapperProducer:[[BrowsingDataCounterWrapperProducer @@ -164,14 +150,12 @@ } - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState - listType:(ClearBrowsingDataListType)listType browsingDataRemover:(BrowsingDataRemover*)remover browsingDataCounterWrapperProducer: (BrowsingDataCounterWrapperProducer*)producer { self = [super init]; if (self) { _browserState = browserState; - _listType = listType; _counterWrapperProducer = producer; _timeRangePref.Init(browsing_data::prefs::kDeleteTimePeriod, @@ -194,14 +178,12 @@ #pragma mark - Public Methods - (void)loadModel:(ListModel*)model { - [model addSectionWithIdentifier:SectionIdentifierTimeRange]; - ListItem* timeRangeItem = [self timeRangeItem]; - [model addItem:timeRangeItem - toSectionWithIdentifier:SectionIdentifierTimeRange]; - self.tableViewTimeRangeItem = - base::mac::ObjCCastStrict<TableViewDetailIconItem>(timeRangeItem); + self.tableViewTimeRangeItem = [self timeRangeItem]; self.tableViewTimeRangeItem.useCustomSeparator = YES; + [model addSectionWithIdentifier:SectionIdentifierTimeRange]; + [model addItem:self.tableViewTimeRangeItem + toSectionWithIdentifier:SectionIdentifierTimeRange]; [self addClearBrowsingDataItemsToModel:model]; [self addSyncProfileItemsToModel:model]; } @@ -219,7 +201,7 @@ toSectionWithIdentifier:SectionIdentifierDataTypes]; // This data type doesn't currently have an associated counter, but displays - // an explanatory text instead, when the new UI is enabled. + // an explanatory text instead. ListItem* cookiesSiteDataItem = [self clearDataItemWithType:ItemTypeDataTypeCookiesSiteData titleID:IDS_IOS_CLEAR_COOKIES @@ -299,27 +281,32 @@ (BrowsingDataRemoveMask)dataTypeMaskToRemove baseViewController: (UIViewController*)baseViewController - sourceRect:(CGRect)sourceRect - sourceView:(UIView*)sourceView { - return [self actionSheetCoordinatorWithDataTypesToRemove:dataTypeMaskToRemove - baseViewController:baseViewController - sourceRect:sourceRect - sourceView:sourceView - sourceBarButtonItem:nil]; -} - -- (ActionSheetCoordinator*) - actionSheetCoordinatorWithDataTypesToRemove: - (BrowsingDataRemoveMask)dataTypeMaskToRemove - baseViewController: - (UIViewController*)baseViewController sourceBarButtonItem: (UIBarButtonItem*)sourceBarButtonItem { - return [self actionSheetCoordinatorWithDataTypesToRemove:dataTypeMaskToRemove - baseViewController:baseViewController - sourceRect:CGRectNull - sourceView:nil - sourceBarButtonItem:sourceBarButtonItem]; + if (dataTypeMaskToRemove == BrowsingDataRemoveMask::REMOVE_NOTHING) { + // Nothing to clear (no data types selected). + return nil; + } + __weak ClearBrowsingDataManager* weakSelf = self; + + ActionSheetCoordinator* actionCoordinator = [[ActionSheetCoordinator alloc] + initWithBaseViewController:baseViewController + title:l10n_util::GetNSString( + IDS_IOS_CONFIRM_CLEAR_BUTTON_TITLE) + message:nil + barButtonItem:sourceBarButtonItem]; + actionCoordinator.popoverArrowDirection = + UIPopoverArrowDirectionDown | UIPopoverArrowDirectionUp; + [actionCoordinator + addItemWithTitle:l10n_util::GetNSString(IDS_IOS_CLEAR_BUTTON) + action:^{ + [weakSelf clearDataForDataTypes:dataTypeMaskToRemove]; + } + style:UIAlertActionStyleDestructive]; + [actionCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_CANCEL) + action:nil + style:UIAlertActionStyleCancel]; + return actionCoordinator; } // Add footers about user's account data. @@ -497,7 +484,7 @@ return footerItem; } -- (ListItem*)timeRangeItem { +- (TableViewDetailIconItem*)timeRangeItem { TableViewDetailIconItem* timeRangeItem = [[TableViewDetailIconItem alloc] initWithType:ItemTypeTimeRange]; timeRangeItem.text = l10n_util::GetNSString( @@ -505,7 +492,6 @@ NSString* detailText = [TimeRangeSelectorTableViewController timePeriodLabelForPrefs:self.browserState->GetPrefs()]; DCHECK(detailText); - timeRangeItem.detailText = detailText; timeRangeItem.accessoryType = UITableViewCellAccessoryDisclosureIndicator; timeRangeItem.accessibilityTraits |= UIAccessibilityTraitButton; @@ -576,57 +562,6 @@ } } -// Internal helper method which constructs an ActionSheetCoordinator for the two -// |actionSheetCoordinatorWithDataTypesToRemove:...| in the interface. -- (ActionSheetCoordinator*) - actionSheetCoordinatorWithDataTypesToRemove: - (BrowsingDataRemoveMask)dataTypeMaskToRemove - baseViewController: - (UIViewController*)baseViewController - sourceRect:(CGRect)sourceRect - sourceView:(UIView*)sourceView - sourceBarButtonItem: - (UIBarButtonItem*)sourceBarButtonItem { - if (dataTypeMaskToRemove == BrowsingDataRemoveMask::REMOVE_NOTHING) { - // Nothing to clear (no data types selected). - return nil; - } - __weak ClearBrowsingDataManager* weakSelf = self; - - ActionSheetCoordinator* actionCoordinator; - if (sourceBarButtonItem) { - DCHECK(!sourceView); - actionCoordinator = [[ActionSheetCoordinator alloc] - initWithBaseViewController:baseViewController - title:l10n_util::GetNSString( - IDS_IOS_CONFIRM_CLEAR_BUTTON_TITLE) - message:nil - barButtonItem:sourceBarButtonItem]; - } else { - DCHECK(!sourceBarButtonItem); - actionCoordinator = [[ActionSheetCoordinator alloc] - initWithBaseViewController:baseViewController - title:l10n_util::GetNSString( - IDS_IOS_CONFIRM_CLEAR_BUTTON_TITLE) - message:nil - rect:sourceRect - view:sourceView]; - } - - actionCoordinator.popoverArrowDirection = - UIPopoverArrowDirectionDown | UIPopoverArrowDirectionUp; - [actionCoordinator - addItemWithTitle:l10n_util::GetNSString(IDS_IOS_CLEAR_BUTTON) - action:^{ - [weakSelf clearDataForDataTypes:dataTypeMaskToRemove]; - } - style:UIAlertActionStyleDestructive]; - [actionCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_CANCEL) - action:nil - style:UIAlertActionStyleCancel]; - return actionCoordinator; -} - #pragma mark Properties - (void)setShouldShowNoticeAboutOtherFormsOfBrowsingHistory:(BOOL)showNotice
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm index 2ddf6c3c..2d0a1d1 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm
@@ -84,8 +84,6 @@ remover_ = std::make_unique<FakeBrowsingDataRemover>(); manager_ = [[ClearBrowsingDataManager alloc] initWithBrowserState:browser_state_.get() - listType:ClearBrowsingDataListType:: - kListTypeTableView browsingDataRemover:remover_.get() browsingDataCounterWrapperProducer: [[FakeBrowsingDataCounterWrapperProducer alloc] init]];
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm index 92d991e..839f9640 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
@@ -58,9 +58,6 @@ @property(nonatomic, strong) ChromeActivityOverlayCoordinator* chromeActivityOverlayCoordinator; -// Reference to clear browsing data button for positioning popover confirmation -// dialog. -@property(nonatomic, strong) UIButton* clearBrowsingDataButton; @property(nonatomic, readonly, strong) UIBarButtonItem* clearBrowsingDataBarButton; @@ -78,7 +75,6 @@ @synthesize actionSheetCoordinator = _actionSheetCoordinator; @synthesize alertCoordinator = _alertCoordinator; @synthesize browserState = _browserState; -@synthesize clearBrowsingDataButton = _clearBrowsingDataButton; @synthesize clearBrowsingDataBarButton = _clearBrowsingDataBarButton; @synthesize dataManager = _dataManager; @synthesize dispatcher = _dispatcher; @@ -92,9 +88,8 @@ appBarStyle:ChromeTableViewControllerStyleNoAppBar]; if (self) { _browserState = browserState; - _dataManager = [[ClearBrowsingDataManager alloc] - initWithBrowserState:browserState - listType:ClearBrowsingDataListType::kListTypeTableView]; + _dataManager = + [[ClearBrowsingDataManager alloc] initWithBrowserState:browserState]; _dataManager.consumer = self; } return self; @@ -226,18 +221,6 @@ UIEdgeInsetsMake(0, tableViewTextLinkCell.bounds.size.width, 0, 0); break; } - case ItemTypeClearBrowsingDataButton: { - TableViewTextButtonCell* tableViewTextButtonCell = - base::mac::ObjCCastStrict<TableViewTextButtonCell>(cellToReturn); - tableViewTextButtonCell.selectionStyle = - UITableViewCellSelectionStyleNone; - [tableViewTextButtonCell.button - addTarget:self - action:@selector(showClearBrowsingDataAlertController:) - forControlEvents:UIControlEventTouchUpInside]; - self.clearBrowsingDataButton = tableViewTextButtonCell.button; - break; - } case ItemTypeDataTypeBrowsingHistory: case ItemTypeDataTypeCookiesSiteData: case ItemTypeDataTypeCache: @@ -301,30 +284,6 @@ [self updateToolbarButtons]; } -- (void)tableView:(UITableView*)tableView - legacyDidSelectRowAtIndexPath:(NSIndexPath*)indexPath { - [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; - TableViewItem* item = [self.tableViewModel itemAtIndexPath:indexPath]; - DCHECK(item); - switch (item.type) { - case ItemTypeDataTypeBrowsingHistory: - case ItemTypeDataTypeCookiesSiteData: - case ItemTypeDataTypeCache: - case ItemTypeDataTypeSavedPasswords: - case ItemTypeDataTypeAutofill: { - TableViewClearBrowsingDataItem* clearBrowsingDataItem = - base::mac::ObjCCastStrict<TableViewClearBrowsingDataItem>(item); - clearBrowsingDataItem.checked = !clearBrowsingDataItem.checked; - self.browserState->GetPrefs()->SetBoolean(clearBrowsingDataItem.prefName, - clearBrowsingDataItem.checked); - [self reconfigureCellsForItems:@[ clearBrowsingDataItem ]]; - break; - } - default: - break; - } -} - #pragma mark - TableViewTextLinkCellDelegate - (void)tableViewTextLinkCell:(TableViewTextLinkCell*)cell
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm index c63feb30..4af69aaa 100644 --- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
@@ -27,7 +27,6 @@ #import "ios/chrome/browser/ui/commands/application_commands.h" #import "ios/chrome/browser/ui/commands/open_new_tab_command.h" #import "ios/chrome/browser/ui/icons/chrome_icon.h" -#import "ios/chrome/browser/ui/settings/cells/settings_text_item.h" #import "ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_constants.h" #import "ios/chrome/browser/ui/settings/sync/utils/sync_util.h" #import "ios/chrome/browser/ui/signin_interaction/signin_interaction_coordinator.h"
diff --git a/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.h b/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.h deleted file mode 100644 index c6997dd..0000000 --- a/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.h +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_MATERIAL_CELL_CATALOG_VIEW_CONTROLLER_H_ -#define IOS_CHROME_BROWSER_UI_SETTINGS_MATERIAL_CELL_CATALOG_VIEW_CONTROLLER_H_ - -#import "ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h" - -@interface MaterialCellCatalogViewController - : SettingsRootCollectionViewController - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -- (instancetype)initWithLayout:(UICollectionViewLayout*)layout - style:(CollectionViewControllerStyle)style - NS_UNAVAILABLE; - -@end - -#endif // IOS_CHROME_BROWSER_UI_SETTINGS_MATERIAL_CELL_CATALOG_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.mm b/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.mm deleted file mode 100644 index 7c0e7a8..0000000 --- a/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.mm +++ /dev/null
@@ -1,577 +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 "ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.h" - -#import <UIKit/UIKit.h> - -#import "base/mac/foundation_util.h" -#include "components/autofill/core/browser/autofill_data_util.h" -#include "components/autofill/core/browser/data_model/credit_card.h" -#include "components/grit/components_scaled_resources.h" -#import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.h" -#import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_delegate.h" -#import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h" -#import "ios/chrome/browser/ui/autofill/cells/cvc_item.h" -#import "ios/chrome/browser/ui/autofill/cells/legacy_autofill_edit_item.h" -#import "ios/chrome/browser/ui/autofill/cells/status_item.h" -#import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h" -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h" -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_style.h" -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h" -#import "ios/chrome/browser/ui/collection_view/collection_view_model.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_footer_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_item.h" -#import "ios/chrome/browser/ui/icons/chrome_icon.h" -#import "ios/chrome/browser/ui/payments/cells/accepted_payment_methods_item.h" -#import "ios/chrome/browser/ui/payments/cells/autofill_profile_item.h" -#import "ios/chrome/browser/ui/payments/cells/payments_text_item.h" -#import "ios/chrome/browser/ui/payments/cells/price_item.h" -#import "ios/chrome/browser/ui/settings/cells/copied_to_chrome_item.h" -#import "ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.h" -#import "ios/chrome/browser/ui/settings/cells/passphrase_error_item.h" -#import "ios/chrome/browser/ui/settings/cells/settings_multiline_detail_item.h" -#import "ios/chrome/browser/ui/settings/cells/settings_text_item.h" -#import "ios/chrome/browser/ui/util/uikit_ui_util.h" -#import "ios/public/provider/chrome/browser/chrome_browser_provider.h" -#import "ios/public/provider/chrome/browser/signin/signin_resources_provider.h" -#import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h" -#import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace { - -typedef NS_ENUM(NSInteger, SectionIdentifier) { - SectionIdentifierTextCell = kSectionIdentifierEnumZero, - SectionIdentifierDetailCell, - SectionIdentifierSwitchCell, - SectionIdentifierNativeAppCell, - SectionIdentifierAutofill, - SectionIdentifierPayments, - SectionIdentifierPaymentsNoBackground, - SectionIdentifierCopiedToChrome, - SectionIdentifierPasswordDetails, - SectionIdentifierSettingsSearchCell, - SectionIdentifierAccountCell, - SectionIdentifierAccountControlCell, - SectionIdentifierFooters, - SectionIdentifierContentSuggestionsCell, -}; - -typedef NS_ENUM(NSInteger, ItemType) { - ItemTypeTextCheckmark = kItemTypeEnumZero, - ItemTypeTextDetail, - ItemTypeText, - ItemTypeDetailBasic, - ItemTypeDetailLeftMedium, - ItemTypeDetailRightMedium, - ItemTypeDetailLeftLong, - ItemTypeDetailRightLong, - ItemTypeDetailBothLong, - ItemTypeMultilineBasic, - ItemTypeImportDataMultiline, - ItemTypeSwitchDynamicHeight, - ItemTypeHeader, - ItemTypeAccountDetail, - ItemTypeAccountCheckMark, - ItemTypeAccountSignIn, - ItemTypeApp, - ItemTypePaymentsSingleLine, - ItemTypePaymentsDynamicHeight, - ItemTypeCopiedToChrome, - ItemTypeSettingsSearch, - ItemTypeAutofillDynamicHeight, - ItemTypeAutofillCVC, - ItemTypeAutofillStatus, - ItemTypeFooter, - ItemTypeSyncPassphraseError, - ItemTypeContentSuggestions, -}; - -// Credit Card icon size. -const CGFloat kCardIssuerNetworkIconDimension = 25.0; - -} // namespace - -@implementation MaterialCellCatalogViewController - -- (instancetype)init { - UICollectionViewLayout* layout = [[MDCCollectionViewFlowLayout alloc] init]; - self = [super initWithLayout:layout - style:CollectionViewControllerStyleDefault]; - if (self) { - // TODO(crbug.com/764578): -loadModel should not be called from - // initializer. A possible fix is to move this call to -viewDidLoad. - [self loadModel]; - } - return self; -} - -- (void)loadModel { - [super loadModel]; - CollectionViewModel* model = self.collectionViewModel; - - // Text cells. - [model addSectionWithIdentifier:SectionIdentifierTextCell]; - - SettingsTextItem* textHeader = - [[SettingsTextItem alloc] initWithType:ItemTypeHeader]; - textHeader.text = @"SettingsTextCell"; - textHeader.textFont = [textHeader.textFont fontWithSize:12]; - textHeader.textColor = [[MDCPalette greyPalette] tint500]; - [model setHeader:textHeader - forSectionWithIdentifier:SectionIdentifierTextCell]; - - SettingsTextItem* textCell = - [[SettingsTextItem alloc] initWithType:ItemTypeTextCheckmark]; - textCell.text = @"Text cell 1"; - textCell.accessoryType = MDCCollectionViewCellAccessoryCheckmark; - [model addItem:textCell toSectionWithIdentifier:SectionIdentifierTextCell]; - SettingsTextItem* textCell2 = - [[SettingsTextItem alloc] initWithType:ItemTypeTextDetail]; - textCell2.text = - @"Text cell with text that is so long it must truncate at some point " - @"except that maybe it sometimes doesn't in landscape mode."; - textCell2.accessoryType = MDCCollectionViewCellAccessoryDetailButton; - [model addItem:textCell2 toSectionWithIdentifier:SectionIdentifierTextCell]; - SettingsTextItem* smallTextCell = - [[SettingsTextItem alloc] initWithType:ItemTypeText]; - smallTextCell.text = @"Text cell with small font but height of 48."; - smallTextCell.textFont = [smallTextCell.textFont fontWithSize:8]; - [model addItem:smallTextCell - toSectionWithIdentifier:SectionIdentifierTextCell]; - - // Detail cells. - [model addSectionWithIdentifier:SectionIdentifierDetailCell]; - LegacySettingsDetailItem* detailBasic = - [[LegacySettingsDetailItem alloc] initWithType:ItemTypeDetailBasic]; - detailBasic.text = @"Preload Webpages"; - detailBasic.detailText = @"Only on Wi-Fi"; - detailBasic.accessoryType = MDCCollectionViewCellAccessoryDisclosureIndicator; - [model addItem:detailBasic - toSectionWithIdentifier:SectionIdentifierDetailCell]; - LegacySettingsDetailItem* detailMediumLeft = - [[LegacySettingsDetailItem alloc] initWithType:ItemTypeDetailLeftMedium]; - detailMediumLeft.text = @"A long string but it should fit"; - detailMediumLeft.detailText = @"Detail"; - [model addItem:detailMediumLeft - toSectionWithIdentifier:SectionIdentifierDetailCell]; - LegacySettingsDetailItem* detailMediumRight = - [[LegacySettingsDetailItem alloc] initWithType:ItemTypeDetailRightMedium]; - detailMediumRight.text = @"Main"; - detailMediumRight.detailText = @"A long string but it should fit"; - [model addItem:detailMediumRight - toSectionWithIdentifier:SectionIdentifierDetailCell]; - LegacySettingsDetailItem* detailLongLeft = - [[LegacySettingsDetailItem alloc] initWithType:ItemTypeDetailLeftLong]; - detailLongLeft.text = - @"This is a very long main text that is intended to overflow " - @"except maybe on landscape but now it's longer so it won't fit."; - detailLongLeft.detailText = @"Detail Text"; - detailLongLeft.iconImageName = @"ntp_history_icon"; - [model addItem:detailLongLeft - toSectionWithIdentifier:SectionIdentifierDetailCell]; - LegacySettingsDetailItem* detailLongRight = - [[LegacySettingsDetailItem alloc] initWithType:ItemTypeDetailRightLong]; - detailLongRight.text = @"Main Text"; - detailLongRight.detailText = - @"This is a very long detail text that is intended to overflow " - @"except maybe on landscape but now it's longer so it won't fit."; - detailLongRight.iconImageName = @"ntp_history_icon"; - [model addItem:detailLongRight - toSectionWithIdentifier:SectionIdentifierDetailCell]; - LegacySettingsDetailItem* detailLongBoth = - [[LegacySettingsDetailItem alloc] initWithType:ItemTypeDetailBothLong]; - detailLongBoth.text = - @"This is a very long main text that is intended to overflow " - @"except maybe on landscape but now it's longer so it won't fit."; - detailLongBoth.detailText = - @"This is a very long detail text that is intended to overflow " - @"except maybe on landscape but now it's longer so it won't fit."; - detailLongBoth.iconImageName = @"ntp_history_icon"; - [model addItem:detailLongBoth - toSectionWithIdentifier:SectionIdentifierDetailCell]; - - // Autofill cells. - [model addSectionWithIdentifier:SectionIdentifierAutofill]; - [model addItem:[self autofillEditItem] - toSectionWithIdentifier:SectionIdentifierAutofill]; - [model addItem:[self autofillEditItemWithIcon] - toSectionWithIdentifier:SectionIdentifierAutofill]; - [model addItem:[self cvcItem] - toSectionWithIdentifier:SectionIdentifierAutofill]; - [model addItem:[self cvcItemWithDate] - toSectionWithIdentifier:SectionIdentifierAutofill]; - [model addItem:[self cvcItemWithError] - toSectionWithIdentifier:SectionIdentifierAutofill]; - [model addItem:[self statusItemVerifying] - toSectionWithIdentifier:SectionIdentifierAutofill]; - [model addItem:[self statusItemVerified] - toSectionWithIdentifier:SectionIdentifierAutofill]; - [model addItem:[self statusItemError] - toSectionWithIdentifier:SectionIdentifierAutofill]; - - // Payments cells. - [model addSectionWithIdentifier:SectionIdentifierPayments]; - [model addItem:[self paymentsItemWithWrappingTextandOptionalImage] - toSectionWithIdentifier:SectionIdentifierPayments]; - - PriceItem* priceItem1 = - [[PriceItem alloc] initWithType:ItemTypePaymentsSingleLine]; - priceItem1.item = @"Total"; - priceItem1.notification = @"Updated"; - priceItem1.price = @"USD $100.00"; - [model addItem:priceItem1 toSectionWithIdentifier:SectionIdentifierPayments]; - PriceItem* priceItem2 = - [[PriceItem alloc] initWithType:ItemTypePaymentsSingleLine]; - priceItem2.item = @"Price label is long and should get clipped"; - priceItem2.notification = @"Updated"; - priceItem2.price = @"USD $1,000,000.00"; - [model addItem:priceItem2 toSectionWithIdentifier:SectionIdentifierPayments]; - PriceItem* priceItem3 = - [[PriceItem alloc] initWithType:ItemTypePaymentsSingleLine]; - priceItem3.item = @"Price label is long and should get clipped"; - priceItem3.notification = @"Should get clipped too"; - priceItem3.price = @"USD $1,000,000.00"; - [model addItem:priceItem3 toSectionWithIdentifier:SectionIdentifierPayments]; - PriceItem* priceItem4 = - [[PriceItem alloc] initWithType:ItemTypePaymentsSingleLine]; - priceItem4.item = @"Price label is long and should get clipped"; - priceItem4.notification = @"Should get clipped too"; - priceItem4.price = @"USD $1,000,000,000.00"; - [model addItem:priceItem4 toSectionWithIdentifier:SectionIdentifierPayments]; - - AutofillProfileItem* profileItem1 = - [[AutofillProfileItem alloc] initWithType:ItemTypePaymentsDynamicHeight]; - profileItem1.name = @"Profile Name gets wrapped if it's too long"; - profileItem1.address = @"Profile Address also gets wrapped if it's too long"; - profileItem1.phoneNumber = @"123-456-7890"; - profileItem1.email = @"foo@bar.com"; - profileItem1.notification = @"Some fields are missing"; - [model addItem:profileItem1 - toSectionWithIdentifier:SectionIdentifierPayments]; - AutofillProfileItem* profileItem2 = - [[AutofillProfileItem alloc] initWithType:ItemTypePaymentsDynamicHeight]; - profileItem1.name = @"All fields are optional"; - profileItem2.phoneNumber = @"123-456-7890"; - profileItem2.notification = @"Some fields are missing"; - [model addItem:profileItem2 - toSectionWithIdentifier:SectionIdentifierPayments]; - AutofillProfileItem* profileItem3 = - [[AutofillProfileItem alloc] initWithType:ItemTypePaymentsDynamicHeight]; - profileItem3.address = @"All fields are optional"; - profileItem3.email = @"foo@bar.com"; - [model addItem:profileItem3 - toSectionWithIdentifier:SectionIdentifierPayments]; - - // Payments cells with no background. - [model addSectionWithIdentifier:SectionIdentifierPaymentsNoBackground]; - [model addItem:[self acceptedPaymentMethodsItem] - toSectionWithIdentifier:SectionIdentifierPaymentsNoBackground]; - - // CopiedToChrome cells. - [model addSectionWithIdentifier:SectionIdentifierCopiedToChrome]; - CopiedToChromeItem* copiedToChromeItem = - [[CopiedToChromeItem alloc] initWithType:ItemTypeCopiedToChrome]; - [model addItem:copiedToChromeItem - toSectionWithIdentifier:SectionIdentifierCopiedToChrome]; - - // Account cells. - [model addSectionWithIdentifier:SectionIdentifierAccountCell]; - [model addItem:[self accountItemDetailWithError] - toSectionWithIdentifier:SectionIdentifierAccountCell]; - [model addItem:[self accountItemCheckMark] - toSectionWithIdentifier:SectionIdentifierAccountCell]; - - // Content Suggestions cells. - [model addSectionWithIdentifier:SectionIdentifierContentSuggestionsCell]; - [model addItem:[self contentSuggestionsItem] - toSectionWithIdentifier:SectionIdentifierContentSuggestionsCell]; - [model addItem:[self contentSuggestionsFooterItem] - toSectionWithIdentifier:SectionIdentifierContentSuggestionsCell]; - - // Footers. - [model addSectionWithIdentifier:SectionIdentifierFooters]; - [model addItem:[self shortFooterItem] - toSectionWithIdentifier:SectionIdentifierFooters]; - [model addItem:[self longFooterItem] - toSectionWithIdentifier:SectionIdentifierFooters]; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - self.title = @"Collection Cell Catalog"; -} - -#pragma mark MDCCollectionViewStylingDelegate - -- (CGFloat)collectionView:(nonnull UICollectionView*)collectionView - cellHeightAtIndexPath:(nonnull NSIndexPath*)indexPath { - CollectionViewItem* item = - [self.collectionViewModel itemAtIndexPath:indexPath]; - switch (item.type) { - case ItemTypeContentSuggestions: - case ItemTypeFooter: - case ItemTypeSwitchDynamicHeight: - case ItemTypeTextCheckmark: - case ItemTypeTextDetail: - case ItemTypeText: - case ItemTypeMultilineBasic: - case ItemTypeImportDataMultiline: - case ItemTypeAutofillCVC: - case ItemTypeAutofillStatus: - case ItemTypePaymentsDynamicHeight: - case ItemTypeAutofillDynamicHeight: - return [MDCCollectionViewCell - cr_preferredHeightForWidth:CGRectGetWidth(collectionView.bounds) - forItem:item]; - case ItemTypeApp: - return MDCCellDefaultOneLineWithAvatarHeight; - case ItemTypeAccountDetail: - return MDCCellDefaultTwoLineHeight; - case ItemTypeAccountCheckMark: - return MDCCellDefaultTwoLineHeight; - case ItemTypeAccountSignIn: - return MDCCellDefaultThreeLineHeight; - default: - return MDCCellDefaultOneLineHeight; - } -} - -- (MDCCollectionViewCellStyle)collectionView:(UICollectionView*)collectionView - cellStyleForSection:(NSInteger)section { - NSInteger sectionIdentifier = - [self.collectionViewModel sectionIdentifierForSection:section]; - switch (sectionIdentifier) { - case SectionIdentifierFooters: - // Display the Learn More footer in the default style with no "card" UI - // and no section padding. - return MDCCollectionViewCellStyleDefault; - default: - return self.styler.cellStyle; - } -} - -- (BOOL)collectionView:(UICollectionView*)collectionView - shouldHideItemBackgroundAtIndexPath:(NSIndexPath*)indexPath { - NSInteger sectionIdentifier = - [self.collectionViewModel sectionIdentifierForSection:indexPath.section]; - switch (sectionIdentifier) { - case SectionIdentifierPaymentsNoBackground: - case SectionIdentifierFooters: - // Display the Learn More footer without any background image or - // shadowing. - return YES; - default: - return NO; - } -} - -- (BOOL)collectionView:(nonnull UICollectionView*)collectionView - hidesInkViewAtIndexPath:(nonnull NSIndexPath*)indexPath { - NSInteger sectionIdentifier = - [self.collectionViewModel sectionIdentifierForSection:indexPath.section]; - if (sectionIdentifier == SectionIdentifierFooters) - return YES; - CollectionViewItem* item = - [self.collectionViewModel itemAtIndexPath:indexPath]; - switch (item.type) { - case ItemTypeApp: - case ItemTypeSwitchDynamicHeight: - return YES; - default: - return NO; - } -} - -#pragma mark Item models - -- (CollectionViewItem*)accountItemDetailWithError { - CollectionViewAccountItem* accountItemDetail = - [[CollectionViewAccountItem alloc] initWithType:ItemTypeAccountDetail]; - accountItemDetail.cellStyle = CollectionViewCellStyle::kUIKit; - // TODO(crbug.com/754032): ios_default_avatar image is from a downstream iOS - // internal repository. It should be used through a provider API instead. - accountItemDetail.image = [UIImage imageNamed:@"ios_default_avatar"]; - accountItemDetail.text = @"Account User Name"; - accountItemDetail.detailText = - @"Syncing to AccountUserNameAccount@example.com"; - accountItemDetail.accessoryType = - MDCCollectionViewCellAccessoryDisclosureIndicator; - accountItemDetail.shouldDisplayError = YES; - return accountItemDetail; -} - -- (CollectionViewItem*)accountItemCheckMark { - CollectionViewAccountItem* accountItemCheckMark = - [[CollectionViewAccountItem alloc] initWithType:ItemTypeAccountCheckMark]; - accountItemCheckMark.cellStyle = CollectionViewCellStyle::kUIKit; - // TODO(crbug.com/754032): ios_default_avatar image is from a downstream iOS - // internal repository. It should be used through a provider API instead. - accountItemCheckMark.image = [UIImage imageNamed:@"ios_default_avatar"]; - accountItemCheckMark.text = @"Lorem ipsum dolor sit amet, consectetur " - @"adipiscing elit, sed do eiusmod tempor " - @"incididunt ut labore et dolore magna aliqua."; - accountItemCheckMark.detailText = - @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " - @"eiusmod tempor incididunt ut labore et dolore magna aliqua."; - accountItemCheckMark.accessoryType = MDCCollectionViewCellAccessoryCheckmark; - return accountItemCheckMark; -} - -#pragma mark Private - -- (CollectionViewItem*)paymentsItemWithWrappingTextandOptionalImage { - PaymentsTextItem* item = - [[PaymentsTextItem alloc] initWithType:ItemTypePaymentsDynamicHeight]; - item.text = @"If you want to display a long text that wraps to the next line " - @"and may need to feature an image this is the cell to use."; - item.leadingImage = [UIImage imageNamed:@"app_icon_placeholder"]; - return item; -} - -- (CollectionViewItem*)acceptedPaymentMethodsItem { - AcceptedPaymentMethodsItem* item = [[AcceptedPaymentMethodsItem alloc] - initWithType:ItemTypePaymentsDynamicHeight]; - item.message = @"Cards accepted:"; - - NSMutableArray* cardTypeIcons = [NSMutableArray array]; - const char* cardTypes[]{autofill::kVisaCard, - autofill::kMasterCard, - autofill::kAmericanExpressCard, - autofill::kJCBCard, - autofill::kDinersCard, - autofill::kDiscoverCard}; - for (const std::string& cardType : cardTypes) { - autofill::data_util::PaymentRequestData data = - autofill::data_util::GetPaymentRequestData(cardType); - UIImage* cardTypeIcon = - ResizeImage(NativeImage(data.icon_resource_id), - CGSizeMake(kCardIssuerNetworkIconDimension, - kCardIssuerNetworkIconDimension), - ProjectionMode::kAspectFillNoClipping); - [cardTypeIcons addObject:cardTypeIcon]; - } - item.methodTypeIcons = cardTypeIcons; - return item; -} - -- (CollectionViewItem*)autofillEditItem { - LegacyAutofillEditItem* item = [[LegacyAutofillEditItem alloc] - initWithType:ItemTypeAutofillDynamicHeight]; - item.cellStyle = CollectionViewCellStyle::kUIKit; - item.textFieldName = @"Required Card Number"; - item.textFieldValue = @"4111111111111111"; - item.textFieldEnabled = YES; - item.required = YES; - return item; -} - -- (CollectionViewItem*)autofillEditItemWithIcon { - LegacyAutofillEditItem* item = [[LegacyAutofillEditItem alloc] - initWithType:ItemTypeAutofillDynamicHeight]; - item.cellStyle = CollectionViewCellStyle::kUIKit; - item.textFieldName = @"Card Number"; - item.textFieldValue = @"4111111111111111"; - item.textFieldEnabled = YES; - int resourceID = - autofill::data_util::GetPaymentRequestData(autofill::kVisaCard) - .icon_resource_id; - item.identifyingIcon = - ResizeImage(NativeImage(resourceID), CGSizeMake(30.0, 30.0), - ProjectionMode::kAspectFillNoClipping); - return item; -} - -- (CollectionViewItem*)cvcItem { - CVCItem* item = [[CVCItem alloc] initWithType:ItemTypeAutofillCVC]; - item.instructionsText = - @"This is a long text explaining to enter card details and what " - @"will happen afterwards."; - item.CVCImageResourceID = IDR_CREDIT_CARD_CVC_HINT; - return item; -} - -- (CollectionViewItem*)cvcItemWithDate { - CVCItem* item = [[CVCItem alloc] initWithType:ItemTypeAutofillCVC]; - item.instructionsText = - @"This is a long text explaining to enter card details and what " - @"will happen afterwards."; - item.CVCImageResourceID = IDR_CREDIT_CARD_CVC_HINT; - item.showDateInput = YES; - return item; -} - -- (CollectionViewItem*)cvcItemWithError { - CVCItem* item = [[CVCItem alloc] initWithType:ItemTypeAutofillCVC]; - item.instructionsText = - @"This is a long text explaining to enter card details and what " - @"will happen afterwards. Is this long enough to span 3 lines?"; - item.errorMessage = @"Some error"; - item.CVCImageResourceID = IDR_CREDIT_CARD_CVC_HINT_AMEX; - item.showNewCardButton = YES; - item.showCVCInputError = YES; - return item; -} - -- (CollectionViewItem*)statusItemVerifying { - StatusItem* item = [[StatusItem alloc] initWithType:ItemTypeAutofillStatus]; - item.text = @"Verifying…"; - return item; -} - -- (CollectionViewItem*)statusItemVerified { - StatusItem* item = [[StatusItem alloc] initWithType:ItemTypeAutofillStatus]; - item.state = StatusItemState::VERIFIED; - item.text = @"Verified!"; - return item; -} - -- (CollectionViewItem*)statusItemError { - StatusItem* item = [[StatusItem alloc] initWithType:ItemTypeAutofillStatus]; - item.state = StatusItemState::ERROR; - item.text = @"There was a really long error. We can't tell you more, but we " - @"will still display this long string."; - return item; -} - -- (CollectionViewFooterItem*)shortFooterItem { - CollectionViewFooterItem* footerItem = - [[CollectionViewFooterItem alloc] initWithType:ItemTypeFooter]; - footerItem.text = @"Hello"; - return footerItem; -} - -- (CollectionViewFooterItem*)longFooterItem { - CollectionViewFooterItem* footerItem = - [[CollectionViewFooterItem alloc] initWithType:ItemTypeFooter]; - footerItem.text = @"Hello Hello Hello Hello Hello Hello Hello Hello Hello " - @"Hello Hello Hello Hello Hello Hello Hello Hello Hello " - @"Hello Hello Hello Hello Hello Hello Hello Hello Hello "; - footerItem.image = [UIImage imageNamed:@"app_icon_placeholder"]; - return footerItem; -} - -- (ContentSuggestionsItem*)contentSuggestionsItem { - ContentSuggestionsItem* articleItem = [[ContentSuggestionsItem alloc] - initWithType:ItemTypeContentSuggestions - title:@"This is an incredible article, you should read it!" - url:GURL()]; - articleItem.publisher = @"Top Publisher.com"; - return articleItem; -} - -- (ContentSuggestionsFooterItem*)contentSuggestionsFooterItem { - ContentSuggestionsFooterItem* footerItem = - [[ContentSuggestionsFooterItem alloc] - initWithType:ItemTypeContentSuggestions - title:@"Footer title" - callback:nil]; - return footerItem; -} - -@end
diff --git a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm index 087f565..ac5f8e7 100644 --- a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm +++ b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
@@ -20,7 +20,6 @@ #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h" #import "ios/chrome/browser/ui/settings/import_data_table_view_controller.h" #import "ios/chrome/browser/ui/settings/password/passwords_table_view_controller.h" -#import "ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h" #import "ios/chrome/browser/ui/settings/settings_table_view_controller.h" #import "ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.h" #import "ios/chrome/browser/ui/settings/utils/settings_utils.h"
diff --git a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h deleted file mode 100644 index 01e3488b..0000000 --- a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h +++ /dev/null
@@ -1,77 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_SETTINGS_ROOT_COLLECTION_VIEW_CONTROLLER_H_ -#define IOS_CHROME_BROWSER_UI_SETTINGS_SETTINGS_ROOT_COLLECTION_VIEW_CONTROLLER_H_ - -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h" -#import "ios/chrome/browser/ui/collection_view/collection_view_controller.h" -#import "ios/chrome/browser/ui/settings/settings_root_view_controlling.h" - -// Root class for collection view controllers in settings. -@interface SettingsRootCollectionViewController - : CollectionViewController<CollectionViewFooterLinkDelegate, - SettingsRootViewControlling> - -// Creates an autoreleased Edit button for the collection view. Calls -// |editButtonEnabled| to determine if the button should be enabled. -- (UIBarButtonItem*)createEditButton; - -// Creates an autoreleased Done button for the collection view's edit state. -- (UIBarButtonItem*)createEditDoneButton; - -// Updates the edit or done button to reflect editing state. If the -// collectionView is not in edit mode (and thus showing the 'Done' button), it -// calls the above two functions to determine the existence and state of an edit -// button. -- (void)updateEditButton; - -// Reloads the collection view model with |loadModel| and then reloads the -// collection view data. This class calls this method in |viewWillAppear:|. -- (void)reloadData; - -// Whether this collection view controller should hide the "Done" button (the -// right navigation bar button). Default is NO. -@property(nonatomic, assign) BOOL shouldHideDoneButton; - -// The collection view accessibility identifier to be set on |viewDidLoad|. -@property(nonatomic, copy) NSString* collectionViewAccessibilityIdentifier; - -@end - -// Subclasses of SettingsRootCollectionViewController should implement the -// following methods to customize the behavior. -@interface SettingsRootCollectionViewController (Subclassing) - -// Returns NO. Subclasses should overload this if an edit button is required. -- (BOOL)shouldShowEditButton; - -// Returns NO. Subclasses should overload this if the edit button should be -// enabled. -- (BOOL)editButtonEnabled; - -// Notifies the view controller that the edit button has been tapped. If you -// override this method, you must call -[super editButtonPressed] at some point -// in your implementation. -// -// Note that this method calls -[self setEditing:] in order to change the -// editing mode of this controller. -- (void)editButtonPressed; - -// Prevents user interaction until |-allowUserInteraction| is called by doing -// the following: -// * Disables user interaction with the navigation bar. -// * Replaces the done button with an activity indicator. -// * Covers the collection view with a transparent veil. -- (void)preventUserInteraction; - -// Allows user interaction: -// * Enables user interaction with the navigation bar. -// * Restores the done button. -// * Removes the transparent veil. -- (void)allowUserInteraction; - -@end - -#endif // IOS_CHROME_BROWSER_UI_SETTINGS_SETTINGS_ROOT_COLLECTION_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm deleted file mode 100644 index 86fec3f..0000000 --- a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm +++ /dev/null
@@ -1,232 +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 "ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h" - -#include "base/logging.h" -#import "base/mac/foundation_util.h" - -#include "ios/chrome/browser/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h" -#import "ios/chrome/browser/ui/commands/application_commands.h" -#import "ios/chrome/browser/ui/commands/open_new_tab_command.h" -#import "ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.h" -#import "ios/chrome/browser/ui/settings/bar_button_activity_indicator.h" -#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" -#include "ios/chrome/browser/ui/util/ui_util.h" -#import "ios/chrome/browser/ui/util/uikit_ui_util.h" -#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h" -#include "ios/chrome/grit/ios_strings.h" -#import "ios/third_party/material_components_ios/src/components/Collections/src/MaterialCollections.h" -#include "ui/base/l10n/l10n_util.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace { -enum SavedBarButtomItemPositionEnum { - kUndefinedBarButtonItemPosition, - kLeftBarButtonItemPosition, - kRightBarButtonItemPosition -}; - -// Dimension of the authentication operation activity indicator frame. -const CGFloat kActivityIndicatorDimensionIPad = 64; -const CGFloat kActivityIndicatorDimensionIPhone = 56; - -} // namespace - -@implementation SettingsRootCollectionViewController { - SavedBarButtomItemPositionEnum _savedBarButtonItemPosition; - UIBarButtonItem* _savedBarButtonItem; - UIView* _veil; -} - -@synthesize shouldHideDoneButton = _shouldHideDoneButton; -@synthesize collectionViewAccessibilityIdentifier = - _collectionViewAccessibilityIdentifier; -@synthesize dispatcher = _dispatcher; - -- (void)viewDidLoad { - [super viewDidLoad]; - self.collectionView.accessibilityIdentifier = - self.collectionViewAccessibilityIdentifier; - - // Customize collection view settings. - self.collectionView.backgroundColor = UIColor.cr_systemGroupedBackgroundColor; - self.styler.cellStyle = MDCCollectionViewCellStyleGrouped; - self.styler.separatorColor = UIColorFromRGB(kUIKitSeparatorColor); - self.appBarViewController.headerView.backgroundColor = - UIColor.cr_systemGroupedBackgroundColor; - self.styler.separatorInset = UIEdgeInsetsMake(0, 16, 0, 16); - - self.navigationItem.largeTitleDisplayMode = - UINavigationItemLargeTitleDisplayModeNever; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - UIBarButtonItem* doneButton = [self doneButtonIfNeeded]; - if (!self.navigationItem.rightBarButtonItem && doneButton) { - self.navigationItem.rightBarButtonItem = doneButton; - } -} - -- (UIViewController*)childViewControllerForStatusBarHidden { - return nil; -} - -- (UIViewController*)childViewControllerForStatusBarStyle { - return nil; -} - -- (UIBarButtonItem*)doneButtonIfNeeded { - if (self.shouldHideDoneButton) { - return nil; - } - SettingsNavigationController* navigationController = - base::mac::ObjCCast<SettingsNavigationController>( - self.navigationController); - return [navigationController doneButton]; -} - -- (UIBarButtonItem*)createEditButton { - // Create a custom Edit bar button item, as Material Navigation Bar does not - // handle a system UIBarButtonSystemItemEdit item. - UIBarButtonItem* button = [[UIBarButtonItem alloc] - initWithTitle:l10n_util::GetNSString(IDS_IOS_NAVIGATION_BAR_EDIT_BUTTON) - style:UIBarButtonItemStyleDone - target:self - action:@selector(editButtonPressed)]; - [button setEnabled:[self editButtonEnabled]]; - return button; -} - -- (UIBarButtonItem*)createEditDoneButton { - // Create a custom Done bar button item, as Material Navigation Bar does not - // handle a system UIBarButtonSystemItemDone item. - return [[UIBarButtonItem alloc] - initWithTitle:l10n_util::GetNSString(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON) - style:UIBarButtonItemStyleDone - target:self - action:@selector(editButtonPressed)]; -} - -- (void)updateEditButton { - if ([self.editor isEditing]) { - self.navigationItem.rightBarButtonItem = [self createEditDoneButton]; - } else if ([self shouldShowEditButton]) { - self.navigationItem.rightBarButtonItem = [self createEditButton]; - } else { - self.navigationItem.rightBarButtonItem = [self doneButtonIfNeeded]; - } -} - -- (void)editButtonPressed { - [self.editor setEditing:![self.editor isEditing] animated:YES]; - [self updateEditButton]; -} - -- (void)reloadData { - [self loadModel]; - [self.collectionView reloadData]; -} - -#pragma mark - CollectionViewFooterLinkDelegate - -- (void)cell:(CollectionViewFooterCell*)cell didTapLinkURL:(GURL)URL { - // Subclass must have a valid dispatcher assigned. - DCHECK(self.dispatcher); - OpenNewTabCommand* command = [OpenNewTabCommand commandWithURLFromChrome:URL]; - [self.dispatcher closeSettingsUIAndOpenURL:command]; -} - -#pragma mark - Subclassing - -- (BOOL)shouldShowEditButton { - return NO; -} - -- (BOOL)editButtonEnabled { - return NO; -} - -- (void)preventUserInteraction { - DCHECK(!_savedBarButtonItem); - DCHECK_EQ(kUndefinedBarButtonItemPosition, _savedBarButtonItemPosition); - - // Create |waitButton|. - BOOL displayActivityIndicatorOnTheRight = - self.navigationItem.rightBarButtonItem != nil; - CGFloat activityIndicatorDimension = IsIPadIdiom() - ? kActivityIndicatorDimensionIPad - : kActivityIndicatorDimensionIPhone; - BarButtonActivityIndicator* indicator = [[BarButtonActivityIndicator alloc] - initWithFrame:CGRectMake(0.0, 0.0, activityIndicatorDimension, - activityIndicatorDimension)]; - UIBarButtonItem* waitButton = - [[UIBarButtonItem alloc] initWithCustomView:indicator]; - - if (displayActivityIndicatorOnTheRight) { - // If there is a right bar button item, then it is the "Done" button. - _savedBarButtonItem = self.navigationItem.rightBarButtonItem; - _savedBarButtonItemPosition = kRightBarButtonItemPosition; - self.navigationItem.rightBarButtonItem = waitButton; - [self.navigationItem.leftBarButtonItem setEnabled:NO]; - } else { - _savedBarButtonItem = self.navigationItem.leftBarButtonItem; - _savedBarButtonItemPosition = kLeftBarButtonItemPosition; - self.navigationItem.leftBarButtonItem = waitButton; - } - - // Adds a veil that covers the collection view and prevents user interaction. - DCHECK(self.view); - DCHECK(!_veil); - _veil = [[UIView alloc] initWithFrame:self.view.bounds]; - [_veil setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | - UIViewAutoresizingFlexibleHeight)]; - [_veil setBackgroundColor:[UIColor colorWithWhite:1.0 alpha:0.5]]; - [self.view addSubview:_veil]; - - // Disable user interaction for the navigation controller view to ensure - // that the user cannot go back by swipping the navigation's top view - // controller - [self.navigationController.view setUserInteractionEnabled:NO]; -} - -- (void)allowUserInteraction { - DCHECK(self.navigationController) - << "|allowUserInteraction| should always be called before this settings" - " controller is popped or dismissed."; - [self.navigationController.view setUserInteractionEnabled:YES]; - - // Removes the veil that prevents user interaction. - DCHECK(_veil); - [UIView animateWithDuration:0.3 - animations:^{ - [_veil removeFromSuperview]; - } - completion:^(BOOL finished) { - _veil = nil; - }]; - - DCHECK(_savedBarButtonItem); - switch (_savedBarButtonItemPosition) { - case kLeftBarButtonItemPosition: - self.navigationItem.leftBarButtonItem = _savedBarButtonItem; - break; - case kRightBarButtonItemPosition: - self.navigationItem.rightBarButtonItem = _savedBarButtonItem; - [self.navigationItem.leftBarButtonItem setEnabled:YES]; - break; - default: - NOTREACHED(); - break; - } - _savedBarButtonItem = nil; - _savedBarButtonItemPosition = kUndefinedBarButtonItemPosition; -} - -@end
diff --git a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller_unittest.mm deleted file mode 100644 index 255555aa..0000000 --- a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller_unittest.mm +++ /dev/null
@@ -1,108 +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 "ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h" - -#import <Foundation/Foundation.h> - -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" -#import "ios/chrome/browser/ui/collection_view/collection_view_model.h" -#include "testing/gtest/include/gtest/gtest.h" -#import "testing/gtest_mac.h" -#include "testing/platform_test.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -@interface TestSettingsRootCollectionViewController - : SettingsRootCollectionViewController -@property(nonatomic, readonly) NSMutableArray* items; -- (void)reset; -@end - -@implementation TestSettingsRootCollectionViewController { - NSMutableArray* _items; -} - -- (NSMutableArray*)items { - if (!_items) { - _items = [[NSMutableArray alloc] init]; - } - return _items; -} - -- (void)reset { - _items = nil; -} - -- (void)loadModel { - [super loadModel]; - if ([self.items count] > 0) { - [self.collectionViewModel - addSectionWithIdentifier:kSectionIdentifierEnumZero]; - } - for (CollectionViewItem* item in self.items) { - [self.collectionViewModel addItem:item - toSectionWithIdentifier:kSectionIdentifierEnumZero]; - } -} - -@end - -namespace { - -class SettingsRootCollectionViewControllerTest : public PlatformTest { - public: - SettingsRootCollectionViewControllerTest() - : controller_([[TestSettingsRootCollectionViewController alloc] - initWithLayout:[[MDCCollectionViewFlowLayout alloc] init] - style:CollectionViewControllerStyleDefault]) { - item1_ = [[CollectionViewItem alloc] initWithType:kItemTypeEnumZero]; - item2_ = [[CollectionViewItem alloc] initWithType:kItemTypeEnumZero + 10]; - } - - protected: - void SetUp() override { - PlatformTest::SetUp(); - [controller() reset]; - } - - TestSettingsRootCollectionViewController* controller() { return controller_; } - CollectionViewItem* item1() { return item1_; } - CollectionViewItem* item2() { return item2_; } - - id getCollectionViewItem(int section, int item) { - return [controller().collectionViewModel - itemAtIndexPath:[NSIndexPath indexPathForItem:item inSection:section]]; - } - - int numberOfSections() { - return [controller().collectionViewModel numberOfSections]; - } - - int numberOfItems(int section) { - return [controller().collectionViewModel numberOfItemsInSection:section]; - } - - TestSettingsRootCollectionViewController* controller_; - CollectionViewItem* item1_; - CollectionViewItem* item2_; -}; - -TEST_F(SettingsRootCollectionViewControllerTest, Empty) { - [controller() loadModel]; - EXPECT_EQ(0, numberOfSections()); -} - -TEST_F(SettingsRootCollectionViewControllerTest, ModelContents) { - [controller().items addObjectsFromArray:@[ item1(), item2() ]]; - [controller() loadModel]; - EXPECT_EQ(1, numberOfSections()); - EXPECT_EQ(2, numberOfItems(0)); - EXPECT_EQ(item1(), getCollectionViewItem(0, 0)); - EXPECT_EQ(item2(), getCollectionViewItem(0, 1)); -} - -} // namespace
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.h b/ios/chrome/browser/ui/settings/settings_table_view_controller.h index 0672b53..77baf004 100644 --- a/ios/chrome/browser/ui/settings/settings_table_view_controller.h +++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.h
@@ -19,11 +19,6 @@ @interface SettingsTableViewController : SettingsRootTableViewController <SettingsControllerProtocol> -// Dispatcher for SettingsMainPageCommands. Defaults to self if not set. -// TODO(crbug.com/738881): Unify this with the dispatcher passed into the init. -@property(weak, nonatomic) id<SettingsMainPageCommands> - settingsMainPageDispatcher; - // Initializes a new SettingsTableViewController. |browser| must not // be nil and must not be associated with an off the record browser state. - (instancetype)
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm index 0b2f23ed..44c3be5 100644 --- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -42,7 +42,6 @@ #import "ios/chrome/browser/ui/authentication/cells/table_view_account_item.h" #import "ios/chrome/browser/ui/authentication/cells/table_view_signin_promo_item.h" #import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h" -#import "ios/chrome/browser/ui/commands/settings_main_page_commands.h" #import "ios/chrome/browser/ui/settings/about_chrome_table_view_controller.h" #import "ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.h" #import "ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.h" @@ -55,7 +54,6 @@ #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.h" #import "ios/chrome/browser/ui/settings/language/language_settings_mediator.h" #import "ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.h" -#import "ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.h" #import "ios/chrome/browser/ui/settings/password/passwords_table_view_controller.h" #import "ios/chrome/browser/ui/settings/privacy_table_view_controller.h" #import "ios/chrome/browser/ui/settings/search_engine_table_view_controller.h" @@ -142,7 +140,6 @@ ItemTypeAboutChrome, ItemTypeMemoryDebugging, ItemTypeViewSource, - ItemTypeCollectionCellCatalog, ItemTypeTableCellCatalog, ItemTypeArticlesForYou, }; @@ -163,7 +160,6 @@ PrefObserverDelegate, SettingsControllerProtocol, SearchEngineObserving, - SettingsMainPageCommands, SigninPresenter, SigninPromoViewConsumer, SyncObserverModelBridge> { @@ -238,7 +234,6 @@ @end @implementation SettingsTableViewController -@synthesize settingsMainPageDispatcher = _settingsMainPageDispatcher; @synthesize dispatcher = _dispatcher; @synthesize signinInteractionCoordinator = _signinInteractionCoordinator; @@ -308,7 +303,6 @@ _prefObserverBridge->ObserveChangesForPreference( autofill::prefs::kAutofillProfileEnabled, &_prefChangeRegistrar); - _settingsMainPageDispatcher = self; _dispatcher = dispatcher; // TODO(crbug.com/764578): -loadModel should not be called from @@ -440,8 +434,6 @@ #if BUILDFLAG(CHROMIUM_BRANDING) && !defined(NDEBUG) [model addItem:[self viewSourceSwitchItem] toSectionWithIdentifier:SectionIdentifierDebug]; - [model addItem:[self collectionViewCatalogDetailItem] - toSectionWithIdentifier:SectionIdentifierDebug]; [model addItem:[self tableViewCatalogDetailItem] toSectionWithIdentifier:SectionIdentifierDebug]; #endif // BUILDFLAG(CHROMIUM_BRANDING) && !defined(NDEBUG) @@ -651,13 +643,6 @@ withDefaultsKey:kDevViewSourceKey]; } -- (TableViewDetailIconItem*)collectionViewCatalogDetailItem { - return [self detailItemWithType:ItemTypeCollectionCellCatalog - text:@"Collection Cell Catalog" - detailText:nil - iconImageName:kSettingsDebugImageName]; -} - - (TableViewDetailIconItem*)tableViewCatalogDetailItem { return [self detailItemWithType:ItemTypeTableCellCatalog text:@"TableView Cell Catalog" @@ -849,9 +834,6 @@ // Taps on these don't do anything. They have a switch as accessory view // and only the switch is tappable. break; - case ItemTypeCollectionCellCatalog: - [self.settingsMainPageDispatcher showMaterialCellCatalog]; - break; case ItemTypeTableCellCatalog: [self.navigationController pushViewController:[[TableCellCatalogViewController alloc] init] @@ -1080,14 +1062,6 @@ [self reloadData]; } -#pragma mark Material Cell Catalog - -- (void)showMaterialCellCatalog { - [self.navigationController - pushViewController:[[MaterialCellCatalogViewController alloc] init] - animated:YES]; -} - #pragma mark SettingsControllerProtocol - (void)settingsWillBeDismissed {
diff --git a/ios/chrome/browser/ui/settings/sync/BUILD.gn b/ios/chrome/browser/ui/settings/sync/BUILD.gn index 5cba055..bf8d6498 100644 --- a/ios/chrome/browser/ui/settings/sync/BUILD.gn +++ b/ios/chrome/browser/ui/settings/sync/BUILD.gn
@@ -38,7 +38,6 @@ "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/settings:settings_root", "//ios/chrome/browser/ui/settings/cells", - "//ios/chrome/browser/ui/settings/cells/legacy", "//ios/chrome/browser/ui/settings/sync/utils", "//ios/chrome/browser/ui/settings/utils", "//ios/chrome/browser/ui/table_view", @@ -83,7 +82,6 @@ "//ios/chrome/browser/ui/collection_view:test_support", "//ios/chrome/browser/ui/settings:test_support", "//ios/chrome/browser/ui/settings/cells", - "//ios/chrome/browser/ui/settings/cells/legacy", "//ios/chrome/browser/ui/settings/sync/utils", "//ios/chrome/browser/ui/table_view", "//ios/chrome/browser/ui/table_view:test_support",
diff --git a/ios/chrome/browser/ui/tab_grid/BUILD.gn b/ios/chrome/browser/ui/tab_grid/BUILD.gn index 158ea75f..3df663af 100644 --- a/ios/chrome/browser/ui/tab_grid/BUILD.gn +++ b/ios/chrome/browser/ui/tab_grid/BUILD.gn
@@ -31,6 +31,7 @@ "//ios/chrome/browser/sessions:serialisation", "//ios/chrome/browser/snapshots", "//ios/chrome/browser/tabs", + "//ios/chrome/browser/ui:feature_flags", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/coordinators:chrome_coordinators", "//ios/chrome/browser/ui/history", @@ -95,6 +96,7 @@ "//ios/chrome/app/strings", "//ios/chrome/browser", "//ios/chrome/browser/crash_report", + "//ios/chrome/browser/ui:feature_flags", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/recent_tabs:recent_tabs_ui", "//ios/chrome/browser/ui/tab_grid/transitions",
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.h b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.h index 43d0291..1ea9068 100644 --- a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.h +++ b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.h
@@ -60,6 +60,10 @@ // Returns the layout of the grid for use in an animated transition. - (GridTransitionLayout*)transitionLayout; +// Notifies the ViewController that its content is being displayed or hidden. +- (void)contentWillAppearAnimated:(BOOL)animated; +- (void)contentWillDisappear; + // Notifies the grid that it is about to be dismissed. - (void)prepareForDismissal;
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm index 49c1ec9..d35d7c3 100644 --- a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm
@@ -127,25 +127,11 @@ - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - self.updatesCollectionView = YES; - self.defaultLayout.animatesItemUpdates = YES; - [self.collectionView reloadData]; - // Selection is invalid if there are no items. - if (self.items.count == 0) { - [self animateEmptyStateIn]; - return; - } - [self.collectionView selectItemAtIndexPath:CreateIndexPath(self.selectedIndex) - animated:animated - scrollPosition:UICollectionViewScrollPositionTop]; - // Update the delegate, in case it wasn't set when |items| was populated. - [self.delegate gridViewController:self didChangeItemCount:self.items.count]; - [self removeEmptyStateAnimated:NO]; - self.lastInsertedItemID = nil; + [self contentWillAppearAnimated:animated]; } - (void)viewWillDisappear:(BOOL)animated { - self.updatesCollectionView = NO; + [self contentWillDisappear]; [super viewWillDisappear:animated]; } @@ -247,6 +233,28 @@ self.defaultLayout.animatesItemUpdates = NO; } +- (void)contentWillAppearAnimated:(BOOL)animated { + self.updatesCollectionView = YES; + self.defaultLayout.animatesItemUpdates = YES; + [self.collectionView reloadData]; + // Selection is invalid if there are no items. + if (self.items.count == 0) { + [self animateEmptyStateIn]; + return; + } + [self.collectionView selectItemAtIndexPath:CreateIndexPath(self.selectedIndex) + animated:animated + scrollPosition:UICollectionViewScrollPositionTop]; + // Update the delegate, in case it wasn't set when |items| was populated. + [self.delegate gridViewController:self didChangeItemCount:self.items.count]; + [self removeEmptyStateAnimated:NO]; + self.lastInsertedItemID = nil; +} + +- (void)contentWillDisappear { + self.updatesCollectionView = NO; +} + #pragma mark - UICollectionViewDataSource - (NSInteger)collectionView:(UICollectionView*)collectionView
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_adaptor.h b/ios/chrome/browser/ui/tab_grid/tab_grid_adaptor.h index 31cb113a..6e051df 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_adaptor.h +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_adaptor.h
@@ -8,6 +8,7 @@ #import <Foundation/Foundation.h> #import "ios/chrome/browser/ui/tab_grid/tab_grid_mediator.h" +#import "ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h" #import "ios/chrome/browser/ui/tab_grid/tab_switcher.h" @class TabGridViewController;
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm index db97b060..71ca053d 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
@@ -26,6 +26,7 @@ #import "ios/chrome/browser/ui/tab_grid/tab_grid_paging.h" #import "ios/chrome/browser/ui/tab_grid/tab_grid_transition_handler.h" #import "ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h" +#include "ios/chrome/browser/ui/ui_feature_flags.h" #import "ios/chrome/browser/url_loading/url_loading_params.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -243,8 +244,10 @@ - (UIViewController*)activeViewController { if (self.bvcContainer) { - DCHECK_EQ(self.bvcContainer, - self.baseViewController.presentedViewController); + if (!base::FeatureList::IsEnabled(kContainedBVC)) { + DCHECK_EQ(self.bvcContainer, + self.baseViewController.presentedViewController); + } DCHECK(self.bvcContainer.currentBVC); return self.bvcContainer.currentBVC; } @@ -274,11 +277,20 @@ // If a BVC is currently being presented, dismiss it. This will trigger any // necessary animations. if (self.bvcContainer) { - self.bvcContainer.transitioningDelegate = self.transitionHandler; - self.bvcContainer = nil; - BOOL animated = !self.animationsDisabledForTesting; - [self.baseViewController dismissViewControllerAnimated:animated - completion:nil]; + if (base::FeatureList::IsEnabled(kContainedBVC)) { + [self.baseViewController contentWillAppearAnimated:NO]; + [self.bvcContainer willMoveToParentViewController:nil]; + [self.bvcContainer.view removeFromSuperview]; + [self.bvcContainer removeFromParentViewController]; + self.bvcContainer = nil; + [self.baseViewController contentDidAppear]; + } else { + self.bvcContainer.transitioningDelegate = self.transitionHandler; + self.bvcContainer = nil; + BOOL animated = !self.animationsDisabledForTesting; + [self.baseViewController dismissViewControllerAnimated:animated + completion:nil]; + } } // Record when the tab switcher is presented. base::RecordAction(base::UserMetricsAction("MobileTabGridEntered")); @@ -287,6 +299,7 @@ - (void)showTabViewController:(UIViewController*)viewController completion:(ProceduralBlock)completion { DCHECK(viewController); + [self.adaptor.tabGridViewController contentWillDisappearAnimated:NO]; // Record when the tab switcher is dismissed. base::RecordAction(base::UserMetricsAction("MobileTabGridExited")); @@ -324,9 +337,17 @@ self.launchMaskView = nil; }; - [self.baseViewController presentViewController:self.bvcContainer - animated:animated - completion:extendedCompletion]; + if (base::FeatureList::IsEnabled(kContainedBVC)) { + [self.baseViewController addChildViewController:self.bvcContainer]; + self.bvcContainer.view.frame = self.baseViewController.view.bounds; + [self.baseViewController.view addSubview:self.bvcContainer.view]; + [self.bvcContainer didMoveToParentViewController:self.baseViewController]; + extendedCompletion(); + } else { + [self.baseViewController presentViewController:self.bvcContainer + animated:animated + completion:extendedCompletion]; + } } #pragma mark - TabPresentationDelegate
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h index 38929a9f..e7dc55b 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h
@@ -60,6 +60,11 @@ // transitions are triggered. - (void)prepareForAppearance; +// Notifies the ViewController that its content is being displayed or hidden. +- (void)contentWillAppearAnimated:(BOOL)animated; +- (void)contentDidAppear; +- (void)contentWillDisappearAnimated:(BOOL)animated; + @end #endif // IOS_CHROME_BROWSER_UI_TAB_GRID_TAB_GRID_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm index 42634075..54ba192c 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm
@@ -26,6 +26,7 @@ #import "ios/chrome/browser/ui/tab_grid/tab_grid_top_toolbar.h" #import "ios/chrome/browser/ui/tab_grid/transitions/grid_transition_layout.h" #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h" +#include "ios/chrome/browser/ui/ui_feature_flags.h" #import "ios/chrome/browser/ui/util/rtl_geometry.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/common/colors/semantic_color_names.h" @@ -181,29 +182,17 @@ } - (void)viewWillAppear:(BOOL)animated { - self.viewVisible = YES; - [self.topToolbar.pageControl setSelectedPage:self.currentPage animated:YES]; - [self configureViewControllerForCurrentSizeClassesAndPage]; - // The toolbars should be hidden (alpha 0.0) before the tab appears, so that - // they can be animated in. They can't be set to 0.0 here, because if - // |animated| is YES, this method is being called inside the animation block. - if (animated && self.transitionCoordinator) { - [self animateToolbarsForAppearance]; - } else { - [self showToolbars]; + if (!base::FeatureList::IsEnabled(kContainedBVC)) { + [self contentWillAppearAnimated:animated]; } - [self broadcastIncognitoContentVisibility]; [super viewWillAppear:animated]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; - self.initialFrame = self.view.frame; - // Modify Remote Tabs Insets when page appears and during rotation. - [self setInsetForRemoteTabs]; - // Let image sources know the initial appearance is done. - [self.regularTabsImageDataSource clearPreloadedSnapshots]; - [self.incognitoTabsImageDataSource clearPreloadedSnapshots]; + if (!base::FeatureList::IsEnabled(kContainedBVC)) { + [self contentDidAppear]; + } } - (void)viewDidLayoutSubviews { @@ -213,16 +202,9 @@ } - (void)viewWillDisappear:(BOOL)animated { - self.undoCloseAllAvailable = NO; - [self.regularTabsDelegate discardSavedClosedItems]; - // When the view disappears, the toolbar alpha should be set to 0; either as - // part of the animation, or directly with -hideToolbars. - if (animated && self.transitionCoordinator) { - [self animateToolbarsForDisappearance]; - } else { - [self hideToolbars]; + if (!base::FeatureList::IsEnabled(kContainedBVC)) { + [self contentWillDisappearAnimated:animated]; } - self.viewVisible = NO; [super viewWillDisappear:animated]; } @@ -382,6 +364,53 @@ } } +- (void)contentWillAppearAnimated:(BOOL)animated { + self.viewVisible = YES; + [self.topToolbar.pageControl setSelectedPage:self.currentPage animated:YES]; + [self configureViewControllerForCurrentSizeClassesAndPage]; + // The toolbars should be hidden (alpha 0.0) before the tab appears, so that + // they can be animated in. They can't be set to 0.0 here, because if + // |animated| is YES, this method is being called inside the animation block. + if (animated && self.transitionCoordinator) { + [self animateToolbarsForAppearance]; + } else { + [self showToolbars]; + } + [self broadcastIncognitoContentVisibility]; + + if (base::FeatureList::IsEnabled(kContainedBVC)) { + [self.incognitoTabsViewController contentWillAppearAnimated:animated]; + [self.regularTabsViewController contentWillAppearAnimated:animated]; + } +} + +- (void)contentDidAppear { + self.initialFrame = self.view.frame; + // Modify Remote Tabs Insets when page appears and during rotation. + [self setInsetForRemoteTabs]; + // Let image sources know the initial appearance is done. + [self.regularTabsImageDataSource clearPreloadedSnapshots]; + [self.incognitoTabsImageDataSource clearPreloadedSnapshots]; +} + +- (void)contentWillDisappearAnimated:(BOOL)animated { + self.undoCloseAllAvailable = NO; + [self.regularTabsDelegate discardSavedClosedItems]; + // When the view disappears, the toolbar alpha should be set to 0; either as + // part of the animation, or directly with -hideToolbars. + if (animated && self.transitionCoordinator) { + [self animateToolbarsForDisappearance]; + } else { + [self hideToolbars]; + } + self.viewVisible = NO; + + if (base::FeatureList::IsEnabled(kContainedBVC)) { + [self.incognitoTabsViewController contentWillDisappear]; + [self.regularTabsViewController contentWillDisappear]; + } +} + #pragma mark - Public Properties - (id<GridConsumer>)regularTabsConsumer {
diff --git a/ios/chrome/browser/ui/ui_feature_flags.cc b/ios/chrome/browser/ui/ui_feature_flags.cc index 5dca4f4..bc407cd0 100644 --- a/ios/chrome/browser/ui/ui_feature_flags.cc +++ b/ios/chrome/browser/ui/ui_feature_flags.cc
@@ -33,3 +33,6 @@ const base::Feature kForceUnstackedTabstrip{"ForceUnstackedTabstrip", base::FEATURE_DISABLED_BY_DEFAULT}; + +const base::Feature kContainedBVC{"ContainedBVC", + base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/ui_feature_flags.h b/ios/chrome/browser/ui/ui_feature_flags.h index 034ff91..176adf4 100644 --- a/ios/chrome/browser/ui/ui_feature_flags.h +++ b/ios/chrome/browser/ui/ui_feature_flags.h
@@ -36,4 +36,8 @@ // Feature flag to always force an unstacked tabstrip. extern const base::Feature kForceUnstackedTabstrip; +// Feature flag to have the Browser contained by the TabGrid instead of being +// presented. +extern const base::Feature kContainedBVC; + #endif // IOS_CHROME_BROWSER_UI_UI_FEATURE_FLAGS_H_
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn index 938da77..4f4fd94 100644 --- a/ios/chrome/test/earl_grey/BUILD.gn +++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -389,6 +389,7 @@ "//ios/chrome/browser/ui/autofill/manual_fill:manual_fill_ui", "//ios/chrome/browser/ui/bookmarks:bookmarks_ui", "//ios/chrome/browser/ui/bookmarks:eg_app_support+eg2", + "//ios/chrome/browser/ui/collection_view/cells", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/content_suggestions:constants", "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant",
diff --git a/ios/web/common/BUILD.gn b/ios/web/common/BUILD.gn index 7ecbf12..dbf18d44 100644 --- a/ios/web/common/BUILD.gn +++ b/ios/web/common/BUILD.gn
@@ -9,8 +9,6 @@ "crw_content_view.h", "crw_web_view_content_view.h", "crw_web_view_content_view.mm", - "origin_util.h", - "origin_util.mm", "referrer_util.cc", "referrer_util.h", "url_scheme_util.h", @@ -97,7 +95,6 @@ ] sources = [ - "origin_util_unittest.mm", "referrer_util_unittest.cc", "url_scheme_util_unittest.mm", "url_util_unittest.cc",
diff --git a/ios/web/common/origin_util.h b/ios/web/common/origin_util.h deleted file mode 100644 index a2ece23..0000000 --- a/ios/web/common/origin_util.h +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_WEB_COMMON_ORIGIN_UTIL_H_ -#define IOS_WEB_COMMON_ORIGIN_UTIL_H_ - -class GURL; - -namespace web { - -// Returns true if the origin is trustworthy: that is, if its content can be -// said to have been transferred to the browser in a way that a network attacker -// cannot tamper with or observe. -// -// See https://www.w3.org/TR/powerful-features/#is-origin-trustworthy. -bool IsOriginSecure(const GURL& url); - -} // namespace web - -#endif // IOS_WEB_COMMON_ORIGIN_UTIL_H_
diff --git a/ios/web/common/origin_util.mm b/ios/web/common/origin_util.mm deleted file mode 100644 index 57d3c33ee..0000000 --- a/ios/web/common/origin_util.mm +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "ios/web/common/origin_util.h" - -#include "base/stl_util.h" -#include "net/base/url_util.h" -#include "services/network/public/cpp/is_potentially_trustworthy.h" -#include "url/gurl.h" -#include "url/url_util.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace web { - -bool IsOriginSecure(const GURL& url) { - return network::IsUrlPotentiallyTrustworthy(url); -} - -} // namespace web
diff --git a/ios/web/common/origin_util_unittest.mm b/ios/web/common/origin_util_unittest.mm deleted file mode 100644 index 5bed38c..0000000 --- a/ios/web/common/origin_util_unittest.mm +++ /dev/null
@@ -1,34 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "ios/web/common/origin_util.h" - -#import <WebKit/WebKit.h> - -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/platform_test.h" -#include "url/gurl.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace web { - -using OriginUtilTest = PlatformTest; - -// Tests calling IsSecureOrigin with secure origins. -TEST_F(OriginUtilTest, IsSecureOriginSecure) { - EXPECT_TRUE(IsOriginSecure(GURL("http://localhost"))); - EXPECT_TRUE(IsOriginSecure(GURL("https://chromium.org"))); - EXPECT_TRUE(IsOriginSecure(GURL("file://file"))); -} - -// Tests calling IsSecureOrigin with insecure origins. -TEST_F(OriginUtilTest, IsInsecureOriginSecure) { - EXPECT_FALSE(IsOriginSecure(GURL("http://chromium.org"))); - EXPECT_FALSE(IsOriginSecure(GURL("bogus://bogus"))); -} - -} // namespace web
diff --git a/ios/web_view/internal/passwords/cwv_password_controller.mm b/ios/web_view/internal/passwords/cwv_password_controller.mm index e177d44..49ebcba 100644 --- a/ios/web_view/internal/passwords/cwv_password_controller.mm +++ b/ios/web_view/internal/passwords/cwv_password_controller.mm
@@ -16,7 +16,6 @@ #include "components/password_manager/ios/account_select_fill_data.h" #import "components/password_manager/ios/password_form_helper.h" #import "components/password_manager/ios/password_suggestion_helper.h" -#import "ios/web/common/origin_util.h" #include "ios/web/common/url_scheme_util.h" #include "ios/web/public/js_messaging/web_frame.h" #include "ios/web/public/js_messaging/web_frame_util.h"
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc index ce0edc3..5498ab8 100644 --- a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
@@ -200,16 +200,22 @@ } if (profile >= H264PROFILE_MIN && profile <= H264PROFILE_MAX) { - decoder_.reset(new H264Decoder( - std::make_unique<H264VaapiVideoDecoderDelegate>(this, vaapi_wrapper_), - profile, config.container_color_space)); + auto accelerator = + std::make_unique<H264VaapiVideoDecoderDelegate>(this, vaapi_wrapper_); + decoder_delegate_ = accelerator.get(); + decoder_.reset(new H264Decoder(std::move(accelerator), profile, + config.container_color_space)); } else if (profile >= VP8PROFILE_MIN && profile <= VP8PROFILE_MAX) { - decoder_.reset(new VP8Decoder( - std::make_unique<VP8VaapiVideoDecoderDelegate>(this, vaapi_wrapper_))); + auto accelerator = + std::make_unique<VP8VaapiVideoDecoderDelegate>(this, vaapi_wrapper_); + decoder_delegate_ = accelerator.get(); + decoder_.reset(new VP8Decoder(std::move(accelerator))); } else if (profile >= VP9PROFILE_MIN && profile <= VP9PROFILE_MAX) { - decoder_.reset(new VP9Decoder( - std::make_unique<VP9VaapiVideoDecoderDelegate>(this, vaapi_wrapper_), - profile, config.container_color_space)); + auto accelerator = + std::make_unique<VP9VaapiVideoDecoderDelegate>(this, vaapi_wrapper_); + decoder_delegate_ = accelerator.get(); + decoder_.reset(new VP9Decoder(std::move(accelerator), profile, + config.container_color_space)); } else { VLOGF(1) << "Unsupported profile " << GetProfileName(profile); return false; @@ -445,20 +451,14 @@ switch (res) { case AcceleratedVideoDecoder::kConfigChange: { - gfx::Size new_size = decoder_->GetPicSize(); - if (profile_ != decoder_->GetProfile() && - requested_pic_size_ == new_size) { - // Profile only is changed. - // TODO(crbug.com/1022246): Handle profile change. - continue; - } VLOGF(2) << "Decoder requesting a new set of surfaces"; task_runner_->PostTask( FROM_HERE, base::BindOnce( &VaapiVideoDecodeAccelerator::InitiateSurfaceSetChange, - weak_this_, decoder_->GetRequiredNumOfPictures(), new_size, - decoder_->GetNumReferenceFrames(), decoder_->GetVisibleRect())); + weak_this_, decoder_->GetRequiredNumOfPictures(), + decoder_->GetPicSize(), decoder_->GetNumReferenceFrames(), + decoder_->GetVisibleRect())); // We'll get rescheduled once ProvidePictureBuffers() finishes. return; } @@ -566,11 +566,25 @@ // All surfaces released, destroy them and dismiss all PictureBuffers. awaiting_va_surfaces_recycle_ = false; - if (buffer_allocation_mode_ != BufferAllocationMode::kNone) { - vaapi_wrapper_->DestroyContextAndSurfaces(std::vector<VASurfaceID>( - available_va_surfaces_.begin(), available_va_surfaces_.end())); + + VideoCodecProfile new_profile = decoder_->GetProfile(); + if (profile_ != new_profile) { + DCHECK(decoder_delegate_); + profile_ = new_profile; + auto new_vaapi_wrapper = VaapiWrapper::CreateForVideoCodec( + VaapiWrapper::kDecode, profile_, base::Bind(&ReportToUMA, VAAPI_ERROR)); + RETURN_AND_NOTIFY_ON_FAILURE(new_vaapi_wrapper.get(), + "Failed creating VaapiWrapper", + INVALID_ARGUMENT, ); + decoder_delegate_->set_vaapi_wrapper(new_vaapi_wrapper.get()); + vaapi_wrapper_ = std::move(new_vaapi_wrapper); } else { - vaapi_wrapper_->DestroyContext(); + if (buffer_allocation_mode_ != BufferAllocationMode::kNone) { + vaapi_wrapper_->DestroyContextAndSurfaces(std::vector<VASurfaceID>( + available_va_surfaces_.begin(), available_va_surfaces_.end())); + } else { + vaapi_wrapper_->DestroyContext(); + } } available_va_surfaces_.clear();
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.h b/media/gpu/vaapi/vaapi_video_decode_accelerator.h index 1c30f700..7e2b2328 100644 --- a/media/gpu/vaapi/vaapi_video_decode_accelerator.h +++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.h
@@ -44,6 +44,7 @@ namespace media { class AcceleratedVideoDecoder; +class VaapiVideoDecoderDelegate; class VaapiPicture; // Class to provide video decode acceleration for Intel systems with hardware @@ -246,6 +247,9 @@ scoped_refptr<VaapiWrapper> vaapi_wrapper_; // Only used on |decoder_thread_task_runner_|. std::unique_ptr<AcceleratedVideoDecoder> decoder_; + // TODO(crbug.com/1022246): Instead of having the raw pointer here, getting + // the pointer from AcceleratedVideoDecoder. + VaapiVideoDecoderDelegate* decoder_delegate_ = nullptr; // Filled in during Initialize(). BufferAllocationMode buffer_allocation_mode_;
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc index 015fd9c8..83dcc61e 100644 --- a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc +++ b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
@@ -228,16 +228,16 @@ EXPECT_CALL(*mock_decoder_, Decode()) .WillOnce(Return(AcceleratedVideoDecoder::kConfigChange)); - EXPECT_CALL(*mock_decoder_, GetPicSize()).WillOnce(Return(picture_size)); - EXPECT_CALL(*mock_decoder_, GetProfile()) - .WillOnce(Return(GetParam().video_codec)); EXPECT_CALL(*mock_decoder_, GetRequiredNumOfPictures()) .WillOnce(Return(num_pictures)); + EXPECT_CALL(*mock_decoder_, GetPicSize()).WillOnce(Return(picture_size)); const size_t kNumReferenceFrames = num_pictures / 2; EXPECT_CALL(*mock_decoder_, GetNumReferenceFrames()) .WillOnce(Return(kNumReferenceFrames)); EXPECT_CALL(*mock_decoder_, GetVisibleRect()) .WillOnce(Return(gfx::Rect(picture_size))); + EXPECT_CALL(*mock_decoder_, GetProfile()) + .WillOnce(Return(GetParam().video_codec)); if (vda_.buffer_allocation_mode_ != VaapiVideoDecodeAccelerator::BufferAllocationMode::kNone) { EXPECT_CALL(*mock_vaapi_wrapper_, DestroyContextAndSurfaces(_));
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc index 7761c3e5..0655b5b 100644 --- a/media/gpu/vaapi/vaapi_video_decoder.cc +++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -124,6 +124,7 @@ decoder_ = nullptr; vaapi_wrapper_ = nullptr; + decoder_delegate_ = nullptr; SetState(State::kUninitialized); } @@ -236,16 +237,6 @@ } break; case AcceleratedVideoDecoder::kConfigChange: - if (profile_ != decoder_->GetProfile()) { - DVLOGF(3) << "Profile is changed: " << profile_ << " -> " - << decoder_->GetProfile(); - } - if (pic_size_ == decoder_->GetPicSize()) { - // Profile only is changed. - // TODO(crbug.com/1022246): Handle profile change. - SetState(State::kError); - break; - } // A new set of output buffers is requested. We either didn't have any // output buffers yet or encountered a resolution change. // After the pipeline flushes all frames, OnPipelineFlushed() will be @@ -401,7 +392,6 @@ const gfx::Rect visible_rect = decoder_->GetVisibleRect(); gfx::Size natural_size = GetNaturalSize(visible_rect, pixel_aspect_ratio_); pic_size_ = decoder_->GetPicSize(); - profile_ = decoder_->GetProfile(); const base::Optional<VideoPixelFormat> format = GfxBufferFormatToVideoPixelFormat(GetBufferFormat()); CHECK(format); @@ -413,7 +403,22 @@ // All pending decode operations will be completed before triggering a // resolution change, so we can safely destroy the context here. - vaapi_wrapper_->DestroyContext(); + if (profile_ != decoder_->GetProfile()) { + // When a profile is changed, we need to re-initialize VaapiWrapper. + profile_ = decoder_->GetProfile(); + auto new_vaapi_wrapper = VaapiWrapper::CreateForVideoCodec( + VaapiWrapper::kDecode, profile_, base::DoNothing()); + if (!new_vaapi_wrapper.get()) { + DLOG(WARNING) << "Failed creating VaapiWrapper"; + SetState(State::kError); + return; + } + decoder_delegate_->set_vaapi_wrapper(new_vaapi_wrapper.get()); + vaapi_wrapper_ = std::move(new_vaapi_wrapper); + } else { + vaapi_wrapper_->DestroyContext(); + } + vaapi_wrapper_->CreateContext(pic_size_); // If we reset during resolution change, then there is no decode tasks. In @@ -526,16 +531,25 @@ pic_size_ = gfx::Size(); if (profile_ >= H264PROFILE_MIN && profile_ <= H264PROFILE_MAX) { - decoder_.reset(new H264Decoder( - std::make_unique<H264VaapiVideoDecoderDelegate>(this, vaapi_wrapper_), - profile_, color_space_)); + auto accelerator = + std::make_unique<H264VaapiVideoDecoderDelegate>(this, vaapi_wrapper_); + decoder_delegate_ = accelerator.get(); + + decoder_.reset( + new H264Decoder(std::move(accelerator), profile_, color_space_)); } else if (profile_ >= VP8PROFILE_MIN && profile_ <= VP8PROFILE_MAX) { - decoder_.reset(new VP8Decoder( - std::make_unique<VP8VaapiVideoDecoderDelegate>(this, vaapi_wrapper_))); + auto accelerator = + std::make_unique<VP8VaapiVideoDecoderDelegate>(this, vaapi_wrapper_); + decoder_delegate_ = accelerator.get(); + + decoder_.reset(new VP8Decoder(std::move(accelerator))); } else if (profile_ >= VP9PROFILE_MIN && profile_ <= VP9PROFILE_MAX) { - decoder_.reset(new VP9Decoder( - std::make_unique<VP9VaapiVideoDecoderDelegate>(this, vaapi_wrapper_), - profile_, color_space_)); + auto accelerator = + std::make_unique<VP9VaapiVideoDecoderDelegate>(this, vaapi_wrapper_); + decoder_delegate_ = accelerator.get(); + + decoder_.reset( + new VP9Decoder(std::move(accelerator), profile_, color_space_)); } else { VLOGF(1) << "Unsupported profile " << GetProfileName(profile_); return false;
diff --git a/media/gpu/vaapi/vaapi_video_decoder.h b/media/gpu/vaapi/vaapi_video_decoder.h index 8e4f24e..01e282d 100644 --- a/media/gpu/vaapi/vaapi_video_decoder.h +++ b/media/gpu/vaapi/vaapi_video_decoder.h
@@ -33,6 +33,7 @@ namespace media { class AcceleratedVideoDecoder; +class VaapiVideoDecoderDelegate; class DmabufVideoFramePool; class VaapiWrapper; class VideoFrame; @@ -170,6 +171,9 @@ // Platform and codec specific video decoder. std::unique_ptr<AcceleratedVideoDecoder> decoder_; scoped_refptr<VaapiWrapper> vaapi_wrapper_; + // TODO(crbug.com/1022246): Instead of having the raw pointer here, getting + // the pointer from AcceleratedVideoDecoder. + VaapiVideoDecoderDelegate* decoder_delegate_ = nullptr; SEQUENCE_CHECKER(decoder_sequence_checker_);
diff --git a/media/gpu/vaapi/vaapi_video_decoder_delegate.cc b/media/gpu/vaapi/vaapi_video_decoder_delegate.cc index df101be..1c7ef80d 100644 --- a/media/gpu/vaapi/vaapi_video_decoder_delegate.cc +++ b/media/gpu/vaapi/vaapi_video_decoder_delegate.cc
@@ -24,4 +24,10 @@ // DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } +void VaapiVideoDecoderDelegate::set_vaapi_wrapper( + scoped_refptr<VaapiWrapper> vaapi_wrapper) { + DETACH_FROM_SEQUENCE(sequence_checker_); + vaapi_wrapper_ = std::move(vaapi_wrapper); +} + } // namespace media
diff --git a/media/gpu/vaapi/vaapi_video_decoder_delegate.h b/media/gpu/vaapi/vaapi_video_decoder_delegate.h index 71b1fd6..f8b825a 100644 --- a/media/gpu/vaapi/vaapi_video_decoder_delegate.h +++ b/media/gpu/vaapi/vaapi_video_decoder_delegate.h
@@ -16,12 +16,16 @@ class VASurface; // The common part of each AcceleratedVideoDecoder's Accelerator for VA-API. +// This class allows clients to reset VaapiWrapper in case of a profile change. +// DecodeSurfaceHandler must stay alive for the lifetime of this class. class VaapiVideoDecoderDelegate { public: VaapiVideoDecoderDelegate(DecodeSurfaceHandler<VASurface>* const vaapi_dec, scoped_refptr<VaapiWrapper> vaapi_wrapper); virtual ~VaapiVideoDecoderDelegate(); + void set_vaapi_wrapper(scoped_refptr<VaapiWrapper> vaapi_wrapper); + VaapiVideoDecoderDelegate(const VaapiVideoDecoderDelegate&) = delete; VaapiVideoDecoderDelegate& operator=(const VaapiVideoDecoderDelegate&) = delete; @@ -29,7 +33,7 @@ protected: // Both owned by caller. DecodeSurfaceHandler<VASurface>* const vaapi_dec_; - const scoped_refptr<VaapiWrapper> vaapi_wrapper_; + scoped_refptr<VaapiWrapper> vaapi_wrapper_; SEQUENCE_CHECKER(sequence_checker_); };
diff --git a/net/dns/mock_host_resolver.cc b/net/dns/mock_host_resolver.cc index 8fcd1e5..d66b8e4a 100644 --- a/net/dns/mock_host_resolver.cc +++ b/net/dns/mock_host_resolver.cc
@@ -892,7 +892,10 @@ r->address_family == address_family; // Ignore HOST_RESOLVER_SYSTEM_ONLY, since it should have no impact on // whether a rule matches. - HostResolverFlags flags = host_resolver_flags & ~HOST_RESOLVER_SYSTEM_ONLY; + HostResolverFlags flags = + host_resolver_flags & + (~HOST_RESOLVER_SYSTEM_ONLY & + ~HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6); // Flags match if all of the bitflags in host_resolver_flags are enabled // in the rule's host_resolver_flags. However, the rule may have additional // flags specified, in which case the flags should still be considered a
diff --git a/ppapi/tests/test_host_resolver.cc b/ppapi/tests/test_host_resolver.cc index 3bdbdc3..b0e8383 100644 --- a/ppapi/tests/test_host_resolver.cc +++ b/ppapi/tests/test_host_resolver.cc
@@ -118,10 +118,11 @@ const PP_HostResolver_Hint& hint) { pp::HostResolver host_resolver(instance_); - ASSERT_SUBTEST_SUCCESS(SyncResolve(&host_resolver, host_, port_, hint)); + ASSERT_SUBTEST_SUCCESS( + SyncResolve(&host_resolver, "host_resolver.test", port_, hint)); size_t size = host_resolver.GetNetAddressCount(); - ASSERT_TRUE(size >= 1); + ASSERT_EQ(1u, size); pp::NetAddress address; for (size_t i = 0; i < size; ++i) {
diff --git a/services/device/nfc/README.md b/services/device/nfc/README.md new file mode 100644 index 0000000..6058a73 --- /dev/null +++ b/services/device/nfc/README.md
@@ -0,0 +1,69 @@ +# NFC + +### High level Overview + +The implementation of Web NFC in Chromium consists of two main parts: +The NFC module in Blink located at `third_party/blink/renderer/modules/nfc/` which +contains Blink JavaScript bindings for Web NFC and the browser side platform +level adaptation that is located at `services/device/nfc`. The Blink NFC module +communicates with the browser adaptation through NFC Mojo interface defined in +the `services/device/public/mojom/nfc.mojom` file and implemented by the +`services/device/nfc` module. + +NDEFWriter and NDEFReader are the two primary interfaces of the Web NFC APIs. + +The NDEFWriter interface has the push method for writing data to NFC devices such as +tags. This method will return a promise, which will be resolved when the +message is successfully written to some target or be rejected when errors +happened or the process is aborted by setting the AbortSignal in the +NDEFPushOptions. + +The NDEFReader interface has the scan method to try to read data from any NFC device +that comes within proximity. Once there is some data found to be matching the +filtering criteria provided by web developers in NDEFScanOptions, an +NDEFReadingEvent carrying the data will be dispatched to the NDEFReader. + +The most important classes for Android adaptation are + +[NfcImpl](../../../services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java), +[NfcTagHandler](../../../services/device/nfc/android/java/src/org/chromium/device/nfc/NfcTagHandler.java) +and +[NdefMessageUtils](../../../services/device/nfc/android/java/src/org/chromium/device/nfc/NdefMessageUtils.java). + +## Web-exposed Interfaces + +### [NFC specification ](https://w3c.github.io/web-nfc/) + +## Testing: + +* Web platform tests are located in +`third_party/blink/web_tests/external/wpt/web-nfc/` and are a mirror of the +[web-platform-tests GitHub repository](https://github.com/web-platform-tests/wpt). +* NFC platform unit tests file for Android is +[NFCTest.java](../../../services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java) + + +## Security and Privacy + +Web NFC API can be only accessed by top-level secure browsing contexts and user +permission is required to access NFC functionality. Web NFC API specification +addresses security and privacy topics in chapter [7. Security and Privacy](https://w3c.github.io/web-nfc/#security). + + +## Permissions + +The device service provides no support for permission checks. When the render +process requests access to a NFC this request is proxied through the browser +process by [NfcPermissionContext](../../../chrome/browser/nfc/nfc_permission_context.h) +which is responsible for checking the permissions granted to the requesting origin. + + +## Platform Support + +At the time of writing, only Android platform is supported. + + +## Design Documents + +Please refer to the [design documentation](https://sites.google.com/a/chromium.org/dev/developers/design-documents/web-nfc) +for more details. \ No newline at end of file
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn index f3d07b9..49115e0f 100644 --- a/services/network/BUILD.gn +++ b/services/network/BUILD.gn
@@ -426,6 +426,8 @@ "test/test_cookie_manager.h", "test/test_data_pipe_getter.cc", "test/test_data_pipe_getter.h", + "test/test_dns_util.cc", + "test/test_dns_util.h", "test/test_network_connection_tracker.cc", "test/test_network_connection_tracker.h", "test/test_network_context.h",
diff --git a/services/network/origin_policy/origin_policy_parser.cc b/services/network/origin_policy/origin_policy_parser.cc index a6715760..62cf8cd8 100644 --- a/services/network/origin_policy/origin_policy_parser.cc +++ b/services/network/origin_policy/origin_policy_parser.cc
@@ -11,6 +11,7 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/values.h" +#include "services/network/public/cpp/isolation_opt_in_hints.h" #include "url/gurl.h" #include "url/origin.h" @@ -45,6 +46,14 @@ ParseFeatures(*features); } + if (base::Value* isolation = + json->FindKeyOfType("isolation", base::Value::Type::BOOLEAN)) { + if (isolation->GetBool()) + policy_contents_->isolation_optin_hints = IsolationOptInHints::NO_HINTS; + } else if (base::Value* isolation = json->FindDictKey("isolation")) { + ParseIsolation(*isolation); + } + return csp_ok; } @@ -81,4 +90,23 @@ } } +// The parsing is based on the example at +// https://github.com/domenic/origin-isolation#example. +void OriginPolicyParser::ParseIsolation(const base::Value& policy) { + IsolationOptInHints hints = IsolationOptInHints::NO_HINTS; + for (const auto& key_value : policy.DictItems()) { + // If we hit a key with a non-boolean value, skip it. + if (!key_value.second.is_bool()) + continue; + if (key_value.second.GetBool()) { + IsolationOptInHints dict_hint = + GetIsolationOptInHintFromString(key_value.first); + // If we hit a key we don't recognise, it will just return NO_HINTS and + // have no effect. + hints |= dict_hint; + } + } + policy_contents_->isolation_optin_hints = hints; +} + } // namespace network
diff --git a/services/network/origin_policy/origin_policy_parser.h b/services/network/origin_policy/origin_policy_parser.h index 99a8a30..2535cd56 100644 --- a/services/network/origin_policy/origin_policy_parser.h +++ b/services/network/origin_policy/origin_policy_parser.h
@@ -42,8 +42,9 @@ bool ParseContentSecurityPolicies(const base::Value&); bool ParseContentSecurityPolicy(const base::Value&); - // The following method is implemented according to the newer spec: + // The following methods are implemented according to the newer spec: void ParseFeatures(const base::Value&); + void ParseIsolation(const base::Value&); OriginPolicyContentsPtr policy_contents_;
diff --git a/services/network/origin_policy/origin_policy_parser_unittest.cc b/services/network/origin_policy/origin_policy_parser_unittest.cc index ff34d18..01b10d2 100644 --- a/services/network/origin_policy/origin_policy_parser_unittest.cc +++ b/services/network/origin_policy/origin_policy_parser_unittest.cc
@@ -3,6 +3,8 @@ // found in the LICENSE file. #include "services/network/origin_policy/origin_policy_parser.h" +#include "base/strings/stringprintf.h" +#include "services/network/public/cpp/isolation_opt_in_hints.h" #include "services/network/public/mojom/origin_policy_manager.mojom.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -228,4 +230,91 @@ ASSERT_FALSE(policy_contents->feature_policy.has_value()); } +namespace { + +void TestHintsHelper(const std::vector<std::string>& target_hints) { + std::string hints_substr; + for (auto hint_str : target_hints) { + hints_substr += base::StringPrintf("%s\"%s\": true", + (!hints_substr.empty() ? ", " : ""), + hint_str.c_str()); + } + std::string manifest_string = + base::StringPrintf("{ \"isolation\": { %s }}", hints_substr.c_str()); + auto policy_contents = OriginPolicyParser::Parse(manifest_string); + + ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value()); + for (auto target_hint_str : target_hints) { + IsolationOptInHints target_hint = + GetIsolationOptInHintFromString(target_hint_str); + EXPECT_EQ(target_hint, + target_hint & policy_contents->isolation_optin_hints.value()); + } +} + +} // namespace + +TEST(OriginPolicyParser, IsolationOptInNoIsolationKey) { + auto policy_contents = OriginPolicyParser::Parse(R"({})"); + ASSERT_FALSE(policy_contents->isolation_optin_hints.has_value()); +} + +TEST(OriginPolicyParser, IsolationOptInNoDict) { + auto policy_contents = OriginPolicyParser::Parse(R"({ "isolation": true })"); + ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value()); + EXPECT_EQ(IsolationOptInHints::NO_HINTS, + policy_contents->isolation_optin_hints.value()); + + ASSERT_FALSE(OriginPolicyParser::Parse(R"({ "isolation": false })") + ->isolation_optin_hints.has_value()); +} + +TEST(OriginPolicyParser, IsolationOptInEmptyDict) { + TestHintsHelper({}); +} + +TEST(OriginPolicyParser, IsolationOptInTestOneHint) { + TestHintsHelper({"prefer_isolated_event_loop"}); + TestHintsHelper({"prefer_isolated_memory"}); + TestHintsHelper({"for_side_channel_protection"}); + TestHintsHelper({"for_memory_measurement"}); +} + +TEST(OriginPolicyParser, IsolationOptInTestTwoHints) { + TestHintsHelper({"prefer_isolated_event_loop", "prefer_isolated_memory"}); + TestHintsHelper( + {"prefer_isolated_event_loop", "for_side_channel_protection"}); + TestHintsHelper({"prefer_isolated_event_loop", "for_memory_measurement"}); + TestHintsHelper({"prefer_isolated_memory", "for_side_channel_protection"}); + TestHintsHelper({"prefer_isolated_memory", "for_memory_measurement"}); + TestHintsHelper({"for_side_channel_protection", "for_memory_measurement"}); +} + +TEST(OriginPolicyParser, IsolationOptInTestThreeHints) { + TestHintsHelper({"prefer_isolated_event_loop", "prefer_isolated_memory", + "for_side_channel_protection"}); +} + +TEST(OriginPolicyParser, IsolationOptInIgnoreUnrecognisedKeys) { + std::string manifest_string = R"( { "isolation": { + "prefer_isolated_event_loop": true, + "foo": true } + } )"; + auto policy_contents = OriginPolicyParser::Parse(manifest_string); + ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value()); + EXPECT_EQ(IsolationOptInHints::PREFER_ISOLATED_EVENT_LOOP, + policy_contents->isolation_optin_hints.value()); +} + +TEST(OriginPolicyParser, IsolationOptInIgnoreFalseValues) { + std::string manifest_string = R"( { "isolation": { + "prefer_isolated_event_loop": false + } + } )"; + auto policy_contents = OriginPolicyParser::Parse(manifest_string); + ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value()); + EXPECT_EQ(IsolationOptInHints::NO_HINTS, + policy_contents->isolation_optin_hints.value()); +} + } // namespace network
diff --git a/services/network/public/cpp/BUILD.gn b/services/network/public/cpp/BUILD.gn index 463009c..5546dd8f 100644 --- a/services/network/public/cpp/BUILD.gn +++ b/services/network/public/cpp/BUILD.gn
@@ -124,6 +124,8 @@ "http_raw_request_response_info.h", "http_request_headers_mojom_traits.cc", "http_request_headers_mojom_traits.h", + "isolation_opt_in_hints.cc", + "isolation_opt_in_hints.h", "mutable_network_traffic_annotation_tag_mojom_traits.h", "mutable_partial_network_traffic_annotation_tag_mojom_traits.h", "net_ipc_param_traits.cc",
diff --git a/services/network/public/cpp/isolation_opt_in_hints.cc b/services/network/public/cpp/isolation_opt_in_hints.cc new file mode 100644 index 0000000..8453fcaa --- /dev/null +++ b/services/network/public/cpp/isolation_opt_in_hints.cc
@@ -0,0 +1,40 @@ +// 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 "services/network/public/cpp/isolation_opt_in_hints.h" + +#include <type_traits> + +namespace network { + +IsolationOptInHints GetIsolationOptInHintFromString( + const std::string& hint_str) { + if (hint_str == "prefer_isolated_event_loop") + return IsolationOptInHints::PREFER_ISOLATED_EVENT_LOOP; + if (hint_str == "prefer_isolated_memory") + return IsolationOptInHints::PREFER_ISOLATED_MEMORY; + if (hint_str == "for_side_channel_protection") + return IsolationOptInHints::FOR_SIDE_CHANNEL_PROTECTION; + if (hint_str == "for_memory_measurement") + return IsolationOptInHints::FOR_MEMORY_ISOLATION; + return IsolationOptInHints::NO_HINTS; +} + +IsolationOptInHints& operator|=(IsolationOptInHints& lhs, + IsolationOptInHints& rhs) { + lhs = static_cast<IsolationOptInHints>( + static_cast<std::underlying_type<IsolationOptInHints>::type>(lhs) | + static_cast<std::underlying_type<IsolationOptInHints>::type>(rhs)); + return lhs; +} + +IsolationOptInHints& operator&(IsolationOptInHints& lhs, + IsolationOptInHints& rhs) { + lhs = static_cast<IsolationOptInHints>( + static_cast<std::underlying_type<IsolationOptInHints>::type>(lhs) & + static_cast<std::underlying_type<IsolationOptInHints>::type>(rhs)); + return lhs; +} + +} // namespace network
diff --git a/services/network/public/cpp/isolation_opt_in_hints.h b/services/network/public/cpp/isolation_opt_in_hints.h new file mode 100644 index 0000000..26a19fe0 --- /dev/null +++ b/services/network/public/cpp/isolation_opt_in_hints.h
@@ -0,0 +1,40 @@ +// 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 SERVICES_NETWORK_PUBLIC_CPP_ISOLATION_OPT_IN_HINTS_H_ +#define SERVICES_NETWORK_PUBLIC_CPP_ISOLATION_OPT_IN_HINTS_H_ + +#include <string> + +#include "base/component_export.h" + +namespace network { + +// The following definitions correspond to the draft spec found here: +// https://github.com/domenic/origin-isolation#proposed-hints. +enum class IsolationOptInHints : unsigned { + NO_HINTS = 0x0, + PREFER_ISOLATED_EVENT_LOOP = 0x1, + PREFER_ISOLATED_MEMORY = 0x2, + FOR_SIDE_CHANNEL_PROTECTION = 0x4, + FOR_MEMORY_ISOLATION = 0x8 +}; + +// Converts hint strings into their corresponding IsolationOptInHints values. +// The hint strings are specified at +// https://github.com/domenic/origin-isolation#proposed-hints. +COMPONENT_EXPORT(NETWORK_CPP_BASE) +IsolationOptInHints GetIsolationOptInHintFromString( + const std::string& hint_str); + +COMPONENT_EXPORT(NETWORK_CPP_BASE) +IsolationOptInHints& operator|=(IsolationOptInHints& lhs, + IsolationOptInHints& rhs); + +COMPONENT_EXPORT(NETWORK_CPP_BASE) +IsolationOptInHints& operator&(IsolationOptInHints& lhs, + IsolationOptInHints& rhs); + +} // namespace network +#endif // SERVICES_NETWORK_PUBLIC_CPP_ISOLATION_OPT_IN_HINTS_H_
diff --git a/services/network/public/cpp/origin_policy.cc b/services/network/public/cpp/origin_policy.cc index cd6a2963..fd8481ce 100644 --- a/services/network/public/cpp/origin_policy.cc +++ b/services/network/public/cpp/origin_policy.cc
@@ -25,11 +25,13 @@ OriginPolicyContents::OriginPolicyContents( const base::Optional<std::string>& feature_policy, const std::vector<std::string>& content_security_policies, - const std::vector<std::string>& content_security_policies_report_only) + const std::vector<std::string>& content_security_policies_report_only, + const base::Optional<IsolationOptInHints>& isolation_optin_hints) : feature_policy(feature_policy), content_security_policies(content_security_policies), content_security_policies_report_only( - content_security_policies_report_only) {} + content_security_policies_report_only), + isolation_optin_hints(isolation_optin_hints) {} OriginPolicyContents& OriginPolicyContents::operator=( const OriginPolicyContents& other) = default; @@ -38,7 +40,8 @@ return feature_policy == other.feature_policy && content_security_policies == other.content_security_policies && content_security_policies_report_only == - other.content_security_policies_report_only; + other.content_security_policies_report_only && + isolation_optin_hints == other.isolation_optin_hints; } OriginPolicyContentsPtr OriginPolicyContents::ClonePtr() {
diff --git a/services/network/public/cpp/origin_policy.h b/services/network/public/cpp/origin_policy.h index d5e82d4..e40822df 100644 --- a/services/network/public/cpp/origin_policy.h +++ b/services/network/public/cpp/origin_policy.h
@@ -10,6 +10,7 @@ #include <vector> #include "base/optional.h" +#include "services/network/public/cpp/isolation_opt_in_hints.h" #include "url/gurl.h" namespace network { @@ -54,7 +55,8 @@ OriginPolicyContents( const base::Optional<std::string>& feature_policy, const std::vector<std::string>& content_security_policies, - const std::vector<std::string>& content_security_policies_report_only); + const std::vector<std::string>& content_security_policies_report_only, + const base::Optional<IsolationOptInHints>& isolation_optin_hints); OriginPolicyContents(const OriginPolicyContents& other); OriginPolicyContents& operator=(const OriginPolicyContents& other); @@ -83,6 +85,11 @@ // a "report" disposition. // https://w3c.github.io/webappsec-csp/#policy-disposition std::vector<std::string> content_security_policies_report_only; + + // This field, if present, indicates that the origin is opting in to + // origin-based isolation. The int contains zero or more flag bits indicating + // what the origin is hoping to achieve through isolation. + base::Optional<IsolationOptInHints> isolation_optin_hints; }; // Native implementation of mojom::OriginPolicy. This is done so we can pass
diff --git a/services/network/public/mojom/network_service_test.mojom b/services/network/public/mojom/network_service_test.mojom index bed4308a8..4528519e1 100644 --- a/services/network/public/mojom/network_service_test.mojom +++ b/services/network/public/mojom/network_service_test.mojom
@@ -22,6 +22,8 @@ ResolverType resolver_type; string host_pattern; string replacement; + int32 host_resolver_flags; + string canonical_name; }; // Testing interface to the network service.
diff --git a/services/network/quic_transport_unittest.cc b/services/network/quic_transport_unittest.cc index aa59685a..042fffdd88 100644 --- a/services/network/quic_transport_unittest.cc +++ b/services/network/quic_transport_unittest.cc
@@ -101,6 +101,23 @@ bool has_seen_mojo_connection_error_ = false; }; +class TestClient final : public mojom::QuicTransportClient { + public: + explicit TestClient( + mojo::PendingReceiver<mojom::QuicTransportClient> pending_receiver) + : receiver_(this, std::move(pending_receiver)) {} + + void WaitUntilMojoConnectionError() { + base::RunLoop run_loop; + + receiver_.set_disconnect_handler(run_loop.QuitClosure()); + run_loop.Run(); + } + + private: + mojo::Receiver<mojom::QuicTransportClient> receiver_; +}; + class QuicTransportTest : public testing::Test { public: QuicTransportTest() @@ -187,24 +204,28 @@ EXPECT_EQ(1u, network_context().NumOpenQuicTransports()); } -TEST_F(QuicTransportTest, ConnectWithError) { +TEST_F(QuicTransportTest, ConnectWithWrongOrigin) { base::RunLoop run_loop_for_handshake; mojo::PendingRemote<mojom::QuicTransportHandshakeClient> handshake_client; TestHandshakeClient test_handshake_client( handshake_client.InitWithNewPipeAndPassReceiver(), run_loop_for_handshake.QuitClosure()); - // This should fail due to the wrong origin CreateQuicTransport(GetURL("/discard"), url::Origin::Create(GURL("https://evil.com")), std::move(handshake_client)); run_loop_for_handshake.Run(); - // TODO(vasilvv): This should fail, but now succeeds due to a bug in net/. EXPECT_TRUE(test_handshake_client.has_seen_connection_establishment()); EXPECT_FALSE(test_handshake_client.has_seen_handshake_failure()); EXPECT_FALSE(test_handshake_client.has_seen_mojo_connection_error()); + + // Server resets the connection due to origin mismatch. + TestClient client(test_handshake_client.PassClientReceiver()); + client.WaitUntilMojoConnectionError(); + + EXPECT_EQ(0u, network_context().NumOpenQuicTransports()); } TEST_F(QuicTransportTest, SendDatagram) {
diff --git a/services/network/test/test_dns_util.cc b/services/network/test/test_dns_util.cc new file mode 100644 index 0000000..59487d8f --- /dev/null +++ b/services/network/test/test_dns_util.cc
@@ -0,0 +1,86 @@ +// 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 "services/network/test/test_dns_util.h" + +#include "base/bind.h" +#include "base/run_loop.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "net/base/host_port_pair.h" +#include "net/base/net_errors.h" +#include "net/base/network_isolation_key.h" +#include "services/network/public/mojom/network_context.mojom.h" + +namespace network { + +namespace { + +// Utility class that waits until a DNS resolve completes, and returns the +// resulting net::Error code. Expects there to only be one result on success. +class DnsLookupClient : public network::mojom::ResolveHostClient { + public: + explicit DnsLookupClient( + mojo::PendingReceiver<network::mojom::ResolveHostClient> receiver) + : receiver_(this, std::move(receiver)) { + receiver_.set_disconnect_handler(base::BindOnce( + &DnsLookupClient::OnComplete, base::Unretained(this), net::ERR_FAILED, + net::ResolveErrorInfo(net::ERR_FAILED), base::nullopt)); + } + ~DnsLookupClient() override = default; + + DnsLookupClient(const DnsLookupClient&) = delete; + DnsLookupClient& operator=(const DnsLookupClient&) = delete; + + DnsLookupResult WaitForResult() { + run_loop_.Run(); + return dns_lookup_result_; + } + + private: + // network::mojom::ResolveHostClient: + void OnComplete( + int32_t error, + const net::ResolveErrorInfo& resolve_error_info, + const base::Optional<net::AddressList>& resolved_addresses) override { + receiver_.reset(); + dns_lookup_result_.error = error; + dns_lookup_result_.resolve_error_info = resolve_error_info; + dns_lookup_result_.resolved_addresses = resolved_addresses; + run_loop_.Quit(); + } + void OnTextResults(const std::vector<std::string>& text_results) override { + NOTREACHED(); + } + void OnHostnameResults(const std::vector<net::HostPortPair>& hosts) override { + NOTREACHED(); + } + + private: + DnsLookupResult dns_lookup_result_; + + mojo::Receiver<network::mojom::ResolveHostClient> receiver_; + base::RunLoop run_loop_; +}; + +} // namespace + +DnsLookupResult::DnsLookupResult() = default; +DnsLookupResult::DnsLookupResult(const DnsLookupResult& dns_lookup_result) = + default; +DnsLookupResult::~DnsLookupResult() = default; + +DnsLookupResult BlockingDnsLookup( + mojom::NetworkContext* network_context, + const net::HostPortPair& host_port_pair, + network::mojom::ResolveHostParametersPtr params, + const net::NetworkIsolationKey& network_isolation_key) { + mojo::PendingRemote<network::mojom::ResolveHostClient> client; + DnsLookupClient dns_lookup_client(client.InitWithNewPipeAndPassReceiver()); + network_context->ResolveHost(host_port_pair, network_isolation_key, + std::move(params), std::move(client)); + return dns_lookup_client.WaitForResult(); +} + +} // namespace network
diff --git a/services/network/test/test_dns_util.h b/services/network/test/test_dns_util.h new file mode 100644 index 0000000..c033170 --- /dev/null +++ b/services/network/test/test_dns_util.h
@@ -0,0 +1,43 @@ +// 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 SERVICES_NETWORK_TEST_TEST_DNS_UTIL_H_ +#define SERVICES_NETWORK_TEST_TEST_DNS_UTIL_H_ + +#include <stdint.h> + +#include "base/optional.h" +#include "net/base/address_list.h" +#include "net/dns/public/resolve_error_info.h" +#include "services/network/public/mojom/host_resolver.mojom.h" + +namespace network { + +namespace mojom { +class NetworkContext; +} + +// Struct containing the results passed to a network::mojom::ResolveHostClient's +// OnComplete() method. +struct DnsLookupResult { + DnsLookupResult(); + DnsLookupResult(const DnsLookupResult& dns_lookup_result); + ~DnsLookupResult(); + + int32_t error; + net::ResolveErrorInfo resolve_error_info; + base::Optional<net::AddressList> resolved_addresses; +}; + +// Test utility function to perform the indicated DNS resolution, and block +// until complete. Only handles address results. +DnsLookupResult BlockingDnsLookup( + mojom::NetworkContext* network_context, + const net::HostPortPair& host_port_pair, + network::mojom::ResolveHostParametersPtr params, + const net::NetworkIsolationKey& network_isolation_key); + +} // namespace network + +#endif // SERVICES_NETWORK_TEST_TEST_DNS_UTIL_H_
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index 7874c294..94e9588a 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -211,10 +211,6 @@ #define SK_DISABLE_REDUCE_OPLIST_SPLITTING #endif -#ifndef SK_SUPPORT_LEGACY_CANVAS_MATRIX_33 -#define SK_SUPPORT_LEGACY_CANVAS_MATRIX_33 -#endif - #ifndef SK_IGNORE_LINEONLY_AA_CONVEX_PATH_OPTS #define SK_IGNORE_LINEONLY_AA_CONVEX_PATH_OPTS #endif
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 6d7747f..c91c0811 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -6688,7 +6688,7 @@ "--browser=android-chromium", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=VizDisplayCompositor,UseSkiaRenderer --use-gl=egl --enable-gpu-rasterization --force-gpu-rasterization --enable-oop-rasterization --disable-software-compositing-fallback --disable-headless-mode", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer --use-gl=egl --enable-gpu-rasterization --force-gpu-rasterization --enable-oop-rasterization --disable-software-compositing-fallback --disable-headless-mode", "--dont-restore-color-profile-after-test", "--build-revision", "${got_revision}",
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 3afd653..bc57759 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -2100,7 +2100,7 @@ '${got_revision}', '--test-machine-name', '${buildername}', - '--extra-browser-args=--enable-features=VizDisplayCompositor,UseSkiaRenderer --use-gl=egl --enable-gpu-rasterization --force-gpu-rasterization --enable-oop-rasterization --disable-software-compositing-fallback --disable-headless-mode', + '--extra-browser-args=--enable-features=UseSkiaRenderer --use-gl=egl --enable-gpu-rasterization --force-gpu-rasterization --enable-oop-rasterization --disable-software-compositing-fallback --disable-headless-mode', ], 'precommit_args': [ # Gerrit issue ID
diff --git a/testing/buildbot/tryserver.devtools-frontend.json b/testing/buildbot/tryserver.devtools-frontend.json index 805c3ba..823513d 100644 --- a/testing/buildbot/tryserver.devtools-frontend.json +++ b/testing/buildbot/tryserver.devtools-frontend.json
@@ -55,5 +55,59 @@ "test_target": "//:blink_web_tests" } ] + }, + "devtools_frontend_linux_blink_rel": { + "isolated_scripts": [ + { + "args": [ + "--num-retries=3", + "--layout-tests-directory=../../third_party/devtools-frontend/src/test/webtests/", + "http/tests/devtools" + ], + "isolate_name": "devtools_web_tests", + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "webkit_layout_from_devtools", + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-16.04" + } + ], + "shards": 4 + }, + "test_target": "//:devtools_web_tests" + }, + { + "args": [ + "--num-retries=3" + ], + "isolate_name": "blink_web_tests", + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "webkit_layout_tests", + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-16.04" + } + ], + "shards": 12 + }, + "test_target": "//:blink_web_tests" + } + ] } }
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index fc22554..aea9c83 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -4550,6 +4550,14 @@ 'isolated_scripts': 'devtools_webkit_isolated_scripts', }, }, + 'devtools_frontend_linux_blink_rel': { + 'mixins': [ + 'linux-xenial', + ], + 'test_suites': { + 'isolated_scripts': 'devtools_webkit_isolated_scripts', + }, + }, } }, {
diff --git a/third_party/android_build_tools/aapt2/README.chromium b/third_party/android_build_tools/aapt2/README.chromium index 247ef7fb..9dd0caad 100644 --- a/third_party/android_build_tools/aapt2/README.chromium +++ b/third_party/android_build_tools/aapt2/README.chromium
@@ -12,6 +12,4 @@ distributed here as a CIPD package instead. See cipd.yaml for details. Local Modifications: -ToT aapt2 branch:goog/master (@9a7341806913471f2f5ab5b2077ff09cdc9285ec) -This is after 3.6.0-alpha05 (latest released version at time of cut) but before -3.7.0-alpha01 (the next major version release). +Fetched prebuilt from go/aapt2-6089589 (version not yet published to maven).
diff --git a/third_party/blink/perf_tests/resources/runner.js b/third_party/blink/perf_tests/resources/runner.js index d1a99ac..a162af8f 100644 --- a/third_party/blink/perf_tests/resources/runner.js +++ b/third_party/blink/perf_tests/resources/runner.js
@@ -177,7 +177,12 @@ if (test.warmUpCount && test.warmUpCount > 0) completedIterations = -test.warmUpCount; logLines = PerfTestRunner.bufferedLog || window.testRunner ? [] : null; - PerfTestRunner.log("Running " + iterationCount + " times"); + + // Tests that run in workers are not impacted by the iteration control. + if (!currentTest.runInWorker) { + PerfTestRunner.log("Running " + iterationCount + " times"); + } + if (test.doNotIgnoreInitialRun) completedIterations++; @@ -245,7 +250,8 @@ function ignoreWarmUpAndLog(measuredValue) { var labeledResult = measuredValue + " " + PerfTestRunner.unit; - if (completedIterations <= 0) + // Tests that run in workers are not impacted by the iteration control. + if (!currentTest.runInWorker && completedIterations <= 0) PerfTestRunner.log("Ignoring warm-up run (" + labeledResult + ")"); else { results.push(measuredValue); @@ -454,5 +460,41 @@ PerfTestRunner.measureTime(test); } + // Used for tests that run in workers. + // 1. Call this method to trigger the test. It should be used together + // with |WorkerTestHelper.measureRunsPerSecond()| which is defined in + // src/third_party/blink/perf_tests/resources/worker-test-helper.js. + // 2. The iteration control parameters (test.iterationCount, + // test.doNotIgnoreInitialRun, and test.warmUpCount) are ignored. + // Use parameters of |measureRunsPerSecond()| to control iteration. + // 3. Test result should be sent to the page where the test is triggered. + // Then the result should be recorded by |recordResultFromWorker()| to + // finish the test. + PerfTestRunner.startMeasureValuesInWorker = function (test) { + PerfTestRunner.unit = test.unit; + test.runInWorker = true; + start(test, undefined, function() { test.run(); }); + } + + // Used for tests that run in workers. + // This method records the result posted from worker thread and finishes the test. + PerfTestRunner.recordResultFromWorker = function(result) { + if (result.error) { + PerfTestRunner.logFatalError(result.error); + return; + } + + try { + result.values.forEach((value) => { + ignoreWarmUpAndLog(value); + }); + } catch (exception) { + PerfTestRunner.logFatalError("Got an exception while logging the result with name=" + exception.name + ", message=" + exception.message); + return; + } + + finish(); + } + window.PerfTestRunner = PerfTestRunner; })();
diff --git a/third_party/blink/perf_tests/resources/worker-test-helper.js b/third_party/blink/perf_tests/resources/worker-test-helper.js new file mode 100644 index 0000000..b1c99dba --- /dev/null +++ b/third_party/blink/perf_tests/resources/worker-test-helper.js
@@ -0,0 +1,71 @@ +// This file defines helper methods for running performance tests in workers. + +(function () { + class WorkerTestHelper { + constructor() { + this.callsPerIteration = 1; + } + + // Measure the runs per second of test.run(). + // This method should be used together with + // |PerfTestRunner.startMeasureValuesInWorker| in + // src/third_party/blink/perf_tests/resources/runner.js. + // + // Arguments: + // |test.run| is the function to test. + // |test.setup| and |test.tearDown| are optional functions. + // |test.iterationCount| defines count of iterations to run. Default value + // is 5. + // + // Returns a promise that resolves to an object: + // |result.error|: The error string or null if no error occurs. + // |result.values|: An array of test result values. + async measureRunsPerSecond(test) { + this.test = test; + const values = []; + const iterationCount = + this.test.iterationCount ? this.test.iterationCount : 5; + + try { + if (this.test.setup) + await this.test.setup(); + for (let i = 0; i < iterationCount; i++) { + values.push(await this.measureRunsPerSecondOnce_()); + } + if (this.test.tearDown) + await this.test.tearDown(); + } catch (exception) { + const error = "Got an exception while running test with name=" + + exception.name + ", message=" + exception.message + "\n" + + exception.stack; + return { error: error, values: null }; + } + return { error: null, values: values }; + } + + // This method is basically the same with measureRunsPerSecondOnce() in + // src/third_party/blink/perf_tests/resources/runner.js + async measureRunsPerSecondOnce_() { + const timeToRun = 750; + let totalTime = 0; + let numberOfRuns = 0; + + while (totalTime < timeToRun) { + totalTime += await this.callRunAndMeasureTime_(); + numberOfRuns += this.callsPerIteration; + if (totalTime < 100) + this.callsPerIteration = Math.max(10, 2 * this.callsPerIteration); + } + return numberOfRuns * 1000 / totalTime; + }; + + async callRunAndMeasureTime_() { + var startTime = performance.now(); + for (let i = 0; i < this.callsPerIteration; i++) { + await this.test.run(); + } + return performance.now() - startTime; + } + } + self.workerTestHelper = new WorkerTestHelper(); +})();
diff --git a/third_party/blink/perf_tests/service_worker/cache-open-add-delete-10K.html b/third_party/blink/perf_tests/service_worker/cache-open-add-delete-10K.html new file mode 100644 index 0000000..e4ab9fe --- /dev/null +++ b/third_party/blink/perf_tests/service_worker/cache-open-add-delete-10K.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html> +<head> +<script src='../resources/runner.js'></script> +</head> +<body> +<script> + +function runTest() { + navigator.serviceWorker.addEventListener('message', (msg) => { + PerfTestRunner.recordResultFromWorker(msg.data); + }); + + const script = + '/service_worker/resources/cache-open-add-delete-10K-service-worker.js'; + const scope = '/service_worker/resources/'; + navigator.serviceWorker.register(script, { scope: scope }).catch((error) => { + PerfTestRunner.logFatalError( + 'Failed to register service worker script:' + script); + }); + return; +} + +PerfTestRunner.startMeasureValuesInWorker({ + description: 'Measure performance of open, add and delete operations of' + + 'cache with 10K sized file', + unit: 'runs/s', + run: runTest, +}); +</script> +</body> +</html>
diff --git a/third_party/blink/perf_tests/service_worker/cache-open-add-delete-1M.html b/third_party/blink/perf_tests/service_worker/cache-open-add-delete-1M.html new file mode 100644 index 0000000..4b209eed --- /dev/null +++ b/third_party/blink/perf_tests/service_worker/cache-open-add-delete-1M.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html> +<head> +<script src='../resources/runner.js'></script> +</head> +<body> +<script> + +function runTest() { + navigator.serviceWorker.addEventListener('message', (msg) => { + PerfTestRunner.recordResultFromWorker(msg.data); + }); + + const script = + '/service_worker/resources/cache-open-add-delete-1M-service-worker.js'; + const scope = '/service_worker/resources/'; + navigator.serviceWorker.register(script, { scope: scope }).catch((error) => { + PerfTestRunner.logFatalError( + 'Failed to register service worker script:' + script); + }); + return; +} + +PerfTestRunner.startMeasureValuesInWorker({ + description: 'Measure performance of open, add and delete operations of' + + ' cache with 1M sized file', + unit: 'runs/s', + run: runTest, +}); +</script> +</body> +</html>
diff --git a/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-10K-service-worker.js b/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-10K-service-worker.js new file mode 100644 index 0000000..4c24094b --- /dev/null +++ b/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-10K-service-worker.js
@@ -0,0 +1,29 @@ +importScripts('/resources/worker-test-helper.js'); + +// Send the result to all clients to finish the test. +function sendTestResultToClients(result) { + clients.matchAll({includeUncontrolled: true}).then((allClients) => { + for (const client of allClients) { + client.postMessage(result); + } + }); +} + +const CACHE_NAME = 'test-cache'; + +async function cacheOpenAddDelete() { + const cache = await caches.open(CACHE_NAME); + await cache.add('/service_worker/resources/data/10K.txt'); + await cache.delete(CACHE_NAME); +} + +async function test() { + const result = await self.workerTestHelper.measureRunsPerSecond({ + run: cacheOpenAddDelete + }); + sendTestResultToClients(result); +} + +self.addEventListener('install', function(event) { + event.waitUntil(test()); +});
diff --git a/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-1M-service-worker.js b/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-1M-service-worker.js new file mode 100644 index 0000000..5528bb9 --- /dev/null +++ b/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-1M-service-worker.js
@@ -0,0 +1,29 @@ +importScripts('/resources/worker-test-helper.js'); + +// Send the result to all clients to finish the test. +function sendTestResultToClients(result) { + clients.matchAll({includeUncontrolled: true}).then((allClients) => { + for (const client of allClients) { + client.postMessage(result); + } + }); +} + +const CACHE_NAME = 'test-cache'; + +async function cacheOpenAddDelete() { + const cache = await caches.open(CACHE_NAME); + await cache.add('/service_worker/resources/data/1M.txt'); + await cache.delete(CACHE_NAME); +} + +async function test() { + const result = await self.workerTestHelper.measureRunsPerSecond({ + run: cacheOpenAddDelete + }); + sendTestResultToClients(result); +} + +self.addEventListener('install', function(event) { + event.waitUntil(test()); +});
diff --git a/third_party/blink/public/common/input/web_keyboard_event.h b/third_party/blink/public/common/input/web_keyboard_event.h index 5f38e9e..939d2645 100644 --- a/third_party/blink/public/common/input/web_keyboard_event.h +++ b/third_party/blink/public/common/input/web_keyboard_event.h
@@ -34,7 +34,7 @@ int native_key_code = 0; // The DOM code enum of the key pressed as passed by the embedder. DOM code - // enums are defined in ui/events/keycodes/dom/keycode_converter_data.inc. + // enums are defined in ui/events/keycodes/dom/dom_code_data.inc. int dom_code = 0; // The DOM key enum of the key pressed as passed by the embedder. DOM
diff --git a/third_party/blink/renderer/bindings/bindings.gni b/third_party/blink/renderer/bindings/bindings.gni index c2e6aa7..07ae9d3 100644 --- a/third_party/blink/renderer/bindings/bindings.gni +++ b/third_party/blink/renderer/bindings/bindings.gni
@@ -29,7 +29,6 @@ "core/v8/custom/v8_event_target_custom.cc", "core/v8/custom/v8_html_all_collection_custom.cc", "core/v8/custom/v8_html_plugin_element_custom.cc", - "core/v8/custom/v8_message_channel_custom.cc", "core/v8/custom/v8_pop_state_event_custom.cc", "core/v8/custom/v8_promise_rejection_event_custom.cc", "core/v8/custom/v8_shadow_root_custom.cc",
diff --git a/third_party/blink/renderer/bindings/core/v8/custom/v8_message_channel_custom.cc b/third_party/blink/renderer/bindings/core/v8/custom/v8_message_channel_custom.cc deleted file mode 100644 index 8a162d0..0000000 --- a/third_party/blink/renderer/bindings/core/v8/custom/v8_message_channel_custom.cc +++ /dev/null
@@ -1,66 +0,0 @@ -/* - * Copyright (C) 2009 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "third_party/blink/renderer/bindings/core/v8/v8_message_channel.h" - -#include "base/memory/scoped_refptr.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_message_port.h" -#include "third_party/blink/renderer/core/messaging/message_channel.h" -#include "third_party/blink/renderer/core/workers/worker_global_scope.h" -#include "third_party/blink/renderer/platform/bindings/v8_private_property.h" - -namespace blink { - -const V8PrivateProperty::SymbolKey kPrivatePropertyPort1; -const V8PrivateProperty::SymbolKey kPrivatePropertyPort2; - -void V8MessageChannel::ConstructorCustom( - const v8::FunctionCallbackInfo<v8::Value>& info) { - v8::Isolate* isolate = info.GetIsolate(); - - ExecutionContext* context = CurrentExecutionContext(isolate); - auto* channel = MakeGarbageCollected<MessageChannel>(context); - - v8::Local<v8::Object> wrapper = info.Holder(); - - // Create references from the MessageChannel wrapper to the two - // MessagePort wrappers to make sure that the MessagePort wrappers - // stay alive as long as the MessageChannel wrapper is around. - V8PrivateProperty::GetSymbol(isolate, kPrivatePropertyPort1) - .Set(wrapper, ToV8(channel->port1(), wrapper, isolate)); - V8PrivateProperty::GetSymbol(isolate, kPrivatePropertyPort2) - .Set(wrapper, ToV8(channel->port2(), wrapper, isolate)); - - V8SetReturnValue(info, V8DOMWrapper::AssociateObjectWithWrapper( - isolate, channel, GetWrapperTypeInfo(), wrapper)); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/unpacked_serialized_script_value.cc b/third_party/blink/renderer/bindings/core/v8/serialization/unpacked_serialized_script_value.cc index 2582bba8..9ca40f1 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/unpacked_serialized_script_value.cc +++ b/third_party/blink/renderer/bindings/core/v8/serialization/unpacked_serialized_script_value.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" #include "third_party/blink/renderer/core/typed_arrays/dom_shared_array_buffer.h" +#include "third_party/blink/renderer/platform/heap/heap.h" namespace blink { @@ -33,11 +34,11 @@ auto& image_bitmap_contents = value_->image_bitmap_contents_array_; if (!image_bitmap_contents.IsEmpty()) { image_bitmaps_.Grow(image_bitmap_contents.size()); - std::transform(image_bitmap_contents.begin(), image_bitmap_contents.end(), - image_bitmaps_.begin(), - [](scoped_refptr<StaticBitmapImage>& contents) { - return ImageBitmap::Create(std::move(contents)); - }); + std::transform( + image_bitmap_contents.begin(), image_bitmap_contents.end(), + image_bitmaps_.begin(), [](scoped_refptr<StaticBitmapImage>& contents) { + return MakeGarbageCollected<ImageBitmap>(std::move(contents)); + }); image_bitmap_contents.clear(); } }
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc index cfd4024..f60eb2f 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc +++ b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc
@@ -359,8 +359,8 @@ // been deprecated. return nullptr; } - return ImageBitmap::Create(pixels, width, height, is_premultiplied, - origin_clean, color_params); + return MakeGarbageCollected<ImageBitmap>( + pixels, width, height, is_premultiplied, origin_clean, color_params); } case kImageBitmapTransferTag: { uint32_t index = 0;
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc index f95c979..991e382 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc
@@ -1015,7 +1015,7 @@ // Make a 10x7 red ImageBitmap. sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(10, 7); surface->getCanvas()->clear(SK_ColorRED); - ImageBitmap* image_bitmap = ImageBitmap::Create( + auto* image_bitmap = MakeGarbageCollected<ImageBitmap>( UnacceleratedStaticBitmapImage::Create(surface->makeImageSnapshot())); ASSERT_TRUE(image_bitmap->BitmapImage()); @@ -1047,7 +1047,7 @@ SkColorSpace::MakeRGB(SkNamedTransferFn::kLinear, SkNamedGamut::kDCIP3)); sk_sp<SkSurface> surface = SkSurface::MakeRaster(info); surface->getCanvas()->clear(SK_ColorRED); - ImageBitmap* image_bitmap = ImageBitmap::Create( + auto* image_bitmap = MakeGarbageCollected<ImageBitmap>( UnacceleratedStaticBitmapImage::Create(surface->makeImageSnapshot())); ASSERT_TRUE(image_bitmap->BitmapImage()); @@ -1283,8 +1283,8 @@ sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(10, 7); surface->getCanvas()->clear(SK_ColorRED); sk_sp<SkImage> image = surface->makeImageSnapshot(); - ImageBitmap* image_bitmap = - ImageBitmap::Create(UnacceleratedStaticBitmapImage::Create(image)); + auto* image_bitmap = MakeGarbageCollected<ImageBitmap>( + UnacceleratedStaticBitmapImage::Create(image)); ASSERT_TRUE(image_bitmap->BitmapImage()); v8::Local<v8::Value> wrapper = ToV8(image_bitmap, scope.GetScriptState());
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc index 6664bb4..aa94f0e 100644 --- a/third_party/blink/renderer/core/animation/animation.cc +++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -1474,7 +1474,8 @@ DCHECK(To<KeyframeEffect>(content_.Get())); DCHECK(std::isfinite(time_offset)); To<KeyframeEffect>(content_.Get()) - ->StartAnimationOnCompositor(compositor_group_, start_time, time_offset, + ->StartAnimationOnCompositor(compositor_group_, start_time, + base::TimeDelta::FromSecondsD(time_offset), EffectivePlaybackRate()); }
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.cc b/third_party/blink/renderer/core/animation/compositor_animations.cc index d7b1abb..be55dbb 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations.cc
@@ -334,7 +334,8 @@ } CompositorTiming out; - if (!ConvertTimingForCompositor(timing, 0, out, animation_playback_rate)) { + if (!ConvertTimingForCompositor(timing, base::TimeDelta(), out, + animation_playback_rate)) { reasons |= kEffectHasUnsupportedTimingParameters; } @@ -440,7 +441,7 @@ const Element& element, int group, base::Optional<double> start_time, - double time_offset, + base::TimeDelta time_offset, const Timing& timing, const Animation* animation, CompositorAnimation& compositor_animation, @@ -537,7 +538,7 @@ bool CompositorAnimations::ConvertTimingForCompositor( const Timing& timing, - double time_offset, + base::TimeDelta time_offset, CompositorTiming& out, double animation_playback_rate) { timing.AssertValid(); @@ -559,7 +560,7 @@ out.direction = timing.direction; // Compositor's time offset is positive for seeking into the animation. out.scaled_time_offset = - -timing.start_delay / animation_playback_rate + time_offset; + -timing.start_delay / animation_playback_rate + time_offset.InSecondsF(); out.playback_rate = animation_playback_rate; out.fill_mode = timing.fill_mode == Timing::FillMode::AUTO ? Timing::FillMode::NONE @@ -649,7 +650,7 @@ const Timing& timing, int group, base::Optional<double> start_time, - double time_offset, + base::TimeDelta time_offset, const KeyframeEffectModelBase& effect, Vector<std::unique_ptr<CompositorKeyframeModel>>& keyframe_models, double animation_playback_rate) {
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.h b/third_party/blink/renderer/core/animation/compositor_animations.h index 33c7f698..091cefe 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations.h +++ b/third_party/blink/renderer/core/animation/compositor_animations.h
@@ -113,7 +113,7 @@ const Element&, int group, base::Optional<double> start_time, - double time_offset, + base::TimeDelta time_offset, const Timing&, const Animation*, CompositorAnimation&, @@ -141,7 +141,7 @@ }; static bool ConvertTimingForCompositor(const Timing&, - double time_offset, + base::TimeDelta time_offset, CompositorTiming& out, double animation_playback_rate); @@ -150,7 +150,7 @@ const Timing&, int group, base::Optional<double> start_time, - double time_offset, + base::TimeDelta time_offset, const KeyframeEffectModelBase&, Vector<std::unique_ptr<CompositorKeyframeModel>>& animations, double animation_playback_rate);
diff --git a/third_party/blink/renderer/core/animation/compositor_animations_test.cc b/third_party/blink/renderer/core/animation/compositor_animations_test.cc index e05f7da7..d2140b3 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations_test.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
@@ -171,7 +171,8 @@ public: bool ConvertTimingForCompositor(const Timing& t, CompositorAnimations::CompositorTiming& out) { - return CompositorAnimations::ConvertTimingForCompositor(t, 0, out, 1); + return CompositorAnimations::ConvertTimingForCompositor( + t, base::TimeDelta(), out, 1); } CompositorAnimations::FailureReasons CanStartEffectOnCompositor( @@ -206,8 +207,8 @@ Vector<std::unique_ptr<CompositorKeyframeModel>>& keyframe_models, double animation_playback_rate) { CompositorAnimations::GetAnimationOnCompositor( - *element_, timing, 0, base::nullopt, 0, effect, keyframe_models, - animation_playback_rate); + *element_, timing, 0, base::nullopt, base::TimeDelta(), effect, + keyframe_models, animation_playback_rate); } CompositorAnimations::FailureReasons
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.cc b/third_party/blink/renderer/core/animation/keyframe_effect.cc index 108513a..2d0495a 100644 --- a/third_party/blink/renderer/core/animation/keyframe_effect.cc +++ b/third_party/blink/renderer/core/animation/keyframe_effect.cc
@@ -330,7 +330,7 @@ void KeyframeEffect::StartAnimationOnCompositor( int group, base::Optional<double> start_time, - double current_time, + base::TimeDelta time_offset, double animation_playback_rate, CompositorAnimation* compositor_animation) { DCHECK(!HasActiveAnimationsOnCompositor()); @@ -345,7 +345,7 @@ DCHECK(Model()); CompositorAnimations::StartAnimationOnCompositor( - *effect_target_, group, start_time, current_time, SpecifiedTiming(), + *effect_target_, group, start_time, time_offset, SpecifiedTiming(), GetAnimation(), *compositor_animation, *Model(), compositor_keyframe_model_ids_, animation_playback_rate); DCHECK(!compositor_keyframe_model_ids_.IsEmpty());
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.h b/third_party/blink/renderer/core/animation/keyframe_effect.h index 4e6139b04..da9d50b 100644 --- a/third_party/blink/renderer/core/animation/keyframe_effect.h +++ b/third_party/blink/renderer/core/animation/keyframe_effect.h
@@ -113,7 +113,7 @@ // Must only be called once. void StartAnimationOnCompositor(int group, base::Optional<double> start_time, - double time_offset, + base::TimeDelta time_offset, double animation_playback_rate, CompositorAnimation* = nullptr); bool HasActiveAnimationsOnCompositor() const;
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc index 303757f..32ede28 100644 --- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc +++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -342,6 +342,17 @@ return; } + if (IsA<HTMLSummaryElement>(element)) { + // <summary> should be a list item by default, but currently it's a block + // and the disclosure symbol is not a ::marker (bug 590014). If an author + // specifies 'display: list-item', the <summary> would seem to have two + // markers (the real one and the disclosure symbol). To avoid this, compute + // to 'display: block'. This adjustment should go away with bug 590014. + if (style.Display() == EDisplay::kListItem) + style.SetDisplay(EDisplay::kBlock); + return; + } + if (style.Display() == EDisplay::kContents) { // See https://drafts.csswg.org/css-display/#unbox-html // Some of these elements are handled with other adjustments above.
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc index 0a8a8ad..bfb4b28 100644 --- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc +++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -1303,7 +1303,8 @@ DCHECK(event_target.ToLocalDOMWindow()); return ImageBitmapSource::FulfillImageBitmap( - script_state, ImageBitmap::Create(this, crop_rect, options)); + script_state, + MakeGarbageCollected<ImageBitmap>(this, crop_rect, options)); } void HTMLCanvasElement::SetOffscreenCanvasResource(
diff --git a/third_party/blink/renderer/core/html/canvas/image_data.cc b/third_party/blink/renderer/core/html/canvas/image_data.cc index 704e0f29..f1ea89dc 100644 --- a/third_party/blink/renderer/core/html/canvas/image_data.cc +++ b/third_party/blink/renderer/core/html/canvas/image_data.cc
@@ -570,7 +570,8 @@ "The source data has been detached.")); } return ImageBitmapSource::FulfillImageBitmap( - script_state, ImageBitmap::Create(this, crop_rect, options)); + script_state, + MakeGarbageCollected<ImageBitmap>(this, crop_rect, options)); } v8::Local<v8::Object> ImageData::AssociateWithWrapper(
diff --git a/third_party/blink/renderer/core/html/canvas/image_element_base.cc b/third_party/blink/renderer/core/html/canvas/image_element_base.cc index 15abb2f3..879613ed 100644 --- a/third_party/blink/renderer/core/html/canvas/image_element_base.cc +++ b/third_party/blink/renderer/core/html/canvas/image_element_base.cc
@@ -165,7 +165,7 @@ script_state, options); } return ImageBitmapSource::FulfillImageBitmap( - script_state, ImageBitmap::Create( + script_state, MakeGarbageCollected<ImageBitmap>( this, crop_rect, event_target.ToLocalDOMWindow()->document(), options)); }
diff --git a/third_party/blink/renderer/core/html/forms/base_checkable_input_type.cc b/third_party/blink/renderer/core/html/forms/base_checkable_input_type.cc index 0f2a685..93da5c3 100644 --- a/third_party/blink/renderer/core/html/forms/base_checkable_input_type.cc +++ b/third_party/blink/renderer/core/html/forms/base_checkable_input_type.cc
@@ -55,11 +55,9 @@ return FormControlState(GetElement().checked() ? "on" : "off"); } -bool BaseCheckableInputType::RestoreFormControlState( +void BaseCheckableInputType::RestoreFormControlState( const FormControlState& state) { - bool old_checked = GetElement().checked(); GetElement().setChecked(state[0] == "on"); - return old_checked != GetElement().checked(); } void BaseCheckableInputType::AppendToFormData(FormData& form_data) const {
diff --git a/third_party/blink/renderer/core/html/forms/base_checkable_input_type.h b/third_party/blink/renderer/core/html/forms/base_checkable_input_type.h index 8b5fc1b..d9696d3 100644 --- a/third_party/blink/renderer/core/html/forms/base_checkable_input_type.h +++ b/third_party/blink/renderer/core/html/forms/base_checkable_input_type.h
@@ -57,7 +57,7 @@ private: InputTypeView* CreateView() override; FormControlState SaveFormControlState() const final; - bool RestoreFormControlState(const FormControlState&) final; + void RestoreFormControlState(const FormControlState&) final; void AppendToFormData(FormData&) const final; void HandleKeypressEvent(KeyboardEvent&) final; bool CanSetStringValue() const final;
diff --git a/third_party/blink/renderer/core/html/forms/file_input_type.cc b/third_party/blink/renderer/core/html/forms/file_input_type.cc index 83eb6be1..5e07aa0 100644 --- a/third_party/blink/renderer/core/html/forms/file_input_type.cc +++ b/third_party/blink/renderer/core/html/forms/file_input_type.cc
@@ -116,11 +116,9 @@ return state; } -bool FileInputType::RestoreFormControlState(const FormControlState& state) { - // Check if the state is broken. - // See File::AppendToControlState() and File::CreateFromControlState(). +void FileInputType::RestoreFormControlState(const FormControlState& state) { if (state.ValueSize() % 3) - return false; + return; HeapVector<Member<File>> file_vector = CreateFilesFrom<File*, HeapVector<Member<File>>>( state, &File::CreateFromControlState); @@ -128,9 +126,6 @@ for (const auto& file : file_vector) file_list->Append(file); SetFilesAndDispatchEvents(file_list); - // This function always returns false because SetFilesAndDispatchEvents() - // dispatches events if files are changed. - return false; } void FileInputType::AppendToFormData(FormData& form_data) const {
diff --git a/third_party/blink/renderer/core/html/forms/file_input_type.h b/third_party/blink/renderer/core/html/forms/file_input_type.h index 9cb288b..256a752 100644 --- a/third_party/blink/renderer/core/html/forms/file_input_type.h +++ b/third_party/blink/renderer/core/html/forms/file_input_type.h
@@ -67,7 +67,7 @@ InputTypeView* CreateView() override; const AtomicString& FormControlType() const override; FormControlState SaveFormControlState() const override; - bool RestoreFormControlState(const FormControlState&) override; + void RestoreFormControlState(const FormControlState&) override; void AppendToFormData(FormData&) const override; bool ValueMissing(const String&) const override; String ValueMissingText() const override;
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc index 7aa11b0..f8f5337 100644 --- a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc +++ b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc
@@ -276,17 +276,6 @@ return isConnected() && ShouldAutocomplete(); } -void HTMLFormControlElementWithState::QueueInputAndChangeEvents() { - auto task_runner = GetDocument().GetTaskRunner(TaskType::kUserInteraction); - task_runner->PostTask( - FROM_HERE, WTF::Bind(&HTMLFormControlElementWithState::DispatchInputEvent, - WrapWeakPersistent(this))); - task_runner->PostTask( - FROM_HERE, - WTF::Bind(&HTMLFormControlElementWithState::DispatchChangeEvent, - WrapWeakPersistent(this))); -} - void HTMLFormControlElementWithState::DispatchInputEvent() { // Legacy 'input' event for forms set value and checked. Event* event = Event::CreateBubble(event_type_names::kInput);
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h index 4c5f5b8..c023906 100644 --- a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h +++ b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h
@@ -57,8 +57,6 @@ bool user_has_edited_the_field_ = false; HTMLFormControlElementWithState(const QualifiedName& tag_name, Document&); - void QueueInputAndChangeEvents(); - void FinishParsingChildren() override; bool IsFormControlElementWithState() const final;
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc index bad6851..e25e24fe7 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -584,10 +584,8 @@ } void HTMLInputElement::RestoreFormControlState(const FormControlState& state) { - if (input_type_view_->RestoreFormControlState(state)) { - state_restored_ = true; - QueueInputAndChangeEvents(); - } + input_type_view_->RestoreFormControlState(state); + state_restored_ = true; } bool HTMLInputElement::CanStartSelection() const {
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.cc b/third_party/blink/renderer/core/html/forms/html_select_element.cc index a94e7f8..b25fcd2d 100644 --- a/third_party/blink/renderer/core/html/forms/html_select_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_select_element.cc
@@ -1187,13 +1187,6 @@ if (items_size == 0) return; - Vector<bool> old_selection(items_size); - for (wtf_size_t i = 0; i < items_size; ++i) { - if (auto* option = DynamicTo<HTMLOptionElement>(items[i].Get())) - old_selection[i] = option->Selected(); - else - old_selection[i] = false; - } SelectOption(nullptr, kDeselectOtherOptionsFlag); // The saved state should have at least one value and an index. @@ -1244,15 +1237,6 @@ } SetNeedsValidityCheck(); - - for (wtf_size_t i = 0; i < items_size; ++i) { - if (auto* option = DynamicTo<HTMLOptionElement>(items[i].Get())) { - if (old_selection[i] != option->Selected()) { - QueueInputAndChangeEvents(); - break; - } - } - } } void HTMLSelectElement::ParseMultipleAttribute(const AtomicString& value) {
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc index d93d48dd..78a93fe7 100644 --- a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
@@ -94,13 +94,7 @@ void HTMLTextAreaElement::RestoreFormControlState( const FormControlState& state) { - if (EqualIgnoringNullity(value(), state[0])) - return; - // We don't add kDispatchInputAndChangeEvent to setValue(), and we - // post tasks to dispatch events instead. This function can be called - // while we should not dispatch any events. setValue(state[0]); - QueueInputAndChangeEvents(); } void HTMLTextAreaElement::ChildrenChanged(const ChildrenChange& change) {
diff --git a/third_party/blink/renderer/core/html/forms/input_type_view.cc b/third_party/blink/renderer/core/html/forms/input_type_view.cc index 5eada37..ed41b3c 100644 --- a/third_party/blink/renderer/core/html/forms/input_type_view.cc +++ b/third_party/blink/renderer/core/html/forms/input_type_view.cc
@@ -177,10 +177,8 @@ return FormControlState(current_value); } -bool InputTypeView::RestoreFormControlState(const FormControlState& state) { - String old_value = GetElement().value(); +void InputTypeView::RestoreFormControlState(const FormControlState& state) { GetElement().setValue(state[0]); - return !EqualIgnoringNullity(old_value, GetElement().value()); } bool InputTypeView::HasBadInput() const {
diff --git a/third_party/blink/renderer/core/html/forms/input_type_view.h b/third_party/blink/renderer/core/html/forms/input_type_view.h index 5a190e03..ef47dea 100644 --- a/third_party/blink/renderer/core/html/forms/input_type_view.h +++ b/third_party/blink/renderer/core/html/forms/input_type_view.h
@@ -128,9 +128,7 @@ virtual void EnsurePrimaryContent() {} virtual bool HasFallbackContent() const { return false; } virtual FormControlState SaveFormControlState() const; - // Should return |true| if the value is changed and the callsite needs to - // dispatch 'input' and 'change' events. - virtual bool RestoreFormControlState(const FormControlState&); + virtual void RestoreFormControlState(const FormControlState&); // Validation functions virtual bool HasBadInput() const;
diff --git a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc index a30cb0a2..4e2cada7 100644 --- a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc +++ b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
@@ -527,18 +527,16 @@ edit->ReadOnlyStateChanged(); } -bool MultipleFieldsTemporalInputTypeView::RestoreFormControlState( +void MultipleFieldsTemporalInputTypeView::RestoreFormControlState( const FormControlState& state) { DateTimeEditElement* edit = GetDateTimeEditElement(); if (!edit) - return false; - String old_value = GetElement().value(); + return; DateTimeFieldsState date_time_fields_state = DateTimeFieldsState::RestoreFormControlState(state); edit->SetValueAsDateTimeFieldsState(date_time_fields_state); GetElement().SetNonAttributeValue(input_type_->SanitizeValue(edit->Value())); UpdateClearButtonVisibility(); - return !EqualIgnoringNullity(old_value, GetElement().value()); } FormControlState MultipleFieldsTemporalInputTypeView::SaveFormControlState()
diff --git a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.h b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.h index 4e21fa2f..7ec1c40 100644 --- a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.h +++ b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.h
@@ -107,7 +107,7 @@ void MinOrMaxAttributeChanged() final; void ReadonlyAttributeChanged() final; void RequiredAttributeChanged() final; - bool RestoreFormControlState(const FormControlState&) final; + void RestoreFormControlState(const FormControlState&) final; FormControlState SaveFormControlState() const final; void DidSetValue(const String&, bool value_changed) final; void StepAttributeChanged() final;
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type.cc b/third_party/blink/renderer/core/html/forms/password_input_type.cc index aa054d4..171ce120 100644 --- a/third_party/blink/renderer/core/html/forms/password_input_type.cc +++ b/third_party/blink/renderer/core/html/forms/password_input_type.cc
@@ -69,10 +69,9 @@ return FormControlState(); } -bool PasswordInputType::RestoreFormControlState(const FormControlState&) { +void PasswordInputType::RestoreFormControlState(const FormControlState&) { // Should never save/restore password fields. NOTREACHED(); - return false; } bool PasswordInputType::ShouldRespectListAttribute() {
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type.h b/third_party/blink/renderer/core/html/forms/password_input_type.h index 9195e2ae..10804fb4 100644 --- a/third_party/blink/renderer/core/html/forms/password_input_type.h +++ b/third_party/blink/renderer/core/html/forms/password_input_type.h
@@ -47,7 +47,7 @@ const AtomicString& FormControlType() const override; bool ShouldSaveAndRestoreFormControlState() const override; FormControlState SaveFormControlState() const override; - bool RestoreFormControlState(const FormControlState&) override; + void RestoreFormControlState(const FormControlState&) override; bool ShouldRespectListAttribute() override; bool NeedsContainer() const override;
diff --git a/third_party/blink/renderer/core/html/image_document.cc b/third_party/blink/renderer/core/html/image_document.cc index 4c43f28..0e8d812d 100644 --- a/third_party/blink/renderer/core/html/image_document.cc +++ b/third_party/blink/renderer/core/html/image_document.cc
@@ -174,13 +174,15 @@ loader->GetTiming().ResponseEnd(), GetDocument()->GetTaskRunner(TaskType::kInternalLoading).get()); - GetDocument()->UpdateTitle(); + if (GetDocument()->CachedImage()) { + GetDocument()->UpdateTitle(); - if (IsDetached()) - return; + if (IsDetached()) + return; - GetDocument()->ImageUpdated(); - GetDocument()->ImageLoaded(); + GetDocument()->ImageUpdated(); + GetDocument()->ImageLoaded(); + } } if (!IsDetached()) {
diff --git a/third_party/blink/renderer/core/html/image_document_test.cc b/third_party/blink/renderer/core/html/image_document_test.cc index d5287ce5..4e41609 100644 --- a/third_party/blink/renderer/core/html/image_document_test.cc +++ b/third_party/blink/renderer/core/html/image_document_test.cc
@@ -83,6 +83,7 @@ void CreateDocumentWithoutLoadingImage(int view_width, int view_height); void CreateDocument(int view_width, int view_height); + DocumentParser* StartLoadingImage(); void LoadImage(); ImageDocument& GetDocument() const; @@ -126,11 +127,16 @@ return *image_document; } -void ImageDocumentTest::LoadImage() { +DocumentParser* ImageDocumentTest::StartLoadingImage() { DocumentParser* parser = GetDocument().ImplicitOpen( ParserSynchronizationPolicy::kForceSynchronousParsing); const Vector<unsigned char>& data = JpegImage(); parser->AppendBytes(reinterpret_cast<const char*>(data.data()), data.size()); + return parser; +} + +void ImageDocumentTest::LoadImage() { + DocumentParser* parser = StartLoadingImage(); parser->Finish(); } @@ -223,6 +229,13 @@ EXPECT_FALSE(GetDocument().GetTiming().DomInteractive().is_null()); } +TEST_F(ImageDocumentTest, ImageSrcChangedBeforeFinish) { + CreateDocumentWithoutLoadingImage(80, 70); + DocumentParser* parser = StartLoadingImage(); + GetDocument().ImageElement()->removeAttribute(html_names::kSrcAttr); + parser->Finish(); +} + #if defined(OS_ANDROID) #define MAYBE(test) DISABLED_##test #else
diff --git a/third_party/blink/renderer/core/html/media/html_video_element.cc b/third_party/blink/renderer/core/html/media/html_video_element.cc index b4c0d7be..ceef40f 100644 --- a/third_party/blink/renderer/core/html/media/html_video_element.cc +++ b/third_party/blink/renderer/core/html/media/html_video_element.cc
@@ -685,7 +685,7 @@ } return ImageBitmapSource::FulfillImageBitmap( - script_state, ImageBitmap::Create( + script_state, MakeGarbageCollected<ImageBitmap>( this, crop_rect, event_target.ToLocalDOMWindow()->document(), options)); }
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc index 1c81530..3335f1d 100644 --- a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc +++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
@@ -21,6 +21,7 @@ #include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h" #include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h" #include "third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h" +#include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/image-decoders/image_decoder.h" #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h" #include "third_party/blink/renderer/platform/scheduler/public/worker_pool.h" @@ -909,67 +910,6 @@ -memory_usage_); } -ImageBitmap* ImageBitmap::Create(ImageElementBase* image, - base::Optional<IntRect> crop_rect, - Document* document, - const ImageBitmapOptions* options) { - return MakeGarbageCollected<ImageBitmap>(image, crop_rect, document, options); -} - -ImageBitmap* ImageBitmap::Create(HTMLVideoElement* video, - base::Optional<IntRect> crop_rect, - Document* document, - const ImageBitmapOptions* options) { - return MakeGarbageCollected<ImageBitmap>(video, crop_rect, document, options); -} - -ImageBitmap* ImageBitmap::Create(HTMLCanvasElement* canvas, - base::Optional<IntRect> crop_rect, - const ImageBitmapOptions* options) { - return MakeGarbageCollected<ImageBitmap>(canvas, crop_rect, options); -} - -ImageBitmap* ImageBitmap::Create(OffscreenCanvas* offscreen_canvas, - base::Optional<IntRect> crop_rect, - const ImageBitmapOptions* options) { - return MakeGarbageCollected<ImageBitmap>(offscreen_canvas, crop_rect, - options); -} - -ImageBitmap* ImageBitmap::Create(ImageData* data, - base::Optional<IntRect> crop_rect, - const ImageBitmapOptions* options) { - return MakeGarbageCollected<ImageBitmap>(data, crop_rect, options); -} - -ImageBitmap* ImageBitmap::Create(ImageBitmap* bitmap, - base::Optional<IntRect> crop_rect, - const ImageBitmapOptions* options) { - return MakeGarbageCollected<ImageBitmap>(bitmap, crop_rect, options); -} - -ImageBitmap* ImageBitmap::Create(scoped_refptr<StaticBitmapImage> image, - base::Optional<IntRect> crop_rect, - const ImageBitmapOptions* options) { - return MakeGarbageCollected<ImageBitmap>(std::move(image), crop_rect, - options); -} - -ImageBitmap* ImageBitmap::Create(scoped_refptr<StaticBitmapImage> image) { - return MakeGarbageCollected<ImageBitmap>(std::move(image)); -} - -ImageBitmap* ImageBitmap::Create(const void* pixel_data, - uint32_t width, - uint32_t height, - bool is_image_bitmap_premultiplied, - bool is_image_bitmap_origin_clean, - const CanvasColorParams& color_params) { - return MakeGarbageCollected<ImageBitmap>( - pixel_data, width, height, is_image_bitmap_premultiplied, - is_image_bitmap_origin_clean, color_params); -} - void ImageBitmap::ResolvePromiseOnOriginalThread( ScriptPromiseResolver* resolver, bool origin_clean, @@ -1091,7 +1031,7 @@ // static ImageBitmap* ImageBitmap::Take(ScriptPromiseResolver*, sk_sp<SkImage> image) { - return ImageBitmap::Create( + return MakeGarbageCollected<ImageBitmap>( UnacceleratedStaticBitmapImage::Create(std::move(image))); } @@ -1150,7 +1090,8 @@ base::Optional<IntRect> crop_rect, const ImageBitmapOptions* options) { return ImageBitmapSource::FulfillImageBitmap( - script_state, Create(this, crop_rect, options)); + script_state, + MakeGarbageCollected<ImageBitmap>(this, crop_rect, options)); } scoped_refptr<Image> ImageBitmap::GetSourceImageForCanvas(
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap.h b/third_party/blink/renderer/core/imagebitmap/image_bitmap.h index f4fde0b..485f878 100644 --- a/third_party/blink/renderer/core/imagebitmap/image_bitmap.h +++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap.h
@@ -40,48 +40,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static ImageBitmap* Create( - ImageElementBase*, - base::Optional<IntRect>, - Document*, - const ImageBitmapOptions* = ImageBitmapOptions::Create()); - static ImageBitmap* Create( - HTMLVideoElement*, - base::Optional<IntRect>, - Document*, - const ImageBitmapOptions* = ImageBitmapOptions::Create()); - static ImageBitmap* Create( - HTMLCanvasElement*, - base::Optional<IntRect>, - const ImageBitmapOptions* = ImageBitmapOptions::Create()); - static ImageBitmap* Create( - OffscreenCanvas*, - base::Optional<IntRect>, - const ImageBitmapOptions* = ImageBitmapOptions::Create()); - static ImageBitmap* Create( - ImageData*, - base::Optional<IntRect>, - const ImageBitmapOptions* = ImageBitmapOptions::Create()); - static ImageBitmap* Create( - ImageBitmap*, - base::Optional<IntRect>, - const ImageBitmapOptions* = ImageBitmapOptions::Create()); - static ImageBitmap* Create(scoped_refptr<StaticBitmapImage>); - static ImageBitmap* Create( - scoped_refptr<StaticBitmapImage>, - base::Optional<IntRect>, - const ImageBitmapOptions* = ImageBitmapOptions::Create()); - // This function is called by structured-cloning an ImageBitmap. - // isImageBitmapPremultiplied indicates whether the original ImageBitmap is - // premultiplied or not. - // isImageBitmapOriginClean indicates whether the original ImageBitmap is - // origin clean or not. - static ImageBitmap* Create(const void* pixel_data, - uint32_t width, - uint32_t height, - bool is_image_bitmap_premultiplied, - bool is_image_bitmap_origin_clean, - const CanvasColorParams&); static ScriptPromise CreateAsync( ImageElementBase*, base::Optional<IntRect>, @@ -93,23 +51,32 @@ ImageBitmap(ImageElementBase*, base::Optional<IntRect>, Document*, - const ImageBitmapOptions*); + const ImageBitmapOptions* = ImageBitmapOptions::Create()); ImageBitmap(HTMLVideoElement*, base::Optional<IntRect>, Document*, - const ImageBitmapOptions*); + const ImageBitmapOptions* = ImageBitmapOptions::Create()); ImageBitmap(HTMLCanvasElement*, base::Optional<IntRect>, - const ImageBitmapOptions*); + const ImageBitmapOptions* = ImageBitmapOptions::Create()); ImageBitmap(OffscreenCanvas*, base::Optional<IntRect>, - const ImageBitmapOptions*); - ImageBitmap(ImageData*, base::Optional<IntRect>, const ImageBitmapOptions*); - ImageBitmap(ImageBitmap*, base::Optional<IntRect>, const ImageBitmapOptions*); + const ImageBitmapOptions* = ImageBitmapOptions::Create()); + ImageBitmap(ImageData*, + base::Optional<IntRect>, + const ImageBitmapOptions* = ImageBitmapOptions::Create()); + ImageBitmap(ImageBitmap*, + base::Optional<IntRect>, + const ImageBitmapOptions* = ImageBitmapOptions::Create()); ImageBitmap(scoped_refptr<StaticBitmapImage>); ImageBitmap(scoped_refptr<StaticBitmapImage>, base::Optional<IntRect>, - const ImageBitmapOptions*); + const ImageBitmapOptions* = ImageBitmapOptions::Create()); + // This constructor may called by structured-cloning an ImageBitmap. + // isImageBitmapPremultiplied indicates whether the original ImageBitmap is + // premultiplied or not. + // isImageBitmapOriginClean indicates whether the original ImageBitmap is + // origin clean or not. ImageBitmap(const void* pixel_data, uint32_t width, uint32_t height,
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc index 4379d184..2b8b55a810 100644 --- a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc +++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
@@ -369,7 +369,8 @@ scoped_refptr<StaticBitmapImage> image = UnacceleratedStaticBitmapImage::Create(std::move(frame)); image->SetOriginClean(true); - ImageBitmap* image_bitmap = ImageBitmap::Create(image, crop_rect_, options_); + auto* image_bitmap = + MakeGarbageCollected<ImageBitmap>(image, crop_rect_, options_); if (image_bitmap && image_bitmap->BitmapImage()) { resolver_->Resolve(image_bitmap); } else {
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc index da835fe..f3b1a97 100644 --- a/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc +++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc
@@ -118,27 +118,27 @@ base::Optional<IntRect> crop_rect = IntRect(0, 0, image_->width(), image_->height()); - ImageBitmap* image_bitmap_no_crop = - ImageBitmap::Create(image_element, crop_rect, - &(image_element->GetDocument()), default_options); + auto* image_bitmap_no_crop = MakeGarbageCollected<ImageBitmap>( + image_element, crop_rect, &(image_element->GetDocument()), + default_options); ASSERT_TRUE(image_bitmap_no_crop); crop_rect = IntRect(image_->width() / 2, image_->height() / 2, image_->width() / 2, image_->height() / 2); - ImageBitmap* image_bitmap_interior_crop = - ImageBitmap::Create(image_element, crop_rect, - &(image_element->GetDocument()), default_options); + auto* image_bitmap_interior_crop = MakeGarbageCollected<ImageBitmap>( + image_element, crop_rect, &(image_element->GetDocument()), + default_options); ASSERT_TRUE(image_bitmap_interior_crop); crop_rect = IntRect(-image_->width() / 2, -image_->height() / 2, image_->width(), image_->height()); - ImageBitmap* image_bitmap_exterior_crop = - ImageBitmap::Create(image_element, crop_rect, - &(image_element->GetDocument()), default_options); + auto* image_bitmap_exterior_crop = MakeGarbageCollected<ImageBitmap>( + image_element, crop_rect, &(image_element->GetDocument()), + default_options); ASSERT_TRUE(image_bitmap_exterior_crop); crop_rect = IntRect(-image_->width(), -image_->height(), image_->width(), image_->height()); - ImageBitmap* image_bitmap_outside_crop = - ImageBitmap::Create(image_element, crop_rect, - &(image_element->GetDocument()), default_options); + auto* image_bitmap_outside_crop = MakeGarbageCollected<ImageBitmap>( + image_element, crop_rect, &(image_element->GetDocument()), + default_options); ASSERT_TRUE(image_bitmap_outside_crop); ASSERT_EQ(image_bitmap_no_crop->BitmapImage() @@ -190,7 +190,7 @@ const ImageBitmapOptions* default_options = ImageBitmapOptions::Create(); base::Optional<IntRect> crop_rect = IntRect(0, 0, image_->width(), image_->height()); - ImageBitmap* image_bitmap = ImageBitmap::Create( + auto* image_bitmap = MakeGarbageCollected<ImageBitmap>( image, crop_rect, &(image->GetDocument()), default_options); ASSERT_TRUE(image_bitmap); ASSERT_EQ( @@ -247,7 +247,7 @@ IntRect& rect, ImageBitmapOptions* options, bool is_texture_backed) { - ImageBitmap* image_bitmap = ImageBitmap::Create(bitmap, rect, options); + auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(bitmap, rect, options); EXPECT_TRUE(image_bitmap); EXPECT_EQ(image_bitmap->BitmapImage()->IsTextureBacked(), is_texture_backed); } @@ -264,7 +264,7 @@ scoped_refptr<StaticBitmapImage> bitmap = resource_provider->Snapshot(); ASSERT_TRUE(bitmap->IsTextureBacked()); - ImageBitmap* image_bitmap = ImageBitmap::Create(bitmap); + auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(bitmap); EXPECT_TRUE(image_bitmap); EXPECT_TRUE(image_bitmap->BitmapImage()->IsTextureBacked()); @@ -341,7 +341,7 @@ options->setColorSpaceConversion( ColorCorrectionTestUtils::ColorSpaceConversionToString( static_cast<ColorSpaceConversion>(conversion_iterator))); - ImageBitmap* image_bitmap = ImageBitmap::Create( + auto* image_bitmap = MakeGarbageCollected<ImageBitmap>( image_element, crop_rect, &(image_element->GetDocument()), options); ASSERT_TRUE(image_bitmap); sk_sp<SkImage> converted_image = @@ -400,7 +400,7 @@ options->setColorSpaceConversion( ColorCorrectionTestUtils::ColorSpaceConversionToString( kColorSpaceConversion_Preserve)); - ImageBitmap* source_image_bitmap = ImageBitmap::Create( + auto* source_image_bitmap = MakeGarbageCollected<ImageBitmap>( UnacceleratedStaticBitmapImage::Create(source_image), crop_rect, options); ASSERT_TRUE(source_image_bitmap); @@ -410,8 +410,8 @@ options->setColorSpaceConversion( ColorCorrectionTestUtils::ColorSpaceConversionToString( static_cast<ColorSpaceConversion>(conversion_iterator))); - ImageBitmap* image_bitmap = - ImageBitmap::Create(source_image_bitmap, crop_rect, options); + auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(source_image_bitmap, + crop_rect, options); ASSERT_TRUE(image_bitmap); sk_sp<SkImage> converted_image = image_bitmap->BitmapImage()->PaintImageForCurrentFrame().GetSkImage(); @@ -473,7 +473,7 @@ options->setColorSpaceConversion( ColorCorrectionTestUtils::ColorSpaceConversionToString( static_cast<ColorSpaceConversion>(conversion_iterator))); - ImageBitmap* image_bitmap = ImageBitmap::Create( + auto* image_bitmap = MakeGarbageCollected<ImageBitmap>( UnacceleratedStaticBitmapImage::Create(source_image), crop_rect, options); ASSERT_TRUE(image_bitmap); @@ -539,8 +539,8 @@ options->setColorSpaceConversion( ColorCorrectionTestUtils::ColorSpaceConversionToString( static_cast<ColorSpaceConversion>(conversion_iterator))); - ImageBitmap* image_bitmap = - ImageBitmap::Create(image_data, crop_rect, options); + auto* image_bitmap = + MakeGarbageCollected<ImageBitmap>(image_data, crop_rect, options); ASSERT_TRUE(image_bitmap); sk_sp<SkImage> converted_image = image_bitmap->BitmapImage()->PaintImageForCurrentFrame().GetSkImage(); @@ -587,8 +587,8 @@ // source: uint8, bitmap pixel format: default ImageBitmapOptions* options = ImageBitmapOptions::Create(); - ImageBitmap* image_bitmap = - ImageBitmap::Create(bitmap_image, bitmap_image->Rect(), options); + auto* image_bitmap = MakeGarbageCollected<ImageBitmap>( + bitmap_image, bitmap_image->Rect(), options); ASSERT_TRUE(image_bitmap); sk_sp<SkImage> sk_image_internal = @@ -597,8 +597,8 @@ // source: uint8, bitmap pixel format: uint8 options->setImagePixelFormat("uint8"); - ImageBitmap* image_bitmap_8888 = - ImageBitmap::Create(bitmap_image, bitmap_image->Rect(), options); + auto* image_bitmap_8888 = MakeGarbageCollected<ImageBitmap>( + bitmap_image, bitmap_image->Rect(), options); ASSERT_TRUE(image_bitmap_8888); sk_sp<SkImage> sk_image_internal_8888 = image_bitmap_8888->BitmapImage() ->PaintImageForCurrentFrame() @@ -621,7 +621,7 @@ // source: f16, bitmap pixel format: default ImageBitmapOptions* options_f16 = ImageBitmapOptions::Create(); - ImageBitmap* image_bitmap_f16 = ImageBitmap::Create( + auto* image_bitmap_f16 = MakeGarbageCollected<ImageBitmap>( bitmap_image_f16, bitmap_image_f16->Rect(), options_f16); ASSERT_TRUE(image_bitmap_f16); sk_sp<SkImage> sk_image_internal_f16 = @@ -630,7 +630,7 @@ // source: f16, bitmap pixel format: uint8 options_f16->setImagePixelFormat("uint8"); - ImageBitmap* image_bitmap_f16_8888 = ImageBitmap::Create( + auto* image_bitmap_f16_8888 = MakeGarbageCollected<ImageBitmap>( bitmap_image_f16, bitmap_image_f16->Rect(), options_f16); ASSERT_TRUE(image_bitmap_f16_8888); sk_sp<SkImage> sk_image_internal_f16_8888 = @@ -661,7 +661,7 @@ options->setColorSpaceConversion( ColorCorrectionTestUtils::ColorSpaceConversionToString( kColorSpaceConversion_Default)); - ImageBitmap* image_bitmap = ImageBitmap::Create( + auto* image_bitmap = MakeGarbageCollected<ImageBitmap>( image_data, IntRect(IntPoint(0, 0), image_data->Size()), options); DCHECK(image_bitmap); }
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index 985ecec8..c11aa24 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -2365,7 +2365,9 @@ CHECK(IsInLayoutNGInlineFormattingContext()) << *this; DCHECK(RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()); DCHECK_NE(index, 0u); - first_fragment_item_index_ = index; + // TDOO(yosin): Once we update all |LayoutObject::FirstInlineFragment()|, + // we should enable below. + // first_fragment_item_index_ = index; } void LayoutBox::InLayoutNGInlineFormattingContextWillChange(bool new_value) {
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc index 383705c..33064e0 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.cc +++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -171,7 +171,9 @@ CHECK(IsInLayoutNGInlineFormattingContext()) << *this; DCHECK(RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()); DCHECK_NE(index, 0u); - first_fragment_item_index_ = index; + // TDOO(yosin): Once we update all |LayoutObject::FirstInlineFragment()|, + // we should enable below. + // first_fragment_item_index_ = index; } void LayoutInline::InLayoutNGInlineFormattingContextWillChange(bool new_value) {
diff --git a/third_party/blink/renderer/core/layout/layout_object_test.cc b/third_party/blink/renderer/core/layout/layout_object_test.cc index 87b11ab..bc06001 100644 --- a/third_party/blink/renderer/core/layout/layout_object_test.cc +++ b/third_party/blink/renderer/core/layout/layout_object_test.cc
@@ -1064,7 +1064,8 @@ UpdateAllLifecyclePhasesForTest(); } -TEST_F(LayoutObjectTest, NeedsLayoutOverflowRecalc) { +// TODO(rego): Test is failing until we can fix https://crbug.com/941180. +TEST_F(LayoutObjectTest, DISABLED_NeedsLayoutOverflowRecalc) { if (!RuntimeEnabledFeatures::LayoutNGEnabled()) return;
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc index e9082e4..94d232c 100644 --- a/third_party/blink/renderer/core/layout/layout_text.cc +++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -222,13 +222,20 @@ for (InlineTextBox* box : TextBoxes()) box->Remove(); } else { - if (NGPaintFragment* first_inline_fragment = FirstInlineFragment()) { + if (RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) { + if (has_abstract_inline_text_box_) + ClearFirstInlineFragmentItemIndex(); + } else if (NGPaintFragment* first_inline_fragment = + FirstInlineFragment()) { first_inline_fragment->LayoutObjectWillBeDestroyed(); SetFirstInlineFragment(nullptr); } if (Parent()) Parent()->DirtyLinesFromChangedChild(this); } + } else if (RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) { + if (has_abstract_inline_text_box_) + ClearFirstInlineFragmentItemIndex(); } else if (NGPaintFragment* first_inline_fragment = FirstInlineFragment()) { // Still do this to clear the global hash map in NGAbstractInlineTextBox. SetFirstInlineFragment(nullptr); @@ -266,7 +273,20 @@ void LayoutText::DeleteTextBoxes() { if (!IsInLayoutNGInlineFormattingContext()) - MutableTextBoxes().DeleteLineBoxes(); + return MutableTextBoxes().DeleteLineBoxes(); + DetachAbstractInlineTextBoxesIfNeeded(); +} + +void LayoutText::DetachAbstractInlineTextBoxesIfNeeded() { + // TODO(layout-dev): Because We should call |WillDestroy()| once for + // associated fragments, when you reuse fragments, you should construct + // NGAbstractInlineTextBox for them. + if (!has_abstract_inline_text_box_) + return; + NGInlineCursor cursor; + for (cursor.MoveTo(*this); cursor; cursor.MoveToNextForSameLayoutObject()) + NGAbstractInlineTextBox::WillDestroy(cursor); + has_abstract_inline_text_box_ = false; } void LayoutText::SetFirstInlineFragment(NGPaintFragment* first_fragment) { @@ -275,20 +295,14 @@ // |!fragment|. DCHECK(!first_fragment || !RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()); - // TODO(layout-dev): Because We should call |WillDestroy()| once for - // associated fragments, when you reuse fragments, you should construct - // NGAbstractInlineTextBox for them. - if (has_abstract_inline_text_box_) { - for (NGPaintFragment* fragment : NGPaintFragment::InlineFragmentsFor(this)) - NGAbstractInlineTextBox::WillDestroy(fragment); - has_abstract_inline_text_box_ = false; - } + DetachAbstractInlineTextBoxesIfNeeded(); first_paint_fragment_ = first_fragment; } void LayoutText::ClearFirstInlineFragmentItemIndex() { CHECK(IsInLayoutNGInlineFormattingContext()) << *this; DCHECK(RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()); + DetachAbstractInlineTextBoxesIfNeeded(); first_fragment_item_index_ = 0u; } @@ -297,7 +311,10 @@ // TODO(yosin): Call |NGAbstractInlineTextBox::WillDestroy()|. DCHECK(RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()); DCHECK_NE(index, 0u); - first_fragment_item_index_ = index; + DetachAbstractInlineTextBoxesIfNeeded(); + // TDOO(yosin): Once we update all |LayoutObject::FirstInlineFragment()|, + // we should enable below. + // first_fragment_item_index_ = index; } void LayoutText::InLayoutNGInlineFormattingContextWillChange(bool new_value) { @@ -306,6 +323,10 @@ // Because |first_paint_fragment_| and |text_boxes_| are union, when one is // deleted, the other should be initialized to nullptr. DCHECK(new_value ? !first_paint_fragment_ : !text_boxes_.First()); + + // Because there are no inline boxes associated to this text, we should not + // have abstract inline text boxes too. + DCHECK(!has_abstract_inline_text_box_); } Vector<LayoutText::TextBoxInfo> LayoutText::GetTextBoxInfo() const { @@ -2420,12 +2441,10 @@ } scoped_refptr<AbstractInlineTextBox> LayoutText::FirstAbstractInlineTextBox() { - if (RuntimeEnabledFeatures::LayoutNGEnabled()) { - auto fragments = NGPaintFragment::InlineFragmentsFor(this); - if (!fragments.IsEmpty() && - fragments.IsInLayoutNGInlineFormattingContext()) { - return NGAbstractInlineTextBox::GetOrCreate(fragments.front()); - } + if (IsInLayoutNGInlineFormattingContext()) { + NGInlineCursor cursor; + cursor.MoveTo(*this); + return NGAbstractInlineTextBox::GetOrCreate(cursor); } return LegacyAbstractInlineTextBox::GetOrCreate(LineLayoutText(this), FirstTextBox());
diff --git a/third_party/blink/renderer/core/layout/layout_text.h b/third_party/blink/renderer/core/layout/layout_text.h index 3548afa..e5659229 100644 --- a/third_party/blink/renderer/core/layout/layout_text.h +++ b/third_party/blink/renderer/core/layout/layout_text.h
@@ -439,6 +439,7 @@ private: ContentCaptureManager* GetContentCaptureManager(); + void DetachAbstractInlineTextBoxesIfNeeded(); // Used for LayoutNG with accessibility. True if inline fragments are // associated to |NGAbstractInlineTextBox|.
diff --git a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_test.cc b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_test.cc index bd55b43..1be6411 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_test.cc
@@ -153,6 +153,21 @@ GetItemsAsString(*text.GetLayoutObject())); } +// http://crbug.com/1039143 +TEST_F(LayoutNGTextTest, SetTextWithOffsetDeleteWithBidiControl) { + if (!RuntimeEnabledFeatures::LayoutNGEnabled()) + return; + + // In text content, we have bidi control codes: + // U+2066 U+2069 \n U+2066 abc U+2066 + SetBodyInnerHTML(u"<pre><b id=target dir=ltr>\nabc</b></pre>"); + Text& text = To<Text>(*GetElementById("target")->firstChild()); + text.deleteData(0, 1, ASSERT_NO_EXCEPTION); // remove "\n" + + EXPECT_EQ("LayoutText has NeedsCollectInlines", + GetItemsAsString(*text.GetLayoutObject())); +} + TEST_F(LayoutNGTextTest, SetTextWithOffsetInsert) { if (!RuntimeEnabledFeatures::LayoutNGEnabled()) return;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.cc index 8a5f0a7..f832d0b 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.cc
@@ -5,7 +5,10 @@ #include "third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.h" #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h" +#include "third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h" +#include "third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_break_token.h" +#include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.h" #include "third_party/blink/renderer/core/paint/ng/ng_paint_fragment.h" @@ -16,38 +19,86 @@ namespace blink { -NGAbstractInlineTextBox::FragmentToNGAbstractInlineTextBoxHashMap* - NGAbstractInlineTextBox::g_abstract_inline_text_box_map_ = nullptr; +namespace { + +// Mapping from NGFragmentItem/NGPaintFragment to NGAbstractInlineTextBox +// TODO(yosin): Once we get rid of |NGPaintFragment|, we should not use +// template class for |NGAbstractInlineTextBoxCache|. +template <typename Fragment> +class NGAbstractInlineTextBoxCache final { + public: + static scoped_refptr<AbstractInlineTextBox> GetOrCreate( + const Fragment& fragment) { + if (!s_instance_) + s_instance_ = new NGAbstractInlineTextBoxCache(); + return s_instance_->GetOrCreateInternal(fragment); + } + + static void WillDestroy(const Fragment* fragment) { + if (!s_instance_) + return; + s_instance_->WillDestroyInternal(fragment); + } + + private: + scoped_refptr<AbstractInlineTextBox> GetOrCreateInternal( + const Fragment& fragment) { + const auto it = map_.find(&fragment); + LayoutText* const layout_text = + ToLayoutText(fragment.GetMutableLayoutObject()); + if (it != map_.end()) { + CHECK(layout_text->HasAbstractInlineTextBox()); + return it->value; + } + scoped_refptr<AbstractInlineTextBox> obj = base::AdoptRef( + new NGAbstractInlineTextBox(LineLayoutText(layout_text), fragment)); + map_.Set(&fragment, obj); + layout_text->SetHasAbstractInlineTextBox(); + return obj; + } + + void WillDestroyInternal(const Fragment* fragment) { + const auto it = map_.find(fragment); + if (it == map_.end()) + return; + it->value->Detach(); + map_.erase(fragment); + } + + static NGAbstractInlineTextBoxCache* s_instance_; + + HashMap<const Fragment*, scoped_refptr<AbstractInlineTextBox>> map_; +}; + +template <typename Fragment> +NGAbstractInlineTextBoxCache<Fragment>* + NGAbstractInlineTextBoxCache<Fragment>::s_instance_ = nullptr; + +} // namespace scoped_refptr<AbstractInlineTextBox> NGAbstractInlineTextBox::GetOrCreate( - const NGPaintFragment& fragment) { - DCHECK(fragment.GetLayoutObject()->IsText()) << fragment.GetLayoutObject(); - if (!g_abstract_inline_text_box_map_) { - g_abstract_inline_text_box_map_ = - new FragmentToNGAbstractInlineTextBoxHashMap(); + const NGInlineCursor& cursor) { + if (const NGPaintFragment* paint_fragment = cursor.CurrentPaintFragment()) { + return NGAbstractInlineTextBoxCache<NGPaintFragment>::GetOrCreate( + *paint_fragment); } - const auto it = g_abstract_inline_text_box_map_->find(&fragment); - LayoutText* const layout_text = - ToLayoutText(fragment.GetMutableLayoutObject()); - if (it != g_abstract_inline_text_box_map_->end()) { - CHECK(layout_text->HasAbstractInlineTextBox()); - return it->value; + if (const NGFragmentItem* fragment_item = cursor.CurrentItem()) { + return NGAbstractInlineTextBoxCache<NGFragmentItem>::GetOrCreate( + *fragment_item); } - scoped_refptr<AbstractInlineTextBox> obj = base::AdoptRef( - new NGAbstractInlineTextBox(LineLayoutText(layout_text), fragment)); - g_abstract_inline_text_box_map_->Set(&fragment, obj); - layout_text->SetHasAbstractInlineTextBox(); - return obj; + return nullptr; } -void NGAbstractInlineTextBox::WillDestroy(NGPaintFragment* fragment) { - if (!g_abstract_inline_text_box_map_) - return; - const auto it = g_abstract_inline_text_box_map_->find(fragment); - if (it != g_abstract_inline_text_box_map_->end()) { - it->value->Detach(); - g_abstract_inline_text_box_map_->erase(fragment); +void NGAbstractInlineTextBox::WillDestroy(const NGInlineCursor& cursor) { + if (const NGPaintFragment* paint_fragment = cursor.CurrentPaintFragment()) { + return NGAbstractInlineTextBoxCache<NGPaintFragment>::WillDestroy( + paint_fragment); } + if (const NGFragmentItem* fragment_item = cursor.CurrentItem()) { + return NGAbstractInlineTextBoxCache<NGFragmentItem>::WillDestroy( + fragment_item); + } + NOTREACHED(); } NGAbstractInlineTextBox::NGAbstractInlineTextBox( @@ -57,6 +108,13 @@ DCHECK(fragment_->PhysicalFragment().IsText()) << fragment_; } +NGAbstractInlineTextBox::NGAbstractInlineTextBox( + LineLayoutText line_layout_item, + const NGFragmentItem& fragment_item) + : AbstractInlineTextBox(line_layout_item), fragment_item_(&fragment_item) { + DCHECK(fragment_item_->IsText()) << fragment_item_; +} + NGAbstractInlineTextBox::~NGAbstractInlineTextBox() { DCHECK(!fragment_); } @@ -70,107 +128,126 @@ fragment_ = nullptr; } -const NGPhysicalTextFragment& NGAbstractInlineTextBox::PhysicalTextFragment() - const { - return To<NGPhysicalTextFragment>(fragment_->PhysicalFragment()); +NGInlineCursor NGAbstractInlineTextBox::GetCursor() const { + if (!fragment_item_) + return NGInlineCursor(); + NGInlineCursor cursor; + if (RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) + cursor.MoveTo(*fragment_item_); + else + cursor.MoveTo(*fragment_); + DCHECK(!cursor.CurrentLayoutObject()->NeedsLayout()); + return cursor; } -bool NGAbstractInlineTextBox::NeedsLayout() const { - return fragment_->GetLayoutObject()->NeedsLayout(); +NGInlineCursor NGAbstractInlineTextBox::GetCursorOnLine() const { + NGInlineCursor current = GetCursor(); + NGInlineCursor line_box = current; + line_box.MoveToContainingLine(); + NGInlineCursor cursor = line_box.CursorForDescendants(); + cursor.MoveTo(current); + return cursor; +} + +String NGAbstractInlineTextBox::GetTextContent() const { + const NGInlineCursor& cursor = GetCursor(); + if (cursor.IsGeneratedTextType()) + return cursor.CurrentText().ToString(); + if (const NGPaintFragment* paint_fragment = cursor.CurrentPaintFragment()) { + return To<NGPhysicalTextFragment>(paint_fragment->PhysicalFragment()) + .TextContent(); + } + return cursor.Items().Text(cursor.UsesFirstLineStyle()); } bool NGAbstractInlineTextBox::NeedsTrailingSpace() const { - if (!fragment_->Style().CollapseWhiteSpace()) + const NGInlineCursor& cursor = GetCursor(); + if (!cursor.CurrentStyle().CollapseWhiteSpace()) return false; - const NGPaintFragment& line_box = *fragment_->ContainerLineBox(); - if (!To<NGPhysicalLineBoxFragment>(line_box.PhysicalFragment()) - .HasSoftWrapToNextLine()) + NGInlineCursor line_box = cursor; + line_box.MoveToContainingLine(); + if (!line_box.HasSoftWrapToNextLine()) return false; - const NGPhysicalTextFragment& text_fragment = PhysicalTextFragment(); - if (text_fragment.EndOffset() >= text_fragment.TextContent().length()) + const String text_content = GetTextContent(); + const unsigned end_offset = cursor.CurrentTextEndOffset(); + if (end_offset >= text_content.length()) return false; - if (text_fragment.TextContent()[text_fragment.EndOffset()] != ' ') + if (text_content[end_offset] != ' ') return false; - const NGInlineBreakToken& break_token = *To<NGInlineBreakToken>( - To<NGPhysicalLineBoxFragment>(line_box.PhysicalFragment()).BreakToken()); + const NGInlineBreakToken& break_token = line_box.CurrentInlineBreakToken(); // TODO(yosin): We should support OOF fragments between |fragment_| and // break token. - if (break_token.TextOffset() != text_fragment.EndOffset() + 1) + if (break_token.TextOffset() != end_offset + 1) return false; // Check a character in text content after |fragment_| comes from same // layout text of |fragment_|. - const NGOffsetMapping* mapping = - NGOffsetMapping::GetFor(fragment_->GetLayoutObject()); + const LayoutObject* const layout_object = cursor.CurrentLayoutObject(); + const NGOffsetMapping* mapping = NGOffsetMapping::GetFor(layout_object); // TODO(kojii): There's not much we can do for dirty-tree. crbug.com/946004 if (!mapping) return false; const base::span<const NGOffsetMappingUnit> mapping_units = - mapping->GetMappingUnitsForTextContentOffsetRange( - text_fragment.EndOffset(), text_fragment.EndOffset() + 1); + mapping->GetMappingUnitsForTextContentOffsetRange(end_offset, + end_offset + 1); if (mapping_units.begin() == mapping_units.end()) return false; const NGOffsetMappingUnit& mapping_unit = mapping_units.front(); - return mapping_unit.GetLayoutObject() == fragment_->GetLayoutObject(); -} - -const NGPaintFragment* -NGAbstractInlineTextBox::NextTextFragmentForSameLayoutObject() const { - const auto fragments = - NGPaintFragment::InlineFragmentsFor(fragment_->GetLayoutObject()); - const auto it = - std::find_if(fragments.begin(), fragments.end(), - [&](const auto& sibling) { return fragment_ == sibling; }); - DCHECK(it != fragments.end()); - const auto next_it = std::next(it); - return next_it == fragments.end() ? nullptr : *next_it; + return mapping_unit.GetLayoutObject() == layout_object; } scoped_refptr<AbstractInlineTextBox> NGAbstractInlineTextBox::NextInlineTextBox() const { - if (!fragment_) + const NGInlineCursor& cursor = GetCursor(); + if (!cursor) return nullptr; - DCHECK(!NeedsLayout()); - const NGPaintFragment* next_fragment = NextTextFragmentForSameLayoutObject(); - if (!next_fragment) + NGInlineCursor next; + next.MoveTo(*cursor.CurrentLayoutObject()); + while (next != cursor) + next.MoveToNextForSameLayoutObject(); + next.MoveToNextForSameLayoutObject(); + if (!next) return nullptr; - return GetOrCreate(*next_fragment); + return GetOrCreate(next); } LayoutRect NGAbstractInlineTextBox::LocalBounds() const { - if (!fragment_ || !GetLineLayoutItem()) + const NGInlineCursor& cursor = GetCursor(); + if (!cursor) return LayoutRect(); - return LayoutRect(fragment_->InlineOffsetToContainerBox().ToLayoutPoint(), - fragment_->Size().ToLayoutSize()); + return cursor.CurrentRect().ToLayoutRect(); } unsigned NGAbstractInlineTextBox::Len() const { - if (!fragment_) + const NGInlineCursor& cursor = GetCursor(); + if (!cursor) return 0; if (NeedsTrailingSpace()) - return PhysicalTextFragment().TextLength() + 1; - return PhysicalTextFragment().TextLength(); + return cursor.CurrentText().length() + 1; + return cursor.CurrentText().length(); } unsigned NGAbstractInlineTextBox::TextOffsetInContainer(unsigned offset) const { - if (!fragment_) + const NGInlineCursor& cursor = GetCursor(); + if (!cursor) return 0; - return PhysicalTextFragment().StartOffset() + offset; + return cursor.CurrentTextStartOffset() + offset; } AbstractInlineTextBox::Direction NGAbstractInlineTextBox::GetDirection() const { - if (!fragment_ || !GetLineLayoutItem()) + const NGInlineCursor& cursor = GetCursor(); + if (!cursor) return kLeftToRight; - const TextDirection text_direction = - PhysicalTextFragment().ResolvedDirection(); + const TextDirection text_direction = cursor.CurrentResolvedDirection(); if (GetLineLayoutItem().Style()->IsHorizontalWritingMode()) return IsLtr(text_direction) ? kLeftToRight : kRightToLeft; return IsLtr(text_direction) ? kTopToBottom : kBottomToTop; } void NGAbstractInlineTextBox::CharacterWidths(Vector<float>& widths) const { - if (!fragment_) + const NGInlineCursor& cursor = GetCursor(); + if (!cursor) return; - if (!PhysicalTextFragment().TextShapeResult()) { + if (!cursor.CurrentTextShapeResult()) { // When |fragment_| for BR, we don't have shape result. // "aom-computed-boolean-properties.html" reaches here. widths.resize(Len()); @@ -178,8 +255,7 @@ } // TODO(layout-dev): Add support for IndividualCharacterRanges to // ShapeResultView to avoid the copy below. - auto shape_result = - PhysicalTextFragment().TextShapeResult()->CreateShapeResult(); + auto shape_result = cursor.CurrentTextShapeResult()->CreateShapeResult(); Vector<CharacterRange> ranges; shape_result->IndividualCharacterRanges(&ranges); widths.ReserveCapacity(ranges.size()); @@ -193,10 +269,11 @@ } String NGAbstractInlineTextBox::GetText() const { - if (!fragment_ || !GetLineLayoutItem()) - return String(); + const NGInlineCursor& cursor = GetCursor(); + if (!cursor) + return g_empty_string; - String result = PhysicalTextFragment().Text().ToString(); + String result = cursor.CurrentText().ToString(); // For compatibility with |InlineTextBox|, we should have a space character // for soft line break. @@ -217,56 +294,51 @@ } bool NGAbstractInlineTextBox::IsFirst() const { - if (!fragment_) + const NGInlineCursor& cursor = GetCursor(); + if (!cursor) return true; - DCHECK(!NeedsLayout()); - const auto fragments = - NGPaintFragment::InlineFragmentsFor(fragment_->GetLayoutObject()); - return fragment_ == &fragments.front(); + NGInlineCursor first_fragment; + first_fragment.MoveTo(*cursor.CurrentLayoutObject()); + return cursor == first_fragment; } bool NGAbstractInlineTextBox::IsLast() const { - if (!fragment_) + const NGInlineCursor& cursor = GetCursor(); + if (!cursor) return true; - DCHECK(!NeedsLayout()); - const auto fragments = - NGPaintFragment::InlineFragmentsFor(fragment_->GetLayoutObject()); - return fragment_ == &fragments.back(); + NGInlineCursor last_fragment; + last_fragment.MoveTo(*cursor.CurrentLayoutObject()); + last_fragment.MoveToLastForSameLayoutObject(); + return cursor == last_fragment; } scoped_refptr<AbstractInlineTextBox> NGAbstractInlineTextBox::NextOnLine() const { - if (!fragment_) + NGInlineCursor cursor = GetCursorOnLine(); + if (!cursor) return nullptr; - DCHECK(!NeedsLayout()); - DCHECK(fragment_->ContainerLineBox()); - NGPaintFragmentTraversal cursor(*fragment_->ContainerLineBox(), *fragment_); - for (cursor.MoveToNext(); !cursor.IsAtEnd(); cursor.MoveToNext()) { - if (cursor->GetLayoutObject()->IsText()) - return GetOrCreate(*cursor); + for (cursor.MoveToNext(); cursor; cursor.MoveToNext()) { + if (cursor.CurrentLayoutObject()->IsText()) + return GetOrCreate(cursor); } return nullptr; } scoped_refptr<AbstractInlineTextBox> NGAbstractInlineTextBox::PreviousOnLine() const { - if (!fragment_) + NGInlineCursor cursor = GetCursorOnLine(); + if (!cursor) return nullptr; - DCHECK(!NeedsLayout()); - DCHECK(fragment_->ContainerLineBox()); - NGPaintFragmentTraversal cursor(*fragment_->ContainerLineBox(), *fragment_); - for (cursor.MoveToPrevious(); !cursor.IsAtEnd(); cursor.MoveToPrevious()) { - if (cursor->GetLayoutObject()->IsText()) - return GetOrCreate(*cursor); + for (cursor.MoveToPrevious(); cursor; cursor.MoveToPrevious()) { + if (cursor.CurrentLayoutObject()->IsText()) + return GetOrCreate(cursor); } return nullptr; } bool NGAbstractInlineTextBox::IsLineBreak() const { - if (!fragment_) - return false; - DCHECK(!NeedsLayout()); - return PhysicalTextFragment().IsLineBreak(); + const NGInlineCursor& cursor = GetCursor(); + return cursor && cursor.IsLineBreak(); } } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.h b/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.h index 1f1d57d..7b49310e 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.h
@@ -9,34 +9,35 @@ namespace blink { +class NGFragmentItem; +class NGInlineCursor; class NGPaintFragment; -class NGPhysicalTextFragment; // The implementation of |AbstractInlineTextBox| for LayoutNG. // See also |LegacyAbstractInlineTextBox| for legacy layout. class CORE_EXPORT NGAbstractInlineTextBox final : public AbstractInlineTextBox { private: // Returns existing or newly created |NGAbstractInlineTextBox|. - // * |fragment| should be attached to |NGPhysicalTextFragment|. + // * |cursor| should be attached to |NGPhysicalTextFragment|. static scoped_refptr<AbstractInlineTextBox> GetOrCreate( - const NGPaintFragment& fragment); - static void WillDestroy(NGPaintFragment*); + const NGInlineCursor& cursor); + static void WillDestroy(const NGInlineCursor& cursor); friend class LayoutText; - friend class NGPaintFragment; public: + NGAbstractInlineTextBox(LineLayoutText line_layout_item, + const NGPaintFragment& fragment); + NGAbstractInlineTextBox(LineLayoutText line_layout_item, + const NGFragmentItem& fragment); + ~NGAbstractInlineTextBox() final; private: - NGAbstractInlineTextBox(LineLayoutText line_layout_item, - const NGPaintFragment& fragment); - - const NGPhysicalTextFragment& PhysicalTextFragment() const; - bool NeedsLayout() const; + NGInlineCursor GetCursor() const; + NGInlineCursor GetCursorOnLine() const; + String GetTextContent() const; bool NeedsTrailingSpace() const; - // Returns next fragment associated to |LayoutText|. - const NGPaintFragment* NextTextFragmentForSameLayoutObject() const; // Implementations of AbstractInlineTextBox member functions. void Detach() final; @@ -53,12 +54,10 @@ scoped_refptr<AbstractInlineTextBox> PreviousOnLine() const final; bool IsLineBreak() const final; - const NGPaintFragment* fragment_; - - using FragmentToNGAbstractInlineTextBoxHashMap = - HashMap<const NGPaintFragment*, scoped_refptr<AbstractInlineTextBox>>; - static FragmentToNGAbstractInlineTextBoxHashMap* - g_abstract_inline_text_box_map_; + union { + const NGPaintFragment* fragment_; + const NGFragmentItem* fragment_item_; + }; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc index 37edfc10..c8b43e8 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc
@@ -16,7 +16,7 @@ NGFragmentItem::NGFragmentItem(const NGPhysicalTextFragment& text) : layout_object_(text.GetLayoutObject()), - text_({text.TextShapeResult(), text.StartOffset(), text.EndOffset()}), + text_({text.TextShapeResult(), text.TextOffset()}), rect_({PhysicalOffset(), text.Size()}), type_(kText), sub_type_(static_cast<unsigned>(text.TextType())), @@ -25,11 +25,10 @@ is_hidden_for_paint_(text.IsHiddenForPaint()), text_direction_(static_cast<unsigned>(text.ResolvedDirection())), ink_overflow_computed_(false) { - DCHECK_LE(text_.start_offset, text_.end_offset); #if DCHECK_IS_ON() if (text_.shape_result) { - DCHECK_EQ(text_.shape_result->StartIndex(), text_.start_offset); - DCHECK_EQ(text_.shape_result->EndIndex(), text_.end_offset); + DCHECK_EQ(text_.shape_result->StartIndex(), StartOffset()); + DCHECK_EQ(text_.shape_result->EndIndex(), EndOffset()); } #endif if (text.TextType() == NGPhysicalTextFragment::kGeneratedText) { @@ -201,29 +200,19 @@ return nullptr; } -unsigned NGFragmentItem::StartOffset() const { +NGTextOffset NGFragmentItem::TextOffset() const { if (Type() == kText) - return text_.start_offset; + return text_.text_offset; if (Type() == kGeneratedText) - return 0; + return {0, generated_text_.text.length()}; NOTREACHED(); - return 0; -} - -unsigned NGFragmentItem::EndOffset() const { - if (Type() == kText) - return text_.end_offset; - if (Type() == kGeneratedText) - return generated_text_.text.length(); - NOTREACHED(); - return 0; + return {}; } StringView NGFragmentItem::Text(const NGFragmentItems& items) const { if (Type() == kText) { - DCHECK_LE(text_.start_offset, text_.end_offset); - return StringView(items.Text(UsesFirstLineStyle()), text_.start_offset, - text_.end_offset - text_.start_offset); + return StringView(items.Text(UsesFirstLineStyle()), text_.text_offset.start, + text_.text_offset.Length()); } if (Type() == kGeneratedText) return GeneratedText(); @@ -234,8 +223,8 @@ NGTextFragmentPaintInfo NGFragmentItem::TextPaintInfo( const NGFragmentItems& items) const { if (Type() == kText) { - return {items.Text(UsesFirstLineStyle()), text_.start_offset, - text_.end_offset, text_.shape_result.get()}; + return {items.Text(UsesFirstLineStyle()), text_.text_offset.start, + text_.text_offset.end, text_.shape_result.get()}; } if (Type() == kGeneratedText) { return {generated_text_.text, 0, generated_text_.text.length(),
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h index 7cee04b..bd4ebd7 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
@@ -11,6 +11,7 @@ #include "third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_line_height_metrics.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.h" +#include "third_party/blink/renderer/core/layout/ng/inline/ng_text_offset.h" #include "third_party/blink/renderer/core/layout/ng/ng_ink_overflow.h" #include "third_party/blink/renderer/platform/graphics/paint/display_item_client.h" @@ -33,8 +34,7 @@ // TODO(kojii): |start_offset| and |end_offset| should match to the offset // in |shape_result|. Consider if we should remove them, or if keeping them // is easier. - const unsigned start_offset; - const unsigned end_offset; + const NGTextOffset text_offset; }; // Represents text generated by the layout engine, e.g., hyphen or ellipsis. struct GeneratedTextItem { @@ -164,8 +164,6 @@ return nullptr; } - NGTextFragmentPaintInfo TextPaintInfo(const NGFragmentItems& items) const; - // DisplayItemClient overrides String DebugName() const override; IntRect VisualRect() const override; @@ -299,15 +297,16 @@ } const ShapeResultView* TextShapeResult() const; - - unsigned StartOffset() const; - unsigned EndOffset() const; - unsigned TextLength() const { return EndOffset() - StartOffset(); } + NGTextOffset TextOffset() const; + unsigned StartOffset() const { return TextOffset().start; } + unsigned EndOffset() const { return TextOffset().end; } + unsigned TextLength() const { return TextOffset().Length(); } StringView Text(const NGFragmentItems& items) const; String GeneratedText() const { DCHECK_EQ(Type(), kGeneratedText); return generated_text_.text; } + NGTextFragmentPaintInfo TextPaintInfo(const NGFragmentItems& items) const; // Compute the inline position from text offset, in logical coordinate // relative to this fragment.
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc index fa1d73a..0edf78c 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc
@@ -221,9 +221,7 @@ DCHECK(layout_object->IsInLayoutNGInlineFormattingContext()) << item; auto insert_result = last_fragment_map.insert(layout_object, index); if (insert_result.is_new_entry) { - // TDOO(yosin): Once we update all |LayoutObject::FirstInlineFragment()|, - // we should enable below. - // layout_object->SetFirstInlineFragmentItemIndex(index); + layout_object->SetFirstInlineFragmentItemIndex(index); continue; } const wtf_size_t last_index = insert_result.stored_value->value;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc index 0e8ccb3..54cbc22 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
@@ -535,10 +535,10 @@ if (current_paint_fragment_) { const auto& text_fragment = To<NGPhysicalTextFragment>(current_paint_fragment_->PhysicalFragment()); - return {text_fragment.StartOffset(), text_fragment.EndOffset()}; + return text_fragment.TextOffset(); } if (current_item_) - return {current_item_->StartOffset(), current_item_->EndOffset()}; + return current_item_->TextOffset(); NOTREACHED(); return {}; } @@ -724,6 +724,17 @@ MoveToNext(); } +void NGInlineCursor::MoveTo(const NGFragmentItem& fragment_item) { + DCHECK(!root_paint_fragment_ && !current_paint_fragment_); + MoveTo(*fragment_item.GetLayoutObject()); + while (IsNotNull()) { + if (CurrentItem() == &fragment_item) + return; + MoveToNext(); + } + NOTREACHED(); +} + void NGInlineCursor::MoveTo(const NGInlineCursor& cursor) { if (const NGPaintFragment* paint_fragment = cursor.CurrentPaintFragment()) { MoveTo(*paint_fragment);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h index 1bb12a8..f56d621 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h
@@ -175,11 +175,15 @@ // text and atomic inline. It is also error to call |IsGeneratedTextType()|. UBiDiLevel CurrentBidiLevel() const; + // Returns break token for line box. It is error to call other than line box. + const NGInlineBreakToken& CurrentInlineBreakToken() const; + // Returns text direction of current text or atomic inline. It is error to // call at other than text or atomic inline. Note: <span> doesn't have // reserved direction. TextDirection CurrentResolvedDirection() const; const ComputedStyle& CurrentStyle() const; + bool UsesFirstLineStyle() const; // InkOverflow of itself, including contents if they contribute to the ink // overflow of this object (e.g. when not clipped,) in the local coordinate. @@ -226,6 +230,9 @@ // Functions to move the current position. // + // Move the current position at |fragment_item|. + void MoveTo(const NGFragmentItem& fragment_item); + // Move the current position at |cursor|. Unlinke copy constrcutr, this // function doesn't copy root. Note: The current position in |cursor| // should be part of |this| cursor. @@ -256,6 +263,9 @@ // See also |TryToMoveToFirstChild()|. void MoveToLastChild(); + // Move the current position to the last fragment on same layout object. + void MoveToLastForSameLayoutObject(); + // Move to last logical leaf of current line box. If current line box has // no children, curosr becomes null. void MoveToLastLogicalLeaf(); @@ -308,12 +318,8 @@ // NextSkippingChildren, Previous, etc. private: - // Returns break token for line box. It is error to call other than line box. - const NGInlineBreakToken& CurrentInlineBreakToken() const; - // Returns style variant of the current position. NGStyleVariant CurrentStyleVariant() const; - bool UsesFirstLineStyle() const; // True if current position is part of culled inline box |layout_inline|. bool IsPartOfCulledInlineBox(const LayoutInline& layout_inline) const; @@ -329,9 +335,6 @@ // Move the cursor position to the first fragment in tree. void MoveToFirst(); - // Move the current position to the last fragment on same layout object. - void MoveToLastForSameLayoutObject(); - // Same as |MoveTo()| but not support culled inline. void InternalMoveTo(const LayoutObject& layout_object);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc index 419b2a1..5846660 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
@@ -528,6 +528,11 @@ if (layout_text_.StyleRef().TextSecurity() != ETextSecurity::kNone) return nullptr; + // It is hard to figure differences of bidi control codes before/after + // editing. See http://crbug.com/1039143 + if (layout_text_.HasBidiControlInlineItems()) + return nullptr; + // Note: We should compute offset mapping before calling // |LayoutBlockFlow::TakeNGInlineNodeData()| const NGOffsetMapping* const offset_mapping =
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.cc index 0ce9cc6..6ee489c 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.cc
@@ -46,11 +46,10 @@ kFragmentText, source.TextType()), text_(source.text_), - start_offset_(start_offset), - end_offset_(end_offset), + text_offset_(start_offset, end_offset), shape_result_(std::move(shape_result)) { - DCHECK_GE(start_offset_, source.StartOffset()); - DCHECK_LE(end_offset_, source.EndOffset()); + DCHECK_GE(text_offset_.start, source.StartOffset()); + DCHECK_LE(text_offset_.end, source.EndOffset()); DCHECK(shape_result_ || IsFlowControl()) << *this; is_generated_text_ = source.is_generated_text_; ink_overflow_computed_ = false; @@ -59,8 +58,7 @@ NGPhysicalTextFragment::NGPhysicalTextFragment(NGTextFragmentBuilder* builder) : NGPhysicalFragment(builder, kFragmentText, builder->text_type_), text_(builder->text_), - start_offset_(builder->start_offset_), - end_offset_(builder->end_offset_), + text_offset_({builder->start_offset_, builder->end_offset_}), shape_result_(std::move(builder->shape_result_)) { DCHECK(shape_result_ || IsFlowControl()) << *this; is_generated_text_ = builder->IsGeneratedText();
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.h b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.h index 731450a9..00e8ef2 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_INLINE_NG_PHYSICAL_TEXT_FRAGMENT_H_ #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/layout/ng/inline/ng_text_offset.h" #include "third_party/blink/renderer/core/layout/ng/ng_ink_overflow.h" #include "third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h" #include "third_party/blink/renderer/platform/fonts/ng_text_fragment_paint_info.h" @@ -70,18 +71,19 @@ bool IsSymbolMarker() const { return TextType() == kSymbolMarker; } - unsigned TextLength() const { return end_offset_ - start_offset_; } - StringView Text() const { - return StringView(text_, start_offset_, TextLength()); - } const String& TextContent() const { return text_; } // ShapeResult may be nullptr if |IsFlowControl()|. const ShapeResultView* TextShapeResult() const { return shape_result_.get(); } // Start/end offset to the text of the block container. - unsigned StartOffset() const { return start_offset_; } - unsigned EndOffset() const { return end_offset_; } + const NGTextOffset& TextOffset() const { return text_offset_; } + unsigned StartOffset() const { return text_offset_.start; } + unsigned EndOffset() const { return text_offset_.end; } + unsigned TextLength() const { return text_offset_.Length(); } + StringView Text() const { + return StringView(text_, text_offset_.start, TextLength()); + } WritingMode GetWritingMode() const { return Style().GetWritingMode(); } bool IsHorizontal() const { @@ -141,8 +143,7 @@ const String text_; // Start and end offset of the parent block text. - const unsigned start_offset_; - const unsigned end_offset_; + const NGTextOffset text_offset_; const scoped_refptr<const ShapeResultView> shape_result_; // Fragments are immutable but allow certain expensive data, specifically ink
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_text_offset.h b/third_party/blink/renderer/core/layout/ng/inline/ng_text_offset.h index e8132013..0d6c7251 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_text_offset.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_text_offset.h
@@ -5,6 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_INLINE_NG_TEXT_OFFSET_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_INLINE_NG_TEXT_OFFSET_H_ +#include "base/logging.h" #include "third_party/blink/renderer/core/core_export.h" namespace blink { @@ -13,10 +14,13 @@ struct CORE_EXPORT NGTextOffset { NGTextOffset() = default; NGTextOffset(unsigned start, unsigned end) : start(start), end(end) { - DCHECK_GE(end, start); + AssertValid(); } - unsigned Length() const { return end - start; } + unsigned Length() const { + AssertValid(); + return end - start; + } void AssertValid() const { DCHECK_GE(end, start); }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc index 794cd5e..57bd319d 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -896,7 +896,9 @@ // |ComputeOverflow()| below calls |AddVisualOverflowFromChildren()|, which // computes visual overflow from |RootInlineBox| if |ChildrenInline()| - block->SetNeedsVisualOverflowAndPaintInvalidation(); + // TODO(rego): This causes that ChildNeedsLayoutOverflowRecalc flags are not + // cleared after layout (see https://crbug.com/941180). + block->SetNeedsOverflowRecalc(); block->ComputeLayoutOverflow(intrinsic_block_size - borders.block_end - scrollbars.block_end); }
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc index 3ea0a06..0cd852e 100644 --- a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc +++ b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
@@ -265,10 +265,7 @@ RespectImageOrientationEnum should_respect_image_orientation) const { if (!image_) return IntSize(); - if (should_respect_image_orientation == kRespectImageOrientation && - image_->IsBitmapImage()) - return ToBitmapImage(image_.get())->SizeRespectingOrientation(); - return image_->Size(); + return image_->Size(should_respect_image_orientation); } void ImageResourceContent::NotifyObservers(
diff --git a/third_party/blink/renderer/core/messaging/blink_transferable_message_mojom_traits_test.cc b/third_party/blink/renderer/core/messaging/blink_transferable_message_mojom_traits_test.cc index b29bbeae..f92ff31 100644 --- a/third_party/blink/renderer/core/messaging/blink_transferable_message_mojom_traits_test.cc +++ b/third_party/blink/renderer/core/messaging/blink_transferable_message_mojom_traits_test.cc
@@ -20,6 +20,7 @@ #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h" +#include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/skia/include/core/SkBitmap.h" namespace blink { @@ -122,7 +123,7 @@ ImageBitmap* CreateBitmap() { sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(8, 4); surface->getCanvas()->clear(SK_ColorRED); - return ImageBitmap::Create( + return MakeGarbageCollected<ImageBitmap>( UnacceleratedStaticBitmapImage::Create(surface->makeImageSnapshot())); } @@ -178,8 +179,8 @@ ASSERT_EQ(out.message->GetImageBitmapContentsArray().size(), 1U); scoped_refptr<blink::StaticBitmapImage> deserialized_bitmap_contents = out.message->GetImageBitmapContentsArray()[0]; - ImageBitmap* deserialized_bitmap = - ImageBitmap::Create(std::move(deserialized_bitmap_contents)); + auto* deserialized_bitmap = MakeGarbageCollected<ImageBitmap>( + std::move(deserialized_bitmap_contents)); ASSERT_EQ(deserialized_bitmap->height(), original_bitmap_height); ASSERT_EQ(deserialized_bitmap->width(), original_bitmap_width); // When using WrapAsMessage, the deserialized bitmap should own
diff --git a/third_party/blink/renderer/core/messaging/message_channel.h b/third_party/blink/renderer/core/messaging/message_channel.h index 45fea2f..4ebbcc2 100644 --- a/third_party/blink/renderer/core/messaging/message_channel.h +++ b/third_party/blink/renderer/core/messaging/message_channel.h
@@ -40,6 +40,10 @@ DEFINE_WRAPPERTYPEINFO(); public: + static MessageChannel* Create(ExecutionContext* execution_context) { + return MakeGarbageCollected<MessageChannel>(execution_context); + } + explicit MessageChannel(ExecutionContext*); MessagePort* port1() const { return port1_; }
diff --git a/third_party/blink/renderer/core/messaging/message_channel.idl b/third_party/blink/renderer/core/messaging/message_channel.idl index ec70529..3990768 100644 --- a/third_party/blink/renderer/core/messaging/message_channel.idl +++ b/third_party/blink/renderer/core/messaging/message_channel.idl
@@ -27,10 +27,9 @@ // https://html.spec.whatwg.org/C/#message-channels [ - Exposed=(Window,Worker), - Measure + Exposed=(Window, Worker) ] interface MessageChannel { - [Custom] constructor(); + [CallWith=ExecutionContext, Measure] constructor(); readonly attribute MessagePort port1; readonly attribute MessagePort port2; };
diff --git a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc index 7a309ad..ffe91141 100644 --- a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc +++ b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
@@ -224,8 +224,9 @@ if (context_) context_->FinalizeFrame(); return ImageBitmapSource::FulfillImageBitmap( - script_state, - IsPaintable() ? ImageBitmap::Create(this, crop_rect, options) : nullptr); + script_state, IsPaintable() ? MakeGarbageCollected<ImageBitmap>( + this, crop_rect, options) + : nullptr); } bool OffscreenCanvas::IsOpaque() const {
diff --git a/third_party/blink/renderer/core/page/drag_controller.cc b/third_party/blink/renderer/core/page/drag_controller.cc index 38bf217..c9525304 100644 --- a/third_party/blink/renderer/core/page/drag_controller.cc +++ b/third_party/blink/renderer/core/page/drag_controller.cc
@@ -1073,25 +1073,17 @@ interpolation_quality = kInterpolationNone; } - RespectImageOrientationEnum should_respect_image_orientation = + RespectImageOrientationEnum respect_image_orientation = LayoutObject::ShouldRespectImageOrientation(element->GetLayoutObject()); - ImageOrientation orientation; - if (should_respect_image_orientation == kRespectImageOrientation && - image->IsBitmapImage()) - orientation = ToBitmapImage(image)->CurrentFrameOrientation(); - - IntSize image_size = orientation.UsesWidthAsHeight() - ? image->Size().TransposedSize() - : image->Size(); - + IntSize image_size = image->Size(respect_image_orientation); FloatSize image_scale = DragImage::ClampedImageScale(image_size, image_element_size_in_pixels, MaxDragImageSize(device_scale_factor)); if (image_size.Area() <= kMaxOriginalImageArea && (drag_image = DragImage::Create( - image, should_respect_image_orientation, device_scale_factor, + image, respect_image_orientation, device_scale_factor, interpolation_quality, kDragImageAlpha, image_scale))) { IntSize original_size = image_element_size_in_pixels; origin = image_element_location;
diff --git a/third_party/blink/renderer/core/paint/box_painter_base.cc b/third_party/blink/renderer/core/paint/box_painter_base.cc index 4bdeb41..6abea27 100644 --- a/third_party/blink/renderer/core/paint/box_painter_base.cc +++ b/third_party/blink/renderer/core/paint/box_painter_base.cc
@@ -558,9 +558,7 @@ const FloatSize intrinsic_tile_size = !has_intrinsic_size ? image_tile.Size() - : FloatSize(info.respect_image_orientation && image->IsBitmapImage() - ? ToBitmapImage(image)->SizeRespectingOrientation() - : image->Size()); + : FloatSize(image->Size(info.respect_image_orientation)); // Subset computation needs the same location as was used with // ComputePhaseForBackground above, but needs the unsnapped destination // size to correctly calculate sprite subsets in the presence of zoom. But if
diff --git a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc index 8d5848d..84a3aec 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc
@@ -781,7 +781,9 @@ } const NGPaintFragment* NGPaintFragment::Root() const { - DCHECK(PhysicalFragment().IsInline()); + // Because of this function can be called during |LayoutObject::Destroy()|, + // we use |physical_fragment_| to avoid calling |IsAlive()|. + DCHECK(physical_fragment_->IsInline()); const NGPaintFragment* root = this; for (const NGPaintFragment* fragment : NGPaintFragmentTraversal::InclusiveAncestorsOf(*this)) {
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc index 2a4e27a..ea5741e1 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -1681,14 +1681,6 @@ } } -static bool ImageWasTransposed(const LayoutImage& layout_image, - const Image& image) { - return LayoutObject::ShouldRespectImageOrientation(&layout_image) == - kRespectImageOrientation && - image.IsBitmapImage() && - ToBitmapImage(image).CurrentFrameOrientation().UsesWidthAsHeight(); -} - static AffineTransform RectToRect(const FloatRect& src_rect, const FloatRect& dst_rect) { float x_scale = dst_rect.Width() / src_rect.Width(); @@ -1717,9 +1709,9 @@ scoped_refptr<Image> image = layout_image.ImageResource()->GetImage(replaced_rect.Size()); if (image && !image->IsNull()) { - IntRect src_rect = image->Rect(); - if (ImageWasTransposed(layout_image, *image)) - src_rect = src_rect.TransposedRect(); + IntRect src_rect( + IntPoint(), image->Size(LayoutObject::ShouldRespectImageOrientation( + &layout_image))); content_to_parent_space = RectToRect(FloatRect(src_rect), FloatRect(replaced_rect)); }
diff --git a/third_party/blink/renderer/core/streams/underlying_sink_base.h b/third_party/blink/renderer/core/streams/underlying_sink_base.h index 900dcbf..5e2a020 100644 --- a/third_party/blink/renderer/core/streams/underlying_sink_base.h +++ b/third_party/blink/renderer/core/streams/underlying_sink_base.h
@@ -13,6 +13,7 @@ namespace blink { +class ExceptionState; class ScriptValue; class ScriptState; @@ -26,22 +27,29 @@ // |controller| and are called from IDL. Also we define virtual |start| and // |write| which take WritableStreamDefaultController. virtual ScriptPromise start(ScriptState*, - WritableStreamDefaultController*) = 0; + WritableStreamDefaultController*, + ExceptionState&) = 0; virtual ScriptPromise write(ScriptState*, ScriptValue chunk, - WritableStreamDefaultController*) = 0; - virtual ScriptPromise close(ScriptState*) = 0; - virtual ScriptPromise abort(ScriptState*, ScriptValue reason) = 0; + WritableStreamDefaultController*, + ExceptionState&) = 0; + virtual ScriptPromise close(ScriptState*, ExceptionState&) = 0; + virtual ScriptPromise abort(ScriptState*, + ScriptValue reason, + ExceptionState&) = 0; - ScriptPromise start(ScriptState* script_state, ScriptValue controller) { + ScriptPromise start(ScriptState* script_state, + ScriptValue controller, + ExceptionState& exception_state) { controller_ = WritableStreamDefaultController::From(controller); - return start(script_state, controller_); + return start(script_state, controller_, exception_state); } ScriptPromise write(ScriptState* script_state, ScriptValue chunk, - ScriptValue controller) { + ScriptValue controller, + ExceptionState& exception_state) { DCHECK(controller_); - return write(script_state, chunk, controller_); + return write(script_state, chunk, controller_, exception_state); } void Trace(Visitor* visitor) override {
diff --git a/third_party/blink/renderer/core/streams/underlying_sink_base.idl b/third_party/blink/renderer/core/streams/underlying_sink_base.idl index 288fd47..250a8ac 100644 --- a/third_party/blink/renderer/core/streams/underlying_sink_base.idl +++ b/third_party/blink/renderer/core/streams/underlying_sink_base.idl
@@ -10,8 +10,8 @@ NoInterfaceObject ] interface UnderlyingSinkBase { - [CallWith=ScriptState] Promise<void> start(any controller); - [CallWith=ScriptState] Promise<void> write(any chunk, any controller); - [CallWith=ScriptState] Promise<void> close(); - [CallWith=ScriptState] Promise<void> abort(any reason); + [CallWith=ScriptState, RaisesException] Promise<void> start(any controller); + [CallWith=ScriptState, RaisesException] Promise<void> write(any chunk, any controller); + [CallWith=ScriptState, RaisesException] Promise<void> close(); + [CallWith=ScriptState, RaisesException] Promise<void> abort(any reason); };
diff --git a/third_party/blink/renderer/core/style/style_fetched_image.cc b/third_party/blink/renderer/core/style/style_fetched_image.cc index 544ac22..91860f7 100644 --- a/third_party/blink/renderer/core/style/style_fetched_image.cc +++ b/third_party/blink/renderer/core/style/style_fetched_image.cc
@@ -119,9 +119,7 @@ default_object_size); } - FloatSize size(respect_orientation && image->IsBitmapImage() - ? ToBitmapImage(image)->SizeRespectingOrientation() - : image->Size()); + FloatSize size(image->Size(respect_orientation)); return ApplyZoom(size, multiplier); }
diff --git a/third_party/blink/renderer/core/style/style_fetched_image_set.cc b/third_party/blink/renderer/core/style/style_fetched_image_set.cc index 2ab8636..3aab696a 100644 --- a/third_party/blink/renderer/core/style/style_fetched_image_set.cc +++ b/third_party/blink/renderer/core/style/style_fetched_image_set.cc
@@ -103,10 +103,7 @@ return ImageSizeForSVGImage(ToSVGImage(image), multiplier, default_object_size); } - FloatSize natural_size(respect_orientation == kRespectImageOrientation && - image->IsBitmapImage() - ? ToBitmapImage(image)->SizeRespectingOrientation() - : image->Size()); + FloatSize natural_size(image->Size(respect_orientation)); FloatSize scaled_image_size(ApplyZoom(natural_size, multiplier)); scaled_image_size.Scale(1 / image_scale_factor_); return scaled_image_size;
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 9f65d1e..c8e1129a 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -961,14 +961,14 @@ ImageBitmap* image_bitmap = nullptr; Document* document = &node->GetDocument(); if (auto* image = DynamicTo<HTMLImageElement>(node)) { - image_bitmap = ImageBitmap::Create(image, base::Optional<IntRect>(), - document, options); + image_bitmap = MakeGarbageCollected<ImageBitmap>( + image, base::Optional<IntRect>(), document, options); } else if (auto* canvas = DynamicTo<HTMLCanvasElement>(node)) { - image_bitmap = - ImageBitmap::Create(canvas, base::Optional<IntRect>(), options); + image_bitmap = MakeGarbageCollected<ImageBitmap>( + canvas, base::Optional<IntRect>(), options); } else if (auto* video = DynamicTo<HTMLVideoElement>(node)) { - image_bitmap = ImageBitmap::Create(video, base::Optional<IntRect>(), - document, options); + image_bitmap = MakeGarbageCollected<ImageBitmap>( + video, base::Optional<IntRect>(), document, options); } if (!image_bitmap) return String();
diff --git a/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc b/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc index 0acec00..210029b 100644 --- a/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc +++ b/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
@@ -129,7 +129,6 @@ int group = 0; base::Optional<double> start_time = base::nullopt; - double time_offset = 0; // Normally the playback rate of a blink animation gets translated into // equivalent playback rate of cc::KeyframeModels. @@ -143,7 +142,7 @@ // it on animation. https://crbug.com/925373. double playback_rate = 1; - effect->StartAnimationOnCompositor(group, start_time, time_offset, + effect->StartAnimationOnCompositor(group, start_time, base::TimeDelta(), playback_rate, animation); }
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc index 0885b5b..ac465e5 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
@@ -585,13 +585,13 @@ const ImageBitmapOptions* default_options = ImageBitmapOptions::Create(); base::Optional<IntRect> crop_rect = IntRect(0, 0, canvas->width(), canvas->height()); - ImageBitmap* image_bitmap_from_canvas = - ImageBitmap::Create(canvas, crop_rect, default_options); + auto* image_bitmap_from_canvas = + MakeGarbageCollected<ImageBitmap>(canvas, crop_rect, default_options); ASSERT_TRUE(image_bitmap_from_canvas); crop_rect = IntRect(0, 0, 20, 20); - image_bitmap_derived = ImageBitmap::Create(image_bitmap_from_canvas, - crop_rect, default_options); + image_bitmap_derived = MakeGarbageCollected<ImageBitmap>( + image_bitmap_from_canvas, crop_rect, default_options); ASSERT_TRUE(image_bitmap_derived); } CanvasContextCreationAttributesCore attributes; @@ -894,7 +894,8 @@ options->setColorSpaceConversion( ColorCorrectionTestUtils::ColorSpaceConversionToString( static_cast<ColorSpaceConversion>(conversion_iterator))); - ImageBitmap* image_bitmap = ImageBitmap::Create(canvas, crop_rect, options); + ImageBitmap* image_bitmap = + MakeGarbageCollected<ImageBitmap>(canvas, crop_rect, options); ASSERT_TRUE(image_bitmap); sk_sp<SkImage> converted_image = image_bitmap->BitmapImage()->PaintImageForCurrentFrame().GetSkImage();
diff --git a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context.cc b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context.cc index 90bcad5e..d6cd4077 100644 --- a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context.cc +++ b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context.cc
@@ -52,7 +52,7 @@ return nullptr; image->Transfer(); - return ImageBitmap::Create(std::move(image)); + return MakeGarbageCollected<ImageBitmap>(std::move(image)); } CanvasRenderingContext* ImageBitmapRenderingContext::Factory::Create(
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc index 089d969..54893ca 100644 --- a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc
@@ -268,7 +268,7 @@ Host()->DiscardResourceProvider(); RestoreMatrixClipStack(recorder_->getRecordingCanvas()); - return ImageBitmap::Create(std::move(image)); + return MakeGarbageCollected<ImageBitmap>(std::move(image)); } scoped_refptr<StaticBitmapImage> OffscreenCanvasRenderingContext2D::GetImage(
diff --git a/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.cc b/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.cc index bc657535..48bfce6e 100644 --- a/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.cc +++ b/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.cc
@@ -30,18 +30,16 @@ ScriptPromise NativeFileSystemUnderlyingSink::start( ScriptState* script_state, - WritableStreamDefaultController* controller) { + WritableStreamDefaultController* controller, + ExceptionState& exception_state) { return ScriptPromise::CastUndefined(script_state); } ScriptPromise NativeFileSystemUnderlyingSink::write( ScriptState* script_state, ScriptValue chunk, - WritableStreamDefaultController* controller) { - ExceptionState exception_state(script_state->GetIsolate(), - ExceptionState::kExecutionContext, - "NativeFileSystemUnderlyingSink", "write"); - + WritableStreamDefaultController* controller, + ExceptionState& exception_state) { v8::Local<v8::Value> value = chunk.V8Value(); ArrayBufferOrArrayBufferViewOrBlobOrUSVStringOrWriteParams input; @@ -49,7 +47,7 @@ script_state->GetIsolate(), value, input, UnionTypeConversionMode::kNotNullable, exception_state); if (exception_state.HadException()) - return ScriptPromise::Reject(script_state, exception_state); + return ScriptPromise(); if (input.IsNull()) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, @@ -57,25 +55,28 @@ return ScriptPromise(); } - if (input.IsWriteParams()) - return HandleParams(script_state, std::move(*input.GetAsWriteParams())); + if (input.IsWriteParams()) { + return HandleParams(script_state, std::move(*input.GetAsWriteParams()), + exception_state); + } ArrayBufferOrArrayBufferViewOrBlobOrUSVString write_data; V8ArrayBufferOrArrayBufferViewOrBlobOrUSVString::ToImpl( script_state->GetIsolate(), value, write_data, UnionTypeConversionMode::kNotNullable, exception_state); if (exception_state.HadException()) - return ScriptPromise::Reject(script_state, exception_state); - return WriteData(script_state, offset_, std::move(write_data)); + return ScriptPromise(); + return WriteData(script_state, offset_, std::move(write_data), + exception_state); } -ScriptPromise NativeFileSystemUnderlyingSink::close(ScriptState* script_state) { +ScriptPromise NativeFileSystemUnderlyingSink::close( + ScriptState* script_state, + ExceptionState& exception_state) { if (!writer_remote_ || pending_operation_) { - return ScriptPromise::Reject( - script_state, - V8ThrowDOMException::CreateOrEmpty(script_state->GetIsolate(), - DOMExceptionCode::kInvalidStateError, - "Object reached an invalid state")); + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, + "Object reached an invalid state"); + return ScriptPromise(); } pending_operation_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); @@ -86,8 +87,10 @@ return result; } -ScriptPromise NativeFileSystemUnderlyingSink::abort(ScriptState* script_state, - ScriptValue reason) { +ScriptPromise NativeFileSystemUnderlyingSink::abort( + ScriptState* script_state, + ScriptValue reason, + ExceptionState& exception_state) { // The specification guarantees that this will only be called after all // pending writes have been aborted. Terminating the remote connection // will ensure that the writes are not closed successfully. @@ -98,52 +101,49 @@ ScriptPromise NativeFileSystemUnderlyingSink::HandleParams( ScriptState* script_state, - const WriteParams& params) { + const WriteParams& params, + ExceptionState& exception_state) { if (params.type() == "truncate") { if (!params.hasSize()) { - return ScriptPromise::Reject( - script_state, - V8ThrowDOMException::CreateOrEmpty( - script_state->GetIsolate(), DOMExceptionCode::kSyntaxError, - "Invalid params passed. truncate requires a size argument")); + exception_state.ThrowDOMException( + DOMExceptionCode::kSyntaxError, + "Invalid params passed. truncate requires a size argument"); + return ScriptPromise(); } - return Truncate(script_state, params.size()); + return Truncate(script_state, params.size(), exception_state); } if (params.type() == "seek") { if (!params.hasPosition()) { - return ScriptPromise::Reject( - script_state, - V8ThrowDOMException::CreateOrEmpty( - script_state->GetIsolate(), DOMExceptionCode::kSyntaxError, - "Invalid params passed. seek requires a position argument")); + exception_state.ThrowDOMException( + DOMExceptionCode::kSyntaxError, + "Invalid params passed. seek requires a position argument"); + return ScriptPromise(); } - return Seek(script_state, params.position()); + return Seek(script_state, params.position(), exception_state); } if (params.type() == "write") { uint64_t position = params.hasPosition() ? params.position() : offset_; if (!params.hasData()) { - return ScriptPromise::Reject( - script_state, - V8ThrowDOMException::CreateOrEmpty( - script_state->GetIsolate(), DOMExceptionCode::kSyntaxError, - "Invalid params passed. write requires a data argument")); + exception_state.ThrowDOMException( + DOMExceptionCode::kSyntaxError, + "Invalid params passed. write requires a data argument"); + return ScriptPromise(); } - return WriteData(script_state, position, params.data()); + return WriteData(script_state, position, params.data(), exception_state); } - return ScriptPromise::Reject( - script_state, - V8ThrowDOMException::CreateOrEmpty(script_state->GetIsolate(), - DOMExceptionCode::kInvalidStateError, - "Object reached an invalid state")); + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, + "Object reached an invalid state"); + return ScriptPromise(); } ScriptPromise NativeFileSystemUnderlyingSink::WriteData( ScriptState* script_state, uint64_t position, - const ArrayBufferOrArrayBufferViewOrBlobOrUSVString& data) { + const ArrayBufferOrArrayBufferViewOrBlobOrUSVString& data, + ExceptionState& exception_state) { DCHECK(!data.IsNull()); auto blob_data = std::make_unique<BlobData>(); @@ -170,19 +170,18 @@ BlobDataHandle::Create(std::move(blob_data), size)); } - return WriteBlob(script_state, position, blob); + return WriteBlob(script_state, position, blob, exception_state); } ScriptPromise NativeFileSystemUnderlyingSink::WriteBlob( ScriptState* script_state, uint64_t position, - Blob* blob) { + Blob* blob, + ExceptionState& exception_state) { if (!writer_remote_ || pending_operation_) { - return ScriptPromise::Reject( - script_state, - V8ThrowDOMException::CreateOrEmpty(script_state->GetIsolate(), - DOMExceptionCode::kInvalidStateError, - "Object reached an invalid state")); + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, + "Object reached an invalid state"); + return ScriptPromise(); } pending_operation_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); @@ -196,13 +195,12 @@ ScriptPromise NativeFileSystemUnderlyingSink::Truncate( ScriptState* script_state, - uint64_t size) { + uint64_t size, + ExceptionState& exception_state) { if (!writer_remote_ || pending_operation_) { - return ScriptPromise::Reject( - script_state, - V8ThrowDOMException::CreateOrEmpty(script_state->GetIsolate(), - DOMExceptionCode::kInvalidStateError, - "Object reached an invalid state")); + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, + "Object reached an invalid state"); + return ScriptPromise(); } pending_operation_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); @@ -213,14 +211,14 @@ return result; } -ScriptPromise NativeFileSystemUnderlyingSink::Seek(ScriptState* script_state, - uint64_t offset) { +ScriptPromise NativeFileSystemUnderlyingSink::Seek( + ScriptState* script_state, + uint64_t offset, + ExceptionState& exception_state) { if (!writer_remote_ || pending_operation_) { - return ScriptPromise::Reject( - script_state, - V8ThrowDOMException::CreateOrEmpty(script_state->GetIsolate(), - DOMExceptionCode::kInvalidStateError, - "Object reached an invalid state")); + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, + "Object reached an invalid state"); + return ScriptPromise(); } offset_ = offset; return ScriptPromise::CastUndefined(script_state);
diff --git a/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.h b/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.h index a934793..4fcf3bf 100644 --- a/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.h +++ b/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.h
@@ -14,6 +14,7 @@ namespace blink { +class ExceptionState; class ScriptPromiseResolver; class WriteParams; @@ -27,25 +28,34 @@ mojo::PendingRemote<mojom::blink::NativeFileSystemFileWriter>); // UnderlyingSinkBase - ScriptPromise start(ScriptState*, WritableStreamDefaultController*) override; + ScriptPromise start(ScriptState*, + WritableStreamDefaultController*, + ExceptionState&) override; ScriptPromise write(ScriptState*, ScriptValue chunk, - WritableStreamDefaultController*) override; - ScriptPromise close(ScriptState*) override; - ScriptPromise abort(ScriptState*, ScriptValue reason) override; + WritableStreamDefaultController*, + ExceptionState&) override; + ScriptPromise close(ScriptState*, ExceptionState&) override; + ScriptPromise abort(ScriptState*, + ScriptValue reason, + ExceptionState&) override; void Trace(Visitor*) override; void ContextDestroyed(ExecutionContext*) override; private: - ScriptPromise HandleParams(ScriptState*, const WriteParams&); + ScriptPromise HandleParams(ScriptState*, const WriteParams&, ExceptionState&); ScriptPromise WriteData( ScriptState*, uint64_t position, - const ArrayBufferOrArrayBufferViewOrBlobOrUSVString& data); - ScriptPromise WriteBlob(ScriptState*, uint64_t position, Blob*); - ScriptPromise Truncate(ScriptState*, uint64_t size); - ScriptPromise Seek(ScriptState*, uint64_t offset); + const ArrayBufferOrArrayBufferViewOrBlobOrUSVString& data, + ExceptionState&); + ScriptPromise WriteBlob(ScriptState*, + uint64_t position, + Blob*, + ExceptionState&); + ScriptPromise Truncate(ScriptState*, uint64_t size, ExceptionState&); + ScriptPromise Seek(ScriptState*, uint64_t offset, ExceptionState&); void WriteComplete(mojom::blink::NativeFileSystemErrorPtr result, uint64_t bytes_written); void TruncateComplete(uint64_t to_size,
diff --git a/third_party/blink/renderer/modules/nfc/README.md b/third_party/blink/renderer/modules/nfc/README.md new file mode 100644 index 0000000..4d6f599 --- /dev/null +++ b/third_party/blink/renderer/modules/nfc/README.md
@@ -0,0 +1,20 @@ +# Web NFC Blink Module + +`renderer/modules/nfc` implements the renderer process details and bindings for +the [Web NFC specification]. It communicates with the browser process through the +[Web NFC Mojo interface]. The platform-specific parts of the +implementation are located in `services/device/nfc`. + +[Web NFC specification]: https://w3c.github.io/web-nfc/ +[Web NFC Mojo interface]: ../../../../../services/device/public/mojom/nfc.mojom + + +## Testing + +Web NFC is primarily tested in [Web Platform Tests](https://source.chromium.org/chromium/chromium/src/+/master:third_party/blink/web_tests/external/wpt/web-nfc/). + + +## Design Documents + +Please refer to the [design documentation](https://sites.google.com/a/chromium.org/dev/developers/design-documents/web-nfc) +for more details. \ No newline at end of file
diff --git a/third_party/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink.cc b/third_party/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink.cc index 3505661..6ba143f 100644 --- a/third_party/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink.cc +++ b/third_party/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink.cc
@@ -7,7 +7,6 @@ #include <algorithm> #include <memory> -#include "base/bind.h" #include "base/location.h" #include "base/numerics/safe_conversions.h" #include "base/single_thread_task_runner.h" @@ -19,6 +18,7 @@ #include "third_party/blink/renderer/modules/mediastream/media_stream_constraints_util.h" #include "third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h" #include "third_party/blink/renderer/platform/peerconnection/webrtc_video_track_source.h" +#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h" #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h" #include "third_party/blink/renderer/platform/wtf/thread_safe_ref_counted.h" #include "third_party/webrtc/api/video_track_source_proxy.h" @@ -188,14 +188,15 @@ scoped_refptr<media::VideoFrame> frame, base::TimeTicks estimated_capture_time) { DCHECK_CALLED_ON_VALID_THREAD(io_thread_checker_); - render_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&WebRtcVideoSourceAdapter::ResetRefreshTimerOnMainThread, - this)); - libjingle_worker_thread_->PostTask( - FROM_HERE, - base::BindOnce(&WebRtcVideoSourceAdapter::OnVideoFrameOnWorkerThread, - this, std::move(frame))); + PostCrossThreadTask( + *render_task_runner_.get(), FROM_HERE, + CrossThreadBindOnce( + &WebRtcVideoSourceAdapter::ResetRefreshTimerOnMainThread, + WrapRefCounted(this))); + PostCrossThreadTask( + *libjingle_worker_thread_.get(), FROM_HERE, + CrossThreadBindOnce(&WebRtcVideoSourceAdapter::OnVideoFrameOnWorkerThread, + WrapRefCounted(this), std::move(frame))); } void MediaStreamVideoWebRtcSink::WebRtcVideoSourceAdapter::
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc index ffa4726..9cc1e57 100644 --- a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc +++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
@@ -461,9 +461,8 @@ std::unique_ptr<rtc::NetworkManager> network_manager; if (port_config.enable_multiple_routes) { - network_manager = std::make_unique<blink::FilteringNetworkManager>( - network_manager_.get(), requesting_origin, media_permission, - allow_mdns_obfuscation); + network_manager = std::make_unique<FilteringNetworkManager>( + network_manager_.get(), media_permission, allow_mdns_obfuscation); } else { network_manager = std::make_unique<blink::EmptyNetworkManager>(network_manager_.get());
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc index 731c009..15b80fa 100644 --- a/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc +++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
@@ -117,7 +117,7 @@ return result.ToString(); } -String SerializeMediaStreamIds(const blink::WebVector<String>& stream_ids) { +String SerializeMediaStreamIds(const Vector<String>& stream_ids) { if (!stream_ids.size()) return "[]"; StringBuilder result;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_dtmf_sender.cc b/third_party/blink/renderer/modules/peerconnection/rtc_dtmf_sender.cc index 235041b1..0660d0e7 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_dtmf_sender.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_dtmf_sender.cc
@@ -142,7 +142,7 @@ DispatchEvent(*event.Release()); return; } - WebString this_tone = tone_buffer_.Substring(0, 1); + String this_tone = tone_buffer_.Substring(0, 1); tone_buffer_ = tone_buffer_.Substring(1, tone_buffer_.length() - 1); // InsertDTMF handles both tones and ",", and calls DidPlayTone after // the specified delay.
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc index 5c7d4f26..3790579 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc
@@ -318,7 +318,7 @@ static WebVector<webrtc::PeerConnectionInterface::IceServer> ConvertIceServers( const HeapVector<Member<RTCIceServer>>& ice_servers) { - Vector<webrtc::PeerConnectionInterface::IceServer> converted_ice_servers; + WebVector<webrtc::PeerConnectionInterface::IceServer> converted_ice_servers; for (const RTCIceServer* ice_server : ice_servers) { converted_ice_servers.emplace_back(ConvertIceServer(ice_server)); }
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc index 020455f46..5ffcbd0 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc
@@ -2369,7 +2369,7 @@ kSetLocalDescription : PeerConnectionTracker::TransceiverUpdatedReason:: kSetRemoteDescription; - blink::WebVector<uintptr_t> ids(transceiver_states.size()); + Vector<uintptr_t> ids(SafeCast<wtf_size_t>(transceiver_states.size())); for (WTF::wtf_size_t i = 0; i < transceiver_states.size(); ++i) { // Figure out if this transceiver is new or if setting the state modified // the transceiver such that it should be logged by the
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h index 3b5815c..bf8af535 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h +++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h
@@ -378,7 +378,7 @@ std::vector<std::unique_ptr<blink::RTCRtpTransceiverImpl>> rtp_transceivers_; // A snapshot of transceiver ids taken before the last transition, used to // detect any removals during rollback. - blink::WebVector<uintptr_t> previous_transceiver_ids_; + Vector<uintptr_t> previous_transceiver_ids_; base::WeakPtr<PeerConnectionTracker> peer_connection_tracker_;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc index 57a27fe..519f5d5 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
@@ -394,7 +394,7 @@ // TODO(orphis): Forward missing fields from the WebRTC library: // codecPayloadType, dtx, ptime, maxFramerate, scaleResolutionDownBy. RTCRtpEncodingParameters* encoding = RTCRtpEncodingParameters::Create(); - encoding->setRid(WebString::FromUTF8(webrtc_encoding.rid)); + encoding->setRid(String::FromUTF8(webrtc_encoding.rid)); encoding->setActive(webrtc_encoding.active); if (webrtc_encoding.max_bitrate_bps) { encoding->setMaxBitrate(webrtc_encoding.max_bitrate_bps.value());
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc index 75ab1a75..8dd8c35 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc
@@ -27,7 +27,7 @@ std::unique_ptr<RTCStatsMember> member = stats->GetMember(i); if (!member->IsDefined()) continue; - WebString name = member->GetName(); + String name = member->GetName(); switch (member->GetType()) { case webrtc::RTCStatsMemberInterface::kBool: builder.AddBoolean(name, member->ValueBool());
diff --git a/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc b/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc index 87ff711c..439c6c99 100644 --- a/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc +++ b/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc
@@ -25,14 +25,16 @@ ScriptPromise SerialPortUnderlyingSink::start( ScriptState* script_state, - WritableStreamDefaultController* controller) { + WritableStreamDefaultController* controller, + ExceptionState& exception_state) { return ScriptPromise::CastUndefined(script_state); } ScriptPromise SerialPortUnderlyingSink::write( ScriptState* script_state, ScriptValue chunk, - WritableStreamDefaultController* controller) { + WritableStreamDefaultController* controller, + ExceptionState& exception_state) { // There can only be one call to write() in progress at a time. DCHECK(buffer_source_.IsNull()); DCHECK_EQ(0u, offset_); @@ -42,18 +44,15 @@ DOMException* exception = pending_exception_; pending_exception_ = nullptr; serial_port_->UnderlyingSinkClosed(); - return ScriptPromise::RejectWithDOMException(script_state, exception); + exception_state.RethrowV8Exception(ToV8(exception, script_state)); + return ScriptPromise(); } - ExceptionState exception_state(script_state->GetIsolate(), - ExceptionState::kExecutionContext, - "SerialPortUnderlyingSink", "write"); - V8ArrayBufferOrArrayBufferView::ToImpl( script_state->GetIsolate(), chunk.V8Value(), buffer_source_, UnionTypeConversionMode::kNotNullable, exception_state); if (exception_state.HadException()) - return ScriptPromise::Reject(script_state, exception_state); + return ScriptPromise(); pending_write_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise promise = pending_write_->Promise(); @@ -62,7 +61,8 @@ return promise; } -ScriptPromise SerialPortUnderlyingSink::close(ScriptState* script_state) { +ScriptPromise SerialPortUnderlyingSink::close(ScriptState* script_state, + ExceptionState& exception_state) { // The specification guarantees that this will only be called after all // pending writes have been completed. DCHECK(!pending_write_); @@ -74,7 +74,8 @@ if (pending_exception_) { DOMException* exception = pending_exception_; pending_exception_ = nullptr; - return ScriptPromise::RejectWithDOMException(script_state, exception); + exception_state.RethrowV8Exception(ToV8(exception, script_state)); + return ScriptPromise(); } // TODO(crbug.com/989656): close() should wait for data to be flushed before @@ -83,12 +84,13 @@ } ScriptPromise SerialPortUnderlyingSink::abort(ScriptState* script_state, - ScriptValue reason) { + ScriptValue reason, + ExceptionState& exception_state) { // The specification guarantees that this will only be called after all // pending writes have been completed. // TODO(crbug.com/969653): abort() should trigger a purge of the serial write // buffers. - return close(script_state); + return close(script_state, exception_state); } void SerialPortUnderlyingSink::SignalErrorOnClose(DOMException* exception) {
diff --git a/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h b/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h index 2719dc4..4b1ef65 100644 --- a/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h +++ b/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h
@@ -12,6 +12,7 @@ namespace blink { +class ExceptionState; class ScriptPromiseResolver; class SerialPort; @@ -20,12 +21,17 @@ SerialPortUnderlyingSink(SerialPort*, mojo::ScopedDataPipeProducerHandle); // UnderlyingSinkBase - ScriptPromise start(ScriptState*, WritableStreamDefaultController*) override; + ScriptPromise start(ScriptState*, + WritableStreamDefaultController*, + ExceptionState&) override; ScriptPromise write(ScriptState*, ScriptValue chunk, - WritableStreamDefaultController*) override; - ScriptPromise close(ScriptState*) override; - ScriptPromise abort(ScriptState*, ScriptValue reason) override; + WritableStreamDefaultController*, + ExceptionState&) override; + ScriptPromise close(ScriptState*, ExceptionState&) override; + ScriptPromise abort(ScriptState*, + ScriptValue reason, + ExceptionState&) override; // After |data_pipe_| has closed calls to write() will return a Promise // rejected with this DOMException.
diff --git a/third_party/blink/renderer/modules/webcodecs/video_decoder.cc b/third_party/blink/renderer/modules/webcodecs/video_decoder.cc index dc257e5..970fabf9 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_decoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_decoder.cc
@@ -19,20 +19,19 @@ VideoDecoder::VideoDecoder() = default; -ScriptPromise VideoDecoder::Initialize( - ScriptState* script_state, - const VideoDecoderInitParameters* params) { - return ScriptPromise::RejectWithDOMException( - script_state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotSupportedError, - "Not implemented yet.")); +ScriptPromise VideoDecoder::Initialize(ScriptState* script_state, + const VideoDecoderInitParameters* params, + ExceptionState& exception_state) { + exception_state.ThrowDOMException(DOMExceptionCode::kNotSupportedError, + "Not implemented yet."); + return ScriptPromise(); } -ScriptPromise VideoDecoder::Flush(ScriptState* script_state) { - return ScriptPromise::RejectWithDOMException( - script_state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotSupportedError, - "Not implemented yet.")); +ScriptPromise VideoDecoder::Flush(ScriptState* script_state, + ExceptionState& exception_state) { + exception_state.ThrowDOMException(DOMExceptionCode::kNotSupportedError, + "Not implemented yet."); + return ScriptPromise(); } void VideoDecoder::Close() {}
diff --git a/third_party/blink/renderer/modules/webcodecs/video_decoder.h b/third_party/blink/renderer/modules/webcodecs/video_decoder.h index 71026ca0..94e11e0 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_decoder.h +++ b/third_party/blink/renderer/modules/webcodecs/video_decoder.h
@@ -11,6 +11,7 @@ namespace blink { +class ExceptionState; class ScriptState; class ReadableStream; class VideoDecoderInitParameters; @@ -22,8 +23,10 @@ public: static VideoDecoder* Create(); VideoDecoder(); - ScriptPromise Initialize(ScriptState*, const VideoDecoderInitParameters*); - ScriptPromise Flush(ScriptState*); + ScriptPromise Initialize(ScriptState*, + const VideoDecoderInitParameters*, + ExceptionState&); + ScriptPromise Flush(ScriptState*, ExceptionState&); void Close(); // video_decoder.idl implementation.
diff --git a/third_party/blink/renderer/modules/webcodecs/video_decoder.idl b/third_party/blink/renderer/modules/webcodecs/video_decoder.idl index a3d05ac..35d9026 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_decoder.idl +++ b/third_party/blink/renderer/modules/webcodecs/video_decoder.idl
@@ -6,8 +6,8 @@ RuntimeEnabled=WebCodecs ] interface VideoDecoder { constructor(); - [CallWith=ScriptState] Promise<void> Initialize(VideoDecoderInitParameters params); - [CallWith=ScriptState] Promise<void> Flush(); + [CallWith=ScriptState, RaisesException] Promise<void> Initialize(VideoDecoderInitParameters params); + [CallWith=ScriptState, RaisesException] Promise<void> Flush(); void Close(); readonly attribute WritableStream writable; // of EncodedVideoFrame
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc index 7cfd680..18c96ea 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -735,7 +735,7 @@ ScriptState* script_state) { WebFeature feature = WebFeature::kOffscreenCanvasTransferToImageBitmapWebGL; UseCounter::Count(ExecutionContext::From(script_state), feature); - return ImageBitmap::Create( + return MakeGarbageCollected<ImageBitmap>( GetDrawingBuffer()->TransferToStaticBitmapImage(nullptr)); }
diff --git a/third_party/blink/renderer/modules/websockets/websocket_stream.cc b/third_party/blink/renderer/modules/websockets/websocket_stream.cc index 48dea29..e2b7af21 100644 --- a/third_party/blink/renderer/modules/websockets/websocket_stream.cc +++ b/third_party/blink/renderer/modules/websockets/websocket_stream.cc
@@ -68,12 +68,17 @@ explicit UnderlyingSink(WebSocketStream* creator) : creator_(creator) {} // UnderlyingSinkBase implementation. - ScriptPromise start(ScriptState*, WritableStreamDefaultController*) override; + ScriptPromise start(ScriptState*, + WritableStreamDefaultController*, + ExceptionState&) override; ScriptPromise write(ScriptState*, ScriptValue chunk, - WritableStreamDefaultController*) override; - ScriptPromise close(ScriptState*) override; - ScriptPromise abort(ScriptState*, ScriptValue reason) override; + WritableStreamDefaultController*, + ExceptionState&) override; + ScriptPromise close(ScriptState*, ExceptionState&) override; + ScriptPromise abort(ScriptState*, + ScriptValue reason, + ExceptionState&) override; // API for WebSocketStream. void DidStartClosingHandshake(); @@ -93,7 +98,8 @@ void SendAny(ScriptState*, v8::Local<v8::Value> v8chunk, ScriptPromiseResolver*, - base::OnceClosure callback); + base::OnceClosure callback, + ExceptionState&); void SendArrayBuffer(ScriptState*, DOMArrayBuffer*, size_t offset, @@ -178,7 +184,8 @@ ScriptPromise WebSocketStream::UnderlyingSink::start( ScriptState* script_state, - WritableStreamDefaultController*) { + WritableStreamDefaultController*, + ExceptionState& exception_state) { DVLOG(1) << "WebSocketStream::UnderlyingSink " << this << " start()"; return ScriptPromise::CastUndefined(script_state); } @@ -186,7 +193,8 @@ ScriptPromise WebSocketStream::UnderlyingSink::write( ScriptState* script_state, ScriptValue chunk, - WritableStreamDefaultController*) { + WritableStreamDefaultController*, + ExceptionState& exception_state) { DVLOG(1) << "WebSocketStream::UnderlyingSink " << this << " write()"; is_writing_ = true; auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); @@ -195,12 +203,16 @@ WTF::Bind(&UnderlyingSink::FinishWriteCallback, WrapWeakPersistent(this), WrapPersistent(resolver)); v8::Local<v8::Value> v8chunk = chunk.V8Value(); - SendAny(script_state, v8chunk, resolver, std::move(callback)); + SendAny(script_state, v8chunk, resolver, std::move(callback), + exception_state); + if (exception_state.HadException()) + return ScriptPromise(); return result; } ScriptPromise WebSocketStream::UnderlyingSink::close( - ScriptState* script_state) { + ScriptState* script_state, + ExceptionState& exception_state) { DVLOG(1) << "WebSocketStream::UnderlyingSink " << this << " close()"; closed_ = true; creator_->CloseWithUnspecifiedCode(); @@ -209,8 +221,10 @@ return close_resolver_->Promise(); } -ScriptPromise WebSocketStream::UnderlyingSink::abort(ScriptState* script_state, - ScriptValue reason) { +ScriptPromise WebSocketStream::UnderlyingSink::abort( + ScriptState* script_state, + ScriptValue reason, + ExceptionState& exception_state) { DVLOG(1) << "WebSocketStream::UnderlyingSink " << this << " abort()"; closed_ = true; @@ -288,7 +302,8 @@ void WebSocketStream::UnderlyingSink::SendAny(ScriptState* script_state, v8::Local<v8::Value> v8chunk, ScriptPromiseResolver* resolver, - base::OnceClosure callback) { + base::OnceClosure callback, + ExceptionState& exception_state) { DVLOG(1) << "WebSocketStream::UnderlyingSink " << this << " SendAny()"; auto* isolate = script_state->GetIsolate(); if (v8chunk->IsArrayBuffer()) { @@ -299,15 +314,12 @@ } if (v8chunk->IsArrayBufferView()) { - ExceptionState exception_state(isolate, ExceptionState::kUnknownContext, "", - ""); NotShared<DOMArrayBufferView> data = ToNotShared<NotShared<DOMArrayBufferView>>(isolate, v8chunk, exception_state); if (exception_state.HadException()) { closed_ = true; is_writing_ = false; - resolver->Reject(exception_state); return; }
diff --git a/third_party/blink/renderer/platform/graphics/image.cc b/third_party/blink/renderer/platform/graphics/image.cc index aee2360..21a1f9af 100644 --- a/third_party/blink/renderer/platform/graphics/image.cc +++ b/third_party/blink/renderer/platform/graphics/image.cc
@@ -326,13 +326,19 @@ return true; } +IntSize Image::Size(RespectImageOrientationEnum respect_image_orientation) { + if (respect_image_orientation == kRespectImageOrientation && IsBitmapImage()) + return ToBitmapImage(this)->SizeRespectingOrientation(); + return Size(); +} + SkBitmap Image::AsSkBitmapForCurrentFrame( - RespectImageOrientationEnum should_respect_image_orientation) { + RespectImageOrientationEnum respect_image_orientation) { PaintImage paint_image = PaintImageForCurrentFrame(); if (!paint_image) return {}; - if (should_respect_image_orientation == kRespectImageOrientation && + if (respect_image_orientation == kRespectImageOrientation && IsBitmapImage()) { ImageOrientation orientation = ToBitmapImage(this)->CurrentFrameOrientation();
diff --git a/third_party/blink/renderer/platform/graphics/image.h b/third_party/blink/renderer/platform/graphics/image.h index 5072e7b2..165d4ee2 100644 --- a/third_party/blink/renderer/platform/graphics/image.h +++ b/third_party/blink/renderer/platform/graphics/image.h
@@ -109,6 +109,7 @@ virtual bool HasIntrinsicSize() const { return true; } virtual IntSize Size() const = 0; + IntSize Size(RespectImageOrientationEnum); virtual FloatSize SizeAsFloat() const { return FloatSize(Size()); } IntRect Rect() const { return IntRect(IntPoint(), Size()); } int width() const { return Size().Width(); }
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc index fbc63e1..7842798b 100644 --- a/third_party/blink/renderer/platform/heap/thread_state.cc +++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -1082,21 +1082,6 @@ DCHECK(!static_persistents_.Contains(persistent_node)); } -void ThreadState::RegisterPreFinalizer(void* object, - PreFinalizerCallback callback) { -#if DCHECK_IS_ON() - DCHECK(CheckThread()); -#endif - DCHECK(!SweepForbidden()); - - HeapObjectHeader* header = HeapObjectHeader::FromInnerAddress(object); - DCHECK(ordered_pre_finalizers_.end() == - std::find(ordered_pre_finalizers_.begin(), - ordered_pre_finalizers_.end(), - PreFinalizer{header, object, callback})); - ordered_pre_finalizers_.push_back(PreFinalizer{header, object, callback}); -} - void ThreadState::InvokePreFinalizers() { DCHECK(CheckThread()); DCHECK(!SweepForbidden()); @@ -1104,22 +1089,23 @@ ThreadHeapStatsCollector::Scope stats_scope( Heap().stats_collector(), ThreadHeapStatsCollector::kInvokePreFinalizers); SweepForbiddenScope sweep_forbidden(this); - // Pre finalizers are forbidden from allocating objects. + // Pre finalizers are forbidden from allocating objects NoAllocationScope no_allocation_scope(this); // Call the prefinalizers in the opposite order to their registration. + // + // LinkedHashSet does not support modification during iteration, so + // copy items first. + // + // The prefinalizer callback wrapper returns |true| when its associated + // object is unreachable garbage and the prefinalizer callback has run. + // The registered prefinalizer entry must then be removed and deleted. Deque<PreFinalizer> remaining_ordered_pre_finalizers; for (auto rit = ordered_pre_finalizers_.rbegin(); rit != ordered_pre_finalizers_.rend(); ++rit) { const PreFinalizer& pre_finalizer = *rit; - // Check if pre-finalizer should be executed. - if (pre_finalizer.header->IsMarked()) { - // Re-queue for checking in next garbage collection. + if (!(pre_finalizer.second)(pre_finalizer.first)) remaining_ordered_pre_finalizers.push_front(pre_finalizer); - } else { - // Execute pre-finalizer. - pre_finalizer.callback(pre_finalizer.object); - } } ordered_pre_finalizers_ = std::move(remaining_ordered_pre_finalizers);
diff --git a/third_party/blink/renderer/platform/heap/thread_state.h b/third_party/blink/renderer/platform/heap/thread_state.h index 29db6e8..77ba4df 100644 --- a/third_party/blink/renderer/platform/heap/thread_state.h +++ b/third_party/blink/renderer/platform/heap/thread_state.h
@@ -62,7 +62,6 @@ } // namespace incremental_marking_test class CancelableTaskScheduler; -class HeapObjectHeader; class MarkingVisitor; class PersistentNode; class PersistentRegion; @@ -94,13 +93,17 @@ // Member<Bar> bar_; // }; #define USING_PRE_FINALIZER(Class, preFinalizer) \ - private: \ - static void PreFinalizerDispatch(void* object) { \ - reinterpret_cast<Class*>(object)->Class::preFinalizer(); \ + public: \ + static bool InvokePreFinalizer(void* object) { \ + Class* self = reinterpret_cast<Class*>(object); \ + if (ThreadHeap::IsHeapObjectAlive(self)) \ + return false; \ + self->Class::preFinalizer(); \ + return true; \ } \ \ - friend class ThreadState::PreFinalizerRegistration<Class>; \ - ThreadState::PreFinalizerRegistration<Class> prefinalizer_dummy_{this}; \ + private: \ + ThreadState::PrefinalizerRegistration<Class> prefinalizer_dummy_{this}; \ using UsingPreFinalizerMacroNeedsTrailingSemiColon = char class PLATFORM_EXPORT BlinkGCObserver { @@ -130,16 +133,24 @@ // Register the pre-finalizer for the |self| object. The class T be using // USING_PRE_FINALIZER() macro. template <typename T> - class PreFinalizerRegistration final { + class PrefinalizerRegistration final { DISALLOW_NEW(); public: - PreFinalizerRegistration(T* self) { - static_assert(sizeof(&T::PreFinalizerDispatch) > 0, + PrefinalizerRegistration(T* self) { + static_assert(sizeof(&T::InvokePreFinalizer) > 0, "USING_PRE_FINALIZER(T) must be defined."); ThreadState* state = ThreadStateFor<ThreadingTrait<T>::kAffinity>::GetState(); - state->RegisterPreFinalizer(self, T::PreFinalizerDispatch); +#if DCHECK_IS_ON() + DCHECK(state->CheckThread()); +#endif + DCHECK(!state->SweepForbidden()); + DCHECK(std::find(state->ordered_pre_finalizers_.begin(), + state->ordered_pre_finalizers_.end(), + PreFinalizer(self, T::InvokePreFinalizer)) == + state->ordered_pre_finalizers_.end()); + state->ordered_pre_finalizers_.emplace_back(self, T::InvokePreFinalizer); } }; @@ -368,17 +379,6 @@ private: class IncrementalMarkingScheduler; - using PreFinalizerCallback = void (*)(void*); - struct PreFinalizer { - HeapObjectHeader* header; - void* object; - PreFinalizerCallback callback; - - bool operator==(const PreFinalizer& other) const { - return object == other.object && callback == other.callback; - } - }; - // Duration of one incremental marking step. Should be short enough that it // doesn't cause jank even though it is scheduled as a normal task. static constexpr base::TimeDelta kDefaultIncrementalMarkingStepDuration = @@ -518,7 +518,6 @@ void SynchronizeAndFinishConcurrentSweeping(); - void RegisterPreFinalizer(void*, PreFinalizerCallback); void InvokePreFinalizers(); // Adds the given observer to the ThreadState's observer list. This doesn't @@ -567,6 +566,9 @@ BlinkGC::GCReason reason_for_scheduled_gc_ = BlinkGC::GCReason::kForcedGCForTesting; + using PreFinalizerCallback = bool (*)(void*); + using PreFinalizer = std::pair<void*, PreFinalizerCallback>; + // Pre-finalizers are called in the reverse order in which they are // registered by the constructors (including constructors of Mixin objects) // for an object, by processing the ordered_pre_finalizers_ back-to-front. @@ -615,7 +617,7 @@ friend class IncrementalMarkingTestDriver; friend class HeapAllocator; template <typename T> - friend class PreFinalizerRegistration; + friend class PrefinalizerRegistration; friend class TestGCScope; friend class TestSupportingGC; friend class ThreadStateSchedulingTest;
diff --git a/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc b/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc index fc13ef4..d240762 100644 --- a/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc +++ b/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc
@@ -16,12 +16,10 @@ FilteringNetworkManager::FilteringNetworkManager( rtc::NetworkManager* network_manager, - const GURL& requesting_origin, media::MediaPermission* media_permission, bool allow_mdns_obfuscation) : network_manager_(network_manager), media_permission_(media_permission), - requesting_origin_(requesting_origin), allow_mdns_obfuscation_(allow_mdns_obfuscation) { DETACH_FROM_THREAD(thread_checker_); set_enumeration_permission(ENUMERATION_BLOCKED);
diff --git a/third_party/blink/renderer/platform/p2p/filtering_network_manager.h b/third_party/blink/renderer/platform/p2p/filtering_network_manager.h index 1bc2156..8243e2f 100644 --- a/third_party/blink/renderer/platform/p2p/filtering_network_manager.h +++ b/third_party/blink/renderer/platform/p2p/filtering_network_manager.h
@@ -13,7 +13,6 @@ #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/webrtc/rtc_base/network.h" #include "third_party/webrtc/rtc_base/third_party/sigslot/sigslot.h" -#include "url/gurl.h" namespace media { class MediaPermission; @@ -34,8 +33,6 @@ // rtc::NetworkManagerBase to have the same implementation of // GetAnyAddressNetworks(). We can't mark the whole class PLATFORM_EXPORT // as it requires all super classes to be PLATFORM_EXPORT as well. -// -// TODO(crbug.com/787254): Also, move it away from url/gurl.h. class FilteringNetworkManager : public rtc::NetworkManagerBase, public sigslot::has_slots<> { public: @@ -43,7 +40,6 @@ // worker thread |task_runner|. PLATFORM_EXPORT FilteringNetworkManager( rtc::NetworkManager* network_manager, - const GURL& requesting_origin, media::MediaPermission* media_permission, bool allow_mdns_obfuscation); @@ -116,8 +112,6 @@ // the setup time. base::TimeTicks start_updating_time_; - GURL requesting_origin_; - // When the mDNS obfuscation is allowed, access to the mDNS responder provided // by the base network manager is provided to conceal IPs with mDNS hostnames. bool allow_mdns_obfuscation_ = true;
diff --git a/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc b/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc index 6b2da1ad..177722f 100644 --- a/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc +++ b/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc
@@ -171,7 +171,7 @@ SetNewNetworkForBaseNetworkManager(); if (multiple_routes_requested) { network_manager_ = std::make_unique<FilteringNetworkManager>( - base_network_manager_.get(), GURL(), media_permission_.get(), + base_network_manager_.get(), media_permission_.get(), allow_mdns_obfuscation_); network_manager_->Initialize(); } else {
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py index cc42cf6..1f638a8 100755 --- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py +++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -319,6 +319,7 @@ 'url::.+', # Nested namespaces under the blink namespace + 'bindings::.+', 'canvas_heuristic_parameters::.+', 'compositor_target_property::.+', 'cors::.+',
diff --git a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item index d7cf7f6..f9b360a 100644 --- a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item +++ b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
@@ -20,9 +20,9 @@ crbug.com/982194 accessibility/table-with-empty-thead-causes-crash.html [ Failure ] crbug.com/982194 compositing/geometry/limit-layer-bounds-opacity-transition.html [ Failure ] crbug.com/982194 compositing/geometry/limit-layer-bounds-positioned.html [ Failure ] -crbug.com/982194 compositing/gestures/gesture-tapHighlight-img-and-text-2.html [ Failure ] -crbug.com/309675 compositing/gestures/gesture-tapHighlight-simple-longPress.html [ Pass ] -crbug.com/982194 compositing/iframes/layout-on-compositing-change.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-img-and-text-2.html [ Failure Pass ] +crbug.com/309675 compositing/gestures/gesture-tapHighlight-simple-longPress.html [ Failure Pass ] +crbug.com/982194 compositing/iframes/layout-on-compositing-change.html [ Failure Pass ] crbug.com/982194 compositing/squashing/selection-repaint-with-gaps.html [ Failure ] crbug.com/982194 compositing/squashing/squash-transform-repainting-child.html [ Failure ] crbug.com/982194 compositing/squashing/squash-transform-repainting-transformed-child.html [ Failure ] @@ -32,16 +32,16 @@ crbug.com/982194 css3/selectors3/xml/css3-modsel-3.xml [ Failure Pass ] crbug.com/663585 editing/pasteboard/data-transfer-items-image-png.html [ Pass ] crbug.com/982194 editing/pasteboard/dragstart-contains-default-content.html [ Failure ] -crbug.com/982194 editing/pasteboard/drop-text-without-selection.html [ Failure ] +crbug.com/982194 editing/pasteboard/drop-text-without-selection.html [ Failure Pass ] crbug.com/982194 editing/selection/anchor-focus2.html [ Failure ] crbug.com/982194 editing/selection/anchor-focus3.html [ Failure ] crbug.com/982194 editing/selection/android-longtap-not-select-empty.html [ Failure ] crbug.com/982194 editing/selection/continuations-with-move-caret-to-boundary.html [ Failure ] crbug.com/982194 editing/selection/drag-select-rapidly.html [ Failure ] crbug.com/982194 editing/selection/drag-selection-nodes.html [ Failure ] -crbug.com/982194 editing/selection/drag_with_unfocused_selection.html [ Failure ] +crbug.com/982194 editing/selection/drag_with_unfocused_selection.html [ Failure Pass ] crbug.com/982194 editing/selection/first-letter-mouse-select-full-text.html [ Failure ] -crbug.com/982194 editing/selection/focus-and-display-none.html [ Failure ] +crbug.com/982194 editing/selection/focus-and-display-none.html [ Failure Pass ] crbug.com/982194 editing/selection/last-empty-inline.html [ Failure ] crbug.com/245154 editing/selection/modify_move/move-by-character-brute-force.html [ Pass ] crbug.com/24182 editing/selection/modify_move/move-by-word-visually-crash-test-5.html [ Pass ] @@ -52,11 +52,11 @@ crbug.com/982194 editing/selection/mouse/mouse-selection-horizontal.html [ Failure ] crbug.com/982194 editing/selection/mouse/mouse-selection-vertical-lr.html [ Failure ] crbug.com/982194 editing/selection/mouse/mouse-selection-vertical-rl.html [ Failure ] -crbug.com/982194 editing/selection/mouse/overidden_user_select_in_dom_tree.html [ Failure ] +crbug.com/982194 editing/selection/mouse/overidden_user_select_in_dom_tree.html [ Failure Pass ] crbug.com/982194 editing/selection/mouse/select_across_readonly_input.html [ Failure ] crbug.com/982194 editing/selection/offset-from-point-complex-scripts.html [ Failure ] crbug.com/982194 editing/selection/offset-from-point.html [ Failure ] -crbug.com/591099 editing/selection/paint-hyphen.html [ Pass ] +crbug.com/591099 editing/selection/paint-hyphen.html [ Failure Pass ] crbug.com/741259 editing/selection/select-bidi-run.html [ Failure ] crbug.com/982194 editing/selection/select-line-break-with-opposite-directionality.html [ Failure ] crbug.com/982194 editing/selection/select-out-of-floated-contenteditable.html [ Failure ] @@ -71,40 +71,38 @@ crbug.com/626703 external/wpt/acid/acid3/test.html [ Pass ] crbug.com/986282 external/wpt/client-hints/accept-ch-lifetime.tentative.https.html [ Crash Pass ] crbug.com/982194 external/wpt/css/CSS2/floats-clear/float-non-replaced-height-001.xht [ Failure ] -crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-149.xht [ Failure Pass ] crbug.com/982194 external/wpt/css/CSS2/floats/floats-rule3-outside-left-002.xht [ Failure ] crbug.com/982194 external/wpt/css/CSS2/floats/floats-rule3-outside-right-002.xht [ Failure ] crbug.com/982194 external/wpt/css/CSS2/floats/floats-rule7-outside-left-001.xht [ Failure ] crbug.com/982194 external/wpt/css/CSS2/floats/floats-rule7-outside-right-001.xht [ Failure ] crbug.com/982194 external/wpt/css/CSS2/floats/hit-test-floats-001.html [ Failure ] -crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-float-with-inline-container.html [ Crash Failure ] +crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-float-with-inline-container.html [ Failure ] crbug.com/982194 external/wpt/css/CSS2/positioning/toogle-abspos-on-relpos-inline-child.html [ Failure ] -crbug.com/982194 external/wpt/css/css-contain/contain-layout-017.html [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/contain-paint-021.html [ Pass ] +crbug.com/982194 external/wpt/css/css-contain/contain-layout-017.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-021.html [ Failure Pass ] crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-layout-repeat-notation.html [ Failure ] crbug.com/982194 external/wpt/css/css-overflow/overflow-inline-transform-relative.html [ Failure ] crbug.com/982194 external/wpt/css/css-position/position-absolute-in-inline-002.html [ Failure ] crbug.com/984438 external/wpt/css/css-scroll-snap/snap-at-user-scroll-end-manual.html [ Failure ] -crbug.com/982194 external/wpt/css/css-sizing/orthogonal-writing-mode-float-in-inline.html [ Failure Pass ] crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-color.html [ Pass ] crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-color-001.xht [ Failure ] crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-left-001.xht [ Failure ] -crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-left-002.xht [ Pass ] +crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-left-002.xht [ Failure Pass ] crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-right-001.xht [ Failure ] -crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-right-002.xht [ Pass ] -crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-left-001.xht [ Pass ] -crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-left-002.xht [ Pass ] -crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-right-001.xht [ Pass ] -crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-right-002.xht [ Pass ] +crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-right-002.xht [ Failure Pass ] +crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-left-001.xht [ Failure Pass ] +crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-left-002.xht [ Failure Pass ] +crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-right-001.xht [ Failure Pass ] +crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-right-002.xht [ Failure Pass ] crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-filled-001.xht [ Failure ] crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-open-001.xht [ Failure ] crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-shape-001.xht [ Failure ] crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-string-001.xht [ Failure ] -crbug.com/982194 external/wpt/css/css-text-decor/text-underline-offset-002.html [ Pass ] -crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-018.html [ Pass ] -crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-019.html [ Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-underline-offset-002.html [ Failure Pass ] +crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-018.html [ Failure Pass ] +crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-019.html [ Failure Pass ] crbug.com/982194 external/wpt/css/css-text/white-space/white-space-intrinsic-size-003.html [ Failure ] -crbug.com/669473 external/wpt/css/css-ui/outline-016.html [ Pass ] +crbug.com/669473 external/wpt/css/css-ui/outline-016.html [ Failure Pass ] crbug.com/982194 external/wpt/css/css-ui/text-overflow-ruby.html [ Failure ] crbug.com/982194 external/wpt/css/css-writig-modes/sizing-orthog-htb-in-vlr-011.xht [ Failure ] crbug.com/982194 external/wpt/css/css-writing-modes/inline-block-alignment-003.xht [ Failure ] @@ -118,47 +116,47 @@ crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-inline-vrl-ltr.html [ Failure ] crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-inline-vrl-rtl.html [ Failure ] crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-simple.html [ Failure ] -crbug.com/982194 external/wpt/css/cssom-view/offsetTopLeft-trailing-space-inline.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/offsetTopLeft-trailing-space-inline.html [ Failure Pass ] crbug.com/982194 external/wpt/css/csui/text-overflow-002.html [ Failure ] crbug.com/982194 external/wpt/css/filter-effects/filtered-inline-applies-to-float.html [ Failure ] crbug.com/982194 external/wpt/css/filter-effects/filtered-inline-is-container.html [ Failure ] crbug.com/846656 external/wpt/css/selectors/focus-visible-002-manual.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/dependent-builtin.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-fallback-invalid.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-fallback.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-negative-invalid.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-negative.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-pad-invalid.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-pad.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-prefix-invalid.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-prefix.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-range-invalid.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-range.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-suffix-invalid.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-symbols-invalid.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-symbols.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/name-case-sensitivity.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/redefine-attr-mapping.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/redefine-builtin.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-alphabetic.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-cyclic.html [ Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/dependent-builtin.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-fallback-invalid.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-fallback.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-negative-invalid.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-negative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-pad-invalid.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-pad.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-prefix-invalid.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-prefix.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-range-invalid.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-range.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-suffix-invalid.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-symbols-invalid.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-symbols.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/name-case-sensitivity.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/redefine-attr-mapping.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/redefine-builtin.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-alphabetic.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-cyclic.html [ Failure Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-extends.html [ Failure ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-fixed.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-numeric.html [ Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-fixed.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-numeric.html [ Failure Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-symbolic.html [ Failure ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-horiz-001a.xhtml [ Failure ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-horiz-001b.xhtml [ Failure ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-horiz-002.xhtml [ Failure ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-vert-002.xhtml [ Failure ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-vert-rtl-005.xhtml [ Failure ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-003.html [ Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-003.html [ Failure Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-001.html [ Failure ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-002.html [ Failure ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-vert-006.xhtml [ Failure ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-wmvert-001.xhtml [ Failure ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002a.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002b.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002c.html [ Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002a.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002b.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002c.html [ Failure Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-safe-overflow-position-001.html [ Failure ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outde-padding-box-border-radius-001.html [ Failure ] crbug.com/982194 external/wpt/dom/ranges/Range-set.html [ Pass ] @@ -189,13 +187,13 @@ crbug.com/626703 external/wpt/infrastructure/testdriver/actions/eventOrder.html [ Timeout ] crbug.com/982194 external/wpt/intersection-observe/v2/scaled-target.html [ Failure ] crbug.com/982194 external/wpt/intersection-observer/v2/drop-shadow-filter-vertical-rl.html [ Failure ] -crbug.com/982194 external/wpt/intersection-observer/v2/inline-occlusion.html [ Failure ] +crbug.com/982194 external/wpt/intersection-observer/v2/inline-occlusion.html [ Failure Pass ] crbug.com/982194 external/wpt/largest-contentful-paint/larger-text.html [ Timeout ] crbug.com/982194 external/wpt/largest-contentful-paint/observe-text.html [ Timeout ] crbug.com/982194 external/wpt/largest-contentful-paint/text-with-display-style.html [ Timeout ] -crbug.com/982194 external/wpt/payment-request/payment-request-abort-method.https.html [ Failure ] -crbug.com/982194 external/wpt/payment-request/payment-request-canmakepayment-method.https.html [ Failure ] -crbug.com/982194 external/wpt/payment-request/payment-request-hasenrolledinstrument-method.tentative.https.html [ Failure ] +crbug.com/982194 external/wpt/payment-request/payment-request-abort-method.https.html [ Failure Pass ] +crbug.com/982194 external/wpt/payment-request/payment-request-canmakepayment-method.https.html [ Failure Pass ] +crbug.com/982194 external/wpt/payment-request/payment-request-hasenrolledinstrument-method.tentative.https.html [ Failure Pass ] crbug.com/982194 external/wpt/pointerevents/extension/pointerevent_touch-action-pan-down-css_touch.html [ Timeout ] crbug.com/982194 external/wpt/pointerevents/extension/pointerevent_touch-action-pan-left-css_touch.html [ Timeout ] crbug.com/982194 external/wpt/pointerevents/extension/pointerevent_touch-action-pan-right-css_touch.html [ Timeout ] @@ -209,10 +207,10 @@ crbug.com/645988 external/wpt/uievents/order-of-events/focus-events/focus-manual.html [ Failure ] crbug.com/1002514 external/wpt/web-share/share-sharePromise-internal-slot.https.html [ Pass ] crbug.com/982194 external/wpt/webrtc/RTCPeerConnection-ondatachannel.html [ Failure Pass ] -crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/outline_properties.html [ Pass ] -crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/outline_shorthand.html [ Pass ] -crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/outline_properties.html [ Pass ] -crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/outline_shorthand.html [ Pass ] +crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/outline_properties.html [ Failure Pass ] +crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/outline_shorthand.html [ Failure Pass ] +crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/outline_properties.html [ Failure Pass ] +crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/outline_shorthand.html [ Failure Pass ] crbug.com/982194 external/wpt/webxr/events_referenceSpace_reset_inline.https.html [ Timeout ] crbug.com/982194 fast/backgrounds/background-clip-text-multiline-linebreak.html [ Failure ] crbug.com/982194 fast/backgrounds/background-clip-text-multiline.html [ Crash ] @@ -222,19 +220,17 @@ crbug.com/982194 fast/block/float/float-in-float-hit-testing.html [ Failure ] crbug.com/982194 fast/block/float/overhanging-float-container-add-compositing.html [ Failure ] crbug.com/982194 fast/block/float/relative-painted-twice.html [ Failure ] -crbug.com/982194 fast/block/positioning/absolute-in-inline-dynamic.html [ Failure Pass ] +crbug.com/982194 fast/block/positioning/absolute-in-inline-dynamic.html [ Failure ] crbug.com/982194 fast/block/positioning/hittest-on-relative-positioned-children.html [ Failure ] crbug.com/982194 fast/block/positioning/rel-positioned-inline-changes-width.html [ Failure ] crbug.com/982194 fast/css-generated-content/table-parts-before-and-after.html [ Failure ] crbug.com/982194 fast/css/area-computedStyle.html [ Timeout ] crbug.com/982194 fast/css/first-line-hover-001.html [ Failure ] crbug.com/982194 fast/css/getComputedStyle/computed-style-percentage-top-with-position-inline.html [ Failure ] -crbug.com/982194 fast/css/hover-active-quirks.html [ Failure ] -crbug.com/982194 fast/css/invalidation-errors-2.html [ Failure Pass ] -crbug.com/982194 fast/css/invalidation-errors.html [ Failure Pass ] +crbug.com/982194 fast/css/hover-active-quirks.html [ Failure Pass ] crbug.com/835484 fast/css/outline-narrowLine.html [ Failure ] crbug.com/982194 fast/css/pseudo-element-hit-test.html [ Crash ] -crbug.com/982194 fast/css/unknown-pseudo-element-matching.html [ Failure ] +crbug.com/982194 fast/css/unknown-pseudo-element-matching.html [ Failure Pass ] crbug.com/982194 fast/dnd/link-dragging-draggable-div-with-dragged-link.html [ Timeout ] crbug.com/982194 fast/dnd/link-dragging-draggable-div-with-link.html [ Timeout ] crbug.com/982194 fast/dnd/link-dragging-draggable-link.html [ Timeout ] @@ -253,23 +249,23 @@ crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-child-frame-content.html [ Failure ] crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-culled-inline-with-linebreak.html [ Failure ] crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-culled-inlines-between-silblings-bidi.html [ Failure ] -crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-culled-inlines-between-silblings.html [ Failure ] +crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-culled-inlines-between-silblings.html [ Failure Pass ] crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-culled-inlines.html [ Failure ] crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-embedded-frame-content.html [ Failure ] crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-inner-documents.html [ Failure ] crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-links-and-text.html [ Failure ] -crbug.com/982194 fast/dom/shadow/hover-active-drag-distributed-nodes.html [ Failure ] -crbug.com/982194 fast/dom/shadow/touch-event.html [ Failure ] +crbug.com/982194 fast/dom/shadow/hover-active-drag-distributed-nodes.html [ Failure Pass ] +crbug.com/982194 fast/dom/shadow/touch-event.html [ Failure Pass ] crbug.com/874695 fast/events/autoscroll-iframe-no-scrolling.html [ Pass ] crbug.com/982194 fast/events/autoscroll-should-not-stop-on-keypress.html [ Failure ] -crbug.com/982194 fast/events/content-changed-during-drop.html [ Failure ] -crbug.com/663847 fast/events/context-no-deselect.html [ Pass ] +crbug.com/982194 fast/events/content-changed-during-drop.html [ Failure Pass ] +crbug.com/663847 fast/events/context-no-deselect.html [ Failure Pass ] crbug.com/982194 fast/events/drag-in-frames.html [ Failure ] crbug.com/346473 fast/events/drag-on-mouse-move-cancelled.html [ Failure ] -crbug.com/982194 fast/events/drag_and_drop_into_removed_on_focus.html [ Failure ] +crbug.com/982194 fast/events/drag_and_drop_into_removed_on_focus.html [ Failure Pass ] crbug.com/982194 fast/events/event-on-culled-inline-with-pseudo.html [ Failure ] crbug.com/874695 fast/events/frame-detached-in-mousedown.html [ Pass ] -crbug.com/982194 fast/events/middleClickAutoscroll-click-hyperlink.html [ Failure ] +crbug.com/982194 fast/events/middleClickAutoscroll-click-hyperlink.html [ Failure Pass ] crbug.com/982194 fast/events/open-window-from-another-frame.html [ Timeout ] crbug.com/982194 fast/events/pointerevents/mouse-node-remove.html [ Failure ] crbug.com/982194 fast/events/pointerevents/mouse-pointer-capture-transition-events.html [ Failure ] @@ -282,16 +278,16 @@ crbug.com/982194 fast/events/pointerevents/touch-pointer-events.html [ Failure ] crbug.com/874695 fast/events/popup-blocking-timers4.html [ Pass ] crbug.com/982194 fast/events/selectstart-by-single-click-with-shift.html [ Failure ] -crbug.com/982194 fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure ] -crbug.com/982194 fast/events/simulated-click-coords.html [ Failure ] +crbug.com/982194 fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure Pass ] +crbug.com/982194 fast/events/simulated-click-coords.html [ Failure Pass ] crbug.com/591099 fast/events/touch/compositor-touch-hit-rects.html [ Failure ] crbug.com/982194 fast/events/touch/gesture/gesture-tap-mouse-events-between-frames.html [ Failure ] crbug.com/982194 fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure ] crbug.com/874695 fast/forms/color/color-suggestion-picker-one-row-appearance.html [ Failure ] crbug.com/874695 fast/forms/color/color-suggestion-picker-two-row-appearance.html [ Failure ] -crbug.com/982194 fast/forms/focus-selection-input.html [ Failure ] -crbug.com/982194 fast/forms/focus-selection-textarea.html [ Failure ] -crbug.com/982194 fast/forms/label/label-click.html [ Failure ] +crbug.com/982194 fast/forms/focus-selection-input.html [ Failure Pass ] +crbug.com/982194 fast/forms/focus-selection-textarea.html [ Failure Pass ] +crbug.com/982194 fast/forms/label/label-click.html [ Failure Pass ] crbug.com/982194 fast/forms/label/label-selection-by-dragging.html [ Failure ] crbug.com/982194 fast/forms/label/label-selection-by-textSelection-and-click.html [ Failure ] crbug.com/874695 fast/forms/number/number-spinbutton-gets-disabled-or-readonly.html [ Pass ] @@ -304,33 +300,33 @@ crbug.com/889721 fast/inline/outline-continuations.html [ Failure ] crbug.com/982194 fast/inline/relative-positioned-overflow.html [ Failure ] crbug.com/982194 fast/inline/styledEmptyInlinesWithBRs.html [ Failure ] -crbug.com/982194 fast/multicol/newmulticol/hide-box-vertical-lr.html [ Pass ] -crbug.com/982194 fast/multicol/span/vertical-lr.html [ Pass ] -crbug.com/982194 fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Pass ] -crbug.com/982194 fast/multicol/vertical-lr/nested-columns.html [ Pass ] +crbug.com/982194 fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure Pass ] +crbug.com/982194 fast/multicol/span/vertical-lr.html [ Failure Pass ] +crbug.com/982194 fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Failure Pass ] +crbug.com/982194 fast/multicol/vertical-lr/nested-columns.html [ Failure Pass ] crbug.com/982194 fast/replaced/absolute-position-percentage-height.html [ Failure ] crbug.com/814953 fast/replaced/no-focus-ring-iframe.html [ Failure ] crbug.com/986018 fast/scroll-snap/snaps-for-different-key-granularity.html [ Pass ] -crbug.com/889952 fast/selectors/selection-window-inactive.html [ Pass ] +crbug.com/889952 fast/selectors/selection-window-inactive.html [ Failure Pass ] crbug.com/591099 fast/selectors/shadow-host-div-with-span.html [ Failure ] crbug.com/591099 fast/selectors/shadow-host-div-with-text.html [ Failure ] crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-clip-path-selection.html [ Failure ] crbug.com/982194 fast/spatial-navigation/snav-clipped-overflowed-content.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-fragmented-link.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-fully-aligned-horizontally.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-hidden-focusable-element.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-hidden-iframe-zero-size.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-hidden-iframe.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-iframe-nested.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-iframe-no-scrollable-content.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-iframe-recursive-offset-parent.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-iframe-with-outside-focusable-element.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-ignore-hidden-or-transparent.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-media-elements.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-only-clipped-overflow-content.html [ Failure ] +crbug.com/982194 fast/spatial-navigation/snav-fragmented-link.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-fully-aligned-horizontally.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-hidden-focusable-element.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-hidden-iframe-zero-size.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-hidden-iframe.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-iframe-nested.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-iframe-no-scrollable-content.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-iframe-recursive-offset-parent.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-iframe-with-outside-focusable-element.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-ignore-hidden-or-transparent.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-media-elements.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-only-clipped-overflow-content.html [ Failure Pass ] crbug.com/982194 fast/spatial-navigation/snav-stay-in-overflow-div.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-tiny-table-traversal.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-zero-margin-content.html [ Failure ] +crbug.com/982194 fast/spatial-navigation/snav-tiny-table-traversal.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-zero-margin-content.html [ Failure Pass ] crbug.com/874695 fast/table/multiple-captions-crash3.html [ Pass ] crbug.com/982194 fast/text-autosizing/layout-after-append.html [ Failure ] crbug.com/982194 fast/writing-mode/border-image-vertical-lr.html [ Failure ] @@ -339,23 +335,23 @@ crbug.com/718155 fullscreen/full-screen-iframe-not-allowed.html [ Failure ] crbug.com/982194 hittesting/culled-inline-crash.html [ Failure ] crbug.com/982194 hittesting/inline-with-clip-path.html [ Failure ] -crbug.com/982194 html/sections/body-legacy-colors.html [ Timeout ] +crbug.com/982194 html/sections/body-legacy-colors.html [ Crash Pass Timeout ] crbug.com/591099 virtual/text-antialias/selection/inline-block-in-selection-root.html [ Pass ] -crbug.com/591099 virtual/text-antialias/selection/selection-rect-line-height-too-small.html [ Pass ] +crbug.com/591099 virtual/text-antialias/selection/selection-rect-line-height-too-small.html [ Failure Pass ] crbug.com/869364 crbug.com/874695 http/tests/devtools/console/console-correct-suggestions.js [ Crash Pass Timeout ] crbug.com/451577 crbug.com/924308 http/tests/devtools/console/console-dir-es6.js [ Crash Failure Pass Timeout ] crbug.com/451577 crbug.com/924308 http/tests/devtools/console/console-format-es6-2.js [ Crash Failure Pass Timeout ] crbug.com/451577 crbug.com/916975 http/tests/devtools/console/console-repeat-count.js [ Crash Failure Pass Timeout ] crbug.com/451577 http/tests/devtools/console/console-search.js [ Pass ] -crbug.com/967526 http/tests/devtools/console/console-uncaught-promise.js [ Pass ] +crbug.com/967526 http/tests/devtools/console/console-uncaught-promise.js [ Failure Pass ] crbug.com/982194 http/tests/devtools/coverage/decorations-after-script-formatter.js [ Pass Timeout ] crbug.com/678482 http/tests/devtools/debugger/fetch-breakpoints.js [ Pass Timeout ] -crbug.com/846997 http/tests/devtools/editor/text-editor-ctrl-d-1.js [ Timeout ] +crbug.com/846997 http/tests/devtools/editor/text-editor-ctrl-d-1.js [ Pass Timeout ] crbug.com/850358 http/tests/devtools/editor/text-editor-enter-behaviour.js [ Pass Timeout ] crbug.com/846982 crbug.com/874695 http/tests/devtools/editor/text-editor-formatter.js [ Crash Pass Timeout ] crbug.com/420008 crbug.com/749738 http/tests/devtools/editor/text-editor-word-jumps.js [ Crash Pass Timeout ] crbug.com/596486 http/tests/devtools/elements/insert-node.js [ Pass ] -crbug.com/937811 http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Pass ] +crbug.com/937811 http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Pass Timeout ] crbug.com/937811 http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-3.js [ Pass Timeout ] crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-1/color-aware-property-value-edit.js [ Crash Pass Timeout ] crbug.com/982194 http/tests/devtools/elements/styles-1/css-live-edit.js [ Pass Timeout ] @@ -363,7 +359,7 @@ crbug.com/510337 http/tests/devtools/elements/styles-1/edit-value-url-with-color.js [ Pass ] crbug.com/528419 http/tests/devtools/elements/styles-2/pseudo-elements.js [ Pass ] crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-3/style-autocomplete.js [ Crash Pass Timeout ] -crbug.com/938884 http/tests/devtools/elements/styles-3/styles-add-blank-property.js [ Pass Timeout ] +crbug.com/938884 http/tests/devtools/elements/styles-3/styles-add-blank-property.js [ Timeout ] crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule-tab.js [ Failure Timeout ] crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule.js [ Timeout ] crbug.com/945665 http/tests/devtools/elements/styles-3/styles-change-node-while-editing.js [ Failure ] @@ -375,14 +371,14 @@ crbug.com/982116 http/tests/devtools/elements/styles-4/styles-new-API.js [ Pass Timeout ] crbug.com/849978 http/tests/devtools/elements/styles-4/stylesheet-source-url-comment.js [ Timeout ] crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-4/undo-add-new-rule.js [ Crash Pass Timeout ] -crbug.com/978304 http/tests/devtools/elements/styles-4/undo-add-property.js [ Pass Timeout ] -crbug.com/982194 http/tests/devtools/elements/styles/styles-mouse-test.js [ Failure ] +crbug.com/978304 http/tests/devtools/elements/styles-4/undo-add-property.js [ Timeout ] +crbug.com/982194 http/tests/devtools/elements/styles/styles-mouse-test.js [ Failure Pass ] crbug.com/451577 http/tests/devtools/elements/user-properties.js [ Pass ] crbug.com/941860 http/tests/devtools/extensions/extensions-events.js [ Pass ] crbug.com/246190 crbug.com/989860 http/tests/devtools/indexeddb/live-update-indexeddb-list.js [ Crash Failure Pass Timeout ] -crbug.com/336481 http/tests/devtools/jump-to-previous-editing-location.js [ Pass ] +crbug.com/336481 http/tests/devtools/jump-to-previous-editing-location.js [ Failure Pass ] crbug.com/327078 http/tests/devtools/network/long-script-content.js [ Pass ] -crbug.com/938200 http/tests/devtools/network/network-blocked-reason.js [ Pass Timeout ] +crbug.com/938200 http/tests/devtools/network/network-blocked-reason.js [ Timeout ] crbug.com/982194 http/tests/devtools/network/network-cookies-pane.js [ Failure ] crbug.com/679833 crbug.com/762529 http/tests/devtools/network/network-datareceived.js [ Crash Failure Timeout ] crbug.com/759632 http/tests/devtools/network/network-datasaver-warning.js [ Failure ] @@ -395,7 +391,7 @@ crbug.com/849670 http/tests/devtools/service-workers/service-worker-v8-cache.js [ Timeout ] crbug.com/874695 crbug.com/954319 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-in-multiple-workers.js [ Crash Pass Timeout ] crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-shifted-breakpoint.js [ Pass ] -crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/dom-breakpoints.js [ Pass ] +crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/dom-breakpoints.js [ Crash Pass ] crbug.com/450493 crbug.com/912793 http/tests/devtools/sources/debugger-breakpoints/restore-locations-for-breakpoint-with-broken-source-map.js [ Crash Failure Pass Timeout ] crbug.com/874695 http/tests/devtools/sources/debugger-frameworks/frameworks-dom-xhr-event-breakpoints.js [ Pass ] crbug.com/450493 crbug.com/916975 http/tests/devtools/sources/debugger-ui/call-stack-show-more.js [ Crash Failure Pass Timeout ] @@ -411,17 +407,17 @@ crbug.com/982194 http/tests/input/discard-events-to-unstable-iframe.html [ Failure ] crbug.com/982194 http/tests/inspector-protocol/target/target-expose-devtools-protocol.js [ Failure ] crbug.com/982194 http/tests/media/video-frame-size-change.html [ Failure Pass ] -crbug.com/24182 http/tests/misc/acid3.html [ Pass ] +crbug.com/24182 http/tests/misc/acid3.html [ Failure Pass ] crbug.com/874695 http/tests/misc/drag-not-loaded-image.html [ Pass ] -crbug.com/982194 http/tests/navigation/ping-cookie.html [ Timeout ] -crbug.com/982194 http/tests/navigation/ping-cross-origin-from-https.html [ Timeout ] -crbug.com/982194 http/tests/navigation/ping-cross-origin.html [ Timeout ] -crbug.com/982194 http/tests/navigation/ping-same-origin.html [ Timeout ] +crbug.com/982194 http/tests/navigation/ping-cookie.html [ Pass Timeout ] +crbug.com/982194 http/tests/navigation/ping-cross-origin-from-https.html [ Pass Timeout ] +crbug.com/982194 http/tests/navigation/ping-cross-origin.html [ Pass Timeout ] +crbug.com/982194 http/tests/navigation/ping-same-origin.html [ Pass Timeout ] crbug.com/874695 http/tests/permissions/chromium/test-request-worker.html [ Pass Timeout ] -crbug.com/982194 http/tests/security/anchor-download-allow-blob.html [ Timeout ] -crbug.com/982194 http/tests/security/anchor-download-allow-data.html [ Timeout ] -crbug.com/982194 http/tests/security/anchor-download-allow-sameorigin.html [ Timeout ] -crbug.com/982194 http/tests/security/contentSecurityPolicy/frame-src-vs-shift-click.html [ Timeout ] +crbug.com/982194 http/tests/security/anchor-download-allow-blob.html [ Pass Timeout ] +crbug.com/982194 http/tests/security/anchor-download-allow-data.html [ Pass Timeout ] +crbug.com/982194 http/tests/security/anchor-download-allow-sameorigin.html [ Pass Timeout ] +crbug.com/982194 http/tests/security/contentSecurityPolicy/frame-src-vs-shift-click.html [ Pass Timeout ] crbug.com/982194 http/tests/security/mixedContent/insecure-css-resources.html [ Failure Pass ] crbug.com/24182 images/png-suite/test.html [ Pass ] crbug.com/982194 inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js [ Failure ] @@ -429,9 +425,9 @@ crbug.com/874695 crbug.com/936165 media/autoplay-muted.html [ Crash Pass Timeout ] crbug.com/908347 media/autoplay/webaudio-audio-context-resume.html [ Failure Pass ] crbug.com/942951 media/controls/controls-layout-in-different-size.html [ Pass ] -crbug.com/982194 media/picture-in-picture/v2/detached-iframe.html [ Failure Timeout ] +crbug.com/982194 media/picture-in-picture/v2/detached-iframe.html [ Failure ] crbug.com/982194 media/picture-in-picture/v2/request-picture-in-picture-twice.html [ Failure ] -crbug.com/982194 media/picture-in-picture/v2/request-picture-in-picture.html [ Failure Timeout ] +crbug.com/982194 media/picture-in-picture/v2/request-picture-in-picture.html [ Failure ] crbug.com/874695 media/remoteplayback/prompt-twice-throws.html [ Pass ] crbug.com/982194 paint/invalidation/background/background-misaligned.html [ Failure ] crbug.com/982194 paint/invalidation/block-layout-inline-children-replaced.html [ Failure ] @@ -442,7 +438,6 @@ crbug.com/982194 paint/invalidation/bugzilla-5699.html [ Failure ] crbug.com/982194 paint/invalidation/bugzilla-6278.html [ Failure ] crbug.com/982194 paint/invalidation/bugzilla-7235.html [ Failure ] -crbug.com/982194 paint/invalidation/clip/subtree-root-clip-2.html [ Failure Pass ] crbug.com/982194 paint/invalidation/compositing/iframe-inside-squashed-layer.html [ Failure ] crbug.com/982194 paint/invalidation/compositing/should-not-clip-composited-overflow-scrolling-layer.html [ Failure ] crbug.com/982194 paint/invalidation/compositing/should-not-clip-composited-viewport-scrolling-layer.html [ Failure ] @@ -558,906 +553,907 @@ crbug.com/919789 paint/invalidation/window-resize/window-resize-centered-inline-under-fixed-pos.html [ Failure ] crbug.com/919789 paint/invalidation/window-resize/window-resize-vertical-writing-mode.html [ Failure ] crbug.com/676229 plugins/mouse-click-plugin-clears-selection.html [ Failure ] -crbug.com/982194 tables/mozilla/bugs/bug26553.html [ Failure Pass ] -crbug.com/982194 touchadjustment/disabled-formelements.html [ Failure ] -crbug.com/982194 touchadjustment/html-label.html [ Failure ] -crbug.com/982194 touchadjustment/stylus-generated-gesture-tap.html [ Failure ] -crbug.com/982194 touchadjustment/touch-inlines.html [ Failure ] +crbug.com/982194 touchadjustment/disabled-formelements.html [ Failure Pass ] +crbug.com/982194 touchadjustment/html-label.html [ Failure Pass ] +crbug.com/982194 touchadjustment/stylus-generated-gesture-tap.html [ Failure Pass ] +crbug.com/982194 touchadjustment/touch-inlines.html [ Failure Pass ] crbug.com/982194 touchadjustment/touch-links-longpress.html [ Failure ] -crbug.com/982194 touchadjustment/touch-links-two-finger-tap.html [ Failure ] +crbug.com/982194 touchadjustment/touch-links-two-finger-tap.html [ Failure Pass ] crbug.com/718155 virtual/android/fullscreen/full-screen-iframe-not-allowed.html [ Failure ] crbug.com/982194 virtual/audio-service/http/tests/media/video-frame-size-change.html [ Failure Pass ] crbug.com/874695 crbug.com/936165 virtual/audio-service/media/autoplay-muted.html [ Crash Pass Timeout ] -crbug.com/982194 accessibility/dimensions-include-descendants.html [ Failure Pass ] crbug.com/982194 accessibility/selection-affinity.html [ Failure ] -crbug.com/982194 compositing/gestures/gesture-tapHighlight-img-and-text.html [ Failure Pass ] -crbug.com/982194 compositing/gestures/gesture-tapHighlight-img.html [ Failure Pass ] -crbug.com/982194 compositing/overflow/composited-scroll-with-fractional-translation.html [ Pass ] -crbug.com/982194 css3/filters/backdrop-filter-svg.html [ Pass ] -crbug.com/982194 css3/tab-size-complex-path.html [ Failure Pass ] +crbug.com/982194 animations/rotate-transform-equivalent.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-invisible-inline-squashing.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-invisible-inline.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-nested.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-with-squashing.html [ Failure ] +crbug.com/982194 compositing/overflow/composited-scroll-with-fractional-translation.html [ Failure Pass ] +crbug.com/982194 css2.1/t100801-c544-valgn-00-a-ag.html [ Failure ] +crbug.com/982194 css2.1/t100801-c544-valgn-03-d-agi.html [ Failure ] +crbug.com/982194 css3/blending/background-blend-mode-overlapping-accelerated-elements.html [ Failure ] +crbug.com/982194 css3/filters/backdrop-filter-svg.html [ Failure Pass ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-170b.xml [ Failure Pass ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-175a.xml [ Failure Pass ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-184d.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-184f.xml [ Failure Pass ] crbug.com/982194 custom-elements/form-submission-file.html [ Crash Pass ] -crbug.com/982194 custom-elements/form-validation-bubble-appearance.html [ Failure Pass ] -crbug.com/982194 editing/selection/extend-to-line-boundary.html [ Failure Pass ] -crbug.com/982194 external/wpt/compat/webkit-text-fill-color-property-005.html [ Pass ] +crbug.com/982194 editing/selection/5232159.html [ Failure ] +crbug.com/982194 editing/selection/inline-closest-leaf-child.html [ Failure ] +crbug.com/982194 editing/selection/subpixel-positioned-selection.html [ Failure ] +crbug.com/982194 external/wpt/compat/webkit-text-fill-color-property-005.html [ Failure Pass ] crbug.com/982194 external/wpt/css/CSS2/abspos/abspos-in-block-in-inline-in-relpos-inline.html [ Failure ] -crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-7.html [ Pass ] -crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-8.html [ Pass ] -crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-9.html [ Pass ] -crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001f.xht [ Pass ] -crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002f.xht [ Pass ] -crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-width-applies-to-014.xht [ Pass ] -crbug.com/982194 external/wpt/css/CSS2/text/text-decoration-va-length-001.xht [ Pass ] -crbug.com/982194 external/wpt/css/CSS2/text/text-decoration-va-length-002.xht [ Pass ] -crbug.com/982194 external/wpt/css/CSS2/text/white-space-nowrap-attribute-001.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-align/baseline-rules/grid-item-input-type-number.html [ Pass ] -crbug.com/982194 external/wpt/css/css-align/baseline-rules/grid-item-input-type-text.html [ Pass ] -crbug.com/982194 external/wpt/css/css-backgrounds/background-attachment-local/attachment-local-clipping-color-5.html [ Pass ] -crbug.com/982194 external/wpt/css/css-backgrounds/background-attachment-local/attachment-local-clipping-image-5.html [ Pass ] -crbug.com/982194 external/wpt/css/css-break/avoid-border-break.html [ Pass ] -crbug.com/982194 external/wpt/css/css-break/hit-test-inline-fragmentation-with-border-radius.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-color/t422-rgba-onscreen-multiple-boxes-c.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-color/t425-hsla-onscreen-b.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-color/t425-hsla-onscreen-multiple-boxes-c.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/contain-paint-005.html [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/contain-paint-006.html [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/contain-paint-clip-015.html [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/contain-paint-clip-016.html [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/contain-size-replaced-003b.html [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/contain-size-replaced-003c.html [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/counter-scoping-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/counter-scoping-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/counter-scoping-003.html [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/quote-scoping-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/quote-scoping-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/quote-scoping-003.html [ Pass ] -crbug.com/982194 external/wpt/css/css-contain/quote-scoping-004.html [ Pass ] -crbug.com/982194 external/wpt/css/css-content/quotes-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-content/quotes-013.html [ Pass ] -crbug.com/982194 external/wpt/css/css-content/quotes-021.html [ Pass ] -crbug.com/982194 external/wpt/css/css-content/quotes-022.html [ Pass ] -crbug.com/982194 external/wpt/css/css-content/quotes-025.html [ Pass ] -crbug.com/982194 external/wpt/css/css-content/quotes-033.html [ Pass ] -crbug.com/982194 external/wpt/css/css-display/display-contents-details.html [ Pass ] -crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-table-001-inline.html [ Pass ] +crbug.com/982194 external/wpt/css/CSS2/cascade-import/cascade-import-dynamic-002.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/cascade-import/cascade-import-dynamic-004.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-123.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-7.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-8.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-9.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001f.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002f.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-width-applies-to-014.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-inline-007.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/positioning/position-absolute-007.xht [ Crash Failure ] +crbug.com/982194 external/wpt/css/CSS2/text/text-decoration-va-length-001.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/CSS2/text/text-decoration-va-length-002.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/CSS2/text/white-space-nowrap-attribute-001.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-align/baseline-rules/grid-item-input-type-number.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-align/baseline-rules/grid-item-input-type-text.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-backgrounds/background-attachment-local/attachment-local-clipping-color-5.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-backgrounds/background-attachment-local/attachment-local-clipping-image-5.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-backgrounds/background-image-first-line.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-break/avoid-border-break.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-color/t422-rgba-onscreen-multiple-boxes-c.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-color/t425-hsla-onscreen-b.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-color/t425-hsla-onscreen-multiple-boxes-c.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-clip-015.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-clip-016.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/contain-size-replaced-003b.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/contain-size-replaced-003c.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/counter-scoping-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/counter-scoping-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/counter-scoping-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/quote-scoping-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/quote-scoping-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/quote-scoping-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-contain/quote-scoping-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-content/quotes-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-content/quotes-013.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-content/quotes-021.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-content/quotes-022.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-content/quotes-025.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-content/quotes-033.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-display/display-contents-details.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-table-001-inline.html [ Failure Pass ] crbug.com/982194 external/wpt/css/css-display/display-flow-root-list-item-001.html [ Failure ] -crbug.com/982194 external/wpt/css/css-flexbox/anonymous-flex-item-005.html [ Pass ] -crbug.com/982194 external/wpt/css/css-flexbox/flex-minimum-height-flex-items-005.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-flexbox/flex-minimum-height-flex-items-007.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-flexbox/flex-minimum-width-flex-items-007.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Pass ] +crbug.com/982194 external/wpt/css/css-flexbox/anonymous-flex-item-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-flexbox/flex-minimum-height-flex-items-005.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-flexbox/flex-minimum-height-flex-items-007.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-flexbox/flex-minimum-width-flex-items-007.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Failure Pass ] crbug.com/982194 external/wpt/css/css-flexbox/flexbox_visibility-collapse-line-wrapping.html [ Failure ] -crbug.com/982194 external/wpt/css/css-flexbox/flexbox_visibility-collapse.html [ Pass ] -crbug.com/982194 external/wpt/css/css-flexbox/negative-margins-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-feature-resolution-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-feature-settings-descriptor-01.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-kerning-03.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-05.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-06.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-02.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-03.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-04.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-05.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-06.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-07.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-08.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-09.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-10.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-11.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-12.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-13.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-14.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-15.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-16.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-17.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-18.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-descriptor-01.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-position-01.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/font-variant-position.html [ Pass ] -crbug.com/982194 external/wpt/css/css-fonts/variations/font-descriptor-range-reversed.html [ Pass ] -crbug.com/982194 external/wpt/css/css-grid/alignment/grid-baseline-align-cycles-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-003.html [ Pass ] -crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-004.html [ Pass ] -crbug.com/982194 external/wpt/css/css-grid/animation/grid-template-columns-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-grid/animation/grid-template-rows-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-grid/grid-child-percent-basis-resize-1.html [ Pass ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_visibility-collapse.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-flexbox/negative-margins-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-feature-resolution-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-feature-settings-descriptor-01.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-kerning-03.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-05.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-06.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-02.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-03.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-04.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-05.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-06.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-07.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-08.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-09.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-10.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-11.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-12.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-13.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-14.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-15.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-16.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-17.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-18.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-descriptor-01.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-position-01.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/font-variant-position.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-fonts/variations/font-descriptor-range-reversed.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-grid/alignment/grid-baseline-align-cycles-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-grid/animation/grid-template-columns-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-grid/animation/grid-template-rows-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-grid/grid-child-percent-basis-resize-1.html [ Failure Pass ] crbug.com/982194 external/wpt/css/css-grid/grid-layout-properties.html [ Failure ] -crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-container-ignores-first-letter-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-images/tiled-gradients.html [ Pass ] +crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-container-ignores-first-letter-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-images/tiled-gradients.html [ Failure Pass ] crbug.com/982194 external/wpt/css/css-intrinsic-size/intrinsic-size-015.html [ Crash Pass ] -crbug.com/982194 external/wpt/css/css-lists/content-property/marker-text-matches-circle.html [ Pass ] -crbug.com/982194 external/wpt/css/css-lists/content-property/marker-text-matches-disc.html [ Pass ] -crbug.com/982194 external/wpt/css/css-lists/content-property/marker-text-matches-square.html [ Pass ] -crbug.com/982194 external/wpt/css/css-lists/counter-set-001.html [ Pass ] +crbug.com/982194 external/wpt/css/css-lists/content-property/marker-text-matches-circle.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-lists/content-property/marker-text-matches-disc.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-lists/content-property/marker-text-matches-square.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-lists/counter-set-001.html [ Failure Pass ] crbug.com/982194 external/wpt/css/css-lists/inline-block-list-marker.html [ Failure ] crbug.com/982194 external/wpt/css/css-lists/inline-block-list.html [ Failure ] crbug.com/982194 external/wpt/css/css-lists/inline-list-marker.html [ Failure ] -crbug.com/982194 external/wpt/css/css-lists/inline-list-with-table-child.html [ Pass ] +crbug.com/982194 external/wpt/css/css-lists/inline-list-with-table-child.html [ Failure Pass ] crbug.com/982194 external/wpt/css/css-lists/inline-list.html [ Failure ] -crbug.com/982194 external/wpt/css/css-lists/li-list-item-counter.html [ Pass ] -crbug.com/982194 external/wpt/css/css-lists/li-value-counter-reset-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-lists/li-value-reversed-003.html [ Pass ] -crbug.com/982194 external/wpt/css/css-lists/li-value-reversed-004.html [ Pass ] -crbug.com/982194 external/wpt/css/css-lists/li-value-reversed-005.html [ Pass ] -crbug.com/982194 external/wpt/css/css-lists/list-item-definition.html [ Pass ] +crbug.com/982194 external/wpt/css/css-lists/li-list-item-counter.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-lists/li-value-counter-reset-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-lists/li-value-reversed-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-lists/li-value-reversed-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-lists/li-value-reversed-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-lists/list-item-definition.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-lists/list-style-type-string-002.html [ Failure ] crbug.com/982194 external/wpt/css/css-lists/list-style-type-string-003.html [ Failure ] -crbug.com/982194 external/wpt/css/css-lists/list-style-type-string-005b.html [ Pass ] +crbug.com/982194 external/wpt/css/css-lists/list-style-type-string-005b.html [ Failure Pass ] crbug.com/982194 external/wpt/css/css-lists/list-style-type-string-007.html [ Failure ] crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-recursion-002.svg [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-003.svg [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-004.svg [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-005.svg [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-objectboundingbox-content-clip-transform.svg [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-objectboundingbox-content-clip.svg [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-userspaceonuse-content-clip-transform.svg [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-userspaceonuse-content-clip.svg [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-003.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-004.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-005.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-006.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-008.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-003.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-004.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-005.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-006.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-007.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-008.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-path-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-polygon-013.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-000.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-005.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-nobackground-000.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-nobackground-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-inset-000.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-003.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-004.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-outset-000.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-005.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-006.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-007.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-008.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-009.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-010.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-011.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-rule-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/multicol-width-005.html [ Pass ] -crbug.com/982194 external/wpt/css/css-multicol/nested-with-too-tall-line.html [ Pass ] -crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-009.html [ Pass ] -crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-010.html [ Pass ] -crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-012.html [ Pass ] -crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-013.html [ Pass ] -crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-014.html [ Pass ] -crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-024.html [ Pass ] -crbug.com/982194 external/wpt/css/css-position/position-absolute-center-001.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-position/position-absolute-center-002.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/first-letter-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/first-letter-exclude-inline-child-marker.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/first-letter-exclude-inline-marker.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/first-line-with-before-after.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/first-line-with-out-of-flow.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/grammar-error-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/marker-content-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/marker-content-005.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/marker-content-007.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/marker-content-008.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/marker-content-009.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/marker-content-010.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/marker-content-011.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/marker-content-014.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/marker-font-variant-numeric-normal.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/marker-list-style-position.html [ Pass ] -crbug.com/982194 external/wpt/css/css-pseudo/spelling-error-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-scrollbars/textarea-scrollbar-width-none.html [ Pass ] -crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-radial-gradient-001.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-radial-gradient-002.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-radial-gradient-003.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-radial-gradient-004.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-sizing/clone-intrinsic-size.html [ Pass ] -crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-005.html [ Pass ] -crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-006.html [ Pass ] -crbug.com/982194 external/wpt/css/css-sizing/slice-intrinsic-size.html [ Pass ] -crbug.com/982194 external/wpt/css/css-tables/anonymous-table-ws-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-tables/subpixel-collapsed-borders-003.html [ Pass ] -crbug.com/982194 external/wpt/css/css-tables/subpixel-table-cell-height-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-tables/subpixel-table-cell-width-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-tables/subpixel-table-cell-width-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-tables/subpixel-table-width-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-tables/table-has-box-sizing-border-box-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-tables/toggle-row-display-property-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-tables/visibility-collapse-colspan-003.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-shorthands-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-shorthands-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-linethrough-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-overline-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-underline-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-vertical-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-vertical-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-006.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-007.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-008.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-010.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-012.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-021.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/hyphens/hyphens-out-of-flow-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/hyphens/hyphens-span-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/hyphens/shy-styling-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-in-loose.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-in-loose.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-bidi-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-bidi-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-control-chars-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-end-of-line-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-nesting-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-nesting-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-016.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-017.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-replaced-005.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/overflow-wrap/overflow-wrap-normal-keep-all-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/tab-size/tab-size-spacing-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/tab-size/tab-size.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/text-align/text-align-last-empty-inline.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-text/text-indent/text-indent-tab-positions-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-auto-002.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-bold-script-001.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-initial-001.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-looped-001.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-sans-serif-italic-001.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-script-001.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-stretched-001.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-tailed-001.tentative.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-capitalize-026.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-capitalize-033.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-tailoring-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-upperlower-006.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/white-space/pre-wrap-012.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/white-space/pre-wrap-013.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/white-space/pre-wrap-019.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/white-space/text-space-collapse-discard-001.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-text/white-space/text-space-trim-trim-inner-001.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-text/white-space/textarea-pre-wrap-012.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/white-space/textarea-pre-wrap-013.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-003.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-004.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-003.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-006.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-008.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-inline-004.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-inline-007.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-inline-009.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-my-000.html [ Pass ] -crbug.com/982194 external/wpt/css/css-text/writing-system/writing-system-text-transform-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-transforms/perspective-transforms-equivalence.html [ Pass ] -crbug.com/982194 external/wpt/css/css-ui/appearance-textfield-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-ui/box-sizing-014.html [ Pass ] -crbug.com/982194 external/wpt/css/css-ui/box-sizing-019.html [ Pass ] -crbug.com/982194 external/wpt/css/css-ui/box-sizing-024.html [ Pass ] -crbug.com/982194 external/wpt/css/css-ui/box-sizing-025.html [ Pass ] -crbug.com/982194 external/wpt/css/css-ui/outline-005.html [ Pass ] -crbug.com/982194 external/wpt/css/css-ui/outline-006.html [ Pass ] -crbug.com/982194 external/wpt/css/css-ui/text-overflow-015.html [ Pass ] -crbug.com/982194 external/wpt/css/css-ui/text-overflow-021.html [ Pass ] -crbug.com/982194 external/wpt/css/css-ui/text-overflow-026.html [ Pass ] -crbug.com/982194 external/wpt/css/css-ui/text-overflow-028.html [ Pass ] -crbug.com/982194 external/wpt/css/css-ui/webkit-appearance-menulist-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-ui/webkit-appearance-textfield-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-values/ch-unit-013.html [ Pass ] -crbug.com/982194 external/wpt/css/css-values/ch-unit-014.html [ Pass ] -crbug.com/982194 external/wpt/css/css-values/ch-unit-015.html [ Pass ] -crbug.com/982194 external/wpt/css/css-values/ch-unit-017.html [ Pass ] -crbug.com/982194 external/wpt/css/css-values/ch-unit-018.html [ Pass ] -crbug.com/982194 external/wpt/css/css-will-change/will-change-abspos-cb-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-will-change/will-change-abspos-cb-dynamic-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/available-size-003.html [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/available-size-005.html [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/available-size-013.html [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/available-size-014.html [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/box-offsets-rel-pos-vlr-005.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/box-offsets-rel-pos-vrl-004.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/direction-upright-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/mongolian-orientation-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/mongolian-orientation-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001a.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001b.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001c.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001d.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001e.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001f.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001g.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001h.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001i.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001j.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001k.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001l.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001m.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001n.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001o.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001p.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-003.svg [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-004.svg [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-005.svg [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-objectboundingbox-content-clip-transform.svg [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-objectboundingbox-content-clip.svg [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-userspaceonuse-content-clip-transform.svg [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-userspaceonuse-content-clip.svg [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-008.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-007.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-008.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-path-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-polygon-013.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-000.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-nobackground-000.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-nobackground-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-inset-000.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-outset-000.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-007.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-008.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-009.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-010.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-011.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-rule-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-width-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-multicol/nested-with-too-tall-line.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-009.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-010.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-012.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-013.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-014.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-024.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-paint-api/background-image-alpha.https.html [ Pass ] +crbug.com/982194 external/wpt/css/css-position/position-absolute-center-001.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-position/position-absolute-center-002.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-position/position-sticky-nested-inline.html [ Failure ] +crbug.com/982194 external/wpt/css/css-pseudo/first-letter-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/first-letter-exclude-inline-child-marker.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/first-letter-exclude-inline-marker.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/first-line-change-inline-color-nested.html [ Failure ] +crbug.com/982194 external/wpt/css/css-pseudo/first-line-change-inline-color.html [ Failure ] +crbug.com/982194 external/wpt/css/css-pseudo/first-line-with-before-after.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/first-line-with-out-of-flow.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/grammar-error-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/marker-content-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/marker-content-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/marker-content-007.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/marker-content-008.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/marker-content-009.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/marker-content-010.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/marker-content-011.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/marker-content-014.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/marker-font-variant-numeric-normal.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/marker-list-style-position.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-pseudo/spelling-error-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-scoping/slotted-with-pseudo-element.html [ Failure ] +crbug.com/982194 external/wpt/css/css-scrollbars/textarea-scrollbar-width-none.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-sizing/clone-intrinsic-size.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-sizing/slice-intrinsic-size.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-tables/anonymous-table-ws-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-tables/subpixel-collapsed-borders-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-tables/subpixel-table-cell-height-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-tables/subpixel-table-cell-width-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-tables/subpixel-table-cell-width-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-tables/subpixel-table-width-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-tables/table-has-box-sizing-border-box-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-tables/toggle-row-display-property-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-tables/visibility-collapse-colspan-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-shorthands-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-shorthands-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-subelements-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-linethrough-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-overline-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-underline-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-vertical-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-vertical-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-007.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-008.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-010.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-012.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-021.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/hyphens/hyphens-out-of-flow-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/hyphens/hyphens-span-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/hyphens/shy-styling-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-bidi-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-bidi-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-control-chars-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-end-of-line-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-nesting-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-nesting-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-016.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-017.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-replaced-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/overflow-wrap/overflow-wrap-normal-keep-all-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/tab-size/tab-size-spacing-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/text-indent/text-indent-tab-positions-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-auto-002.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-bold-script-001.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-initial-001.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-looped-001.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-sans-serif-italic-001.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-script-001.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-stretched-001.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-tailed-001.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-capitalize-026.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-capitalize-033.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-tailoring-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-upperlower-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/white-space/pre-wrap-012.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/white-space/pre-wrap-013.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/white-space/pre-wrap-019.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/white-space/text-space-collapse-discard-001.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/white-space/text-space-trim-trim-inner-001.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/white-space/textarea-pre-wrap-012.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/white-space/textarea-pre-wrap-013.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-008.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-inline-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-inline-007.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-inline-009.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-my-000.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-text/writing-system/writing-system-text-transform-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-transforms/perspective-transforms-equivalence.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-ui/appearance-textfield-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-ui/box-sizing-014.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-ui/box-sizing-019.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-ui/box-sizing-024.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-ui/box-sizing-025.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-ui/outline-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-ui/outline-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-ui/text-overflow-015.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-ui/text-overflow-021.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-ui/text-overflow-026.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-ui/text-overflow-028.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-ui/webkit-appearance-menulist-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-ui/webkit-appearance-textfield-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-values/ch-unit-013.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-values/ch-unit-014.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-values/ch-unit-015.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-values/ch-unit-017.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-values/ch-unit-018.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-will-change/will-change-abspos-cb-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-will-change/will-change-abspos-cb-dynamic-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/available-size-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/available-size-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/available-size-013.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/available-size-014.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/box-offsets-rel-pos-vlr-005.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/box-offsets-rel-pos-vrl-004.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/direction-upright-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/mongolian-orientation-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/mongolian-orientation-002.html [ Failure Pass ] crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vrl-013.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-008.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-008.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/text-combine-upright-value-all-001.html [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/text-combine-upright-value-all-002.html [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/text-combine-upright-value-all-003.html [ Pass ] -crbug.com/982194 external/wpt/css/cssom-view/elementFromPoint-mixed-font-sizes.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/cssom-view/getBoundingClientRect-empty-inline.html [ Failure Pass ] -crbug.com/982194 external/wpt/css/cssom-view/getClientRects-inline-inline-child.html [ Failure ] -crbug.com/982194 external/wpt/css/filter-effects/css-filters-animation-combined-001.html [ Pass ] -crbug.com/982194 external/wpt/css/mediaqueries/viewport-script-dynamic.html [ Pass ] -crbug.com/982194 external/wpt/css/motion/offset-path-ray-009.html [ Pass ] -crbug.com/982194 external/wpt/css/motion/offset-path-ray-contain-005.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-003.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-004.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-005.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-006.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-007.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-008.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-rtl-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-rtl-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-vertWM-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-vertWM-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-fallback-align-content-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-003.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-004.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-005.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-006.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-007.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-008.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-rtl-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-rtl-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-vertWM-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-vertWM-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-margin-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-img-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-img-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-003.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-004.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-003.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-004.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-img-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-img-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-003.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-004.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-003.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-004.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ruby-stacking-and-clipping-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-suffix.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/disclosure-styles.html [ Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-008.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-008.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/text-combine-upright-value-all-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/text-combine-upright-value-all-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/text-combine-upright-value-all-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/cssom-view/elementFromPoint.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/getClientRects-inline-inline-child.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/filter-effects/css-filters-animation-combined-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/mediaqueries/viewport-script-dynamic.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/motion/offset-path-ray-009.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/motion/offset-path-ray-contain-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-007.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-008.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-rtl-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-rtl-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-vertWM-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-vertWM-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-007.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-008.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-rtl-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-rtl-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-rtl-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-rtl-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-vertWM-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-vertWM-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-vertWM-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-vertWM-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-fallback-align-content-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-007.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-008.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-rtl-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-rtl-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-vertWM-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-vertWM-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-margin-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-img-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-img-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-img-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-img-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ruby-stacking-and-clipping-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-suffix.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/disclosure-styles.html [ Failure Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/symbols-function-invalid.html [ Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/symbols-function.html [ Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-additive-invalid.html [ Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-additive.html [ Failure ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-alphabetic-invalid.html [ Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-cyclic-invalid.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-extends-invalid.html [ Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-extends-invalid.html [ Failure Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-fixed-invalid.html [ Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-numeric-invalid.html [ Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-symbolic-invalid.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001a.xhtml [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001b.xhtml [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-baseline-horiz-006.xhtml [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001a.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001b.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001a.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001b.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-baseline-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-004.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001b.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002a.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002b.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-004a.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001v.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002v.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005v.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006v.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007v.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001a.xhtml [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001b.xhtml [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002a.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002c.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-paint-ordering-002.xhtml [ Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001a.xhtml [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001b.xhtml [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-baseline-horiz-006.xhtml [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001a.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001b.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001a.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001b.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-baseline-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001b.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002a.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002b.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-004a.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001v.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002v.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005v.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006v.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007v.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001a.xhtml [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001b.xhtml [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002a.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002c.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-paint-ordering-002.xhtml [ Failure Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-010.html [ Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-012.html [ Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-013.html [ Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-014.html [ Pass ] crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-015.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/dir-style-03a.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/dir-style-03b.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-005.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-006.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-007.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-008.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-009.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-010.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-011.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-012.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-037.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-043.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-046.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-047.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-048.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-049.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-022.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-023.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/logical-physical-mapping-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-break-inside-001a.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-001.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-002.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-003.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-004.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-005.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-005a.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-006.html [ Pass ] -crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-006a.html [ Pass ] -crbug.com/982194 external/wpt/encoding/eof-utf-8-three.html [ Pass ] -crbug.com/982194 external/wpt/encoding/eof-utf-8-two.html [ Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/dir-style-03a.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/dir-style-03b.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-007.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-008.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-009.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-010.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-011.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-012.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-037.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-043.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-046.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-047.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-048.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-049.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-022.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-023.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/variables/variable-external-declaration-01.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/variables/variable-external-reference-01.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/variables/variable-external-supports-01.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/logical-physical-mapping-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-break-inside-001a.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-005.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-005a.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-006.html [ Failure Pass ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-006a.html [ Failure Pass ] +crbug.com/982194 external/wpt/encoding/eof-utf-8-three.html [ Failure Pass ] +crbug.com/982194 external/wpt/encoding/eof-utf-8-two.html [ Failure Pass ] crbug.com/982194 external/wpt/fetch/metadata/download.tentative.https.sub.html [ Failure ] +crbug.com/982194 external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-06.html [ Failure Pass ] +crbug.com/982194 external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-08.html [ Failure Pass ] +crbug.com/982194 external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-10.html [ Failure Pass ] +crbug.com/982194 external/wpt/forced-colors-mode/forced-colors-mode-05.html [ Failure Pass ] +crbug.com/982194 external/wpt/forced-colors-mode/forced-colors-mode-14.html [ Failure Pass ] +crbug.com/982194 external/wpt/forced-colors-mode/forced-colors-mode-17.html [ Failure Pass ] crbug.com/982194 external/wpt/forced-colors-mode/forced-colors-mode-19.html [ Failure ] -crbug.com/982194 external/wpt/geolocation-API/PositionOptions.https.html [ Failure ] -crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/tables/table-border-1.html [ Pass ] +crbug.com/982194 external/wpt/forced-colors-mode/forced-colors-mode-23.html [ Failure Pass ] +crbug.com/982194 external/wpt/geolocation-API/PositionOptions.https.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/tables/table-border-1.html [ Failure Pass ] crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/tables/table-border-3q.html [ Failure ] crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/tables/table-border-3s.html [ Failure ] -crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow-hidden.html [ Pass ] -crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/color.html [ Pass ] -crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/width.html [ Pass ] -crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1i.html [ Pass ] -crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1j.html [ Pass ] -crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1k.html [ Pass ] -crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1l.html [ Pass ] -crbug.com/982194 external/wpt/html/rendering/widgets/button-layout/anonymous-button-content-box.html [ Pass ] -crbug.com/982194 external/wpt/html/rendering/widgets/button-layout/inline-level.html [ Pass ] -crbug.com/982194 external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-non-snap-to-lines.html [ Pass ] -crbug.com/982194 external/wpt/html/semantics/forms/the-textarea-element/multiline-placeholder-cr.html [ Pass ] -crbug.com/982194 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html [ Pass ] -crbug.com/982194 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html [ Pass ] +crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow-hidden.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/color.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/width.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1i.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1j.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1k.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1l.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/rendering/widgets/button-layout/anonymous-button-content-box.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/rendering/widgets/button-layout/inline-level.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/semantics/document-metadata/the-link-element/stylesheet-change-href.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-non-snap-to-lines.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/semantics/forms/the-textarea-element/multiline-placeholder-cr.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html [ Failure Pass ] +crbug.com/982194 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html [ Failure Pass ] crbug.com/982194 external/wpt/html/semantics/scripting-1/the-script-element/css-module/css-module-worker-test.html [ Pass ] crbug.com/982194 external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html [ Pass ] crbug.com/982194 external/wpt/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html [ Pass ] crbug.com/982194 external/wpt/html/user-activation/activation-hierarchy-parent-manual.sub.tentative.html [ Timeout ] crbug.com/982194 external/wpt/html/user-activation/message-event-activation-api-iframe-cross-origin.sub.tentative.html [ Pass Timeout ] -crbug.com/982194 external/wpt/infrastructure/assumptions/blank.html [ Pass ] -crbug.com/982194 external/wpt/infrastructure/assumptions/document-fonts-ready.html [ Failure Pass ] -crbug.com/982194 external/wpt/infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html [ Pass ] -crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_1.html [ Pass ] -crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_full.html [ Pass ] -crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_ref_only.html [ Pass ] -crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_short.html [ Pass ] -crbug.com/982194 external/wpt/intersection-observer/inline-client-rect.html [ Failure Pass ] +crbug.com/982194 external/wpt/infrastructure/assumptions/blank.html [ Failure Pass ] +crbug.com/982194 external/wpt/infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html [ Failure Pass ] +crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_1.html [ Failure Pass ] +crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_full.html [ Failure Pass ] +crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_ref_only.html [ Failure Pass ] +crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_short.html [ Failure Pass ] crbug.com/982194 external/wpt/intersection-observer/v2/blur-filter.html [ Failure ] crbug.com/982194 external/wpt/intersection-observer/v2/delay-test.html [ Failure Pass ] crbug.com/982194 external/wpt/largest-contentful-paint/element-only-when-fully-active.html [ Timeout ] crbug.com/982194 external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html [ Timeout ] crbug.com/982194 external/wpt/largest-contentful-paint/toJSON.html [ Timeout ] -crbug.com/982194 external/wpt/mathml/presentation-markup/direction/direction-008.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/direction/direction-overall.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-color-002.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-created-dynamically-2.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-created-dynamically-3.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-created-dynamically.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-default-padding.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-legacy-bevelled-attribute.tentative.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-linethickness-001.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-linethickness-004.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-mrow-001.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-numalign-denomalign-001.html [ Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/direction/direction-008.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/direction/direction-overall.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-color-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-created-dynamically-2.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-created-dynamically-3.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-created-dynamically.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-default-padding.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-legacy-bevelled-attribute.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-linethickness-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-linethickness-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-mrow-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-numalign-denomalign-001.html [ Failure Pass ] crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-rendering-from-in-flow.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-visibility-001.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/menclose/legacy-menclose-radical-notation.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/mrow/legacy-mfenced-element-001.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/mrow/legacy-mrow-like-elements-002.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form-dynamic.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form-fallback.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form-minus-plus.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits-default.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits-dynamic.html [ Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-visibility-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/menclose/legacy-menclose-radical-notation.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/mrow/legacy-mfenced-element-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/mrow/legacy-mrow-like-elements-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form-dynamic.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form-fallback.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form-minus-plus.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits-default.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits-dynamic.html [ Failure Pass ] crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits-from-in-flow.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-paint-lspace-rspace.html [ Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-paint-lspace-rspace.html [ Failure Pass ] crbug.com/982194 external/wpt/mathml/presentation-markup/radicals/radical-rendering-from-in-flow.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/scripts/subsup-legacy-scriptshift-attributes-001.tentative.html [ Pass ] -crbug.com/982194 external/wpt/mathml/presentation-markup/scripts/underover-legacy-align-attribute-001.html [ Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/scripts/subsup-legacy-scriptshift-attributes-001.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/scripts/underover-legacy-align-attribute-001.html [ Failure Pass ] crbug.com/982194 external/wpt/mathml/presentation-markup/spaces/mspace-children.html [ Failure ] crbug.com/982194 external/wpt/mathml/presentation-markup/tables/table-001.html [ Crash ] -crbug.com/982194 external/wpt/mathml/presentation-markup/tokens/ms-001.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/color-002.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/color-003.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/color-004.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/display-1.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-011.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-012.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-013.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-014.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-015.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-auto.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-fraktur.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-italic.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-sans-serif.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-script.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-case-sensitivity.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-double-struck.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-fraktur.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-initial.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-italic.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-looped.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-monospace.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-sans-serif-italic.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-sans-serif.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-script.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-stretched.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-tailed.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/visibility-002.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/visibility-003.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/css-styling/visibility-004.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/html5-tree/css-inline-style-dynamic.tentative.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/html5-tree/display-2.html [ Pass ] +crbug.com/982194 external/wpt/mathml/presentation-markup/tokens/ms-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/color-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/color-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/color-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/display-1.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-011.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-012.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-013.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-014.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-015.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-auto.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-fraktur.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-italic.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-sans-serif.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-script.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-case-sensitivity.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-double-struck.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-fraktur.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-initial.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-italic.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-looped.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-monospace.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-sans-serif-italic.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-sans-serif.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-script.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-stretched.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-tailed.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/visibility-002.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/visibility-003.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/css-styling/visibility-004.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/html5-tree/css-inline-style-dynamic.tentative.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/html5-tree/display-2.html [ Failure Pass ] crbug.com/982194 external/wpt/mathml/relations/html5-tree/href-click-3.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/html5-tree/integration-point-2.html [ Pass ] -crbug.com/982194 external/wpt/mathml/relations/html5-tree/integration-point-3.html [ Pass ] +crbug.com/982194 external/wpt/mathml/relations/html5-tree/integration-point-2.html [ Failure Pass ] +crbug.com/982194 external/wpt/mathml/relations/html5-tree/integration-point-3.html [ Failure Pass ] crbug.com/982194 external/wpt/media-source/mediasource-getvideoplaybackquality.html [ Pass ] -crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort.tentative.https.window.html [ Timeout ] +crbug.com/982194 external/wpt/mediacapture-record/MediaRecorder-destroy-script-execution.html [ Pass ] +crbug.com/982194 external/wpt/mediacapture-record/MediaRecorder-stop.html [ Pass ] +crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort.tentative.https.window.html [ Pass Timeout ] crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage.tentative.https.window.html [ Timeout ] crbug.com/982194 external/wpt/payment-method-basic-card/apply_the_modifiers.html [ Timeout ] crbug.com/982194 external/wpt/payment-method-basic-card/steps_for_selecting_the_payment_handler.html [ Timeout ] -crbug.com/982194 external/wpt/pointerevents/pointerevent_touch-action-pan-right-css_touch.html [ Pass Timeout ] -crbug.com/982194 external/wpt/pointerevents/pointerevent_touch-action-span-none-test_touch.html [ Pass Timeout ] -crbug.com/982194 external/wpt/quirks/percentage-height-quirk-excludes-flex-grid-001.html [ Pass ] -crbug.com/982194 external/wpt/quirks/text-decoration-doesnt-propagate-into-tables/quirks.html [ Pass ] +crbug.com/982194 external/wpt/quirks/percentage-height-quirk-excludes-flex-grid-001.html [ Failure Pass ] +crbug.com/982194 external/wpt/quirks/text-decoration-doesnt-propagate-into-tables/quirks.html [ Failure Pass ] crbug.com/982194 external/wpt/screen-orientation/onchange-event-subframe.html [ Pass ] -crbug.com/982194 external/wpt/svg/painting/marker-005.svg [ Pass ] -crbug.com/982194 external/wpt/svg/painting/marker-006.svg [ Pass ] -crbug.com/982194 external/wpt/svg/path/bearing/zero.svg [ Pass ] -crbug.com/982194 external/wpt/svg/path/closepath/segment-completing.svg [ Pass ] -crbug.com/982194 external/wpt/svg/rendering/order/z-index.svg [ Pass ] -crbug.com/982194 external/wpt/svg/text/reftests/text-complex-002.svg [ Pass ] -crbug.com/982194 external/wpt/svg/text/reftests/text-inline-size-003.svg [ Pass ] -crbug.com/982194 external/wpt/svg/text/reftests/text-multiline-003.svg [ Pass ] -crbug.com/982194 external/wpt/svg/text/reftests/text-xml-space-001.svg [ Pass ] +crbug.com/982194 external/wpt/svg/painting/marker-005.svg [ Failure Pass ] +crbug.com/982194 external/wpt/svg/painting/marker-006.svg [ Failure Pass ] +crbug.com/982194 external/wpt/svg/path/bearing/zero.svg [ Failure Pass ] +crbug.com/982194 external/wpt/svg/path/closepath/segment-completing.svg [ Failure Pass ] +crbug.com/982194 external/wpt/svg/rendering/order/z-index.svg [ Failure Pass ] +crbug.com/982194 external/wpt/svg/text/reftests/text-complex-002.svg [ Failure Pass ] +crbug.com/982194 external/wpt/svg/text/reftests/text-inline-size-003.svg [ Failure Pass ] +crbug.com/982194 external/wpt/svg/text/reftests/text-multiline-003.svg [ Failure Pass ] +crbug.com/982194 external/wpt/svg/text/reftests/text-xml-space-001.svg [ Failure Pass ] crbug.com/982194 external/wpt/trusted-types/eval-csp-no-tt.tentative.html [ Failure ] crbug.com/982194 external/wpt/trusted-types/eval-no-csp-no-tt-default-policy.tentative.html [ Failure ] crbug.com/982194 external/wpt/trusted-types/eval-no-csp-no-tt.tentative.html [ Failure ] -crbug.com/982194 external/wpt/uievents/click/click_event_target_child_parent.html [ Pass Timeout ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_partially_move_down.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_tracks.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/3_tracks.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_50.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_gt_50.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_gt_50_size_gt_maximum_size.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_lt_50.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_lt_50_size_gt_maximum_size.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_end.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_start.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/basic.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/bidi_ruby.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/start_alignment.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_LF_u05D0.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_u2028_u05D0.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_u2029_u05D0.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u0041_first.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u05D0_first.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u0628_first.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u06E9_no_strong_dir.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/vertical_lr.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/vertical_rl.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/cue_too_long.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_align_position_line_size_while_paused.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_line.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_text.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_text_while_paused.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/9_cues_overlapping_completely.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/9_cues_overlapping_completely_all_cues_have_same_timestamp.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/media_height_19.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/single_quote.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/size_90.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/size_99.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_-2_wrapped_cue_grow_upwards.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_0_is_top.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_1_wrapped_cue_grow_downwards.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_50_percent.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/navigate_cue_position.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/one_line_cue_plus_wrapped_cue.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_x_50_percent.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_y_50_percent.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/viewportanchor_x_50_percent.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/width_50_percent.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/repaint.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_shorthand_css_relative_url.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_hex.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_hsla.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_rgba.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/cue_selector_single_colon.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/inherit_values_from_media_element.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_line-through.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_overline.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_overline_underline_line-through.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_underline.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-shadow.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/vertical_ruby-position.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/vertical_text-combine-upright.html [ Crash Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_normal_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_nowrap_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre-line_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre-wrap_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_box.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_shorthand_css_relative_url.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_animation_with_timestamp.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_background_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_background_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_color.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_font_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_font_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_namespace.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_outline_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_outline_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_text-decoration_line-through.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_text-shadow.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_timestamp_future.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_timestamp_past.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_transition_with_timestamp.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_normal_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_nowrap.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_pre-line_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_pre-wrap_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_pre_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_with_class.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_with_class_object_specific_selector.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_animation_with_timestamp.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_background_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_background_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_color.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_font_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_font_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_namespace.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_outline_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_outline_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_text-decoration_line-through.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_text-shadow.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_timestamp_future.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_timestamp_past.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_transition_with_timestamp.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_vertical_text-combine-upright.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_white-space_nowrap.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_white-space_pre_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_with_class.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_with_class_object_specific_selector.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_hex.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_hsla.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_rgba.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/cue_func_selector_single_colon.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/id_color.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_animation_with_timestamp.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_background_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_background_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_color.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_font_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_font_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_namespace.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_outline_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_outline_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_text-decoration_line-through.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_text-shadow.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_timestamp_future.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_timestamp_past.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_transition_with_timestamp.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_white-space_nowrap.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_white-space_pre_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_with_class.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_with_class_object_specific_selector.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/not_allowed_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/not_root_selector.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/root_namespace.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/root_selector.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_line-through.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_overline.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_overline_underline_line-through.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_underline.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-shadow.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/type_selector_root.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_animation_with_timestamp.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_background_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_background_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_color.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_font_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_font_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_namespace.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_outline_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_outline_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_text-decoration_line-through.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_text-shadow.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_timestamp_future.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_timestamp_past.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_transition_with_timestamp.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_white-space_nowrap.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_white-space_pre_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_with_class.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_with_class_object_specific_selector.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_animation_with_timestamp.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_background_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_background_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_color.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_namespace.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_properties.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_shorthand.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_text-decoration_line-through.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_text-shadow.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_timestamp_future.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_timestamp_past.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_transition_with_timestamp.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_voice_attribute.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_white-space_nowrap.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_white-space_pre_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_with_class.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_with_class_object_specific_selector.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_normal_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_nowrap_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre-line_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre-wrap_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre_wrapped.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/bold_object_default_font-style.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/italic_object_default_font-style.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/underline_object_default_font-style.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/size_50.html [ Pass ] -crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/snap-to-line.html [ Pass ] -crbug.com/982194 fast/backgrounds/quirks-mode-line-box-backgrounds.html [ Pass ] +crbug.com/982194 external/wpt/web-animations/interfaces/Animation/style-change-events.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_partially_move_down.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_tracks.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/3_tracks.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_50.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_gt_50.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_gt_50_size_gt_maximum_size.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_lt_50.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_lt_50_size_gt_maximum_size.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_end.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_start.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/basic.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/bidi_ruby.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/start_alignment.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_LF_u05D0.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_u2028_u05D0.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_u2029_u05D0.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u0041_first.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u05D0_first.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u0628_first.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u06E9_no_strong_dir.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/vertical_lr.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/vertical_rl.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/cue_too_long.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_align_position_line_size_while_paused.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_line.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_text.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_text_while_paused.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/9_cues_overlapping_completely.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/9_cues_overlapping_completely_all_cues_have_same_timestamp.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/media_height_19.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/single_quote.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/size_90.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/size_99.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_-2_wrapped_cue_grow_upwards.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_0_is_top.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_1_wrapped_cue_grow_downwards.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_50_percent.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/navigate_cue_position.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/one_line_cue_plus_wrapped_cue.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_x_50_percent.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_y_50_percent.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/viewportanchor_x_50_percent.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/width_50_percent.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/repaint.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_shorthand_css_relative_url.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_hex.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_hsla.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_rgba.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/cue_selector_single_colon.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/inherit_values_from_media_element.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_line-through.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_overline.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_overline_underline_line-through.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_underline.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-shadow.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/vertical_ruby-position.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/vertical_text-combine-upright.html [ Crash Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_normal_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_nowrap_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre-line_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre-wrap_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_box.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_shorthand_css_relative_url.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_animation_with_timestamp.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_background_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_background_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_color.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_font_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_font_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_namespace.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_outline_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_outline_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_text-decoration_line-through.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_text-shadow.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_timestamp_future.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_timestamp_past.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_transition_with_timestamp.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_normal_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_nowrap.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_pre-line_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_pre-wrap_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_pre_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_with_class.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_with_class_object_specific_selector.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_animation_with_timestamp.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_background_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_background_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_color.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_font_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_font_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_namespace.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_outline_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_outline_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_text-decoration_line-through.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_text-shadow.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_timestamp_future.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_timestamp_past.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_transition_with_timestamp.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_vertical_text-combine-upright.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_white-space_nowrap.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_white-space_pre_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_with_class.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_with_class_object_specific_selector.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_hex.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_hsla.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_rgba.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/cue_func_selector_single_colon.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/id_color.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_animation_with_timestamp.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_background_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_background_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_color.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_font_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_font_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_namespace.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_outline_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_outline_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_text-decoration_line-through.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_text-shadow.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_timestamp_future.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_timestamp_past.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_transition_with_timestamp.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_white-space_nowrap.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_white-space_pre_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_with_class.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_with_class_object_specific_selector.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/not_allowed_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/not_root_selector.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/root_namespace.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/root_selector.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_line-through.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_overline.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_overline_underline_line-through.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_underline.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-shadow.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/type_selector_root.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_animation_with_timestamp.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_background_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_background_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_color.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_font_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_font_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_namespace.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_outline_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_outline_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_text-decoration_line-through.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_text-shadow.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_timestamp_future.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_timestamp_past.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_transition_with_timestamp.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_white-space_nowrap.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_white-space_pre_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_with_class.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_with_class_object_specific_selector.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_animation_with_timestamp.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_background_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_background_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_color.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_namespace.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_properties.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_shorthand.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_text-decoration_line-through.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_text-shadow.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_timestamp_future.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_timestamp_past.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_transition_with_timestamp.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_voice_attribute.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_white-space_nowrap.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_white-space_pre_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_with_class.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_with_class_object_specific_selector.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_normal_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_nowrap_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre-line_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre-wrap_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre_wrapped.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/bold_object_default_font-style.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/italic_object_default_font-style.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/underline_object_default_font-style.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/size_50.html [ Failure Pass ] +crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/snap-to-line.html [ Failure Pass ] +crbug.com/982194 fast/backgrounds/border-radius-split-background.html [ Failure ] +crbug.com/982194 fast/backgrounds/quirks-mode-line-box-backgrounds.html [ Failure Pass ] +crbug.com/982194 fast/block/float/clear-negative-margin-top.html [ Failure ] +crbug.com/982194 fast/block/float/float-not-removed-from-next-sibling2.html [ Failure ] crbug.com/982194 fast/block/float/hittest-float-in-anchor.html [ Failure ] -crbug.com/982194 fast/borders/border-image-outset-split-inline-vertical-lr.html [ Pass ] +crbug.com/982194 fast/block/float/overhanging-float-remove-from-absolute-position-block.html [ Failure ] +crbug.com/982194 fast/block/float/overhanging-float-remove-from-absolute-position-block2.html [ Failure ] +crbug.com/982194 fast/block/float/overhanging-float-remove-from-fixed-position-block.html [ Failure ] +crbug.com/982194 fast/block/float/overhanging-float-remove-from-fixed-position-block2.html [ Failure ] +crbug.com/982194 fast/block/float/overlapping-floats-paint-hittest-order-1.html [ Failure ] +crbug.com/982194 fast/block/positioning/058.html [ Failure ] +crbug.com/982194 fast/block/positioning/absolute-in-inline-ltr-2.html [ Failure ] +crbug.com/982194 fast/block/positioning/absolute-in-inline-ltr-3.html [ Failure ] +crbug.com/982194 fast/block/positioning/absolute-in-inline-ltr.html [ Failure ] +crbug.com/982194 fast/block/positioning/absolute-in-inline-rtl-2.html [ Failure ] +crbug.com/982194 fast/block/positioning/absolute-in-inline-rtl-3.html [ Failure ] +crbug.com/982194 fast/block/positioning/absolute-in-inline-rtl.html [ Failure ] +crbug.com/982194 fast/block/positioning/absolute-in-inline-short-ltr.html [ Failure ] +crbug.com/982194 fast/block/positioning/absolute-in-inline-short-rtl.html [ Failure ] +crbug.com/982194 fast/block/positioning/hiding-inside-relpositioned-inline.html [ Failure ] +crbug.com/982194 fast/borders/border-image-outset-split-inline-vertical-lr.html [ Failure Pass ] +crbug.com/982194 fast/borders/border-image-outset-split-inline.html [ Failure ] +crbug.com/982194 fast/borders/border-styles-split.html [ Failure ] crbug.com/982194 fast/borders/inline-mask-overlay-image-outset-vertical-rl.html [ Failure ] -crbug.com/982194 fast/borders/outline-alpha-inline.html [ Failure Pass ] -crbug.com/982194 fast/canvas/canvas-measure-bidi-text.html [ Failure Pass ] -crbug.com/982194 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-under.html [ Pass ] -crbug.com/982194 fast/dom/Element/client-rect-list-argument.html [ Failure Pass ] -crbug.com/982194 fast/dom/Element/getBoundingClientRect.html [ Failure Pass ] -crbug.com/982194 fast/dom/Element/getClientRects.html [ Failure Pass ] -crbug.com/982194 fast/dom/Range/getClientRects.html [ Failure Pass ] -crbug.com/982194 fast/dom/Range/range-spanning-elements-bounding-client-rect.html [ Failure Pass ] +crbug.com/982194 fast/css-generated-content/visibleContentHiddenParent.html [ Failure ] +crbug.com/982194 fast/css/clip-text-in-scaled-div.html [ Failure ] +crbug.com/982194 fast/css/first-line-change-color-direct.html [ Failure ] +crbug.com/982194 fast/css/first-line-change-color.html [ Failure ] +crbug.com/982194 fast/css/outline-auto-empty-rects.html [ Failure ] +crbug.com/982194 fast/css/text-overflow-ellipsis-vertical-hittest.html [ Failure ] +crbug.com/982194 fast/css3-text/css3-text-decoration/repaint/repaint-text-decoration-style.html [ Failure ] +crbug.com/982194 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-dynamic.html [ Failure ] +crbug.com/982194 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-under.html [ Failure Pass ] crbug.com/982194 fast/dom/SelectorAPI/resig-SelectorsAPI-test.xhtml [ Pass ] crbug.com/982194 fast/dom/rtl-scroll-to-leftmost-and-resize.html [ Pass Timeout ] -crbug.com/982194 fast/dom/shadow/gesture-tapHighlight-shadow-tree.html [ Failure Pass ] crbug.com/982194 fast/events/mouse-relative-position.html [ Failure ] crbug.com/982194 fast/events/tabindex-focus-blur-all.html [ Pass ] crbug.com/982194 fast/events/touch/compositor-touch-hit-rects-list-translate.html [ Failure ] -crbug.com/982194 fast/events/touch/gesture/gesture-tap-result.html [ Failure Pass ] -crbug.com/982194 fast/inline/br-client-rect.html [ Failure Pass ] -crbug.com/982194 fast/inline/continuation-outlines-with-layers.html [ Failure Pass ] -crbug.com/982194 fast/inline/continuation-outlines.html [ Failure Pass ] -crbug.com/982194 fast/loader/document-with-fragment-url-1.html [ Pass Timeout ] -crbug.com/982194 fast/loader/document-with-fragment-url-3.html [ Pass Timeout ] -crbug.com/982194 fast/loader/document-with-fragment-url-4.html [ Pass Timeout ] +crbug.com/982194 fast/events/updateLayoutForHitTest.html [ Failure Pass ] +crbug.com/982194 fast/hidpi/clip-text-in-hidpi.html [ Failure ] +crbug.com/982194 fast/history/visited-link-hover-emphasis-color.html [ Failure ] +crbug.com/982194 fast/history/visited-link-hover-text-decoration-color.html [ Failure ] +crbug.com/982194 fast/history/visited-link-hover-text-fill-color.html [ Failure ] +crbug.com/982194 fast/history/visited-link-hover-text-stroke-color.html [ Failure ] +crbug.com/982194 fast/history/visited-link-hover.html [ Failure ] +crbug.com/982194 fast/layers/normal-flow-hit-test.html [ Failure Pass ] +crbug.com/982194 fast/lists/markers-in-selection.html [ Failure Pass ] crbug.com/982194 fast/multicol/vertical-lr/column-break-with-balancing.html [ Failure ] crbug.com/982194 fast/multicol/vertical-lr/column-count-with-rules.html [ Failure ] crbug.com/982194 fast/multicol/vertical-lr/column-rules.html [ Failure ] -crbug.com/982194 fast/multicol/vertical-lr/float-avoidance.html [ Pass ] +crbug.com/982194 fast/multicol/vertical-lr/float-avoidance.html [ Failure Pass ] crbug.com/982194 fast/multicol/vertical-lr/float-big-line.html [ Failure ] crbug.com/982194 fast/multicol/vertical-lr/float-break.html [ Failure ] crbug.com/982194 fast/multicol/vertical-lr/float-content-break.html [ Failure ] crbug.com/982194 fast/multicol/vertical-lr/float-edge.html [ Failure ] crbug.com/982194 fast/multicol/vertical-lr/float-paginate.html [ Failure ] crbug.com/982194 fast/multicol/vertical-lr/unsplittable-inline-block.html [ Failure ] -crbug.com/982194 fast/multicol/vertical-rl/nested-columns.html [ Pass ] +crbug.com/982194 fast/multicol/vertical-rl/nested-columns.html [ Failure Pass ] crbug.com/982194 fast/overflow/scrollbar-click-retains-focus.html [ Failure ] crbug.com/982194 fast/scroll-snap/snaps-after-scrollbar-scrolling.html [ Failure ] -crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius-001.html [ Failure Pass ] -crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon.html [ Crash Failure Pass ] -crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-left.html [ Failure Pass ] -crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-right.html [ Failure Pass ] -crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-image-margin-001.html [ Failure Pass ] -crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-image-margin-002.html [ Failure Pass ] -crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left.html [ Failure Pass ] -crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-right.html [ Failure Pass ] -crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-rounded-boxes-001.html [ Failure Pass ] -crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-rounded-boxes-002.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-1st-stop.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-container-only-white-space.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-container-white-space.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-date.html [ Failure Pass ] crbug.com/982194 fast/spatial-navigation/snav-expandable-sub-menu.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-first-fragment-offscreen.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-first-rtl-fragment-offscreen.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-focus-rect-contains-links.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-fragmented-link-partially-offscreen.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-fully-aligned-vertically.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-iframe-no-focusable-content.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-input.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-keyboard-scrollers-search-origin-bug.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-first-fragment-offscreen.html [ Failure Pass ] +crbug.com/982194 fast/spatial-navigation/snav-first-rtl-fragment-offscreen.html [ Failure Pass ] crbug.com/982194 fast/spatial-navigation/snav-more-aligned-at-top.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-multiple-select.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-navigate-visible-elements-only2.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-offscreen-content.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-radio-group.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-radio.html [ Failure Pass ] crbug.com/982194 fast/spatial-navigation/snav-search-focused-scroller-first.html [ Failure ] -crbug.com/982194 fast/spatial-navigation/snav-single-select-list.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-single-select.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-skippable-candidate.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-table-traversal.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-textarea.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-two-elements-one-line.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-unit-overflow-and-scroll-in-direction.html [ Failure Pass ] -crbug.com/982194 fast/spatial-navigation/snav-use-visual-viewport.html [ Failure Pass ] -crbug.com/982194 fast/sub-pixel/size-of-span-with-different-positions.html [ Failure Pass ] -crbug.com/982194 fast/sub-pixel/width-of-inline-in-float.html [ Failure Pass ] -crbug.com/982194 fast/writing-mode/flipped-blocks-text-map-local-to-container.html [ Failure Pass ] -crbug.com/982194 fragmentation/repeating-thead-under-repeating-thead.html [ Pass ] -crbug.com/982194 hittesting/border-hittest-inlineFlowBox.html [ Failure Pass ] -crbug.com/982194 hittesting/culled-inline.html [ Failure Pass ] -crbug.com/982194 http/tests/css/css-image-valued-shape.html [ Failure Pass ] +crbug.com/982194 fast/sub-pixel/inline-block-baseline.html [ Failure ] +crbug.com/982194 fast/writing-mode/background-vertical-lr.html [ Failure ] +crbug.com/982194 fast/writing-mode/background-vertical-rl.html [ Failure ] +crbug.com/982194 fragmentation/repeating-thead-under-repeating-thead.html [ Failure Pass ] +crbug.com/982194 html/details_summary/details-writing-mode-align-center.html [ Failure ] +crbug.com/982194 http/tests/devtools/application-panel/resources-panel-iframe-idb.js [ Pass Timeout ] crbug.com/982194 http/tests/devtools/application-panel/storage-view-reports-quota.js [ Pass Timeout ] -crbug.com/982194 http/tests/devtools/console/console-prompt-keyboard.js [ Failure Pass ] -crbug.com/982194 http/tests/devtools/editor/text-editor-accessibility.js [ Failure Pass ] -crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-2.js [ Pass Timeout ] +crbug.com/982194 http/tests/devtools/cache-storage/cache-data.js [ Pass Timeout ] +crbug.com/982194 http/tests/devtools/editor/text-editor-ctrl-d-2.js [ Timeout ] +crbug.com/982194 http/tests/devtools/editor/text-editor-reveal-line.js [ Pass Timeout ] +crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-1.js [ Pass Timeout ] +crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-2.js [ Timeout ] crbug.com/982194 http/tests/devtools/elements/highlight/highlight-dom-updates.js [ Pass Timeout ] -crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-vertical-rl.js [ Failure Pass ] +crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-vertical-rl.js [ Pass Timeout ] +crbug.com/982194 http/tests/devtools/elements/styles-1/disable-property-workingcopy-update.js [ Timeout ] crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-from-js.js [ Timeout ] +crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-links-2.js [ Pass Timeout ] +crbug.com/982194 http/tests/devtools/elements/styles/selector-line-sourcemap-header.js [ Timeout ] crbug.com/982194 http/tests/devtools/indexeddb/database-refresh-view.js [ Pass ] -crbug.com/982194 http/tests/devtools/oopif/oopif-storage.js [ Pass ] +crbug.com/982194 http/tests/devtools/network/network-search.js [ Pass Timeout ] +crbug.com/982194 http/tests/devtools/oopif/oopif-navigator.js [ Pass Timeout ] +crbug.com/982194 http/tests/devtools/oopif/oopif-storage.js [ Pass Timeout ] crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-location.js [ Pass ] crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-crafted-frame-add.js [ Pass ] crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-in-crafted-frame.js [ Pass ] -crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-navigate.js [ Pass ] +crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-navigate.js [ Pass Timeout ] crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-htmlimports.js [ Pass ] crbug.com/982194 http/tests/devtools/search/source-frame-replace-4.js [ Pass Timeout ] crbug.com/982194 http/tests/devtools/service-workers/lazy-addeventlisteners.js [ Pass ] @@ -1468,11 +1464,8 @@ crbug.com/982194 http/tests/devtools/sources/debugger/navigator-view.js [ Crash Pass ] crbug.com/982194 http/tests/devtools/tracing/timeline-paint/paint-profiler-update.js [ Pass ] crbug.com/982194 http/tests/history/client-redirect-after-push-state.html [ Failure Pass ] -crbug.com/982194 http/tests/navigation/anchor-frames-same-origin.html [ Failure Pass ] +crbug.com/982194 http/tests/uri/css-href.php [ Failure ] crbug.com/982194 ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling.htm [ Failure ] -crbug.com/982194 inspector-protocol/dom-snapshot/dom-snapshot-captureSnapshot-pseudo-element.js [ Failure Pass ] -crbug.com/982194 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-pseudo-element.js [ Failure Pass ] -crbug.com/982194 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot.js [ Failure Pass ] crbug.com/982194 jquery/attributes.html [ Pass ] crbug.com/982194 jquery/core.html [ Pass ] crbug.com/982194 jquery/css.html [ Pass ] @@ -1483,17 +1476,37 @@ crbug.com/982194 jquery/offset.html [ Pass ] crbug.com/982194 jquery/traversing.html [ Pass ] crbug.com/982194 media/video-canvas-draw.html [ Failure Pass ] -crbug.com/982194 paint/inline/outline-offset.html [ Failure Pass ] +crbug.com/982194 overflow/overflow-inline-003.html [ Failure ] +crbug.com/982194 paint/background/background-clip-text-inline.html [ Failure ] crbug.com/982194 paint/invalidation/compositing/float-under-composited-inline.html [ Failure ] crbug.com/982194 paint/invalidation/flexbox/scrollbars-changed.html [ Failure ] +crbug.com/982194 paint/invalidation/forms/slider-thumb-float.html [ Failure ] crbug.com/982194 paint/invalidation/multi-layout-one-frame.html [ Failure ] +crbug.com/982194 paint/invalidation/outline/focus-layers.html [ Failure ] crbug.com/982194 paint/invalidation/position/absolute-position-moved.html [ Failure ] +crbug.com/982194 paint/invalidation/selection/selection-repaint.html [ Failure ] crbug.com/982194 paint/invalidation/svg/scroll-hit-test.xhtml [ Failure ] +crbug.com/982194 paint/invalidation/text-decoration-invalidation.html [ Failure ] +crbug.com/982194 paint/overflow/composited-rounded-clip-floating-element.html [ Failure ] +crbug.com/982194 paint/selection/first_letter/first_letter_1fr.html [ Failure Pass ] +crbug.com/982194 paint/selection/first_letter/first_letter_2ff.html [ Failure Pass ] +crbug.com/982194 paint/selection/first_letter/first_letter_2fn.html [ Failure Pass ] +crbug.com/982194 paint/selection/first_letter/first_letter_2fr.html [ Failure Pass ] +crbug.com/982194 paint/selection/first_letter/first_letter_2nf.html [ Failure Pass ] +crbug.com/982194 paint/selection/first_letter/first_letter_2nr.html [ Failure Pass ] +crbug.com/982194 paint/selection/first_letter/first_letter_2rf.html [ Failure Pass ] +crbug.com/982194 paint/selection/first_letter/first_letter_2rn.html [ Failure Pass ] +crbug.com/982194 paint/selection/first_letter/first_letter_2rr.html [ Failure Pass ] +crbug.com/982194 paint/selection/text-selection-inline-block-rtl.html [ Failure ] +crbug.com/982194 paint/selection/text-selection-inline-block.html [ Failure ] +crbug.com/982194 paint/selection/text-selection-newline-span-across-line.html [ Failure Pass ] crbug.com/982194 svg/custom/visibility-enable-on-svg-element-contained-border-radius.html [ Failure ] crbug.com/982194 svg/custom/visibility-enable-on-svg-element-contained-viewport-size.html [ Failure ] crbug.com/982194 svg/custom/visibility-enable-on-svg-element.html [ Failure ] -crbug.com/982194 touchadjustment/event-triggered-widgets.html [ Failure Pass ] -crbug.com/982194 touchadjustment/touch-links-active.html [ Failure Pass ] +crbug.com/982194 svg/zoom/page/zoom-svg-through-object-with-override-size.html [ Failure ] +crbug.com/982194 tables/layering/paint-test-layering-1.html [ Failure ] +crbug.com/982194 tables/layering/paint-test-layering-2.html [ Failure ] +crbug.com/982194 transforms/3d/point-mapping/3d-point-mapping-deep.html [ Pass ] crbug.com/982194 virtual/android/url-bar/bottom-and-top-fixed-sticks-to-top.html [ Failure ] crbug.com/908347 virtual/audio-service/media/autoplay/webaudio-audio-context-resume.html [ Failure Pass ] crbug.com/942951 virtual/audio-service/media/controls/controls-layout-in-different-size.html [ Pass ] @@ -1504,373 +1517,410 @@ crbug.com/982194 virtual/audio-service/media/stable/video-object-fit-stable.html [ Pass ] crbug.com/982194 virtual/audio-service/media/video-canvas-draw.html [ Failure ] crbug.com/982194 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/udate-bytecheck.https.html [ Timeout ] -crbug.com/982194 virtual/composite-after-paint/compositing/gestures/gesture-tapHighlight-img.html [ Failure Pass ] +crbug.com/982194 virtual/cascade/external/wpt/css/css-paint-api/background-image-alpha.https.html [ Pass ] +crbug.com/982194 virtual/cascade/external/wpt/css/css-scoping/slotted-with-pseudo-element.html [ Failure ] +crbug.com/982194 virtual/composite-after-paint/paint/background/background-clip-text-inline.html [ Failure ] crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/file/file-appearance-basic.html [ Failure ] crbug.com/982194 virtual/controls-refresh/color-scheme/file/file-appearance-basic.html [ Failure ] -crbug.com/982194 virtual/exotic-color-space/images/yuv-decode-eligible/color-profile-layer-filter.html [ Failure ] -crbug.com/985520 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-enter-from-interest-a11y.html [ Failure Pass ] -crbug.com/985520 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-enter-from-interest.html [ Failure Pass ] +crbug.com/982194 virtual/controls-refresh/color-scheme/range/range-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/color-scheme/text/input-basic-box-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/color-scheme/time/time-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/exotic-color-space/images/yuv-decode-eligible/color-profile-layer-filter.html [ Failure Pass ] +crbug.com/985520 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-enter-from-interest-a11y.html [ Pass ] +crbug.com/985520 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-enter-from-interest.html [ Pass ] crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-01.html [ Failure ] crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-02.html [ Failure ] crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-03.html [ Failure ] crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-04.html [ Failure ] crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-05.html [ Failure ] +crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-06.html [ Failure ] +crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-08.html [ Failure ] crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-09.html [ Failure ] +crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-10.html [ Failure ] +crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/forced-colors-mode-14.html [ Failure ] crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-01.html [ Failure ] crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-02.html [ Failure ] crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-03.html [ Failure ] crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-04.html [ Failure ] crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-05.html [ Failure ] +crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-06.html [ Failure ] +crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-08.html [ Failure ] crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-09.html [ Failure ] -crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/focus-selection-input.html [ Failure ] -crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/focus-selection-textarea.html [ Failure ] -crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/label/label-click.html [ Failure ] +crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-10.html [ Failure ] +crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/forced-colors-mode-14.html [ Failure ] +crbug.com/982194 virtual/forced-high-contrast-colors/fast/css/forced-colors-mode/backplate/forced-colors-mode-backplate-07.html [ Failure ] +crbug.com/982194 virtual/forced-high-contrast-colors/fast/css/forced-colors-mode/forced-colors-mode-15.html [ Failure ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/date/date-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/floating-textfield-relayout.html [ Failure ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/focus-selection-input.html [ Failure Pass ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/focus-selection-textarea.html [ Failure Pass ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/label/label-click.html [ Failure Pass ] crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/label/label-selection-by-dragging.html [ Failure ] crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/label/label-selection-by-textSelection-and-click.html [ Failure ] -crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar.html [ Failure Pass ] -crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar.html [ Failure Pass ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/date-suggestion-picker-appearance.html [ Failure ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew.html [ Failure ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl.html [ Failure ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar.html [ Failure ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance.html [ Failure ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/month-suggestion-picker-appearance.html [ Failure ] crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/time-suggestion-picker-appearance-locale-hebrew.html [ Failure Pass ] crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/time-suggestion-picker-appearance-rtl.html [ Failure Pass ] -crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl.html [ Failure Pass ] -crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar.html [ Failure Pass ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/time-suggestion-picker-appearance-with-scroll-bar.html [ Failure ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/time-suggestion-picker-appearance.html [ Failure ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/week-suggestion-picker-appearance.html [ Failure ] +crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/text/input-readonly-autoscroll.html [ Failure ] crbug.com/956736 virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map.html [ Pass ] crbug.com/982194 virtual/gpu/fast/canvas/OffscreenCanvas-zero-size-readback.html [ Crash ] -crbug.com/982194 virtual/gpu/fast/canvas/canvas-arc-circumference.html [ Pass ] -crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill.html [ Pass ] -crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference.html [ Pass ] -crbug.com/982194 virtual/gpu/fast/canvas/canvas-measure-bidi-text.html [ Failure Pass ] +crbug.com/982194 virtual/gpu/fast/canvas/canvas-arc-circumference.html [ Failure Pass ] +crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill.html [ Failure Pass ] +crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference.html [ Failure Pass ] crbug.com/866850 virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-rec2020.html [ Failure Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/fieldset-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/floats-and-text-narrow-and-short-dynamic.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/hit-test-inline-fragmentation-with-border-radius.html [ Failure Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/line-after-unbreakable-float-after-padding.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/fieldset-001.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/floats-and-text-narrow-and-short-dynamic.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/line-after-unbreakable-float-after-padding.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-001.html [ Pass ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-002.html [ Pass ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-003.html [ Pass ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-004.html [ Pass ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-005.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/float-with-line-after-spanner.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/float-with-line-after-spanner.html [ Failure Pass ] crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/inline-block-and-column-span-all.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multcol-gap-000.xht [ Crash Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-000.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-break-000.xht [ Failure ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-break-001.xht [ Failure ] +crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-000.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-001.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-002.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-003.html [ Failure ] crbug.com/481431 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-004.html [ Failure ] crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-005.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-000.html [ Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-000.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-001.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-002.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-003.html [ Failure ] crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-004.html [ Failure ] crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-005.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-000.xht [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-001.xht [ Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-000.xht [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-001.xht [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-001.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-block-children-001.xht [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-block-children-002.xht [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-block-children-001.xht [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-block-children-002.xht [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-000.xht [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-001.xht [ Crash Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-fraction-002.html [ Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-001.xht [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-fraction-002.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-list-item-001.xht [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-margin-002.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-column-rule-001.xht [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-overflow-000.xht [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-column-rule-001.xht [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-overflow-000.xht [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-000.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-color-inherit-001.xht [ Pass ] -crbug.com/792437 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-inset-000.xht [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-nested-balancing-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-nested-balancing-002.html [ Pass ] -crbug.com/792437 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-outset-000.xht [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-px-001.xht [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-shorthand-2.xht [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-stacking-001.xht [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-shorthand-001.xht [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-000.xht [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-005.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-006.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-007.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-008.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-010.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-011.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-color-inherit-001.xht [ Failure Pass ] +crbug.com/792437 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-inset-000.xht [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-nested-balancing-001.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-nested-balancing-002.html [ Failure Pass ] +crbug.com/792437 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-outset-000.xht [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-px-001.xht [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-shorthand-2.xht [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-stacking-001.xht [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-shorthand-001.xht [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-000.xht [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-005.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-006.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-007.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-008.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-010.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-011.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-children-height-001.html [ Failure ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-002.html [ Pass ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-003.html [ Pass ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-004.html [ Pass ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-007.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-rule-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-004.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-005.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-zero-height-001.xht [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/nested-with-too-tall-line.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/abspos-after-break-after.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-rule-001.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-004.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-005.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-zero-height-001.xht [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/nested-with-too-tall-line.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/abspos-after-break-after.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-float-in-inline.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-float-with-margin-top-and-line-after-break-2.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-float-with-margin-top-and-line-after-break-3.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-line-overflow.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/basic-rtl.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/break-in-scrollable.html [ Pass ] -crbug.com/714962 virtual/layout_ng_block_frag/fast/multicol/change-height.html [ Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-line-overflow.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/basic-rtl.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer-second-column.html [ Failure ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/break-in-scrollable.html [ Failure Pass ] +crbug.com/714962 virtual/layout_ng_block_frag/fast/multicol/change-height.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/column-break-with-balancing.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/column-count-with-rules.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/column-rules.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/columns-shorthand-parsing.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-inner-multicol.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-opacity-2nd-and-3rd-column.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-clipped.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-overlapping-will-change.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-resize.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-with-child-layer-in-next-column.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/doubly-nested-with-top-padding-crossing-row-boundaries.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/change-spanner-display.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-among-text-in-anonymous-wrapper.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-before-spanner-before-content.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-before-spanner.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-between-spanners.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-into-content.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-after-content.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-after-spanner-before-content.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-before-content.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-into-content.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-after-spanner.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-before-spanner.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-between-spanners.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-after-spanner.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-before-spanner.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-between-spanners.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-spanner-in-content.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-after-content-becomes-regular-block.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-before-content-becomes-regular-block.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-in-content-becomes-regular-block.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-inner-multicol.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-opacity-2nd-and-3rd-column.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-clipped.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-in-clipped.html [ Failure ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-overlapping-will-change.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-resize.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-with-child-layer-in-next-column.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/doubly-nested-with-top-padding-crossing-row-boundaries.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/change-spanner-display.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/change-spanner-parent-display.html [ Failure ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-among-text-in-anonymous-wrapper.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-before-spanner-before-content.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-before-spanner.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-between-spanners.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-into-content.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-after-content.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-after-spanner-before-content.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-before-content.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-between-out-of-flow.html [ Failure ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-into-content.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-after-spanner.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-before-spanner.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-between-spanners.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-after-spanner.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-before-spanner.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-between-spanners.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-spanner-in-content.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-after-content-becomes-regular-block.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-before-content-becomes-regular-block.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-in-content-becomes-regular-block.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/event-offset-complex-tree.html [ Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/event-offset.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/filter-in-second-column.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/filter-in-second-column.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/fixedpos-child-becomes-static.html [ Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/flipped-blocks-hit-test.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-after-break-after.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-after-break-after.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-avoidance.html [ Failure ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-big-line.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-break.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-content-break.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-edge.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary-fixed-multicol-height.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary-fixed-multicol-height.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-paginate.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/forced-break-after-empty-block-after-spanner.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/forced-break-too-short-column.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/inline-block-baseline.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/forced-break-after-empty-block-after-spanner.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/forced-break-too-short-column.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/inline-block-baseline.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/inline-getclientrects.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/inner-multicol-in-second-column.html [ Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/inner-multicol-in-second-column.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/layers-in-multicol.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/line-in-next-row-in-fourth-inner-multicol.html [ Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/line-in-next-row-in-fourth-inner-multicol.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/line-pushed-down-by-float.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/line-too-tall-for-second-outer-row.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/many-lines-overflow-in-single-row-inner.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/line-too-tall-for-second-outer-row.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/many-lines-overflow-in-single-row-inner.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-3-multicols-fixed-height.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height-extra-block-inbetween.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height-short-first-row.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-column-count-1-with-forced-break.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks-2.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-with-strut-before-first-line.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-columns.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-fixed-height-with-struts.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-outer-fixed-height.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-with-clipped-first-column.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-with-padding.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-with-single-empty-block.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-with-single-tall-line.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/break-before.html [ Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height-extra-block-inbetween.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height-short-first-row.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-column-count-1-with-forced-break.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks-2.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-with-strut-before-first-line.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-columns.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-fixed-height-with-struts.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-outer-fixed-height.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-with-clipped-first-column.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-with-padding.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-with-single-empty-block.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-with-single-tall-line.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/break-before.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/breaks-2-columns-3.html [ Failure ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/fixed-height-fill-balance-2.html [ Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/fixed-height-fill-balance.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/newmulticol/list-item.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/hide-box-vertical-rl.html [ Failure ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/newmulticol/list-item.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/newmulticol/orphans-and-widows-balance.html [ Failure ] crbug.com/797591 virtual/layout_ng_block_frag/fast/multicol/newmulticol/regular-block-becomes-multicol.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line-at-boundary.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line-rtl.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-small-on-line-at-boundary.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/nested-multicol.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/outlines-at-column-boundaries.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-across-columns.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-content.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-unsplittable.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/positive-leading.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/pushed-line-affected-by-float.html [ Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line-at-boundary.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line-rtl.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-small-on-line-at-boundary.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/nested-multicol.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/outlines-at-column-boundaries.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-across-columns.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-content.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-unsplittable.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/paginate-block-replaced.html [ Failure ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/positive-leading.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/pushed-line-affected-by-float.html [ Failure Pass ] crbug.com/797591 virtual/layout_ng_block_frag/fast/multicol/regular-block-becomes-multicol.html [ Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/relayout-and-push-float.html [ Failure ] -crbug.com/714962 virtual/layout_ng_block_frag/fast/multicol/scale-transform-text.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/scrollable-basic.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/relpos-inside-inline-block.html [ Failure ] +crbug.com/714962 virtual/layout_ng_block_frag/fast/multicol/scale-transform-text.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/scrollable-basic.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/shadow-breaking.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/single-line.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/after-float.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/as-inner-multicol.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/single-line.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/after-float.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/as-inner-multicol.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-after-spanner-exact-fit.html [ Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-after-spanner-extra-height.html [ Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-after-spanner-some-extra-height.html [ Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-before-and-after-spanner.html [ Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-before-spanner-extra-height.html [ Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/fill-after-spanner-exact-fit.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/fill-after-spanner-extra-height.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/float.html [ Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/fill-after-spanner-extra-height.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/float.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/height-increase.html [ Failure ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/in-nested-multicol-with-hard-breaks.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/in-nested-multicol-with-soft-breaks-inside.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/inside-block-with-fixed-height.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/invalid-spanner-in-abspos.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/in-nested-multicol-with-soft-breaks-inside.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/inside-block-with-fixed-height.html [ Failure Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/invalid-spanner-in-abspos.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/invalid-spanner-in-transform.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner-2.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner-and-float.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/overflow-on-multicol.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/span-between-text.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/spanner-first.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner-2.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner-and-float.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/overflow-on-multicol.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/remaining-space-in-last-column.html [ Failure ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/span-between-text.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/spanner-first.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/spanner-img.html [ Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/spanner-last.html [ Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/spanner-with-margin.html [ Pass ] crbug.com/824918 virtual/layout_ng_block_frag/fast/multicol/span/trailing-margin-around-spanner.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/two-rows-then-spanner-then-two-rows.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/vertical-lr.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/vertical-rl.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/two-rows-then-spanner-then-two-rows.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/vertical-lr.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/vertical-rl.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/svg-change-column-crash.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/table-cell-content-change.html [ Pass ] -crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/tall-float1.html [ Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/table-cell-content-change.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/table-multicolumn-caption.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/tall-float1.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/tall-float2.html [ Failure ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/unbreakable-block-too-tall-to-fit.html [ Failure ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/unsplittable-inline-block.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-break-with-balancing.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-count-with-rules.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-rules.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-avoidance.html [ Failure ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-big-line.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-break.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-content-break.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-edge.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-paginate.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/nested-columns.html [ Pass ] +crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/nested-columns.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/unsplittable-inline-block.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/abspos-auto-position-on-line.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/abspos-auto-position-on-line.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/column-break-with-balancing.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/composited-relpos-overlapping-will-change.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/composited-relpos-overlapping-will-change.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-big-line.html [ Failure ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-truncation.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/nested-columns.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/nested-columns.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/unsplittable-inline-block.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/widows.html [ Failure ] crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/auto-scrollbar-shrink-to-fit.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/block-after-float-first-child.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/block-after-float-first-child.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fragmentation/change-fragmentainer-height-inline-float.html [ Failure ] crbug.com/591099 virtual/layout_ng_block_frag/fragmentation/change-fragmentainer-height-line-float.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/forced-break-clearance-unsplittable-content.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/forced-break-clearance-unsplittable-content.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_block_frag/fragmentation/remove-unbreakable-block-in-line-float.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/repeating-thead-under-repeating-thead.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/printing/frameset.html [ Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/repeating-thead-under-repeating-thead.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/transformed-clip-before-second-column.html [ Failure ] +crbug.com/982194 virtual/layout_ng_block_frag/printing/frameset.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/printing/setPrinting.html [ Failure ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-layout-017.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-005.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-006.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-021.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-clip-015.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-clip-016.html [ Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-layout-017.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-005.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-006.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-021.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-clip-015.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-clip-016.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-flexbox-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-replaced-003b.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-replaced-003c.html [ Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-replaced-003b.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-replaced-003c.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-scrollbars-002.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/counter-scoping-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/counter-scoping-002.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/counter-scoping-003.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-002.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-003.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-004.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ruby-stacking-and-clipping-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-fieldset-002.html [ Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/counter-scoping-001.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/counter-scoping-002.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/counter-scoping-003.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-001.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-002.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-003.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-004.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ruby-stacking-and-clipping-001.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-fieldset-002.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-flex-001.html [ Pass ] crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-inline-flex-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-transform-translatez.html [ Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-transform-translatez.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-block-formatting-context.html [ Crash ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-block-margins-2.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-list-item-numbering.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-list-item.html [ Pass ] -crbug.com/982194 virtual/layout_ng_fieldset/fast/forms/fieldset/legend-small-after-margin-before-border-horizontal-mode.html [ Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-block-margins-2.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-list-item-numbering.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-list-item.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_fieldset/fast/forms/fieldset/legend-small-after-margin-before-border-horizontal-mode.html [ Failure Pass ] crbug.com/591099 virtual/layout_ng_flex_box/css3/flexbox/flexbox-baseline.html [ Failure ] -crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/percentage-height-replaced-element.html [ Failure ] +crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/percentage-height-replaced-element.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/relpos-with-percentage-top.html [ Failure ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/align-items-004.htm [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/align-items-baseline-overflow-non-visible.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/anonymous-flex-item-005.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-005.xht [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-007.xht [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-015.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-width-flex-items-007.xht [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_inline.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/align-items-004.htm [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/align-items-baseline-overflow-non-visible.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/anonymous-flex-item-005.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-005.xht [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-007.xht [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-015.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-width-flex-items-007.xht [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_inline.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_visibility-collapse-line-wrapping.html [ Failure ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_visibility-collapse.html [ Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_visibility-collapse.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/hittest-overlapping-margin.html [ Failure ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/negative-margins-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/ttwf-reftest-flex-inline.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001a.xhtml [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001b.xhtml [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-001-block.xhtml [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002.xhtml [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-004.xhtml [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-align-self-baseline-horiz-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-horiz-001a.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-horiz-001b.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-vert-001b.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-002.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-vert-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-vert-002.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001a.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001b.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001a.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001b.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001a.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001b.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-baseline-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-003.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-004.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001b.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002a.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002b.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-004a.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001v.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002v.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-004.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-004v.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005v.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006v.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007v.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001a.xhtml [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001b.xhtml [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002a.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002b.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002c.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002a.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002c.html [ Pass ] -crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-paint-ordering-002.xhtml [ Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/negative-margins-001.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/ttwf-reftest-flex-inline.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001a.xhtml [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001b.xhtml [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-001-block.xhtml [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002.xhtml [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-004.xhtml [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-align-self-baseline-horiz-001.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-horiz-001a.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-horiz-001b.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-vert-001b.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-001.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-002.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-vert-001.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-vert-002.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001a.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001b.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001a.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001b.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001a.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001b.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-baseline-001.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-001.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-003.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-004.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001b.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002a.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002b.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-004a.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001v.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002v.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-004.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-004v.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005v.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006v.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007v.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001a.xhtml [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001b.xhtml [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002a.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002b.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002c.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002a.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002c.html [ Failure Pass ] +crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-paint-ordering-002.xhtml [ Failure Pass ] crbug.com/982194 virtual/lazyload-image/http/tests/lazyload/style-dimension.html [ Pass ] crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-should-not-stop-on-keypress.html [ Failure ] crbug.com/779170 virtual/mouseevent_fractional/fast/events/clientXY-in-zoom-and-scroll.html [ Pass ] -crbug.com/982194 virtual/mouseevent_fractional/fast/events/content-changed-during-drop.html [ Failure ] -crbug.com/663847 virtual/mouseevent_fractional/fast/events/context-no-deselect.html [ Pass ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/content-changed-during-drop.html [ Failure Pass ] +crbug.com/663847 virtual/mouseevent_fractional/fast/events/context-no-deselect.html [ Failure Pass ] crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-in-frames.html [ Failure ] crbug.com/346473 virtual/mouseevent_fractional/fast/events/drag-on-mouse-move-cancelled.html [ Failure ] -crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag_and_drop_into_removed_on_focus.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag_and_drop_into_removed_on_focus.html [ Failure Pass ] crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-on-culled-inline-with-pseudo.html [ Failure ] crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-relative-position.html [ Failure ] crbug.com/982194 virtual/mouseevent_fractional/fast/events/open-window-from-another-frame.html [ Timeout ] @@ -1883,30 +1933,31 @@ crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/touch-capture.html [ Failure ] crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/touch-pointer-events.html [ Failure ] crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectstart-by-single-click-with-shift.html [ Failure ] -crbug.com/982194 virtual/mouseevent_fractional/fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure ] -crbug.com/982194 virtual/mouseevent_fractional/fast/events/simulated-click-coords.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure Pass ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/simulated-click-coords.html [ Failure Pass ] crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/compositor-touch-hit-rects-list-translate.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/compositor-touch-hit-rects.html [ Failure ] crbug.com/874695 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-click.html [ Pass ] crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-mouse-events-between-frames.html [ Failure ] crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure ] -crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-result.html [ Failure Pass ] crbug.com/874695 virtual/mouseevent_fractional/fast/events/touch/touch-slider-no-js-touch-listener.html [ Pass ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/updateLayoutForHitTest.html [ Failure Pass ] crbug.com/779170 virtual/mouseevent_fractional/fast/events/zoom-dblclick.html [ Failure ] crbug.com/982194 virtual/not-site-per-process/http/tests/devtools/debugger/fetch-breakpoints.js [ Pass Timeout ] +crbug.com/982194 virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/background-image-alpha.https.html [ Pass ] crbug.com/982194 virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/invalid-image-pending-script.https.html [ Pass ] crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/download.tentative.https.sub.html [ Failure ] crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/iframe.tentative.https.sub.html [ Timeout ] crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/sec-fetch-dest/frame.tentative.https.sub.html [ Timeout ] crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.https.sub.html [ Timeout ] crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/sec-fetch-dest/window-open.tentative.https.sub.html [ Timeout ] -crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/composited-scroll-with-fractional-translation.html [ Pass ] -crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/hidden-scrollbars-invisible.html [ Pass ] -crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/overlay-scrollbar-over-child-layer-nested-2.html [ Pass ] -crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/overlay-scrollbar-over-child-layer-nested.html [ Pass ] -crbug.com/982194 virtual/scalefactor200/css3/filters/effect-blur-hw.html [ Pass ] -crbug.com/982194 virtual/scalefactor200/css3/filters/filterRegions.html [ Pass ] -crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/css-filters-animation-combined-001.html [ Pass ] +crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/composited-scroll-with-fractional-translation.html [ Failure Pass ] +crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/hidden-scrollbars-invisible.html [ Failure Pass ] +crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/overlay-scrollbar-over-child-layer-nested-2.html [ Failure Pass ] +crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/overlay-scrollbar-over-child-layer-nested.html [ Failure Pass ] +crbug.com/982194 virtual/scalefactor200/css3/filters/effect-blur-hw.html [ Failure Pass ] +crbug.com/982194 virtual/scalefactor200/css3/filters/filterRegions.html [ Failure Pass ] +crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/css-filters-animation-combined-001.html [ Failure Pass ] crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filtered-inline-is-container.html [ Failure ] crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filters-test-brightness-003.html [ Pass ] crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/background-image-multiple-elements.html [ Timeout ] @@ -1925,7 +1976,7 @@ crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/text-with-display-style.html [ Timeout ] crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/toJSON.html [ Timeout ] crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/pointerevents/pointerevent_touch-adjustment_click_target.html [ Pass ] -crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Pass ] +crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Failure Pass ] crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/background-image-multiple-elements.html [ Timeout ] crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/css-generated-text.html [ Timeout ] crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/element-only-when-fully-active.html [ Timeout ] @@ -1945,28 +1996,27 @@ crbug.com/982194 virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects.html [ Failure ] crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-mouse-events-between-frames.html [ Failure ] crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure ] -crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-result.html [ Failure Pass ] +crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollbar-mousedown-mouseup.html [ Crash Pass ] crbug.com/982194 virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html [ Pass ] -crbug.com/982194 virtual/stable/http/tests/navigation/anchor-frames-same-origin.html [ Failure Pass ] -crbug.com/982194 virtual/stable/http/tests/navigation/ping-cookie.html [ Timeout ] -crbug.com/982194 virtual/stable/http/tests/navigation/ping-cross-origin-from-https.html [ Timeout ] -crbug.com/982194 virtual/stable/http/tests/navigation/ping-cross-origin.html [ Timeout ] -crbug.com/982194 virtual/stable/http/tests/navigation/ping-same-origin.html [ Timeout ] +crbug.com/982194 virtual/stable/http/tests/navigation/ping-cookie.html [ Pass Timeout ] +crbug.com/982194 virtual/stable/http/tests/navigation/ping-cross-origin-from-https.html [ Pass Timeout ] +crbug.com/982194 virtual/stable/http/tests/navigation/ping-cross-origin.html [ Pass Timeout ] +crbug.com/982194 virtual/stable/http/tests/navigation/ping-same-origin.html [ Pass Timeout ] crbug.com/982194 virtual/stable/media/stable/video-object-fit-stable.html [ Pass ] crbug.com/874695 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-disable-cache.js [ Pass ] crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch-fail.js [ Failure Pass ] crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch.js [ Failure Pass ] -crbug.com/982194 virtual/text-antialias/font-fallback-synthetic-italics.html [ Failure Pass ] -crbug.com/982194 virtual/text-antialias/font-format-support-color-cff2-vertical.html [ Pass ] -crbug.com/982194 virtual/text-antialias/font-ligature-letter-spacing.html [ Failure Pass ] -crbug.com/982194 virtual/text-antialias/font-variant-width.html [ Failure Pass ] -crbug.com/982194 virtual/text-antialias/international/listbox-width-rtl.html [ Failure Pass ] -crbug.com/982194 virtual/text-antialias/international/shape-across-elements.html [ Failure Pass ] +crbug.com/982194 virtual/text-antialias/descent-clip-in-scaled-page.html [ Failure ] +crbug.com/982194 virtual/text-antialias/font-format-support-color-cff2-vertical.html [ Failure Pass ] crbug.com/982194 virtual/text-antialias/remove-zero-length-run.html [ Failure ] -crbug.com/982194 virtual/text-antialias/sub-pixel/text-scaling-pixel.html [ Failure Pass ] -crbug.com/982194 virtual/text-antialias/tab-min-size.html [ Failure Pass ] +crbug.com/982194 virtual/text-antialias/selection/emphasis.html [ Failure Pass ] +crbug.com/982194 virtual/text-antialias/selection/flexbox-selection.html [ Failure Pass ] +crbug.com/982194 virtual/text-antialias/selection/khmer-selection.html [ Failure ] +crbug.com/982194 virtual/text-antialias/selection/repaint-glyph-bounds.html [ Failure ] +crbug.com/982194 virtual/text-antialias/selection/selection-painting-hidpi.html [ Failure Pass ] +crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/rotate-transform-equivalent.html [ Failure ] crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/timing/animation-duration-infinite.html [ Failure Pass ] -crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/lazyload/lazyload-disabled-tentative.sub.html [ Failure Pass ] +crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/lazyload/lazyload-disabled-tentative.sub.html [ Failure ] crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html [ Pass ] crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html [ Pass ] crbug.com/982194 virtual/threaded/fast/scroll-snap/snaps-after-scrollbar-scrolling.html [ Timeout ] @@ -1977,6 +2027,7 @@ crbug.com/982194 virtual/threaded/http/tests/devtools/tracing/timeline-worker-events.js [ Failure Pass ] crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html [ Pass ] crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html [ Pass ] +crbug.com/982194 virtual/web-components-v0-disabled/external/wpt/html/semantics/document-metadata/the-link-element/stylesheet-change-href.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/external/wpt/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html [ Pass ] crbug.com/982194 virtual/web-components-v0-disabled/external/wpt/shadow-dom/DocumentOrShadowRoot-prototype-elementFromPoint.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Document/CaretRangeFromPoint/basic.html [ Failure ] @@ -1988,22 +2039,18 @@ crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Document/CaretRangeFromPoint/hittest-empty-line.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Document/CaretRangeFromPoint/hittest-outside-image.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Document/CaretRangeFromPoint/replace-element.html [ Failure ] -crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Element/client-rect-list-argument.html [ Failure Pass ] -crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Element/getBoundingClientRect.html [ Failure Pass ] -crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Element/getClientRects.html [ Failure Pass ] -crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Range/getClientRects.html [ Failure Pass ] -crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Range/range-spanning-elements-bounding-client-rect.html [ Failure Pass ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/elementsFromPoint/elementsFromPoint-inline.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/elementsFromPoint/elementsFromPoint-simple.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-child-frame-content.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-culled-inline-with-linebreak.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-culled-inlines-between-silblings-bidi.html [ Failure ] -crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-culled-inlines-between-silblings.html [ Failure ] +crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-culled-inlines-between-silblings.html [ Failure Pass ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-culled-inlines.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-embedded-frame-content.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-inner-documents.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-links-and-text.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/shadow/gesture-tapHighlight-shadow-tree.html [ Pass ] crbug.com/982194 virtual/web-components-v0-disabled/fast/html/draggable-controls.html [ Failure ] -crbug.com/982194 virtual/web-components-v0-disabled/html/sections/body-legacy-colors.html [ Timeout ] +crbug.com/982194 virtual/web-components-v0-disabled/html/details_summary/details-writing-mode-align-center.html [ Failure ] +crbug.com/982194 virtual/web-components-v0-disabled/html/sections/body-legacy-colors.html [ Pass Timeout ] crbug.com/982194 wpt_internal/css/css-intrinsic-size/intrinsic-size-015.html [ Crash ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json index 3f5bd019..bd8c8639 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -117757,6 +117757,18 @@ {} ] ], + "html/rendering/the-details-element/summary-display-list-item.html": [ + [ + "html/rendering/the-details-element/summary-display-list-item.html", + [ + [ + "/html/rendering/the-details-element/summary-display-list-item-ref.html", + "==" + ] + ], + {} + ] + ], "html/rendering/widgets/button-layout/anonymous-button-content-box.html": [ [ "html/rendering/widgets/button-layout/anonymous-button-content-box.html", @@ -164352,6 +164364,9 @@ "html/rendering/the-details-element/single-summary.html": [ [] ], + "html/rendering/the-details-element/summary-display-list-item-ref.html": [ + [] + ], "html/rendering/unmapped-attributes-expected.txt": [ [] ], @@ -165372,6 +165387,12 @@ "html/semantics/forms/constraints/form-validation-validity-patternMismatch-expected.txt": [ [] ], + "html/semantics/forms/constraints/form-validation-validity-rangeOverflow-expected.txt": [ + [] + ], + "html/semantics/forms/constraints/form-validation-validity-rangeUnderflow-expected.txt": [ + [] + ], "html/semantics/forms/constraints/form-validation-validity-valid-expected.txt": [ [] ], @@ -180672,9 +180693,6 @@ "trusted-types/support/worker.js": [ [] ], - "trusted-types/trusted-types-createHTMLDocument.tentative-expected.txt": [ - [] - ], "trusted-types/trusted-types-duplicate-names-list-report-only.tentative.html.headers": [ [] ], @@ -212389,6 +212407,12 @@ {} ] ], + "css/css-color/animation/color-composition.html": [ + [ + "css/css-color/animation/color-composition.html", + {} + ] + ], "css/css-color/animation/color-interpolation.html": [ [ "css/css-color/animation/color-interpolation.html", @@ -212709,6 +212733,12 @@ {} ] ], + "css/css-flexbox/animation/flex-basis-composition.html": [ + [ + "css/css-flexbox/animation/flex-basis-composition.html", + {} + ] + ], "css/css-flexbox/animation/flex-basis-interpolation.html": [ [ "css/css-flexbox/animation/flex-basis-interpolation.html", @@ -216295,12 +216325,6 @@ {} ] ], - "css/css-images/animations/object-position-interpolation.html": [ - [ - "css/css-images/animations/object-position-interpolation.html", - {} - ] - ], "css/css-images/gradient/color-stops-parsing.html": [ [ "css/css-images/gradient/color-stops-parsing.html", @@ -217213,6 +217237,12 @@ {} ] ], + "css/css-masking/animations/clip-path-composition.html": [ + [ + "css/css-masking/animations/clip-path-composition.html", + {} + ] + ], "css/css-masking/animations/clip-path-interpolation-001.html": [ [ "css/css-masking/animations/clip-path-interpolation-001.html", @@ -217849,9 +217879,9 @@ {} ] ], - "css/css-position/animation/position-interpolation.html": [ + "css/css-position/animations/bottom-composition.html": [ [ - "css/css-position/animation/position-interpolation.html", + "css/css-position/animations/bottom-composition.html", {} ] ], @@ -217861,18 +217891,42 @@ {} ] ], + "css/css-position/animations/left-composition.html": [ + [ + "css/css-position/animations/left-composition.html", + {} + ] + ], "css/css-position/animations/left-interpolation.html": [ [ "css/css-position/animations/left-interpolation.html", {} ] ], + "css/css-position/animations/position-interpolation.html": [ + [ + "css/css-position/animations/position-interpolation.html", + {} + ] + ], + "css/css-position/animations/right-composition.html": [ + [ + "css/css-position/animations/right-composition.html", + {} + ] + ], "css/css-position/animations/right-interpolation.html": [ [ "css/css-position/animations/right-interpolation.html", {} ] ], + "css/css-position/animations/top-composition.html": [ + [ + "css/css-position/animations/top-composition.html", + {} + ] + ], "css/css-position/animations/top-interpolation.html": [ [ "css/css-position/animations/top-interpolation.html", @@ -223125,6 +223179,12 @@ {} ] ], + "css/css-transforms/animation/perspective-composition.html": [ + [ + "css/css-transforms/animation/perspective-composition.html", + {} + ] + ], "css/css-transforms/animation/perspective-interpolation.html": [ [ "css/css-transforms/animation/perspective-interpolation.html", @@ -223137,18 +223197,36 @@ {} ] ], + "css/css-transforms/animation/rotate-composition.html": [ + [ + "css/css-transforms/animation/rotate-composition.html", + {} + ] + ], "css/css-transforms/animation/rotate-interpolation.html": [ [ "css/css-transforms/animation/rotate-interpolation.html", {} ] ], + "css/css-transforms/animation/scale-composition.html": [ + [ + "css/css-transforms/animation/scale-composition.html", + {} + ] + ], "css/css-transforms/animation/scale-interpolation.html": [ [ "css/css-transforms/animation/scale-interpolation.html", {} ] ], + "css/css-transforms/animation/transform-composition.html": [ + [ + "css/css-transforms/animation/transform-composition.html", + {} + ] + ], "css/css-transforms/animation/transform-interpolation-001.html": [ [ "css/css-transforms/animation/transform-interpolation-001.html", @@ -223185,12 +223263,54 @@ {} ] ], + "css/css-transforms/animation/transform-matrix-composition.html": [ + [ + "css/css-transforms/animation/transform-matrix-composition.html", + {} + ] + ], "css/css-transforms/animation/transform-origin-interpolation.html": [ [ "css/css-transforms/animation/transform-origin-interpolation.html", {} ] ], + "css/css-transforms/animation/transform-perspective-composition.html": [ + [ + "css/css-transforms/animation/transform-perspective-composition.html", + {} + ] + ], + "css/css-transforms/animation/transform-rotate-composition.html": [ + [ + "css/css-transforms/animation/transform-rotate-composition.html", + {} + ] + ], + "css/css-transforms/animation/transform-scale-composition.html": [ + [ + "css/css-transforms/animation/transform-scale-composition.html", + {} + ] + ], + "css/css-transforms/animation/transform-skew-composition.html": [ + [ + "css/css-transforms/animation/transform-skew-composition.html", + {} + ] + ], + "css/css-transforms/animation/transform-translate-composition.html": [ + [ + "css/css-transforms/animation/transform-translate-composition.html", + {} + ] + ], + "css/css-transforms/animation/translate-composition.html": [ + [ + "css/css-transforms/animation/translate-composition.html", + {} + ] + ], "css/css-transforms/animation/translate-interpolation.html": [ [ "css/css-transforms/animation/translate-interpolation.html", @@ -223497,6 +223617,12 @@ {} ] ], + "css/css-transitions/animations/vertical-align-composition.html": [ + [ + "css/css-transitions/animations/vertical-align-composition.html", + {} + ] + ], "css/css-transitions/animations/vertical-align-interpolation.html": [ [ "css/css-transitions/animations/vertical-align-interpolation.html", @@ -257053,12 +257179,24 @@ {} ] ], + "html/semantics/forms/the-input-element/input-valueasdate.html": [ + [ + "html/semantics/forms/the-input-element/input-valueasdate.html", + {} + ] + ], "html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html": [ [ "html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html", {} ] ], + "html/semantics/forms/the-input-element/input-valueasnumber.html": [ + [ + "html/semantics/forms/the-input-element/input-valueasnumber.html", + {} + ] + ], "html/semantics/forms/the-input-element/input-width.html": [ [ "html/semantics/forms/the-input-element/input-width.html", @@ -310186,6 +310324,12 @@ {} ] ], + "trusted-types/DOMParser-parseFromString-regression.tentative.https.html": [ + [ + "trusted-types/DOMParser-parseFromString-regression.tentative.https.html", + {} + ] + ], "trusted-types/DOMParser-parseFromString.tentative.html": [ [ "trusted-types/DOMParser-parseFromString.tentative.html", @@ -375702,6 +375846,10 @@ "e282c4fb98224c0827f24ed9ecdfe95abb1ffbcd", "support" ], + "css/css-color/animation/color-composition.html": [ + "c3e481830b6155114e6e6f543acc27c02c59c687", + "testharness" + ], "css/css-color/animation/color-interpolation.html": [ "4b39fdcf796083ace917f0a021a697c6e4eb7214", "testharness" @@ -378838,6 +378986,10 @@ "f16d29835f7aef92f278fa5bc28317dc913f3544", "reftest" ], + "css/css-flexbox/animation/flex-basis-composition.html": [ + "122761e47679945d000623b6ae6fbe6d13cd5fba", + "testharness" + ], "css/css-flexbox/animation/flex-basis-interpolation.html": [ "d66e81d4924f6b419a0e467119e5ce6dd27e2966", "testharness" @@ -393878,10 +394030,6 @@ "8d3b9472b2c9a2ee88dc97f907f9d16eb4fa3755", "support" ], - "css/css-images/animations/object-position-interpolation.html": [ - "055cbc8421b6af58e636729268f7323e1710458c", - "testharness" - ], "css/css-images/css-image-fallbacks-and-annotations-ref.html": [ "f3193036766e428bf946e81b7df72bfc7f4901db", "support" @@ -396250,6 +396398,10 @@ "322ebd724e8524e85d8afe369b6bafaabbec8c79", "testharness" ], + "css/css-masking/animations/clip-path-composition.html": [ + "2275ae70a330e06214f3c612acdba186efde99cd", + "testharness" + ], "css/css-masking/animations/clip-path-interpolation-001.html": [ "21c34f1f2b75ec7345a97b00db62a49b038cf026", "testharness" @@ -400538,22 +400690,38 @@ "8f03d3c62fd0cefb11a22b1a4a8d2c06fed97308", "support" ], - "css/css-position/animation/position-interpolation.html": [ - "a4ad50240a40674afe76b4c76a08feb9c4e27b12", + "css/css-position/animations/bottom-composition.html": [ + "68a830dfbda2e4f15372ccc89be65d67602bf4b1", "testharness" ], "css/css-position/animations/bottom-interpolation.html": [ "272e79fc05b0267afe696c11ea0572299559d223", "testharness" ], + "css/css-position/animations/left-composition.html": [ + "14b3dfda76dc219bda706e48f7e6846b20e242cf", + "testharness" + ], "css/css-position/animations/left-interpolation.html": [ "33ed0b4ec3b961bc0f71fc1b784b51201f50ebfa", "testharness" ], + "css/css-position/animations/position-interpolation.html": [ + "a4ad50240a40674afe76b4c76a08feb9c4e27b12", + "testharness" + ], + "css/css-position/animations/right-composition.html": [ + "995bb8d6bec8056c1e72ddbaa05b624a1072c9a8", + "testharness" + ], "css/css-position/animations/right-interpolation.html": [ "284d435e56eac5370edd570d2f67b0dfeaa6bbf6", "testharness" ], + "css/css-position/animations/top-composition.html": [ + "47782e8536fa2895d67fc4f91a182899f5da0d50", + "testharness" + ], "css/css-position/animations/top-interpolation.html": [ "f5af530c387a7b52a78a4ca13b27d976f60b2dc9", "testharness" @@ -414878,6 +415046,10 @@ "a326e7c92f21aca39613c6964055b9592b35b034", "testharness" ], + "css/css-transforms/animation/perspective-composition.html": [ + "6fa745d6ed2266cd4535a114a073e386eeb07488", + "testharness" + ], "css/css-transforms/animation/perspective-interpolation.html": [ "a27f84a11bdc3999eb5183dc3251878053c43bac", "testharness" @@ -414886,6 +415058,10 @@ "0a1e74cb8ec6d0539fe04f0be765ec67b3d78b7e", "testharness" ], + "css/css-transforms/animation/rotate-composition.html": [ + "fa0118d50f457b3021a28a7e12a21c96c1c5a23c", + "testharness" + ], "css/css-transforms/animation/rotate-interpolation-expected.txt": [ "6952453f7a3e8fbf8d15286d6d914ea18707cf32", "support" @@ -414894,6 +415070,10 @@ "eff60ba72f72c126ce442a02e89a6b1875190297", "testharness" ], + "css/css-transforms/animation/scale-composition.html": [ + "6fc4de61132cd2b3c887f9a932c2e820fd5cdb38", + "testharness" + ], "css/css-transforms/animation/scale-interpolation-expected.txt": [ "05b835c0dce6b10915040dfab647df818dd10d40", "support" @@ -414902,6 +415082,10 @@ "0e33371955bb7ea630939de5c0333355f9830586", "testharness" ], + "css/css-transforms/animation/transform-composition.html": [ + "928da71a9b9c0ff8d5552976ee2b635f1f3567b6", + "testharness" + ], "css/css-transforms/animation/transform-interpolation-001-expected.txt": [ "dd58e6a649dfd745225f2f84b1214187e1ca4405", "support" @@ -414930,10 +415114,38 @@ "c69bad7c93b8448b763e7f98d0ed6b50783ed7d2", "testharness" ], + "css/css-transforms/animation/transform-matrix-composition.html": [ + "2586ff3d4a577b9c4b43a2841884c6f490d7ccf3", + "testharness" + ], "css/css-transforms/animation/transform-origin-interpolation.html": [ "02b8b59b0b92cb37c4cce43a06ff1e9eff2b41e4", "testharness" ], + "css/css-transforms/animation/transform-perspective-composition.html": [ + "82f8dad59b6590c325ae7b4d2de7cf7b72959c71", + "testharness" + ], + "css/css-transforms/animation/transform-rotate-composition.html": [ + "e062860e72937121ed290c81a1e14276899ec383", + "testharness" + ], + "css/css-transforms/animation/transform-scale-composition.html": [ + "87c33a85ed672612ec60570001f1b9a2bf4f05c9", + "testharness" + ], + "css/css-transforms/animation/transform-skew-composition.html": [ + "cda44b60c0ed9683291ee6341d14c28cf327a4af", + "testharness" + ], + "css/css-transforms/animation/transform-translate-composition.html": [ + "49214c4a93c8c1d16416c131a6780564e474e723", + "testharness" + ], + "css/css-transforms/animation/translate-composition.html": [ + "3abdb4522b07094ca689acee9fc7e252f18438ec", + "testharness" + ], "css/css-transforms/animation/translate-interpolation-expected.txt": [ "0499ca03b5ee21961e69a72ab904c4110d35d9d9", "support" @@ -419298,6 +419510,10 @@ "c007816ecb04236421ff0aea8861da19c244338a", "testharness" ], + "css/css-transitions/animations/vertical-align-composition.html": [ + "222a511679b999cc684d26fc3c5e73bfc1d0ee46", + "testharness" + ], "css/css-transitions/animations/vertical-align-interpolation.html": [ "c81c83239354cc3c179612f26f95891dac8e3676", "testharness" @@ -464066,6 +464282,14 @@ "1f09e7e75f9126982a07902ae0693f9ea2fd5823", "support" ], + "html/rendering/the-details-element/summary-display-list-item-ref.html": [ + "31e98d3fdca8fff9fe88929c8075643fca3abb40", + "support" + ], + "html/rendering/the-details-element/summary-display-list-item.html": [ + "c2e96e987ea943e29626e0cfd013ef6d6cae3bbc", + "reftest" + ], "html/rendering/unmapped-attributes-expected.txt": [ "4179bfbb0420e5141741be44c2c7ea211b24247d", "support" @@ -467934,12 +468158,20 @@ "4ca64aac68983c50297fe48b5cb9423baabab4a4", "testharness" ], + "html/semantics/forms/constraints/form-validation-validity-rangeOverflow-expected.txt": [ + "c33b68b346418f55917cf50d82718fd77e0ac117", + "support" + ], "html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html": [ - "fedf2ea4e4f0aa5018db5bb24ec3bf0e15333992", + "2f69407592ecf0502a75782f6094beaf9310986d", "testharness" ], + "html/semantics/forms/constraints/form-validation-validity-rangeUnderflow-expected.txt": [ + "2afd27b370ed9f691caa540502cf608f0a08c598", + "support" + ], "html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html": [ - "8ac3aae1279c0f6df2203251aae26854ba551b57", + "c939a94c37e160f374445ec1def14137764e54d4", "testharness" ], "html/semantics/forms/constraints/form-validation-validity-stepMismatch.html": [ @@ -467959,7 +468191,7 @@ "testharness" ], "html/semantics/forms/constraints/form-validation-validity-valid-expected.txt": [ - "b0da38305f70073516805dba54b8fb5f0fda8413", + "85f81beb88241b6f1b4f15467dcc7ee06bcf8a2c", "support" ], "html/semantics/forms/constraints/form-validation-validity-valid.html": [ @@ -467967,11 +468199,11 @@ "testharness" ], "html/semantics/forms/constraints/form-validation-validity-valueMissing-expected.txt": [ - "b4497dd9a754b12ba2d3a1e76ca03f00b828572c", + "6e95bca5f8a4650a7d349c07a86444ffde3b2c27", "support" ], "html/semantics/forms/constraints/form-validation-validity-valueMissing.html": [ - "2e1c666436a19bc759026ebf55df4a17073ecb5d", + "3229527fabc00880bd2f95d7aa4f494ce9884fa3", "testharness" ], "html/semantics/forms/constraints/form-validation-willValidate-expected.txt": [ @@ -468722,10 +468954,18 @@ "bd49a15fc82136105c17818561cc1e8f7fbfe7ee", "testharness" ], + "html/semantics/forms/the-input-element/input-valueasdate.html": [ + "a958e991ec53a22413bc311d832bc28b3b4baccf", + "testharness" + ], "html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html": [ "a3187ff3fbca4252d701b30c761819f5075611cc", "testharness" ], + "html/semantics/forms/the-input-element/input-valueasnumber.html": [ + "321c981c74d2293694fecf18284126b089aca1c2", + "testharness" + ], "html/semantics/forms/the-input-element/input-width.html": [ "5278ff77e1e7523a74970c5b85a94e29e66ea8e4", "testharness" @@ -468791,7 +469031,7 @@ "testharness" ], "html/semantics/forms/the-input-element/radio.html": [ - "c37fa7acd0c705e4711be719b9f99ce4db929560", + "7dcc9a14a8980898917d8d771041bd691e99785f", "testharness" ], "html/semantics/forms/the-input-element/range-2.html": [ @@ -468883,7 +469123,7 @@ "testharness" ], "html/semantics/forms/the-input-element/valueMode.html": [ - "9525d3ca1feedb651b18fefed8391d3584f36189", + "5502011794fcfdcfae5161ca861448ceb503dc54", "testharness" ], "html/semantics/forms/the-input-element/week.html": [ @@ -520542,6 +520782,10 @@ "1b723b7bb3c5cebc0701e2393e334a1e99ce2ef3", "testharness" ], + "trusted-types/DOMParser-parseFromString-regression.tentative.https.html": [ + "30986e45d2671caec84879314b43891664dd10ae", + "testharness" + ], "trusted-types/DOMParser-parseFromString.tentative.html": [ "2dfc37686bca15431c216a50d29f9f9eed2782e0", "testharness" @@ -520822,10 +521066,6 @@ "4079f7e9c7933cf9ee195fe0e7a54e0f56f184ab", "support" ], - "trusted-types/trusted-types-createHTMLDocument.tentative-expected.txt": [ - "000dc2bbc56f39e6adc7a90b5a76796434278818", - "support" - ], "trusted-types/trusted-types-createHTMLDocument.tentative.html": [ "6ab5f42d5ffd82ccc3bf5c9ea8916c2b2f810987", "testharness" @@ -535059,7 +535299,7 @@ "testharness" ], "webxr/xrInputSource_add_remove.https.html": [ - "4c50670c70ec87754a777cc0bcfe8272e794ca07", + "33264ddd68ab09e2ed6a596614116bd1225f2665", "testharness" ], "webxr/xrInputSource_emulatedPosition.https.html": [
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-list-item-ref.html b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-list-item-ref.html new file mode 100644 index 0000000..31e98d3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-list-item-ref.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Reference: summary with 'display: list-item'</title> +<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com"> +<style> +details { + margin-left: 50px; +} +.inside { + list-style-position: inside; +} +</style> +<details> + <summary>summary</summary> + content +</details> +<details> + <summary class="inside">summary</summary> + content +</details> +<details open> + <summary>summary</summary> + content +</details> +<details open> + <summary class="inside">summary</summary> + content +</details>
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-list-item.html b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-list-item.html new file mode 100644 index 0000000..c2e96e98 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-list-item.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: summary with 'display: list-item'</title> +<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com"> +<link rel="match" href="summary-display-list-item-ref.html"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-details-and-summary-elements"> +<meta name="assert" content="Checks that styling a <summary> with 'display: list-item' has no effect since it should already be a list item by default."> +<style> +summary { + display: list-item; +} +details { + margin-left: 50px; +} +.inside { + list-style-position: inside; +} +</style> +<details> + <summary>summary</summary> + content +</details> +<details> + <summary class="inside">summary</summary> + content +</details> +<details open> + <summary>summary</summary> + content +</details> +<details open> + <summary class="inside">summary</summary> + content +</details>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow-expected.txt new file mode 100644 index 0000000..c33b68b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow-expected.txt
@@ -0,0 +1,72 @@ +This is a testharness.js-based test. +Found 68 tests; 66 PASS, 2 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS [INPUT in DATETIME-LOCAL status] The max attribute is not set +PASS [INPUT in DATETIME-LOCAL status] Value is empty string +PASS [INPUT in DATETIME-LOCAL status] The max attribute is an invalid local date time string +PASS [INPUT in DATETIME-LOCAL status] The max attribute is greater than the value attribute +PASS [INPUT in DATETIME-LOCAL status] The value is an invalid local date time string(hour is greater than 23) +PASS [INPUT in DATETIME-LOCAL status] The value if an invalid local date time string(year is two digits) +PASS [INPUT in DATETIME-LOCAL status] The value is greater than max +PASS [INPUT in DATETIME-LOCAL status] The value is greater than max(with millisecond in 1 digit) +PASS [INPUT in DATETIME-LOCAL status] The value is greater than max(with millisecond in 2 digits) +PASS [INPUT in DATETIME-LOCAL status] The value is greater than max(with millisecond in 3 digits) +PASS [INPUT in DATETIME-LOCAL status] The value is greater than max(Year is 10000 should be valid) +PASS [INPUT in DATE status] The max attribute is not set +PASS [INPUT in DATE status] Value is empty string +PASS [INPUT in DATE status] The max attribute is an invalid date +PASS [INPUT in DATE status] The value attribute is an invalid date +PASS [INPUT in DATE status] The value is an invalid date(year is three digits) +PASS [INPUT in DATE status] The value is an invalid date(month is greater than 12) +PASS [INPUT in DATE status] The value is an invalid date(date is greater than 29 for Feb) +PASS [INPUT in DATE status] The max attribute is greater than value attribute +PASS [INPUT in DATE status] The value attribute is greater than max attribute +PASS [INPUT in DATE status] The value attribute is greater than max attribute(Year is 10000 should be valid) +PASS [INPUT in MONTH status] The max attribute is not set +PASS [INPUT in MONTH status] Value is empty string +PASS [INPUT in MONTH status] The max attribute is an invalid month string +PASS [INPUT in MONTH status] The value attribute is an invalid month string +PASS [INPUT in MONTH status] The value is an invalid month string(year is three digits) +PASS [INPUT in MONTH status] The value is an invalid month string(month is greater than 12) +PASS [INPUT in MONTH status] The max attribute is greater than value attribute +PASS [INPUT in MONTH status] The value attribute is greater than max attribute +PASS [INPUT in MONTH status] The value attribute is greater than max attribute(Year is 10000 should be valid) +PASS [INPUT in WEEK status] The max attribute is not set +PASS [INPUT in WEEK status] Value is empty string +PASS [INPUT in WEEK status] The max attribute is an invalid week string +PASS [INPUT in WEEK status] The value attribute is an invalid week string +PASS [INPUT in WEEK status] The value attribute is an invalid week string(w is in lowercase) +PASS [INPUT in WEEK status] The value is an invalid week string(year is three digits) +PASS [INPUT in WEEK status] The value is an invalid week string(week is too greater) +PASS [INPUT in WEEK status] The max attribute is greater than value attribute +PASS [INPUT in WEEK status] The value attribute is greater than max attribute +PASS [INPUT in WEEK status] The value attribute is greater than max attribute(Year is 10000 should be valid) +PASS [INPUT in TIME status] The max attribute is not set +PASS [INPUT in TIME status] Value is empty string +PASS [INPUT in TIME status] The max attribute is an invalid time string +PASS [INPUT in TIME status] The value attribute is an invalid time string +PASS [INPUT in TIME status] The value attribute is an invalid time string(hour is greater than 23) +PASS [INPUT in TIME status] The value attribute is an invalid time string(minute is greater than 59) +PASS [INPUT in TIME status] The value attribute is an invalid time string(second is greater than 59) +PASS [INPUT in TIME status] The max attribute is greater than value attribute +PASS [INPUT in TIME status] The time missing second and minute parts is invalid +PASS [INPUT in TIME status] The value attribute is greater than max attribute +PASS [INPUT in TIME status] The value is greater than max(with millisecond in 1 digit) +PASS [INPUT in TIME status] The value is greater than max(with millisecond in 2 digit) +PASS [INPUT in TIME status] The value is greater than max(with millisecond in 3 digit) +PASS [INPUT in TIME status] The time missing second part is valid +PASS [INPUT in TIME status] The time is max for reversed range +PASS [INPUT in TIME status] The time is outside the accepted range for reversed range +FAIL [INPUT in TIME status] The time is min for reversed range assert_false: The validity.rangeOverflow should be false. expected false got true +FAIL [INPUT in TIME status] The time is inside the accepted range for reversed range assert_false: The validity.rangeOverflow should be false. expected false got true +PASS [INPUT in NUMBER status] The max attribute is not set +PASS [INPUT in NUMBER status] Value is empty string +PASS [INPUT in NUMBER status] The max is greater than value(integer) +PASS [INPUT in NUMBER status] The max is greater than value(floating number) +PASS [INPUT in NUMBER status] The max equals to value +PASS [INPUT in NUMBER status] The value is not a number +PASS [INPUT in NUMBER status] The value is greater than max(integer) +PASS [INPUT in NUMBER status] The value is greater than max(floating number) +PASS [INPUT in NUMBER status] The value is greater than max(special floating number) +PASS [INPUT in NUMBER status] The value is greater than max(scientific notation) +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html index fedf2ea..2f69407 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html
@@ -91,7 +91,11 @@ {conditions: {max: "12:00:00.1", value: "12:00:00.2"}, expected: true, name: "[target] The value is greater than max(with millisecond in 1 digit)"}, {conditions: {max: "12:00:00.01", value: "12:00:00.02"}, expected: true, name: "[target] The value is greater than max(with millisecond in 2 digit)"}, {conditions: {max: "12:00:00.001", value: "12:00:00.002"}, expected: true, name: "[target] The value is greater than max(with millisecond in 3 digit)"}, - {conditions: {max: "12:00:00", value: "12:01"}, expected: true, name: "[target] The time missing second part is valid"} + {conditions: {max: "12:00:00", value: "12:01"}, expected: true, name: "[target] The time missing second part is valid"}, + {conditions: {max: "12:00:00", min: "14:00:00", value: "12:00:00"}, expected: false, name: "[target] The time is max for reversed range"}, + {conditions: {max: "12:00:00", min: "14:00:00", value: "13:00:00"}, expected: true, name: "[target] The time is outside the accepted range for reversed range"}, + {conditions: {max: "12:00:00", min: "14:00:00", value: "14:00:00"}, expected: false, name: "[target] The time is min for reversed range"}, + {conditions: {max: "12:00:00", min: "14:00:00", value: "15:00:00"}, expected: false, name: "[target] The time is inside the accepted range for reversed range"}, ] }, {
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow-expected.txt new file mode 100644 index 0000000..2afd27b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow-expected.txt
@@ -0,0 +1,70 @@ +This is a testharness.js-based test. +Found 66 tests; 65 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS [INPUT in DATETIME-LOCAL status] The min attribute is not set +PASS [INPUT in DATETIME-LOCAL status] Value is empty string +PASS [INPUT in DATETIME-LOCAL status] The min attribute is an invalid local date time string +PASS [INPUT in DATETIME-LOCAL status] The min attribute is less than the value attribute +PASS [INPUT in DATETIME-LOCAL status] The value is an invalid local date time string(hour is greater than 23) +PASS [INPUT in DATETIME-LOCAL status] The value is an invalid local date time string(year is two digits) +PASS [INPUT in DATETIME-LOCAL status] The value is less than min +PASS [INPUT in DATETIME-LOCAL status] The value is less than min(with millisecond in 1 digit) +PASS [INPUT in DATETIME-LOCAL status] The value is less than min(with millisecond in 2 digits) +PASS [INPUT in DATETIME-LOCAL status] The value is less than min(with millisecond in 3 digits) +PASS [INPUT in DATETIME-LOCAL status] The value is less than min(Year is 10000 should be valid) +PASS [INPUT in DATETIME-LOCAL status] The value is greater than max +PASS [INPUT in DATE status] The min attribute is not set +PASS [INPUT in DATE status] Value is empty string +PASS [INPUT in DATE status] The min attribute is an invalid date +PASS [INPUT in DATE status] The value attribute is an invalid date +PASS [INPUT in DATE status] The value is an invalid date(year is three digits) +PASS [INPUT in DATE status] The value is an invalid date(month is less than 12) +PASS [INPUT in DATE status] The value is an invalid date(date is less than 29 for Feb) +PASS [INPUT in DATE status] The min attribute is less than value attribute +PASS [INPUT in DATE status] The value attribute is less than min attribute +PASS [INPUT in DATE status] The value attribute is less than min attribute(Year is 10000 should be valid) +PASS [INPUT in MONTH status] The min attribute is not set +PASS [INPUT in MONTH status] Value is empty string +PASS [INPUT in MONTH status] The min attribute is an invalid month string +PASS [INPUT in MONTH status] The value attribute is an invalid month string +PASS [INPUT in MONTH status] The value is an invalid month string(year is three digits) +PASS [INPUT in MONTH status] The value is an invalid month string(month is less than 12) +PASS [INPUT in MONTH status] The min attribute is less than value attribute +PASS [INPUT in MONTH status] The value attribute is less than min attribute +PASS [INPUT in MONTH status] The value attribute is less than min attribute(Year is 10000 should be valid) +PASS [INPUT in WEEK status] The min attribute is not set +PASS [INPUT in WEEK status] Value is empty string +PASS [INPUT in WEEK status] The min attribute is an invalid week string +PASS [INPUT in WEEK status] The value attribute is an invalid week string +PASS [INPUT in WEEK status] The value attribute is an invalid week string(w is in lowercase) +PASS [INPUT in WEEK status] The value is an invalid week string(year is three digits) +PASS [INPUT in WEEK status] The value is an invalid week string(week is too greater) +PASS [INPUT in WEEK status] The min attribute is less than value attribute +PASS [INPUT in WEEK status] The value attribute is less than min attribute +PASS [INPUT in WEEK status] The value attribute is less than min attribute(Year is 10000 should be valid) +PASS [INPUT in TIME status] The min attribute is not set +PASS [INPUT in TIME status] Value is empty string +PASS [INPUT in TIME status] The min attribute is an invalid time string +PASS [INPUT in TIME status] The value attribute is an invalid time string +PASS [INPUT in TIME status] The min attribute is less than value attribute +PASS [INPUT in TIME status] The time missing second and minute parts is invalid +PASS [INPUT in TIME status] The value attribute is less than min attribute +PASS [INPUT in TIME status] The value is less than min(with millisecond in 1 digit) +PASS [INPUT in TIME status] The value is less than min(with millisecond in 2 digit) +PASS [INPUT in TIME status] The value is less than min(with millisecond in 3 digit) +PASS [INPUT in TIME status] The time missing second part is valid +FAIL [INPUT in TIME status] The time is max for reversed range assert_false: The validity.rangeUnderflow should be false. expected false got true +PASS [INPUT in TIME status] The time is outside the accepted range for reversed range +PASS [INPUT in TIME status] The time is min for reversed range +PASS [INPUT in TIME status] The time is inside the accepted range for reversed range +PASS [INPUT in NUMBER status] The min attribute is not set +PASS [INPUT in NUMBER status] Value is empty string +PASS [INPUT in NUMBER status] The min is less than value(integer) +PASS [INPUT in NUMBER status] The min is less than value(floating number) +PASS [INPUT in NUMBER status] The min equals to value +PASS [INPUT in NUMBER status] The value is not a number +PASS [INPUT in NUMBER status] The value is less than min(integer) +PASS [INPUT in NUMBER status] The value is less than min(floating number) +PASS [INPUT in NUMBER status] The value is less than min(special floating number) +PASS [INPUT in NUMBER status] The value is less than min(scientific notation) +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html index 8ac3aae1..c939a94 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html
@@ -89,7 +89,11 @@ {conditions: {min: "12:00:00.2", value: "12:00:00.1"}, expected: true, name: "[target] The value is less than min(with millisecond in 1 digit)"}, {conditions: {min: "12:00:00.02", value: "12:00:00.01"}, expected: true, name: "[target] The value is less than min(with millisecond in 2 digit)"}, {conditions: {min: "12:00:00.002", value: "12:00:00.001"}, expected: true, name: "[target] The value is less than min(with millisecond in 3 digit)"}, - {conditions: {min: "12:00:00", value: "11:59"}, expected: true, name: "[target] The time missing second part is valid"} + {conditions: {min: "12:00:00", value: "11:59"}, expected: true, name: "[target] The time missing second part is valid"}, + {conditions: {min: "14:00:00", max: "12:00:00", value: "12:00:00"}, expected: false, name: "[target] The time is max for reversed range"}, + {conditions: {min: "14:00:00", max: "12:00:00", value: "13:00:00"}, expected: true, name: "[target] The time is outside the accepted range for reversed range"}, + {conditions: {min: "14:00:00", max: "12:00:00", value: "14:00:00"}, expected: false, name: "[target] The time is min for reversed range"}, + {conditions: {min: "14:00:00", max: "12:00:00", value: "15:00:00"}, expected: false, name: "[target] The time is inside the accepted range for reversed range"}, ] }, {
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/input-valueasdate.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/input-valueasdate.html new file mode 100644 index 0000000..a958e99 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/input-valueasdate.html
@@ -0,0 +1,109 @@ +<!DOCTYPE HTML> +<meta charset="utf-8"> +<html> + <head> + <title>HTMLInputElement valueAsDate</title> + <link rel="author" title="pmdartus" href="mailto:dartus.pierremarie@gmail.com"> + <link rel=help href="https://html.spec.whatwg.org/#dom-input-valueasdate"> + + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <h3>input_valueAsDate</h3> + <hr> + <div id="log"></div> + + <input id="input_date" type="date" /> + <input id="input_month" type="month" /> + <input id="input_week" type="week" /> + <input id="input_time" type="time" /> + + <script> + "use strict"; + + function testValueAsDateGetter(type, element, cases) { + for (const [actualValue, expectedValueAsDate] of cases) { + test( + () => { + element.value = actualValue; + + const actualValueAsDate = element.valueAsDate; + if (actualValueAsDate instanceof Date) { + assert_equals( + actualValueAsDate.getTime(), + expectedValueAsDate.getTime(), + `valueAsDate returns an invalid date (actual: ${actualValueAsDate.toISOString()}, ` + + `expected: ${expectedValueAsDate.toISOString()})` + ); + } else { + assert_equals(actualValueAsDate, expectedValueAsDate); + } + }, + `valueAsDate getter on type ${type} (actual value: ${actualValue}, ` + + `expected valueAsDate: ${expectedValueAsDate})` + ); + } + } + + function testValueAsDateSetter(type, element, cases) { + for (const [valueAsDate, expectedValue] of cases) { + test(() => { + element.valueAsDate = valueAsDate; + assert_equals(element.value, expectedValue); + }, `valueAsDate setter on type ${type} (actual valueAsDate: ${valueAsDate}, expected value: ${expectedValue})`); + } + } + + const dateInput = document.getElementById("input_date"); + testValueAsDateGetter("date", dateInput, [ + ["", null], + ["0000-12-10", null], + ["2019-00-12", null], + ["2019-12-00", null], + ["2019-13-10", null], + ["2019-02-29", null], + ["2019-12-10", new Date("2019-12-10T00:00:00.000Z")], + ["2016-02-29", new Date("2016-02-29T00:00:00.000Z")] // Leap year + ]); + testValueAsDateSetter("date", dateInput, [ + [new Date("2019-12-10T00:00:00.000Z"), "2019-12-10"], + [new Date("2016-02-29T00:00:00.000Z"), "2016-02-29"] // Leap year + ]); + + const monthInput = document.getElementById("input_month"); + testValueAsDateGetter("month", monthInput, [ + ["", null], + ["0000-12", null], + ["2019-00", null], + ["2019-12", new Date("2019-12-01T00:00:00.000Z")] + ]); + testValueAsDateSetter("month", monthInput, [[new Date("2019-12-01T00:00:00.000Z"), "2019-12"]]); + + const weekInput = document.getElementById("input_week"); + testValueAsDateGetter("week", weekInput, [ + ["", null], + ["0000-W50", null], + ["2019-W00", null], + ["2019-W60", null], + ["2019-W50", new Date("2019-12-09T00:00:00.000Z")] + ]); + testValueAsDateSetter("week", weekInput, [[new Date("2019-12-09T00:00:00.000Z"), "2019-W50"]]); + + const timeInput = document.getElementById("input_time"); + testValueAsDateGetter("time", timeInput, [ + ["", null], + ["24:00", null], + ["00:60", null], + ["00:00", new Date("1970-01-01T00:00:00.000Z")], + ["12:00", new Date("1970-01-01T12:00:00.000Z")], + ["23:59", new Date("1970-01-01T23:59:00.000Z")] + ]); + testValueAsDateSetter("time", timeInput, [ + [new Date("1970-01-01T00:00:00.000Z"), "00:00"], + [new Date("1970-01-01T12:00:00.000Z"), "12:00"], + [new Date("1970-01-01T23:59:00.000Z"), "23:59"] + ]); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/input-valueasnumber.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/input-valueasnumber.html new file mode 100644 index 0000000..321c981 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/input-valueasnumber.html
@@ -0,0 +1,146 @@ +<!DOCTYPE HTML> +<meta charset="utf-8"> +<html> + <head> + <title>HTMLInputElement valueAsNumber</title> + <link rel="author" title="pmdartus" href="mailto:dartus.pierremarie@gmail.com"> + <link rel=help href="https://html.spec.whatwg.org/#dom-input-valueasnumber"> + + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <h3>input_valueAsNumber</h3> + <hr> + <div id="log"></div> + + <input id="input_date" type="date" /> + <input id="input_month" type="month" /> + <input id="input_week" type="week" /> + <input id="input_time" type="time" /> + <input id="input_datetime-local" type="datetime-local" /> + <input id="input_number" type="number" /> + <input id="input_range" type="range" min="0" max="100" /> + + <script> + "use strict"; + + function testValueAsNumberGetter(type, element, cases) { + for (const [value, expectedValueAsNumber] of cases) { + test( + () => { + element.value = value; + assert_equals(element.valueAsNumber, expectedValueAsNumber); + }, + `valueAsNumber getter on type ${type} (actual value: ${value}, ` + + `expected valueAsNumber: ${expectedValueAsNumber})` + ); + } + } + + function testValueAsNumberSetter(type, element, cases) { + for (const [valueAsNumber, expectedValue] of cases) { + test( + () => { + element.valueAsNumber = valueAsNumber; + assert_equals(element.value, expectedValue); + }, + `valueAsNumber setter on type ${type} (actual valueAsNumber: ${valueAsNumber}, ` + + `expected value: ${expectedValue})` + ); + } + } + + const dateInput = document.getElementById("input_date"); + testValueAsNumberGetter("date", dateInput, [ + ["", NaN], + ["0000-12-10", NaN], + ["2019-00-12", NaN], + ["2019-12-00", NaN], + ["2019-13-10", NaN], + ["2019-02-29", NaN], + ["2019-12-10", 1575936000000], + ["2016-02-29", 1456704000000] // Leap year + ]); + testValueAsNumberSetter("date", dateInput, [ + [0, "1970-01-01"], + [1575936000000, "2019-12-10"], + [1456704000000, "2016-02-29"] // Leap year + ]); + + const monthInput = document.getElementById("input_month"); + testValueAsNumberGetter("month", monthInput, [ + ["", NaN], + ["0000-12", NaN], + ["2019-00", NaN], + ["2019-12", 599] + ]); + testValueAsNumberSetter("month", monthInput, [[599, "2019-12"]]); + + const weekInput = document.getElementById("input_week"); + testValueAsNumberGetter("week", weekInput, [ + ["", NaN], + ["0000-W50", NaN], + ["2019-W00", NaN], + ["2019-W60", NaN], + ["2019-W50", 1575849600000] + ]); + testValueAsNumberSetter("week", weekInput, [ + [0, "1970-W01"], + [1575849600000, "2019-W50"] + ]); + + const timeInput = document.getElementById("input_time"); + testValueAsNumberGetter("time", timeInput, [ + ["", NaN], + ["24:00", NaN], + ["00:60", NaN], + ["00:00", 0], + ["12:00", 12 * 3600 * 1000], + ["23:59", ((23 * 3600) + (59 * 60)) * 1000] + ]); + testValueAsNumberSetter("time", timeInput, [ + [0, "00:00"], + [12 * 3600 * 1000, "12:00"], + [((23 * 3600) + (59 * 60)) * 1000, "23:59"] + ]); + + const dateTimeLocalInput = document.getElementById("input_datetime-local"); + testValueAsNumberGetter("datetime-local", dateTimeLocalInput, [ + ["", NaN], + ["2019-12-10T00:00", 1575936000000], + ["2019-12-10T12:00", 1575979200000] + ]); + testValueAsNumberSetter("datetime-local", dateTimeLocalInput, [ + [1575936000000, "2019-12-10T00:00"], + [1575979200000, "2019-12-10T12:00"] + ]); + + const numberInput = document.getElementById("input_number"); + testValueAsNumberGetter("number", numberInput, [ + ["", NaN], + ["123", 123], + ["123.456", 123.456] + ]); + testValueAsNumberSetter("number", numberInput, [ + [123, "123"], + [123.456, "123.456"] + ]); + + const rangeInput = document.getElementById("input_range"); + testValueAsNumberGetter("range", rangeInput, [ + ["", 50], + ["0", 0], + ["50", 50], + ["100", 100], + ["-10", 0], // Realign to the min + ["110", 100] // Realign to the max + ]); + testValueAsNumberSetter("range", rangeInput, [ + [0, "0"], + [50, "50"], + [100, "100"] + ]); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/valueMode.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/valueMode.html index 9525d3ca..55020117 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/valueMode.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/valueMode.html
@@ -302,4 +302,31 @@ input.value = "foo\r\r\n\n\0"; assert_equals(input.value, "#000000"); }, "value IDL attribute of input type color with value attribute"); + +// MODE FILENAME +test(function () { + var input = document.createElement("input"); + input.type = "file"; + + for (const emptyValue of ["", null]) { + input.value = emptyValue; + assert_equals(input.value, "", `input.value is empty after assigning ${emptyValue}`); + } + + for (const invalidValue of ["foo", 10, undefined]) { + assert_throws("InvalidStateError", () => { + input.value = invalidValue; + }); + assert_equals(input.value, "", `input.value is empty after assigning ${invalidValue}`); + } +}, "value IDL attribute of input type file without value attribute"); +test(function() { + var input = document.createElement("input"); + input.type = "file"; + input.setAttribute("value", "bar"); + assert_equals(input.value, "", "input.value is empty even with a value attribute"); + + input.value = ""; + assert_equals(input.getAttribute("value"), "bar", "Setting input.value does not change the value attribute"); +}, "value IDL attribute of input type file with value attribute"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html index 4c50670..33264dd 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html +++ b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html
@@ -46,7 +46,7 @@ assert_equals(input_sources[1].handedness, "none"); }); - fakeDeviceController.removeInputSource(input_source_1); + input_source_1.disconnect(); session.requestAnimationFrame((time, xrFrame) => { let input_sources = session.inputSources;
diff --git a/third_party/blink/web_tests/fast/css/usecounter-summary-display-block.html b/third_party/blink/web_tests/fast/css/usecounter-summary-display-block.html index 5ab8f4e..c96b87fd 100644 --- a/third_party/blink/web_tests/fast/css/usecounter-summary-display-block.html +++ b/third_party/blink/web_tests/fast/css/usecounter-summary-display-block.html
@@ -7,10 +7,14 @@ } summary.second { - display: some-invalid-value; + display: flex; } summary.third { + display: some-invalid-value; +} + +summary.fourth { display: block; } </style> @@ -34,14 +38,23 @@ summary.classList.add('first'); assert_equals( - 'list-item', window.getComputedStyle(summary).display, - 'the author stylsheet display property should be in effect'); + 'block', window.getComputedStyle(summary).display, + 'the summary is prevented from generating a ::marker since it already has a disclosure symbol'); + assert_false( + isCounted(), + 'the author did not specify `display: block` so it should not not be counted'); + + summary.classList.remove('first'); + summary.classList.add('second'); + assert_equals( + 'flex', window.getComputedStyle(summary).display, + 'the author stylesheet display property should be in effect'); assert_false( isCounted(), 'valid values other than block should not be counted'); - summary.classList.remove('first'); - summary.classList.add('second'); + summary.classList.remove('second'); + summary.classList.add('third'); assert_equals( 'block', window.getComputedStyle(summary).display, 'the user agent stylesheet display property should be in effect ' + @@ -50,8 +63,8 @@ isCounted(), 'only values from an author rule should be counted'); - summary.classList.remove('second'); - summary.classList.add('third'); + summary.classList.remove('third'); + summary.classList.add('fourth'); assert_equals( 'block', window.getComputedStyle(summary).display, 'the author stylesheet display property should be in effect');
diff --git a/third_party/blink/web_tests/fast/forms/resources/state-restore-dynamic-controls-frame.html b/third_party/blink/web_tests/fast/forms/resources/state-restore-dynamic-controls-frame.html index 97bc453..a87c14e6 100644 --- a/third_party/blink/web_tests/fast/forms/resources/state-restore-dynamic-controls-frame.html +++ b/third_party/blink/web_tests/fast/forms/resources/state-restore-dynamic-controls-frame.html
@@ -1,30 +1,7 @@ <!DOCTYPE html> -<script> -document.addEventListener('change', e => { - parent.inputOrChangeEvents.push('change/' + e.target.id); -}); -document.addEventListener('input', e => { - parent.inputOrChangeEvents.push('input/' + e.target.id); -}); -</script> <div></div> -<input type=checkbox disabled id="checkbox-disabled"> -<input type=text disabled id="text-disabled"> -<input type=checkbox id="checkbox-unmodified"> -<input type=text id="text-unmodified"> -<input type=file id="file-modified"> -<input type=file id="file-unmodified"> -<input type=date id="date-modified"> -<input type=date id="date-unmodified"> -<textarea id="textarea-modified"></textarea> -<textarea id="textarea-unmodified">abc -def</textarea> -<select id="select-modified"><option>1<option>2</select> -<select id="select-unmodified" multiple> -<option selected>1</option> -<option>2</option> -<option selected>3</option> -</select> +<input type=checkbox disabled> +<input type=text disabled> <script> -document.querySelector('div').innerHTML = '<input type=checkbox id="checkbox-modified"><input type=text id="text-modified">'; +document.querySelector('div').innerHTML = '<input type=checkbox><input type=text>' </script>
diff --git a/third_party/blink/web_tests/fast/forms/state-restore-dynamic-controls.html b/third_party/blink/web_tests/fast/forms/state-restore-dynamic-controls.html index 6e7be469..af57ac4 100644 --- a/third_party/blink/web_tests/fast/forms/state-restore-dynamic-controls.html +++ b/third_party/blink/web_tests/fast/forms/state-restore-dynamic-controls.html
@@ -2,72 +2,33 @@ <script src="../../resources/testharness.js"></script> <script src="../../resources/testharnessreport.js"></script> <script src="../../external/wpt/html/interaction/focus/the-autofocus-attribute/resources/utils.js"></script> -<script src="file/resources/file-drag-common.js"></script> -<style> -/* Make the top-left corner of the iframe is equal to the top-left corner - of the body. It's required for dragFilesOntoInput(). */ -body { - margin: 0; -} -iframe { - border: none; -} -</style> <body> <iframe src="resources/state-restore-dynamic-controls-frame.html"></iframe> <script> -window.inputOrChangeEvents = []; - promise_test(async t => { await waitForEvent(window, 'load', {once:true}); const iframe = document.querySelector('iframe'); - let doc = iframe.contentDocument; - const container = doc.querySelector('div'); + const container = iframe.contentDocument.querySelector('div'); // Change states of controls container.firstChild.click(); container.lastChild.focus(); eventSender.keyDown('z'); - dragFilesOntoInput(doc.querySelector('#file-modified'), ['foo.txt']); - doc.querySelector('#date-modified').value = '2020-01-08'; - doc.querySelector('#textarea-modified').focus(); - eventSender.keyDown('y'); - doc.querySelector('#select-modified').focus(); - eventSender.keyDown('2'); assert_true(container.firstChild.checked, 'sanity check for a checkbox'); assert_equals(container.lastChild.value, 'z', 'sanity check for a text field'); - assert_equals(doc.querySelector('#textarea-modified').value, 'y', 'sanity check for a textarea'); - assert_equals(doc.querySelector('#select-modified').value, '2', 'sanity check for a select'); - - // Flush asynchronous input/change events - await timeOut(t, 0); // Navigate iframe.src = 'data:text/html,<h1></h1>'; await waitForEvent(iframe, 'load', {once:true}); - inputOrChangeEvents = [] // Navigate back history.back(); await waitForEvent(iframe, 'load', {once:true}); // Wait until finishing the restore task. await timeOut(t, 0); - doc = iframe.contentDocument; - const inputs = doc.querySelectorAll('input'); + const inputs = iframe.contentDocument.querySelectorAll('input'); assert_true(inputs[0].checked, 'Checkbox state should be restored.'); assert_equals(inputs[1].value, 'z', 'Text field state should be restored.'); assert_false(inputs[2].checked, 'Checkbox should have initial value.'); assert_equals(inputs[3].value, '', 'Text field should have initial value.'); - assert_equals(doc.querySelector('textarea').value, 'y'); - assert_equals(doc.querySelector('select').value, '2'); - - // Wait for asynchronous input/change events - await timeOut(t, 0); - assert_array_equals(inputOrChangeEvents, [ - 'input/file-modified', 'change/file-modified', - 'input/checkbox-modified', 'change/checkbox-modified', - 'input/text-modified', 'change/text-modified', - 'input/date-modified', 'change/date-modified', - 'input/textarea-modified', 'change/textarea-modified', - 'input/select-modified', 'change/select-modified']); }, 'Control states should be restored correctly even if controls were inserted before existing controls.'); </script>
diff --git a/third_party/blink/web_tests/fast/overflow/visual-overflow-recalc-expected.html b/third_party/blink/web_tests/fast/overflow/visual-overflow-recalc-expected.html new file mode 100644 index 0000000..58b1d2d3 --- /dev/null +++ b/third_party/blink/web_tests/fast/overflow/visual-overflow-recalc-expected.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<style> +#scroller { + height: 200px; + overflow: scroll; +} +#wrapper { + margin-top: 100px; + width: 200px; + height: 200px; + background: green; +} +</style> +<p>Test passes if there is <strong>no red</strong>.</p> +<div id="scroller"> + <div id="wrapper"> +</div>
diff --git a/third_party/blink/web_tests/fast/overflow/visual-overflow-recalc.html b/third_party/blink/web_tests/fast/overflow/visual-overflow-recalc.html new file mode 100644 index 0000000..d9e6ae8 --- /dev/null +++ b/third_party/blink/web_tests/fast/overflow/visual-overflow-recalc.html
@@ -0,0 +1,40 @@ +<!DOCTYPE html> +<script src="../../resources/run-after-layout-and-paint.js"></script> +<style> +#scroller { + height: 200px; + overflow: scroll; + position: relative; +} +#wrapper { + margin-top: 100px; + width: 200px; + height: 200px; + overflow: hidden; + font-family: Ahem; + color: green; +} +#red { + background: red; + width: 200px; + height: 200px; + position: absolute; + top: 100px; + z-index: -1; +} +</style> +<p>Test passes if there is <strong>no red</strong>.</p> +<div id="scroller"> + <div id="wrapper"> + <span id="inlineouter"> + <span id="inlineinner">X</span> + </span> + </div> + <div id="red"></div> +</div> + +<script> + runAfterLayoutAndPaint(function() { + inlineinner.style.fontSize = "200px"; + }, true); +</script>
diff --git a/third_party/blink/web_tests/platform/mac-retina/external/wpt/pointerevents/pointerevent_coalesced_events_attributes-expected.txt b/third_party/blink/web_tests/platform/mac-retina/external/wpt/pointerevents/pointerevent_coalesced_events_attributes-expected.txt deleted file mode 100644 index 379ff10..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/external/wpt/pointerevents/pointerevent_coalesced_events_attributes-expected.txt +++ /dev/null
@@ -1,15 +0,0 @@ -This is a testharness.js-based test. -PASS touch coalesced events attributes in pointerevents -PASS touch pointercancel should not have any coalesced events -PASS touch pointerover should not have any coalesced events -PASS touch pointerenter should not have any coalesced events -PASS touch pointerdown should not have any coalesced events -PASS touch pointermove should have >2 coalesced events as main thread is busy. -PASS touch pointermove coalesced events should all be marked as trusted. -PASS touch time stamps of coalesced events must be ascending. -PASS touch pointermove coalesced events should all bubbles and cancelable as false. -PASS touch pointerup should not have any coalesced events -PASS touch pointerout should not have any coalesced events -PASS touch pointerleave should not have any coalesced events -Harness: the test ran to completion. -
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index ab981ac3..5f47b92 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -535,7 +535,6 @@ 'chromium.swarm': { 'Android N5 Swarm': 'android_release_bot_minimal_symbols', 'Android N5X Swarm': 'android_release_bot_minimal_symbols_arm64', - 'ChromeOS Swarm': 'cros_chrome_sdk', 'Linux Swarm': 'release_bot_minimal_symbols', 'Mac Swarm': 'release_bot_mac_strip_minimal_symbols', 'Windows Swarm': 'release_bot_minimal_symbols', @@ -573,7 +572,6 @@ 'Linux Debug Builder': 'debug_bot', 'Linux V8 FYI Release (NVIDIA)': 'gpu_tests_release_trybot', 'Linux V8 FYI Release - pointer compression (NVIDIA)': 'gpu_tests_release_trybot_ptr_comp', - 'Linux Snapshot Builder': 'release_bot', 'Mac V8 FYI Release (Intel)': 'gpu_tests_release_trybot', 'V8 Android GN (dbg)': 'android_debug_bot', 'V8 Blink Linux': 'release_bot',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 9fe5413..90f3260 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -21710,6 +21710,7 @@ <int value="1426" label="WEBCAMPRIVATE_SET_HOME"/> <int value="1427" label="INPUTMETHODPRIVATE_RESET"/> <int value="1428" label="PRINTING_GETPRINTERINFO"/> + <int value="1429" label="AUTOTESTPRIVATE_ISARCPACKAGELISTINITIALREFRESHED"/> </enum> <enum name="ExtensionIconState">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 3e80e62d..5773eb3 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -7086,9 +7086,9 @@ </summary> </histogram> -<histogram name="Arc.ImeCount" units="units" expires_after="2020-07-06"> - <owner>yhanada@google.com</owner> - <owner>tetsui@google.com</owner> +<histogram name="Arc.ImeCount" units="units" expires_after="2020-07-30"> + <owner>yhanada@chromium.org</owner> + <owner>tetsui@chromium.org</owner> <summary> The number of IME apps installed. Collected at startup and when an IME app is installed or uninstalled. @@ -42132,8 +42132,18 @@ </summary> </histogram> +<histogram name="EphemeralTab.BottomSheet.CloseReason" + enum="BottomSheet.StateChangeReason" expires_after="M84"> + <owner>donnd@chromium.org</owner> + <owner>jinsukkim@chromium.org</owner> + <summary> + Records the reason that the BottomSheet-based Ephemeral Tab panel was + closed. Recorded when the UX is hidden. Implemented for Android. + </summary> +</histogram> + <histogram name="EphemeralTab.CloseReason" - enum="OverlayPanel.StateChangeReason" expires_after="M82"> + enum="OverlayPanel.StateChangeReason" expires_after="M84"> <owner>donnd@chromium.org</owner> <owner>jinsukkim@chromium.org</owner> <summary> @@ -42142,7 +42152,7 @@ </summary> </histogram> -<histogram name="EphemeralTab.Ctr" enum="BooleanOpened" expires_after="M82"> +<histogram name="EphemeralTab.Ctr" enum="BooleanOpened" expires_after="M84"> <owner>donnd@chromium.org</owner> <owner>jinsukkim@chromium.org</owner> <summary> @@ -42151,7 +42161,7 @@ </summary> </histogram> -<histogram name="EphemeralTab.DurationOpened" units="ms" expires_after="M82"> +<histogram name="EphemeralTab.DurationOpened" units="ms" expires_after="M84"> <owner>donnd@chromium.org</owner> <owner>jinsukkim@chromium.org</owner> <summary> @@ -42160,7 +42170,7 @@ </summary> </histogram> -<histogram name="EphemeralTab.DurationPeeked" units="ms" expires_after="M82"> +<histogram name="EphemeralTab.DurationPeeked" units="ms" expires_after="M84"> <owner>donnd@chromium.org</owner> <owner>jinsukkim@chromium.org</owner> <summary> @@ -56234,6 +56244,9 @@ <histogram name="GPU.GPUChannelHostWaitTime.MicroSeconds" units="microseconds" expires_after="2020-06-28"> + <obsolete> + Removed 01/2020. + </obsolete> <owner>kylechar@chromium.org</owner> <summary> Records how long the browser UI thread spent blocked for a sync IPC sent @@ -109389,7 +109402,7 @@ </histogram> <histogram name="PasswordManager.ManagePasswordsReferrer" - enum="ManagePasswordsReferrer" expires_after="M81"> + enum="ManagePasswordsReferrer" expires_after="M87"> <owner>jdoerrie@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -109400,7 +109413,7 @@ </histogram> <histogram name="PasswordManager.ManagePasswordsReferrerSignedInAndSyncing" - enum="ManagePasswordsReferrer" expires_after="M81"> + enum="ManagePasswordsReferrer" expires_after="M87"> <owner>ioanap@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary>
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv index cbe58186..e4e8d67 100644 --- a/tools/perf/benchmark.csv +++ b/tools/perf/benchmark.csv
@@ -1,6 +1,7 @@ AUTOGENERATED FILE DO NOT EDIT See https://bit.ly/update-benchmarks-info to make changes Benchmark name,Individual owners,Component,Documentation,Tags +UNSCHEDULED_blink_perf.service_worker,"shimazu@chromium.org, falken@chromium.org, ting.shao@intel.com",Blink>ServiceWorker,https://bit.ly/blink-perf-benchmarks, angle_perftests,"jmadill@chromium.org, chrome-gpu-perf-owners@chromium.org",Internals>GPU>ANGLE,, base_perftests,"skyostil@chromium.org, gab@chromium.org",Internals>SequenceManager,https://chromium.googlesource.com/chromium/src/+/HEAD/base/README.md#performance-testing, blink_perf.accessibility,dmazzoni@chromium.org,Blink>Accessibility,https://bit.ly/blink-perf-benchmarks,
diff --git a/tools/perf/benchmarks/blink_perf.py b/tools/perf/benchmarks/blink_perf.py index ee18b1881..63aa2fc 100644 --- a/tools/perf/benchmarks/blink_perf.py +++ b/tools/perf/benchmarks/blink_perf.py
@@ -4,8 +4,8 @@ from __future__ import print_function -import os import collections +import os from core import path_util from core import perf_benchmark @@ -14,6 +14,7 @@ from telemetry import benchmark from telemetry import page as page_module +from telemetry.core import memory_cache_http_server from telemetry.page import legacy_page_test from telemetry.page import shared_page_state from telemetry import story @@ -393,6 +394,40 @@ return 'blink_perf.bindings' +class ServiceWorkerRequestHandler( + memory_cache_http_server.MemoryCacheDynamicHTTPRequestHandler): + """This handler returns dynamic responses for service worker perf tests. + """ + _SIZE_10K = 10240 + _SIZE_1M = 1048576 + + def ResponseFromHandler(self, path): + if path.endswith('/service_worker/resources/data/10K.txt'): + return self.MakeResponse('c' * self._SIZE_10K, 'text/plain', False) + elif path.endswith('/service_worker/resources/data/1M.txt'): + return self.MakeResponse('c' * self._SIZE_1M, 'text/plain', False) + return None + + +@benchmark.Info( + component='Blink>ServiceWorker', + emails=[ + 'shimazu@chromium.org', 'falken@chromium.org', 'ting.shao@intel.com' + ], + documentation_url='https://bit.ly/blink-perf-benchmarks') +class BlinkPerfServiceWorker(_BlinkPerfBenchmark): + SUBDIR = 'service_worker' + + @classmethod + def Name(cls): + return 'UNSCHEDULED_blink_perf.service_worker' + + def CreateStorySet(self, options): + story_set = super(BlinkPerfServiceWorker, self).CreateStorySet(options) + story_set.SetRequestHandlerClass(ServiceWorkerRequestHandler) + return story_set + + @benchmark.Info(emails=['futhark@chromium.org', 'andruud@chromium.org'], documentation_url='https://bit.ly/blink-perf-benchmarks', component='Blink>CSS')
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config index 2d0d953..69fefda 100644 --- a/tools/perf/expectations.config +++ b/tools/perf/expectations.config
@@ -292,9 +292,6 @@ crbug.com/1030735 [ android-weblayer ] startup.mobile/maps_pwa:with_http_cache [ Skip ] # Benchmark: system_health.common_desktop -crbug.com/984599 [ linux ] system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ] -crbug.com/984599 [ win10 ] system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ] -crbug.com/1027686 [ desktop ] system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ] crbug.com/773084 [ mac ] system_health.common_desktop/browse:tools:maps [ Skip ] crbug.com/903417 [ mac ] system_health.common_desktop/long_running:tools:gmail-foreground [ Skip ] crbug.com/903417 [ win ] system_health.common_desktop/long_running:tools:gmail-foreground [ Skip ] @@ -305,7 +302,6 @@ crbug.com/1008093 [ mac ] system_health.common_desktop/multitab:misc:typical24 [ Skip ] crbug.com/1008093 [ mac ] system_health.common_desktop/multitab:misc:typical24:2018 [ Skip ] crbug.com/931185 [ win7 ] system_health.common_desktop/browse:media:youtubetv:2019 [ Skip ] -crbug.com/958422 [ win7 ] system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ] crbug.com/1008028 [ desktop ] system_health.common_desktop/browse:news:hackernews:2018 [ Skip ] crbug.com/1009838 [ mac ] system_health.common_desktop/browse:tools:maps:2019 [ Skip ] crbug.com/1008001 [ win ] system_health.common_desktop/browse:tools:sheets:2019 [ Skip ] @@ -329,8 +325,6 @@ crbug.com/923116 [ android ] system_health.common_mobile/browse:shopping:avito [ Skip ] crbug.com/923527 [ android-webview ] system_health.common_mobile/load:media:soundcloud:2018 [ Skip ] crbug.com/954949 [ android-nexus-5x android-webview ] system_health.common_mobile/browse:news:washingtonpost [ Skip ] -crbug.com/961417 [ android-go ] system_health.common_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ] -crbug.com/1027686 [ android ] system_health.common_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ] crbug.com/979786 [ android-nexus-5x android-webview ] system_health.common_mobile/browse:news:cricbuzz [ Skip ] crbug.com/1002640 [ android-pixel-2 ] system_health.common_mobile/browse:chrome:newtab [ Skip ] crbug.com/1002665 [ android-pixel-2 ] system_health.common_mobile/browse:chrome:omnibox [ Skip ] @@ -340,9 +334,6 @@ crbug.com/1039801 [ android-webview ] system_health.memory_mobile/browse:social:pinterest_infinite_scroll:2019 [ Skip ] # Benchmark: system_health.memory_desktop -crbug.com/1027686 [ linux ] system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ] -crbug.com/1027902 [ win ] system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ] -crbug.com/1027902 [ mac ] system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ] crbug.com/984599 [ linux ] system_health.memory_desktop/long_running:tools:gmail-foreground [ Skip ] crbug.com/984599 [ mac ] system_health.memory_desktop/long_running:tools:gmail-background [ Skip ] crbug.com/1000426 [ win ] system_health.memory_desktop/long_running:tools:gmail-background [ Skip ] @@ -408,9 +399,6 @@ crbug.com/923527 [ android-webview ] system_health.memory_mobile/load:media:soundcloud:2018 [ Skip ] crbug.com/947267 [ android-nexus-5x ] system_health.memory_mobile/background:media:imgur [ Skip ] crbug.com/954949 [ android-nexus-5x android-webview ] system_health.memory_mobile/browse:news:washingtonpost [ Skip ] -crbug.com/961417 [ android-go ] system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ] -crbug.com/1027686 [ android ] system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ] -crbug.com/1016701 [ android-nexus-5x ] system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ] crbug.com/1002640 [ android-pixel-2 ] system_health.memory_mobile/browse:chrome:newtab [ Skip ] crbug.com/1002665 [ android-pixel-2 ] system_health.memory_mobile/browse:chrome:omnibox [ Skip ] crbug.com/1017661 [ android-nexus-5x ] system_health.memory_mobile/browse:media:flickr_infinite_scroll [ Skip ] @@ -429,7 +417,6 @@ crbug.com/875159 [ win10 ] v8.browsing_desktop/browse:media:imgur [ Skip ] crbug.com/954959 [ linux ] v8.browsing_desktop/browse:media:pinterest:2018 [ Skip ] crbug.com/954959 [ linux ] v8.browsing_desktop/browse:tools:maps [ Skip ] -crbug.com/958422 v8.browsing_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ] crbug.com/958507 [ desktop ] v8.browsing_desktop/browse:media:imgur [ Skip ] crbug.com/1008028 [ desktop ] v8.browsing_desktop/browse:news:hackernews:2018 [ Skip ] crbug.com/1009838 [ mac ] v8.browsing_desktop/browse:tools:maps:2019 [ Skip ] @@ -440,7 +427,6 @@ crbug.com/788796 [ linux ] v8.browsing_desktop-future/browse:media:imgur [ Skip ] crbug.com/773084 [ mac ] v8.browsing_desktop-future/browse:tools:maps [ Skip ] crbug.com/906654 v8.browsing_desktop-future/browse:search:google [ Skip ] -crbug.com/958422 v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll:2018 [ Skip ] crbug.com/958507 [ desktop ] v8.browsing_desktop-future/browse:media:imgur [ Skip ] crbug.com/1008028 [ desktop ] v8.browsing_desktop-future/browse:news:hackernews:2018 [ Skip ] crbug.com/1008001 [ win ] v8.browsing_desktop-future/browse:tools:sheets:2019 [ Skip ] @@ -461,8 +447,6 @@ crbug.com/923116 [ android ] v8.browsing_mobile/browse:shopping:avito [ Skip ] crbug.com/929839 [ android-go ] v8.browsing_mobile/browse:chrome:newtab [ Skip ] crbug.com/954949 [ android-nexus-5x android-webview ] v8.browsing_mobile/browse:news:washingtonpost [ Skip ] -crbug.com/961417 [ android-go ] v8.browsing_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ] -crbug.com/1027686 [ android ] v8.browsing_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ] crbug.com/979786 [ android-nexus-5x android-webview ] v8.browsing_mobile/browse:media:flickr_infinite_scroll [ Skip ] crbug.com/1002640 [ android-pixel-2 ] v8.browsing_mobile/browse:chrome:newtab [ Skip ] crbug.com/1002665 [ android-pixel-2 ] v8.browsing_mobile/browse:chrome:omnibox [ Skip ]
diff --git a/ui/aura/native_window_occlusion_tracker_win.cc b/ui/aura/native_window_occlusion_tracker_win.cc index a49a34f..89506ba 100644 --- a/ui/aura/native_window_occlusion_tracker_win.cc +++ b/ui/aura/native_window_occlusion_tracker_win.cc
@@ -7,7 +7,9 @@ #include <memory> #include "base/bind.h" +#include "base/callback.h" #include "base/memory/scoped_refptr.h" +#include "base/synchronization/waitable_event.h" #include "base/task/post_task.h" #include "base/task/task_traits.h" #include "base/threading/sequenced_task_runner_handle.h" @@ -26,10 +28,15 @@ const base::TimeDelta kUpdateOcclusionDelay = base::TimeDelta::FromMilliseconds(16); +// This global variable can be accessed only on main thread. NativeWindowOcclusionTrackerWin* g_tracker = nullptr; } // namespace +NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator* + NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::instance_ = + nullptr; + NativeWindowOcclusionTrackerWin* NativeWindowOcclusionTrackerWin::GetOrCreateInstance() { if (!g_tracker) @@ -38,6 +45,11 @@ return g_tracker; } +void NativeWindowOcclusionTrackerWin::DeleteInstanceForTesting() { + delete g_tracker; + g_tracker = nullptr; +} + void NativeWindowOcclusionTrackerWin::Enable(Window* window) { DCHECK(window->IsRootWindow()); if (window->HasObserver(this)) { @@ -56,7 +68,8 @@ FROM_HERE, base::BindOnce( &WindowOcclusionCalculator::EnableOcclusionTrackingForWindow, - base::Unretained(occlusion_calculator_.get()), root_window_hwnd)); + base::Unretained(WindowOcclusionCalculator::GetInstance()), + root_window_hwnd)); } void NativeWindowOcclusionTrackerWin::Disable(Window* window) { @@ -70,7 +83,8 @@ FROM_HERE, base::BindOnce( &WindowOcclusionCalculator::DisableOcclusionTrackingForWindow, - base::Unretained(occlusion_calculator_.get()), root_window_hwnd)); + base::Unretained(WindowOcclusionCalculator::GetInstance()), + root_window_hwnd)); } void NativeWindowOcclusionTrackerWin::OnWindowVisibilityChanged(Window* window, @@ -83,18 +97,14 @@ update_occlusion_task_runner_->PostTask( FROM_HERE, base::BindOnce(&WindowOcclusionCalculator::HandleVisibilityChanged, - base::Unretained(occlusion_calculator_.get()), visible)); + base::Unretained(WindowOcclusionCalculator::GetInstance()), + visible)); } void NativeWindowOcclusionTrackerWin::OnWindowDestroying(Window* window) { Disable(window); } -NativeWindowOcclusionTrackerWin** -NativeWindowOcclusionTrackerWin::GetInstanceForTesting() { - return &g_tracker; -} - NativeWindowOcclusionTrackerWin::NativeWindowOcclusionTrackerWin() : // Use a COMSTATaskRunner so that registering and unregistering // event hooks will happen on the same thread, as required by Windows, @@ -111,15 +121,24 @@ session_change_observer_( base::BindRepeating(&NativeWindowOcclusionTrackerWin::OnSessionChange, base::Unretained(this))) { - occlusion_calculator_ = std::make_unique<WindowOcclusionCalculator>( - update_occlusion_task_runner_, base::SequencedTaskRunnerHandle::Get()); + WindowOcclusionCalculator::CreateInstance( + update_occlusion_task_runner_, base::SequencedTaskRunnerHandle::Get(), + base::BindRepeating( + &NativeWindowOcclusionTrackerWin::UpdateOcclusionState, + weak_factory_.GetWeakPtr())); } NativeWindowOcclusionTrackerWin::~NativeWindowOcclusionTrackerWin() { - // This shouldn't be reached in production code, because if it is, - // |occlusion_calculator_| will be deleted on the ui thread, which is - // problematic if there tasks scheduled on the background thread. - // Tests are allowed to delete the instance after running all pending tasks. + // |occlusion_calculator_| must be deleted on its sequence because it needs + // to unregister event hooks on COMSTA thread. + // This code is intended to be used in tests and shouldn't be reached in + // production code because it blocks the main thread. + base::WaitableEvent done_event; + update_occlusion_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&WindowOcclusionCalculator::DeleteInstanceForTesting, + &done_event)); + done_event.Wait(); } // static @@ -246,8 +265,11 @@ NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator:: WindowOcclusionCalculator( scoped_refptr<base::SequencedTaskRunner> task_runner, - scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner) - : task_runner_(task_runner), ui_thread_task_runner_(ui_thread_task_runner) { + scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner, + UpdateOcclusionStateCallback update_occlusion_state_callback) + : task_runner_(task_runner), + ui_thread_task_runner_(ui_thread_task_runner), + update_occlusion_state_callback_(update_occlusion_state_callback) { if (base::win::GetVersion() >= base::win::Version::WIN10) { ::CoCreateInstance(__uuidof(VirtualDesktopManager), nullptr, CLSCTX_ALL, IID_PPV_ARGS(&virtual_desktop_manager_)); @@ -257,7 +279,25 @@ NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator:: ~WindowOcclusionCalculator() { - DCHECK(global_event_hooks_.empty()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + UnregisterEventHooks(); +} + +void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::CreateInstance( + scoped_refptr<base::SequencedTaskRunner> task_runner, + scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner, + UpdateOcclusionStateCallback update_occlusion_state_callback) { + DCHECK(!instance_); + instance_ = new WindowOcclusionCalculator(task_runner, ui_thread_task_runner, + update_occlusion_state_callback); +} + +void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator:: + DeleteInstanceForTesting(base::WaitableEvent* done_event) { + DCHECK(instance_); + delete instance_; + instance_ = nullptr; + done_event->Signal(); } void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator:: @@ -312,24 +352,28 @@ LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime) { - g_tracker->occlusion_calculator_->ProcessEventHookCallback(event, hwnd, - idObject, idChild); + if (instance_) + instance_->ProcessEventHookCallback(event, hwnd, idObject, idChild); } // static BOOL CALLBACK NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator:: ComputeNativeWindowOcclusionStatusCallback(HWND hwnd, LPARAM lParam) { - return g_tracker->occlusion_calculator_ - ->ProcessComputeNativeWindowOcclusionStatusCallback( - hwnd, reinterpret_cast<base::flat_set<DWORD>*>(lParam)); + if (instance_) { + return instance_->ProcessComputeNativeWindowOcclusionStatusCallback( + hwnd, reinterpret_cast<base::flat_set<DWORD>*>(lParam)); + } + return FALSE; } // static BOOL CALLBACK NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator:: UpdateVisibleWindowProcessIdsCallback(HWND hwnd, LPARAM lParam) { - g_tracker->occlusion_calculator_ - ->ProcessUpdateVisibleWindowProcessIdsCallback(hwnd); - return TRUE; + if (instance_) { + instance_->ProcessUpdateVisibleWindowProcessIdsCallback(hwnd); + return TRUE; + } + return FALSE; } void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator:: @@ -416,10 +460,8 @@ // Post a task to the browser ui thread to update the window occlusion state // on the root windows. ui_thread_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&NativeWindowOcclusionTrackerWin::UpdateOcclusionState, - base::Unretained(g_tracker), - root_window_hwnds_occlusion_state_)); + FROM_HERE, base::BindOnce(update_occlusion_state_callback_, + root_window_hwnds_occlusion_state_)); } void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator:: @@ -598,7 +640,7 @@ FROM_HERE, base::BindOnce( &WindowOcclusionCalculator::ScheduleOcclusionCalculationIfNeeded, - base::Unretained(this))); + weak_factory_.GetWeakPtr())); } void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
diff --git a/ui/aura/native_window_occlusion_tracker_win.h b/ui/aura/native_window_occlusion_tracker_win.h index 7746998..751562e9 100644 --- a/ui/aura/native_window_occlusion_tracker_win.h +++ b/ui/aura/native_window_occlusion_tracker_win.h
@@ -13,8 +13,10 @@ #include <memory> #include <vector> +#include "base/callback_forward.h" #include "base/containers/flat_map.h" #include "base/containers/flat_set.h" +#include "base/memory/weak_ptr.h" #include "base/sequenced_task_runner.h" #include "base/time/time.h" #include "base/timer/timer.h" @@ -23,13 +25,16 @@ #include "ui/aura/window_observer.h" #include "ui/base/win/session_change_observer.h" -namespace aura { - -// Required to declare a friend class. -namespace test { -class AuraTestHelper; +namespace base { +class WaitableEvent; } +namespace gfx { +class Rect; +} + +namespace aura { + // This class keeps track of whether any HWNDs are occluding any app windows. // It notifies the host of any app window whose occlusion state changes. Most // code should not need to use this; it's an implementation detail. @@ -37,6 +42,8 @@ public: static NativeWindowOcclusionTrackerWin* GetOrCreateInstance(); + static void DeleteInstanceForTesting(); + // Enables notifying the host of |window| via SetNativeWindowOcclusionState() // when the occlusion state has been computed. void Enable(Window* window); @@ -53,20 +60,27 @@ private: friend class NativeWindowOcclusionTrackerTest; - friend class test::AuraTestHelper; - - // Returns a pointer to global instance. - static NativeWindowOcclusionTrackerWin** GetInstanceForTesting(); // This class computes the occlusion state of the tracked windows. // It runs on a separate thread, and notifies the main thread of // the occlusion state of the tracked windows. - class AURA_EXPORT WindowOcclusionCalculator { + class WindowOcclusionCalculator { public: - WindowOcclusionCalculator( + using UpdateOcclusionStateCallback = base::RepeatingCallback<void( + const base::flat_map<HWND, Window::OcclusionState>&)>; + + // Creates WindowOcclusionCalculator instance. Must be called on UI thread. + static void CreateInstance( scoped_refptr<base::SequencedTaskRunner> task_runner, - scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner); - ~WindowOcclusionCalculator(); + scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner, + UpdateOcclusionStateCallback update_occlusion_state_callback); + + // Returns existing WindowOcclusionCalculator instance. + static WindowOcclusionCalculator* GetInstance() { return instance_; } + + // Deletes |instance_| and signals |done_event|. Must be called on COMSTA + // thread. + static void DeleteInstanceForTesting(base::WaitableEvent* done_event); void EnableOcclusionTrackingForWindow(HWND hwnd); void DisableOcclusionTrackingForWindow(HWND hwnd); @@ -75,8 +89,11 @@ void HandleVisibilityChanged(bool visible); private: - friend class NativeWindowOcclusionTrackerTest; - friend class test::AuraTestHelper; + WindowOcclusionCalculator( + scoped_refptr<base::SequencedTaskRunner> task_runner, + scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner, + UpdateOcclusionStateCallback update_occlusion_state_callback); + ~WindowOcclusionCalculator(); // Registers event hooks, if not registered. void MaybeRegisterEventHooks(); @@ -164,6 +181,8 @@ // if we we can't tell for sure. base::Optional<bool> IsWindowOnCurrentVirtualDesktop(HWND hwnd); + static WindowOcclusionCalculator* instance_; + // Task runner for our thread. scoped_refptr<base::SequencedTaskRunner> task_runner_; @@ -171,6 +190,9 @@ // task is posted to this task runner. const scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner_; + // Callback used to update occlusion state on UI thread. + UpdateOcclusionStateCallback update_occlusion_state_callback_; + // Map of root app window hwnds and their occlusion state. This contains // both visible and hidden windows. base::flat_map<HWND, Window::OcclusionState> @@ -214,6 +236,8 @@ SEQUENCE_CHECKER(sequence_checker_); + base::WeakPtrFactory<WindowOcclusionCalculator> weak_factory_{this}; + DISALLOW_COPY_AND_ASSIGN(WindowOcclusionCalculator); }; @@ -246,14 +270,14 @@ // This is set by UpdateOcclusionState. It is currently only used by tests. int num_visible_root_windows_ = 0; - std::unique_ptr<WindowOcclusionCalculator> occlusion_calculator_; - // Manages observation of Windows Session Change messages. ui::SessionChangeObserver session_change_observer_; // If the screen is locked, windows are considered occluded. bool screen_locked_ = false; + base::WeakPtrFactory<NativeWindowOcclusionTrackerWin> weak_factory_{this}; + DISALLOW_COPY_AND_ASSIGN(NativeWindowOcclusionTrackerWin); };
diff --git a/ui/aura/test/aura_test_helper.cc b/ui/aura/test/aura_test_helper.cc index a0bf299..2074c2e 100644 --- a/ui/aura/test/aura_test_helper.cc +++ b/ui/aura/test/aura_test_helper.cc
@@ -34,8 +34,6 @@ #if defined(OS_WIN) #include "base/sequenced_task_runner.h" -#include "base/synchronization/waitable_event.h" -#include "base/test/bind_test_util.h" #include "ui/aura/native_window_occlusion_tracker_win.h" #endif @@ -168,7 +166,7 @@ // task runner. Since ThreadPool is destroyed together with TaskEnvironment, // NativeWindowOcclusionTrackerWin instance must be deleted as well and // recreated on demand in other test. - DeleteNativeWindowOcclusionTrackerWin(); + NativeWindowOcclusionTrackerWin::DeleteInstanceForTesting(); #endif } @@ -187,32 +185,5 @@ return env_ ? env_.get() : Env::HasInstance() ? Env::GetInstance() : nullptr; } -#if defined(OS_WIN) -void AuraTestHelper::DeleteNativeWindowOcclusionTrackerWin() { - NativeWindowOcclusionTrackerWin** global_ptr = - NativeWindowOcclusionTrackerWin::GetInstanceForTesting(); - if (NativeWindowOcclusionTrackerWin* tracker = *global_ptr) { - // WindowOcclusionCalculator must be deleted on its sequence. Wait until - // it's deleted and then delete the tracker. - base::WaitableEvent waitable_event; - DCHECK( - !tracker->update_occlusion_task_runner_->RunsTasksInCurrentSequence()); - tracker->update_occlusion_task_runner_->PostTask( - FROM_HERE, base::BindLambdaForTesting([tracker, &waitable_event]() { - if (tracker->occlusion_calculator_) { - tracker->occlusion_calculator_->root_window_hwnds_occlusion_state_ - .clear(); - tracker->occlusion_calculator_->UnregisterEventHooks(); - tracker->occlusion_calculator_.reset(); - } - waitable_event.Signal(); - })); - waitable_event.Wait(); - delete tracker; - *global_ptr = nullptr; - } -} -#endif // defined(OS_WIN) - } // namespace test } // namespace aura
diff --git a/ui/aura/test/aura_test_helper.h b/ui/aura/test/aura_test_helper.h index d5cb0983..8d636b5 100644 --- a/ui/aura/test/aura_test_helper.h +++ b/ui/aura/test/aura_test_helper.h
@@ -70,11 +70,6 @@ Env* GetEnv(); private: -#if defined(OS_WIN) - // Deletes existing NativeWindowOcclusionTrackerWin instance. - void DeleteNativeWindowOcclusionTrackerWin(); -#endif // defined(OS_WIN) - bool setup_called_ = false; bool teardown_called_ = false; ui::ContextFactory* context_factory_to_restore_ = nullptr;
diff --git a/ui/events/BUILD.gn b/ui/events/BUILD.gn index 390c198..9ac9d51 100644 --- a/ui/events/BUILD.gn +++ b/ui/events/BUILD.gn
@@ -50,9 +50,9 @@ ] sources = [ + "keycodes/dom/dom_code_data.inc", "keycodes/dom/dom_key_data.inc", "keycodes/dom/keycode_converter.cc", - "keycodes/dom/keycode_converter_data.inc", ] deps = [
diff --git a/ui/events/keycodes/dom/dom_code.h b/ui/events/keycodes/dom/dom_code.h index 8da553c..138be7a 100644 --- a/ui/events/keycodes/dom/dom_code.h +++ b/ui/events/keycodes/dom/dom_code.h
@@ -9,7 +9,7 @@ #define USB_KEYMAP(usb, evdev, xkb, win, mac, code, id) id = usb #define USB_KEYMAP_DECLARATION enum class DomCode -#include "ui/events/keycodes/dom/keycode_converter_data.inc" +#include "ui/events/keycodes/dom/dom_code_data.inc" #undef USB_KEYMAP #undef USB_KEYMAP_DECLARATION
diff --git a/ui/events/keycodes/dom/keycode_converter_data.inc b/ui/events/keycodes/dom/dom_code_data.inc similarity index 100% rename from ui/events/keycodes/dom/keycode_converter_data.inc rename to ui/events/keycodes/dom/dom_code_data.inc
diff --git a/ui/events/keycodes/dom/dom_codes.h b/ui/events/keycodes/dom/dom_codes.h index 2728dc95..481ac5d7 100644 --- a/ui/events/keycodes/dom/dom_codes.h +++ b/ui/events/keycodes/dom/dom_codes.h
@@ -12,7 +12,7 @@ #define DOM_CODE_TYPE(x) static_cast<DomCode>(x) #define USB_KEYMAP(usb, evdev, xkb, win, mac, code, id) DOM_CODE_TYPE(usb) #define USB_KEYMAP_DECLARATION constexpr DomCode dom_codes[] = -#include "ui/events/keycodes/dom/keycode_converter_data.inc" +#include "ui/events/keycodes/dom/dom_code_data.inc" #undef DOM_CODE_TYPE #undef USB_KEYMAP #undef USB_KEYMAP_DECLARATION
diff --git a/ui/events/keycodes/dom/keycode_converter.cc b/ui/events/keycodes/dom/keycode_converter.cc index df479d0..1eeb38e 100644 --- a/ui/events/keycodes/dom/keycode_converter.cc +++ b/ui/events/keycodes/dom/keycode_converter.cc
@@ -29,7 +29,7 @@ #define USB_KEYMAP(usb, evdev, xkb, win, mac, code, id) {usb, 0, code} #endif #define USB_KEYMAP_DECLARATION const KeycodeMapEntry usb_keycode_map[] = -#include "ui/events/keycodes/dom/keycode_converter_data.inc" +#include "ui/events/keycodes/dom/dom_code_data.inc" #undef USB_KEYMAP #undef USB_KEYMAP_DECLARATION
diff --git a/ui/events/keycodes/dom/keycode_converter_unittest.cc b/ui/events/keycodes/dom/keycode_converter_unittest.cc index 7a266ecf..22e44ac 100644 --- a/ui/events/keycodes/dom/keycode_converter_unittest.cc +++ b/ui/events/keycodes/dom/keycode_converter_unittest.cc
@@ -21,7 +21,7 @@ namespace { // Number of native codes expected to be mapped for each kind of native code. -// These are in the same order as the columns in keycode_converter_data.inc +// These are in the same order as the columns in dom_code_data.inc // as reflected in the USB_KEYMAP() macro below. const size_t expected_mapped_key_count[] = { 212, // evdev @@ -43,7 +43,7 @@ { usb, code, #id, { evdev, xkb, win, mac } } #define USB_KEYMAP_DECLARATION \ const KeycodeConverterData kKeycodeConverterData[] = -#include "ui/events/keycodes/dom/keycode_converter_data.inc" +#include "ui/events/keycodes/dom/dom_code_data.inc" #undef USB_KEYMAP #undef USB_KEYMAP_DECLARATION
diff --git a/ui/events/win/events_win_utils.cc b/ui/events/win/events_win_utils.cc index fba2f13..81618d7 100644 --- a/ui/events/win/events_win_utils.cc +++ b/ui/events/win/events_win_utils.cc
@@ -399,7 +399,7 @@ // Conversion scan_code and LParam each other. // uint16_t scan_code: -// ui/events/keycodes/dom/keycode_converter_data.inc +// ui/events/keycodes/dom/dom_code_data.inc // 0 - 15bits: represetns the scan code. // 28 - 30 bits (0xE000): represents whether this is an extended key or not. //
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java index 4c61eca6..b2b673f 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java
@@ -26,13 +26,16 @@ import org.chromium.weblayer.NavigationCallback; import org.chromium.weblayer.NavigationController; import org.chromium.weblayer.NavigationState; +import org.chromium.weblayer.Tab; import org.chromium.weblayer.shell.InstrumentationActivity; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicReference; /** * Example test that just starts the weblayer shell. @@ -47,6 +50,7 @@ private static final String URL1 = "data:text,foo"; private static final String URL2 = "data:text,bar"; private static final String URL3 = "data:text,baz"; + private static final String URL4 = "data:text,bat"; private static class Callback extends NavigationCallback { public static class NavigationCallbackHelper extends CallbackHelper { @@ -275,6 +279,23 @@ @Test @SmallTest + public void testGoToIndex() throws Exception { + InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl(URL1); + setNavigationCallback(activity); + + mActivityTestRule.navigateAndWait(URL2); + mActivityTestRule.navigateAndWait(URL3); + mActivityTestRule.navigateAndWait(URL4); + + // Navigate back to the 2nd url. + assertEquals(URL2, goToIndexAndReturnUrl(activity.getTab(), 1)); + + // Navigate forwards to the 4th url. + assertEquals(URL4, goToIndexAndReturnUrl(activity.getTab(), 3)); + } + + @Test + @SmallTest public void testSameDocument() throws Exception { InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl(URL1); setNavigationCallback(activity); @@ -396,4 +417,31 @@ runOnUiThreadBlocking(navigateRunnable); mCallback.onCompletedCallback.assertCalledWith(currentCallCount, expectedUrl); } + + private String goToIndexAndReturnUrl(Tab tab, int index) throws Exception { + NavigationController navigationController = + runOnUiThreadBlocking(() -> tab.getNavigationController()); + + final CountDownLatch navigationComplete = new CountDownLatch(1); + final AtomicReference<String> navigationUrl = new AtomicReference<String>(); + NavigationCallback navigationCallback = new NavigationCallback() { + @Override + public void onNavigationCompleted(Navigation navigation) { + navigationComplete.countDown(); + navigationUrl.set(navigation.getUri().toString()); + } + }; + + runOnUiThreadBlocking(() -> { + navigationController.registerNavigationCallback(navigationCallback); + navigationController.goToIndex(index); + }); + + navigationComplete.await(); + + runOnUiThreadBlocking( + () -> { navigationController.unregisterNavigationCallback(navigationCallback); }); + + return navigationUrl.get(); + } }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java index 6fadce47..f1184178 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java
@@ -109,6 +109,10 @@ } public Context getContext() { + if (mWindowAndroid == null) { + return null; + } + return mWindowAndroid.getContext().get(); }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/NavigationControllerImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/NavigationControllerImpl.java index 9362f44..bd085b8 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/NavigationControllerImpl.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/NavigationControllerImpl.java
@@ -67,6 +67,13 @@ } @Override + public void goToIndex(int index) { + StrictModeWorkaround.apply(); + NavigationControllerImplJni.get().goToIndex( + mNativeNavigationController, NavigationControllerImpl.this, index); + } + + @Override public void reload() { StrictModeWorkaround.apply(); NavigationControllerImplJni.get().reload( @@ -158,6 +165,8 @@ void goForward(long nativeNavigationControllerImpl, NavigationControllerImpl caller); boolean canGoBack(long nativeNavigationControllerImpl, NavigationControllerImpl caller); boolean canGoForward(long nativeNavigationControllerImpl, NavigationControllerImpl caller); + void goToIndex( + long nativeNavigationControllerImpl, NavigationControllerImpl caller, int index); void reload(long nativeNavigationControllerImpl, NavigationControllerImpl caller); void stop(long nativeNavigationControllerImpl, NavigationControllerImpl caller); int getNavigationListSize(
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/INavigationController.aidl b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/INavigationController.aidl index 08467c4..b087977 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/INavigationController.aidl +++ b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/INavigationController.aidl
@@ -24,4 +24,6 @@ boolean canGoBack() = 8; boolean canGoForward() = 9; + + void goToIndex(in int index) = 10; }
diff --git a/weblayer/browser/navigation_controller_impl.cc b/weblayer/browser/navigation_controller_impl.cc index 6321e06a65..2aaa1272 100644 --- a/weblayer/browser/navigation_controller_impl.cc +++ b/weblayer/browser/navigation_controller_impl.cc
@@ -36,6 +36,13 @@ java_controller_.Reset(env, java_controller); } +void NavigationControllerImpl::GoToIndex( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + int index) { + return GoToIndex(index); +} + void NavigationControllerImpl::Navigate( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, @@ -88,6 +95,10 @@ return web_contents()->GetController().CanGoForward(); } +void NavigationControllerImpl::GoToIndex(int index) { + web_contents()->GetController().GoToIndex(index); +} + void NavigationControllerImpl::Reload() { web_contents()->GetController().Reload(content::ReloadType::NORMAL, false); }
diff --git a/weblayer/browser/navigation_controller_impl.h b/weblayer/browser/navigation_controller_impl.h index 5b4e21f..9e37a7fd 100644 --- a/weblayer/browser/navigation_controller_impl.h +++ b/weblayer/browser/navigation_controller_impl.h
@@ -47,6 +47,9 @@ const base::android::JavaParamRef<jobject>& obj) { return CanGoForward(); } + void GoToIndex(JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + int index); void Reload(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj) { Reload(); } @@ -77,6 +80,7 @@ void GoForward() override; bool CanGoBack() override; bool CanGoForward() override; + void GoToIndex(int index) override; void Reload() override; void Stop() override; int GetNavigationListSize() override;
diff --git a/weblayer/public/java/org/chromium/weblayer/NavigationController.java b/weblayer/public/java/org/chromium/weblayer/NavigationController.java index 7111b3d8..3c59c8d 100644 --- a/weblayer/public/java/org/chromium/weblayer/NavigationController.java +++ b/weblayer/public/java/org/chromium/weblayer/NavigationController.java
@@ -84,6 +84,15 @@ } } + public void goToIndex(int index) { + ThreadCheck.ensureOnUiThread(); + try { + mNavigationController.goToIndex(index); + } catch (RemoteException e) { + throw new APICallException(e); + } + } + public void reload() { ThreadCheck.ensureOnUiThread(); try {
diff --git a/weblayer/public/navigation_controller.h b/weblayer/public/navigation_controller.h index 25b7c111..6ea9c11 100644 --- a/weblayer/public/navigation_controller.h +++ b/weblayer/public/navigation_controller.h
@@ -30,6 +30,9 @@ virtual bool CanGoForward() = 0; + // Navigates to the specified absolute index. + virtual void GoToIndex(int index) = 0; + virtual void Reload() = 0; virtual void Stop() = 0;