diff --git a/DEPS b/DEPS index 10764301..adcac60 100644 --- a/DEPS +++ b/DEPS
@@ -167,11 +167,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': '54548626a977a72804242af934d01f94d8c02225', + 'skia_revision': 'e27a503a0a21af167e6a19d2e5c7b7e1039964bf', # 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': '50e5ba2dd3e763aa78740945c04555d859a6e502', + 'v8_revision': '0aff71c3ecaa48d359801e7f8864793f04aeee04', # 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. @@ -179,7 +179,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '8e7d9d6c2326a36ff57335ceeb41eb86cb639a7f', + 'angle_revision': 'ef4c25e71c32487feade5e9f8e79cb569545b846', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -218,7 +218,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': '5a1a79c0e8de8e886cc347ad22801982e8298a06', + 'freetype_revision': '1e9229f0fcb46fd4cd8e0fdc48fb4a44ddb7a8a1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling HarfBuzz # and whatever else without interference from each other. @@ -230,7 +230,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': '70a8316d8b67cc343c7b19aa9399fe17b53deba1', + 'catapult_revision': 'e74b5c944eda8877ae8d1058b427f61694b57f21', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -294,15 +294,15 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'spirv_cross_revision': 'ffca8735ff42a9e7a3d1dbb984cf3bf2ca724ebc', + 'spirv_cross_revision': 'e5d3a6655e13870a6f38f40bd88cc662b14e3cdf', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'shaderc_revision': '614d79248ef2dea617085475f8d64148b37d7296', + 'shaderc_revision': '621605ce2644d55ab74cb27a8afef97dc40f1b0f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': 'c932f3309322b833cf13556a408fab75fa51c77d', + 'dawn_revision': 'e09869ed526818cb01b4bdbe728ffe638ab5f861', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -1470,7 +1470,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '7c4e67ff117d6c640e6dd17989afe2fb7da7eecb', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'e1092c0bc8b8a2865da7ce6284ec19d189f71e02', + Var('webrtc_git') + '/src.git' + '@' + '955f8fd0477ea2d4137eff032184e02de8508043', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d', @@ -1532,7 +1532,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@9608b4a1db16fa2e05497bc934fbf8d36c1b3d54', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b91063d99c88b47f7c603daa423f2a49910445bd', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc b/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc index 04f4f66..a157f13 100644 --- a/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc +++ b/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc
@@ -669,17 +669,17 @@ target_client_->OnComplete(status); if (proxied_loader_binding_ && wait_for_loader_error) { + // Since the original client is gone no need to continue loading the + // request. + proxied_client_binding_.Close(); + target_loader_.reset(); + // Don't delete |this| yet, in case the |proxied_loader_binding_|'s // error_handler is called with a reason to indicate an error which we want // to send to the client bridge. Also reset |target_client_| so we don't // get its error_handler called and then delete |this|. target_client_.reset(); - // Since the original client is gone no need to continue loading the - // request. - proxied_client_binding_.Close(); - target_loader_.reset(); - // In case there are pending checks as to whether this request should be // intercepted, we don't want that causing |target_client_| to be used // later.
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc index cd9825a..e334965 100644 --- a/ash/app_list/app_list_presenter_delegate_unittest.cc +++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -2074,20 +2074,20 @@ gfx::Point(peeking_top.x(), (peeking_top.y() + fullscreen_y) / 2)); GetAppListTestHelper()->WaitUntilIdle(); - EXPECT_LE(std::abs(GetAppListView()->GetAppListTransitionProgress( - AppListView::kProgressFlagNone) - - 1.5f), - 0.01f); - gfx::Rect search_box_bounds = GetAppListView()->search_box_view()->GetBoundsInScreen(); search_box_bounds.Inset(GetAppListView()->search_box_view()->GetInsets()); + float progress = GetAppListView()->GetAppListTransitionProgress( + AppListView::kProgressFlagNone); + EXPECT_LE(std::abs(progress - 1.5f), 0.01f); + EXPECT_EQ((peeking_top.y() + fullscreen_y) / 2 + - (config.search_box_peeking_top_padding() + - fullscreen_search_box_padding) / - 2, + gfx::Tween::IntValueBetween( + progress - 1, config.search_box_peeking_top_padding(), + fullscreen_search_box_padding), search_box_bounds.y()); + EXPECT_EQ(ExpectedAppsGridTop(config, 900, search_box_bounds), apps_grid_view()->GetBoundsInScreen().y()); EXPECT_TRUE(apps_grid_view()->GetVisible()); @@ -2118,18 +2118,17 @@ gfx::Point(peeking_top.x(), (peeking_top.y() + closed_y) / 2)); GetAppListTestHelper()->WaitUntilIdle(); - EXPECT_LE(std::abs(GetAppListView()->GetAppListTransitionProgress( - AppListView::kProgressFlagNone) - - 0.5f), - 0.01f); - search_box_bounds = GetAppListView()->search_box_view()->GetBoundsInScreen(); search_box_bounds.Inset(GetAppListView()->search_box_view()->GetInsets()); + progress = GetAppListView()->GetAppListTransitionProgress( + AppListView::kProgressFlagNone); + EXPECT_LE(std::abs(progress - 0.5f), 0.01f); + EXPECT_EQ((peeking_top.y() + closed_y) / 2 + - (config.search_box_peeking_top_padding() + - config.search_box_closed_top_padding()) / - 2, + gfx::Tween::IntValueBetween( + progress, config.search_box_peeking_top_padding(), + config.search_box_closed_top_padding()), search_box_bounds.y()); EXPECT_EQ(ExpectedAppsGridTop(config, 900, search_box_bounds), apps_grid_view()->GetBoundsInScreen().y()); @@ -2186,19 +2185,18 @@ gfx::Point(half_top.x(), (half_top.y() + fullscreen_y) / 2)); GetAppListTestHelper()->WaitUntilIdle(); - EXPECT_LE(std::abs(GetAppListView()->GetAppListTransitionProgress( - AppListView::kProgressFlagSearchResults) - - 1.5f), - 0.01f); - gfx::Rect search_box_bounds = GetAppListView()->search_box_view()->GetBoundsInScreen(); search_box_bounds.Inset(GetAppListView()->search_box_view()->GetInsets()); + float progress = GetAppListView()->GetAppListTransitionProgress( + AppListView::kProgressFlagSearchResults); + EXPECT_LE(std::abs(progress - 1.5f), 0.01f); + EXPECT_EQ((half_top.y() + fullscreen_y) / 2 + - (config.search_box_fullscreen_top_padding() + - fullscreen_search_box_padding) / - 2, + gfx::Tween::IntValueBetween( + progress - 1, config.search_box_fullscreen_top_padding(), + fullscreen_search_box_padding), search_box_bounds.y()); EXPECT_EQ(search_box_bounds.y(), search_result_page()->GetBoundsInScreen().y()); @@ -2243,18 +2241,18 @@ // should be half distance between closed and peeking padding. generator->MoveTouch(gfx::Point(half_top.x(), (half_top.y() + closed_y) / 2)); GetAppListTestHelper()->WaitUntilIdle(); - EXPECT_LE(std::abs(GetAppListView()->GetAppListTransitionProgress( - AppListView::kProgressFlagSearchResults) - - 0.5f), - 0.01f); + + progress = GetAppListView()->GetAppListTransitionProgress( + AppListView::kProgressFlagSearchResults); + EXPECT_LE(std::abs(progress - 0.5f), 0.01f); search_box_bounds = GetAppListView()->search_box_view()->GetBoundsInScreen(); search_box_bounds.Inset(GetAppListView()->search_box_view()->GetInsets()); EXPECT_EQ((half_top.y() + closed_y) / 2 + - (config.search_box_fullscreen_top_padding() + - config.search_box_closed_top_padding()) / - 2, + gfx::Tween::IntValueBetween( + progress, config.search_box_fullscreen_top_padding(), + config.search_box_closed_top_padding()), search_box_bounds.y()); EXPECT_EQ(search_box_bounds.y(), search_result_page()->GetBoundsInScreen().y()); @@ -2332,10 +2330,13 @@ GetAppListView()->search_box_view()->GetBoundsInScreen(); search_box_bounds.Inset(GetAppListView()->search_box_view()->GetInsets()); + float progress = GetAppListView()->GetAppListTransitionProgress( + AppListView::kProgressFlagSearchResults); + EXPECT_LE(std::abs(progress - 1.5f), 0.01f); EXPECT_EQ((half_top.y() + fullscreen_y) / 2 + - (config.search_box_fullscreen_top_padding() + - fullscreen_search_box_padding) / - 2, + gfx::Tween::IntValueBetween( + progress - 1, config.search_box_fullscreen_top_padding(), + fullscreen_search_box_padding), search_box_bounds.y()); EXPECT_EQ(search_box_bounds.y(), search_result_page()->GetBoundsInScreen().y()); @@ -2392,10 +2393,13 @@ search_box_bounds = GetAppListView()->search_box_view()->GetBoundsInScreen(); search_box_bounds.Inset(GetAppListView()->search_box_view()->GetInsets()); + progress = GetAppListView()->GetAppListTransitionProgress( + AppListView::kProgressFlagSearchResults); + EXPECT_LE(std::abs(progress - 1.5f), 0.01f); EXPECT_EQ((half_top.y() + fullscreen_y) / 2 + - (config.search_box_fullscreen_top_padding() + - fullscreen_search_box_padding) / - 2, + gfx::Tween::IntValueBetween( + progress - 1, config.search_box_fullscreen_top_padding(), + fullscreen_search_box_padding), search_box_bounds.y()); EXPECT_EQ(search_box_bounds.y(), search_result_page()->GetBoundsInScreen().y());
diff --git a/ash/system/audio/unified_volume_view.cc b/ash/system/audio/unified_volume_view.cc index f0877d1b..e75d6706 100644 --- a/ash/system/audio/unified_volume_view.cc +++ b/ash/system/audio/unified_volume_view.cc
@@ -22,9 +22,9 @@ #include "ui/views/animation/ink_drop_highlight.h" #include "ui/views/animation/ink_drop_impl.h" #include "ui/views/animation/ink_drop_mask.h" +#include "ui/views/controls/highlight_path_generator.h" #include "ui/views/controls/image_view.h" #include "ui/views/layout/box_layout.h" -#include "ui/views/view_class_properties.h" using chromeos::CrasAudioHandler; @@ -88,10 +88,7 @@ SetTooltipText(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_AUDIO)); TrayPopupUtils::ConfigureTrayPopupButton(this); - auto path = std::make_unique<SkPath>(); - path->addRoundRect(gfx::RectToSkRect(gfx::Rect(CalculatePreferredSize())), - kTrayItemSize / 2, kTrayItemSize / 2); - SetProperty(views::kHighlightPathKey, path.release()); + views::InstallPillHighlightPathGenerator(this); } ~MoreButton() override = default; @@ -126,11 +123,6 @@ UnifiedSystemTrayView::GetBackgroundColor()); } - std::unique_ptr<views::InkDropMask> CreateInkDropMask() const override { - return std::make_unique<views::RoundRectInkDropMask>(size(), gfx::Insets(), - kTrayItemSize / 2); - } - const char* GetClassName() const override { return "MoreButton"; } private:
diff --git a/ash/system/unified/rounded_label_button.cc b/ash/system/unified/rounded_label_button.cc index bec4b62c..46b7d7b 100644 --- a/ash/system/unified/rounded_label_button.cc +++ b/ash/system/unified/rounded_label_button.cc
@@ -14,7 +14,7 @@ #include "ui/views/animation/ink_drop_mask.h" #include "ui/views/animation/ink_drop_ripple.h" #include "ui/views/border.h" -#include "ui/views/view_class_properties.h" +#include "ui/views/controls/highlight_path_generator.h" namespace ash { @@ -30,11 +30,7 @@ label()->SetFontList(views::Label::GetDefaultFontList().Derive( 1, gfx::Font::NORMAL, gfx::Font::Weight::MEDIUM)); TrayPopupUtils::ConfigureTrayPopupButton(this); - - auto path = std::make_unique<SkPath>(); - path->addRoundRect(gfx::RectToSkRect(gfx::Rect(CalculatePreferredSize())), - kTrayItemSize / 2, kTrayItemSize / 2); - SetProperty(views::kHighlightPathKey, path.release()); + views::InstallPillHighlightPathGenerator(this); } RoundedLabelButton::~RoundedLabelButton() = default;
diff --git a/ash/system/unified/top_shortcuts_view.cc b/ash/system/unified/top_shortcuts_view.cc index 7ef376b..87e7eb1 100644 --- a/ash/system/unified/top_shortcuts_view.cc +++ b/ash/system/unified/top_shortcuts_view.cc
@@ -23,6 +23,7 @@ #include "ash/system/unified/user_chooser_view.h" #include "base/numerics/ranges.h" #include "ui/gfx/paint_vector_icon.h" +#include "ui/views/controls/highlight_path_generator.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" #include "ui/views/view_class_properties.h" @@ -50,12 +51,7 @@ SetInstallFocusRingOnFocus(true); SetFocusForPlatform(); - int focus_ring_radius = - kTrayItemSize + kUnifiedCircularButtonFocusPadding.width(); - auto path = std::make_unique<SkPath>(); - path->addOval(gfx::RectToSkRect( - gfx::Rect(gfx::Size(focus_ring_radius, focus_ring_radius)))); - SetProperty(views::kHighlightPathKey, path.release()); + views::InstallCircleHighlightPathGenerator(this); } } // namespace
diff --git a/ash/wallpaper/wallpaper_view.cc b/ash/wallpaper/wallpaper_view.cc index d9e7fa53..b90568ef 100644 --- a/ash/wallpaper/wallpaper_view.cc +++ b/ash/wallpaper/wallpaper_view.cc
@@ -10,6 +10,7 @@ #include "ash/shell.h" #include "ash/wallpaper/wallpaper_controller_impl.h" #include "ash/wallpaper/wallpaper_widget_controller.h" +#include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "cc/paint/render_surface_filters.h" #include "ui/aura/window.h" #include "ui/display/display.h" @@ -133,8 +134,14 @@ // Create the blur and brightness filter to apply to the downsampled image. cc::PaintFlags filter_flags; cc::FilterOperations operations; - operations.Append( - cc::FilterOperation::CreateBrightnessFilter(repaint_opacity_)); + // In tablet mode, the wallpaper already has a color filter applied in + // |OnPaint| so we don't need to darken here. + // TODO(crbug.com/944152): Merge this with the color filter in + // WallpaperBaseView. + if (!Shell::Get()->tablet_mode_controller()->InTabletMode()) { + operations.Append( + cc::FilterOperation::CreateBrightnessFilter(repaint_opacity_)); + } operations.Append(cc::FilterOperation::CreateBlurFilter( blur, SkBlurImageFilter::kClamp_TileMode)); sk_sp<cc::PaintFilter> filter = cc::RenderSurfaceFilters::BuildImageFilter(
diff --git a/base/BUILD.gn b/base/BUILD.gn index ac9ad8f..3c925480 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -2702,6 +2702,7 @@ "task/common/operations_controller_unittest.cc", "task/common/task_annotator_unittest.cc", "task/lazy_task_runner_unittest.cc", + "task/post_job_unittest.cc", "task/post_task_unittest.cc", "task/promise/abstract_promise_unittest.cc", "task/promise/dependent_list_unittest.cc",
diff --git a/base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java b/base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java index 1af91c6..06b62375 100644 --- a/base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java +++ b/base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java
@@ -4,6 +4,7 @@ package org.chromium.base.task; +import android.os.Handler; import android.view.Choreographer; import org.chromium.base.ThreadUtils; @@ -20,22 +21,26 @@ @Override public TaskRunner createTaskRunner(TaskTraits taskTraits) { if (taskTraits.mIsChoreographerFrame) return createChoreographerTaskRunner(); + if (taskTraits.mUseCurrentThread) return postCurrentThreadTask(taskTraits); return new TaskRunnerImpl(taskTraits); } @Override public SequencedTaskRunner createSequencedTaskRunner(TaskTraits taskTraits) { if (taskTraits.mIsChoreographerFrame) return createChoreographerTaskRunner(); + if (taskTraits.mUseCurrentThread) return postCurrentThreadTask(taskTraits); return new SequencedTaskRunnerImpl(taskTraits); } /** - * This maps to a single thread within the native thread pool. Due to that contract we - * can't run tasks posted on it until native has started. + * If CurrentThread is not specified, or we are being called from within a threadpool task + * this maps to a single thread within the native thread pool. If so we can't run tasks + * posted on it until native has started. */ @Override public SingleThreadTaskRunner createSingleThreadTaskRunner(TaskTraits taskTraits) { if (taskTraits.mIsChoreographerFrame) return createChoreographerTaskRunner(); + if (taskTraits.mUseCurrentThread) return postCurrentThreadTask(taskTraits); // Tasks posted via this API will not execute until after native has started. return new SingleThreadTaskRunnerImpl(null, taskTraits); } @@ -64,6 +69,16 @@ return false; } + private SingleThreadTaskRunner postCurrentThreadTask(TaskTraits taskTraits) { + // Until native has loaded we only support CurrentThread on the UI thread, migration from + // threadpool or other java threads adds a lot of complexity for likely zero usage. + assert PostTask.getNativeSchedulerReady() || ThreadUtils.runningOnUiThread(); + // A handler is only needed before the native scheduler is ready. + Handler preNativeHandler = + PostTask.getNativeSchedulerReady() ? null : ThreadUtils.getUiThreadHandler(); + return new SingleThreadTaskRunnerImpl(preNativeHandler, taskTraits); + } + private synchronized ChoreographerTaskRunner createChoreographerTaskRunner() { // TODO(alexclarke): Migrate to the new Android UI thread trait when available. return ThreadUtils.runOnUiThreadBlockingNoException(
diff --git a/base/android/java/src/org/chromium/base/task/PostTask.java b/base/android/java/src/org/chromium/base/task/PostTask.java index 648eb05..f9a71e7 100644 --- a/base/android/java/src/org/chromium/base/task/PostTask.java +++ b/base/android/java/src/org/chromium/base/task/PostTask.java
@@ -28,6 +28,7 @@ private static final Executor sPrenativeThreadPoolExecutor = new ChromeThreadPoolExecutor(); private static Executor sPrenativeThreadPoolExecutorOverride; private static final TaskExecutor sTaskExecutors[] = getInitialTaskExecutors(); + private static boolean sNativeSchedulerReady; private static TaskExecutor[] getInitialTaskExecutors() { TaskExecutor taskExecutors[] = new TaskExecutor[TaskTraits.MAX_EXTENSION_ID + 1]; @@ -88,7 +89,8 @@ } else { PostTaskJni.get().postDelayedTask(taskTraits.mPrioritySetExplicitly, taskTraits.mPriority, taskTraits.mMayBlock, taskTraits.mUseThreadPool, - taskTraits.mExtensionId, taskTraits.mExtensionData, task, delay); + taskTraits.mUseCurrentThread, taskTraits.mExtensionId, + taskTraits.mExtensionData, task, delay); } } } @@ -210,8 +212,9 @@ */ static Executor getPrenativeThreadPoolExecutor() { synchronized (sLock) { - if (sPrenativeThreadPoolExecutorOverride != null) + if (sPrenativeThreadPoolExecutorOverride != null) { return sPrenativeThreadPoolExecutorOverride; + } return sPrenativeThreadPoolExecutor; } } @@ -237,11 +240,21 @@ return sTaskExecutors[traits.mExtensionId]; } + /** + * @return True if the native scheduler is ready. + */ + static boolean getNativeSchedulerReady() { + synchronized (sLock) { + return sNativeSchedulerReady; + } + } + @CalledByNative private static void onNativeSchedulerReady() { synchronized (sLock) { Set<TaskRunner> preNativeTaskRunners = sPreNativeTaskRunners; sPreNativeTaskRunners = null; + sNativeSchedulerReady = true; for (TaskRunner taskRunner : preNativeTaskRunners) { taskRunner.initNativeTaskRunner(); } @@ -254,13 +267,14 @@ synchronized (sLock) { sPreNativeTaskRunners = Collections.newSetFromMap(new WeakHashMap<TaskRunner, Boolean>()); + sNativeSchedulerReady = false; } } @NativeMethods interface Natives { void postDelayedTask(boolean prioritySetExplicitly, int priority, boolean mayBlock, - boolean useThreadPool, byte extensionId, byte[] extensionData, Runnable task, - long delay); + boolean useThreadPool, boolean useCurrentThread, byte extensionId, + byte[] extensionData, Runnable task, long delay); } }
diff --git a/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java b/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java index 5a5e1f3..f77354f 100644 --- a/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java +++ b/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java
@@ -74,8 +74,9 @@ @GuardedBy("mLock") protected void destroyInternal() { - if (mNativeTaskRunnerAndroid != 0) + if (mNativeTaskRunnerAndroid != 0) { TaskRunnerImplJni.get().destroy(mNativeTaskRunnerAndroid); + } mNativeTaskRunnerAndroid = 0; } @@ -163,7 +164,8 @@ if (mNativeTaskRunnerAndroid == 0) { mNativeTaskRunnerAndroid = TaskRunnerImplJni.get().init(mTaskRunnerType, mTaskTraits.mPrioritySetExplicitly, mTaskTraits.mPriority, - mTaskTraits.mMayBlock, mTaskTraits.mUseThreadPool, mTaskTraits.mExtensionId, + mTaskTraits.mMayBlock, mTaskTraits.mUseThreadPool, + mTaskTraits.mUseCurrentThread, mTaskTraits.mExtensionId, mTaskTraits.mExtensionData); } } @@ -191,7 +193,8 @@ interface Natives { // NB due to Proguard obfuscation it's easiest to pass the traits via arguments. long init(@TaskRunnerType int taskRunnerType, boolean prioritySetExplicitly, int priority, - boolean mayBlock, boolean useThreadPool, byte extensionId, byte[] extensionData); + boolean mayBlock, boolean useThreadPool, boolean useCurrentThread, byte extensionId, + byte[] extensionData); void destroy(long nativeTaskRunnerAndroid); void postDelayedTask(long nativeTaskRunnerAndroid, Runnable task, long delay);
diff --git a/base/android/java/src/org/chromium/base/task/TaskTraits.java b/base/android/java/src/org/chromium/base/task/TaskTraits.java index ebc98d0..af1203c 100644 --- a/base/android/java/src/org/chromium/base/task/TaskTraits.java +++ b/base/android/java/src/org/chromium/base/task/TaskTraits.java
@@ -66,9 +66,8 @@ // For tasks that should run on the thread pool instead of the main thread. // Note that currently also tasks which lack this trait will execute on the // thread pool unless a trait for a named thread is given. - // TODO(skyostil@): Make it required to state the thread affinity for all - // tasks. - public static final TaskTraits THREAD_POOL = new TaskTraits().threadPool(); + public static final TaskTraits THREAD_POOL = + new TaskTraits().threadPool().taskPriority(TaskPriority.USER_BLOCKING); public static final TaskTraits THREAD_POOL_USER_BLOCKING = THREAD_POOL.taskPriority(TaskPriority.USER_BLOCKING); public static final TaskTraits THREAD_POOL_USER_VISIBLE = @@ -76,12 +75,23 @@ public static final TaskTraits THREAD_POOL_BEST_EFFORT = THREAD_POOL.taskPriority(TaskPriority.BEST_EFFORT); + // For tasks that should run on the current thread. + public static final TaskTraits CURRENT_THREAD = + new TaskTraits().currentThread().taskPriority(TaskPriority.USER_BLOCKING); + public static final TaskTraits CURRENT_THREAD_USER_BLOCKING = + CURRENT_THREAD.taskPriority(TaskPriority.USER_BLOCKING); + public static final TaskTraits CURRENT_THREAD_USER_VISIBLE = + CURRENT_THREAD.taskPriority(TaskPriority.USER_VISIBLE); + public static final TaskTraits CURRENT_THREAD_BEST_EFFORT = + CURRENT_THREAD.taskPriority(TaskPriority.BEST_EFFORT); + // For convenience of the JNI code, we use primitive types only. // Note shutdown behavior is not supported on android. boolean mPrioritySetExplicitly; int mPriority; boolean mMayBlock; boolean mUseThreadPool; + boolean mUseCurrentThread; byte mExtensionId; byte mExtensionData[]; boolean mIsChoreographerFrame; @@ -97,6 +107,7 @@ mMayBlock = other.mMayBlock; mUseThreadPool = other.mUseThreadPool; mExtensionId = other.mExtensionId; + mUseCurrentThread = other.mUseCurrentThread; mExtensionData = other.mExtensionData; } @@ -126,6 +137,12 @@ return taskTraits; } + public TaskTraits currentThread() { + TaskTraits taskTraits = new TaskTraits(this); + taskTraits.mUseCurrentThread = true; + return taskTraits; + } + /** * @return true if this task is using some TaskTraits extension. */ @@ -166,8 +183,12 @@ } else if (object instanceof TaskTraits) { TaskTraits other = (TaskTraits) object; return mPrioritySetExplicitly == other.mPrioritySetExplicitly - && mPriority == other.mPriority && mExtensionId == other.mExtensionId - && Arrays.equals(mExtensionData, other.mExtensionData); + && mPriority == other.mPriority && mMayBlock == other.mMayBlock + && mUseThreadPool == other.mUseThreadPool + && mUseCurrentThread == other.mUseCurrentThread + && mExtensionId == other.mExtensionId + && Arrays.equals(mExtensionData, other.mExtensionData) + && mIsChoreographerFrame == other.mIsChoreographerFrame; } else { return false; } @@ -180,6 +201,7 @@ hash = 37 * hash + mPriority; hash = 37 * hash + (mMayBlock ? 0 : 1); hash = 37 * hash + (mUseThreadPool ? 0 : 1); + hash = 37 * hash + (mUseCurrentThread ? 0 : 1); hash = 37 * hash + (int) mExtensionId; hash = 37 * hash + Arrays.hashCode(mExtensionData); hash = 37 * hash + (mIsChoreographerFrame ? 0 : 1);
diff --git a/base/android/task_scheduler/post_task_android.cc b/base/android/task_scheduler/post_task_android.cc index 78f1cf7..743dd01 100644 --- a/base/android/task_scheduler/post_task_android.cc +++ b/base/android/task_scheduler/post_task_android.cc
@@ -49,11 +49,12 @@ jint priority, jboolean may_block, jboolean use_thread_pool, + jboolean current_thread, jbyte extension_id, const base::android::JavaParamRef<jbyteArray>& extension_data) { return TaskTraits(priority_set_explicitly, static_cast<TaskPriority>(priority), may_block, - use_thread_pool, + use_thread_pool, current_thread, TaskTraitsExtensionStorage( extension_id, GetExtensionData(env, extension_data))); } @@ -64,19 +65,21 @@ jint priority, jboolean may_block, jboolean use_thread_pool, + jboolean current_thread, jbyte extension_id, const base::android::JavaParamRef<jbyteArray>& extension_data, const base::android::JavaParamRef<jobject>& task, jlong delay) { // This could be run on any java thread, so we can't cache |env| in the // BindOnce because JNIEnv is thread specific. - PostDelayedTask(FROM_HERE, - PostTaskAndroid::CreateTaskTraits( - env, priority_set_explicitly, priority, may_block, - use_thread_pool, extension_id, extension_data), - BindOnce(&PostTaskAndroid::RunJavaTask, - base::android::ScopedJavaGlobalRef<jobject>(task)), - TimeDelta::FromMilliseconds(delay)); + PostDelayedTask( + FROM_HERE, + PostTaskAndroid::CreateTaskTraits( + env, priority_set_explicitly, priority, may_block, use_thread_pool, + current_thread, extension_id, extension_data), + BindOnce(&PostTaskAndroid::RunJavaTask, + base::android::ScopedJavaGlobalRef<jobject>(task)), + TimeDelta::FromMilliseconds(delay)); } // static
diff --git a/base/android/task_scheduler/post_task_android.h b/base/android/task_scheduler/post_task_android.h index c15c822..80fdb3b3 100644 --- a/base/android/task_scheduler/post_task_android.h +++ b/base/android/task_scheduler/post_task_android.h
@@ -28,6 +28,7 @@ jint priority, jboolean may_block, jboolean use_thread_pool, + jboolean current_thread, jbyte extension_id, const base::android::JavaParamRef<jbyteArray>& extension_data);
diff --git a/base/android/task_scheduler/task_runner_android.cc b/base/android/task_scheduler/task_runner_android.cc index 18730e17..7531028d 100644 --- a/base/android/task_scheduler/task_runner_android.cc +++ b/base/android/task_scheduler/task_runner_android.cc
@@ -20,11 +20,12 @@ jint priority, jboolean may_block, jboolean thread_pool, + jboolean current_thread, jbyte extension_id, const base::android::JavaParamRef<jbyteArray>& extension_data) { TaskTraits task_traits = PostTaskAndroid::CreateTaskTraits( env, priority_set_explicitly, priority, may_block, thread_pool, - extension_id, extension_data); + current_thread, extension_id, extension_data); scoped_refptr<TaskRunner> task_runner; switch (static_cast<TaskRunnerType>(task_runner_type)) { case TaskRunnerType::BASE:
diff --git a/base/task/post_job.cc b/base/task/post_job.cc index 1e0b4d9..3c83068 100644 --- a/base/task/post_job.cc +++ b/base/task/post_job.cc
@@ -7,6 +7,8 @@ #include "base/task/scoped_set_task_priority_for_current_thread.h" #include "base/task/thread_pool/job_task_source.h" #include "base/task/thread_pool/pooled_task_runner_delegate.h" +#include "base/task/thread_pool/thread_pool_impl.h" +#include "base/task/thread_pool/thread_pool_instance.h" namespace base { namespace experimental { @@ -100,6 +102,8 @@ #endif // DCHECK_IS_ON() } +JobHandle::JobHandle() = default; + JobHandle::JobHandle(scoped_refptr<internal::JobTaskSource> task_source) : task_source_(std::move(task_source)) {} @@ -157,5 +161,32 @@ task_source_ = nullptr; } +JobHandle PostJob(const Location& from_here, + const TaskTraits& traits, + RepeatingCallback<void(JobDelegate*)> worker_task, + RepeatingCallback<size_t()> max_concurrency_callback) { + DCHECK(ThreadPoolInstance::Get()) + << "Ref. Prerequisite section of post_task.h.\n\n" + "Hint: if this is in a unit test, you're likely merely missing a " + "base::test::TaskEnvironment member in your fixture.\n"; + DCHECK(traits.use_thread_pool()) + << "The base::ThreadPool() trait is mandatory with PostJob()."; + DCHECK_EQ(traits.extension_id(), + TaskTraitsExtensionStorage::kInvalidExtensionId) + << "Extension traits cannot be used with PostJob()."; + TaskTraits adjusted_traits = traits; + adjusted_traits.InheritPriority(internal::GetTaskPriorityForCurrentThread()); + auto task_source = base::MakeRefCounted<internal::JobTaskSource>( + from_here, adjusted_traits, std::move(worker_task), + std::move(max_concurrency_callback), + static_cast<internal::ThreadPoolImpl*>(ThreadPoolInstance::Get())); + const bool queued = + static_cast<internal::ThreadPoolImpl*>(ThreadPoolInstance::Get()) + ->EnqueueJobTaskSource(task_source); + if (queued) + return internal::JobTaskSource::CreateJobHandle(std::move(task_source)); + return JobHandle(); +} + } // namespace experimental } // namespace base \ No newline at end of file
diff --git a/base/task/post_job.h b/base/task/post_job.h index b9a3283..cf8ca1a 100644 --- a/base/task/post_job.h +++ b/base/task/post_job.h
@@ -6,6 +6,8 @@ #define BASE_TASK_POST_JOB_H_ #include "base/base_export.h" +#include "base/callback.h" +#include "base/location.h" #include "base/logging.h" #include "base/macros.h" #include "base/memory/ref_counted.h" @@ -45,7 +47,7 @@ void YieldIfNeeded(); // Notifies the scheduler that max concurrency was increased, and the number - // of worker should be adjusted. + // of worker should be adjusted accordingly. See PostJob() for more details. void NotifyConcurrencyIncrease(); private: @@ -74,6 +76,7 @@ // the posted Job. class BASE_EXPORT JobHandle { public: + JobHandle(); // A job must either be joined, canceled or detached before the JobHandle is // destroyed. ~JobHandle(); @@ -85,12 +88,7 @@ void UpdatePriority(TaskPriority new_priority); // Notifies the scheduler that max concurrency was increased, and the number - // of worker should be adjusted accordingly. This *must* be invoked shortly - // after |max_concurrency_callback| starts returning a value larger than - // previously returned values. This usually happens when new work items are - // added and the API user wants additional |worker_task| to run concurrently. - // TODO(839091): Update comment to be more specific about - // |max_concurrency_callback| once PostJob() landed. + // of workers should be adjusted accordingly. See PostJob() for more details. void NotifyConcurrencyIncrease(); // Contributes to the job on this thread. Doesn't return until all tasks have @@ -111,7 +109,6 @@ void Detach(); private: - // TODO(839091): Update friendship once PostJob is used. friend class internal::JobTaskSource; explicit JobHandle(scoped_refptr<internal::JobTaskSource> task_source); @@ -121,6 +118,49 @@ DISALLOW_COPY_AND_ASSIGN(JobHandle); }; +// Posts a repeating |worker_task| with specific |traits| to run in parallel. +// Returns a JobHandle associated with the Job, which can be joined, canceled or +// detached. +// To avoid scheduling overhead, |worker_task| should do as much work as +// possible in a loop when invoked, and JobDelegate::ShouldYield() should be +// periodically invoked to conditionally exit and let the scheduler prioritize +// work. +// +// A canonical implementation of |worker_task| looks like: +// void WorkerTask(JobDelegate* job_delegate) { +// while (!job_delegate->ShouldYield()) { +// auto work_item = worker_queue.TakeWorkItem(); // Smallest unit of work. +// if (!work_item) +// return: +// ProcessWork(work_item); +// } +// } +// +// |max_concurrency_callback| controls the maximum number of threads calling +// |worker_task| concurrently. |worker_task| is only invoked if the number of +// threads previously running |worker_task| was less than the value returned by +// |max_concurrency_callback|. In general, |max_concurrency_callback| should +// return the latest number of incomplete work items (smallest unit of work) +// left to processed. JobHandle/JobDelegate::NotifyConcurrencyIncrease() *must* +// be invoked shortly after |max_concurrency_callback| starts returning a value +// larger than previously returned values. This usually happens when new work +// items are added and the API user wants additional threads to invoke +// |worker_task| concurrently. The callbacks may be called concurrently on any +// thread until the job is complete. If the job handle is detached, the +// callbacks may still be called, so they must not access global state that +// could be destroyed. +// +// |traits| requirements: +// - base::ThreadPool() must be specified. +// - Extension traits (e.g. BrowserThread) cannot be specified. +// - base::ThreadPolicy must be specified if the priority of the task runner +// will ever be increased from BEST_EFFORT. +JobHandle BASE_EXPORT +PostJob(const Location& from_here, + const TaskTraits& traits, + RepeatingCallback<void(JobDelegate*)> worker_task, + RepeatingCallback<size_t()> max_concurrency_callback); + } // namespace experimental } // namespace base
diff --git a/base/task/post_job_unittest.cc b/base/task/post_job_unittest.cc new file mode 100644 index 0000000..3fc3d6d4 --- /dev/null +++ b/base/task/post_job_unittest.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 "base/task/post_job.h" + +#include <atomic> + +#include "base/task/test_task_traits_extension.h" +#include "base/test/bind_test_util.h" +#include "base/test/gtest_util.h" +#include "base/test/task_environment.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace base { + +TEST(PostJobTest, PostJobSimple) { + test::TaskEnvironment task_environment; + std::atomic_size_t num_tasks_to_run(4); + auto handle = experimental::PostJob( + FROM_HERE, ThreadPool(), + BindLambdaForTesting( + [&](experimental::JobDelegate* delegate) { --num_tasks_to_run; }), + BindLambdaForTesting([&]() -> size_t { return num_tasks_to_run; })); + handle.Join(); + DCHECK_EQ(num_tasks_to_run, 0U); +} + +TEST(PostJobTest, PostJobExtension) { + testing::FLAGS_gtest_death_test_style = "threadsafe"; + EXPECT_DCHECK_DEATH({ + auto handle = experimental::PostJob( + FROM_HERE, TestExtensionBoolTrait(), + BindRepeating([](experimental::JobDelegate* delegate) {}), + BindRepeating([]() -> size_t { return 0; })); + }); +} + +} // namespace base \ No newline at end of file
diff --git a/base/task/post_task.cc b/base/task/post_task.cc index 1e7e65c..244e5f6 100644 --- a/base/task/post_task.cc +++ b/base/task/post_task.cc
@@ -41,6 +41,13 @@ } TaskExecutor* GetTaskExecutorForTraits(const TaskTraits& traits) { + if (traits.use_current_thread()) { + TaskExecutor* executor = GetTaskExecutorForCurrentThread(); + DCHECK(executor) << "Couldn't find a TaskExecutor for this thread. Note " + "you can't use base::CurrentThread in a one-off " + "base::ThreadPool task."; + return executor; + } TaskExecutor* executor = GetRegisteredTaskExecutorForTraits(traits); DCHECK(executor || ThreadPoolInstance::Get()) << "Ref. Prerequisite section of post_task.h.\n\n"
diff --git a/base/task/post_task_unittest.cc b/base/task/post_task_unittest.cc index f81f9d1c..798eba8 100644 --- a/base/task/post_task_unittest.cc +++ b/base/task/post_task_unittest.cc
@@ -225,6 +225,115 @@ run_loop.Run(); } +TEST_F(PostTaskTestWithExecutor, ThreadPoolTaskRunnerCurrentThreadTrait) { + auto task_runner = CreateTaskRunner({ThreadPool()}); + RunLoop run_loop; + + EXPECT_TRUE(task_runner->PostTask(FROM_HERE, BindLambdaForTesting([&]() { + // CurrentThread is meaningless in this + // context. + EXPECT_DCHECK_DEATH( + PostTask(FROM_HERE, {CurrentThread()}, + DoNothing())); + run_loop.Quit(); + }))); + + run_loop.Run(); +} + +TEST_F(PostTaskTestWithExecutor, + ThreadPoolSequencedTaskRunnerCurrentThreadTrait) { + auto sequenced_task_runner = CreateSequencedTaskRunner({ThreadPool()}); + RunLoop run_loop; + + auto current_thread_task = BindLambdaForTesting([&]() { + EXPECT_TRUE(sequenced_task_runner->RunsTasksInCurrentSequence()); + run_loop.Quit(); + }); + + EXPECT_TRUE(sequenced_task_runner->PostTask( + FROM_HERE, BindLambdaForTesting([&]() { + EXPECT_TRUE( + PostTask(FROM_HERE, {CurrentThread()}, current_thread_task)); + }))); + + run_loop.Run(); +} + +TEST_F(PostTaskTestWithExecutor, + ThreadPoolSingleThreadTaskRunnerCurrentThreadTrait) { + auto single_thread_task_runner = CreateSingleThreadTaskRunner({ThreadPool()}); + RunLoop run_loop; + + auto current_thread_task = BindLambdaForTesting([&]() { + EXPECT_TRUE(single_thread_task_runner->RunsTasksInCurrentSequence()); + run_loop.Quit(); + }); + + EXPECT_TRUE(single_thread_task_runner->PostTask( + FROM_HERE, BindLambdaForTesting([&]() { + EXPECT_TRUE( + PostTask(FROM_HERE, {CurrentThread()}, current_thread_task)); + }))); + + run_loop.Run(); +} + +TEST_F(PostTaskTestWithExecutor, ThreadPoolCurrentThreadChangePriority) { + auto single_thread_task_runner = + CreateSingleThreadTaskRunner({ThreadPool(), TaskPriority::USER_BLOCKING}); + RunLoop run_loop; + + auto current_thread_task = BindLambdaForTesting([&]() { + EXPECT_TRUE(single_thread_task_runner->RunsTasksInCurrentSequence()); + run_loop.Quit(); + }); + + EXPECT_TRUE(single_thread_task_runner->PostTask( + FROM_HERE, BindLambdaForTesting([&]() { + // We should be able to request a priority change, although it may be + // ignored. + EXPECT_TRUE(PostTask(FROM_HERE, + {CurrentThread(), TaskPriority::USER_VISIBLE}, + current_thread_task)); + }))); + + run_loop.Run(); +} + +TEST_F(PostTaskTestWithExecutor, + ThreadPoolCurrentThreadCantChangeShutdownBehavior) { + auto single_thread_task_runner = CreateSingleThreadTaskRunner( + {ThreadPool(), TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); + RunLoop run_loop; + + EXPECT_TRUE(single_thread_task_runner->PostTask( + FROM_HERE, BindLambdaForTesting([&]() { + EXPECT_DCHECK_DEATH(PostTask( + FROM_HERE, {CurrentThread(), TaskShutdownBehavior::BLOCK_SHUTDOWN}, + DoNothing())); + run_loop.Quit(); + }))); + + run_loop.Run(); +} + +TEST_F(PostTaskTestWithExecutor, + ThreadPoolCurrentThreadCantSetSyncPrimitivesInNonSyncTaskRunner) { + auto single_thread_task_runner = CreateSingleThreadTaskRunner({ThreadPool()}); + RunLoop run_loop; + + EXPECT_TRUE(single_thread_task_runner->PostTask( + FROM_HERE, BindLambdaForTesting([&]() { + EXPECT_DCHECK_DEATH( + PostTask(FROM_HERE, {CurrentThread(), WithBaseSyncPrimitives()}, + DoNothing())); + run_loop.Quit(); + }))); + + run_loop.Run(); +} + TEST_F(PostTaskTestWithExecutor, RegisterExecutorTwice) { testing::FLAGS_gtest_death_test_style = "threadsafe"; EXPECT_DCHECK_DEATH(
diff --git a/base/task/sequence_manager/sequence_manager.h b/base/task/sequence_manager/sequence_manager.h index 8ec2cf3..6e1cb0b 100644 --- a/base/task/sequence_manager/sequence_manager.h +++ b/base/task/sequence_manager/sequence_manager.h
@@ -20,6 +20,7 @@ namespace base { class MessagePump; +class TaskObserver; namespace sequence_manager { @@ -248,6 +249,14 @@ virtual std::unique_ptr<NativeWorkHandle> OnNativeWorkPending( TaskQueue::QueuePriority priority) = 0; + // Adds an observer which reports task execution. Can only be called on the + // same thread that |this| is running on. + virtual void AddTaskObserver(TaskObserver* task_observer) = 0; + + // Removes an observer which reports task execution. Can only be called on the + // same thread that |this| is running on. + virtual void RemoveTaskObserver(TaskObserver* task_observer) = 0; + protected: virtual std::unique_ptr<internal::TaskQueueImpl> CreateTaskQueueImpl( const TaskQueue::Spec& spec) = 0;
diff --git a/base/task/sequence_manager/sequence_manager_impl.h b/base/task/sequence_manager/sequence_manager_impl.h index d490475..1ee7944 100644 --- a/base/task/sequence_manager/sequence_manager_impl.h +++ b/base/task/sequence_manager/sequence_manager_impl.h
@@ -42,8 +42,6 @@ namespace base { -class TaskObserver; - namespace trace_event { class ConvertableToTraceFormat; } // namespace trace_event @@ -128,6 +126,8 @@ std::string DescribeAllPendingTasks() const override; std::unique_ptr<NativeWorkHandle> OnNativeWorkPending( TaskQueue::QueuePriority priority) override; + void AddTaskObserver(TaskObserver* task_observer) override; + void RemoveTaskObserver(TaskObserver* task_observer) override; // SequencedTaskSource implementation: Task* SelectNextTask() override; @@ -136,8 +136,6 @@ bool HasPendingHighResolutionTasks() override; bool OnSystemIdle() override; - void AddTaskObserver(TaskObserver* task_observer); - void RemoveTaskObserver(TaskObserver* task_observer); void AddDestructionObserver( MessageLoopCurrent::DestructionObserver* destruction_observer); void RemoveDestructionObserver(
diff --git a/base/task/single_thread_task_executor_unittest.cc b/base/task/single_thread_task_executor_unittest.cc index 8919298b..b64294f 100644 --- a/base/task/single_thread_task_executor_unittest.cc +++ b/base/task/single_thread_task_executor_unittest.cc
@@ -5,6 +5,7 @@ #include "base/task/single_thread_task_executor.h" #include "base/run_loop.h" +#include "base/task/post_task.h" #include "base/test/bind_test_util.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -42,4 +43,16 @@ run_loop.Run(); } +TEST(SingleThreadTaskExecutorTest, CurrentThread) { + SingleThreadTaskExecutor single_thread_task_executor; + + EXPECT_EQ(single_thread_task_executor.task_runner(), + base::CreateSingleThreadTaskRunner({base::CurrentThread()})); + + // There's only one task queue so priority is ignored. + EXPECT_EQ(single_thread_task_executor.task_runner(), + base::CreateSingleThreadTaskRunner( + {base::CurrentThread(), base::TaskPriority::BEST_EFFORT})); +} + } // namespace base
diff --git a/base/task/task_executor.cc b/base/task/task_executor.cc index 0bb86510..355fa3f 100644 --- a/base/task/task_executor.cc +++ b/base/task/task_executor.cc
@@ -74,4 +74,4 @@ return nullptr; } -} // namespace base \ No newline at end of file +} // namespace base
diff --git a/base/task/task_traits.h b/base/task/task_traits.h index c1e52ed..03abf17 100644 --- a/base/task/task_traits.h +++ b/base/task/task_traits.h
@@ -185,6 +185,14 @@ // between tasks, see base::PostTask::CreateSequencedTaskRunner. struct ThreadPool {}; +// Tasks and task runners with this thread will run tasks on the virtual thread +// (sequence) they are posted/created from. Other traits may be specified +// alongside this one to refine properties for the associated tasks +// (e.g. base::TaskPriority or content::BrowserTaskType) as long as those traits +// are compatible with the current thread (e.g. cannot specify base::MayBlock() +// on a non-blocking thread or alter base::TaskShutdownBehavior). +struct CurrentThread {}; + // Describes metadata for a single task or a group of tasks. class BASE_EXPORT TaskTraits { public: @@ -196,6 +204,7 @@ ValidTrait(MayBlock); ValidTrait(WithBaseSyncPrimitives); ValidTrait(ThreadPool); + ValidTrait(CurrentThread); }; // Invoking this constructor without arguments produces TaskTraits that are @@ -255,15 +264,22 @@ may_block_(trait_helpers::HasTrait<MayBlock, ArgTypes...>()), with_base_sync_primitives_( trait_helpers::HasTrait<WithBaseSyncPrimitives, ArgTypes...>()), - use_thread_pool_(trait_helpers::HasTrait<ThreadPool, ArgTypes...>()) { + use_thread_pool_(trait_helpers::HasTrait<ThreadPool, ArgTypes...>()), + use_current_thread_( + trait_helpers::HasTrait<CurrentThread, ArgTypes...>()) { constexpr bool has_thread_pool = trait_helpers::HasTrait<ThreadPool, ArgTypes...>(); constexpr bool has_extension = !trait_helpers::AreValidTraits<ValidTrait, ArgTypes...>::value; + constexpr bool has_current_thread = + trait_helpers::HasTrait<CurrentThread, ArgTypes...>(); static_assert( - has_thread_pool ^ has_extension, + !has_current_thread || !has_thread_pool, + "base::CurrentThread is mutually exclusive with base::ThreadPool"); + static_assert( + has_thread_pool ^ has_extension || has_current_thread, "Traits must explicitly specify a destination (e.g. ThreadPool or a " - "named thread like BrowserThread)"); + "named thread like BrowserThread, or CurrentThread)"); } constexpr TaskTraits(const TaskTraits& other) = default; @@ -271,14 +287,15 @@ // TODO(eseckler): Default the comparison operator once C++20 arrives. bool operator==(const TaskTraits& other) const { - static_assert(sizeof(TaskTraits) == 15, + static_assert(sizeof(TaskTraits) == 16, "Update comparison operator when TaskTraits change"); return extension_ == other.extension_ && priority_ == other.priority_ && shutdown_behavior_ == other.shutdown_behavior_ && thread_policy_ == other.thread_policy_ && may_block_ == other.may_block_ && with_base_sync_primitives_ == other.with_base_sync_primitives_ && - use_thread_pool_ == other.use_thread_pool_; + use_thread_pool_ == other.use_thread_pool_ && + use_current_thread_ == other.use_current_thread_; } // Sets the priority of tasks with these traits to |priority|. @@ -335,6 +352,10 @@ // Returns true if tasks with these traits execute on the thread pool. constexpr bool use_thread_pool() const { return use_thread_pool_; } + // Returns true if tasks with these traits execute on the virtual thread + // (sequence) they are posted/created from. + constexpr bool use_current_thread() const { return use_current_thread_; } + uint8_t extension_id() const { return extension_.extension_id; } // Access the extension data by parsing it into the provided extension type. @@ -353,6 +374,7 @@ TaskPriority priority, bool may_block, bool use_thread_pool, + bool use_current_thread, TaskTraitsExtensionStorage extension) : extension_(extension), priority_(static_cast<uint8_t>(priority) | @@ -362,8 +384,9 @@ thread_policy_(static_cast<uint8_t>(ThreadPolicy::PREFER_BACKGROUND)), may_block_(may_block), with_base_sync_primitives_(false), - use_thread_pool_(use_thread_pool) { - static_assert(sizeof(TaskTraits) == 15, "Keep this constructor up to date"); + use_thread_pool_(use_thread_pool), + use_current_thread_(use_current_thread) { + static_assert(sizeof(TaskTraits) == 16, "Keep this constructor up to date"); } // This bit is set in |priority_|, |shutdown_behavior_| and |thread_policy_| @@ -378,6 +401,7 @@ bool may_block_; bool with_base_sync_primitives_; bool use_thread_pool_; + bool use_current_thread_; }; // Returns string literals for the enums defined in this file. These methods
diff --git a/base/task/task_traits_unittest.nc b/base/task/task_traits_unittest.nc index 8755ca0..73fc7be55 100644 --- a/base/task/task_traits_unittest.nc +++ b/base/task/task_traits_unittest.nc
@@ -26,6 +26,8 @@ TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}; #elif defined(NCTEST_TASK_TRAITS_INVALID_TYPE) // [r"no matching constructor for initialization of 'const base::TaskTraits'"] constexpr TaskTraits traits = {TaskShutdownBehavior::BLOCK_SHUTDOWN, true}; +#elif defined(NCTEST_TASK_TRAITS_CURRENT_THREAD_AND_THREADPOOL) // [r"base::CurrentThread is mutually exclusive with base::ThreadPool"] +constexpr TaskTraits traits = {ThreadPool(), CurrentThread()}; #endif } // namespace base
diff --git a/base/task/thread_pool/job_task_source.h b/base/task/thread_pool/job_task_source.h index cf0c76d..57838679 100644 --- a/base/task/thread_pool/job_task_source.h +++ b/base/task/thread_pool/job_task_source.h
@@ -38,8 +38,9 @@ RepeatingCallback<size_t()> max_concurrency_callback, PooledTaskRunnerDelegate* delegate); - experimental::JobHandle GetHandleForTesting() { - return experimental::JobHandle(this); + static experimental::JobHandle CreateJobHandle( + scoped_refptr<internal::JobTaskSource> task_source) { + return experimental::JobHandle(std::move(task_source)); } // Notifies this task source that max concurrency was increased, and the
diff --git a/base/task/thread_pool/task_tracker.cc b/base/task/thread_pool/task_tracker.cc index c6f664b..a74f140 100644 --- a/base/task/thread_pool/task_tracker.cc +++ b/base/task/thread_pool/task_tracker.cc
@@ -120,9 +120,11 @@ // |sequenced_task_runner| and |single_thread_task_runner| must outlive this // EphemeralTaskExecutor. EphemeralTaskExecutor(SequencedTaskRunner* sequenced_task_runner, - SingleThreadTaskRunner* single_thread_task_runner) + SingleThreadTaskRunner* single_thread_task_runner, + const TaskTraits* sequence_traits) : sequenced_task_runner_(sequenced_task_runner), - single_thread_task_runner_(single_thread_task_runner) { + single_thread_task_runner_(single_thread_task_runner), + sequence_traits_(sequence_traits) { SetTaskExecutorForCurrentThread(this); } @@ -135,23 +137,27 @@ const TaskTraits& traits, OnceClosure task, TimeDelta delay) override { + CheckTraitsCompatibleWithSequenceTraits(traits); return sequenced_task_runner_->PostDelayedTask(from_here, std::move(task), delay); } scoped_refptr<TaskRunner> CreateTaskRunner( const TaskTraits& traits) override { + CheckTraitsCompatibleWithSequenceTraits(traits); return sequenced_task_runner_; } scoped_refptr<SequencedTaskRunner> CreateSequencedTaskRunner( const TaskTraits& traits) override { + CheckTraitsCompatibleWithSequenceTraits(traits); return sequenced_task_runner_; } scoped_refptr<SingleThreadTaskRunner> CreateSingleThreadTaskRunner( const TaskTraits& traits, SingleThreadTaskRunnerThreadMode thread_mode) override { + CheckTraitsCompatibleWithSequenceTraits(traits); return single_thread_task_runner_; } @@ -159,13 +165,30 @@ scoped_refptr<SingleThreadTaskRunner> CreateCOMSTATaskRunner( const TaskTraits& traits, SingleThreadTaskRunnerThreadMode thread_mode) override { + CheckTraitsCompatibleWithSequenceTraits(traits); return single_thread_task_runner_; } #endif // defined(OS_WIN) private: - SequencedTaskRunner* sequenced_task_runner_; - SingleThreadTaskRunner* single_thread_task_runner_; + // Currently ignores |traits.priority()|. + void CheckTraitsCompatibleWithSequenceTraits(const TaskTraits& traits) { + if (traits.shutdown_behavior_set_explicitly()) { + DCHECK_EQ(traits.shutdown_behavior(), + sequence_traits_->shutdown_behavior()); + } + + DCHECK(!traits.may_block() || + traits.may_block() == sequence_traits_->may_block()); + + DCHECK(!traits.with_base_sync_primitives() || + traits.with_base_sync_primitives() == + sequence_traits_->with_base_sync_primitives()); + } + + SequencedTaskRunner* const sequenced_task_runner_; + SingleThreadTaskRunner* const single_thread_task_runner_; + const TaskTraits* const sequence_traits_; }; } // namespace @@ -547,7 +570,7 @@ static_cast<SequencedTaskRunner*>(task_source->task_runner())); ephemiral_task_executor.emplace( static_cast<SequencedTaskRunner*>(task_source->task_runner()), - nullptr); + nullptr, &traits); break; case TaskSourceExecutionMode::kSingleThread: DCHECK(task_source->task_runner()); @@ -555,7 +578,8 @@ static_cast<SingleThreadTaskRunner*>(task_source->task_runner())); ephemiral_task_executor.emplace( static_cast<SequencedTaskRunner*>(task_source->task_runner()), - static_cast<SingleThreadTaskRunner*>(task_source->task_runner())); + static_cast<SingleThreadTaskRunner*>(task_source->task_runner()), + &traits); break; }
diff --git a/base/task/thread_pool/thread_group_unittest.cc b/base/task/thread_pool/thread_group_unittest.cc index d09567b8..3ed430a 100644 --- a/base/task/thread_pool/thread_group_unittest.cc +++ b/base/task/thread_pool/thread_group_unittest.cc
@@ -681,8 +681,9 @@ scoped_refptr<JobTaskSource> task_source = job_task->GetJobTaskSource( FROM_HERE, {ThreadPool()}, &mock_pooled_task_runner_delegate_); - experimental::JobHandle job_handle = task_source->GetHandleForTesting(); mock_pooled_task_runner_delegate_.EnqueueJobTaskSource(task_source); + experimental::JobHandle job_handle = + internal::JobTaskSource::CreateJobHandle(task_source); // Wait for at least 1 task to start running. { @@ -796,8 +797,9 @@ scoped_refptr<JobTaskSource> task_source = job_task->GetJobTaskSource( FROM_HERE, {ThreadPool()}, &mock_pooled_task_runner_delegate_); - experimental::JobHandle job_handle = task_source->GetHandleForTesting(); mock_pooled_task_runner_delegate_.EnqueueJobTaskSource(task_source); + experimental::JobHandle job_handle = + internal::JobTaskSource::CreateJobHandle(task_source); job_handle.Join(); // All worker tasks should complete before Join() returns. EXPECT_EQ(0U, job_task->GetMaxConcurrency());
diff --git a/base/test/task_environment.cc b/base/test/task_environment.cc index 99b1ebe..3f9d6af 100644 --- a/base/test/task_environment.cc +++ b/base/test/task_environment.cc
@@ -19,6 +19,7 @@ #include "base/task/post_task.h" #include "base/task/sequence_manager/sequence_manager_impl.h" #include "base/task/sequence_manager/time_domain.h" +#include "base/task/simple_task_executor.h" #include "base/task/thread_pool/thread_pool_impl.h" #include "base/task/thread_pool/thread_pool_instance.h" #include "base/test/bind_test_util.h" @@ -395,6 +396,7 @@ .SetTimeDomain(mock_time_domain_.get())); task_runner_ = task_queue_->task_runner(); sequence_manager_->SetDefaultTaskRunner(task_runner_); + simple_task_executor_ = std::make_unique<SimpleTaskExecutor>(task_runner_); CHECK(base::ThreadTaskRunnerHandle::IsSet()) << "ThreadTaskRunnerHandle should've been set now."; CompleteInitialization();
diff --git a/base/test/task_environment.h b/base/test/task_environment.h index c222141..ac45058 100644 --- a/base/test/task_environment.h +++ b/base/test/task_environment.h
@@ -23,6 +23,7 @@ class Clock; class FileDescriptorWatcher; +class SimpleTaskExecutor; class TickClock; namespace subtle { @@ -348,6 +349,9 @@ std::unique_ptr<bool> owns_instance_ = std::make_unique<bool>(true); + // To support base::CurrentThread(). + std::unique_ptr<SimpleTaskExecutor> simple_task_executor_; + // Used to verify thread-affinity of operations that must occur on the main // thread. This is the case for anything that modifies or drives the // |sequence_manager_|.
diff --git a/base/test/task_environment_unittest.cc b/base/test/task_environment_unittest.cc index b82f49db..e6a929e 100644 --- a/base/test/task_environment_unittest.cc +++ b/base/test/task_environment_unittest.cc
@@ -1188,5 +1188,16 @@ EXPECT_EQ(TimeTicks::Now(), start_time + kDelay); } +TEST_F(TaskEnvironmentTest, CurrentThread) { + SingleThreadTaskEnvironment task_environment; + RunLoop run_loop; + + PostTask(FROM_HERE, {CurrentThread()}, BindLambdaForTesting([&]() { + PostTask(FROM_HERE, {CurrentThread()}, run_loop.QuitClosure()); + })); + + run_loop.Run(); +} + } // namespace test } // namespace base
diff --git a/base/threading/thread_unittest.cc b/base/threading/thread_unittest.cc index ab986326..5f17228 100644 --- a/base/threading/thread_unittest.cc +++ b/base/threading/thread_unittest.cc
@@ -17,6 +17,7 @@ #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "base/synchronization/waitable_event.h" +#include "base/task/post_task.h" #include "base/task/sequence_manager/sequence_manager_impl.h" #include "base/task/task_executor.h" #include "base/test/bind_test_util.h" @@ -530,8 +531,7 @@ Thread a("GetTaskExecutorForCurrentThread"); ASSERT_TRUE(a.Start()); - base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL, - base::WaitableEvent::InitialState::NOT_SIGNALED); + base::WaitableEvent event; a.task_runner()->PostTask( FROM_HERE, base::BindLambdaForTesting([&]() { @@ -543,6 +543,28 @@ a.Stop(); } +TEST_F(ThreadTest, CurrentThread) { + Thread a("CurrentThread"); + ASSERT_TRUE(a.Start()); + + base::WaitableEvent event; + + a.task_runner()->PostTask( + FROM_HERE, base::BindLambdaForTesting([&]() { + EXPECT_EQ(a.task_runner(), + base::CreateSingleThreadTaskRunner({base::CurrentThread()})); + + // There's only a single task runner so base::TaskPriority is ignored. + EXPECT_EQ(a.task_runner(), base::CreateSingleThreadTaskRunner( + {base::CurrentThread(), + base::TaskPriority::BEST_EFFORT})); + event.Signal(); + })); + + event.Wait(); + a.Stop(); +} + namespace { class SequenceManagerThreadDelegate : public Thread::Delegate {
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index d388999..75c7271 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -8900101731286284048 \ No newline at end of file +8900075814043677168 \ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index d544d1e..3cb6c2e 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -8900103511840373520 \ No newline at end of file +8900078822768978496 \ No newline at end of file
diff --git a/build_overrides/shaderc.gni b/build_overrides/shaderc.gni index a67f427..6cce450 100644 --- a/build_overrides/shaderc.gni +++ b/build_overrides/shaderc.gni
@@ -5,3 +5,6 @@ shaderc_glslang_dir = "//third_party/glslang/src" shaderc_spirv_tools_dir = "//third_party/SPIRV-Tools/src" shaderc_spirv_cross_dir = "//third_party/dawn/third_party" +shaderc_spirv_headers_dir = "//third_party/spirv-headers/src" + +shaderc_enable_spvc_parser = false
diff --git a/cc/BUILD.gn b/cc/BUILD.gn index 305a667..fe3b9bb 100644 --- a/cc/BUILD.gn +++ b/cc/BUILD.gn
@@ -110,9 +110,10 @@ "layers/recording_source.h", "layers/render_surface_impl.cc", "layers/render_surface_impl.h", + "layers/scrollbar_layer_base.cc", + "layers/scrollbar_layer_base.h", "layers/scrollbar_layer_impl_base.cc", "layers/scrollbar_layer_impl_base.h", - "layers/scrollbar_layer_interface.h", "layers/solid_color_layer.cc", "layers/solid_color_layer.h", "layers/solid_color_layer_impl.cc",
diff --git a/cc/input/scrollbar_animation_controller_unittest.cc b/cc/input/scrollbar_animation_controller_unittest.cc index b00998f..d88bbdb 100644 --- a/cc/input/scrollbar_animation_controller_unittest.cc +++ b/cc/input/scrollbar_animation_controller_unittest.cc
@@ -76,15 +76,12 @@ const int kTrackStart = 0; const int kTrackLength = 100; const bool kIsLeftSideVerticalScrollbar = false; - const bool kIsOverlayScrollbar = true; scroll_layer_ = AddLayer<LayerImpl>(); h_scrollbar_layer_ = AddLayer<SolidColorScrollbarLayerImpl>( - HORIZONTAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar, - kIsOverlayScrollbar); + HORIZONTAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar); v_scrollbar_layer_ = AddLayer<SolidColorScrollbarLayerImpl>( - VERTICAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar, - kIsOverlayScrollbar); + VERTICAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar); SetElementIdsForTesting(); clip_layer_ = root_layer(); @@ -1380,13 +1377,12 @@ void SetUp() override { const int kTrackStart = 0; const bool kIsLeftSideVerticalScrollbar = false; - const bool kIsOverlayScrollbar = true; // Allow opacity animations. LayerImpl* root = root_layer(); scroll_layer_ = AddLayer<LayerImpl>(); scrollbar_layer_ = AddLayer<SolidColorScrollbarLayerImpl>( orientation(), kThumbThickness, kTrackStart, - kIsLeftSideVerticalScrollbar, kIsOverlayScrollbar); + kIsLeftSideVerticalScrollbar); SetElementIdsForTesting(); scroll_layer_->SetBounds(gfx::Size(200, 200));
diff --git a/cc/input/single_scrollbar_animation_controller_thinning_unittest.cc b/cc/input/single_scrollbar_animation_controller_thinning_unittest.cc index 6b8668b2..b851a58 100644 --- a/cc/input/single_scrollbar_animation_controller_thinning_unittest.cc +++ b/cc/input/single_scrollbar_animation_controller_thinning_unittest.cc
@@ -70,11 +70,9 @@ const int kTrackStart = 0; const int kTrackLength = 100; const bool kIsLeftSideVerticalScrollbar = false; - const bool kIsOverlayScrollbar = true; scrollbar_layer_ = AddLayer<SolidColorScrollbarLayerImpl>( - HORIZONTAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar, - kIsOverlayScrollbar); + HORIZONTAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar); scrollbar_layer_->SetBounds(gfx::Size(kThumbThickness, kTrackLength)); scrollbar_layer_->SetScrollElementId(scroll_layer->element_id());
diff --git a/cc/layers/painted_overlay_scrollbar_layer.cc b/cc/layers/painted_overlay_scrollbar_layer.cc index 5a9e1605..d46146e 100644 --- a/cc/layers/painted_overlay_scrollbar_layer.cc +++ b/cc/layers/painted_overlay_scrollbar_layer.cc
@@ -44,31 +44,20 @@ DCHECK(scrollbar_->HasThumb()); DCHECK(scrollbar_->IsOverlay()); DCHECK(scrollbar_->UsesNinePatchThumbResource()); - SetIsScrollbar(true); } PaintedOverlayScrollbarLayer::~PaintedOverlayScrollbarLayer() = default; -void PaintedOverlayScrollbarLayer::SetScrollElementId(ElementId element_id) { - if (element_id == scroll_element_id_) - return; - - scroll_element_id_ = element_id; - SetNeedsCommit(); -} - bool PaintedOverlayScrollbarLayer::OpacityCanAnimateOnImplThread() const { return scrollbar_->IsOverlay(); } void PaintedOverlayScrollbarLayer::PushPropertiesTo(LayerImpl* layer) { - Layer::PushPropertiesTo(layer); + ScrollbarLayerBase::PushPropertiesTo(layer); PaintedOverlayScrollbarLayerImpl* scrollbar_layer = static_cast<PaintedOverlayScrollbarLayerImpl*>(layer); - scrollbar_layer->SetScrollElementId(scroll_element_id_); - scrollbar_layer->SetThumbThickness(thumb_thickness_); scrollbar_layer->SetThumbLength(thumb_length_); if (scrollbar_->Orientation() == HORIZONTAL) { @@ -105,7 +94,7 @@ track_resource_.reset(); } - Layer::SetLayerTreeHost(host); + ScrollbarLayerBase::SetLayerTreeHost(host); } gfx::Rect PaintedOverlayScrollbarLayer::OriginThumbRectForPainting() const {
diff --git a/cc/layers/painted_overlay_scrollbar_layer.h b/cc/layers/painted_overlay_scrollbar_layer.h index 06b4926..4838fb8 100644 --- a/cc/layers/painted_overlay_scrollbar_layer.h +++ b/cc/layers/painted_overlay_scrollbar_layer.h
@@ -8,15 +8,14 @@ #include "cc/cc_export.h" #include "cc/input/scrollbar.h" #include "cc/layers/layer.h" -#include "cc/layers/scrollbar_layer_interface.h" +#include "cc/layers/scrollbar_layer_base.h" #include "cc/resources/scoped_ui_resource.h" namespace cc { // For composited overlay scrollbars with nine-patch thumb. For overlay // scrollbars whose thumb is not nine-patch, use PaintedScrollbarLayer. -class CC_EXPORT PaintedOverlayScrollbarLayer : public ScrollbarLayerInterface, - public Layer { +class CC_EXPORT PaintedOverlayScrollbarLayer : public ScrollbarLayerBase { public: std::unique_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override; @@ -27,11 +26,6 @@ std::unique_ptr<Scrollbar> scrollbar); bool OpacityCanAnimateOnImplThread() const override; - - // ScrollbarLayerInterface - void SetScrollElementId(ElementId element_id) override; - - // Layer interface bool Update() override; void SetLayerTreeHost(LayerTreeHost* host) override; void PushPropertiesTo(LayerImpl* layer) override; @@ -56,7 +50,6 @@ bool PaintTickmarks(); std::unique_ptr<Scrollbar> scrollbar_; - ElementId scroll_element_id_; int thumb_thickness_; int thumb_length_;
diff --git a/cc/layers/painted_scrollbar_layer.cc b/cc/layers/painted_scrollbar_layer.cc index 3f23827..eca1517 100644 --- a/cc/layers/painted_scrollbar_layer.cc +++ b/cc/layers/painted_scrollbar_layer.cc
@@ -34,31 +34,20 @@ thumb_length_(scrollbar_->ThumbLength()), is_overlay_(scrollbar_->IsOverlay()), has_thumb_(scrollbar_->HasThumb()), - thumb_opacity_(scrollbar_->ThumbOpacity()) { - SetIsScrollbar(true); -} + thumb_opacity_(scrollbar_->ThumbOpacity()) {} PaintedScrollbarLayer::~PaintedScrollbarLayer() = default; -void PaintedScrollbarLayer::SetScrollElementId(ElementId element_id) { - if (element_id == scroll_element_id_) - return; - - scroll_element_id_ = element_id; - SetNeedsCommit(); -} - bool PaintedScrollbarLayer::OpacityCanAnimateOnImplThread() const { return scrollbar_->IsOverlay(); } void PaintedScrollbarLayer::PushPropertiesTo(LayerImpl* layer) { - Layer::PushPropertiesTo(layer); + ScrollbarLayerBase::PushPropertiesTo(layer); PaintedScrollbarLayerImpl* scrollbar_layer = static_cast<PaintedScrollbarLayerImpl*>(layer); - scrollbar_layer->SetScrollElementId(scroll_element_id_); scrollbar_layer->set_internal_contents_scale_and_bounds( internal_contents_scale_, internal_content_bounds_); @@ -97,7 +86,7 @@ thumb_resource_ = nullptr; } - Layer::SetLayerTreeHost(host); + ScrollbarLayerBase::SetLayerTreeHost(host); } gfx::Rect PaintedScrollbarLayer::ScrollbarLayerRectToContentRect( @@ -165,7 +154,7 @@ bool PaintedScrollbarLayer::Update() { { auto ignore_set_needs_commit = IgnoreSetNeedsCommit(); - Layer::Update(); + ScrollbarLayerBase::Update(); UpdateInternalContentScale(); }
diff --git a/cc/layers/painted_scrollbar_layer.h b/cc/layers/painted_scrollbar_layer.h index c9ea59ba..444c042 100644 --- a/cc/layers/painted_scrollbar_layer.h +++ b/cc/layers/painted_scrollbar_layer.h
@@ -8,13 +8,12 @@ #include "cc/cc_export.h" #include "cc/input/scrollbar.h" #include "cc/layers/layer.h" -#include "cc/layers/scrollbar_layer_interface.h" +#include "cc/layers/scrollbar_layer_base.h" #include "cc/resources/scoped_ui_resource.h" namespace cc { -class CC_EXPORT PaintedScrollbarLayer : public ScrollbarLayerInterface, - public Layer { +class CC_EXPORT PaintedScrollbarLayer : public ScrollbarLayerBase { public: std::unique_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override; @@ -25,11 +24,6 @@ PaintedScrollbarLayer& operator=(const PaintedScrollbarLayer&) = delete; bool OpacityCanAnimateOnImplThread() const override; - - // ScrollbarLayerInterface - void SetScrollElementId(ElementId element_id) override; - - // Layer interface bool Update() override; void SetLayerTreeHost(LayerTreeHost* host) override; void PushPropertiesTo(LayerImpl* layer) override;
diff --git a/cc/layers/scrollbar_layer_base.cc b/cc/layers/scrollbar_layer_base.cc new file mode 100644 index 0000000..14c743b --- /dev/null +++ b/cc/layers/scrollbar_layer_base.cc
@@ -0,0 +1,31 @@ +// 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 "cc/layers/scrollbar_layer_base.h" + +#include "cc/layers/scrollbar_layer_impl_base.h" + +namespace cc { + +ScrollbarLayerBase::ScrollbarLayerBase() { + SetIsScrollbar(true); +} + +ScrollbarLayerBase::~ScrollbarLayerBase() = default; + +void ScrollbarLayerBase::SetScrollElementId(ElementId element_id) { + if (element_id == scroll_element_id_) + return; + + scroll_element_id_ = element_id; + SetNeedsCommit(); +} + +void ScrollbarLayerBase::PushPropertiesTo(LayerImpl* layer) { + Layer::PushPropertiesTo(layer); + static_cast<ScrollbarLayerImplBase*>(layer)->SetScrollElementId( + scroll_element_id_); +} + +} // namespace cc
diff --git a/cc/layers/scrollbar_layer_base.h b/cc/layers/scrollbar_layer_base.h new file mode 100644 index 0000000..00c5dfa --- /dev/null +++ b/cc/layers/scrollbar_layer_base.h
@@ -0,0 +1,29 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_LAYERS_SCROLLBAR_LAYER_BASE_H_ +#define CC_LAYERS_SCROLLBAR_LAYER_BASE_H_ + +#include "cc/cc_export.h" +#include "cc/layers/layer.h" + +namespace cc { + +class CC_EXPORT ScrollbarLayerBase : public Layer { + public: + void SetScrollElementId(ElementId element_id); + + void PushPropertiesTo(LayerImpl* layer) override; + + protected: + ScrollbarLayerBase(); + ~ScrollbarLayerBase() override; + + private: + ElementId scroll_element_id_; +}; + +} // namespace cc + +#endif // CC_LAYERS_SCROLLBAR_LAYER_BASE_H_
diff --git a/cc/layers/scrollbar_layer_interface.h b/cc/layers/scrollbar_layer_interface.h deleted file mode 100644 index 661028e4..0000000 --- a/cc/layers/scrollbar_layer_interface.h +++ /dev/null
@@ -1,27 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CC_LAYERS_SCROLLBAR_LAYER_INTERFACE_H_ -#define CC_LAYERS_SCROLLBAR_LAYER_INTERFACE_H_ - -#include "cc/cc_export.h" -#include "cc/input/scrollbar.h" - -namespace cc { - -class CC_EXPORT ScrollbarLayerInterface { - public: - ScrollbarLayerInterface(const ScrollbarLayerInterface&) = delete; - ScrollbarLayerInterface& operator=(const ScrollbarLayerInterface&) = delete; - - virtual void SetScrollElementId(ElementId element_id) = 0; - - protected: - ScrollbarLayerInterface() {} - virtual ~ScrollbarLayerInterface() {} -}; - -} // namespace cc - -#endif // CC_LAYERS_SCROLLBAR_LAYER_INTERFACE_H_
diff --git a/cc/layers/scrollbar_layer_unittest.cc b/cc/layers/scrollbar_layer_unittest.cc index b9a03eb..98a5011c 100644 --- a/cc/layers/scrollbar_layer_unittest.cc +++ b/cc/layers/scrollbar_layer_unittest.cc
@@ -13,7 +13,7 @@ #include "cc/layers/painted_overlay_scrollbar_layer.h" #include "cc/layers/painted_scrollbar_layer.h" #include "cc/layers/painted_scrollbar_layer_impl.h" -#include "cc/layers/scrollbar_layer_interface.h" +#include "cc/layers/scrollbar_layer_base.h" #include "cc/layers/solid_color_scrollbar_layer.h" #include "cc/layers/solid_color_scrollbar_layer_impl.h" #include "cc/resources/ui_resource_manager.h" @@ -144,19 +144,16 @@ int track_start) { scoped_refptr<Layer> layer_tree_root = Layer::Create(); scoped_refptr<Layer> child1 = Layer::Create(); - scoped_refptr<Layer> child2; + scoped_refptr<ScrollbarLayerBase> child2; if (use_solid_color_scrollbar) { const bool kIsLeftSideVerticalScrollbar = false; child2 = SolidColorScrollbarLayer::Create(scrollbar->Orientation(), thumb_thickness, track_start, kIsLeftSideVerticalScrollbar); - static_cast<SolidColorScrollbarLayer*>(child2.get()) - ->SetScrollElementId(child1->element_id()); } else { child2 = PaintedScrollbarLayer::Create(std::move(scrollbar)); - static_cast<PaintedScrollbarLayer*>(child2.get()) - ->SetScrollElementId(child1->element_id()); } + child2->SetScrollElementId(child1->element_id()); layer_tree_root->AddChild(child1); layer_tree_root->InsertChild(child2, reverse_order ? 0 : 1); scrollbar_layer_id_ = reverse_order ? child1->id() : child2->id(); @@ -822,12 +819,11 @@ const int kTrackStart = 0; const int kThumbThickness = 10; const bool kIsLeftSideVerticalScrollbar = false; - const bool kIsOverlayScrollbar = false; SolidColorScrollbarLayerImpl* scrollbar_layer = - impl.AddLayer<SolidColorScrollbarLayerImpl>( - HORIZONTAL, kThumbThickness, kTrackStart, - kIsLeftSideVerticalScrollbar, kIsOverlayScrollbar); + impl.AddLayer<SolidColorScrollbarLayerImpl>(HORIZONTAL, kThumbThickness, + kTrackStart, + kIsLeftSideVerticalScrollbar); scrollbar_layer->SetScrollElementId(scroll_layer->element_id()); scroll_layer->SetScrollable(gfx::Size(980, 980)); @@ -863,11 +859,10 @@ const int kTrackStart = 0; const int kThumbThickness = 10; const bool kIsLeftSideVerticalScrollbar = false; - const bool kIsOverlayScrollbar = false; SolidColorScrollbarLayerImpl* scrollbar_layer = - impl.AddLayer<SolidColorScrollbarLayerImpl>( - HORIZONTAL, kThumbThickness, kTrackStart, - kIsLeftSideVerticalScrollbar, kIsOverlayScrollbar); + impl.AddLayer<SolidColorScrollbarLayerImpl>(HORIZONTAL, kThumbThickness, + kTrackStart, + kIsLeftSideVerticalScrollbar); scrollbar_layer->SetScrollElementId(scroll_layer->element_id()); EXPECT_TRUE(impl.host_impl()->active_tree()->ScrollbarGeometriesNeedUpdate()); impl.host_impl()->active_tree()->UpdateScrollbarGeometries(); @@ -951,24 +946,13 @@ const int kThumbThickness = 3; const int kTrackStart = 0; const bool kIsLeftSideVerticalScrollbar = false; - const bool kIsOverlayScrollbar = false; - horizontal_scrollbar_layer_ = - SolidColorScrollbarLayerImpl::Create(host_impl_->active_tree(), - 1, - HORIZONTAL, - kThumbThickness, - kTrackStart, - kIsLeftSideVerticalScrollbar, - kIsOverlayScrollbar); - vertical_scrollbar_layer_ = - SolidColorScrollbarLayerImpl::Create(host_impl_->active_tree(), - 2, - VERTICAL, - kThumbThickness, - kTrackStart, - kIsLeftSideVerticalScrollbar, - kIsOverlayScrollbar); + horizontal_scrollbar_layer_ = SolidColorScrollbarLayerImpl::Create( + host_impl_->active_tree(), 1, HORIZONTAL, kThumbThickness, kTrackStart, + kIsLeftSideVerticalScrollbar); + vertical_scrollbar_layer_ = SolidColorScrollbarLayerImpl::Create( + host_impl_->active_tree(), 2, VERTICAL, kThumbThickness, kTrackStart, + kIsLeftSideVerticalScrollbar); } protected: @@ -1054,7 +1038,7 @@ std::unique_ptr<Scrollbar> scrollbar(new FakeScrollbar(false, true, false)); scoped_refptr<Layer> layer_tree_root = Layer::Create(); scoped_refptr<Layer> content_layer = Layer::Create(); - scoped_refptr<Layer> scrollbar_layer; + scoped_refptr<ScrollbarLayerBase> scrollbar_layer; if (use_solid_color_scrollbar) { const int kThumbThickness = 3; const int kTrackStart = 0; @@ -1062,13 +1046,10 @@ scrollbar_layer = SolidColorScrollbarLayer::Create( scrollbar->Orientation(), kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar); - static_cast<SolidColorScrollbarLayer*>(scrollbar_layer.get()) - ->SetScrollElementId(layer_tree_root->element_id()); } else { scrollbar_layer = PaintedScrollbarLayer::Create(std::move(scrollbar)); - static_cast<PaintedScrollbarLayer*>(scrollbar_layer.get()) - ->SetScrollElementId(layer_tree_root->element_id()); } + scrollbar_layer->SetScrollElementId(layer_tree_root->element_id()); layer_tree_root->AddChild(content_layer); layer_tree_root->AddChild(scrollbar_layer);
diff --git a/cc/layers/solid_color_scrollbar_layer.cc b/cc/layers/solid_color_scrollbar_layer.cc index edf26390..92e321f 100644 --- a/cc/layers/solid_color_scrollbar_layer.cc +++ b/cc/layers/solid_color_scrollbar_layer.cc
@@ -13,10 +13,9 @@ std::unique_ptr<LayerImpl> SolidColorScrollbarLayer::CreateLayerImpl( LayerTreeImpl* tree_impl) { - const bool kIsOverlayScrollbar = true; - return SolidColorScrollbarLayerImpl::Create( - tree_impl, id(), orientation_, thumb_thickness_, track_start_, - is_left_side_vertical_scrollbar_, kIsOverlayScrollbar); + return SolidColorScrollbarLayerImpl::Create(tree_impl, id(), orientation_, + thumb_thickness_, track_start_, + is_left_side_vertical_scrollbar_); } scoped_refptr<SolidColorScrollbarLayer> SolidColorScrollbarLayer::Create( @@ -39,7 +38,6 @@ track_start_(track_start), is_left_side_vertical_scrollbar_(is_left_side_vertical_scrollbar) { Layer::SetOpacity(0.f); - SetIsScrollbar(true); } SolidColorScrollbarLayer::~SolidColorScrollbarLayer() = default; @@ -50,16 +48,6 @@ Layer::SetOpacity(opacity); } -void SolidColorScrollbarLayer::PushPropertiesTo(LayerImpl* layer) { - Layer::PushPropertiesTo(layer); - SolidColorScrollbarLayerImpl* scrollbar_layer = - static_cast<SolidColorScrollbarLayerImpl*>(layer); - - DCHECK(!scrollbar_layer->HitTestable()); - - scrollbar_layer->SetScrollElementId(scroll_element_id_); -} - void SolidColorScrollbarLayer::SetNeedsDisplayRect(const gfx::Rect& rect) { // Never needs repaint. } @@ -68,14 +56,6 @@ return true; } -void SolidColorScrollbarLayer::SetScrollElementId(ElementId element_id) { - if (element_id == scroll_element_id_) - return; - - scroll_element_id_ = element_id; - SetNeedsCommit(); -} - bool SolidColorScrollbarLayer::HitTestable() const { // Android scrollbars can't be interacted with by user input. They should // avoid hit testing so we don't enter any scrollbar scrolling code paths.
diff --git a/cc/layers/solid_color_scrollbar_layer.h b/cc/layers/solid_color_scrollbar_layer.h index c759ae5..8aed2f50 100644 --- a/cc/layers/solid_color_scrollbar_layer.h +++ b/cc/layers/solid_color_scrollbar_layer.h
@@ -7,12 +7,11 @@ #include "cc/cc_export.h" #include "cc/layers/layer.h" -#include "cc/layers/scrollbar_layer_interface.h" +#include "cc/layers/scrollbar_layer_base.h" namespace cc { -class CC_EXPORT SolidColorScrollbarLayer : public ScrollbarLayerInterface, - public Layer { +class CC_EXPORT SolidColorScrollbarLayer : public ScrollbarLayerBase { public: std::unique_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override; @@ -27,17 +26,10 @@ // Layer overrides. bool OpacityCanAnimateOnImplThread() const override; - void SetOpacity(float opacity) override; - void PushPropertiesTo(LayerImpl* layer) override; - void SetNeedsDisplayRect(const gfx::Rect& rect) override; - bool HitTestable() const override; - // ScrollbarLayerInterface - void SetScrollElementId(ElementId element_id) override; - protected: SolidColorScrollbarLayer(ScrollbarOrientation orientation, int thumb_thickness, @@ -45,7 +37,6 @@ bool is_left_side_vertical_scrollbar); ~SolidColorScrollbarLayer() override; - ElementId scroll_element_id_; ScrollbarOrientation orientation_; int thumb_thickness_; int track_start_;
diff --git a/cc/layers/solid_color_scrollbar_layer_impl.cc b/cc/layers/solid_color_scrollbar_layer_impl.cc index b96e4bc3..e37741c 100644 --- a/cc/layers/solid_color_scrollbar_layer_impl.cc +++ b/cc/layers/solid_color_scrollbar_layer_impl.cc
@@ -18,24 +18,19 @@ ScrollbarOrientation orientation, int thumb_thickness, int track_start, - bool is_left_side_vertical_scrollbar, - bool is_overlay) { + bool is_left_side_vertical_scrollbar) { return base::WrapUnique(new SolidColorScrollbarLayerImpl( tree_impl, id, orientation, thumb_thickness, track_start, - is_left_side_vertical_scrollbar, is_overlay)); + is_left_side_vertical_scrollbar)); } SolidColorScrollbarLayerImpl::~SolidColorScrollbarLayerImpl() = default; std::unique_ptr<LayerImpl> SolidColorScrollbarLayerImpl::CreateLayerImpl( LayerTreeImpl* tree_impl) { - return SolidColorScrollbarLayerImpl::Create(tree_impl, - id(), - orientation(), - thumb_thickness_, - track_start_, - is_left_side_vertical_scrollbar(), - is_overlay_scrollbar()); + return SolidColorScrollbarLayerImpl::Create( + tree_impl, id(), orientation(), thumb_thickness_, track_start_, + is_left_side_vertical_scrollbar()); } SolidColorScrollbarLayerImpl::SolidColorScrollbarLayerImpl( @@ -44,17 +39,15 @@ ScrollbarOrientation orientation, int thumb_thickness, int track_start, - bool is_left_side_vertical_scrollbar, - bool is_overlay) + bool is_left_side_vertical_scrollbar) : ScrollbarLayerImplBase(tree_impl, id, orientation, is_left_side_vertical_scrollbar, - is_overlay), + /*is_overlay*/ true), thumb_thickness_(thumb_thickness), track_start_(track_start), - color_(tree_impl->settings().solid_color_scrollbar_color) { -} + color_(tree_impl->settings().solid_color_scrollbar_color) {} void SolidColorScrollbarLayerImpl::PushPropertiesTo(LayerImpl* layer) { ScrollbarLayerImplBase::PushPropertiesTo(layer);
diff --git a/cc/layers/solid_color_scrollbar_layer_impl.h b/cc/layers/solid_color_scrollbar_layer_impl.h index 710b4d6..7a3a72d 100644 --- a/cc/layers/solid_color_scrollbar_layer_impl.h +++ b/cc/layers/solid_color_scrollbar_layer_impl.h
@@ -18,8 +18,7 @@ ScrollbarOrientation orientation, int thumb_thickness, int track_start, - bool is_left_side_vertical_scrollbar, - bool is_overlay); + bool is_left_side_vertical_scrollbar); ~SolidColorScrollbarLayerImpl() override; // LayerImpl overrides. @@ -37,8 +36,7 @@ ScrollbarOrientation orientation, int thumb_thickness, int track_start, - bool is_left_side_vertical_scrollbar, - bool is_overlay); + bool is_left_side_vertical_scrollbar); // ScrollbarLayerImplBase implementation. int ThumbLength() const override;
diff --git a/cc/layers/solid_color_scrollbar_layer_impl_unittest.cc b/cc/layers/solid_color_scrollbar_layer_impl_unittest.cc index 5f1b460..8544ce17 100644 --- a/cc/layers/solid_color_scrollbar_layer_impl_unittest.cc +++ b/cc/layers/solid_color_scrollbar_layer_impl_unittest.cc
@@ -22,12 +22,11 @@ int thumb_thickness = layer_size.width(); int track_start = 0; bool is_left_side_vertical_scrollbar = false; - bool is_overlay = false; SolidColorScrollbarLayerImpl* scrollbar_layer_impl = impl.AddLayer<SolidColorScrollbarLayerImpl>( orientation, thumb_thickness, track_start, - is_left_side_vertical_scrollbar, is_overlay); + is_left_side_vertical_scrollbar); scrollbar_layer_impl->SetBounds(layer_size); scrollbar_layer_impl->SetDrawsContent(true); scrollbar_layer_impl->SetCurrentPos(25.f);
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index c81c31a..986eca85 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -3498,7 +3498,7 @@ host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, 1.f, 4.f); auto* scrollbar = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->active_tree(), VERTICAL, 10, 0, false, true); + host_impl_->active_tree(), VERTICAL, 10, 0, false); SetupScrollbarLayer(OuterViewportScrollLayer(), scrollbar); host_impl_->active_tree()->DidBecomeActive(); @@ -3712,7 +3712,7 @@ LayerImpl* scroll = host_impl_->pending_tree()->OuterViewportScrollLayerForTesting(); auto* scrollbar = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->pending_tree(), VERTICAL, 10, 0, false, true); + host_impl_->pending_tree(), VERTICAL, 10, 0, false); SetupScrollbarLayer(scroll, scrollbar); scrollbar->SetOffsetToTransformParent(gfx::Vector2dF(90, 0)); @@ -3807,7 +3807,7 @@ // scrollbar_1 on root scroll. scrollbar_1_ = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->active_tree(), VERTICAL, 15, 0, true, true); + host_impl_->active_tree(), VERTICAL, 15, 0, true); SetupScrollbarLayer(root_scroll, scrollbar_1_); scrollbar_1_->SetBounds(scrollbar_size_1); TouchActionRegion touch_action_region; @@ -3820,7 +3820,7 @@ GetTransformNode(child)->post_translation = gfx::Vector2dF(50, 50); scrollbar_2_ = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->active_tree(), VERTICAL, 15, 0, true, true); + host_impl_->active_tree(), VERTICAL, 15, 0, true); SetupScrollbarLayer(child, scrollbar_2_); scrollbar_2_->SetBounds(scrollbar_size_2); @@ -3998,7 +3998,7 @@ LayerImpl* scroll = host_impl_->pending_tree()->OuterViewportScrollLayerForTesting(); auto* scrollbar = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->pending_tree(), VERTICAL, 10, 0, false, true); + host_impl_->pending_tree(), VERTICAL, 10, 0, false); SetupScrollbarLayer(scroll, scrollbar); scrollbar->SetOffsetToTransformParent(gfx::Vector2dF(90, 0)); @@ -4089,19 +4089,19 @@ auto* container = InnerViewportScrollLayer(); auto* root_scroll = OuterViewportScrollLayer(); auto* vert_1_scrollbar = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->active_tree(), VERTICAL, 5, 5, true, true); + host_impl_->active_tree(), VERTICAL, 5, 5, true); CopyProperties(container, vert_1_scrollbar); auto* horiz_1_scrollbar = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->active_tree(), HORIZONTAL, 5, 5, true, true); + host_impl_->active_tree(), HORIZONTAL, 5, 5, true); CopyProperties(container, horiz_1_scrollbar); auto* vert_2_scrollbar = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->active_tree(), VERTICAL, 5, 5, true, true); + host_impl_->active_tree(), VERTICAL, 5, 5, true); CopyProperties(container, vert_2_scrollbar); auto* horiz_2_scrollbar = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->active_tree(), HORIZONTAL, 5, 5, true, true); + host_impl_->active_tree(), HORIZONTAL, 5, 5, true); CopyProperties(container, horiz_2_scrollbar); UpdateDrawProperties(host_impl_->active_tree()); @@ -4177,7 +4177,7 @@ auto* root_scroll = OuterViewportScrollLayer(); auto* vert_scrollbar = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->active_tree(), VERTICAL, 5, 0, false, true); + host_impl_->active_tree(), VERTICAL, 5, 0, false); SetupScrollbarLayer(root_scroll, vert_scrollbar); vert_scrollbar->SetBounds(gfx::Size(10, 200)); vert_scrollbar->SetOffsetToTransformParent(gfx::Vector2dF(300, 0)); @@ -4238,7 +4238,7 @@ LayerImpl* root_scroll = OuterViewportScrollLayer(); // The scrollbar is on the left side. auto* scrollbar = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->active_tree(), VERTICAL, 15, 0, true, true); + host_impl_->active_tree(), VERTICAL, 15, 0, true); SetupScrollbarLayer(root_scroll, scrollbar); scrollbar->SetBounds(scrollbar_size); TouchActionRegion touch_action_region; @@ -5170,7 +5170,7 @@ // Create a horizontal scrollbar. gfx::Size scrollbar_size(gfx::Size(50, 15)); auto* scrollbar_layer = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->active_tree(), HORIZONTAL, 3, 20, false, true); + host_impl_->active_tree(), HORIZONTAL, 3, 20, false); SetupScrollbarLayer(OuterViewportScrollLayer(), scrollbar_layer); scrollbar_layer->SetBounds(scrollbar_size); TouchActionRegion touch_action_region; @@ -12207,7 +12207,7 @@ // scrollbar_1 on root scroll. auto* scrollbar_1 = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->active_tree(), VERTICAL, 15, 0, true, true); + host_impl_->active_tree(), VERTICAL, 15, 0, true); SetupScrollbarLayer(root_scroll, scrollbar_1); scrollbar_1->SetBounds(scrollbar_size_1); TouchActionRegion touch_action_region; @@ -12292,7 +12292,7 @@ // scrollbar_2 on child. auto* scrollbar_2 = AddLayer<SolidColorScrollbarLayerImpl>( - host_impl_->active_tree(), VERTICAL, 15, 0, true, true); + host_impl_->active_tree(), VERTICAL, 15, 0, true); LayerImpl* child = AddScrollableLayer(root_scroll, gfx::Size(100, 100), child_layer_size); child->SetOffsetToTransformParent(gfx::Vector2dF(50, 50)); @@ -13366,7 +13366,7 @@ AddScrollableLayer(root, viewport_size, scroll_content_size); auto* scrollbar = AddLayer<SolidColorScrollbarLayerImpl>( - layer_tree_impl, VERTICAL, 10, 0, false, true); + layer_tree_impl, VERTICAL, 10, 0, false); SetupScrollbarLayer(content, scrollbar); scrollbar->SetBounds(scrollbar_size); scrollbar->SetOffsetToTransformParent(gfx::Vector2dF(345, 0));
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java index 02646e5..c4573d4 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java
@@ -53,7 +53,7 @@ // TODO(crbug.com/806868): Create a more specific test site for overlay testing. private static final String TEST_PAGE = - "/components/test/data/autofill_assistant/autofill_assistant_target_website.html"; + "/components/test/data/autofill_assistant/html/autofill_assistant_target_website.html"; @Before public void setUp() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java index c63ea9e..ddc54f8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
@@ -10,7 +10,6 @@ import android.graphics.RectF; import org.chromium.base.ActivityState; -import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeFeatureList; @@ -23,7 +22,6 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; import org.chromium.chrome.browser.compositor.scene_layer.ContextualSearchSceneLayer; import org.chromium.chrome.browser.compositor.scene_layer.SceneOverlayLayer; -import org.chromium.chrome.browser.contextualsearch.ContextualSearchFieldTrial; import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDelegate; import org.chromium.chrome.browser.contextualsearch.ResolvedSearchTerm.CardTag; import org.chromium.chrome.browser.profiles.Profile; @@ -36,8 +34,6 @@ * Controls the Contextual Search Panel. */ public class ContextualSearchPanel extends OverlayPanel { - /** The number of times to allow scrolling. After this limit we'll close. */ - private static final int SCROLL_COUNT_LIMIT = 3; /** Restricts the maximized panel height to the given fraction of a tab. */ private static final float MAXIMIZED_HEIGHT_FRACTION = 0.95f; @@ -45,9 +41,6 @@ /** Used for logging state changes. */ private final ContextualSearchPanelMetrics mPanelMetrics; - /** The height of the bar shadow, in pixels. */ - private final float mBarShadowHeightPx; - /** The distance of the divider from the end of the bar, in dp. */ private final float mEndButtonWidthDp; @@ -75,9 +68,6 @@ */ private ScrimParams mScrimParams; - /** Number of times the panel has been scrolled already. */ - private int mScrollCount; - // ============================================================================================ // Constructor // ============================================================================================ @@ -93,10 +83,6 @@ mSceneLayer = createNewContextualSearchSceneLayer(); mPanelMetrics = new ContextualSearchPanelMetrics(); - mBarShadowHeightPx = - ApiCompatibilityUtils - .getDrawable(mContext.getResources(), R.drawable.modern_toolbar_shadow) - .getIntrinsicHeight(); mEndButtonWidthDp = mContext.getResources().getDimensionPixelSize( R.dimen.contextual_search_padded_button_width) * mPxToDp; @@ -236,7 +222,6 @@ setProgressBarCompletion(0); setProgressBarVisible(false); getImageControl().hideCustomImage(false); - mScrollCount = 0; super.onClosed(reason); @@ -465,28 +450,6 @@ } /** - * Makes the panel not visible by either hiding it or closing it completely. - * Decides which method is most appropriate, and then makes it not visible based on that - * decision. - * @param reason The reason we want the panel to not be visible. - */ - public void makePanelNotVisible(@StateChangeReason int reason) { - if (++mScrollCount >= SCROLL_COUNT_LIMIT) { - closePanel(StateChangeReason.BASE_PAGE_SCROLL, true); - } else if (isHideDuringScrollEnabled()) { - hidePanel(reason); - } - } - - /** @return whether hiding during scrolling is enabled for the Longpress-Resolve feature. */ - private boolean isHideDuringScrollEnabled() { - return ContextualSearchFieldTrial.LONGPRESS_RESOLVE_HIDE_ON_SCROLL.equals( - ChromeFeatureList.getFieldTrialParamByFeature( - ChromeFeatureList.CONTEXTUAL_SEARCH_LONGPRESS_RESOLVE, - ContextualSearchFieldTrial.LONGPRESS_RESOLVE_PARAM_NAME)); - } - - /** * Called after the panel has navigated to prefetched Search Results. * If the user has the panel open then they will see the prefetched result starting to load. * Currently this just logs the time between the start of the search until the results start to
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchContext.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchContext.java index 5e4b951..8cef9a45 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchContext.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchContext.java
@@ -282,6 +282,7 @@ * Specifies that this resolve must return a non-expanding result. */ void setRestrictedResolve() { + // TODO(donnd): Improve by sending full context plus a boolean. mSurroundingText = mInitialSelectedWord; mSelectionStartOffset = 0; mSelectionEndOffset = mSurroundingText.length();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java index 33dd7e8a..44061ca0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
@@ -26,8 +26,6 @@ // Public settings synchronized with src/components/contextual_search/core/browser/public.cc //========================================================================================== public static final String LONGPRESS_RESOLVE_PARAM_NAME = "longpress_resolve_variation"; - public static final String LONGPRESS_RESOLVE_HIDE_ON_SCROLL = "1"; - public static final String LONGPRESS_RESOLVE_PRIVACY_AGGRESSIVE = "2"; public static final String LONGPRESS_RESOLVE_PRESERVE_TAP = "3"; //==========================================================================================
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java index 439b00a8..f60adde 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
@@ -23,7 +23,6 @@ import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeActivity; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.compositor.bottombar.OverlayContentDelegate; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.PanelState; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason; @@ -1351,12 +1350,7 @@ public void handleScrollStart() { if (mIsAccessibilityModeEnabled) return; - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.CONTEXTUAL_SEARCH_LONGPRESS_RESOLVE) - || mSelectionController.getSelectionType() == SelectionType.TAP) { - hideContextualSearch(StateChangeReason.BASE_PAGE_SCROLL); - } else if (mSelectionController.getSelectionType() == SelectionType.RESOLVING_LONG_PRESS) { - mSearchPanel.makePanelNotVisible(StateChangeReason.BASE_PAGE_SCROLL); - } + hideContextualSearch(StateChangeReason.BASE_PAGE_SCROLL); } @Override @@ -1681,11 +1675,8 @@ String selection = mSelectionController.getSelectedText(); assert !TextUtils.isEmpty(selection); - boolean isRestrictedResolve = - mPolicy.isPrivacyAggressiveResolveEnabled() && mPolicy.isPromoAvailable() - || mSelectionController.isAdjustedSelection(); mNetworkCommunicator.startSearchTermResolutionRequest( - selection, isRestrictedResolve); + selection, mSelectionController.isAdjustedSelection()); // If the we were unable to start the resolve, we've hidden the UI and set the // context to null. if (mContext == null || mSearchPanel == null) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java index 6cbf30a..046a1774 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
@@ -147,11 +147,6 @@ return false; } - if (isPrivacyAggressiveResolveEnabled() - && mSelectionController.getSelectionType() == SelectionType.RESOLVING_LONG_PRESS) { - return true; - } - return isPromoAvailable() ? isBasePageHTTP(mNetworkCommunicator.getBasePageUrl()) : true; } @@ -255,29 +250,10 @@ * is no existing request. */ boolean shouldCreateVerbatimRequest() { - if (isPrivacyAggressiveResolveEnabled()) return false; - @SelectionType int selectionType = mSelectionController.getSelectionType(); return (mSelectionController.getSelectedText() != null - && (selectionType == SelectionType.LONG_PRESS - || (selectionType == SelectionType.TAP - && !shouldPreviousGestureResolve()))); - } - - /** - * Returns whether doing a privacy aggressive resolve is enabled (as opposed to privacy - * conservative). When this is enabled, the selection is sent to the server immediately instead - * of waiting for the panel to be opened. This allows the server to resolve the selection which - * will recognize entities, etc. and display those attributes in the Bar. - * @return Whether the privacy-aggressive behavior of immediately sending the selection to the - * server is enabled. - */ - boolean isPrivacyAggressiveResolveEnabled() { - return ContextualSearchFieldTrial.LONGPRESS_RESOLVE_PRIVACY_AGGRESSIVE.equals( - ChromeFeatureList.getFieldTrialParamByFeature( - ChromeFeatureList.CONTEXTUAL_SEARCH_LONGPRESS_RESOLVE, - ContextualSearchFieldTrial.LONGPRESS_RESOLVE_PARAM_NAME)); + && (selectionType == SelectionType.LONG_PRESS || !shouldPreviousGestureResolve())); } /** @return whether Tap is disabled due to the longpress experiment. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java index e7d75af..07013a5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java
@@ -72,7 +72,6 @@ private boolean mWasTapGestureDetected; // Reflects whether the last tap was valid and whether we still have a tap-based selection. private ContextualSearchTapState mLastTapState; - private boolean mShouldHandleSelectionModification; // Whether the selection was automatically expanded due to an adjustment (e.g. Resolve). private boolean mDidExpandSelection; @@ -100,9 +99,9 @@ private boolean mClearingSelection; /** - * Whether the current selection has been adjusted or not. If it has been adjusted we must - * request a resolve for this exact term rather than anything that overlaps as we get with - * normal expanding resolves. + * Whether the current selection has been adjusted or not. If the user has adjusted the + * selection we must request a resolve for this exact term rather than anything that overlaps, + * and not expand the selection (since it was explicitly set by the user). */ private boolean mIsAdjustedSelection; @@ -173,14 +172,6 @@ * @param reason The reason for ending the Contextual Search. */ void onSearchEnded(@OverlayPanel.StateChangeReason int reason) { - // If the user explicitly closes the panel after establishing a selection with long press, - // it should not reappear until a new selection is made. This prevents the panel from - // reappearing when a long press selection is modified after the user has taken action to - // get rid of the panel. See crbug.com/489461. - if (shouldPreventHandlingCurrentSelectionModification(reason)) { - preventHandlingCurrentSelectionModification(); - } - // Long press selections should remain visible after ending a Contextual Search. if (mSelectionType == SelectionType.TAP) clearSelection(); } @@ -334,7 +325,7 @@ resetAllStates(); break; case SelectionEventType.SELECTION_HANDLE_DRAG_STOPPED: - shouldHandleSelection = mShouldHandleSelectionModification; + shouldHandleSelection = true; mIsAdjustedSelection = true; break; default: @@ -356,7 +347,6 @@ * @param type The type of selection made by the user. */ private void handleSelection(String selection, @SelectionType int type) { - mShouldHandleSelectionModification = true; boolean isValidSelection = validateSelectionSuppression(selection); mHandler.handleSelection(selection, isValidSelection, type, mX, mY); } @@ -520,37 +510,6 @@ } // ============================================================================================ - // Selection Modification - // ============================================================================================ - - /** - * This method checks whether the selection modification should be handled. This method - * is needed to allow modifying selections that are occluded by the Panel. - * See crbug.com/489461. - * - * @param reason The reason the panel is closing. - * @return Whether the selection modification should be handled. - */ - private boolean shouldPreventHandlingCurrentSelectionModification( - @OverlayPanel.StateChangeReason int reason) { - return getSelectionType() == SelectionType.LONG_PRESS - && (reason == OverlayPanel.StateChangeReason.BACK_PRESS - || reason == OverlayPanel.StateChangeReason.BASE_PAGE_SCROLL - || reason == OverlayPanel.StateChangeReason.SWIPE - || reason == OverlayPanel.StateChangeReason.FLING - || reason == OverlayPanel.StateChangeReason.CLOSE_BUTTON); - } - - /** - * Temporarily prevents the controller from handling selection modification events on the - * current selection. Handling will be re-enabled when a new selection is made through either a - * tap or long press. - */ - private void preventHandlingCurrentSelectionModification() { - mShouldHandleSelectionModification = false; - } - - // ============================================================================================ // Misc. // ============================================================================================
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java index c29743b..0eb2ed8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -3172,26 +3172,4 @@ Assert.assertEquals("States", getSelectedText()); waitForPanelToPeek(); } - - @Test - @SmallTest - @Feature({"ContextualSearch"}) - @CommandLineFlags.Add({"enable-features=ContextualSearchLongpressResolve<FakeStudyName", - "force-fieldtrials=FakeStudyName/FakeGroup", - "force-fieldtrial-params=FakeStudyName.FakeGroup:longpress_resolve_variation/" - + ContextualSearchFieldTrial.LONGPRESS_RESOLVE_PRIVACY_AGGRESSIVE}) - public void - testLongpressResolvesWithLongpressResolveEnabledAndVariationPrivacyAggressive() - throws TimeoutException { - mPolicy.overrideDecidedStateForTesting(false); - mFakeServer.setShouldUseHttps(true); - longPressNode("states"); - assertLoadedNoUrl(); - assertSearchTermRequested(); - - fakeResponse(false, 200, "states", "United States Intelligence", "alternate-term", false); - waitForPanelToPeek(); - assertLoadedLowPriorityUrl(); - assertContainsParameters("states", "alternate-term"); - } }
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 6e6aa09..67ae427 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -2498,13 +2498,16 @@ <!-- Cookie controls strings. --> <message name="IDS_COOKIE_CONTROLS_DIALOG_TITLE" desc="Title of the dialog that allows users to control cookie blocking."> - Third-party cookie blocking is on + {COUNT, plural, + =0 {No third-party cookies} + =1 {1 third-party cookie is blocked} + other {# third-party cookies are blocked}} </message> <message name="IDS_COOKIE_CONTROLS_DIALOG_TITLE_OFF" desc="Text shown in the dialog that allows users to control cookie blocking. Shown when cookie blocking was disabled for this specific site."> - Third-party cookie blocking is turned off for this site + Third-party cookies are allowed on this site </message> <message name="IDS_COOKIE_CONTROLS_TURN_ON_BUTTON" desc="Label shown on a button that turns cookie blocking on after it was disabled for a specific site."> - Turn on + Block cookies </message> <message name="IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON" desc="Label shown on a button that turns off cookie blocking for a specific site."> Turn off for this site @@ -2512,14 +2515,17 @@ <message name="IDS_COOKIE_CONTROLS_NOT_WORKING_TITLE" desc="Label shown on a dialog that allows users to turn off third-party cookie blocking for a specific site."> Site not working? </message> + <message name="IDS_COOKIE_CONTROLS_TURNED_ON_TITLE" desc="Label shown to a user after cookie blocking has been turned on for a specific site."> + Third-party cookie blocking is on + </message> <message name="IDS_COOKIE_CONTROLS_NOT_WORKING_DESCRIPTION" desc="Label shown on a dialog that allows users to turn off third-party cookie blocking for a specific site."> Some sites use third-party cookies to load their pages. If a site isn't working, you can try turning off cookie blocking. </message> - <message name="IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE" desc="Text shown in the dialog that allows users to control cookie blocking. Shows the number of sites for which cookies have been blocked."> - {COUNT, plural, - =0 {This site doesn't use cookies for cross-site tracking} - =1 {Chrome is blocking cookies from 1 site} - other {Chrome is blocking cookies from # sites}} + <message name="IDS_COOKIE_CONTROLS_NOTHING_BLOCKED_MESSAGE" desc="Text shown in the dialog that allows users to control cookie blocking."> + This site is free of cookies that can be used to track you across the web + </message> + <message name="IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE" desc="Text shown in the dialog that allows users to control cookie blocking."> + Chrome is blocking cookies that can be used to track you across the web </message> <message name="IDS_COOKIE_CONTROLS_TOOLTIP" desc="Tooltip shown on a page action icon that is shown when cookie blocking is enabled."> Third-party cookie blocking
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE.png.sha1 new file mode 100644 index 0000000..cedf0d2 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE.png.sha1
@@ -0,0 +1 @@ +35cf61169272da7e8e35f0b4cc77bf41082baf48 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_DIALOG_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_DIALOG_TITLE.png.sha1 new file mode 100644 index 0000000..073b534 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_DIALOG_TITLE.png.sha1
@@ -0,0 +1 @@ +18cbca2a59506a01b12ce7e0de6ad7a5d54dfc23 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_DIALOG_TITLE_OFF.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_DIALOG_TITLE_OFF.png.sha1 new file mode 100644 index 0000000..b9badb9a --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_DIALOG_TITLE_OFF.png.sha1
@@ -0,0 +1 @@ +dac2e1b0f064051d79c5270a743d2ec7b3225f6c \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_NOTHING_BLOCKED_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_NOTHING_BLOCKED_MESSAGE.png.sha1 new file mode 100644 index 0000000..91e5213 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_NOTHING_BLOCKED_MESSAGE.png.sha1
@@ -0,0 +1 @@ +297129e478e4fe2073e74cde18acdbe71b455756 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURNED_ON_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURNED_ON_TITLE.png.sha1 new file mode 100644 index 0000000..6fc751e --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURNED_ON_TITLE.png.sha1
@@ -0,0 +1 @@ +f75771d80ea4534f8aee1f9e9a6786947ccdffbc \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON.png.sha1 new file mode 100644 index 0000000..9891671 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON.png.sha1
@@ -0,0 +1 @@ +55ec4ca6ba6aab18bf86f0b48b708e781a507e28 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURN_ON_BUTTON.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURN_ON_BUTTON.png.sha1 new file mode 100644 index 0000000..b9badb9a --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURN_ON_BUTTON.png.sha1
@@ -0,0 +1 @@ +dac2e1b0f064051d79c5270a743d2ec7b3225f6c \ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 15edad8..3003eff 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1130,19 +1130,10 @@ const FeatureEntry::FeatureVariation kSimplifiedServerVariations[] = { {"and allow all CoCa cards", &kSimplifiedServerAllCocaCards, 1, nullptr}}; -const FeatureEntry::FeatureParam kLongpressResolveHideOnScroll = { - contextual_search::kLongpressResolveParamName, - contextual_search::kLongpressResolveHideOnScroll}; -const FeatureEntry::FeatureParam kLongpressResolvePrivacyAggressive = { - contextual_search::kLongpressResolveParamName, - contextual_search::kLongpressResolvePrivacyAggressive}; const FeatureEntry::FeatureParam kLongpressResolvePreserveTap = { contextual_search::kLongpressResolveParamName, contextual_search::kLongpressResolvePreserveTap}; const FeatureEntry::FeatureVariation kLongpressResolveVariations[] = { - {"and hide on scroll", &kLongpressResolveHideOnScroll, 1, nullptr}, - {"and allow privacy-aggressive behavior", - &kLongpressResolvePrivacyAggressive, 1, nullptr}, {"and preserve Tap behavior", &kLongpressResolvePreserveTap, 1, nullptr}, };
diff --git a/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.cc b/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.cc index 8e848f2..5d96f57 100644 --- a/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.cc +++ b/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.cc
@@ -26,9 +26,14 @@ : browser_context_(browser_context), event_router_(EventRouter::Get(browser_context)), print_job_history_service_observer_(this) { - print_job_history_service_observer_.Add( + auto* history_service = chromeos::PrintJobHistoryServiceFactory::GetForBrowserContext( - browser_context)); + browser_context); + + // The print job history service is not available on the lock screen. + if (history_service) { + print_job_history_service_observer_.Add(history_service); + } } PrintJobFinishedEventDispatcher::~PrintJobFinishedEventDispatcher() {}
diff --git a/chrome/browser/chromeos/note_taking_helper.cc b/chrome/browser/chromeos/note_taking_helper.cc index a24299b..ee4c8762 100644 --- a/chrome/browser/chromeos/note_taking_helper.cc +++ b/chrome/browser/chromeos/note_taking_helper.cc
@@ -10,6 +10,7 @@ #include "apps/launcher.h" #include "ash/public/cpp/stylus_utils.h" #include "base/bind.h" +#include "base/bind_helpers.h" #include "base/command_line.h" #include "base/files/file_path.h" #include "base/logging.h" @@ -29,6 +30,7 @@ #include "components/arc/arc_service_manager.h" #include "components/arc/intent_helper/arc_intent_helper_bridge.h" #include "components/arc/metrics/arc_metrics_constants.h" +#include "components/arc/mojom/file_system.mojom.h" #include "components/arc/session/arc_bridge_service.h" #include "components/prefs/pref_service.h" #include "components/prefs/scoped_user_pref_update.h" @@ -478,6 +480,20 @@ weak_ptr_factory_.GetWeakPtr())); } +arc::mojom::ActivityNamePtr AppIdToActivityName(const std::string& id) { + auto name = arc::mojom::ActivityName::New(); + + const size_t separator = id.find('/'); + if (separator == std::string::npos) { + name->package_name = id; + name->activity_name = std::string(); + } else { + name->package_name = id.substr(0, separator); + name->activity_name = id.substr(separator + 1); + } + return name; +} + void NoteTakingHelper::OnGotAndroidApps( std::vector<arc::mojom::IntentHandlerInfoPtr> handlers) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -497,6 +513,21 @@ observer.OnAvailableNoteTakingAppsUpdated(); } +arc::mojom::OpenUrlsRequestPtr CreateArcNoteRequest(const std::string& app_id, + const GURL& clip_data_uri) { + auto request = arc::mojom::OpenUrlsRequest::New(); + request->action_type = arc::mojom::ActionType::CREATE_NOTE; + request->activity_name = AppIdToActivityName(app_id); + if (!clip_data_uri.is_empty()) { + auto url_with_type = arc::mojom::ContentUrlWithMimeType::New(); + url_with_type->content_url = clip_data_uri; + url_with_type->mime_type = "image/png"; + request->urls.push_back(std::move(url_with_type)); + } + + return request; +} + NoteTakingHelper::LaunchResult NoteTakingHelper::LaunchAppInternal( Profile* profile, const std::string& app_id, @@ -531,7 +562,15 @@ // TODO(derat): Is there some way to detect whether this fails due to the // package no longer being available? - helper->HandleIntent(CreateIntentInfo(clip_data_uri), std::move(activity)); + auto request = CreateArcNoteRequest(app_id, clip_data_uri); + arc::mojom::FileSystemInstance* arc_file_system = + ARC_GET_INSTANCE_FOR_METHOD( + arc::ArcServiceManager::Get()->arc_bridge_service()->file_system(), + OpenUrlsWithPermission); + if (!arc_file_system) + return LaunchResult::ANDROID_NOT_RUNNING; + arc_file_system->OpenUrlsWithPermission(std::move(request), + base::DoNothing()); UMA_HISTOGRAM_ENUMERATION( "Arc.UserInteraction",
diff --git a/chrome/browser/chromeos/note_taking_helper_unittest.cc b/chrome/browser/chromeos/note_taking_helper_unittest.cc index 12ec36c..e473db6 100644 --- a/chrome/browser/chromeos/note_taking_helper_unittest.cc +++ b/chrome/browser/chromeos/note_taking_helper_unittest.cc
@@ -17,6 +17,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "chrome/browser/chrome_notification_types.h" +#include "chrome/browser/chromeos/arc/fileapi/arc_file_system_bridge.h" #include "chrome/browser/chromeos/file_manager/path_util.h" #include "chrome/browser/chromeos/note_taking_controller_client.h" #include "chrome/browser/extensions/extension_service.h" @@ -33,9 +34,11 @@ #include "components/arc/arc_service_manager.h" #include "components/arc/arc_util.h" #include "components/arc/intent_helper/arc_intent_helper_bridge.h" +#include "components/arc/mojom/file_system.mojom.h" #include "components/arc/mojom/intent_helper.mojom.h" #include "components/arc/session/arc_bridge_service.h" #include "components/arc/test/connection_holder_util.h" +#include "components/arc/test/fake_file_system_instance.h" #include "components/arc/test/fake_intent_helper_instance.h" #include "components/crx_file/id_util.h" #include "components/sync_preferences/testing_pref_service_syncable.h" @@ -82,21 +85,6 @@ info.lock_screen_support); } -// Helper functions returning strings that can be used to compare launched -// intents. -std::string GetIntentString(const std::string& package, - const std::string& clip_data_uri) { - return base::StringPrintf( - "%s %s", package.c_str(), - clip_data_uri.empty() ? "[unset]" : clip_data_uri.c_str()); -} -std::string GetIntentString(const HandledIntent& intent) { - EXPECT_EQ(NoteTakingHelper::kIntentAction, intent.intent->action); - return GetIntentString( - intent.activity->package_name, - (intent.intent->clip_data_uri ? *intent.intent->clip_data_uri : "")); -} - // Creates an ARC IntentHandlerInfo object. IntentHandlerInfoPtr CreateIntentHandlerInfo(const std::string& name, const std::string& package) { @@ -165,8 +153,13 @@ ->arc_bridge_service() ->intent_helper() ->CloseInstance(&intent_helper_); + arc::ArcServiceManager::Get() + ->arc_bridge_service() + ->file_system() + ->CloseInstance(file_system_.get()); NoteTakingHelper::Shutdown(); intent_helper_bridge_.reset(); + file_system_bridge_.reset(); arc_test_.TearDown(); } extensions::ExtensionSystem::Get(profile())->Shutdown(); @@ -218,6 +211,18 @@ WaitForInstanceReady( arc::ArcServiceManager::Get()->arc_bridge_service()->intent_helper()); + file_system_bridge_ = std::make_unique<arc::ArcFileSystemBridge>( + profile(), arc::ArcServiceManager::Get()->arc_bridge_service()); + file_system_ = std::make_unique<arc::FakeFileSystemInstance>(); + + arc::ArcServiceManager::Get() + ->arc_bridge_service() + ->file_system() + ->SetInstance(file_system_.get()); + WaitForInstanceReady( + arc::ArcServiceManager::Get()->arc_bridge_service()->file_system()); + ASSERT_TRUE(file_system_->InitCalled()); + if (flags & ENABLE_PALETTE) { base::CommandLine::ForCurrentProcess()->AppendSwitch( ash::switches::kAshForceEnableStylusTools); @@ -405,6 +410,10 @@ arc::FakeIntentHelperInstance intent_helper_; + std::unique_ptr<arc::ArcFileSystemBridge> file_system_bridge_; + + std::unique_ptr<arc::FakeFileSystemInstance> file_system_; + // Pointer to the primary profile (returned by |profile()|) prefs - owned by // the profile. sync_preferences::TestingPrefServiceSyncable* profile_prefs_ = nullptr; @@ -903,9 +912,16 @@ // The installed app should be launched. std::unique_ptr<HistogramTester> histogram_tester(new HistogramTester()); helper()->LaunchAppForNewNote(profile(), base::FilePath()); - ASSERT_EQ(1u, intent_helper_.handled_intents().size()); - EXPECT_EQ(GetIntentString(kPackage1, ""), - GetIntentString(intent_helper_.handled_intents()[0])); + ASSERT_EQ(1u, file_system_->handledUrlRequests().size()); + EXPECT_EQ(arc::mojom::ActionType::CREATE_NOTE, + file_system_->handledUrlRequests().at(0)->action_type); + EXPECT_EQ( + kPackage1, + file_system_->handledUrlRequests().at(0)->activity_name->package_name); + EXPECT_EQ( + std::string(), + file_system_->handledUrlRequests().at(0)->activity_name->activity_name); + ASSERT_EQ(0u, file_system_->handledUrlRequests().at(0)->urls.size()); histogram_tester->ExpectUniqueSample( NoteTakingHelper::kPreferredLaunchResultHistogramName, @@ -926,11 +942,19 @@ // The second app should be launched now. intent_helper_.clear_handled_intents(); + file_system_->clear_handled_requests(); histogram_tester.reset(new HistogramTester()); helper()->LaunchAppForNewNote(profile(), base::FilePath()); - ASSERT_EQ(1u, intent_helper_.handled_intents().size()); - EXPECT_EQ(GetIntentString(kPackage2, ""), - GetIntentString(intent_helper_.handled_intents()[0])); + ASSERT_EQ(1u, file_system_->handledUrlRequests().size()); + EXPECT_EQ(arc::mojom::ActionType::CREATE_NOTE, + file_system_->handledUrlRequests().at(0)->action_type); + EXPECT_EQ( + kPackage2, + file_system_->handledUrlRequests().at(0)->activity_name->package_name); + EXPECT_EQ( + std::string(), + file_system_->handledUrlRequests().at(0)->activity_name->activity_name); + ASSERT_EQ(0u, file_system_->handledUrlRequests().at(0)->urls.size()); histogram_tester->ExpectUniqueSample( NoteTakingHelper::kPreferredLaunchResultHistogramName, @@ -954,25 +978,45 @@ file_manager::util::GetDownloadsFolderForProfile(profile()).Append( "image.jpg")); helper()->LaunchAppForNewNote(profile(), kDownloadedPath); - ASSERT_EQ(1u, intent_helper_.handled_intents().size()); - EXPECT_EQ(GetIntentString(kPackage, GetArcUrl(kDownloadedPath)), - GetIntentString(intent_helper_.handled_intents()[0])); + ASSERT_EQ(1u, file_system_->handledUrlRequests().size()); + EXPECT_EQ(arc::mojom::ActionType::CREATE_NOTE, + file_system_->handledUrlRequests().at(0)->action_type); + EXPECT_EQ( + kPackage, + file_system_->handledUrlRequests().at(0)->activity_name->package_name); + EXPECT_EQ( + std::string(), + file_system_->handledUrlRequests().at(0)->activity_name->activity_name); + ASSERT_EQ(1u, file_system_->handledUrlRequests().at(0)->urls.size()); + ASSERT_EQ(GetArcUrl(kDownloadedPath), + file_system_->handledUrlRequests().at(0)->urls.at(0)->content_url); const base::FilePath kRemovablePath = base::FilePath(file_manager::util::kRemovableMediaPath) .Append("image.jpg"); intent_helper_.clear_handled_intents(); + file_system_->clear_handled_requests(); helper()->LaunchAppForNewNote(profile(), kRemovablePath); - ASSERT_EQ(1u, intent_helper_.handled_intents().size()); - EXPECT_EQ(GetIntentString(kPackage, GetArcUrl(kRemovablePath)), - GetIntentString(intent_helper_.handled_intents()[0])); + ASSERT_EQ(1u, file_system_->handledUrlRequests().size()); + EXPECT_EQ(arc::mojom::ActionType::CREATE_NOTE, + file_system_->handledUrlRequests().at(0)->action_type); + EXPECT_EQ( + kPackage, + file_system_->handledUrlRequests().at(0)->activity_name->package_name); + EXPECT_EQ( + std::string(), + file_system_->handledUrlRequests().at(0)->activity_name->activity_name); + ASSERT_EQ(1u, file_system_->handledUrlRequests().at(0)->urls.size()); + ASSERT_EQ(GetArcUrl(kRemovablePath), + file_system_->handledUrlRequests().at(0)->urls.at(0)->content_url); // When a path that isn't accessible to ARC is passed, the request should be // dropped. HistogramTester histogram_tester; intent_helper_.clear_handled_intents(); + file_system_->clear_handled_requests(); helper()->LaunchAppForNewNote(profile(), base::FilePath("/bad/path.jpg")); - EXPECT_TRUE(intent_helper_.handled_intents().empty()); + EXPECT_TRUE(file_system_->handledUrlRequests().empty()); histogram_tester.ExpectUniqueSample( NoteTakingHelper::kPreferredLaunchResultHistogramName,
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc index b04c883..4bb130b 100644 --- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc +++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -435,13 +435,17 @@ } if (policy.has_device_login_screen_system_info_enforced()) { - const em::DeviceLoginScreenSystemInfoEnforcedProto& container( + const em::BooleanPolicyProto& container( policy.device_login_screen_system_info_enforced()); - if (container.has_enabled()) { - policies->Set( - key::kDeviceLoginScreenSystemInfoEnforced, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, - std::make_unique<base::Value>(container.enabled()), nullptr); + if (container.has_value()) { + PolicyLevel level; + if (GetPolicyLevel(container.has_policy_options(), + container.policy_options(), &level)) { + policies->Set(key::kDeviceLoginScreenSystemInfoEnforced, level, + POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, + std::make_unique<base::Value>(container.value()), + nullptr); + } } }
diff --git a/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc b/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc index abe5717..6958a1b 100644 --- a/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc +++ b/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc
@@ -4,9 +4,13 @@ #include "chrome/browser/chromeos/printing/history/print_job_history_service_factory.h" +#include <memory> +#include <utility> + #include "chrome/browser/chromeos/printing/cups_print_job_manager_factory.h" #include "chrome/browser/chromeos/printing/history/print_job_database_impl.h" #include "chrome/browser/chromeos/printing/history/print_job_history_service_impl.h" +#include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/profiles/profile.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "content/public/browser/storage_partition.h" @@ -38,6 +42,13 @@ content::BrowserContext* context) const { Profile* profile = Profile::FromBrowserContext(context); + // We do not want an instance of PrintJobHistory on the lock screen. The + // result is multiple print job notifications. https://crbug.com/1011532 + if (ProfileHelper::IsLockScreenAppProfile(profile) || + ProfileHelper::IsSigninProfile(profile)) { + return nullptr; + } + leveldb_proto::ProtoDatabaseProvider* database_provider = content::BrowserContext::GetDefaultStoragePartition(profile) ->GetProtoDatabaseProvider();
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc index 2ee0568..8fd42d7 100644 --- a/chrome/browser/chromeos/settings/device_settings_provider.cc +++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -392,10 +392,10 @@ } if (policy.has_device_login_screen_system_info_enforced() && - policy.device_login_screen_system_info_enforced().has_enabled()) { + policy.device_login_screen_system_info_enforced().has_value()) { new_values_cache->SetBoolean( kDeviceLoginScreenSystemInfoEnforced, - policy.device_login_screen_system_info_enforced().enabled()); + policy.device_login_screen_system_info_enforced().value()); } if (policy.has_saml_login_authentication_type() &&
diff --git a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc index 166f4db..d8a3a85 100644 --- a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc +++ b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
@@ -313,10 +313,10 @@ // Helper routine to set DeviceLoginScreenSystemInfoEnforced policy. void SetSystemInfoEnforced(bool enabled) { - em::DeviceLoginScreenSystemInfoEnforcedProto* proto = + em::BooleanPolicyProto* proto = device_policy_->payload() .mutable_device_login_screen_system_info_enforced(); - proto->set_enabled(enabled); + proto->set_value(enabled); BuildAndInstallDevicePolicy(); }
diff --git a/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc b/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc index cdc5786..4530f54 100644 --- a/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc +++ b/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc
@@ -12,6 +12,8 @@ #include "base/bind.h" #include "base/logging.h" +#include "base/macros.h" +#include "base/values.h" #include "chrome/browser/chromeos/certificate_provider/certificate_provider_service.h" #include "chrome/browser/chromeos/certificate_provider/certificate_provider_service_factory.h" #include "chrome/browser/chromeos/certificate_provider/pin_dialog_manager.h" @@ -19,6 +21,7 @@ #include "chrome/common/extensions/api/certificate_provider.h" #include "chrome/common/extensions/api/certificate_provider_internal.h" #include "chromeos/constants/security_token_pin_types.h" +#include "extensions/browser/quota_service.h" #include "net/cert/x509_certificate.h" #include "net/ssl/ssl_private_key.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom.h" @@ -75,6 +78,51 @@ "Previous request not finished"; const char kCertificateProviderNoUserInput[] = "No user input received"; +// The BucketMapper implementation for the requestPin API that avoids using the +// quota when the current request uses the requestId that is strictly greater +// than all previous ones. +class RequestPinExceptFirstQuotaBucketMapper final + : public QuotaLimitHeuristic::BucketMapper { + public: + RequestPinExceptFirstQuotaBucketMapper() = default; + ~RequestPinExceptFirstQuotaBucketMapper() override = default; + + void GetBucketsForArgs(const base::ListValue* args, + QuotaLimitHeuristic::BucketList* buckets) override { + if (args->GetList().empty()) + return; + const base::Value& details = args->GetList()[0]; + if (!details.is_dict()) + return; + const base::Value* sign_request_id = + details.FindKeyOfType("signRequestId", base::Value::Type::INTEGER); + if (!sign_request_id) + return; + if (sign_request_id->GetInt() > biggest_request_id_) { + // Either it's the first request with the newly issued requestId, or it's + // an invalid requestId (bigger than the real one). Return a new bucket in + // order to apply no quota for the former case; for the latter case the + // quota doesn't matter much, except that we're maybe making it stricter + // for future requests (which is bearable). + biggest_request_id_ = sign_request_id->GetInt(); + new_request_bucket_ = std::make_unique<QuotaLimitHeuristic::Bucket>(); + buckets->push_back(new_request_bucket_.get()); + return; + } + // Either it's a repeatitive request for the given requestId, or the + // extension reordered the requests. Fall back to the default bucket (shared + // between all requests) in that case. + buckets->push_back(&default_bucket_); + } + + private: + int biggest_request_id_ = -1; + QuotaLimitHeuristic::Bucket default_bucket_; + std::unique_ptr<QuotaLimitHeuristic::Bucket> new_request_bucket_; + + DISALLOW_COPY_AND_ASSIGN(RequestPinExceptFirstQuotaBucketMapper); +}; + } // namespace const int api::certificate_provider::kMaxClosedDialogsPerMinute = 10; @@ -257,19 +305,25 @@ } void CertificateProviderRequestPinFunction::GetQuotaLimitHeuristics( - extensions::QuotaLimitHeuristics* heuristics) const { + QuotaLimitHeuristics* heuristics) const { + // Apply a 1-minute and a 10-minute quotas. A special bucket mapper is used in + // order to, approximately, skip applying quotas to the first request for each + // requestId (such logic cannot be done in ShouldSkipQuotaLimiting(), since + // it's not called with the request's parameters). The limitation constants + // are decremented below to account the first request. + QuotaLimitHeuristic::Config short_limit_config = { - api::certificate_provider::kMaxClosedDialogsPerMinute, + api::certificate_provider::kMaxClosedDialogsPerMinute - 1, base::TimeDelta::FromMinutes(1)}; heuristics->push_back(std::make_unique<QuotaService::TimedLimit>( - short_limit_config, new QuotaLimitHeuristic::SingletonBucketMapper(), + short_limit_config, new RequestPinExceptFirstQuotaBucketMapper, "MAX_PIN_DIALOGS_CLOSED_PER_MINUTE")); QuotaLimitHeuristic::Config long_limit_config = { - api::certificate_provider::kMaxClosedDialogsPer10Minutes, + api::certificate_provider::kMaxClosedDialogsPer10Minutes - 1, base::TimeDelta::FromMinutes(10)}; heuristics->push_back(std::make_unique<QuotaService::TimedLimit>( - long_limit_config, new QuotaLimitHeuristic::SingletonBucketMapper(), + long_limit_config, new RequestPinExceptFirstQuotaBucketMapper, "MAX_PIN_DIALOGS_CLOSED_PER_10_MINUTES")); }
diff --git a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc index cf69be6..507dbad 100644 --- a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc +++ b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
@@ -171,9 +171,9 @@ CertificateProviderApiTest::TearDownOnMainThread(); } - void AddFakeSignRequest() { + void AddFakeSignRequest(int sign_request_id) { cert_provider_service_->pin_dialog_manager()->AddSignRequestId( - extension_->id(), kFakeSignRequestId, {}); + extension_->id(), sign_request_id, {}); } void NavigateTo(const std::string& test_page_file_name) { @@ -373,7 +373,7 @@ // User enters the correct PIN. IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, ShowPinDialogAccept) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); NavigateTo("basic.html"); // Enter the valid PIN. @@ -386,7 +386,7 @@ // User closes the dialog kMaxClosedDialogsPerMinute times, and the extension // should be blocked from showing it again. IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, ShowPinDialogClose) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); NavigateTo("basic.html"); for (int i = 0; @@ -411,7 +411,7 @@ // User enters a wrong PIN first and a correct PIN on the second try. IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, ShowPinDialogWrongPin) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); NavigateTo("basic.html"); EnterWrongPinAndWaitForMessage(); @@ -429,7 +429,7 @@ // User enters wrong PIN three times. IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, ShowPinDialogWrongPinThreeTimes) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); NavigateTo("basic.html"); for (int i = 0; i < kWrongPinAttemptsLimit; i++) EnterWrongPinAndWaitForMessage(); @@ -447,7 +447,7 @@ // User closes the dialog while the extension is processing the request. IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, ShowPinDialogCloseWhileProcessing) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); NavigateTo("operated.html"); EXPECT_TRUE(SendCommandAndWaitForMessage("Request", "request1:begun")); @@ -473,7 +473,7 @@ i < extensions::api::certificate_provider::kMaxClosedDialogsPerMinute + 1; i++) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); EXPECT_TRUE(SendCommandAndWaitForMessage( "Request", base::StringPrintf("request%d:begun", i + 1))); @@ -483,7 +483,7 @@ EXPECT_FALSE(GetActivePinDialogView()); } - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); EXPECT_TRUE(SendCommandAndWaitForMessage( "Request", base::StringPrintf( @@ -496,7 +496,7 @@ // Extension erroneously attempts to close the PIN dialog twice. IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, DoubleClose) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); NavigateTo("operated.html"); EXPECT_TRUE(SendCommand("Request")); @@ -516,14 +516,14 @@ i < extensions::api::certificate_provider::kMaxClosedDialogsPerMinute + 1; i++) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); EXPECT_TRUE(SendCommand("Request")); EXPECT_TRUE(SendCommandAndWaitForMessage( "Stop", base::StringPrintf("stop%d:success", i + 1))); EXPECT_FALSE(GetActivePinDialogView()); } - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); EXPECT_TRUE(SendCommandAndWaitForMessage( "Request", base::StringPrintf( @@ -538,7 +538,7 @@ // the user provided any input. IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, StopWithErrorBeforeInput) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); NavigateTo("operated.html"); EXPECT_TRUE(SendCommand("Request")); @@ -558,7 +558,7 @@ // Extension specifies zero left attempts in the very first PIN request. IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, ZeroAttemptsAtStart) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); NavigateTo("operated.html"); EXPECT_TRUE(SendCommandAndWaitForMessage("RequestWithZeroAttempts", @@ -574,7 +574,7 @@ // Extension erroneously passes a negative attempts left count. IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, NegativeAttempts) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); NavigateTo("operated.html"); EXPECT_TRUE(SendCommandAndWaitForMessage( @@ -584,7 +584,7 @@ // Extension erroneously attempts to close a non-existing dialog. IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, CloseNonExisting) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); NavigateTo("operated.html"); EXPECT_TRUE(SendCommandAndWaitForMessage( @@ -594,7 +594,7 @@ // Extension erroneously attempts to stop a non-existing dialog with an error. IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, StopNonExisting) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); NavigateTo("operated.html"); EXPECT_TRUE(SendCommandAndWaitForMessage( @@ -606,7 +606,7 @@ // user closed the previously stopped with an error PIN request. IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, UpdateAlreadyStopped) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); NavigateTo("operated.html"); EXPECT_TRUE(SendCommandAndWaitForMessage("Request", "request1:begun")); @@ -623,7 +623,7 @@ // Extension starts a new PIN request after it stopped the previous one with an // error. IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, StartAfterStop) { - AddFakeSignRequest(); + AddFakeSignRequest(kFakeSignRequestId); NavigateTo("operated.html"); EXPECT_TRUE(SendCommandAndWaitForMessage("Request", "request1:begun")); @@ -638,3 +638,28 @@ EXPECT_TRUE(listener.WaitUntilSatisfied()); EXPECT_FALSE(GetActivePinDialogView()->textfield_for_testing()->GetEnabled()); } + +// Test that no quota is applied to the first PIN requests for each requestId. +IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, + RepeatedCloseWithDifferentIds) { + NavigateTo("operated.html"); + + for (int i = 0; + i < + extensions::api::certificate_provider::kMaxClosedDialogsPer10Minutes + 2; + i++) { + AddFakeSignRequest(kFakeSignRequestId + i); + EXPECT_TRUE(SendCommandAndWaitForMessage( + "Request", base::StringPrintf("request%d:begun", i + 1))); + + ExtensionTestMessageListener listener( + base::StringPrintf("request%d:empty", i + 1), false); + ASSERT_TRUE(GetActivePinDialogView()); + GetActivePinDialogView()->GetWidget()->CloseWithReason( + views::Widget::ClosedReason::kCloseButtonClicked); + EXPECT_TRUE(listener.WaitUntilSatisfied()); + EXPECT_FALSE(GetActivePinDialogView()); + + EXPECT_TRUE(SendCommand("IncrementRequestId")); + } +}
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.cc index 8a6867d..afc7eb0 100644 --- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.cc
@@ -35,6 +35,7 @@ #include "net/base/net_errors.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_recorder.h" +#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" #include "ui/base/page_transition_types.h" #include "ui/gfx/geometry/size.h" #include "url/gurl.h" @@ -65,6 +66,14 @@ handle->GetFrameTreeNodeId()); } +void RecordFeatureUsage(content::RenderFrameHost* rfh, + blink::mojom::WebFeature web_feature) { + page_load_metrics::mojom::PageLoadFeatures page_load_features( + {web_feature}, {} /* css_properties */, {} /* animated_css_properties */); + page_load_metrics::MetricsWebContentsObserver::RecordFeatureUsage( + rfh, page_load_features); +} + using ResourceMimeType = AdsPageLoadMetricsObserver::ResourceMimeType; const char kDisallowedByBlocklistHistogramName[] = "PageLoad.Clients.Ads.HeavyAds.DisallowedByBlocklist"; @@ -202,6 +211,9 @@ render_frame_host, render_frame_host->GetLastCommittedURL(), heavy_ads::PrepareHeavyAdPage(), net::ERR_BLOCKED_BY_CLIENT); + RecordFeatureUsage(render_frame_host, + blink::mojom::WebFeature::kHeavyAdIntervention); + ADS_HISTOGRAM("HeavyAds.InterventionType2", UMA_HISTOGRAM_ENUMERATION, FrameData::FrameVisibility::kAnyVisibility, frame_data->heavy_ad_status_with_noise());
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc index 11d79cd..b5e804b 100644 --- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc +++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
@@ -44,6 +44,7 @@ #include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_source.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" #include "ui/gfx/geometry/size.h" #include "url/gurl.h" #include "url/url_constants.h" @@ -907,6 +908,9 @@ histogram_tester.ExpectUniqueSample(kHeavyAdInterventionTypeHistogramId, FrameData::HeavyAdStatus::kNetwork, 1); + histogram_tester.ExpectBucketCount( + "Blink.UseCounter.Features", + blink::mojom::WebFeature::kHeavyAdIntervention, 1); } // Check that when the heavy ad feature is disabled we don't navigate @@ -938,6 +942,10 @@ // load is not synchronous. Instead check that we didn't log intervention UMA // that is always recorded when the intervention occurs. histogram_tester.ExpectTotalCount(kHeavyAdInterventionTypeHistogramId, 0); + + histogram_tester.ExpectBucketCount( + "Blink.UseCounter.Features", + blink::mojom::WebFeature::kHeavyAdIntervention, 0); } // Check that we don't activate a HeavyAdIntervention field trial if we don't
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc index 83918c5..b1c7e21a 100644 --- a/chrome/browser/password_manager/chrome_password_manager_client.cc +++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -828,7 +828,6 @@ if (PasswordGenerationController::AllowedForWebContents(web_contents())) { PasswordManagerDriver* driver = driver_factory_->GetDriverForFrame( password_generation_driver_bindings_.GetCurrentTargetFrame()); - DCHECK(driver); PasswordGenerationController* generation_controller = PasswordGenerationController::GetIfExisting(web_contents()); @@ -860,7 +859,6 @@ return; auto* driver = driver_factory_->GetDriverForFrame( password_generation_driver_bindings_.GetCurrentTargetFrame()); - DCHECK(driver); gfx::RectF element_bounds_in_screen_space = GetBoundsInScreenSpace(TransformToRootCoordinates( password_generation_driver_bindings_.GetCurrentTargetFrame(), @@ -1158,7 +1156,6 @@ password_manager::ContentPasswordManagerDriver* driver, const autofill::password_generation::PasswordGenerationUIData& ui_data, bool is_manually_triggered) { - DCHECK(driver); gfx::RectF element_bounds_in_top_frame_space = TransformToRootCoordinates(driver->render_frame_host(), ui_data.bounds); if (!is_manually_triggered &&
diff --git a/chrome/browser/password_manager/password_accessory_controller_impl.cc b/chrome/browser/password_manager/password_accessory_controller_impl.cc index fe6c7b71..f770783 100644 --- a/chrome/browser/password_manager/password_accessory_controller_impl.cc +++ b/chrome/browser/password_manager/password_accessory_controller_impl.cc
@@ -98,12 +98,8 @@ password_manager::ContentPasswordManagerDriverFactory* factory = password_manager::ContentPasswordManagerDriverFactory::FromWebContents( web_contents_); - DCHECK(factory); password_manager::ContentPasswordManagerDriver* driver = factory->GetDriverForFrame(web_contents_->GetFocusedFrame()); - if (!driver) { - return; - } // |driver| can be NULL if the tab is being closed. driver->FillIntoFocusedField(selection.is_obfuscated(), selection.display_text()); }
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc index dfab012..3d716ec 100644 --- a/chrome/browser/password_manager/password_manager_browsertest.cc +++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -1900,7 +1900,6 @@ ObservingAutofillClient::FromWebContents(WebContents()); password_manager::ContentPasswordManagerDriver* driver = driver_factory->GetDriverForFrame(WebContents()->GetMainFrame()); - DCHECK(driver); driver->GetPasswordAutofillManager()->set_autofill_client( observing_autofill_client);
diff --git a/chrome/browser/previews/previews_lite_page_redirect_url_loader.cc b/chrome/browser/previews/previews_lite_page_redirect_url_loader.cc index a757dc7..fb2fc0d 100644 --- a/chrome/browser/previews/previews_lite_page_redirect_url_loader.cc +++ b/chrome/browser/previews/previews_lite_page_redirect_url_loader.cc
@@ -12,6 +12,7 @@ #include "base/strings/stringprintf.h" #include "chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor.h" #include "chrome/browser/profiles/profile.h" +#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_request_options.h" #include "components/previews/core/previews_experiments.h" #include "components/previews/core/previews_lite_page_redirect.h" #include "content/public/browser/browser_context.h" @@ -130,6 +131,9 @@ network_loader_factory, int frame_tree_node_id) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(data_reduction_proxy::DataReductionProxyRequestOptions:: + GetSessionKeyFromRequestHeaders(chrome_proxy_headers) + .has_value()); GURL original_url = modified_resource_request_.url; GURL lite_page_url =
diff --git a/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor.cc b/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor.cc index d27ee6b..66fc4460 100644 --- a/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor.cc +++ b/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor.cc
@@ -9,6 +9,7 @@ #include <utility> #include "base/bind.h" +#include "base/command_line.h" #include "base/metrics/histogram_macros.h" #include "base/optional.h" #include "base/stl_util.h" @@ -71,8 +72,14 @@ uint64_t page_id) { net::HttpRequestHeaders headers; // Return empty headers for unittests. - if (!browser_context) + if (!browser_context) { + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + "add-chrome-proxy-header-for-lpr-tests")) { + headers.SetHeader(data_reduction_proxy::chrome_proxy_header(), + "s=secret"); + } return headers; + } auto* settings = DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
diff --git a/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor_unittest.cc b/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor_unittest.cc index a20b2f93..1f6bdbe 100644 --- a/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor_unittest.cc +++ b/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor_unittest.cc
@@ -74,6 +74,9 @@ void TearDown() override {} void SetUp() override { + base::CommandLine::ForCurrentProcess()->AppendSwitch( + "add-chrome-proxy-header-for-lpr-tests"); + interceptor_ = std::make_unique<PreviewsLitePageRedirectURLLoaderInterceptor>( shared_factory_, 1, 2);
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc index a6e6114..ec9c5b8 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
@@ -544,9 +544,6 @@ // Set up password manager stuff. ChromePasswordManagerClient::CreateForWebContentsWithAutofillClient( web_contents(), nullptr); - password_manager::ContentPasswordManagerDriverFactory::FromWebContents( - web_contents()) - ->RenderFrameCreated(web_contents()->GetMainFrame()); NavigateAndCommit(GURL("http://www.foo.com/")); content::ContextMenuParams params = CreateParams(MenuItem::EDITABLE); @@ -568,9 +565,6 @@ // Set up password manager stuff. ChromePasswordManagerClient::CreateForWebContentsWithAutofillClient( incognito_web_contents.get(), nullptr); - password_manager::ContentPasswordManagerDriverFactory::FromWebContents( - incognito_web_contents.get()) - ->RenderFrameCreated(incognito_web_contents->GetMainFrame()); content::WebContentsTester::For(incognito_web_contents.get()) ->NavigateAndCommit(GURL("http://www.foo.com/"));
diff --git a/chrome/browser/resources/chromeos/login/md_screen_container.css b/chrome/browser/resources/chromeos/login/md_screen_container.css index 2c6f3493..5ff1570 100644 --- a/chrome/browser/resources/chromeos/login/md_screen_container.css +++ b/chrome/browser/resources/chromeos/login/md_screen_container.css
@@ -114,6 +114,7 @@ height: 100%; max-height: 864px; /* 768 + 48*2 */ max-width: 864px; /* 768 + 48*2 */ + min-height: 560px; /* 464 + 48*2 */ padding-bottom: 48px; padding-inline-end: 48px; padding-inline-start: 48px;
diff --git a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html index 3c0f854..7c87df1 100644 --- a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html +++ b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html
@@ -29,6 +29,11 @@ <template> <link rel="stylesheet" href="oobe_popup_overlay.css"> <style include="shared-style multidevice-setup-shared "> + multidevice-setup { + --multidevice-setup-height: var(--oobe-dialog-host-height); + --multidevice-setup-width: var(--oobe-dialog-host-width); + } + #multidevice-help-overlay-container { width: 768px; }
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html index 0d0a8da..ec5cbd7 100644 --- a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html +++ b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html
@@ -10,6 +10,11 @@ <dom-module id="multidevice-setup-post-oobe"> <template> <style include="multidevice-setup-shared"> + multidevice-setup { + --multidevice-setup-height: 640px; + --multidevice-setup-width: 768px; + } + #backward-button, #cancel-button, #forward-button {
diff --git a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h index 7d3c6d3e..8c67af0 100644 --- a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h +++ b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h
@@ -78,10 +78,6 @@ void RemoveRequest(InProgressRequest* request); void MaybeDestroySelf(); - const content::WebContents::Getter& web_contents_getter() { - return web_contents_getter_; - } - std::unique_ptr<HeaderModificationDelegate> delegate_; content::WebContents::Getter web_contents_getter_;
diff --git a/chrome/browser/signin/dice_response_handler.h b/chrome/browser/signin/dice_response_handler.h index bc55f76e..ab6eac1 100644 --- a/chrome/browser/signin/dice_response_handler.h +++ b/chrome/browser/signin/dice_response_handler.h
@@ -120,11 +120,6 @@ // Deletes the token fetcher. void DeleteTokenFetcher(DiceTokenFetcher* token_fetcher); - // Returns true if it is acceptable to get a new token for the account. - // Always returns true when using kDice. - bool CanGetTokenForAccount(const std::string& gaia_id, - const std::string& email); - // Process the Dice signin action. void ProcessDiceSigninHeader( const std::string& gaia_id,
diff --git a/chrome/browser/signin/signin_global_error.cc b/chrome/browser/signin/signin_global_error.cc index f1f279ea..f479568 100644 --- a/chrome/browser/signin/signin_global_error.cc +++ b/chrome/browser/signin/signin_global_error.cc
@@ -47,13 +47,6 @@ return HasMenuItem(); } -void SigninGlobalError::AttemptToFixError(Browser* browser) { - if (!HasError()) - return; - - ExecuteMenuItem(browser); -} - void SigninGlobalError::Shutdown() { error_controller_->RemoveObserver(this); error_controller_ = NULL;
diff --git a/chrome/browser/signin/signin_global_error.h b/chrome/browser/signin/signin_global_error.h index 320b39f..9240265 100644 --- a/chrome/browser/signin/signin_global_error.h +++ b/chrome/browser/signin/signin_global_error.h
@@ -27,10 +27,6 @@ // Returns true if there is an authentication error. bool HasError(); - // Shows re-authentication UI to the user in an attempt to fix the error. - // The re-authentication UI will be shown in |browser|. - void AttemptToFixError(Browser* browser); - private: FRIEND_TEST_ALL_PREFIXES(SigninGlobalErrorTest, Basic); FRIEND_TEST_ALL_PREFIXES(SigninGlobalErrorTest, AuthStatusEnumerateAllErrors);
diff --git a/chrome/browser/signin/signin_ui_util.cc b/chrome/browser/signin/signin_ui_util.cc index b92d70963..9a1452cd 100644 --- a/chrome/browser/signin/signin_ui_util.cc +++ b/chrome/browser/signin/signin_ui_util.cc
@@ -175,23 +175,6 @@ } } // namespace internal -std::string GetDisplayEmail(Profile* profile, const std::string& account_id) { - signin::IdentityManager* identity_manager = - IdentityManagerFactory::GetForProfile(profile); - std::string email = - identity_manager - ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId( - account_id) - ->email; - if (email.empty()) { - DCHECK_EQ( - signin::IdentityManager::AccountIdMigrationState::MIGRATION_NOT_STARTED, - identity_manager->GetAccountIdMigrationState()); - return account_id; - } - return email; -} - std::vector<AccountInfo> GetAccountsForDicePromos(Profile* profile) { // Fetch account ids for accounts that have a token. signin::IdentityManager* identity_manager =
diff --git a/chrome/browser/signin/signin_ui_util.h b/chrome/browser/signin/signin_ui_util.h index 156f0b1..ca329ae 100644 --- a/chrome/browser/signin/signin_ui_util.h +++ b/chrome/browser/signin/signin_ui_util.h
@@ -53,12 +53,6 @@ bool is_default_promo_account); #if BUILDFLAG(ENABLE_DICE_SUPPORT) -// Returns the display email string for the given account. If the profile -// has not been migrated to use gaia ids, then its possible for the display -// to not ne known yet. In this case, use |account_id|, which is assumed to -// be an email address. -std::string GetDisplayEmail(Profile* profile, const std::string& account_id); - // Returns the list of all accounts that have a token. The default account in // the Gaia cookies will be the first account in the list. std::vector<AccountInfo> GetAccountsForDicePromos(Profile* profile);
diff --git a/chrome/browser/touch_to_fill/android/internal/BUILD.gn b/chrome/browser/touch_to_fill/android/internal/BUILD.gn index 49f44f5..7792ea5 100644 --- a/chrome/browser/touch_to_fill/android/internal/BUILD.gn +++ b/chrome/browser/touch_to_fill/android/internal/BUILD.gn
@@ -12,6 +12,7 @@ "//base:jni_java", "//chrome/android:chrome_java", "//chrome/browser/touch_to_fill/android:public_java", + "//chrome/browser/util/android:java", "//ui/android:ui_java", ]
diff --git a/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_credential_item.xml b/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_credential_item.xml index 745ffca7..af57e8a5 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_credential_item.xml +++ b/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_credential_item.xml
@@ -8,37 +8,48 @@ android:descendantFocusability="blocksDescendants" android:layout_width="match_parent" android:layout_height="wrap_content" - android:minHeight="70dp" + android:minHeight="72dp" android:gravity="center_vertical" android:orientation="horizontal" android:background="@drawable/touch_to_fill_credential_background"> <ImageView android:id="@+id/favicon" - android:layout_width="20dp" - android:layout_height="20dp" + android:layout_width="24dp" + android:layout_height="24dp" + android:layout_marginStart="12dp" android:importantForAccessibility="no" android:layout_gravity="center"/> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_margin="8dp" - android:layout_marginStart="16dp" + android:layout_margin="6dp" + android:layout_marginStart="12dp" android:layout_weight="1" android:orientation="vertical"> <TextView + android:id="@+id/credential_origin" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minHeight="20dp" + android:ellipsize="start" + android:singleLine="true" + android:textAppearance="@style/TextAppearance.BlackBody" /> + <TextView android:id="@+id/username" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:minHeight="20dp" android:ellipsize="end" android:singleLine="true" - android:textAppearance="@style/TextAppearance.BlackTitle1" /> + android:textAppearance="@style/TextAppearance.BlackBodyDefault" /> <TextView android:id="@+id/password" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:minHeight="20dp" android:ellipsize="end" android:singleLine="true" - android:textAppearance="@style/TextAppearance.BlackBody" /> + android:textAppearance="@style/TextAppearance.BlackBodyDefault" /> </LinearLayout> </LinearLayout>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java index 644da774..d6ab53b 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java +++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java
@@ -8,6 +8,7 @@ import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.FORMATTED_URL; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VIEW_EVENT_LISTENER; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE; +import static org.chromium.chrome.browser.util.UrlUtilities.stripScheme; import android.text.method.PasswordTransformationMethod; import android.view.LayoutInflater; @@ -41,6 +42,12 @@ * @param credential The {@link Credential} whose data needs to be displayed. */ static void bindCredentialView(View view, Credential credential) { + TextView pslOriginText = view.findViewById(R.id.credential_origin); + String formattedOrigin = stripScheme(credential.getOriginUrl()); + formattedOrigin = formattedOrigin.replaceFirst("/$", ""); // Strip possibly trailing slash. + pslOriginText.setText(formattedOrigin); + pslOriginText.setVisibility(credential.isPublicSuffixMatch() ? View.VISIBLE : View.GONE); + TextView usernameText = view.findViewById(R.id.username); usernameText.setText(credential.getFormattedUsername());
diff --git a/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/data/Credential.java b/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/data/Credential.java index eb3ed519..934b2e2 100644 --- a/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/data/Credential.java +++ b/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/data/Credential.java
@@ -24,6 +24,7 @@ */ public Credential(String username, String password, String formattedUsername, String originUrl, boolean isPublicSuffixMatch) { + assert originUrl != null : "Credential origin is null! Pass an empty one instead."; mUsername = username; mPassword = password; mFormattedUsername = formattedUsername;
diff --git a/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java b/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java index f1c82c6..d3498f7 100644 --- a/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java +++ b/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java
@@ -18,6 +18,7 @@ import android.support.test.filters.MediumTest; import android.text.method.PasswordTransformationMethod; +import android.view.View; import android.widget.ListView; import android.widget.TextView; @@ -111,20 +112,31 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { mTouchToFillView.setVisible(true); mModel.get(CREDENTIAL_LIST) - .addAll(Arrays.asList(new Credential("Ana", "S3cr3t", "Ana", null, false), - new Credential("", "***", "No Username", "m.example.xyz", true))); + .addAll(Arrays.asList(new Credential("Ana", "S3cr3t", "Ana", "", false), + new Credential("", "***", "No Username", "http://m.example.xyz/", true), + new Credential( + "Bob", "***", "Bob", "http://mobile.example.xyz", true))); }); pollUiThread(() -> getBottomSheetState() == SheetState.FULL); - assertThat(getCredentials().getChildCount(), is(2)); + assertThat(getCredentials().getChildCount(), is(3)); + assertThat(getCredentialOriginAt(0).getVisibility(), is(View.GONE)); assertThat(getCredentialNameAt(0).getText(), is("Ana")); assertThat(getCredentialPasswordAt(0).getText(), is("S3cr3t")); assertThat(getCredentialPasswordAt(0).getTransformationMethod(), instanceOf(PasswordTransformationMethod.class)); + assertThat(getCredentialOriginAt(1).getVisibility(), is(View.VISIBLE)); + assertThat(getCredentialOriginAt(1).getText(), is("m.example.xyz")); assertThat(getCredentialNameAt(1).getText(), is("No Username")); assertThat(getCredentialPasswordAt(1).getText(), is("***")); assertThat(getCredentialPasswordAt(1).getTransformationMethod(), instanceOf(PasswordTransformationMethod.class)); + assertThat(getCredentialOriginAt(2).getVisibility(), is(View.VISIBLE)); + assertThat(getCredentialOriginAt(2).getText(), is("mobile.example.xyz")); + assertThat(getCredentialNameAt(2).getText(), is("Bob")); + assertThat(getCredentialPasswordAt(2).getText(), is("***")); + assertThat(getCredentialPasswordAt(2).getTransformationMethod(), + instanceOf(PasswordTransformationMethod.class)); } @Test @@ -180,6 +192,10 @@ return getCredentials().getChildAt(index).findViewById(R.id.password); } + private TextView getCredentialOriginAt(int index) { + return getCredentials().getChildAt(index).findViewById(R.id.credential_origin); + } + TouchToFillProperties.ViewEventListener waitForEvent() { return verify(mMockListener, timeout(ScalableTimeout.scaleTimeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL)));
diff --git a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java index 878b27c..9cd0b06 100644 --- a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java +++ b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java
@@ -36,7 +36,7 @@ public class TouchToFillControllerTest { private static final String TEST_URL = "www.example.xyz"; private static final String TEST_MOBILE_URL = "www.example.xyz"; - private static final Credential ANA = new Credential("Ana", "S3cr3t", "Ana", null, false); + private static final Credential ANA = new Credential("Ana", "S3cr3t", "Ana", "", false); private static final Credential BOB = new Credential("Bob", "*****", "Bob", TEST_MOBILE_URL, true); private static final Credential CARL = new Credential("Carl", "G3h3!m", "Carl", "", false);
diff --git a/chrome/browser/ui/cookie_controls/cookie_controls_controller.cc b/chrome/browser/ui/cookie_controls/cookie_controls_controller.cc index 5aaefb7..f0e2456 100644 --- a/chrome/browser/ui/cookie_controls/cookie_controls_controller.cc +++ b/chrome/browser/ui/cookie_controls/cookie_controls_controller.cc
@@ -54,8 +54,7 @@ this, TabSpecificContentSettings::FromWebContents(web_contents)); } for (auto& observer : observers_) - observer.OnStatusChanged(GetStatus(web_contents)); - PresentBlockedCookieCounter(); + observer.OnStatusChanged(GetStatus(web_contents), GetBlockedCookieCount()); } CookieControlsController::Status CookieControlsController::GetStatus( @@ -87,19 +86,17 @@ Update(GetWebContents()); } -int CookieControlsController::GetBlockedDomainCount() { +int CookieControlsController::GetBlockedCookieCount() { const LocalSharedObjectsContainer& blocked_objects = tab_observer_->tab_specific_content_settings() ->blocked_local_shared_objects(); - return blocked_objects.GetDomainCount(); + return blocked_objects.GetObjectCount(); } void CookieControlsController::PresentBlockedCookieCounter() { - const LocalSharedObjectsContainer& blocked_objects = - tab_observer_->tab_specific_content_settings() - ->blocked_local_shared_objects(); + int blocked_cookies = GetBlockedCookieCount(); for (auto& observer : observers_) - observer.OnBlockedCookiesCountChanged(blocked_objects.GetObjectCount()); + observer.OnBlockedCookiesCountChanged(blocked_cookies); } void CookieControlsController::OnPrefChanged() {
diff --git a/chrome/browser/ui/cookie_controls/cookie_controls_controller.h b/chrome/browser/ui/cookie_controls/cookie_controls_controller.h index d945a7a2..2481c483 100644 --- a/chrome/browser/ui/cookie_controls/cookie_controls_controller.h +++ b/chrome/browser/ui/cookie_controls/cookie_controls_controller.h
@@ -47,8 +47,6 @@ // blocking. void OnCookieBlockingEnabledForSite(bool block_third_party_cookies); - // Returns the number of registrable domains with blocked cookies. - int GetBlockedDomainCount(); void AddObserver(CookieControlsView* obs); void RemoveObserver(CookieControlsView* obs); @@ -79,6 +77,9 @@ // Updates the blocked cookie count of |icon_|. void PresentBlockedCookieCounter(); + // Returns the number of blocked cookies. + int GetBlockedCookieCount(); + // Callback for when the cookie controls or third-party cookie blocking // preference changes. void OnPrefChanged();
diff --git a/chrome/browser/ui/cookie_controls/cookie_controls_controller_unittest.cc b/chrome/browser/ui/cookie_controls/cookie_controls_controller_unittest.cc index f2396a8..cd0c50c 100644 --- a/chrome/browser/ui/cookie_controls/cookie_controls_controller_unittest.cc +++ b/chrome/browser/ui/cookie_controls/cookie_controls_controller_unittest.cc
@@ -20,7 +20,7 @@ class MockCookieControlsView : public CookieControlsView { public: - MOCK_METHOD1(OnStatusChanged, void(CookieControlsController::Status)); + MOCK_METHOD2(OnStatusChanged, void(CookieControlsController::Status, int)); MOCK_METHOD1(OnBlockedCookiesCountChanged, void(int)); }; @@ -80,8 +80,7 @@ TEST_F(CookieControlsTest, NewTabPage) { EXPECT_CALL(*mock(), - OnStatusChanged(CookieControlsController::Status::kDisabled)); - EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0)); + OnStatusChanged(CookieControlsController::Status::kDisabled, 0)); cookie_controls()->Update(web_contents()); } @@ -89,8 +88,7 @@ // Visiting a website should enable the UI. NavigateAndCommit(GURL("https://example.com")); EXPECT_CALL(*mock(), - OnStatusChanged(CookieControlsController::Status::kEnabled)); - EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0)); + OnStatusChanged(CookieControlsController::Status::kEnabled, 0)); cookie_controls()->Update(web_contents()); testing::Mock::VerifyAndClearExpectations(mock()); @@ -98,36 +96,31 @@ EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0)); tab_specific_content_settings()->OnWebDatabaseAccessed( GURL("https://example.com"), /*blocked=*/false); - EXPECT_EQ(0, cookie_controls()->GetBlockedDomainCount()); testing::Mock::VerifyAndClearExpectations(mock()); // Blocking cookies should update the blocked cookie count. EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(1)); tab_specific_content_settings()->OnWebDatabaseAccessed( GURL("https://thirdparty.com"), /*blocked=*/true); - EXPECT_EQ(1, cookie_controls()->GetBlockedDomainCount()); testing::Mock::VerifyAndClearExpectations(mock()); // Navigating somewhere else should reset the cookie count. NavigateAndCommit(GURL("https://somethingelse.com")); EXPECT_CALL(*mock(), - OnStatusChanged(CookieControlsController::Status::kEnabled)); - EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0)); + OnStatusChanged(CookieControlsController::Status::kEnabled, 0)); cookie_controls()->Update(web_contents()); } TEST_F(CookieControlsTest, PreferenceDisabled) { NavigateAndCommit(GURL("https://example.com")); EXPECT_CALL(*mock(), - OnStatusChanged(CookieControlsController::Status::kEnabled)); - EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0)); + OnStatusChanged(CookieControlsController::Status::kEnabled, 0)); cookie_controls()->Update(web_contents()); testing::Mock::VerifyAndClearExpectations(mock()); // Disabling the feature should disable the UI. EXPECT_CALL(*mock(), - OnStatusChanged(CookieControlsController::Status::kDisabled)); - EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0)); + OnStatusChanged(CookieControlsController::Status::kDisabled, 0)); profile()->GetPrefs()->SetInteger( prefs::kCookieControlsMode, static_cast<int>(content_settings::CookieControlsMode::kOff)); @@ -137,38 +130,35 @@ TEST_F(CookieControlsTest, DisableForSite) { NavigateAndCommit(GURL("https://example.com")); EXPECT_CALL(*mock(), - OnStatusChanged(CookieControlsController::Status::kEnabled)); - EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0)); + OnStatusChanged(CookieControlsController::Status::kEnabled, 0)); cookie_controls()->Update(web_contents()); testing::Mock::VerifyAndClearExpectations(mock()); // Disabling cookie blocking for example.com should update the ui. - EXPECT_CALL(*mock(), OnStatusChanged( - CookieControlsController::Status::kDisabledForSite)); - EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0)); + EXPECT_CALL( + *mock(), + OnStatusChanged(CookieControlsController::Status::kDisabledForSite, 0)); cookie_controls()->OnCookieBlockingEnabledForSite(false); testing::Mock::VerifyAndClearExpectations(mock()); // Visiting some other site, should switch back to kEnabled. NavigateAndCommit(GURL("https://somethingelse.com")); EXPECT_CALL(*mock(), - OnStatusChanged(CookieControlsController::Status::kEnabled)); - EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0)); + OnStatusChanged(CookieControlsController::Status::kEnabled, 0)); cookie_controls()->Update(web_contents()); testing::Mock::VerifyAndClearExpectations(mock()); // Visiting example.com should set status to kDisabledForSite. NavigateAndCommit(GURL("https://example.com")); - EXPECT_CALL(*mock(), OnStatusChanged( - CookieControlsController::Status::kDisabledForSite)); - EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0)); + EXPECT_CALL( + *mock(), + OnStatusChanged(CookieControlsController::Status::kDisabledForSite, 0)); cookie_controls()->Update(web_contents()); testing::Mock::VerifyAndClearExpectations(mock()); // Enabling example.com again should change status to kEnabled. EXPECT_CALL(*mock(), - OnStatusChanged(CookieControlsController::Status::kEnabled)); - EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0)); + OnStatusChanged(CookieControlsController::Status::kEnabled, 0)); cookie_controls()->OnCookieBlockingEnabledForSite(true); testing::Mock::VerifyAndClearExpectations(mock()); }
diff --git a/chrome/browser/ui/cookie_controls/cookie_controls_view.h b/chrome/browser/ui/cookie_controls/cookie_controls_view.h index 71f32103..9616dd3 100644 --- a/chrome/browser/ui/cookie_controls/cookie_controls_view.h +++ b/chrome/browser/ui/cookie_controls/cookie_controls_view.h
@@ -11,7 +11,8 @@ // Interface for the CookieControls UI. class CookieControlsView : public base::CheckedObserver { public: - virtual void OnStatusChanged(CookieControlsController::Status status) = 0; + virtual void OnStatusChanged(CookieControlsController::Status status, + int blocked_cookies) = 0; virtual void OnBlockedCookiesCountChanged(int blocked_cookies) = 0; };
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc index 1c30735..bbcbcca 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc +++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
@@ -18,7 +18,7 @@ #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/image_view.h" #include "ui/views/controls/link.h" -#include "ui/views/layout/fill_layout.h" +#include "ui/views/layout/box_layout.h" #include "ui/views/widget/widget.h" #include "ui/views/window/dialog_client_view.h" @@ -55,19 +55,22 @@ } void CookieControlsBubbleView::OnStatusChanged( - CookieControlsController::Status new_status) { - if (status_ == new_status) + CookieControlsController::Status new_status, + int blocked_cookies) { + if (status_ == new_status) { + OnBlockedCookiesCountChanged(blocked_cookies); return; - - show_disable_cookie_blocking_ui_ = false; + } + intermediate_step_ = IntermediateStep::kNone; status_ = new_status; + blocked_cookies_ = blocked_cookies; UpdateUi(); } void CookieControlsBubbleView::OnBlockedCookiesCountChanged( int blocked_cookies) { // The blocked cookie count changes quite frequently, so avoid unnecessary - // UI updates and unnecessarily calling GetBlockedDomainCount() if possible. + // UI updates if possible. if (blocked_cookies_ == blocked_cookies) return; @@ -75,14 +78,12 @@ !blocked_cookies_ || (*blocked_cookies_ > 0) != (blocked_cookies > 0); blocked_cookies_ = blocked_cookies; - text_->SetText( - l10n_util::GetPluralStringFUTF16(IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE, - controller_->GetBlockedDomainCount())); - - // If this only incremented the number of blocked sites, no UI update is - // necessary besides the |text_| text. + // If this only incremented the number of blocked sites, no full UI update is + // necessary besides the title text. if (has_blocked_changed) UpdateUi(); + else + GetBubbleFrameView()->UpdateWindowTitle(); } CookieControlsBubbleView::CookieControlsBubbleView( @@ -111,10 +112,18 @@ text_->SetVisible(false); header_view_->SetVisible(false); - if (show_disable_cookie_blocking_ui_) { + if (intermediate_step_ == IntermediateStep::kTurnOffButton) { text_->SetVisible(true); text_->SetText( l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_NOT_WORKING_DESCRIPTION)); + } else if (intermediate_step_ == IntermediateStep::kBlockingIsOn) { + header_view_->SetVisible(true); + header_view_->SetImage( + ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( + IDR_COOKIE_BLOCKING_ON_HEADER)); + text_->SetVisible(true); + text_->SetText( + l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE)); } else if (status_ == CookieControlsController::Status::kEnabled) { header_view_->SetVisible(true); header_view_->SetImage( @@ -122,6 +131,9 @@ has_blocked_cookies ? IDR_COOKIE_BLOCKING_ON_HEADER : IDR_COOKIE_BLOCKING_INACTIVE_HEADER)); text_->SetVisible(true); + text_->SetText(l10n_util::GetStringUTF16( + has_blocked_cookies ? IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE + : IDS_COOKIE_CONTROLS_NOTHING_BLOCKED_MESSAGE)); not_working_link_->SetVisible(has_blocked_cookies); blocked_cookies_.reset(); } else { @@ -136,7 +148,7 @@ // The show_disable_cookie_blocking_ui_ state has a different title // configuration. To avoid jumping UI, don't resize the bubble. This should be // safe as the bubble in this state has less content than in Enabled state. - if (!show_disable_cookie_blocking_ui_) + if (intermediate_step_ != IntermediateStep::kTurnOffButton) SizeToContents(); } @@ -148,7 +160,7 @@ } int CookieControlsBubbleView::GetDialogButtons() const { - if (show_disable_cookie_blocking_ui_ || + if (intermediate_step_ == IntermediateStep::kTurnOffButton || status_ == CookieControlsController::Status::kDisabledForSite) { return ui::DIALOG_BUTTON_OK; } @@ -157,16 +169,21 @@ base::string16 CookieControlsBubbleView::GetDialogButtonLabel( ui::DialogButton button) const { - if (show_disable_cookie_blocking_ui_) + if (intermediate_step_ == IntermediateStep::kTurnOffButton) return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON); DCHECK_EQ(status_, CookieControlsController::Status::kDisabledForSite); + DCHECK_EQ(intermediate_step_, IntermediateStep::kNone); return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURN_ON_BUTTON); } void CookieControlsBubbleView::Init() { - SetLayoutManager(std::make_unique<views::FillLayout>()); + // Use a BoxLayout because the view might be larger than |text_| and we want + // |text_| at the top. + SetLayoutManager(std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kVertical)); auto text = std::make_unique<views::Label>(base::string16(), - views::style::CONTEXT_LABEL); + views::style::CONTEXT_LABEL, + views::style::STYLE_SECONDARY); text->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); text->SetMultiLine(true); text_ = AddChildView(std::move(text)); @@ -196,11 +213,19 @@ } base::string16 CookieControlsBubbleView::GetWindowTitle() const { - if (show_disable_cookie_blocking_ui_) - return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_NOT_WORKING_TITLE); + switch (intermediate_step_) { + case IntermediateStep::kTurnOffButton: + return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_NOT_WORKING_TITLE); + case IntermediateStep::kBlockingIsOn: + return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURNED_ON_TITLE); + case IntermediateStep::kNone: { + // Determine title based on status_ instead. + } + } switch (status_) { case CookieControlsController::Status::kEnabled: - return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_DIALOG_TITLE); + return l10n_util::GetPluralStringFUTF16(IDS_COOKIE_CONTROLS_DIALOG_TITLE, + blocked_cookies_.value_or(0)); case CookieControlsController::Status::kDisabledForSite: return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_DIALOG_TITLE_OFF); case CookieControlsController::Status::kUninitialized: @@ -230,11 +255,14 @@ } bool CookieControlsBubbleView::Accept() { - if (show_disable_cookie_blocking_ui_) { + if (intermediate_step_ == IntermediateStep::kTurnOffButton) { controller_->OnCookieBlockingEnabledForSite(false); } else { DCHECK_EQ(status_, CookieControlsController::Status::kDisabledForSite); + DCHECK_EQ(intermediate_step_, IntermediateStep::kNone); controller_->OnCookieBlockingEnabledForSite(true); + intermediate_step_ = IntermediateStep::kBlockingIsOn; + UpdateUi(); } return false; } @@ -249,6 +277,6 @@ DCHECK_EQ(status_, CookieControlsController::Status::kEnabled); // Don't go through the controller as this is an intermediary state that // is only relevant for the bubble UI. - show_disable_cookie_blocking_ui_ = true; + intermediate_step_ = IntermediateStep::kTurnOffButton; UpdateUi(); }
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h index 79e17f1..78b0864 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h +++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h
@@ -38,10 +38,19 @@ static CookieControlsBubbleView* GetCookieBubble(); // CookieControlsView: - void OnStatusChanged(CookieControlsController::Status status) override; + void OnStatusChanged(CookieControlsController::Status status, + int blocked_cookies) override; void OnBlockedCookiesCountChanged(int blocked_cookies) override; private: + enum class IntermediateStep { + kNone, + // Show a button to disable cookie blocking on the current site. + kTurnOffButton, + // Show a confirmation that cookie blocking was turned on. + kBlockingIsOn, + }; + CookieControlsBubbleView(views::View* anchor_view, content::WebContents* web_contents, CookieControlsController* cookie_contols); @@ -72,9 +81,7 @@ CookieControlsController::Status status_ = CookieControlsController::Status::kUninitialized; - // If true, display an intermediate step with a button to disable cookie - // blocking on the current site. - bool show_disable_cookie_blocking_ui_ = false; + IntermediateStep intermediate_step_ = IntermediateStep::kNone; base::Optional<int> blocked_cookies_;
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.cc b/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.cc index 617c706..95b616f4 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.cc +++ b/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.cc
@@ -40,12 +40,14 @@ } void CookieControlsIconView::OnStatusChanged( - CookieControlsController::Status status) { + CookieControlsController::Status status, + int blocked_cookies) { if (status_ != status) { status_ = status; SetVisible(ShouldBeVisible()); UpdateIconImage(); } + OnBlockedCookiesCountChanged(blocked_cookies); } void CookieControlsIconView::OnBlockedCookiesCountChanged(int blocked_cookies) {
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.h b/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.h index 6669394..51d70664 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.h +++ b/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.h
@@ -21,7 +21,8 @@ ~CookieControlsIconView() override; // CookieControlsUI: - void OnStatusChanged(CookieControlsController::Status status) override; + void OnStatusChanged(CookieControlsController::Status status, + int blocked_cookies) override; void OnBlockedCookiesCountChanged(int blocked_cookies) override; // PageActionIconView:
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc index adddf25..12d4f78 100644 --- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc +++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
@@ -80,6 +80,37 @@ return 20; } +// Returns the avatar image for the current profile. May be called only in +// "normal" states where the user is guaranteed to have an avatar image (i.e. +// not kGenericProfile, not kGuestSession and not kIncognitoProfile). +const gfx::Image& GetAvatarImage(Profile* profile, + const gfx::Image& user_identity_image) { + ProfileAttributesEntry* entry = GetProfileAttributesEntry(profile); + DCHECK(entry); + // TODO(crbug.com/1012179): If kPersistUPAInProfileInfoCache feature is on, it + // should suffice to call entry->GetAvatarIcon(). For this to work well, this + // class needs to observe ProfileAttributesStorage instead of (or on top of) + // IdentityManager. Only then we can rely on |entry| being up to date (as the + // storage also observes IdentityManager so there's no guarantee on the order + // of notifications). + if (entry->IsUsingGAIAPicture() && entry->GetGAIAPicture()) + return *entry->GetGAIAPicture(); + + // Show |user_identity_image| when the following conditions are satisfied: + // - the user is migrated to Dice + // - the user isn't syncing + // - the profile icon wasn't explicitly changed + signin::IdentityManager* identity_manager = + IdentityManagerFactory::GetForProfile(profile); + if (!user_identity_image.IsEmpty() && + AccountConsistencyModeManager::IsDiceEnabledForProfile(profile) && + !identity_manager->HasPrimaryAccount() && entry->IsUsingDefaultAvatar()) { + return user_identity_image; + } + + return entry->GetAvatarIcon(); +} + } // namespace AvatarToolbarButton::AvatarToolbarButton(Browser* browser) @@ -155,13 +186,13 @@ // button is not yet added to the ToolbarView's hierarchy. if (!GetWidget()) return; - gfx::Image gaia_image = GetGaiaImage(); - SetImage(views::Button::STATE_NORMAL, GetAvatarIcon(gaia_image)); + gfx::Image user_identity_image = GetUserIdentityImage(); + SetImage(views::Button::STATE_NORMAL, GetAvatarIcon(user_identity_image)); // TODO(crbug.com/990286): Get rid of this logic completely when we cache the // Google account image in the profile cache and thus it is always available. if (identity_animation_state_ == IdentityAnimationState::kWaitingForImage && - !gaia_image.IsEmpty()) { + !user_identity_image.IsEmpty()) { ShowIdentityAnimation(); } } @@ -230,12 +261,6 @@ SetHighlight(text, color); } -void AvatarToolbarButton::SetAutofillIconVisible(bool autofill_icon_visible) { - DCHECK_NE(GetState(), State::kIncognitoProfile); - autofill_icon_visible_ = autofill_icon_visible; - UpdateText(); -} - void AvatarToolbarButton::ShowAvatarHighlightAnimation() { DCHECK_NE(GetState(), State::kIncognitoProfile); DCHECK_NE(GetState(), State::kGuestSession); @@ -448,7 +473,7 @@ } gfx::ImageSkia AvatarToolbarButton::GetAvatarIcon( - const gfx::Image& gaia_image) const { + const gfx::Image& user_identity_image) const { const int icon_size = ui::MaterialDesignController::touch_ui() ? kDefaultTouchableIconSize : GetIconSizeForNonTouchUi(); @@ -472,15 +497,10 @@ case State::kSyncError: case State::kSyncPaused: case State::kNormal: - if (!gaia_image.IsEmpty()) { - return profiles::GetSizedAvatarIcon(gaia_image, true, icon_size, - icon_size, profiles::SHAPE_CIRCLE) - .AsImageSkia(); - } // Profile attributes are non-null since the state is not kGenericProfile. - gfx::Image avatar_icon = - GetProfileAttributesEntry(profile_)->GetAvatarIcon(); - return profiles::GetSizedAvatarIcon(avatar_icon, true, icon_size, + const gfx::Image& avatar_image = + GetAvatarImage(profile_, user_identity_image); + return profiles::GetSizedAvatarIcon(avatar_image, true, icon_size, icon_size, profiles::SHAPE_CIRCLE) .AsImageSkia(); } @@ -488,35 +508,10 @@ return gfx::ImageSkia(); } -gfx::Image AvatarToolbarButton::GetGaiaImage() const { - ProfileAttributesEntry* entry = GetProfileAttributesEntry(profile_); - if (!entry) { - // This can happen if the user deletes the current profile. - return gfx::Image(); - } - - // If there is a GAIA image available, try to use that. - if (entry->IsUsingGAIAPicture()) { - // The GetGAIAPicture API call will trigger an async image load from disk if - // it has not been loaded. - const gfx::Image* gaia_image = entry->GetGAIAPicture(); - - if (gaia_image) - return *gaia_image; - return gfx::Image(); - } - - // Try to show the first account icon of the sync promo when the following - // conditions are satisfied: - // - the user is migrated to Dice - // - the user isn't signed in - // - the profile icon wasn't explicitly changed +gfx::Image AvatarToolbarButton::GetUserIdentityImage() const { signin::IdentityManager* identity_manager = IdentityManagerFactory::GetForProfile(profile_); - if (AccountConsistencyModeManager::IsDiceEnabledForProfile(profile_) && - !identity_manager->HasPrimaryAccount() && - identity_manager->HasUnconsentedPrimaryAccount() && - entry->IsUsingDefaultAvatar()) { + if (identity_manager && identity_manager->HasUnconsentedPrimaryAccount()) { base::Optional<AccountInfo> account_info = identity_manager ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId( @@ -553,7 +548,7 @@ #if !defined(OS_CHROMEOS) if (identity_manager->HasPrimaryAccount() && profile_->IsSyncAllowed() && - error_controller_.HasAvatarError() && !autofill_icon_visible_) { + error_controller_.HasAvatarError()) { // When DICE is enabled and the error is an auth error, the sync-paused // icon is shown. int unused;
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.h b/chrome/browser/ui/views/profiles/avatar_toolbar_button.h index 308d550..621e08e 100644 --- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.h +++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
@@ -36,7 +36,6 @@ void UpdateIcon(); void UpdateText(); - void SetAutofillIconVisible(bool autofill_icon_visible); void ShowAvatarHighlightAnimation(); private: @@ -109,8 +108,12 @@ base::string16 GetAvatarTooltipText() const; base::string16 GetProfileName() const; - gfx::ImageSkia GetAvatarIcon(const gfx::Image& gaia_image) const; - gfx::Image GetGaiaImage() const; + gfx::ImageSkia GetAvatarIcon(const gfx::Image& user_identity_image) const; + + // Returns the image of the unconsented primary account (if exists and already + // loaded), otherwise empty. + gfx::Image GetUserIdentityImage() const; + State GetState() const; void SetInsets(); @@ -132,11 +135,6 @@ // button sync paused/error state and update highlight color. bool highlight_animation_visible_ = false; - // Whether any autofill icon is visible in |this|'s parent container. Set by - // |ToolbarPageActionIconContainerView|. If true, hide avatar button sync - // paused/error state. - bool autofill_icon_visible_ = false; - IdentityAnimationState identity_animation_state_ = IdentityAnimationState::kNotShowing;
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc index e0c5595..f452966 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
@@ -296,7 +296,7 @@ gfx::ImageSkia sized_image = image.isNull() ? gfx::CreateVectorIcon(kUserAccountAvatarIcon, kIdentityImageSize, - kIdentityImageSize) + GetDefaultIconColor()) : CropCircle(SizeImage(image, kIdentityImageSize)); gfx::ImageSkia sized_badge = AddCircularBackground(SizeImage(badge, kBadgeSize), SK_ColorWHITE, @@ -409,9 +409,6 @@ views::BoxLayout::Orientation::kVertical)); } - account_features_container_->AddChildView( - std::make_unique<views::Separator>()); - views::Button* button = account_features_container_->AddChildView(std::make_unique<HoverButton>( this, SizeImage(ColorImage(icon, GetDefaultIconColor()), kIconSize),
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc index 496e453..3d5bb3d 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
@@ -60,6 +60,7 @@ #include "ui/events/event_utils.h" #include "ui/views/controls/button/label_button.h" #include "ui/views/controls/webview/webview.h" +#include "ui/views/test/widget_test.h" namespace { @@ -631,7 +632,9 @@ ASSERT_NO_FATAL_FAILURE(OpenProfileMenu()); AdvanceFocus(/*count=*/GetParam() + 1); ASSERT_TRUE(GetFocusedItem()); - ClickFocusedItem(); + Click(GetFocusedItem()); + LOG(INFO) << "Clicked item at index " << GetParam(); + base::RunLoop().RunUntilIdle(); histogram_tester_.ExpectUniqueSample( "Profile.Menu.ClickedActionableItem", @@ -655,15 +658,30 @@ void OpenProfileMenu() { BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser( target_browser_ ? target_browser_ : browser()); + + // Click the avatar button to open the menu. views::View* avatar_button = browser_view->toolbar()->GetAvatarToolbarButton(); - DCHECK(avatar_button); + ASSERT_TRUE(avatar_button); + Click(avatar_button); - ui::MouseEvent e(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), - ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0); - avatar_button->OnMousePressed(e); + ASSERT_TRUE(profile_menu_view()); + profile_menu_view()->set_close_on_deactivate(false); - ASSERT_TRUE(ProfileMenuView::IsShowing()); +#if defined(OS_MACOSX) + base::RunLoop().RunUntilIdle(); +#else + // If possible wait until the menu is active. + views::Widget* menu_widget = profile_menu_view()->GetWidget(); + ASSERT_TRUE(menu_widget); + if (menu_widget->CanActivate()) { + views::test::WidgetActivationWaiter(menu_widget, /*active=*/true).Wait(); + } else { + LOG(ERROR) << "menu_widget can not be activated"; + } +#endif + + LOG(INFO) << "Opening profile menu was successful"; } void AdvanceFocus(int count) { @@ -675,19 +693,20 @@ return profile_menu_view()->GetFocusManager()->GetFocusedView(); } - void ClickFocusedItem() { + void Click(views::View* clickable_view) { // Simulate a mouse click. Note: Buttons are either fired when pressed or // when released, so the corresponding methods need to be called. - GetFocusedItem()->OnMousePressed( + clickable_view->OnMousePressed( ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0)); - GetFocusedItem()->OnMouseReleased( + clickable_view->OnMouseReleased( ui::MouseEvent(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0)); } - views::View* profile_menu_view() { - return ProfileMenuViewBase::GetBubbleForTesting(); + ProfileMenuView* profile_menu_view() { + return static_cast<ProfileMenuView*>( + ProfileMenuViewBase::GetBubbleForTesting()); } base::test::ScopedFeatureList scoped_feature_list_;
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index d8ab19a..0ce5545 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -1915,6 +1915,15 @@ for (size_t i = 0; i < tabs_dragging.size(); ++i) tabs_dragging[i]->Paint(paint_info); + // If dragging more than one grouped tab, paint the group underline above + // those tabs. Otherwise, the non-active tabs will not get an underline. + // All dragging tabs should belong to the same group, per TabDragController. + if (tabs_dragging.size() > 0) { + const base::Optional<TabGroupId> dragged_group = tabs_dragging[0]->group(); + if (dragged_group.has_value()) + group_underlines_[dragged_group.value()]->Paint(paint_info); + } + // If the active tab is being dragged, it goes last. if (active_tab && is_dragging) active_tab->Paint(paint_info);
diff --git a/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.cc b/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.cc index 6bf4a7c6d..9fcf99a 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.cc
@@ -73,18 +73,6 @@ UpdateAllIcons(); } -void ToolbarAccountIconContainerView::ChildVisibilityChanged(View* child) { - // The avatar should not show UI for paused state or error state when any icon - // in the toolbar page action icon container view is visible. - // If it is in Incognito window, the avatar button shows a text "Incognito" - // which should not be updated in any case. - if (browser_->profile()->IsIncognitoProfile()) - return; - - avatar_->SetAutofillIconVisible( - page_action_icon_container_view_->IsAnyIconVisible()); -} - SkColor ToolbarAccountIconContainerView::GetIconColor() const { return GetThemeProvider()->GetColor( ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON);
diff --git a/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.h b/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.h index 6e48c71..a0ce1a6 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.h +++ b/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.h
@@ -32,7 +32,6 @@ // views::View: void OnThemeChanged() override; - void ChildVisibilityChanged(View* child) override; PageActionIconContainerView* page_action_icon_container() { return page_action_icon_container_view_;
diff --git a/chrome/browser/ui/webui/signin/user_manager_screen_handler.h b/chrome/browser/ui/webui/signin/user_manager_screen_handler.h index 0e405c5..87dc733 100644 --- a/chrome/browser/ui/webui/signin/user_manager_screen_handler.h +++ b/chrome/browser/ui/webui/signin/user_manager_screen_handler.h
@@ -69,7 +69,6 @@ void HandleRemoveUser(const base::ListValue* args); void HandleAreAllProfilesLocked(const base::ListValue* args); void HandleRemoveUserWarningLoadStats(const base::ListValue* args); - void HandleGetRemoveWarningDialogMessage(const base::ListValue* args); // Function used to gather statistics from a profile. void GatherStatistics(base::Time start_time, Profile* profile);
diff --git a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc index 7351322..bf4ac9e 100644 --- a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc +++ b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
@@ -3286,11 +3286,9 @@ #if BUILDFLAG(SAFE_BROWSING_DB_LOCAL) // Verify CheckSafeBrowsingReputation() is called when user starts filling -// username or password field, and that this function is only called once. -// TODO(crbug.com/1008402): Enable this test after fixing the linked bug. -TEST_F( - PasswordAutofillAgentTest, - DISABLED_CheckSafeBrowsingReputationWhenUserStartsFillingUsernamePassword) { +// a password field, and that this function is only called once. +TEST_F(PasswordAutofillAgentTest, + CheckSafeBrowsingReputationWhenUserStartsFillingUsernamePassword) { ASSERT_EQ(0, fake_driver_.called_check_safe_browsing_reputation_cnt()); // Simulate a click on password field to set its on focus, // CheckSafeBrowsingReputation() should be called. @@ -3302,14 +3300,20 @@ SimulatePasswordTyping("modify"); base::RunLoop().RunUntilIdle(); EXPECT_EQ(1, fake_driver_.called_check_safe_browsing_reputation_cnt()); + + // No CheckSafeBrowsingReputation() call on username field click. SimulateElementClick(kUsernameName); base::RunLoop().RunUntilIdle(); EXPECT_EQ(1, fake_driver_.called_check_safe_browsing_reputation_cnt()); - // Navigate to another page and click on username field, + SimulateElementClick(kPasswordName); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1, fake_driver_.called_check_safe_browsing_reputation_cnt()); + + // Navigate to another page and click on password field, // CheckSafeBrowsingReputation() should be triggered again. LoadHTML(kFormHTML); - SimulateElementClick(kUsernameName); + SimulateElementClick(kPasswordName); base::RunLoop().RunUntilIdle(); EXPECT_EQ(2, fake_driver_.called_check_safe_browsing_reputation_cnt()); }
diff --git a/chrome/renderer/translate/translate_script_browsertest.cc b/chrome/renderer/translate/translate_script_browsertest.cc index 80d3ac87..69740d0 100644 --- a/chrome/renderer/translate/translate_script_browsertest.cc +++ b/chrome/renderer/translate/translate_script_browsertest.cc
@@ -79,11 +79,9 @@ protected: void InjectElementLibrary() { - std::string script; - base::StringPiece translate_js = - ui::ResourceBundle::GetSharedInstance().GetRawDataResource( + std::string script = + ui::ResourceBundle::GetSharedInstance().DecompressDataResource( IDR_TRANSLATE_JS); - translate_js.CopyToString(&script); script += kElementJs; ExecuteScript(script); }
diff --git a/chrome/test/data/extensions/api_test/certificate_provider/request_pin/operated.js b/chrome/test/data/extensions/api_test/certificate_provider/request_pin/operated.js index c3e0264..f270c478 100644 --- a/chrome/test/data/extensions/api_test/certificate_provider/request_pin/operated.js +++ b/chrome/test/data/extensions/api_test/certificate_provider/request_pin/operated.js
@@ -5,8 +5,9 @@ // The script runs commands against the PIN API that it receives from the C++ // side. -const SIGN_REQUEST_ID = 123; +const INITIAL_SIGN_REQUEST_ID = 123; +let signRequestId = INITIAL_SIGN_REQUEST_ID; let pinRequestCount = 0; let pinRequestStopCount = 0; @@ -59,20 +60,23 @@ function processTestCommand(command) { switch (command) { case 'Request': - requestPin({signRequestId: SIGN_REQUEST_ID}); + requestPin({signRequestId: signRequestId}); break; case 'RequestWithZeroAttempts': - requestPin({signRequestId: SIGN_REQUEST_ID, attemptsLeft: 0}); + requestPin({signRequestId: signRequestId, attemptsLeft: 0}); break; case 'RequestWithNegativeAttempts': - requestPin({signRequestId: SIGN_REQUEST_ID, attemptsLeft: -1}); + requestPin({signRequestId: signRequestId, attemptsLeft: -1}); break; case 'Stop': - stopPinRequest({signRequestId: SIGN_REQUEST_ID}); + stopPinRequest({signRequestId: signRequestId}); break; case 'StopWithUnknownError': stopPinRequest( - {signRequestId: SIGN_REQUEST_ID, errorType: 'UNKNOWN_ERROR'}); + {signRequestId: signRequestId, errorType: 'UNKNOWN_ERROR'}); + break; + case 'IncrementRequestId': + ++signRequestId; break; default: chrome.test.fail();
diff --git a/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js b/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js index 85c1ea8..5ebb16b 100644 --- a/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js +++ b/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js
@@ -351,7 +351,7 @@ ]), }; -TEST_F('CrElementsFingerprintProgressArcTest', 'All', function() { +TEST_F('CrElementsFingerprintProgressArcTest', 'DISABLED_All', function() { mocha.run(); });
diff --git a/components/arc/mojom/intent_common.mojom b/components/arc/mojom/intent_common.mojom index d18b11e..aedd017e 100644 --- a/components/arc/mojom/intent_common.mojom +++ b/components/arc/mojom/intent_common.mojom
@@ -10,6 +10,7 @@ VIEW, // Can handle only one URL. SEND, // Can handle only one URL. SEND_MULTIPLE, // Can handle multiple URLs. + CREATE_NOTE, // Can handle only one URL. }; // Describes an activity.
diff --git a/components/arc/session/arc_vm_client_adapter.cc b/components/arc/session/arc_vm_client_adapter.cc index 5e13fe0..cec142fd 100644 --- a/components/arc/session/arc_vm_client_adapter.cc +++ b/components/arc/session/arc_vm_client_adapter.cc
@@ -32,11 +32,19 @@ } // namespace class ArcVmClientAdapter : public ArcClientAdapter, - public chromeos::ConciergeClient::VmObserver { + public chromeos::ConciergeClient::VmObserver, + public chromeos::ConciergeClient::Observer { public: - ArcVmClientAdapter() { GetConciergeClient()->AddVmObserver(this); } + ArcVmClientAdapter() { + auto* client = GetConciergeClient(); + client->AddVmObserver(this); + client->AddObserver(this); + } + ~ArcVmClientAdapter() override { - GetConciergeClient()->RemoveVmObserver(this); + auto* client = GetConciergeClient(); + client->RemoveObserver(this); + client->RemoveVmObserver(this); } // chromeos::ConciergeClient::VmObserver overrides: @@ -95,6 +103,8 @@ void StopArcInstance() override { VLOG(1) << "Stopping arcvm"; + // TODO(yusukes): This method should eventually call ArcInstanceStopped() + // even when only the (yet nonexistent) 'mini' VM is running. std::vector<std::string> env{{"USER_ID_HASH=" + user_id_hash_}}; chromeos::UpstartClient::Get()->StopJob( "arcvm", env, @@ -107,6 +117,16 @@ user_id_hash_ = hash; } + // chromeos::ConciergeClient::Observer overrides: + void ConciergeServiceStopped() override { + VLOG(1) << "vm_concierge stopped"; + // At this point, all crosvm processes are gone. Notify the observer of the + // event. + OnArcInstanceStopped(); + } + + void ConciergeServiceRestarted() override {} + private: void OnArcInstanceStopped() { VLOG(1) << "arcvm stopped.";
diff --git a/components/arc/test/fake_file_system_instance.cc b/components/arc/test/fake_file_system_instance.cc index 5a10403..ef07647 100644 --- a/components/arc/test/fake_file_system_instance.cc +++ b/components/arc/test/fake_file_system_instance.cc
@@ -565,6 +565,7 @@ mojom::OpenUrlsRequestPtr request, OpenUrlsWithPermissionCallback callback) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + handled_url_requests_.emplace_back(std::move(request)); } std::string FakeFileSystemInstance::FindChildDocumentId(
diff --git a/components/arc/test/fake_file_system_instance.h b/components/arc/test/fake_file_system_instance.h index ffe8595..47f64df 100644 --- a/components/arc/test/fake_file_system_instance.h +++ b/components/arc/test/fake_file_system_instance.h
@@ -217,6 +217,14 @@ // |bytes| bytes. std::string GetFileContent(const std::string& url, size_t bytes); + // For clearing the list of handled requests + void clear_handled_requests() { handled_url_requests_.clear(); } + + // For validating the url requests in testing. + const std::vector<mojom::OpenUrlsRequestPtr>& handledUrlRequests() const { + return handled_url_requests_; + } + // mojom::FileSystemInstance: void AddWatcher(const std::string& authority, const std::string& document_id, @@ -326,6 +334,9 @@ // Mapping from a watcher ID to a document key. std::map<int64_t, DocumentKey> watcher_to_document_; + // List of all OpenUrlsRequests made to the fake_file_system_instance + std::vector<mojom::OpenUrlsRequestPtr> handled_url_requests_; + // List of roots added by AddRoot(). std::vector<Root> roots_;
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc index 16cb2898..88ff0eaf 100644 --- a/components/autofill/content/renderer/password_autofill_agent.cc +++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -736,33 +736,27 @@ return true; } -bool PasswordAutofillAgent::IsUsernameOrPasswordField( +void PasswordAutofillAgent::MaybeCheckSafeBrowsingReputation( const WebInputElement& element) { + // Enabled on desktop and Android +#if BUILDFLAG(FULL_SAFE_BROWSING) || BUILDFLAG(SAFE_BROWSING_DB_REMOTE) // Note: A site may use a Password field to collect a CVV or a Credit Card // number, but showing a slightly misleading warning here is better than // showing no warning at all. - if (element.IsPasswordFieldForAutofill()) - return true; + if (!element.IsPasswordFieldForAutofill()) + return; + if (checked_safe_browsing_reputation_) + return; - // If a field declares itself a username input, show the warning. - if (AutocompleteFlagForElement(element) == AutocompleteFlag::USERNAME) - return true; - - // Otherwise, analyze the form and return true if this input element seems - // to be the username field. - std::unique_ptr<PasswordForm> password_form; - if (element.Form().IsNull()) { - // To double check that element's frame and |render_frame()->GetWebFrame()| - // which is used in |GetPasswordFormFromUnownedInputElements| are identical. - DCHECK_EQ(element.GetDocument().GetFrame(), render_frame()->GetWebFrame()); - password_form = GetPasswordFormFromUnownedInputElements(); - } else { - password_form = GetPasswordFormFromWebForm(element.Form()); - } - - if (!password_form) - return false; - return (password_form->username_element == element.NameForAutofill().Utf16()); + checked_safe_browsing_reputation_ = true; + WebLocalFrame* frame = render_frame()->GetWebFrame(); + GURL frame_url = GURL(frame->GetDocument().Url()); + GURL action_url = element.Form().IsNull() + ? GURL() + : form_util::GetCanonicalActionForForm(element.Form()); + GetPasswordManagerDriver()->CheckSafeBrowsingReputation(action_url, + frame_url); +#endif } bool PasswordAutofillAgent::TryToShowTouchToFill( @@ -793,22 +787,7 @@ if (!FindPasswordInfoForElement(element, &username_element, &password_element, &password_info)) { - if (IsUsernameOrPasswordField(element)) { - WebLocalFrame* frame = render_frame()->GetWebFrame(); - GURL frame_url = GURL(frame->GetDocument().Url()); -// Enabled on desktop and Android -#if BUILDFLAG(FULL_SAFE_BROWSING) || BUILDFLAG(SAFE_BROWSING_DB_REMOTE) - if (!checked_safe_browsing_reputation_) { - checked_safe_browsing_reputation_ = true; - GURL action_url = - element.Form().IsNull() - ? GURL() - : form_util::GetCanonicalActionForForm(element.Form()); - GetPasswordManagerDriver()->CheckSafeBrowsingReputation(action_url, - frame_url); - } -#endif - } + MaybeCheckSafeBrowsingReputation(element); return false; }
diff --git a/components/autofill/content/renderer/password_autofill_agent.h b/components/autofill/content/renderer/password_autofill_agent.h index 8f910d4..22a03b2 100644 --- a/components/autofill/content/renderer/password_autofill_agent.h +++ b/components/autofill/content/renderer/password_autofill_agent.h
@@ -172,8 +172,9 @@ bool DidClearAutofillSelection( const blink::WebFormControlElement& control_element); - // Returns whether the element is a username or password textfield. - bool IsUsernameOrPasswordField(const blink::WebInputElement& element); + // Sends a reputation check request in case if |element| has type password and + // no check request were sent from this frame load. + void MaybeCheckSafeBrowsingReputation(const blink::WebInputElement& element); // Asks the agent to show the touch to fill UI for |control_element|. Returns // whether the agent was able to do so.
diff --git a/components/autofill/content/renderer/password_form_conversion_utils.cc b/components/autofill/content/renderer/password_form_conversion_utils.cc index 597a023..c60a5360fb 100644 --- a/components/autofill/content/renderer/password_form_conversion_utils.cc +++ b/components/autofill/content/renderer/password_form_conversion_utils.cc
@@ -33,83 +33,6 @@ namespace { -constexpr char kAutocompleteUsername[] = "username"; -constexpr char kAutocompleteCurrentPassword[] = "current-password"; -constexpr char kAutocompleteNewPassword[] = "new-password"; -constexpr char kAutocompleteCreditCardPrefix[] = "cc-"; - -// Parses the string with the value of an autocomplete attribute. If any of the -// tokens "username", "current-password" or "new-password" are present, returns -// an appropriate enum value, picking an arbitrary one if more are applicable. -// Otherwise, it returns CREDIT_CARD if a token with a "cc-" prefix is found. -// Otherwise, returns NONE. -AutocompleteFlag ExtractAutocompleteFlag(const std::string& attribute) { - std::vector<base::StringPiece> tokens = - base::SplitStringPiece(attribute, base::kWhitespaceASCII, - base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); - bool cc_seen = false; - for (base::StringPiece token : tokens) { - if (base::LowerCaseEqualsASCII(token, kAutocompleteUsername)) - return AutocompleteFlag::USERNAME; - if (base::LowerCaseEqualsASCII(token, kAutocompleteCurrentPassword)) - return AutocompleteFlag::CURRENT_PASSWORD; - if (base::LowerCaseEqualsASCII(token, kAutocompleteNewPassword)) - return AutocompleteFlag::NEW_PASSWORD; - - if (!cc_seen) { - cc_seen = base::StartsWith(token, kAutocompleteCreditCardPrefix, - base::CompareCase::SENSITIVE); - } - } - return cc_seen ? AutocompleteFlag::CREDIT_CARD : AutocompleteFlag::NONE; -} - -// Helper to spare map::find boilerplate when caching field's autocomplete -// attributes. -class AutocompleteCache { - public: - AutocompleteCache(); - - ~AutocompleteCache(); - - // Computes and stores the AutocompleteFlag for |field| based on its - // autocomplete attribute. Note that this cannot be done on-demand during - // RetrieveFor, because the cache spares space and look-up time by not storing - // AutocompleteFlag::NONE values, hence for all elements without an - // autocomplete attribute, every retrieval would result in a new computation. - void Store(const FormFieldData* field); - - // Retrieves the value previously stored for |field|. - AutocompleteFlag RetrieveFor(const FormFieldData* field) const; - - private: - std::map<const FormFieldData*, AutocompleteFlag> cache_; - - DISALLOW_COPY_AND_ASSIGN(AutocompleteCache); -}; - -AutocompleteCache::AutocompleteCache() = default; - -AutocompleteCache::~AutocompleteCache() = default; - -void AutocompleteCache::Store(const FormFieldData* field) { - const AutocompleteFlag flag = - ExtractAutocompleteFlag(field->autocomplete_attribute); - // Only store non-trivial flags. Most of the elements will have the NONE - // value, so spare storage and lookup time by assuming anything not stored in - // |cache_| has the NONE flag. - if (flag != AutocompleteFlag::NONE) - cache_[field] = flag; -} - -AutocompleteFlag AutocompleteCache::RetrieveFor( - const FormFieldData* field) const { - auto it = cache_.find(field); - if (it == cache_.end()) - return AutocompleteFlag::NONE; - return it->second; -} - const char kPasswordSiteUrlRegex[] = "passwords(?:-[a-z-]+\\.corp)?\\.google\\.com"; @@ -151,13 +74,6 @@ } // namespace -AutocompleteFlag AutocompleteFlagForElement(const WebInputElement& element) { - static const base::NoDestructor<WebString> kAutocomplete(("autocomplete")); - return ExtractAutocompleteFlag( - element.GetAttribute(*kAutocomplete) - .Utf8(WebString::UTF8ConversionMode::kStrictReplacingErrorsWithFFFD)); -} - re2::RE2* CreateMatcher(void* instance, const char* pattern) { re2::RE2::Options options; options.set_case_sensitive(false);
diff --git a/components/autofill/content/renderer/password_form_conversion_utils.h b/components/autofill/content/renderer/password_form_conversion_utils.h index 40585c4..3674d43 100644 --- a/components/autofill/content/renderer/password_form_conversion_utils.h +++ b/components/autofill/content/renderer/password_form_conversion_utils.h
@@ -19,7 +19,6 @@ namespace blink { class WebFormElement; -class WebInputElement; class WebLocalFrame; } @@ -30,23 +29,8 @@ namespace autofill { struct PasswordForm; - class FieldDataManager; -// The susbset of autocomplete flags related to passwords. -enum class AutocompleteFlag { - NONE, - USERNAME, - CURRENT_PASSWORD, - NEW_PASSWORD, - // Represents the whole family of cc-* flags. - CREDIT_CARD -}; - -// Returns the AutocompleteFlag derived from |element|'s autocomplete attribute. -AutocompleteFlag AutocompleteFlagForElement( - const blink::WebInputElement& element); - // The caller of this function is responsible for deleting the returned object. re2::RE2* CreateMatcher(void* instance, const char* pattern);
diff --git a/components/autofill_assistant/browser/devtools/devtools_api/domain_cc.template b/components/autofill_assistant/browser/devtools/devtools_api/domain_cc.template index ffa1cde..309c087 100644 --- a/components/autofill_assistant/browser/devtools/devtools_api/domain_cc.template +++ b/components/autofill_assistant/browser/devtools/devtools_api/domain_cc.template
@@ -48,8 +48,9 @@ {% set method_name = command.name | sanitize_literal | to_title_case %} void {{class_name}}::{{method_name}}( std::unique_ptr<{{method_name}}Params> params, + const std::string& optional_node_frame_id, base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)> callback) { - dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), base::BindOnce(&Domain::Handle{{method_name}}Response, std::move(callback))); + dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), optional_node_frame_id, base::BindOnce(&Domain::Handle{{method_name}}Response, std::move(callback))); } {# Generate convenience methods that take the required parameters directly. #} {% if not "parameters" in command %}{% continue %}{% endif %} @@ -65,6 +66,7 @@ {{resolve_type(parameter).pass_type}} {{parameter.name | camelcase_to_hacker_style -}} {% endfor %} {% if command.get("parameters", []) and not command.parameters[0].get("optional", False) %}, {% endif %}{# -#} + const std::string& optional_node_frame_id, {% if command.get("returns", []) -%} base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)> callback{##} {% else -%} @@ -81,16 +83,16 @@ .Build(); {# Send the message. #} {% if command.get("returns", []) -%} - dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), base::BindOnce(&Domain::Handle{{method_name}}Response, std::move(callback))); + dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), optional_node_frame_id, base::BindOnce(&Domain::Handle{{method_name}}Response, std::move(callback))); {% else %} - dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), std::move(callback)); + dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), optional_node_frame_id, std::move(callback)); {% endif %} } {# If the command has no return value, generate a convenience method that #} {# accepts a base::OnceClosure together with the parameters object. #} {% if not command.get("returns", []) %} -void {{class_name}}::{{method_name}}(std::unique_ptr<{{method_name}}Params> params, base::OnceClosure callback) { - dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), std::move(callback)); +void {{class_name}}::{{method_name}}(std::unique_ptr<{{method_name}}Params> params, const std::string& optional_node_frame_id, base::OnceClosure callback) { + dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), optional_node_frame_id, std::move(callback)); } {% endif %} {% endfor %}
diff --git a/components/autofill_assistant/browser/devtools/devtools_api/domain_h.template b/components/autofill_assistant/browser/devtools/devtools_api/domain_h.template index 785d4cd..0d0afca 100644 --- a/components/autofill_assistant/browser/devtools/devtools_api/domain_h.template +++ b/components/autofill_assistant/browser/devtools/devtools_api/domain_h.template
@@ -23,7 +23,7 @@ {% if command.description %} // {{ command.description.replace('\n', '\n // ') }} {% endif %} - void {{method_name}}(std::unique_ptr<{{method_name}}Params> params, base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)> callback = base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)>()); + void {{method_name}}(std::unique_ptr<{{method_name}}Params> params, const std::string& optional_node_frame_id, base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)> callback = base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)>()); {# Generate convenience methods that take the required parameters directly. #} {# Don't generate these for experimental commands. #} {% if "parameters" in command and not command.experimental %} @@ -36,6 +36,7 @@ {{resolve_type(parameter).pass_type}} {{parameter.name | camelcase_to_hacker_style -}} {% endfor %} {% if command.get("parameters", []) and not command.parameters[0].get("optional", False) %}, {% endif %}{# -#} + const std::string& optional_node_frame_id, {% if command.get("returns", []) -%} base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)> callback = base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)>(){##} {% else -%} @@ -44,7 +45,7 @@ {# If the command has no return value, generate a convenience method that #} {# accepts a base::Closure together with the parameters object. #} {% if not command.get("returns", []) %} - void {{method_name}}(std::unique_ptr<{{method_name}}Params> params, base::OnceClosure callback); + void {{method_name}}(std::unique_ptr<{{method_name}}Params> params, const std::string& optional_node_frame_id, base::OnceClosure callback); {% endif %} {% endif %} {% endmacro %}
diff --git a/components/autofill_assistant/browser/devtools/devtools_client.cc b/components/autofill_assistant/browser/devtools/devtools_client.cc index 39911cd..964d07bb 100644 --- a/components/autofill_assistant/browser/devtools/devtools_client.cc +++ b/components/autofill_assistant/browser/devtools/devtools_client.cc
@@ -26,14 +26,18 @@ dom_domain_(this), runtime_domain_(this), network_domain_(this), + target_domain_(this), renderer_crashed_(false), - next_message_id_(0) { + next_message_id_(0), + frame_tracker_(this) { browser_main_thread_ = base::CreateSingleThreadTaskRunner({content::BrowserThread::UI}); agent_host_->AttachClient(this); + frame_tracker_.Start(); } DevtoolsClient::~DevtoolsClient() { + frame_tracker_.Stop(); agent_host_->DetachClient(this); } @@ -53,27 +57,43 @@ return &network_domain_; } +target::ExperimentalDomain* DevtoolsClient::GetTarget() { + return &target_domain_; +} + void DevtoolsClient::SendMessage( const char* method, std::unique_ptr<base::Value> params, + const std::string& optional_node_frame_id, base::OnceCallback<void(const ReplyStatus&, const base::Value&)> callback) { - SendMessageWithParams(method, std::move(params), std::move(callback)); + SendMessageWithParams(method, std::move(params), optional_node_frame_id, + std::move(callback)); } void DevtoolsClient::SendMessage(const char* method, std::unique_ptr<base::Value> params, + const std::string& optional_node_frame_id, base::OnceClosure callback) { - SendMessageWithParams(method, std::move(params), std::move(callback)); + SendMessageWithParams(method, std::move(params), optional_node_frame_id, + std::move(callback)); } template <typename CallbackType> -void DevtoolsClient::SendMessageWithParams(const char* method, - std::unique_ptr<base::Value> params, - CallbackType callback) { +void DevtoolsClient::SendMessageWithParams( + const char* method, + std::unique_ptr<base::Value> params, + const std::string& optional_node_frame_id, + CallbackType callback) { base::DictionaryValue message; message.SetString("method", method); message.Set("params", std::move(params)); + std::string optional_session_id = + GetSessionIdForFrame(optional_node_frame_id); + if (!optional_session_id.empty()) { + message.SetString("sessionId", optional_session_id); + } + if (renderer_crashed_) return; int id = next_message_id_; @@ -95,6 +115,11 @@ event_handlers_[method] = std::move(callback); } +void DevtoolsClient::UnregisterEventHandler(const char* method) { + DCHECK(event_handlers_.find(method) != event_handlers_.end()); + event_handlers_.erase(method); +} + void DevtoolsClient::DispatchProtocolMessage( content::DevToolsAgentHost* agent_host, const std::string& json_message) { @@ -254,6 +279,11 @@ renderer_crashed_ = true; } +std::string DevtoolsClient::GetSessionIdForFrame( + const std::string& frame_id) const { + return frame_tracker_.GetSessionIdForFrame(frame_id); +} + DevtoolsClient::Callback::Callback() = default; DevtoolsClient::Callback::Callback(Callback&& other) = default; @@ -270,4 +300,114 @@ DevtoolsClient::Callback& DevtoolsClient::Callback::operator=( Callback&& other) = default; +DevtoolsClient::FrameTracker::FrameTracker(DevtoolsClient* client) + : client_(client) {} + +DevtoolsClient::FrameTracker::~FrameTracker() = default; + +void DevtoolsClient::FrameTracker::Start() { + client_->RegisterEventHandler( + "Target.attachedToTarget", + base::BindRepeating(&DevtoolsClient::FrameTracker::OnAttachedToTarget, + weak_ptr_factory_.GetWeakPtr())); + client_->RegisterEventHandler( + "Target.detachedFromTarget", + base::BindRepeating(&DevtoolsClient::FrameTracker::OnDetachedFromTarget, + weak_ptr_factory_.GetWeakPtr())); + + started_ = true; + + // Start auto attaching so that we can keep track of what session got started + // for what target. We use flatten = true to cover the entire frame tree. + client_->GetTarget()->SetAutoAttach( + target::SetAutoAttachParams::Builder() + .SetAutoAttach(true) + .SetWaitForDebuggerOnStart(false) + .SetFlatten(true) + .Build(), + /* node_frame_id= */ "", + base::BindOnce(&DevtoolsClient::FrameTracker::OnSetAutoAttach, + weak_ptr_factory_.GetWeakPtr())); +} + +void DevtoolsClient::FrameTracker::Stop() { + if (!started_) { + return; + } + + client_->UnregisterEventHandler("Target.attachedToTarget"); + client_->UnregisterEventHandler("Target.detachedFromTarget"); + + started_ = false; +} + +void DevtoolsClient::FrameTracker::OnSetAutoAttach( + const DevtoolsClient::ReplyStatus& reply_status, + std::unique_ptr<target::SetAutoAttachResult> result) { + // This is not used since result doesn't contain anything useful. The real + // action is happening in the On(Attached|Detached) functions. + DCHECK(result); +} + +std::string DevtoolsClient::FrameTracker::GetSessionIdForFrame( + std::string frame_id) const { + if (frame_id.empty()) { + return std::string(); + } + + auto it = sessions_map_.find(frame_id); + if (it != sessions_map_.end()) { + return it->second; + } + DVLOG(3) << "No session id for frame_id: " << frame_id; + return std::string(); +} + +std::string DevtoolsClient::FrameTracker::FindTargetId( + const base::Value& value) { + const base::Value* target_info = value.FindKey("targetInfo"); + if (!target_info) { + DVLOG(3) << "No target_info found in " << value; + return std::string(); + } + const std::string* target_id = target_info->FindStringKey("targetId"); + if (!target_id) { + DVLOG(3) << "No target_id found in " << *target_info; + return std::string(); + } + + return *target_id; +} + +std::string DevtoolsClient::FrameTracker::FindSessionId( + const base::Value& value) { + const std::string* session_id = value.FindStringKey("sessionId"); + if (!session_id) { + DVLOG(3) << "No session_id found in " << value; + return std::string(); + } + + return *session_id; +} + +void DevtoolsClient::FrameTracker::OnAttachedToTarget( + const base::Value& value) { + std::string session_id = FindSessionId(value); + std::string target_id = FindTargetId(value); + + if (!session_id.empty() && !target_id.empty()) { + sessions_map_[target_id] = session_id; + } +} + +void DevtoolsClient::FrameTracker::OnDetachedFromTarget( + const base::Value& value) { + std::string target_id = FindTargetId(value); + + auto it = sessions_map_.find(target_id); + if (it != sessions_map_.end()) { + sessions_map_.erase(it); + } +} + } // namespace autofill_assistant.
diff --git a/components/autofill_assistant/browser/devtools/devtools_client.h b/components/autofill_assistant/browser/devtools/devtools_client.h index 4b86b9e..2ec99084 100644 --- a/components/autofill_assistant/browser/devtools/devtools_client.h +++ b/components/autofill_assistant/browser/devtools/devtools_client.h
@@ -23,6 +23,7 @@ #include "components/autofill_assistant/browser/devtools/devtools/domains/input.h" #include "components/autofill_assistant/browser/devtools/devtools/domains/network.h" #include "components/autofill_assistant/browser/devtools/devtools/domains/runtime.h" +#include "components/autofill_assistant/browser/devtools/devtools/domains/target.h" #include "components/autofill_assistant/browser/devtools/message_dispatcher.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/devtools_agent_host_client.h" @@ -39,19 +40,23 @@ dom::Domain* GetDOM(); runtime::Domain* GetRuntime(); network::Domain* GetNetwork(); + target::ExperimentalDomain* GetTarget(); // MessageDispatcher implementation: void SendMessage( const char* method, std::unique_ptr<base::Value> params, + const std::string& optional_node_frame_id, base::OnceCallback<void(const ReplyStatus&, const base::Value&)> callback) override; void SendMessage(const char* method, std::unique_ptr<base::Value> params, + const std::string& optional_node_frame_id, base::OnceClosure callback) override; void RegisterEventHandler( const char* method, base::RepeatingCallback<void(const base::Value&)> callback) override; + void UnregisterEventHandler(const char* method) override; // content::DevToolsAgentHostClient overrides: void DispatchProtocolMessage(content::DevToolsAgentHost* agent_host, @@ -76,9 +81,52 @@ callback_with_result; }; + // Manages a map to retrieve a session id from a given frame id. Registers + // itself to client events. + class FrameTracker { + public: + // Register the event handlers and start tracking new targets. |client| + // must outlive this frame tracker. + FrameTracker(DevtoolsClient* client); + ~FrameTracker(); + + void Start(); + void Stop(); + + // Returns empty string if there is no session for the given |frame_id|. + std::string GetSessionIdForFrame(std::string frame_id) const; + + private: + void OnSetAutoAttach(const DevtoolsClient::ReplyStatus& reply_status, + std::unique_ptr<target::SetAutoAttachResult> result); + void OnAttachedToTarget(const base::Value& value); + void OnDetachedFromTarget(const base::Value& value); + + // Save find of targetInfo.targetId in the given value. Returns + // empty string if nothing is found. + std::string FindTargetId(const base::Value& value); + + // Find sessionId in the given value. Returns empty string if nothing is + // found. + std::string FindSessionId(const base::Value& value); + + DevtoolsClient* client_; + bool started_ = false; + + // Holds the mappings from frame id to session id. + std::unordered_map<std::string, std::string> sessions_map_; + + base::WeakPtrFactory<FrameTracker> weak_ptr_factory_{this}; + DISALLOW_COPY_AND_ASSIGN(FrameTracker); + }; + + // If the frame is known to devtools, return the session id for it. + std::string GetSessionIdForFrame(const std::string& frame_id) const; + template <typename CallbackType> void SendMessageWithParams(const char* method, std::unique_ptr<base::Value> params, + const std::string& optional_node_frame_id, CallbackType callback); bool DispatchMessageReply(std::unique_ptr<base::Value> owning_message, const base::DictionaryValue& message_dict); @@ -105,10 +153,12 @@ dom::ExperimentalDomain dom_domain_; runtime::ExperimentalDomain runtime_domain_; network::ExperimentalDomain network_domain_; + target::ExperimentalDomain target_domain_; std::unordered_map<int, Callback> pending_messages_; EventHandlerMap event_handlers_; bool renderer_crashed_; int next_message_id_; + FrameTracker frame_tracker_; base::WeakPtrFactory<DevtoolsClient> weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(DevtoolsClient);
diff --git a/components/autofill_assistant/browser/devtools/message_dispatcher.h b/components/autofill_assistant/browser/devtools/message_dispatcher.h index a517138..71126c85 100644 --- a/components/autofill_assistant/browser/devtools/message_dispatcher.h +++ b/components/autofill_assistant/browser/devtools/message_dispatcher.h
@@ -38,15 +38,18 @@ virtual void SendMessage( const char* method, std::unique_ptr<base::Value> params, + const std::string& optional_node_frame_id, base::OnceCallback<void(const ReplyStatus&, const base::Value&)> callback) = 0; virtual void SendMessage(const char* method, std::unique_ptr<base::Value> params, + const std::string& optional_node_frame_id, base::OnceClosure callback) = 0; virtual void RegisterEventHandler( const char* method, base::RepeatingCallback<void(const base::Value&)> callback) = 0; + virtual void UnregisterEventHandler(const char* method) = 0; protected: virtual ~MessageDispatcher() {}
diff --git a/components/autofill_assistant/browser/web/element_finder.cc b/components/autofill_assistant/browser/web/element_finder.cc index 86fadcc..8e2387f 100644 --- a/components/autofill_assistant/browser/web/element_finder.cc +++ b/components/autofill_assistant/browser/web/element_finder.cc
@@ -135,10 +135,11 @@ SendResult(ClientStatus(INVALID_SELECTOR)); return; } + devtools_client_->GetRuntime()->Evaluate( - std::string(kGetDocumentElement), + std::string(kGetDocumentElement), /* node_frame_id= */ std::string(), base::BindOnce(&ElementFinder::OnGetDocumentElement, - weak_ptr_factory_.GetWeakPtr())); + weak_ptr_factory_.GetWeakPtr(), 0)); } void ElementFinder::SendResult(const ClientStatus& status) { @@ -148,6 +149,7 @@ } void ElementFinder::OnGetDocumentElement( + size_t index, const DevtoolsClient::ReplyStatus& reply_status, std::unique_ptr<runtime::EvaluateResult> result) { ClientStatus status = @@ -163,10 +165,14 @@ SendResult(ClientStatus(ELEMENT_RESOLUTION_FAILED)); return; } + + // The frame gets set again when we encounter an iFrame, even an OOPIF. + // Setting the correct host frame is handled by + // FindCorrespondingRenderFrameHost further down. element_result_->container_frame_host = web_contents_->GetMainFrame(); - element_result_->container_frame_selector_index = 0; - element_result_->object_id = ""; - RecursiveFindElement(object_id, 0); + element_result_->container_frame_selector_index = index; + element_result_->object_id = std::string(); + RecursiveFindElement(object_id, index); } void ElementFinder::RecursiveFindElement(const std::string& object_id, @@ -214,6 +220,7 @@ .SetArguments(std::move(argument)) .SetFunctionDeclaration(function) .Build(), + element_result_->node_frame_id, base::BindOnce(&ElementFinder::OnQuerySelectorAll, weak_ptr_factory_.GetWeakPtr(), index)); } @@ -273,6 +280,7 @@ devtools_client_->GetDOM()->DescribeNode( dom::DescribeNodeParams::Builder().SetObjectId(object_id).Build(), + element_result_->node_frame_id, base::BindOnce(&ElementFinder::OnDescribeNodeForPseudoElement, weak_ptr_factory_.GetWeakPtr(), pseudo_type)); return; @@ -280,6 +288,7 @@ devtools_client_->GetDOM()->DescribeNode( dom::DescribeNodeParams::Builder().SetObjectId(object_id).Build(), + element_result_->node_frame_id, base::BindOnce(&ElementFinder::OnDescribeNode, weak_ptr_factory_.GetWeakPtr(), object_id, index)); } @@ -303,6 +312,7 @@ dom::ResolveNodeParams::Builder() .SetBackendNodeId(pseudo_element->GetBackendNodeId()) .Build(), + element_result_->node_frame_id, base::BindOnce(&ElementFinder::OnResolveNodeForPseudoElement, weak_ptr_factory_.GetWeakPtr())); return; @@ -366,9 +376,14 @@ return; } } else if (node->HasFrameId()) { - // TODO(crbug.com/806868): Support out-of-process iframe. - DVLOG(3) << "Warning (unsupported): the element is inside an OOPIF."; - SendResult(ClientStatus(UNSUPPORTED)); + element_result_->container_frame_selector_index = index; + element_result_->node_frame_id = node->GetFrameId(); + + // Kick off another find element chain to walk down the OOP iFrame. + devtools_client_->GetRuntime()->Evaluate( + std::string(kGetDocumentElement), element_result_->node_frame_id, + base::BindOnce(&ElementFinder::OnGetDocumentElement, + weak_ptr_factory_.GetWeakPtr(), index + 1)); return; } @@ -383,6 +398,7 @@ dom::ResolveNodeParams::Builder() .SetBackendNodeId(backend_ids[0]) .Build(), + element_result_->node_frame_id, base::BindOnce(&ElementFinder::OnResolveNode, weak_ptr_factory_.GetWeakPtr(), index)); return;
diff --git a/components/autofill_assistant/browser/web/element_finder.h b/components/autofill_assistant/browser/web/element_finder.h index 3acc08bd..3103d6f 100644 --- a/components/autofill_assistant/browser/web/element_finder.h +++ b/components/autofill_assistant/browser/web/element_finder.h
@@ -44,6 +44,9 @@ // The object id of the element. std::string object_id; + + // The id of the frame the element's node is in. + std::string node_frame_id; }; // |web_contents| and |devtools_client| must be valid for the lifetime of the @@ -62,7 +65,8 @@ private: void SendResult(const ClientStatus& status); - void OnGetDocumentElement(const DevtoolsClient::ReplyStatus& reply_status, + void OnGetDocumentElement(size_t index, + const DevtoolsClient::ReplyStatus& reply_status, std::unique_ptr<runtime::EvaluateResult> result); void RecursiveFindElement(const std::string& object_id, size_t index); void OnQuerySelectorAll( @@ -83,6 +87,7 @@ void OnResolveNode(size_t index, const DevtoolsClient::ReplyStatus& reply_status, std::unique_ptr<dom::ResolveNodeResult> result); + content::RenderFrameHost* FindCorrespondingRenderFrameHost( std::string name, std::string document_url); @@ -90,6 +95,7 @@ content::WebContents* const web_contents_; DevtoolsClient* const devtools_client_; const Selector selector_; + const bool strict_; Callback callback_; std::unique_ptr<Result> element_result_;
diff --git a/components/autofill_assistant/browser/web/element_position_getter.cc b/components/autofill_assistant/browser/web/element_position_getter.cc index ad63a0c..6cc0ff3 100644 --- a/components/autofill_assistant/browser/web/element_position_getter.cc +++ b/components/autofill_assistant/browser/web/element_position_getter.cc
@@ -24,11 +24,14 @@ namespace autofill_assistant { -ElementPositionGetter::ElementPositionGetter(DevtoolsClient* devtools_client, - const ClientSettings& settings) +ElementPositionGetter::ElementPositionGetter( + DevtoolsClient* devtools_client, + const ClientSettings& settings, + const std::string& optional_node_frame_id) : check_interval_(settings.box_model_check_interval), max_rounds_(settings.box_model_check_count), devtools_client_(devtools_client), + node_frame_id_(optional_node_frame_id), weak_ptr_factory_(this) {} ElementPositionGetter::~ElementPositionGetter() = default; @@ -64,6 +67,7 @@ void ElementPositionGetter::GetAndWaitBoxModelStable() { devtools_client_->GetDOM()->GetBoxModel( dom::GetBoxModelParams::Builder().SetObjectId(object_id_).Build(), + node_frame_id_, base::BindOnce(&ElementPositionGetter::OnGetBoxModelForStableCheck, weak_ptr_factory_.GetWeakPtr())); } @@ -124,6 +128,7 @@ .SetFunctionDeclaration(std::string(kScrollIntoViewIfNeededScript)) .SetReturnByValue(true) .Build(), + node_frame_id_, base::BindOnce(&ElementPositionGetter::OnScrollIntoView, weak_ptr_factory_.GetWeakPtr())); return;
diff --git a/components/autofill_assistant/browser/web/element_position_getter.h b/components/autofill_assistant/browser/web/element_position_getter.h index 6639c419..8ed1969 100644 --- a/components/autofill_assistant/browser/web/element_position_getter.h +++ b/components/autofill_assistant/browser/web/element_position_getter.h
@@ -30,7 +30,8 @@ public: // |devtools_client| must be valid for the lifetime of the instance. ElementPositionGetter(DevtoolsClient* devtools_client, - const ClientSettings& settings); + const ClientSettings& settings, + const std::string& optional_node_frame_id); ~ElementPositionGetter() override; // Callback that receives the position that corresponds to the center @@ -75,6 +76,8 @@ int point_x_ = 0; int point_y_ = 0; + std::string node_frame_id_; + base::WeakPtrFactory<ElementPositionGetter> weak_ptr_factory_; };
diff --git a/components/autofill_assistant/browser/web/web_controller.cc b/components/autofill_assistant/browser/web/web_controller.cc index 85c2ae72..b9a30b4 100644 --- a/components/autofill_assistant/browser/web/web_controller.cc +++ b/components/autofill_assistant/browser/web/web_controller.cc
@@ -299,6 +299,7 @@ std::string element_object_id = result->object_id; WaitForDocumentToBecomeInteractive( settings_->document_ready_check_count, element_object_id, + result->node_frame_id, base::BindOnce( &WebController::OnWaitDocumentToBecomeInteractiveForClickOrTap, weak_ptr_factory_.GetWeakPtr(), std::move(callback), click_type, @@ -333,6 +334,7 @@ .SetFunctionDeclaration(std::string(kScrollIntoViewCenterScript)) .SetReturnByValue(true) .Build(), + target_element->node_frame_id, base::BindOnce(&WebController::OnScrollIntoView, weak_ptr_factory_.GetWeakPtr(), std::move(target_element), std::move(callback), click_type)); @@ -364,20 +366,22 @@ .SetArguments(std::move(argument)) .SetFunctionDeclaration(kClickElement) .Build(), + target_element->node_frame_id, base::BindOnce(&WebController::OnClickJS, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); return; } std::unique_ptr<ElementPositionGetter> getter = - std::make_unique<ElementPositionGetter>(devtools_client_.get(), - *settings_); + std::make_unique<ElementPositionGetter>( + devtools_client_.get(), *settings_, target_element->node_frame_id); auto* ptr = getter.get(); pending_workers_.emplace_back(std::move(getter)); - ptr->Start(target_element->container_frame_host, target_element->object_id, - base::BindOnce(&WebController::TapOrClickOnCoordinates, - weak_ptr_factory_.GetWeakPtr(), ptr, - std::move(callback), click_type)); + ptr->Start( + target_element->container_frame_host, target_element->object_id, + base::BindOnce(&WebController::TapOrClickOnCoordinates, + weak_ptr_factory_.GetWeakPtr(), ptr, std::move(callback), + target_element->node_frame_id, click_type)); } void WebController::OnClickJS( @@ -395,6 +399,7 @@ void WebController::TapOrClickOnCoordinates( ElementPositionGetter* getter_to_release, base::OnceCallback<void(const ClientStatus&)> callback, + const std::string& node_frame_id, ClickAction::ClickType click_type, bool has_coordinates, int x, @@ -419,9 +424,10 @@ .SetButton(input::DispatchMouseEventButton::LEFT) .SetType(input::DispatchMouseEventType::MOUSE_PRESSED) .Build(), + node_frame_id, base::BindOnce(&WebController::OnDispatchPressMouseEvent, - weak_ptr_factory_.GetWeakPtr(), std::move(callback), x, - y)); + weak_ptr_factory_.GetWeakPtr(), std::move(callback), + node_frame_id, x, y)); return; } @@ -434,12 +440,15 @@ .SetType(input::DispatchTouchEventType::TOUCH_START) .SetTouchPoints(std::move(touch_points)) .Build(), + node_frame_id, base::BindOnce(&WebController::OnDispatchTouchEventStart, - weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + weak_ptr_factory_.GetWeakPtr(), std::move(callback), + node_frame_id)); } void WebController::OnDispatchPressMouseEvent( base::OnceCallback<void(const ClientStatus&)> callback, + const std::string& node_frame_id, int x, int y, const DevtoolsClient::ReplyStatus& reply_status, @@ -460,6 +469,7 @@ .SetButton(input::DispatchMouseEventButton::LEFT) .SetType(input::DispatchMouseEventType::MOUSE_RELEASED) .Build(), + node_frame_id, base::BindOnce(&WebController::OnDispatchReleaseMouseEvent, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -479,6 +489,7 @@ void WebController::OnDispatchTouchEventStart( base::OnceCallback<void(const ClientStatus&)> callback, + const std::string& node_frame_id, const DevtoolsClient::ReplyStatus& reply_status, std::unique_ptr<input::DispatchTouchEventResult> result) { if (!result) { @@ -495,6 +506,7 @@ .SetType(input::DispatchTouchEventType::TOUCH_END) .SetTouchPoints(std::move(touch_points)) .Build(), + node_frame_id, base::BindOnce(&WebController::OnDispatchTouchEventEnd, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -539,6 +551,7 @@ .SetExpression(kWaitForWindowHeightChange) .SetAwaitPromise(true) .Build(), + /* node_frame_id= */ std::string(), base::BindOnce(&WebController::OnWaitForWindowHeightChange, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -576,6 +589,7 @@ .SetReturnByValue(true) .SetAwaitPromise(true) .Build(), + /* node_frame_id= */ std::string(), base::BindOnce(&OnWaitForDocumentReadyState<runtime::EvaluateResult>, std::move(callback))); return; @@ -614,6 +628,7 @@ .SetReturnByValue(true) .SetAwaitPromise(true) .Build(), + element->node_frame_id, base::BindOnce( &OnWaitForDocumentReadyState<runtime::CallFunctionOnResult>, std::move(callback))); @@ -655,6 +670,7 @@ std::string element_object_id = element_result->object_id; WaitForDocumentToBecomeInteractive( settings_->document_ready_check_count, element_object_id, + element_result->node_frame_id, base::BindOnce( &WebController::OnWaitDocumentToBecomeInteractiveForFocusElement, weak_ptr_factory_.GetWeakPtr(), top_padding, std::move(callback), @@ -690,6 +706,7 @@ .SetFunctionDeclaration(std::string(kScrollIntoViewWithPaddingScript)) .SetReturnByValue(true) .Build(), + target_element->node_frame_id, base::BindOnce(&WebController::OnFocusElement, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -830,6 +847,7 @@ .SetFunctionDeclaration(std::string(kSelectOptionScript)) .SetReturnByValue(true) .Build(), + element_result->node_frame_id, base::BindOnce(&WebController::OnSelectOption, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -891,6 +909,7 @@ .SetFunctionDeclaration(std::string(kHighlightElementScript)) .SetReturnByValue(true) .Build(), + element_result->node_frame_id, base::BindOnce(&WebController::OnHighlightElement, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -944,6 +963,7 @@ .SetFunctionDeclaration(std::string(kGetValueAttributeScript)) .SetReturnByValue(true) .Build(), + element_result->node_frame_id, base::BindOnce(&WebController::OnGetValueAttribute, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -1011,6 +1031,7 @@ } void WebController::OnClickElementForSendKeyboardInput( + const std::string& node_frame_id, const std::vector<UChar32>& codepoints, int delay_in_millisecond, base::OnceCallback<void(const ClientStatus&)> callback, @@ -1019,11 +1040,13 @@ std::move(callback).Run(click_status); return; } - DispatchKeyboardTextDownEvent(codepoints, 0, /*delay=*/false, - delay_in_millisecond, std::move(callback)); + DispatchKeyboardTextDownEvent(node_frame_id, codepoints, 0, + /* delay= */ false, delay_in_millisecond, + std::move(callback)); } void WebController::DispatchKeyboardTextDownEvent( + const std::string& node_frame_id, const std::vector<UChar32>& codepoints, size_t index, bool delay, @@ -1037,10 +1060,10 @@ if (delay && delay_in_millisecond > 0) { base::PostDelayedTask( FROM_HERE, {content::BrowserThread::UI}, - base::BindOnce(&WebController::DispatchKeyboardTextDownEvent, - weak_ptr_factory_.GetWeakPtr(), codepoints, index, - /*delay=*/false, delay_in_millisecond, - std::move(callback)), + base::BindOnce( + &WebController::DispatchKeyboardTextDownEvent, + weak_ptr_factory_.GetWeakPtr(), node_frame_id, codepoints, index, + /* delay= */ false, delay_in_millisecond, std::move(callback)), base::TimeDelta::FromMilliseconds(delay_in_millisecond)); return; } @@ -1049,12 +1072,14 @@ CreateKeyEventParamsForCharacter( autofill_assistant::input::DispatchKeyEventType::KEY_DOWN, codepoints[index]), + node_frame_id, base::BindOnce(&WebController::DispatchKeyboardTextUpEvent, - weak_ptr_factory_.GetWeakPtr(), codepoints, index, - delay_in_millisecond, std::move(callback))); + weak_ptr_factory_.GetWeakPtr(), node_frame_id, codepoints, + index, delay_in_millisecond, std::move(callback))); } void WebController::DispatchKeyboardTextUpEvent( + const std::string& node_frame_id, const std::vector<UChar32>& codepoints, size_t index, int delay_in_millisecond, @@ -1064,10 +1089,11 @@ CreateKeyEventParamsForCharacter( autofill_assistant::input::DispatchKeyEventType::KEY_UP, codepoints[index]), - base::BindOnce(&WebController::DispatchKeyboardTextDownEvent, - weak_ptr_factory_.GetWeakPtr(), codepoints, index + 1, - /*delay=*/true, delay_in_millisecond, - std::move(callback))); + node_frame_id, + base::BindOnce( + &WebController::DispatchKeyboardTextDownEvent, + weak_ptr_factory_.GetWeakPtr(), node_frame_id, codepoints, index + 1, + /* delay= */ true, delay_in_millisecond, std::move(callback))); } auto WebController::CreateKeyEventParamsForCharacter( @@ -1115,6 +1141,7 @@ .SetArguments(std::move(argument)) .SetFunctionDeclaration(std::string(kSetValueAttributeScript)) .Build(), + element_result->node_frame_id, base::BindOnce(&WebController::OnSetValueAttribute, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -1175,6 +1202,7 @@ .SetArguments(std::move(arguments)) .SetFunctionDeclaration(std::string(kSetAttributeScript)) .Build(), + element_result->node_frame_id, base::BindOnce(&WebController::OnSetAttribute, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -1202,8 +1230,7 @@ DCHECK(!selector.empty()); FindElement( - selector, - /* strict_mode= */ true, + selector, /* strict_mode= */ true, base::BindOnce(&WebController::OnFindElementForSendKeyboardInput, weak_ptr_factory_.GetWeakPtr(), selector, codepoints, delay_in_millisecond, std::move(callback))); @@ -1223,7 +1250,8 @@ ClickOrTapElement( selector, ClickAction::CLICK, base::BindOnce(&WebController::OnClickElementForSendKeyboardInput, - weak_ptr_factory_.GetWeakPtr(), codepoints, + weak_ptr_factory_.GetWeakPtr(), + element_result->node_frame_id, codepoints, delay_in_millisecond, std::move(callback))); } @@ -1246,6 +1274,7 @@ .SetExpression(std::string(kGetVisualViewport)) .SetReturnByValue(true) .Build(), + /* node_frame_id= */ std::string(), base::BindOnce(&WebController::OnGetVisualViewport, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -1311,6 +1340,7 @@ .SetFunctionDeclaration(std::string(kGetBoundingClientRectAsList)) .SetReturnByValue(true) .Build(), + result->node_frame_id, base::BindOnce(&WebController::OnGetElementPositionResult, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -1358,6 +1388,7 @@ .SetFunctionDeclaration(std::string(kGetOuterHtmlScript)) .SetReturnByValue(true) .Build(), + element_result->node_frame_id, base::BindOnce(&WebController::OnGetOuterHtml, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -1380,7 +1411,8 @@ void WebController::WaitForDocumentToBecomeInteractive( int remaining_rounds, - std::string object_id, + const std::string& object_id, + const std::string& node_frame_id, base::OnceCallback<void(bool)> callback) { devtools_client_->GetRuntime()->CallFunctionOn( runtime::CallFunctionOnParams::Builder() @@ -1388,14 +1420,16 @@ .SetFunctionDeclaration(std::string(kIsDocumentReadyForInteract)) .SetReturnByValue(true) .Build(), + node_frame_id, base::BindOnce(&WebController::OnWaitForDocumentToBecomeInteractive, weak_ptr_factory_.GetWeakPtr(), remaining_rounds, - object_id, std::move(callback))); + object_id, node_frame_id, std::move(callback))); } void WebController::OnWaitForDocumentToBecomeInteractive( int remaining_rounds, - std::string object_id, + const std::string& object_id, + const std::string& node_frame_id, base::OnceCallback<void(bool)> callback, const DevtoolsClient::ReplyStatus& reply_status, std::unique_ptr<runtime::CallFunctionOnResult> result) { @@ -1420,7 +1454,7 @@ FROM_HERE, {content::BrowserThread::UI}, base::BindOnce(&WebController::WaitForDocumentToBecomeInteractive, weak_ptr_factory_.GetWeakPtr(), --remaining_rounds, - object_id, std::move(callback)), + object_id, node_frame_id, std::move(callback)), settings_->document_ready_check_interval); }
diff --git a/components/autofill_assistant/browser/web/web_controller.h b/components/autofill_assistant/browser/web/web_controller.h index 31c32e2..7a98bff 100644 --- a/components/autofill_assistant/browser/web/web_controller.h +++ b/components/autofill_assistant/browser/web/web_controller.h
@@ -247,12 +247,14 @@ void TapOrClickOnCoordinates( ElementPositionGetter* getter_to_release, base::OnceCallback<void(const ClientStatus&)> callback, + const std::string& node_frame_id, ClickAction::ClickType click_type, bool has_coordinates, int x, int y); void OnDispatchPressMouseEvent( base::OnceCallback<void(const ClientStatus&)> callback, + const std::string& node_frame_id, int x, int y, const DevtoolsClient::ReplyStatus& reply_status, @@ -263,6 +265,7 @@ std::unique_ptr<input::DispatchMouseEventResult> result); void OnDispatchTouchEventStart( base::OnceCallback<void(const ClientStatus&)> callback, + const std::string& node_frame_id, const DevtoolsClient::ReplyStatus& reply_status, std::unique_ptr<input::DispatchTouchEventResult> result); void OnDispatchTouchEventEnd( @@ -347,17 +350,20 @@ base::OnceCallback<void(const ClientStatus&)> callback, const ClientStatus& status); void OnClickElementForSendKeyboardInput( + const std::string& node_frame_id, const std::vector<UChar32>& codepoints, int delay_in_milli, base::OnceCallback<void(const ClientStatus&)> callback, const ClientStatus& click_status); void DispatchKeyboardTextDownEvent( + const std::string& node_frame_id, const std::vector<UChar32>& codepoints, size_t index, bool delay, int delay_in_milli, base::OnceCallback<void(const ClientStatus&)> callback); void DispatchKeyboardTextUpEvent( + const std::string& node_frame_id, const std::vector<UChar32>& codepoints, size_t index, int delay_in_milli, @@ -420,11 +426,13 @@ // Waits for the document.readyState to be 'interactive' or 'complete'. void WaitForDocumentToBecomeInteractive( int remaining_rounds, - std::string object_id, + const std::string& object_id, + const std::string& node_frame_id, base::OnceCallback<void(bool)> callback); void OnWaitForDocumentToBecomeInteractive( int remaining_rounds, - std::string object_id, + const std::string& object_id, + const std::string& node_frame_id, base::OnceCallback<void(bool)> callback, const DevtoolsClient::ReplyStatus& reply_status, std::unique_ptr<runtime::CallFunctionOnResult> result);
diff --git a/components/autofill_assistant/browser/web/web_controller_browsertest.cc b/components/autofill_assistant/browser/web/web_controller_browsertest.cc index 6358d984..9fbae121 100644 --- a/components/autofill_assistant/browser/web/web_controller_browsertest.cc +++ b/components/autofill_assistant/browser/web/web_controller_browsertest.cc
@@ -24,6 +24,8 @@ using ::testing::AnyOf; using ::testing::IsEmpty; +// Flag to enable site per process to enforce OOPIFs. +const char* kSitePerProcess = "site-per-process"; const char* kTargetWebsitePath = "/autofill_assistant_target_website.html"; class WebControllerBrowserTest : public content::ContentBrowserTest, @@ -32,13 +34,26 @@ WebControllerBrowserTest() {} ~WebControllerBrowserTest() override {} + void SetUpCommandLine(base::CommandLine* command_line) override { + command_line->AppendSwitch(kSitePerProcess); + } + void SetUpOnMainThread() override { ContentBrowserTest::SetUpOnMainThread(); + + // Start a mock server for hosting an OOPIF. + http_server_iframe_ = std::make_unique<net::EmbeddedTestServer>( + net::EmbeddedTestServer::TYPE_HTTP); + http_server_iframe_->ServeFilesFromSourceDirectory( + "components/test/data/autofill_assistant/html_iframe"); + ASSERT_TRUE(http_server_iframe_->Start(8081)); + + // Start the main server hosting the test page. http_server_ = std::make_unique<net::EmbeddedTestServer>( net::EmbeddedTestServer::TYPE_HTTP); http_server_->ServeFilesFromSourceDirectory( - "components/test/data/autofill_assistant"); - ASSERT_TRUE(http_server_->Start()); + "components/test/data/autofill_assistant/html"); + ASSERT_TRUE(http_server_->Start(8080)); ASSERT_TRUE( NavigateToURL(shell(), http_server_->GetURL(kTargetWebsitePath))); web_controller_ = WebController::CreateForWebContents( @@ -460,6 +475,7 @@ private: std::unique_ptr<net::EmbeddedTestServer> http_server_; + std::unique_ptr<net::EmbeddedTestServer> http_server_iframe_; ClientSettings settings_; DISALLOW_COPY_AND_ASSIGN(WebControllerBrowserTest); @@ -485,6 +501,18 @@ // A non-existent pseudo-element RunLaxElementCheck(Selector({"#button"}, AFTER), false); + + // An iFrame. + RunLaxElementCheck(Selector({"#iframe"}), true); + + // An element in a same-origin iFrame. + RunLaxElementCheck(Selector({"#iframe", "#button"}), true); + + // An OOPIF. + RunLaxElementCheck(Selector({"#iframeExternal"}), true); + + // An element in an OOPIF. + RunLaxElementCheck(Selector({"#iframeExternal", "#button"}), true); } IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, VisibilityRequirementCheck) { @@ -506,6 +534,19 @@ // A non-existent pseudo-element RunLaxElementCheck(Selector({"#button"}, AFTER).MustBeVisible(), false); + + // An iFrame. + RunLaxElementCheck(Selector({"#iframe"}).MustBeVisible(), true); + + // An element in a same-origin iFrame. + RunLaxElementCheck(Selector({"#iframe", "#button"}).MustBeVisible(), true); + + // An OOPIF. + RunLaxElementCheck(Selector({"#iframeExternal"}).MustBeVisible(), true); + + // An element in an OOPIF. + RunLaxElementCheck(Selector({"#iframeExternal", "#button"}).MustBeVisible(), + true); } IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, MultipleVisibleElementCheck) { @@ -634,6 +675,13 @@ selectors.emplace_back(a_selector); results.emplace_back(true); + // OOPIF. + a_selector.selectors.clear(); + a_selector.selectors.emplace_back("#iframeExternal"); + a_selector.selectors.emplace_back("#button"); + selectors.emplace_back(a_selector); + results.emplace_back(true); + // Shadow DOM. a_selector.selectors.clear(); a_selector.selectors.emplace_back("#iframe"); @@ -688,6 +736,18 @@ WaitForElementRemove(selector); } +IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, ClickElementInOOPIF) { + Selector selector; + selector.selectors.emplace_back("#iframeExternal"); + selector.selectors.emplace_back("#button"); + ClickOrTapElement(selector, ClickAction::CLICK); + + selector.selectors.clear(); + selector.selectors.emplace_back("#iframeExternal"); + selector.selectors.emplace_back("#div"); + WaitForElementRemove(selector); +} + IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, ClickElementInScrollContainer) { // Make sure #scroll_item_3 is not visible, no matter the screen height. It @@ -1057,6 +1117,28 @@ .proto_status()); } +IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, GetAndSetFieldValueInIFrame) { + Selector a_selector; + + // IFrame. + a_selector.selectors.clear(); + a_selector.selectors.emplace_back("#iframe"); + a_selector.selectors.emplace_back("#input"); + EXPECT_EQ(ACTION_APPLIED, SetFieldValue(a_selector, "text", + /* simulate_key_presses= */ false) + .proto_status()); + GetFieldsValue({a_selector}, {"text"}); + + // OOPIF. + a_selector.selectors.clear(); + a_selector.selectors.emplace_back("#iframeExternal"); + a_selector.selectors.emplace_back("#input"); + EXPECT_EQ(ACTION_APPLIED, SetFieldValue(a_selector, "text", + /* simulate_key_presses= */ false) + .proto_status()); + GetFieldsValue({a_selector}, {"text"}); +} + IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, SendKeyboardInput) { auto input = UTF8ToUnicode("Zürich"); std::string expected_output = "Zürich";
diff --git a/components/embedder_support/android/delegate/web_contents_delegate_android.cc b/components/embedder_support/android/delegate/web_contents_delegate_android.cc index 5316b981..a7de4a9 100644 --- a/components/embedder_support/android/delegate/web_contents_delegate_android.cc +++ b/components/embedder_support/android/delegate/web_contents_delegate_android.cc
@@ -111,6 +111,7 @@ params.should_replace_current_entry; load_params.is_renderer_initiated = params.is_renderer_initiated; load_params.has_user_gesture = params.user_gesture; + load_params.initiator_origin = params.initiator_origin; if (params.uses_post) { load_params.load_type = content::NavigationController::LOAD_TYPE_HTTP_POST;
diff --git a/components/exo/display.cc b/components/exo/display.cc index f65d1ee..bc1fa15 100644 --- a/components/exo/display.cc +++ b/components/exo/display.cc
@@ -111,22 +111,14 @@ // Using zero-copy for optimal performance. bool use_zero_copy = true; -#if defined(ARCH_CPU_X86_FAMILY) - // TODO(dcastagna): Re-enable NV12 format as HW overlay once b/113362843 - // is addressed. - bool is_overlay_candidate = format != gfx::BufferFormat::YUV_420_BIPLANAR; -#else - bool is_overlay_candidate = true; -#endif - return std::make_unique<Buffer>( std::move(gpu_memory_buffer), gpu::NativeBufferNeedsPlatformSpecificTextureTarget(format) ? gpu::GetPlatformSpecificTextureTarget() : GL_TEXTURE_2D, // COMMANDS_COMPLETED queries are required by native pixmaps. - GL_COMMANDS_COMPLETED_CHROMIUM, use_zero_copy, is_overlay_candidate, - y_invert); + GL_COMMANDS_COMPLETED_CHROMIUM, use_zero_copy, + /*is_overlay_candidate=*/true, y_invert); } #endif // defined(USE_OZONE)
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc index faa1d160..b80fc63a 100644 --- a/components/omnibox/browser/autocomplete_controller.cc +++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -669,6 +669,10 @@ // available. if (!exact_keyword.empty() && !keywords.count(exact_keyword)) { keywords.insert(exact_keyword); + // If the match has an answer, it will look strange to try to display + // it along with a keyword hint. Prefer the keyword hint, and revert + // to a typical search. + match->answer.reset(); match->associated_keyword.reset(new AutocompleteMatch( keyword_provider_->CreateVerbatimMatch(exact_keyword, exact_keyword, input_)));
diff --git a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc index 3421dd7..bfe608e 100644 --- a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc +++ b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
@@ -136,6 +136,7 @@ WebFeature::kThirdPartyServiceWorker, WebFeature::kThirdPartySharedWorker, WebFeature::kThirdPartyBroadcastChannel, + WebFeature::kHeavyAdIntervention, })); return *opt_in_features; }
diff --git a/components/password_manager/content/browser/content_password_manager_driver.cc b/components/password_manager/content/browser/content_password_manager_driver.cc index 1511a616..cd798f6 100644 --- a/components/password_manager/content/browser/content_password_manager_driver.cc +++ b/components/password_manager/content/browser/content_password_manager_driver.cc
@@ -14,7 +14,6 @@ #include "components/autofill/core/common/password_form.h" #include "components/password_manager/content/browser/bad_message.h" #include "components/password_manager/content/browser/content_password_manager_driver_factory.h" -#include "components/password_manager/content/browser/form_submission_tracker_util.h" #include "components/password_manager/core/browser/password_manager.h" #include "components/password_manager/core/browser/password_manager_client.h" #include "components/password_manager/core/browser/password_manager_metrics_recorder.h" @@ -185,19 +184,6 @@ return render_frame_host_->GetLastCommittedURL(); } -void ContentPasswordManagerDriver::DidNavigateFrame( - content::NavigationHandle* navigation_handle) { - // Clear page specific data after main frame navigation. - if (navigation_handle->IsInMainFrame() && - !navigation_handle->IsSameDocument()) { - NotifyDidNavigateMainFrame(navigation_handle->IsRendererInitiated(), - navigation_handle->GetPageTransition(), - navigation_handle->WasInitiatedByLinkClick(), - GetPasswordManager()); - GetPasswordAutofillManager()->DidNavigateMainFrame(); - } -} - void ContentPasswordManagerDriver::GeneratePassword( autofill::mojom::PasswordGenerationAgent:: UserTriggeredGeneratePasswordCallback callback) {
diff --git a/components/password_manager/content/browser/content_password_manager_driver.h b/components/password_manager/content/browser/content_password_manager_driver.h index a2a62bc8..b84c7ea 100644 --- a/components/password_manager/content/browser/content_password_manager_driver.h +++ b/components/password_manager/content/browser/content_password_manager_driver.h
@@ -27,7 +27,6 @@ } namespace content { -class NavigationHandle; class RenderFrameHost; } @@ -78,7 +77,6 @@ bool IsMainFrame() const override; const GURL& GetLastCommittedURL() const override; - void DidNavigateFrame(content::NavigationHandle* navigation_handle); // Notify the renderer that the user wants to generate password manually. void GeneratePassword(autofill::mojom::PasswordGenerationAgent:: UserTriggeredGeneratePasswordCallback callback);
diff --git a/components/password_manager/content/browser/content_password_manager_driver_factory.cc b/components/password_manager/content/browser/content_password_manager_driver_factory.cc index df81c48..ebc498d 100644 --- a/components/password_manager/content/browser/content_password_manager_driver_factory.cc +++ b/components/password_manager/content/browser/content_password_manager_driver_factory.cc
@@ -15,6 +15,7 @@ #include "components/autofill/core/common/form_data.h" #include "components/autofill/core/common/password_form.h" #include "components/password_manager/content/browser/content_password_manager_driver.h" +#include "components/password_manager/content/browser/form_submission_tracker_util.h" #include "components/password_manager/core/browser/password_manager_client.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/navigation_entry.h" @@ -42,18 +43,10 @@ return; // NOTE: Can't use |std::make_unique| due to private constructor. - auto new_factory = base::WrapUnique(new ContentPasswordManagerDriverFactory( - web_contents, password_client, autofill_client)); - const std::vector<content::RenderFrameHost*> frames = - web_contents->GetAllFrames(); - for (content::RenderFrameHost* frame : frames) { - if (frame->IsRenderFrameLive()) - new_factory->RenderFrameCreated(frame); - } - web_contents->SetUserData( kContentPasswordManagerDriverFactoryWebContentsUserDataKey, - std::move(new_factory)); + base::WrapUnique(new ContentPasswordManagerDriverFactory( + web_contents, password_client, autofill_client))); } ContentPasswordManagerDriverFactory::ContentPasswordManagerDriverFactory( @@ -95,29 +88,23 @@ if (!factory) return; - ContentPasswordManagerDriver* driver = - factory->GetDriverForFrame(render_frame_host); - if (driver) - driver->BindPendingReceiver(std::move(pending_receiver)); + factory->GetDriverForFrame(render_frame_host) + ->BindPendingReceiver(std::move(pending_receiver)); } ContentPasswordManagerDriver* ContentPasswordManagerDriverFactory::GetDriverForFrame( content::RenderFrameHost* render_frame_host) { - auto mapping = frame_driver_map_.find(render_frame_host); - return mapping == frame_driver_map_.end() ? nullptr : mapping->second.get(); -} + DCHECK_EQ(web_contents(), + content::WebContents::FromRenderFrameHost(render_frame_host)); + DCHECK(render_frame_host->IsRenderFrameCreated()); -void ContentPasswordManagerDriverFactory::RenderFrameCreated( - content::RenderFrameHost* render_frame_host) { - auto insertion_result = - frame_driver_map_.insert(std::make_pair(render_frame_host, nullptr)); - // This is called twice for the main frame. - if (insertion_result.second) { // This was the first time. - insertion_result.first->second = - std::make_unique<ContentPasswordManagerDriver>( - render_frame_host, password_client_, autofill_client_); + auto& driver = frame_driver_map_[render_frame_host]; + if (!driver) { + driver = std::make_unique<ContentPasswordManagerDriver>( + render_frame_host, password_client_, autofill_client_); } + return driver.get(); } void ContentPasswordManagerDriverFactory::RenderFrameDeleted( @@ -126,12 +113,20 @@ } void ContentPasswordManagerDriverFactory::DidFinishNavigation( - content::NavigationHandle* navigation_handle) { - if (!navigation_handle->HasCommitted()) + content::NavigationHandle* navigation) { + if (!navigation->IsInMainFrame() || navigation->IsSameDocument() || + !navigation->HasCommitted()) { return; + } - if (auto* driver = GetDriverForFrame(navigation_handle->GetRenderFrameHost())) - driver->DidNavigateFrame(navigation_handle); + // Clear page specific data after main frame navigation. + NotifyDidNavigateMainFrame(navigation->IsRendererInitiated(), + navigation->GetPageTransition(), + navigation->WasInitiatedByLinkClick(), + password_client_->GetPasswordManager()); + GetDriverForFrame(navigation->GetRenderFrameHost()) + ->GetPasswordAutofillManager() + ->DidNavigateMainFrame(); } void ContentPasswordManagerDriverFactory::RequestSendLoggingAvailability() {
diff --git a/components/password_manager/content/browser/content_password_manager_driver_factory.h b/components/password_manager/content/browser/content_password_manager_driver_factory.h index 39616d1..083130d 100644 --- a/components/password_manager/content/browser/content_password_manager_driver_factory.h +++ b/components/password_manager/content/browser/content_password_manager_driver_factory.h
@@ -54,18 +54,17 @@ // chrome://password-manager-internals is available. void RequestSendLoggingAvailability(); - // content::WebContentsObserver: - void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override; - void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override; - void DidFinishNavigation( - content::NavigationHandle* navigation_handle) override; - private: ContentPasswordManagerDriverFactory( content::WebContents* web_contents, PasswordManagerClient* client, autofill::AutofillClient* autofill_client); + // content::WebContentsObserver: + void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override; + void DidFinishNavigation( + content::NavigationHandle* navigation_handle) override; + std::map<content::RenderFrameHost*, std::unique_ptr<ContentPasswordManagerDriver>> frame_driver_map_;
diff --git a/components/password_manager/core/browser/leaked_credentials_table.cc b/components/password_manager/core/browser/leaked_credentials_table.cc index dbc94dd..65d0a1e 100644 --- a/components/password_manager/core/browser/leaked_credentials_table.cc +++ b/components/password_manager/core/browser/leaked_credentials_table.cc
@@ -106,17 +106,57 @@ return s.Run(); } -bool LeakedCredentialsTable::RemoveRowsCreatedBetween(base::Time remove_begin, - base::Time remove_end) { - sql::Statement s( - db_->GetCachedStatement(SQL_FROM_HERE, - "DELETE FROM leaked_credentials WHERE " - "create_time >= ? AND create_time < ?")); - s.BindInt64(0, remove_begin.ToDeltaSinceWindowsEpoch().InMicroseconds()); - s.BindInt64(1, remove_end.is_null() - ? std::numeric_limits<int64_t>::max() - : remove_end.ToDeltaSinceWindowsEpoch().InMicroseconds()); - return s.Run(); +bool LeakedCredentialsTable::RemoveRowsByUrlAndTime( + const base::RepeatingCallback<bool(const GURL&)>& url_filter, + base::Time remove_begin, + base::Time remove_end) { + if (remove_end.is_null()) + remove_end = base::Time::Max(); + + const int64_t remove_begin_us = + remove_begin.ToDeltaSinceWindowsEpoch().InMicroseconds(); + const int64_t remove_end_us = + remove_end.ToDeltaSinceWindowsEpoch().InMicroseconds(); + + // If |url_filter| is null, remove all records in given date range. + if (!url_filter) { + sql::Statement s( + db_->GetCachedStatement(SQL_FROM_HERE, + "DELETE FROM leaked_credentials WHERE " + "create_time >= ? AND create_time < ?")); + s.BindInt64(0, remove_begin_us); + s.BindInt64(1, remove_end_us); + return s.Run(); + } + + // Otherwise, filter urls. + sql::Statement s(db_->GetCachedStatement( + SQL_FROM_HERE, + "SELECT DISTINCT url FROM leaked_credentials WHERE " + "create_time >= ? AND create_time < ?")); + s.BindInt64(0, remove_begin_us); + s.BindInt64(1, remove_end_us); + + std::vector<std::string> urls; + while (s.Step()) { + std::string url = s.ColumnString(0); + if (url_filter.Run(GURL(url))) { + urls.push_back(std::move(url)); + } + } + + bool success = true; + for (const std::string& url : urls) { + sql::Statement s( + db_->GetCachedStatement(SQL_FROM_HERE, + "DELETE FROM leaked_credentials WHERE url = ? " + "AND create_time >= ? AND create_time < ?")); + s.BindString(0, url); + s.BindInt64(1, remove_begin_us); + s.BindInt64(2, remove_end_us); + success = success && s.Run(); + } + return success; } std::vector<LeakedCredentials> LeakedCredentialsTable::GetAllRows() {
diff --git a/components/password_manager/core/browser/leaked_credentials_table.h b/components/password_manager/core/browser/leaked_credentials_table.h index f08e62b..a4ed2037 100644 --- a/components/password_manager/core/browser/leaked_credentials_table.h +++ b/components/password_manager/core/browser/leaked_credentials_table.h
@@ -54,8 +54,13 @@ // Removes all leaked credentials created between |remove_begin| inclusive and // |remove_end| exclusive. Using a null Time value will do an unbounded delete - // in either direction. - bool RemoveRowsCreatedBetween(base::Time remove_begin, base::Time remove_end); + // in either direction. If |url_filter| is not null, only leaked credentials + // for matching urls are removed. Returns true if the SQL completed + // successfully. + bool RemoveRowsByUrlAndTime( + const base::RepeatingCallback<bool(const GURL&)>& url_filter, + base::Time remove_begin, + base::Time remove_end); // Returns all leaked credentials from the database. std::vector<LeakedCredentials> GetAllRows();
diff --git a/components/password_manager/core/browser/leaked_credentials_table_unittest.cc b/components/password_manager/core/browser/leaked_credentials_table_unittest.cc index f4df298..35f3f63a 100644 --- a/components/password_manager/core/browser/leaked_credentials_table_unittest.cc +++ b/components/password_manager/core/browser/leaked_credentials_table_unittest.cc
@@ -4,6 +4,9 @@ #include "components/password_manager/core/browser/leaked_credentials_table.h" +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/callback.h" #include "base/files/scoped_temp_dir.h" #include "base/strings/utf_string_conversions.h" #include "sql/database.h" @@ -15,6 +18,7 @@ const char kTestDomain[] = "http://example.com"; const char kTestDomain2[] = "http://test.com"; +const char kTestDomain3[] = "http://google.com"; const char kUsername[] = "user"; const char kUsername2[] = "user2"; const char kUsername3[] = "user3"; @@ -116,8 +120,9 @@ ElementsAre(leaked_credentials1, leaked_credentials2, leaked_credentials3)); - EXPECT_TRUE(db()->RemoveRowsCreatedBetween(base::Time::FromTimeT(15), - base::Time::FromTimeT(25))); + EXPECT_TRUE(db()->RemoveRowsByUrlAndTime(base::NullCallback(), + base::Time::FromTimeT(15), + base::Time::FromTimeT(25))); EXPECT_THAT(db()->GetAllRows(), ElementsAre(leaked_credentials1, leaked_credentials3)); @@ -138,7 +143,8 @@ EXPECT_THAT(db()->GetAllRows(), ElementsAre(leaked_credentials_begin, leaked_credentials_end)); - EXPECT_TRUE(db()->RemoveRowsCreatedBetween(begin_time, end_time)); + EXPECT_TRUE( + db()->RemoveRowsByUrlAndTime(base::NullCallback(), begin_time, end_time)); // RemoveRowsCreatedBetween takes |begin_time| inclusive and |end_time| // exclusive, hence the credentials with |end_time| should remain in the // database. @@ -163,11 +169,39 @@ ElementsAre(leaked_credentials1, leaked_credentials2, leaked_credentials3)); - EXPECT_TRUE(db()->RemoveRowsCreatedBetween(base::Time(), base::Time())); + EXPECT_TRUE(db()->RemoveRowsByUrlAndTime(base::NullCallback(), base::Time(), + base::Time())); EXPECT_THAT(db()->GetAllRows(), IsEmpty()); } +TEST_F(LeakedCredentialsTableTest, RemoveRowsByUrlAndTime) { + LeakedCredentials leaked_credentials1 = test_data(); + LeakedCredentials leaked_credentials2 = test_data(); + LeakedCredentials leaked_credentials3 = test_data(); + LeakedCredentials leaked_credentials4 = test_data(); + leaked_credentials2.username = base::ASCIIToUTF16(kUsername2); + leaked_credentials3.url = GURL(kTestDomain2); + leaked_credentials4.url = GURL(kTestDomain3); + + EXPECT_TRUE(db()->AddRow(leaked_credentials1)); + EXPECT_TRUE(db()->AddRow(leaked_credentials2)); + EXPECT_TRUE(db()->AddRow(leaked_credentials3)); + EXPECT_TRUE(db()->AddRow(leaked_credentials4)); + + EXPECT_THAT(db()->GetAllRows(), + ElementsAre(leaked_credentials1, leaked_credentials2, + leaked_credentials3, leaked_credentials4)); + + EXPECT_TRUE(db()->RemoveRowsByUrlAndTime( + base::BindRepeating(std::not_equal_to<GURL>(), leaked_credentials1.url), + base::Time(), base::Time())); + // With unbounded time range and given url filter all rows that are not + // matching the |leaked_credentials1.url| should be removed. + EXPECT_THAT(db()->GetAllRows(), + ElementsAre(leaked_credentials1, leaked_credentials2)); +} + TEST_F(LeakedCredentialsTableTest, BadURL) { test_data().url = GURL("bad"); EXPECT_FALSE(db()->AddRow(test_data()));
diff --git a/components/password_manager/core/browser/mock_password_store.h b/components/password_manager/core/browser/mock_password_store.h index 9b27461..8b7f256 100644 --- a/components/password_manager/core/browser/mock_password_store.h +++ b/components/password_manager/core/browser/mock_password_store.h
@@ -76,8 +76,10 @@ MOCK_METHOD2(RemoveLeakedCredentialsImpl, void(const GURL&, const base::string16&)); MOCK_METHOD0(GetAllLeakedCredentialsImpl, std::vector<LeakedCredentials>()); - MOCK_METHOD2(RemoveLeakedCredentialsCreatedBetweenImpl, - void(base::Time, base::Time)); + MOCK_METHOD3(RemoveLeakedCredentialsByUrlAndTimeImpl, + void(const base::RepeatingCallback<bool(const GURL&)>&, + base::Time, + base::Time)); MOCK_CONST_METHOD0(IsAbleToSavePasswords, bool()); #if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
diff --git a/components/password_manager/core/browser/password_store.cc b/components/password_manager/core/browser/password_store.cc index 15f8dd60..0232462 100644 --- a/components/password_manager/core/browser/password_store.cc +++ b/components/password_manager/core/browser/password_store.cc
@@ -358,14 +358,15 @@ base::BindOnce(&PasswordStore::GetAllLeakedCredentialsImpl, this)); } -void PasswordStore::RemoveLeakedCredentialsCreatedBetween( +void PasswordStore::RemoveLeakedCredentialsByUrlAndTime( + base::RepeatingCallback<bool(const GURL&)> url_filter, base::Time remove_begin, base::Time remove_end, - const base::Closure& completion) { + base::OnceClosure completion) { DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); ScheduleTask(base::BindOnce( - &PasswordStore::RemoveLeakedCredentialsCreatedBetweenInternal, this, - remove_begin, remove_end, completion)); + &PasswordStore::RemoveLeakedCredentialsByUrlAndTimeInternal, this, + std::move(url_filter), remove_begin, remove_end, std::move(completion))); } void PasswordStore::AddObserver(Observer* observer) { @@ -860,14 +861,15 @@ main_task_runner_->PostTask(FROM_HERE, std::move(completion)); } -void PasswordStore::RemoveLeakedCredentialsCreatedBetweenInternal( +void PasswordStore::RemoveLeakedCredentialsByUrlAndTimeInternal( + const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time remove_begin, base::Time remove_end, - const base::Closure& completion) { + base::OnceClosure completion) { DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - RemoveLeakedCredentialsCreatedBetweenImpl(remove_begin, remove_end); + RemoveLeakedCredentialsByUrlAndTimeImpl(url_filter, remove_begin, remove_end); if (!completion.is_null()) - main_task_runner_->PostTask(FROM_HERE, completion); + main_task_runner_->PostTask(FROM_HERE, std::move(completion)); } std::vector<std::unique_ptr<autofill::PasswordForm>>
diff --git a/components/password_manager/core/browser/password_store.h b/components/password_manager/core/browser/password_store.h index 52dc8d9..f610fd7 100644 --- a/components/password_manager/core/browser/password_store.h +++ b/components/password_manager/core/browser/password_store.h
@@ -253,12 +253,15 @@ // request will be cancelled if the consumer is destroyed. void GetAllLeakedCredentials(PasswordLeakHistoryConsumer* consumer); - // Removes all leaked credentials in the given date range. If |completion| is - // not null, it will be posted to the |main_task_runner_| after deletions have - // been completed. Should be called on the UI thread. - void RemoveLeakedCredentialsCreatedBetween(base::Time remove_begin, - base::Time remove_end, - const base::Closure& completion); + // Removes all leaked credentials in the given date range. If |url_filter| is + // not null, only leaked credentials for matching urls are removed. If + // |completion| is not null, it will be posted to the |main_task_runner_| + // after deletions have been completed. Should be called on the UI thread. + void RemoveLeakedCredentialsByUrlAndTime( + base::RepeatingCallback<bool(const GURL&)> url_filter, + base::Time remove_begin, + base::Time remove_end, + base::OnceClosure completion); // Adds an observer to be notified when the password store data changes. void AddObserver(Observer* observer); @@ -460,7 +463,8 @@ virtual void RemoveLeakedCredentialsImpl(const GURL& url, const base::string16& username) = 0; virtual std::vector<LeakedCredentials> GetAllLeakedCredentialsImpl() = 0; - virtual void RemoveLeakedCredentialsCreatedBetweenImpl( + virtual void RemoveLeakedCredentialsByUrlAndTimeImpl( + const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time remove_begin, base::Time remove_end) = 0; @@ -602,10 +606,11 @@ const base::Closure& completion); void UnblacklistInternal(const PasswordStore::FormDigest& form_digest, base::OnceClosure completion); - void RemoveLeakedCredentialsCreatedBetweenInternal( + void RemoveLeakedCredentialsByUrlAndTimeInternal( + const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time remove_begin, base::Time remove_end, - const base::Closure& completion); + base::OnceClosure completion); // Finds all PasswordForms with a signon_realm that is equal to, or is a // PSL-match to that of |form|, and takes care of notifying the consumer with
diff --git a/components/password_manager/core/browser/password_store_default.cc b/components/password_manager/core/browser/password_store_default.cc index fdb7cf4..c37b5cf 100644 --- a/components/password_manager/core/browser/password_store_default.cc +++ b/components/password_manager/core/browser/password_store_default.cc
@@ -244,12 +244,13 @@ : std::vector<LeakedCredentials>(); } -void PasswordStoreDefault::RemoveLeakedCredentialsCreatedBetweenImpl( +void PasswordStoreDefault::RemoveLeakedCredentialsByUrlAndTimeImpl( + const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time remove_begin, base::Time remove_end) { if (login_db_) { - login_db_->leaked_credentials_table().RemoveRowsCreatedBetween(remove_begin, - remove_end); + login_db_->leaked_credentials_table().RemoveRowsByUrlAndTime( + url_filter, remove_begin, remove_end); } }
diff --git a/components/password_manager/core/browser/password_store_default.h b/components/password_manager/core/browser/password_store_default.h index 6b25dbc3..b48f8ee8 100644 --- a/components/password_manager/core/browser/password_store_default.h +++ b/components/password_manager/core/browser/password_store_default.h
@@ -77,7 +77,8 @@ void RemoveLeakedCredentialsImpl(const GURL& url, const base::string16& username) override; std::vector<LeakedCredentials> GetAllLeakedCredentialsImpl() override; - void RemoveLeakedCredentialsCreatedBetweenImpl( + void RemoveLeakedCredentialsByUrlAndTimeImpl( + const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time remove_begin, base::Time remove_end) override;
diff --git a/components/password_manager/core/browser/password_store_unittest.cc b/components/password_manager/core/browser/password_store_unittest.cc index e886c14..1326f1a 100644 --- a/components/password_manager/core/browser/password_store_unittest.cc +++ b/components/password_manager/core/browser/password_store_unittest.cc
@@ -1303,8 +1303,9 @@ WaitForPasswordStore(); testing::Mock::VerifyAndClearExpectations(&consumer); - store->RemoveLeakedCredentialsCreatedBetween( - base::Time::FromTimeT(150), base::Time::FromTimeT(250), base::Closure()); + store->RemoveLeakedCredentialsByUrlAndTime( + base::BindRepeating(std::not_equal_to<GURL>(), leaked_credentials3.url), + base::Time::FromTimeT(150), base::Time::FromTimeT(350), base::Closure()); EXPECT_CALL(consumer, OnGetLeakedCredentials(UnorderedElementsAre( leaked_credentials1, leaked_credentials3)));
diff --git a/components/password_manager/core/browser/test_password_store.cc b/components/password_manager/core/browser/test_password_store.cc index 45e06f8..872c8a8 100644 --- a/components/password_manager/core/browser/test_password_store.cc +++ b/components/password_manager/core/browser/test_password_store.cc
@@ -242,7 +242,8 @@ return std::vector<LeakedCredentials>(); } -void TestPasswordStore::RemoveLeakedCredentialsCreatedBetweenImpl( +void TestPasswordStore::RemoveLeakedCredentialsByUrlAndTimeImpl( + const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time remove_begin, base::Time remove_end) { NOTIMPLEMENTED();
diff --git a/components/password_manager/core/browser/test_password_store.h b/components/password_manager/core/browser/test_password_store.h index 5d3af311..53cb38e 100644 --- a/components/password_manager/core/browser/test_password_store.h +++ b/components/password_manager/core/browser/test_password_store.h
@@ -90,7 +90,8 @@ void RemoveLeakedCredentialsImpl(const GURL& url, const base::string16& username) override; std::vector<LeakedCredentials> GetAllLeakedCredentialsImpl() override; - void RemoveLeakedCredentialsCreatedBetweenImpl( + void RemoveLeakedCredentialsByUrlAndTimeImpl( + const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time remove_begin, base::Time remove_end) override;
diff --git a/components/policy/proto/chrome_device_policy.proto b/components/policy/proto/chrome_device_policy.proto index b1e29703..6cc3da3 100644 --- a/components/policy/proto/chrome_device_policy.proto +++ b/components/policy/proto/chrome_device_policy.proto
@@ -1494,14 +1494,6 @@ optional string device_login_screen_webusb_allow_devices_for_urls = 1; } -// Settings that control if the device is enforced to show (or hide) system -// information. -message DeviceLoginScreenSystemInfoEnforcedProto { - // Determines whether the system information is always shown (or hidden) on - // the login screen. - optional bool enabled = 1; -} - message ChromeDeviceSettingsProto { reserved 61, 90; optional DevicePolicyRefreshRateProto device_policy_refresh_rate = 1; @@ -1616,6 +1608,5 @@ optional DevicePowerwashAllowedProto device_powerwash_allowed = 91; optional DeviceLoginScreenWebUsbAllowDevicesForUrlsProto device_login_screen_webusb_allow_devices_for_urls = 92; - optional DeviceLoginScreenSystemInfoEnforcedProto - device_login_screen_system_info_enforced = 93; + optional BooleanPolicyProto device_login_screen_system_info_enforced = 93; }
diff --git a/components/policy/test_support/policy_testserver.py b/components/policy/test_support/policy_testserver.py index 954022d..bc4268c 100644 --- a/components/policy/test_support/policy_testserver.py +++ b/components/policy/test_support/policy_testserver.py
@@ -208,6 +208,15 @@ INVALID_ENROLLMENT_TOKEN = 'invalid_enrollment_token' +POLICY_COMMON_DEFINITIONS_TYPES = [ + 'StringList', + 'PolicyOptions', + 'BooleanPolicyProto', + 'IntegerPolicyProto', + 'StringPolicyProto', + 'StringListPolicyProto' +] + class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): """Decodes and handles device management requests from clients. @@ -988,6 +997,17 @@ self.SetProtobufMessageField(settings, field_descriptor, field_value) + def GetMessageDefinitionSource(self, message_type): + """Retrieve either policy_common_defintions, or chrome_device_policy + proto file, which contains the definition of the message. + + Args: + message_type: name of the message definition type. + """ + if message_type in POLICY_COMMON_DEFINITIONS_TYPES: + return 'cd' + return 'dp' + def GatherDevicePolicySettings(self, settings, policies): """Copies all the policies from a dictionary into a protobuf of type CloudDeviceSettingsProto. @@ -998,7 +1018,8 @@ """ for group in settings.DESCRIPTOR.fields: # Create protobuf message for group. - group_message = eval('dp.' + group.message_type.name + '()') + group_message = eval(self.GetMessageDefinitionSource( + group.message_type.name) + '.' + group.message_type.name + '()') # Indicates if at least one field was set in |group_message|. got_fields = False # Iterate over fields of the message and feed them from the
diff --git a/components/resources/OWNERS b/components/resources/OWNERS index 697f205..7b2b1c0 100644 --- a/components/resources/OWNERS +++ b/components/resources/OWNERS
@@ -24,4 +24,5 @@ per-file printing_resources.grdp=file://printing/OWNERS per-file security_interstitials_resources.grdp=file://components/security_interstitials/OWNERS per-file sync_driver_resources.grdp=file://components/sync/OWNERS +per-file translate_resources.grdp=file://components/translate/OWNERS per-file version_ui*=file://ui/webui/PLATFORM_OWNERS
diff --git a/components/resources/translate_resources.grdp b/components/resources/translate_resources.grdp index 5226e140..0a04033 100644 --- a/components/resources/translate_resources.grdp +++ b/components/resources/translate_resources.grdp
@@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8"?> <grit-part> - <include name="IDR_TRANSLATE_JS" file="../translate/core/browser/resources/translate.js" type="BINDATA" /> + <include name="IDR_TRANSLATE_JS" file="../translate/core/browser/resources/translate.js" type="BINDATA" compress="gzip" /> </grit-part>
diff --git a/components/search_engines/prepopulated_engines.json b/components/search_engines/prepopulated_engines.json index b134602..af61d0c5 100644 --- a/components/search_engines/prepopulated_engines.json +++ b/components/search_engines/prepopulated_engines.json
@@ -635,6 +635,7 @@ "alternate_urls": [ "http://hladaj.atlas.sk/fulltext/?phrase={searchTerms}" ], + "type": "SEARCH_ENGINE_ATLAS", "id": 27 }, @@ -1009,5 +1010,9 @@ "type": "SEARCH_ENGINE_ZOZNAM", "id": 85 } + }, + + "generate_array": { + "array_name": "kAllEngines" } }
diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc index 5fd11a9..52dd123a 100644 --- a/components/search_engines/template_url_prepopulate_data.cc +++ b/components/search_engines/template_url_prepopulate_data.cc
@@ -889,96 +889,6 @@ }; // ---------------------------------------------------------------------------- -// A list of all the engines that we know about. -const PrepopulatedEngine* const kAllEngines[] = { - // Prepopulated engines: - &ask, - &baidu, - &bing, - &coccoc, - &daum, - &duckduckgo, - &google, - &mail_ru, - &naver, - &qwant, - &seznam, - &sogou, - &yahoo, - &yahoo_ar, - &yahoo_at, - &yahoo_au, - &yahoo_br, - &yahoo_ca, - &yahoo_ch, - &yahoo_cl, - &yahoo_co, - &yahoo_de, - &yahoo_dk, - &yahoo_es, - &yahoo_fi, - &yahoo_fr, - &yahoo_hk, - &yahoo_id, - &yahoo_in, - &yahoo_jp, - &yahoo_mx, - &yahoo_my, - &yahoo_nl, - &yahoo_nz, - &yahoo_pe, - &yahoo_ph, - &yahoo_qc, - &yahoo_se, - &yahoo_sg, - &yahoo_th, - &yahoo_tr, - &yahoo_tw, - &yahoo_uk, - &yahoo_ve, - &yahoo_vn, - &yandex_by, - &yandex_com, - &yandex_kz, - &yandex_ru, - &yandex_tr, - &yandex_ua, - - // UMA-only engines: - &atlas_cz, - &atlas_sk, - &avg, - &babylon, - &conduit, - &delfi_lt, - &delfi_lv, - &delta, - &funmoods, - &goo, - &imesh, - &iminent, - &in, - &incredibar, - &libero, - &neti, - &nigma, - &ok, - &rambler, - &sapo, - &search_results, - &searchnu, - &snapdo, - &softonic, - &sweetim, - &sweetpacks, - &terra_ar, - &terra_es, - &tut, - &walla, - &wp, - &zoznam, -}; - std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulationSetFromCountryID( int country_id) { const PrepopulatedEngine* const* engines; @@ -1404,8 +1314,8 @@ #endif std::vector<const PrepopulatedEngine*> GetAllPrepopulatedEngines() { - return std::vector<const PrepopulatedEngine*>(std::begin(kAllEngines), - std::end(kAllEngines)); + return std::vector<const PrepopulatedEngine*>( + &kAllEngines[0], &kAllEngines[0] + kAllEnginesLength); } void ClearPrepopulatedEnginesInPrefs(PrefService* prefs) { @@ -1442,7 +1352,7 @@ return google.type; // Now check the rest of the prepopulate data. - for (size_t i = 0; i < base::size(kAllEngines); ++i) { + for (size_t i = 0; i < kAllEnginesLength; ++i) { // First check the main search URL. if (SameDomain(url, GURL(kAllEngines[i]->search_url))) return kAllEngines[i]->type;
diff --git a/components/signin/core/browser/account_reconcilor.h b/components/signin/core/browser/account_reconcilor.h index 4a17c37..b4b9cf2e 100644 --- a/components/signin/core/browser/account_reconcilor.h +++ b/components/signin/core/browser/account_reconcilor.h
@@ -253,8 +253,6 @@ void UnregisterWithAllDependencies(); void RegisterWithIdentityManager(); void UnregisterWithIdentityManager(); - void RegisterWithCookieManagerService(); - void UnregisterWithCookieManagerService(); void RegisterWithContentSettings(); void UnregisterWithContentSettings();
diff --git a/components/signin/core/browser/signin_internals_util.cc b/components/signin/core/browser/signin_internals_util.cc index 68884202..68dc2ee 100644 --- a/components/signin/core/browser/signin_internals_util.cc +++ b/components/signin/core/browser/signin_internals_util.cc
@@ -46,27 +46,4 @@ return std::string(); } -std::string TokenPrefPath(const std::string& token_name) { - return std::string(kTokenPrefPrefix) + token_name; -} - -// Gets the first few hex characters of the SHA256 hash of the passed in string. -// These are enough to perform equality checks across a single users tokens, -// while preventing outsiders from reverse-engineering the actual token from -// the displayed value. -// Note that for readability (in about:signin-internals), an empty string -// is not hashed, but simply returned as an empty string. -std::string GetTruncatedHash(const std::string& str) { - if (str.empty()) - return str; - - // Since each character in the hash string generates two hex charaters - // we only need half as many charaters in |hash_val| as hex characters - // returned. - const int kTruncateSize = kTruncateTokenStringLength / 2; - char hash_val[kTruncateSize]; - crypto::SHA256HashString(str, &hash_val[0], kTruncateSize); - return base::ToLowerASCII(base::HexEncode(&hash_val[0], kTruncateSize)); -} - } // namespace signin_internals_util
diff --git a/components/signin/core/browser/signin_internals_util.h b/components/signin/core/browser/signin_internals_util.h index 576710b..dc6a0e240 100644 --- a/components/signin/core/browser/signin_internals_util.h +++ b/components/signin/core/browser/signin_internals_util.h
@@ -19,9 +19,6 @@ extern const char kSigninPrefPrefix[]; extern const char kTokenPrefPrefix[]; -// The length of strings returned by GetTruncatedHash() below. -const size_t kTruncateTokenStringLength = 6; - // Helper enums to access fields from SigninStatus (declared below). enum { SIGNIN_FIELDS_BEGIN = 0, @@ -54,23 +51,10 @@ SIGNIN_FIELDS_COUNT = SIGNIN_FIELDS_END - SIGNIN_FIELDS_BEGIN }; -// Returns the root preference path for the service. The path should be -// qualified with one of .value, .status or .time to get the respective -// full preference path names. -std::string TokenPrefPath(const std::string& service_name); - // Returns the name of a SigninStatus field. std::string SigninStatusFieldToString(UntimedSigninStatusField field); std::string SigninStatusFieldToString(TimedSigninStatusField field); -// Gets the first 6 hex characters of the SHA256 hash of the passed in string. -// These are enough to perform equality checks across a single users tokens, -// while preventing outsiders from reverse-engineering the actual token from -// the displayed value. -// Note that for readability (in about:signin-internals), an empty string -// is not hashed, but simply returned as an empty string. -std::string GetTruncatedHash(const std::string& str); - } // namespace signin_internals_util #endif // COMPONENTS_SIGNIN_CORE_BROWSER_SIGNIN_INTERNALS_UTIL_H_
diff --git a/components/test/data/autofill_assistant/autofill_assistant_target_website.html b/components/test/data/autofill_assistant/html/autofill_assistant_target_website.html similarity index 97% rename from components/test/data/autofill_assistant/autofill_assistant_target_website.html rename to components/test/data/autofill_assistant/html/autofill_assistant_target_website.html index 63e90eb..6523ec2 100644 --- a/components/test/data/autofill_assistant/autofill_assistant_target_website.html +++ b/components/test/data/autofill_assistant/html/autofill_assistant_target_website.html
@@ -236,6 +236,9 @@ <iframe id="iframe" name="test_iframe" width="100%" height="500" src= "autofill_assistant_target_website_iframe_one.html"></iframe> + <iframe id="iframeExternal" name="test_iframe_external" width="100%" height="500" src= + "http://localhost:8081/autofill_assistant_external_iframe.html"></iframe> + <input type="checkbox" id="terms-and-conditions" /> <label for="terms-and-conditions" > <a href="#">I have read and understood <br />the terms and conditions</a>
diff --git a/components/test/data/autofill_assistant/autofill_assistant_target_website_iframe_one.html b/components/test/data/autofill_assistant/html/autofill_assistant_target_website_iframe_one.html similarity index 97% rename from components/test/data/autofill_assistant/autofill_assistant_target_website_iframe_one.html rename to components/test/data/autofill_assistant/html/autofill_assistant_target_website_iframe_one.html index d9f33c5..2e7605506 100644 --- a/components/test/data/autofill_assistant/autofill_assistant_target_website_iframe_one.html +++ b/components/test/data/autofill_assistant/html/autofill_assistant_target_website_iframe_one.html
@@ -60,7 +60,7 @@ <body onload="load()"> <div> <form name="address" id="address_section"> - <div id='billing'> + <div id="billing"> <h2>Billing Address</h2> Name: <input type="text" name="name"><br> Address: <input type="text" name="address"><br> @@ -87,6 +87,10 @@ </div> <div> + <input id="input" type="text" /> + </div> + + <div> <p id="touch_area" ontouchend="removeTouchArea()">Touchable Area</p> <br> </div> @@ -107,4 +111,4 @@ <iframe id="iframe" width="100%" height="500" src= "autofill_assistant_target_website_iframe_two.html"></iframe> </body> -</html> \ No newline at end of file +</html>
diff --git a/components/test/data/autofill_assistant/autofill_assistant_target_website_iframe_two.html b/components/test/data/autofill_assistant/html/autofill_assistant_target_website_iframe_two.html similarity index 100% rename from components/test/data/autofill_assistant/autofill_assistant_target_website_iframe_two.html rename to components/test/data/autofill_assistant/html/autofill_assistant_target_website_iframe_two.html
diff --git a/components/test/data/autofill_assistant/html_iframe/autofill_assistant_external_iframe.html b/components/test/data/autofill_assistant/html_iframe/autofill_assistant_external_iframe.html new file mode 100644 index 0000000..7304a41 --- /dev/null +++ b/components/test/data/autofill_assistant/html_iframe/autofill_assistant_external_iframe.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> + +<!-- +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. +--> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Autofill Assistant Test</title> + + <script> + var removeDiv = function() { + var div = document.getElementById("div"); + div.parentNode.removeChild(div); + } + </script> + </head> + <body> + <button id="button" type="button" onclick="removeDiv()">Button</button> + <div id="div">Text</div> + + <input id="input" type="text" /> + </body> +</html>
diff --git a/components/translate/core/browser/translate_script.cc b/components/translate/core/browser/translate_script.cc index e2b43c5..5724783 100644 --- a/components/translate/core/browser/translate_script.cc +++ b/components/translate/core/browser/translate_script.cc
@@ -154,10 +154,8 @@ &data_, "var securityOrigin = '%s';", security_origin.spec().c_str()); // Load embedded translate.js. - base::StringPiece str = - ui::ResourceBundle::GetSharedInstance().GetRawDataResource( - IDR_TRANSLATE_JS); - str.AppendToString(&data_); + data_.append(ui::ResourceBundle::GetSharedInstance().DecompressDataResource( + IDR_TRANSLATE_JS)); #if defined(OS_IOS) // Append snippet to install callbacks on translate.js if available.
diff --git a/components/translate/ios/browser/js_translate_manager_unittest.mm b/components/translate/ios/browser/js_translate_manager_unittest.mm index af64932..550e3f5 100644 --- a/components/translate/ios/browser/js_translate_manager_unittest.mm +++ b/components/translate/ios/browser/js_translate_manager_unittest.mm
@@ -21,11 +21,10 @@ JsTranslateManagerTest() { receiver_ = [[CRWTestJSInjectionReceiver alloc] init]; manager_ = [[JsTranslateManager alloc] initWithReceiver:receiver_]; - base::StringPiece script = - ui::ResourceBundle::GetSharedInstance().GetRawDataResource( + std::string script = + ui::ResourceBundle::GetSharedInstance().DecompressDataResource( IDR_TRANSLATE_JS); - [manager_ setScript:base::SysUTF8ToNSString(script.as_string() + - "('DummyKey');")]; + [manager_ setScript:base::SysUTF8ToNSString(script + "('DummyKey');")]; } bool IsDefined(NSString* name) {
diff --git a/components/ukm/ukm_recorder_impl.cc b/components/ukm/ukm_recorder_impl.cc index 55f9023..cced2e4 100644 --- a/components/ukm/ukm_recorder_impl.cc +++ b/components/ukm/ukm_recorder_impl.cc
@@ -19,6 +19,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "components/variations/variations_associated_data.h" +#include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_decode.h" #include "services/metrics/public/cpp/ukm_source.h" #include "services/metrics/public/cpp/ukm_source_id.h" @@ -270,6 +271,7 @@ is_webstore_extension_callback_ = callback; } +// TODO(rkaplow): This should be refactored. void UkmRecorderImpl::StoreRecordingsInReport(Report* report) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -393,6 +395,24 @@ "UKM.Sources.SerializedCount2.App", serialized_source_type_counts[ukm::SourceIdType::APP_ID]); + // We record a UMA metric specifically for the number of serialized events + // with the FCP metric. This is for data quality verification. + const uint64_t pageload_hash = + base::HashMetricName(ukm::builders::PageLoad::kEntryName); + const uint64_t fcp_hash = base::HashMetricName( + ukm::builders::PageLoad:: + kPaintTiming_NavigationToFirstContentfulPaintName); + int num_recorded_fcp = 0; + for (const auto& entry : recordings_.entries) { + if (entry->event_hash == pageload_hash) { + if (entry->metrics.find(fcp_hash) != entry->metrics.end()) { + num_recorded_fcp++; + } + } + } + UMA_HISTOGRAM_COUNTS_100000("UKM.Entries.SerializedCountFCP", + num_recorded_fcp); + // For each matching id in obsolete_source_ids, remove the Source from // recordings_.sources. The remaining sources form the deferred sources for // the next report.
diff --git a/content/browser/appcache/appcache_group.cc b/content/browser/appcache/appcache_group.cc index be53ed1..8120f407 100644 --- a/content/browser/appcache/appcache_group.cc +++ b/content/browser/appcache/appcache_group.cc
@@ -232,7 +232,7 @@ void AppCacheGroup::ScheduleUpdateRestart(int delay_ms) { DCHECK(restart_update_task_.IsCancelled()); restart_update_task_.Reset( - base::Bind(&AppCacheGroup::RunQueuedUpdates, this)); + base::BindOnce(&AppCacheGroup::RunQueuedUpdates, this)); base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, restart_update_task_.callback(), base::TimeDelta::FromMilliseconds(delay_ms));
diff --git a/content/browser/appcache/appcache_group.h b/content/browser/appcache/appcache_group.h index a058f600..63c1bb5 100644 --- a/content/browser/appcache/appcache_group.h +++ b/content/browser/appcache/appcache_group.h
@@ -191,7 +191,7 @@ // Updates that have been queued for the next run. QueuedUpdates queued_updates_; base::ObserverList<UpdateObserver>::Unchecked queued_observers_; - base::CancelableClosure restart_update_task_; + base::CancelableOnceClosure restart_update_task_; std::unique_ptr<HostObserver> host_observer_; // True if we're in our destructor.
diff --git a/content/browser/browser_thread_unittest.cc b/content/browser/browser_thread_unittest.cc index 06eb14cf..1bd0d55 100644 --- a/content/browser/browser_thread_unittest.cc +++ b/content/browser/browser_thread_unittest.cc
@@ -43,23 +43,22 @@ class SequenceManagerThreadDelegate : public base::Thread::Delegate { public: SequenceManagerThreadDelegate() { - sequence_manager_ = + ui_sequence_manager_ = base::sequence_manager::internal::SequenceManagerImpl::CreateUnbound( base::sequence_manager::SequenceManager::Settings()); auto browser_ui_thread_scheduler = BrowserUIThreadScheduler::CreateForTesting( - sequence_manager_.get(), sequence_manager_->GetRealTimeDomain()); + ui_sequence_manager_.get(), + ui_sequence_manager_->GetRealTimeDomain()); default_task_runner_ = browser_ui_thread_scheduler->GetHandle()->GetDefaultTaskRunner(); - sequence_manager_->SetDefaultTaskRunner(default_task_runner_); + ui_sequence_manager_->SetDefaultTaskRunner(default_task_runner_); BrowserTaskExecutor::CreateForTesting( std::move(browser_ui_thread_scheduler), - std::make_unique<BrowserIOThreadDelegate>( - BrowserIOThreadDelegate::BrowserTaskExecutorPresent:: - kNoForTesting)); + std::make_unique<BrowserIOThreadDelegate>()); BrowserTaskExecutor::EnableAllQueues(); } @@ -73,13 +72,14 @@ } void BindToCurrentThread(base::TimerSlack timer_slack) override { - sequence_manager_->BindToMessagePump( + ui_sequence_manager_->BindToMessagePump( base::MessagePump::Create(base::MessagePumpType::DEFAULT)); - sequence_manager_->SetTimerSlack(timer_slack); + ui_sequence_manager_->SetTimerSlack(timer_slack); + BrowserTaskExecutor::BindToUIThreadForTesting(); } private: - std::unique_ptr<base::sequence_manager::SequenceManager> sequence_manager_; + std::unique_ptr<base::sequence_manager::SequenceManager> ui_sequence_manager_; scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; DISALLOW_COPY_AND_ASSIGN(SequenceManagerThreadDelegate); @@ -314,9 +314,7 @@ QueueType::kDefault)); BrowserTaskExecutor::CreateForTesting( std::move(browser_ui_thread_scheduler), - std::make_unique<BrowserIOThreadDelegate>( - BrowserIOThreadDelegate::BrowserTaskExecutorPresent:: - kNoForTesting)); + std::make_unique<BrowserIOThreadDelegate>()); ui_thread_ = BrowserTaskExecutor::CreateIOThread(); BrowserTaskExecutor::InitializeIOThread();
diff --git a/content/browser/cache_storage/cache_storage_context_impl.cc b/content/browser/cache_storage/cache_storage_context_impl.cc index 79cec0a..09296f8 100644 --- a/content/browser/cache_storage/cache_storage_context_impl.cc +++ b/content/browser/cache_storage/cache_storage_context_impl.cc
@@ -28,7 +28,7 @@ namespace { const base::Feature kCacheStorageSequenceFeature{ - "CacheStorageSequence", base::FEATURE_ENABLED_BY_DEFAULT}; + "CacheStorageSequence", base::FEATURE_DISABLED_BY_DEFAULT}; scoped_refptr<base::SequencedTaskRunner> CreateSchedulerTaskRunner() { if (!base::FeatureList::IsEnabled(kCacheStorageSequenceFeature))
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc index 286abc7..23620d9 100644 --- a/content/browser/child_process_security_policy_impl.cc +++ b/content/browser/child_process_security_policy_impl.cc
@@ -1228,24 +1228,65 @@ CanCommitStatus ChildProcessSecurityPolicyImpl::CanCommitOriginAndUrl( int child_id, + const IsolationContext& isolation_context, const url::Origin& origin, const GURL& url) { - // TODO(nasko): This check should be updated to apply to all URLs, not just - // standard ones. - if (url.IsStandard() && !CanAccessDataForOrigin(child_id, url)) + const url::Origin url_origin = url::Origin::Resolve(url, origin); + if (!CanAccessDataForOrigin(child_id, url_origin)) { + // Allow opaque origins w/o precursors to commit. + // TODO(acolwell): Investigate all cases that trigger this path and fix + // them so we have precursor information. Remove this logic once that has + // been completed. + if (url_origin.opaque() && + url_origin.GetTupleOrPrecursorTupleIfOpaque().IsInvalid()) { + return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL; + } + + // Check for special cases, like blob:null/ and data: URLs, where the + // origin does not contain information to match against the process lock, + // but using the whole URL can result in a process lock match. + const GURL expected_origin_lock = + SiteInstanceImpl::DetermineProcessLockURL(isolation_context, url); + const GURL actual_origin_lock = GetOriginLock(child_id); + if (actual_origin_lock == expected_origin_lock) + return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL; + + // Allow about: pages to commit in a process that does not match the opaque + // origin's precursor information. + // TODO(acolwell): Remove this once process selection for about: URLs has + // been fixed to always match the precursor info. + if (url_origin.opaque() && (url.IsAboutBlank() || url.IsAboutSrcdoc()) && + !actual_origin_lock.is_empty()) { + return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL; + } return CanCommitStatus::CANNOT_COMMIT_URL; + } - // It is safe to commit into a opaque origin, regardless of the URL, as it is - // restricted from accessing other origins. - if (origin.opaque()) - return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL; - - // Standard URLs must match the reported origin. - if (url.IsStandard() && !origin.IsSameOriginWith(url::Origin::Create(url))) + if (!CanAccessDataForOrigin(child_id, origin)) { + // Allow opaque origins w/o precursors to commit. + // TODO(acolwell): Investigate all cases that trigger this path and fix + // them so we have precursor information. Remove this logic once that has + // been completed. + if (origin.opaque() && + origin.GetTupleOrPrecursorTupleIfOpaque().IsInvalid()) { + return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL; + } return CanCommitStatus::CANNOT_COMMIT_ORIGIN; + } - if (!CanAccessDataForOrigin(child_id, origin)) + // Ensure that the origin derived from |url| is consistent with |origin|. + // Note: We can't use origin.IsSameOriginWith() here because opaque origins + // with precursors may have different nonce values. + const auto url_tuple_or_precursor_tuple = + url_origin.GetTupleOrPrecursorTupleIfOpaque(); + const auto origin_tuple_or_precursor_tuple = + origin.GetTupleOrPrecursorTupleIfOpaque(); + + if (!url_tuple_or_precursor_tuple.IsInvalid() && + !origin_tuple_or_precursor_tuple.IsInvalid() && + origin_tuple_or_precursor_tuple != url_tuple_or_precursor_tuple) { return CanCommitStatus::CANNOT_COMMIT_ORIGIN; + } return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL; }
diff --git a/content/browser/child_process_security_policy_impl.h b/content/browser/child_process_security_policy_impl.h index 7e5e2a7..dedc4f1 100644 --- a/content/browser/child_process_security_policy_impl.h +++ b/content/browser/child_process_security_policy_impl.h
@@ -123,9 +123,11 @@ // |url| combination to the process associated with |child_id|. // Returns CANNOT_COMMIT_URL if |url| is not safe to commit. // Returns CANNOT_COMMIT_ORIGIN if |origin| is not safe to commit. - CanCommitStatus CanCommitOriginAndUrl(int child_id, - const url::Origin& origin, - const GURL& url); + CanCommitStatus CanCommitOriginAndUrl( + int child_id, + const IsolationContext& isolation_context, + const url::Origin& origin, + const GURL& url); // This function will check whether |origin| requires process isolation // within |isolation_context|, and if so, it will return true and put the
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc index 950dc9d..c480bbbd 100644 --- a/content/browser/devtools/render_frame_devtools_agent_host.cc +++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -49,6 +49,7 @@ #include "content/browser/web_contents/web_contents_impl.h" #include "content/browser/web_package/signed_exchange_envelope.h" #include "content/common/view_messages.h" +#include "content/public/browser/back_forward_cache.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -429,6 +430,13 @@ } for (auto* target : protocol::TargetHandler::ForAgentHost(this)) target->DidFinishNavigation(); + + // RenderFrameDevToolsAgentHost is associated with frame_tree_node, while + // documents in the back-forward cache share a node, therefore we can't cache + // them. TODO(1001087): add support long-term. + content::BackForwardCache::DisableForRenderFrameHost( + navigation_handle->GetPreviousRenderFrameHostId(), + "RenderFrameDevToolsAgentHost"); } void RenderFrameDevToolsAgentHost::UpdateFrameHost(
diff --git a/content/browser/devtools/render_frame_devtools_agent_host_browsertest.cc b/content/browser/devtools/render_frame_devtools_agent_host_browsertest.cc index 7908a8ed..bd29fac2 100644 --- a/content/browser/devtools/render_frame_devtools_agent_host_browsertest.cc +++ b/content/browser/devtools/render_frame_devtools_agent_host_browsertest.cc
@@ -7,8 +7,10 @@ #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/devtools_agent_host_client.h" +#include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" #include "content/public/common/url_constants.h" +#include "content/public/test/back_forward_cache_util.h" #include "content/public/test/browser_test_base.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test.h" @@ -170,4 +172,32 @@ devtools_agent_host->DetachClient(&devtools_agent_host_client); } +IN_PROC_BROWSER_TEST_F(RenderFrameDevToolsAgentHostBrowserTest, + DevToolsDisableBackForwardCache) { + content::BackForwardCacheDisabledTester tester; + EXPECT_TRUE(embedded_test_server()->Start()); + + // Navigate to a page. + const GURL a_url(embedded_test_server()->GetURL("a.com", "/title1.html")); + EXPECT_TRUE(NavigateToURL(shell(), a_url)); + content::RenderFrameHost* main_frame = + shell()->web_contents()->GetMainFrame(); + int process_id = main_frame->GetProcess()->GetID(); + int frame_routing_id = main_frame->GetRoutingID(); + + // Open DevTools. + scoped_refptr<DevToolsAgentHost> devtools_agent_host = + DevToolsAgentHost::GetOrCreateFor(shell()->web_contents()); + StubDevToolsAgentHostClient devtools_agent_host_client; + devtools_agent_host->AttachClient(&devtools_agent_host_client); + + // Navigate away from the page. This should block bfcache. + const GURL b_url(embedded_test_server()->GetURL("b.com", "/title1.html")); + EXPECT_TRUE(NavigateToURL(shell(), b_url)); + EXPECT_TRUE(tester.IsDisabledForFrameWithReason( + process_id, frame_routing_id, "RenderFrameDevToolsAgentHost")); + + devtools_agent_host->DetachClient(&devtools_agent_host_client); +} + } // namespace content
diff --git a/content/browser/frame_host/debug_urls.cc b/content/browser/frame_host/debug_urls.cc index 52fa902b..cf7ada76 100644 --- a/content/browser/frame_host/debug_urls.cc +++ b/content/browser/frame_host/debug_urls.cc
@@ -174,7 +174,7 @@ if (url == kChromeUIGpuCleanURL) { GpuProcessHost::CallOnIO(GPU_PROCESS_KIND_SANDBOXED, false /* force_create */, - base::Bind([](GpuProcessHost* host) { + base::BindOnce([](GpuProcessHost* host) { if (host) host->gpu_service()->DestroyAllChannels(); })); @@ -184,7 +184,7 @@ if (url == kChromeUIGpuCrashURL) { GpuProcessHost::CallOnIO(GPU_PROCESS_KIND_SANDBOXED, false /* force_create */, - base::Bind([](GpuProcessHost* host) { + base::BindOnce([](GpuProcessHost* host) { if (host) host->gpu_service()->Crash(); })); @@ -195,7 +195,7 @@ if (url == kChromeUIGpuJavaCrashURL) { GpuProcessHost::CallOnIO(GPU_PROCESS_KIND_SANDBOXED, false /* force_create */, - base::Bind([](GpuProcessHost* host) { + base::BindOnce([](GpuProcessHost* host) { if (host) host->gpu_service()->ThrowJavaException(); })); @@ -206,7 +206,7 @@ if (url == kChromeUIGpuHangURL) { GpuProcessHost::CallOnIO(GPU_PROCESS_KIND_SANDBOXED, false /* force_create */, - base::Bind([](GpuProcessHost* host) { + base::BindOnce([](GpuProcessHost* host) { if (host) host->gpu_service()->Hang(); }));
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc index 64f96c9..6cf3ff8 100644 --- a/content/browser/frame_host/navigation_controller_impl.cc +++ b/content/browser/frame_host/navigation_controller_impl.cc
@@ -521,7 +521,7 @@ is_initial_navigation_(true), in_navigate_to_pending_entry_(false), pending_reload_(ReloadType::NONE), - get_timestamp_callback_(base::Bind(&base::Time::Now)), + get_timestamp_callback_(base::BindRepeating(&base::Time::Now)), entry_replaced_by_post_commit_error_(nullptr) { DCHECK(browser_context_); } @@ -3497,7 +3497,7 @@ } void NavigationControllerImpl::SetGetTimestampCallbackForTest( - const base::Callback<base::Time()>& get_timestamp_callback) { + const base::RepeatingCallback<base::Time()>& get_timestamp_callback) { get_timestamp_callback_ = get_timestamp_callback; }
diff --git a/content/browser/frame_host/navigation_controller_impl.h b/content/browser/frame_host/navigation_controller_impl.h index 8886cb2c..651d2390 100644 --- a/content/browser/frame_host/navigation_controller_impl.h +++ b/content/browser/frame_host/navigation_controller_impl.h
@@ -276,7 +276,7 @@ static size_t max_entry_count(); void SetGetTimestampCallbackForTest( - const base::Callback<base::Time()>& get_timestamp_callback); + const base::RepeatingCallback<base::Time()>& get_timestamp_callback); // Discards only the pending entry. |was_failure| should be set if the pending // entry is being discarded because it failed to load. @@ -619,7 +619,7 @@ ReloadType pending_reload_; // Used to get timestamps for newly-created navigation entries. - base::Callback<base::Time()> get_timestamp_callback_; + base::RepeatingCallback<base::Time()> get_timestamp_callback_; // Used to smooth out timestamps from |get_timestamp_callback_|. // Without this, whenever there is a run of redirects or
diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc index da6905a2..a9648cb 100644 --- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc +++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
@@ -7290,8 +7290,8 @@ // Suspend the message. web_contents_observer_.SetCallback( - base::Bind(&RenderFrameHost::OnMessageReceived, - base::Unretained(render_frame_host_), message)); + base::BindOnce(&RenderFrameHost::OnMessageReceived, + base::Unretained(render_frame_host_), message)); return true; } @@ -7306,7 +7306,7 @@ // OnMessageReceived function; this is the simplest way to disambiguate. class : public WebContentsObserver { public: - using Callback = base::Callback<bool()>; + using Callback = base::OnceCallback<bool()>; using WebContentsObserver::Observe; @@ -7319,7 +7319,7 @@ return; // Resume the message. - callback_.Run(); + std::move(callback_).Run(); } Callback callback_; @@ -7409,7 +7409,7 @@ void SetUpOnMainThread() override { // Accumulate all http requests made to |embedded_test_server| into // |accumulated_requests_| container. - embedded_test_server()->RegisterRequestMonitor(base::Bind( + embedded_test_server()->RegisterRequestMonitor(base::BindRepeating( &RequestMonitoringNavigationBrowserTest::MonitorRequestOnIoThread, weak_factory_.GetWeakPtr(), base::SequencedTaskRunnerHandle::Get()));
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc index 6c786e3b..51b13de 100644 --- a/content/browser/frame_host/navigation_controller_impl_unittest.cc +++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
@@ -526,7 +526,7 @@ // Set the clock to always return a timestamp of 1. controller.SetGetTimestampCallbackForTest( - base::Bind(&GetFixedTime, InMicrosecondsSinceEpoch(1))); + base::BindRepeating(&GetFixedTime, InMicrosecondsSinceEpoch(1))); const GURL url1("http://foo1"); const GURL url2("http://foo2"); @@ -1442,13 +1442,6 @@ EXPECT_FALSE(committed_entry->should_clear_history_list()); } -namespace { -void SetRedirects(const std::vector<GURL>& redirects, - FrameHostMsg_DidCommitProvisionalLoad_Params* params) { - params->redirects = redirects; -} -} // namespace - // Test that Redirects are preserved after a commit. TEST_F(NavigationControllerTest, RedirectsAreNotResetByCommit) { NavigationControllerImpl& controller = controller_impl(); @@ -1461,7 +1454,6 @@ // Set up some redirect values. std::vector<GURL> redirects; redirects.push_back(url2); - auto set_redirects_callback = base::Bind(SetRedirects, redirects); // Set redirects on the pending entry. NavigationEntryImpl* pending_entry = controller.GetPendingEntry();
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc index 252a5c2..667e28d 100644 --- a/content/browser/frame_host/navigation_request.cc +++ b/content/browser/frame_host/navigation_request.cc
@@ -1176,8 +1176,8 @@ // the NavigationHandle where the callback will be stored. // TODO(clamy): pass the method to the NavigationHandle instead of a // boolean. - WillStartRequest(base::Bind(&NavigationRequest::OnStartChecksComplete, - base::Unretained(this))); + WillStartRequest(base::BindOnce(&NavigationRequest::OnStartChecksComplete, + base::Unretained(this))); } void NavigationRequest::SetWaitingForRendererResponse() { @@ -1377,8 +1377,8 @@ // (rather than passing the old URL). UpdateStateFollowingRedirect( GURL(redirect_info.new_referrer), - base::Bind(&NavigationRequest::OnRedirectChecksComplete, - base::Unretained(this))); + base::BindOnce(&NavigationRequest::OnRedirectChecksComplete, + base::Unretained(this))); frame_tree_node_->ResetNavigationRequest(false, true); return; } @@ -1523,9 +1523,10 @@ // It's safe to use base::Unretained because this NavigationRequest owns the // NavigationHandle where the callback will be stored. - WillRedirectRequest(common_params_->referrer->url, expected_process, - base::Bind(&NavigationRequest::OnRedirectChecksComplete, - base::Unretained(this))); + WillRedirectRequest( + common_params_->referrer->url, expected_process, + base::BindOnce(&NavigationRequest::OnRedirectChecksComplete, + base::Unretained(this))); } void NavigationRequest::OnResponseStarted( @@ -1811,8 +1812,8 @@ // Check if the navigation should be allowed to proceed. WillProcessResponse( - base::Bind(&NavigationRequest::OnWillProcessResponseChecksComplete, - base::Unretained(this))); + base::BindOnce(&NavigationRequest::OnWillProcessResponseChecksComplete, + base::Unretained(this))); } void NavigationRequest::OnRequestFailed(
diff --git a/content/browser/frame_host/navigation_request_browsertest.cc b/content/browser/frame_host/navigation_request_browsertest.cc index 0eb1479f..f57917b 100644 --- a/content/browser/frame_host/navigation_request_browsertest.cc +++ b/content/browser/frame_host/navigation_request_browsertest.cc
@@ -63,19 +63,19 @@ NavigationThrottle::ThrottleCheckResult will_redirect_result, NavigationThrottle::ThrottleCheckResult will_fail_result, NavigationThrottle::ThrottleCheckResult will_process_result, - base::Closure did_call_will_start, - base::Closure did_call_will_redirect, - base::Closure did_call_will_fail, - base::Closure did_call_will_process) + base::OnceClosure did_call_will_start, + base::OnceClosure did_call_will_redirect, + base::OnceClosure did_call_will_fail, + base::OnceClosure did_call_will_process) : NavigationThrottle(handle), will_start_result_(will_start_result), will_redirect_result_(will_redirect_result), will_fail_result_(will_fail_result), will_process_result_(will_process_result), - did_call_will_start_(did_call_will_start), - did_call_will_redirect_(did_call_will_redirect), - did_call_will_fail_(did_call_will_fail), - did_call_will_process_(did_call_will_process) {} + did_call_will_start_(std::move(did_call_will_start)), + did_call_will_redirect_(std::move(did_call_will_redirect)), + did_call_will_fail_(std::move(did_call_will_fail)), + did_call_will_process_(std::move(did_call_will_process)) {} ~TestNavigationThrottle() override {} const char* GetNameForLogging() override { return "TestNavigationThrottle"; } @@ -100,7 +100,8 @@ navigation_request->request_context_type()); request_context_type_ = navigation_request->request_context_type(); - base::PostTask(FROM_HERE, {BrowserThread::UI}, did_call_will_start_); + base::PostTask(FROM_HERE, {BrowserThread::UI}, + std::move(did_call_will_start_)); return will_start_result_; } @@ -109,7 +110,8 @@ NavigationRequest::From(navigation_handle()); CHECK_EQ(request_context_type_, navigation_request->request_context_type()); - base::PostTask(FROM_HERE, {BrowserThread::UI}, did_call_will_redirect_); + base::PostTask(FROM_HERE, {BrowserThread::UI}, + std::move(did_call_will_redirect_)); return will_redirect_result_; } @@ -118,7 +120,8 @@ NavigationRequest::From(navigation_handle()); CHECK_EQ(request_context_type_, navigation_request->request_context_type()); - base::PostTask(FROM_HERE, {BrowserThread::UI}, did_call_will_fail_); + base::PostTask(FROM_HERE, {BrowserThread::UI}, + std::move(did_call_will_fail_)); return will_fail_result_; } @@ -127,7 +130,8 @@ NavigationRequest::From(navigation_handle()); CHECK_EQ(request_context_type_, navigation_request->request_context_type()); - base::PostTask(FROM_HERE, {BrowserThread::UI}, did_call_will_process_); + base::PostTask(FROM_HERE, {BrowserThread::UI}, + std::move(did_call_will_process_)); return will_process_result_; } @@ -135,10 +139,10 @@ NavigationThrottle::ThrottleCheckResult will_redirect_result_; NavigationThrottle::ThrottleCheckResult will_fail_result_; NavigationThrottle::ThrottleCheckResult will_process_result_; - base::Closure did_call_will_start_; - base::Closure did_call_will_redirect_; - base::Closure did_call_will_fail_; - base::Closure did_call_will_process_; + base::OnceClosure did_call_will_start_; + base::OnceClosure did_call_will_redirect_; + base::OnceClosure did_call_will_fail_; + base::OnceClosure did_call_will_process_; blink::mojom::RequestContextType request_context_type_ = blink::mojom::RequestContextType::UNSPECIFIED; }; @@ -286,14 +290,17 @@ std::unique_ptr<NavigationThrottle> throttle(new TestNavigationThrottle( handle, will_start_result_, will_redirect_result_, will_fail_result_, will_process_result_, - base::Bind(&TestNavigationThrottleInstaller::DidCallWillStartRequest, - weak_factory_.GetWeakPtr()), - base::Bind(&TestNavigationThrottleInstaller::DidCallWillRedirectRequest, - weak_factory_.GetWeakPtr()), - base::Bind(&TestNavigationThrottleInstaller::DidCallWillFailRequest, - weak_factory_.GetWeakPtr()), - base::Bind(&TestNavigationThrottleInstaller::DidCallWillProcessResponse, - weak_factory_.GetWeakPtr()))); + base::BindOnce( + &TestNavigationThrottleInstaller::DidCallWillStartRequest, + weak_factory_.GetWeakPtr()), + base::BindOnce( + &TestNavigationThrottleInstaller::DidCallWillRedirectRequest, + weak_factory_.GetWeakPtr()), + base::BindOnce(&TestNavigationThrottleInstaller::DidCallWillFailRequest, + weak_factory_.GetWeakPtr()), + base::BindOnce( + &TestNavigationThrottleInstaller::DidCallWillProcessResponse, + weak_factory_.GetWeakPtr()))); navigation_throttle_ = static_cast<TestNavigationThrottle*>(throttle.get()); handle->RegisterThrottleForTesting(std::move(throttle)); ++install_count_;
diff --git a/content/browser/frame_host/navigation_request_unittest.cc b/content/browser/frame_host/navigation_request_unittest.cc index c0cb26b0..40769e3 100644 --- a/content/browser/frame_host/navigation_request_unittest.cc +++ b/content/browser/frame_host/navigation_request_unittest.cc
@@ -92,8 +92,8 @@ // It's safe to use base::Unretained since the NavigationHandle is owned by // the NavigationRequestTest. request_->WillStartRequest( - base::Bind(&NavigationRequestTest::UpdateThrottleCheckResult, - base::Unretained(this))); + base::BindOnce(&NavigationRequestTest::UpdateThrottleCheckResult, + base::Unretained(this))); } // Helper function to call WillRedirectRequest on |handle|. If this function @@ -109,8 +109,8 @@ // the NavigationRequestTest. request_->WillRedirectRequest( GURL(), nullptr, - base::Bind(&NavigationRequestTest::UpdateThrottleCheckResult, - base::Unretained(this))); + base::BindOnce(&NavigationRequestTest::UpdateThrottleCheckResult, + base::Unretained(this))); } // Helper function to call WillFailRequest on |handle|. If this function @@ -126,8 +126,8 @@ // It's safe to use base::Unretained since the NavigationHandle is owned by // the NavigationRequestTest. request_->WillFailRequest( - base::Bind(&NavigationRequestTest::UpdateThrottleCheckResult, - base::Unretained(this))); + base::BindOnce(&NavigationRequestTest::UpdateThrottleCheckResult, + base::Unretained(this))); } // Helper function to call WillProcessResponse on |handle|. If this function @@ -144,8 +144,8 @@ // to WillRedirectRequest to verify that it's correctly plumbed in both // cases. request_->WillProcessResponse( - base::Bind(&NavigationRequestTest::UpdateThrottleCheckResult, - base::Unretained(this))); + base::BindOnce(&NavigationRequestTest::UpdateThrottleCheckResult, + base::Unretained(this))); } // Whether the callback was called.
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index b24bebb0..1e8c682 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -285,6 +285,26 @@ } } +// Returns true if |url| & |base_url| represents a WebView loadDataWithBaseUrl +// navigation. +bool IsLoadDataWithBaseURL(const GURL& url, const GURL& base_url) { + return url.SchemeIs(url::kDataScheme) && !base_url.is_empty(); +} + +// Returns true if |common_params| represents a WebView loadDataWithBaseUrl +// navigation. +bool IsLoadDataWithBaseURL(const mojom::CommonNavigationParams& common_params) { + return IsLoadDataWithBaseURL(common_params.url, + common_params.base_url_for_data_url); +} + +// Returns true if |validated_params| represents a WebView loadDataWithBaseUrl +// navigation. +bool IsLoadDataWithBaseURL( + const FrameHostMsg_DidCommitProvisionalLoad_Params& validated_params) { + return IsLoadDataWithBaseURL(validated_params.url, validated_params.base_url); +} + // Ensure that we reset nav_entry_id_ in DidCommitProvisionalLoad if any of // the validations fail and lead to an early return. Call disable() once we // know the commit will be successful. Resetting nav_entry_id_ avoids acting on @@ -411,8 +431,7 @@ // Check if this is loadDataWithBaseUrl (which needs special treatment). auto& common_params = navigation_request->common_params(); - if (common_params.url.SchemeIs(url::kDataScheme) && - !common_params.base_url_for_data_url.is_empty()) { + if (IsLoadDataWithBaseURL(common_params)) { // A (potentially attacker-controlled) renderer process should not be able // to use loadDataWithBaseUrl code path to initiate fetches on behalf of a // victim origin (fetches controlled by attacker-provided @@ -4607,27 +4626,31 @@ return CanCommitStatus::CANNOT_COMMIT_URL; auto* policy = ChildProcessSecurityPolicyImpl::GetInstance(); - const CanCommitStatus can_commit_status = - policy->CanCommitOriginAndUrl(GetProcess()->GetID(), origin, url); + const CanCommitStatus can_commit_status = policy->CanCommitOriginAndUrl( + GetProcess()->GetID(), GetSiteInstance()->GetIsolationContext(), origin, + url); if (can_commit_status != CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL) return can_commit_status; - if (!origin.opaque()) { - // A non-opaque origin must be a valid URL, which allows us to safely do a - // conversion to GURL. - GURL origin_url = origin.GetURL(); - - // Verify that the origin is allowed to commit in this process. + const auto origin_tuple_or_precursor_tuple = + origin.GetTupleOrPrecursorTupleIfOpaque(); + if (!origin_tuple_or_precursor_tuple.IsInvalid()) { + // Verify that the origin/precursor is allowed to commit in this process. // Note: This also handles non-standard cases for |url|, such as // about:blank, data, and blob URLs. // Renderer-debug URLs can never be committed. - if (IsRendererDebugURL(origin_url)) + if (IsRendererDebugURL(origin_tuple_or_precursor_tuple.GetURL())) return CanCommitStatus::CANNOT_COMMIT_ORIGIN; - // Give the client a chance to disallow URLs from committing. - if (!GetContentClient()->browser()->CanCommitURL(GetProcess(), origin_url)) + // Give the client a chance to disallow origin URLs from committing. + // TODO(acolwell): Fix this code to work with opaque origins. Currently + // some opaque origin precursors, like chrome-extension schemes, can trigger + // the commit to fail. These need to be investigated. + if (!origin.opaque() && !GetContentClient()->browser()->CanCommitURL( + GetProcess(), origin.GetURL())) { return CanCommitStatus::CANNOT_COMMIT_ORIGIN; + } } return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL; @@ -5948,8 +5971,7 @@ if (!GetProcess()->IsForGuestsOnly()) { ChildProcessSecurityPolicyImpl::GetInstance()->GrantCommitURL( GetProcess()->GetID(), common_params.url); - if (common_params.url.SchemeIs(url::kDataScheme) && - !common_params.base_url_for_data_url.is_empty()) { + if (IsLoadDataWithBaseURL(common_params)) { // When there's a base URL specified for the data URL, we also need to // grant access to the base URL. This allows file: and other unexpected // schemes to be accepted at commit time and during CORS checks (e.g., for @@ -6789,7 +6811,23 @@ bypass_checks_for_file_scheme = true; } - if (!bypass_checks_for_error_page && !bypass_checks_for_file_scheme) { + // WebView's loadDataWithBaseURL API is allowed to bypass normal commit + // checks because it is allowed to commit anything into its unlocked process + // and its data: URL and non-opaque origin would fail the normal commit + // checks. + bool bypass_checks_for_webview = false; + if ((navigation_request && + IsLoadDataWithBaseURL(navigation_request->common_params())) || + (is_same_document_navigation && + IsLoadDataWithBaseURL(*validated_params))) { + // Allow bypass if the process isn't locked. Otherwise run normal checks. + bypass_checks_for_webview = ChildProcessSecurityPolicyImpl::GetInstance() + ->GetOriginLock(process->GetID()) + .is_empty(); + } + + if (!bypass_checks_for_error_page && !bypass_checks_for_file_scheme && + !bypass_checks_for_webview) { // Attempts to commit certain off-limits URL should be caught more strictly // than our FilterURL checks. If a renderer violates this policy, it // should be killed. @@ -6799,6 +6837,12 @@ // The origin and URL are safe to commit. break; case CanCommitStatus::CANNOT_COMMIT_URL: + DLOG(ERROR) << "CANNOT_COMMIT_URL url '" << validated_params->url << "'" + << " origin '" << validated_params->origin << "'" + << " lock '" + << ChildProcessSecurityPolicyImpl::GetInstance() + ->GetOriginLock(process->GetID()) + << "'"; VLOG(1) << "Blocked URL " << validated_params->url.spec(); LogCannotCommitUrlCrashKeys(validated_params->url, is_same_document_navigation, @@ -6809,6 +6853,13 @@ process, bad_message::RFH_CAN_COMMIT_URL_BLOCKED); return false; case CanCommitStatus::CANNOT_COMMIT_ORIGIN: + DLOG(ERROR) << "CANNOT_COMMIT_ORIGIN url '" << validated_params->url + << "'" + << " origin '" << validated_params->origin << "'" + << " lock '" + << ChildProcessSecurityPolicyImpl::GetInstance() + ->GetOriginLock(process->GetID()) + << "'"; DEBUG_ALIAS_FOR_ORIGIN(origin_debug_alias, validated_params->origin); LogCannotCommitOriginCrashKeys(is_same_document_navigation, navigation_request);
diff --git a/content/browser/manifest/manifest_browsertest.cc b/content/browser/manifest/manifest_browsertest.cc index 20d2698..969930b 100644 --- a/content/browser/manifest/manifest_browsertest.cc +++ b/content/browser/manifest/manifest_browsertest.cc
@@ -577,7 +577,7 @@ std::unique_ptr<net::EmbeddedTestServer> custom_embedded_test_server( new net::EmbeddedTestServer()); custom_embedded_test_server->RegisterRequestHandler( - base::Bind(&CustomHandleRequestForCookies)); + base::BindRepeating(&CustomHandleRequestForCookies)); ASSERT_TRUE(custom_embedded_test_server->Start()); @@ -637,7 +637,7 @@ std::unique_ptr<net::EmbeddedTestServer> custom_embedded_test_server( new net::EmbeddedTestServer()); custom_embedded_test_server->RegisterRequestHandler( - base::Bind(&CustomHandleRequestForNoCookies)); + base::BindRepeating(&CustomHandleRequestForNoCookies)); ASSERT_TRUE(custom_embedded_test_server->Start());
diff --git a/content/browser/media/media_web_contents_observer.cc b/content/browser/media/media_web_contents_observer.cc index 6f253c59..a4b94b2 100644 --- a/content/browser/media/media_web_contents_observer.cc +++ b/content/browser/media/media_web_contents_observer.cc
@@ -220,6 +220,9 @@ if (is_remote) return; + BackForwardCache::DisableForRenderFrameHost( + render_frame_host, "MediaWebContentsObserver::OnMediaPlaying"); + const MediaPlayerId id(render_frame_host, delegate_id); if (has_audio) AddMediaPlayerEntry(id, &active_audio_players_);
diff --git a/content/browser/scheduler/browser_io_thread_delegate.cc b/content/browser/scheduler/browser_io_thread_delegate.cc index 8959a524..f0e5516 100644 --- a/content/browser/scheduler/browser_io_thread_delegate.cc +++ b/content/browser/scheduler/browser_io_thread_delegate.cc
@@ -9,6 +9,7 @@ #include "base/task/sequence_manager/sequence_manager.h" #include "base/task/sequence_manager/task_queue.h" #include "base/task/task_executor.h" +#include "base/task/task_observer.h" #include "content/browser/scheduler/browser_task_executor.h" #include "content/public/browser/browser_thread.h" @@ -18,40 +19,82 @@ using ::base::sequence_manager::SequenceManager; using ::base::sequence_manager::TaskQueue; -BrowserIOThreadDelegate::BrowserIOThreadDelegate( - BrowserTaskExecutorPresent browser_task_executor_present) - : sequence_manager_(CreateUnboundSequenceManager( +class BrowserIOThreadDelegate::TLSMultiplexer : public base::TaskObserver { + public: + TLSMultiplexer() = default; + ~TLSMultiplexer() override = default; + + void SetIOTaskExecutor(base::TaskExecutor* io_task_executor) { + io_task_executor_ = io_task_executor; + } + + void WillProcessTask(const base::PendingTask& pending_task) override { + base::TaskExecutor* previous_executor = + base::GetTaskExecutorForCurrentThread(); + if (previous_executor) { + previous_executors_.push_back(previous_executor); + base::SetTaskExecutorForCurrentThread(nullptr); + } + base::SetTaskExecutorForCurrentThread(io_task_executor_); + } + + void DidProcessTask(const base::PendingTask& pending_task) override { + base::SetTaskExecutorForCurrentThread(nullptr); + if (!previous_executors_.empty()) { + base::SetTaskExecutorForCurrentThread(previous_executors_.back()); + previous_executors_.pop_back(); + } + } + + base::TaskExecutor* io_task_executor_ = nullptr; + std::vector<base::TaskExecutor*> previous_executors_; +}; + +BrowserIOThreadDelegate::BrowserIOThreadDelegate() + : owned_sequence_manager_(CreateUnboundSequenceManager( SequenceManager::Settings::Builder() .SetMessagePumpType(base::MessagePumpType::IO) .Build())), - browser_task_executor_present_(browser_task_executor_present) { - Init(sequence_manager_.get()); + sequence_manager_(owned_sequence_manager_.get()) { + Init(); } BrowserIOThreadDelegate::BrowserIOThreadDelegate( SequenceManager* sequence_manager) - : sequence_manager_(nullptr), - browser_task_executor_present_(BrowserTaskExecutorPresent::kYes) { - Init(sequence_manager); + : sequence_manager_(sequence_manager), + tls_multiplexer_(std::make_unique<TLSMultiplexer>()) { + sequence_manager_->AddTaskObserver(tls_multiplexer_.get()); + Init(); } -void BrowserIOThreadDelegate::Init( - base::sequence_manager::SequenceManager* sequence_manager) { +void BrowserIOThreadDelegate::Init() { task_queues_ = std::make_unique<BrowserTaskQueues>( - BrowserThread::IO, sequence_manager, - sequence_manager->GetRealTimeDomain()); + BrowserThread::IO, sequence_manager_, + sequence_manager_->GetRealTimeDomain()); default_task_runner_ = task_queues_->GetHandle()->GetDefaultTaskRunner(); } +void BrowserIOThreadDelegate::SetTaskExecutor( + base::TaskExecutor* task_executor) { + if (tls_multiplexer_) { + tls_multiplexer_->SetIOTaskExecutor(task_executor); + } else { + task_executor_ = task_executor; + } +} + scoped_refptr<base::SingleThreadTaskRunner> BrowserIOThreadDelegate::GetDefaultTaskRunner() { return default_task_runner_; } BrowserIOThreadDelegate::~BrowserIOThreadDelegate() { - if (browser_task_executor_present_ == BrowserTaskExecutorPresent::kYes) { + if (task_executor_) { base::SetTaskExecutorForCurrentThread(nullptr); } + if (tls_multiplexer_) { + sequence_manager_->RemoveTaskObserver(tls_multiplexer_.get()); + } } void BrowserIOThreadDelegate::BindToCurrentThread( @@ -62,8 +105,8 @@ sequence_manager_->SetTimerSlack(timer_slack); sequence_manager_->SetDefaultTaskRunner(GetDefaultTaskRunner()); - if (browser_task_executor_present_ == BrowserTaskExecutorPresent::kYes) { - base::SetTaskExecutorForCurrentThread(BrowserTaskExecutor::Get()); + if (task_executor_) { + base::SetTaskExecutorForCurrentThread(task_executor_); } }
diff --git a/content/browser/scheduler/browser_io_thread_delegate.h b/content/browser/scheduler/browser_io_thread_delegate.h index 703e7c5..0954c5e 100644 --- a/content/browser/scheduler/browser_io_thread_delegate.h +++ b/content/browser/scheduler/browser_io_thread_delegate.h
@@ -14,6 +14,7 @@ namespace base { class SingleThreadTaskRunner; +class TaskExecutor; namespace sequence_manager { class SequenceManager; @@ -28,21 +29,18 @@ public: using Handle = BrowserTaskQueues::Handle; - // Normally, creating a BrowserIOThreadDelegate relies on a - // BrowserTaskExecutor already existing to register it as the executor for the - // current (IO) thread. However, some tests create it in isolation, so we need - // to disable registering the executor to pass checks. - enum class BrowserTaskExecutorPresent { kYes, kNoForTesting }; + // Creates a BrowserIOThreadDelegate for use with a real IO thread. + BrowserIOThreadDelegate(); + ~BrowserIOThreadDelegate() override; static std::unique_ptr<BrowserIOThreadDelegate> CreateForTesting( base::sequence_manager::SequenceManager* sequence_manager) { + DCHECK(sequence_manager); return base::WrapUnique(new BrowserIOThreadDelegate(sequence_manager)); } - explicit BrowserIOThreadDelegate( - BrowserTaskExecutorPresent browser_task_executor_present = - BrowserTaskExecutorPresent::kYes); - ~BrowserIOThreadDelegate() override; + // If called this must be done prior to calling BindToCurrentThread. + void SetTaskExecutor(base::TaskExecutor* task_executor); scoped_refptr<base::SingleThreadTaskRunner> GetDefaultTaskRunner() override; void BindToCurrentThread(base::TimerSlack timer_slack) override; @@ -55,29 +53,37 @@ // tests. void SetAllowBlockingForTesting() { allow_blocking_for_testing_ = true; } - bool browser_task_executor_present() const { - return browser_task_executor_present_ == BrowserTaskExecutorPresent::kYes; - } - - scoped_refptr<Handle> CreateHandle() { return task_queues_->GetHandle(); } + scoped_refptr<Handle> GetHandle() { return task_queues_->GetHandle(); } private: + class TLSMultiplexer; + + // Creates a sequence funneled BrowserIOThreadDelegate for use in testing. + // Installs TLSMultiplexer which allows ensures the right results for + // base::CurrentThread when running an "IO Thread" task. explicit BrowserIOThreadDelegate( base::sequence_manager::SequenceManager* sequence_manager); // Performs the actual initialization of all the members that require a - // SequenceManager. Just a convenience method to avoid code duplication as in - // testing |sequence_manager_| will be null; - void Init(base::sequence_manager::SequenceManager* sequence_manager); + // SequenceManager. + void Init(); bool allow_blocking_for_testing_ = false; // Owned SequenceManager, null if instance created via CreateForTesting. - std::unique_ptr<base::sequence_manager::SequenceManager> sequence_manager_; + const std::unique_ptr<base::sequence_manager::SequenceManager> + owned_sequence_manager_; + + base::sequence_manager::SequenceManager* const sequence_manager_; std::unique_ptr<BrowserTaskQueues> task_queues_; scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; - const BrowserTaskExecutorPresent browser_task_executor_present_; + // In unit tests the IO "thread" can be sequence funneled onto the main thread + // so we need to multiplex the TLS binding to ensure base::CurrentThread + // behaves as expected. + std::unique_ptr<TLSMultiplexer> tls_multiplexer_; + + base::TaskExecutor* task_executor_ = nullptr; }; } // namespace content
diff --git a/content/browser/scheduler/browser_io_thread_delegate_unittest.cc b/content/browser/scheduler/browser_io_thread_delegate_unittest.cc index f7378f0..ed39160 100644 --- a/content/browser/scheduler/browser_io_thread_delegate_unittest.cc +++ b/content/browser/scheduler/browser_io_thread_delegate_unittest.cc
@@ -20,9 +20,8 @@ TEST(BrowserIOThreadDelegateTest, CanPostTasksToThread) { base::Thread thread("my_thread"); - auto delegate = std::make_unique<BrowserIOThreadDelegate>( - BrowserIOThreadDelegate::BrowserTaskExecutorPresent::kNoForTesting); - auto handle = delegate->CreateHandle(); + auto delegate = std::make_unique<BrowserIOThreadDelegate>(); + auto handle = delegate->GetHandle(); handle->EnableAllQueues(); base::Thread::Options options; @@ -41,8 +40,7 @@ TEST(BrowserIOThreadDelegateTest, DefaultTaskRunnerIsAlwaysActive) { base::Thread thread("my_thread"); - auto delegate = std::make_unique<BrowserIOThreadDelegate>( - BrowserIOThreadDelegate::BrowserTaskExecutorPresent::kNoForTesting); + auto delegate = std::make_unique<BrowserIOThreadDelegate>(); auto task_runner = delegate->GetDefaultTaskRunner(); base::Thread::Options options;
diff --git a/content/browser/scheduler/browser_task_executor.cc b/content/browser/scheduler/browser_task_executor.cc index 37ba248..4f786a1 100644 --- a/content/browser/scheduler/browser_task_executor.cc +++ b/content/browser/scheduler/browser_task_executor.cc
@@ -66,23 +66,121 @@ } // namespace +BaseBrowserTaskExecutor::BaseBrowserTaskExecutor() = default; + +BaseBrowserTaskExecutor::~BaseBrowserTaskExecutor() = default; + +bool BaseBrowserTaskExecutor::PostDelayedTask(const base::Location& from_here, + const base::TaskTraits& traits, + base::OnceClosure task, + base::TimeDelta delay) { + if (traits.extension_id() != BrowserTaskTraitsExtension::kExtensionId || + traits.GetExtension<BrowserTaskTraitsExtension>().nestable()) { + return GetTaskRunner(traits)->PostDelayedTask(from_here, std::move(task), + delay); + } else { + return GetTaskRunner(traits)->PostNonNestableDelayedTask( + from_here, std::move(task), delay); + } +} + +scoped_refptr<base::TaskRunner> BaseBrowserTaskExecutor::CreateTaskRunner( + const base::TaskTraits& traits) { + return GetTaskRunner(traits); +} + +scoped_refptr<base::SequencedTaskRunner> +BaseBrowserTaskExecutor::CreateSequencedTaskRunner( + const base::TaskTraits& traits) { + return GetTaskRunner(traits); +} + +scoped_refptr<base::SingleThreadTaskRunner> +BaseBrowserTaskExecutor::CreateSingleThreadTaskRunner( + const base::TaskTraits& traits, + base::SingleThreadTaskRunnerThreadMode thread_mode) { + return GetTaskRunner(traits); +} + +#if defined(OS_WIN) +scoped_refptr<base::SingleThreadTaskRunner> +BaseBrowserTaskExecutor::CreateCOMSTATaskRunner( + const base::TaskTraits& traits, + base::SingleThreadTaskRunnerThreadMode thread_mode) { + return GetTaskRunner(traits); +} +#endif // defined(OS_WIN) + +scoped_refptr<base::SingleThreadTaskRunner> +BaseBrowserTaskExecutor::GetTaskRunner(const base::TaskTraits& traits) const { + auto id_and_queue = GetThreadIdAndQueueType(traits); + + switch (id_and_queue.thread_id) { + case BrowserThread::UI: { + return browser_ui_thread_handle_->GetBrowserTaskRunner( + id_and_queue.queue_type); + } + case BrowserThread::IO: + return browser_io_thread_handle_->GetBrowserTaskRunner( + id_and_queue.queue_type); + case BrowserThread::ID_COUNT: + NOTREACHED(); + } + return nullptr; +} + +BaseBrowserTaskExecutor::ThreadIdAndQueueType +BaseBrowserTaskExecutor::GetThreadIdAndQueueType( + const base::TaskTraits& traits) const { + BrowserTaskType task_type; + BrowserThread::ID thread_id; + + if (traits.use_current_thread()) { + thread_id = GetCurrentThreadID(); + + // BrowserTaskTraitsExtension is optional if use_current_thread() is true. + if (traits.extension_id() == BrowserTaskTraitsExtension::kExtensionId) { + task_type = traits.GetExtension<BrowserTaskTraitsExtension>().task_type(); + } else { + task_type = BrowserTaskType::kDefault; + } + } else { + // Otherwise BrowserTaskTraitsExtension is mandatory. + DCHECK_EQ(BrowserTaskTraitsExtension::kExtensionId, traits.extension_id()); + BrowserTaskTraitsExtension extension = + traits.GetExtension<BrowserTaskTraitsExtension>(); + + thread_id = extension.browser_thread(); + DCHECK_GE(thread_id, 0); + + task_type = extension.task_type(); + DCHECK_LT(task_type, BrowserTaskType::kBrowserTaskType_Last); + } + + return {thread_id, GetQueueType(traits, task_type)}; +} + BrowserTaskExecutor::BrowserTaskExecutor( std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler, std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate) - : browser_ui_thread_scheduler_(std::move(browser_ui_thread_scheduler)), - browser_ui_thread_handle_(browser_ui_thread_scheduler_->GetHandle()), - browser_io_thread_delegate_(std::move(browser_io_thread_delegate)), - browser_io_thread_handle_(browser_io_thread_delegate_->CreateHandle()) {} - -BrowserTaskExecutor::~BrowserTaskExecutor() { - base::SetTaskExecutorForCurrentThread(nullptr); + : ui_thread_executor_(std::make_unique<UIThreadExecutor>( + std::move(browser_ui_thread_scheduler))), + io_thread_executor_(std::make_unique<IOThreadExecutor>( + std::move(browser_io_thread_delegate))) { + browser_ui_thread_handle_ = ui_thread_executor_->GetUIThreadHandle(); + browser_io_thread_handle_ = io_thread_executor_->GetIOThreadHandle(); + ui_thread_executor_->SetIOThreadHandle(browser_io_thread_handle_); + io_thread_executor_->SetUIThreadHandle(browser_ui_thread_handle_); } +BrowserTaskExecutor::~BrowserTaskExecutor() = default; + // static void BrowserTaskExecutor::Create() { DCHECK(!base::ThreadTaskRunnerHandle::IsSet()); CreateInternal(std::make_unique<BrowserUIThreadScheduler>(), std::make_unique<BrowserIOThreadDelegate>()); + g_browser_task_executor->ui_thread_executor_->BindToCurrentThread(); } // static @@ -94,6 +192,11 @@ } // static +void BrowserTaskExecutor::BindToUIThreadForTesting() { + g_browser_task_executor->ui_thread_executor_->BindToCurrentThread(); +} + +// static void BrowserTaskExecutor::CreateInternal( std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler, std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate) { @@ -103,13 +206,10 @@ std::move(browser_io_thread_delegate)); base::RegisterTaskExecutor(BrowserTaskTraitsExtension::kExtensionId, g_browser_task_executor); + g_browser_task_executor->browser_ui_thread_handle_ ->EnableAllExceptBestEffortQueues(); - // Here we register the BrowserTaskExecutor for the UI thread; registration - // for the IO thread happens in BrowserIOThreadDelegate::BindToCurrentThread. - base::SetTaskExecutorForCurrentThread(g_browser_task_executor); - #if defined(OS_ANDROID) base::PostTaskAndroid::SignalNativeSchedulerReady(); #endif @@ -134,14 +234,13 @@ delete g_browser_task_executor; g_browser_task_executor = nullptr; } - base::SetTaskExecutorForCurrentThread(nullptr); } // static void BrowserTaskExecutor::PostFeatureListSetup() { DCHECK(g_browser_task_executor); - DCHECK(g_browser_task_executor->browser_ui_thread_scheduler_); - DCHECK(g_browser_task_executor->browser_io_thread_delegate_); + DCHECK(g_browser_task_executor->ui_thread_executor_); + DCHECK(g_browser_task_executor->io_thread_executor_); g_browser_task_executor->browser_ui_thread_handle_ ->PostFeatureListInitializationSetup(); g_browser_task_executor->browser_io_thread_handle_ @@ -153,7 +252,8 @@ if (!g_browser_task_executor) return; - DCHECK(g_browser_task_executor->browser_ui_thread_scheduler_); + DCHECK(g_browser_task_executor->ui_thread_executor_); + DCHECK(g_browser_task_executor->io_thread_executor_); // We don't delete |g_browser_task_executor| because other threads may // PostTask or call BrowserTaskExecutor::GetTaskRunner while we're tearing // things down. We don't want to add locks so we just leak instead of dealing @@ -161,8 +261,8 @@ // PostTaskAndroid::SignalNativeSchedulerShutdown on Android. In tests however // we need to clean up, so BrowserTaskExecutor::ResetForTesting should be // called. - g_browser_task_executor->browser_ui_thread_scheduler_.reset(); - g_browser_task_executor->browser_io_thread_delegate_.reset(); + g_browser_task_executor->ui_thread_executor_.reset(); + g_browser_task_executor->io_thread_executor_.reset(); } // static @@ -179,9 +279,9 @@ break; case BrowserThread::IO: { // In tests there may not be a functional IO thread. - if (!g_browser_task_executor->browser_io_thread_delegate_ || - !g_browser_task_executor->browser_io_thread_delegate_ - ->browser_task_executor_present()) { + if (!g_browser_task_executor->io_thread_executor_ || + !g_browser_task_executor->io_thread_executor_ + ->HasDelegateForTesting()) { return; } g_browser_task_executor->browser_io_thread_handle_ @@ -195,82 +295,6 @@ run_loop.Run(); } -bool BrowserTaskExecutor::PostDelayedTask(const base::Location& from_here, - const base::TaskTraits& traits, - base::OnceClosure task, - base::TimeDelta delay) { - DCHECK_EQ(BrowserTaskTraitsExtension::kExtensionId, traits.extension_id()); - const BrowserTaskTraitsExtension& extension = - traits.GetExtension<BrowserTaskTraitsExtension>(); - if (extension.nestable()) { - return GetTaskRunner(traits)->PostDelayedTask(from_here, std::move(task), - delay); - } else { - return GetTaskRunner(traits)->PostNonNestableDelayedTask( - from_here, std::move(task), delay); - } -} - -scoped_refptr<base::TaskRunner> BrowserTaskExecutor::CreateTaskRunner( - const base::TaskTraits& traits) { - return GetTaskRunner(traits); -} - -scoped_refptr<base::SequencedTaskRunner> -BrowserTaskExecutor::CreateSequencedTaskRunner(const base::TaskTraits& traits) { - return GetTaskRunner(traits); -} - -scoped_refptr<base::SingleThreadTaskRunner> -BrowserTaskExecutor::CreateSingleThreadTaskRunner( - const base::TaskTraits& traits, - base::SingleThreadTaskRunnerThreadMode thread_mode) { - return GetTaskRunner(traits); -} - -#if defined(OS_WIN) -scoped_refptr<base::SingleThreadTaskRunner> -BrowserTaskExecutor::CreateCOMSTATaskRunner( - const base::TaskTraits& traits, - base::SingleThreadTaskRunnerThreadMode thread_mode) { - return GetTaskRunner(traits); -} -#endif // defined(OS_WIN) - -scoped_refptr<base::SingleThreadTaskRunner> BrowserTaskExecutor::GetTaskRunner( - const base::TaskTraits& traits) const { - auto id_and_queue = GetThreadIdAndQueueType(traits); - - switch (id_and_queue.thread_id) { - case BrowserThread::UI: { - return browser_ui_thread_handle_->GetBrowserTaskRunner( - id_and_queue.queue_type); - } - case BrowserThread::IO: - return browser_io_thread_handle_->GetBrowserTaskRunner( - id_and_queue.queue_type); - case BrowserThread::ID_COUNT: - NOTREACHED(); - } - return nullptr; -} - -// static -BrowserTaskExecutor::ThreadIdAndQueueType -BrowserTaskExecutor::GetThreadIdAndQueueType(const base::TaskTraits& traits) { - DCHECK_EQ(BrowserTaskTraitsExtension::kExtensionId, traits.extension_id()); - BrowserTaskTraitsExtension extension = - traits.GetExtension<BrowserTaskTraitsExtension>(); - - BrowserThread::ID thread_id = extension.browser_thread(); - DCHECK_GE(thread_id, 0); - - BrowserTaskType task_type = extension.task_type(); - DCHECK_LT(task_type, BrowserTaskType::kBrowserTaskType_Last); - - return {thread_id, GetQueueType(traits, task_type)}; -} - // static void BrowserTaskExecutor::EnableAllQueues() { DCHECK(g_browser_task_executor); @@ -287,20 +311,23 @@ std::unique_ptr<BrowserProcessSubThread> BrowserTaskExecutor::CreateIOThread() { DCHECK(g_browser_task_executor); - DCHECK(g_browser_task_executor->browser_io_thread_delegate_); + DCHECK(g_browser_task_executor->io_thread_executor_); + + std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate = + g_browser_task_executor->io_thread_executor_->TakeDelegate(); + + DCHECK(browser_io_thread_delegate); TRACE_EVENT0("startup", "BrowserTaskExecutor::CreateIOThread"); auto io_thread = std::make_unique<BrowserProcessSubThread>(BrowserThread::IO); - if (g_browser_task_executor->browser_io_thread_delegate_ - ->allow_blocking_for_testing()) { + if (browser_io_thread_delegate->allow_blocking_for_testing()) { io_thread->AllowBlockingForTesting(); } base::Thread::Options options; options.message_pump_type = base::MessagePumpType::IO; - options.delegate = - g_browser_task_executor->browser_io_thread_delegate_.release(); + options.delegate = browser_io_thread_delegate.release(); // Up the priority of the |io_thread_| as some of its IPCs relate to // display tasks. if (base::FeatureList::IsEnabled(features::kBrowserUseDisplayThreadPriority)) @@ -364,4 +391,68 @@ #endif +BrowserThread::ID BrowserTaskExecutor::GetCurrentThreadID() const { + NOTREACHED() + << "Should have been routed to UIThreadExecutor or IOThreadExecutor"; + return BrowserThread::UI; +} + +BrowserTaskExecutor::UIThreadExecutor::UIThreadExecutor( + std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler) + : browser_ui_thread_scheduler_(std::move(browser_ui_thread_scheduler)) { + browser_ui_thread_handle_ = browser_ui_thread_scheduler_->GetHandle(); +} + +BrowserTaskExecutor::UIThreadExecutor::~UIThreadExecutor() { + if (bound_to_thread_) + base::SetTaskExecutorForCurrentThread(nullptr); +} + +void BrowserTaskExecutor::UIThreadExecutor::BindToCurrentThread() { + bound_to_thread_ = true; + base::SetTaskExecutorForCurrentThread(this); +} + +scoped_refptr<BrowserUIThreadScheduler::Handle> +BrowserTaskExecutor::UIThreadExecutor::GetUIThreadHandle() { + return browser_ui_thread_handle_; +} + +void BrowserTaskExecutor::UIThreadExecutor::SetIOThreadHandle( + scoped_refptr<BrowserUIThreadScheduler::Handle> io_thread_handle) { + browser_io_thread_handle_ = std::move(io_thread_handle); +} + +BrowserThread::ID BrowserTaskExecutor::UIThreadExecutor::GetCurrentThreadID() + const { + return BrowserThread::UI; +} + +BrowserTaskExecutor::IOThreadExecutor::IOThreadExecutor( + std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate) + : browser_io_thread_delegate_(std::move(browser_io_thread_delegate)) { + // |browser_io_thread_delegate_| can be null in tests. + if (!browser_io_thread_delegate_) + return; + browser_io_thread_delegate_->SetTaskExecutor(this); + browser_io_thread_handle_ = browser_io_thread_delegate_->GetHandle(); +} + +BrowserTaskExecutor::IOThreadExecutor::~IOThreadExecutor() = default; + +scoped_refptr<BrowserUIThreadScheduler::Handle> +BrowserTaskExecutor::IOThreadExecutor::GetIOThreadHandle() { + return browser_io_thread_handle_; +} + +void BrowserTaskExecutor::IOThreadExecutor::SetUIThreadHandle( + scoped_refptr<BrowserUIThreadScheduler::Handle> ui_thread_handle) { + browser_ui_thread_handle_ = std::move(ui_thread_handle); +} + +BrowserThread::ID BrowserTaskExecutor::IOThreadExecutor::GetCurrentThreadID() + const { + return BrowserThread::IO; +} + } // namespace content
diff --git a/content/browser/scheduler/browser_task_executor.h b/content/browser/scheduler/browser_task_executor.h index 720d6d7..8754d97d 100644 --- a/content/browser/scheduler/browser_task_executor.h +++ b/content/browser/scheduler/browser_task_executor.h
@@ -17,14 +17,66 @@ #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" +// The BrowserTaskExecutor's job is to map base::TaskTraits to actual task +// queues for the browser process. +// +// We actually have three TaskExecutors: +// * BrowserTaskExecutor registered for BrowserTaskTraitsExtension. +// * BrowserTaskExecutor::UIThreadExecutor registered with UI thread TLS. +// * BrowserTaskExecutor::IOThreadExecutor registered with IO thread TLS. +// +// This lets us efficiently implement base::CurrentThread on UI and IO threads. namespace content { class BrowserTaskExecutorTest; class BrowserProcessSubThread; -// This class's job is to map base::TaskTraits to actual task queues for the -// browser process. -class CONTENT_EXPORT BrowserTaskExecutor : public base::TaskExecutor { +class CONTENT_EXPORT BaseBrowserTaskExecutor : public base::TaskExecutor { + public: + BaseBrowserTaskExecutor(); + ~BaseBrowserTaskExecutor() override; + + // base::TaskExecutor implementation. + bool PostDelayedTask(const base::Location& from_here, + const base::TaskTraits& traits, + base::OnceClosure task, + base::TimeDelta delay) override; + + scoped_refptr<base::TaskRunner> CreateTaskRunner( + const base::TaskTraits& traits) override; + + scoped_refptr<base::SequencedTaskRunner> CreateSequencedTaskRunner( + const base::TaskTraits& traits) override; + + scoped_refptr<base::SingleThreadTaskRunner> CreateSingleThreadTaskRunner( + const base::TaskTraits& traits, + base::SingleThreadTaskRunnerThreadMode thread_mode) override; + +#if defined(OS_WIN) + scoped_refptr<base::SingleThreadTaskRunner> CreateCOMSTATaskRunner( + const base::TaskTraits& traits, + base::SingleThreadTaskRunnerThreadMode thread_mode) override; +#endif // defined(OS_WIN) + + struct ThreadIdAndQueueType { + BrowserThread::ID thread_id; + BrowserTaskQueues::QueueType queue_type; + }; + + ThreadIdAndQueueType GetThreadIdAndQueueType( + const base::TaskTraits& traits) const; + + protected: + virtual BrowserThread::ID GetCurrentThreadID() const = 0; + + scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner( + const base::TaskTraits& traits) const; + + scoped_refptr<BrowserUIThreadScheduler::Handle> browser_ui_thread_handle_; + scoped_refptr<BrowserIOThreadDelegate::Handle> browser_io_thread_handle_; +}; + +class CONTENT_EXPORT BrowserTaskExecutor : public BaseBrowserTaskExecutor { public: // Creates and registers a BrowserTaskExecutor on the current thread which // owns a BrowserUIThreadScheduler. This facilitates posting tasks to a @@ -74,11 +126,15 @@ // Can be called multiple times. static void EnableAllQueues(); - // As Create but with the user provided objects. + // As Create but with the user provided objects. Must call + // BindToUIThreadForTesting before tasks can be run on the UI thread. static void CreateForTesting( std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler, std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate); + // Completes ui-thread set up. Must be called on the UI thread. + static void BindToUIThreadForTesting(); + // This must be called after the FeatureList has been initialized in order // for scheduling experiments to function. static void PostFeatureListSetup(); @@ -104,36 +160,6 @@ static void RunAllPendingTasksOnThreadForTesting( BrowserThread::ID identifier); - struct ThreadIdAndQueueType { - BrowserThread::ID thread_id; - BrowserTaskQueues::QueueType queue_type; - }; - - static ThreadIdAndQueueType GetThreadIdAndQueueType( - const base::TaskTraits& traits); - - // base::TaskExecutor implementation. - bool PostDelayedTask(const base::Location& from_here, - const base::TaskTraits& traits, - base::OnceClosure task, - base::TimeDelta delay) override; - - scoped_refptr<base::TaskRunner> CreateTaskRunner( - const base::TaskTraits& traits) override; - - scoped_refptr<base::SequencedTaskRunner> CreateSequencedTaskRunner( - const base::TaskTraits& traits) override; - - scoped_refptr<base::SingleThreadTaskRunner> CreateSingleThreadTaskRunner( - const base::TaskTraits& traits, - base::SingleThreadTaskRunnerThreadMode thread_mode) override; - -#if defined(OS_WIN) - scoped_refptr<base::SingleThreadTaskRunner> CreateCOMSTATaskRunner( - const base::TaskTraits& traits, - base::SingleThreadTaskRunnerThreadMode thread_mode) override; -#endif // defined(OS_WIN) - #if DCHECK_IS_ON() // Adds a Validator for |traits|. It is assumed the lifetime of |validator| is // is longer than that of the BrowserTaskExecutor unless RemoveValidator @@ -151,6 +177,55 @@ friend class BrowserIOThreadDelegate; friend class BrowserTaskExecutorTest; + // Constructed on UI thread and registered with UI thread TLS. This backs the + // implementation of base::CurrentThread for the browser UI thread. + class UIThreadExecutor : public BaseBrowserTaskExecutor { + public: + explicit UIThreadExecutor( + std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler); + + ~UIThreadExecutor() override; + + scoped_refptr<BrowserUIThreadScheduler::Handle> GetUIThreadHandle(); + + void SetIOThreadHandle( + scoped_refptr<BrowserUIThreadScheduler::Handle> io_thread_handle); + + void BindToCurrentThread(); + + private: + BrowserThread::ID GetCurrentThreadID() const override; + + std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler_; + bool bound_to_thread_ = false; + }; + + // Constructed on UI thread and later registered with IO thread TLS. This + // backs the implementation of base::CurrentThread for the browser IO thread. + class IOThreadExecutor : public BaseBrowserTaskExecutor { + public: + explicit IOThreadExecutor( + std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate); + + ~IOThreadExecutor() override; + + scoped_refptr<BrowserUIThreadScheduler::Handle> GetIOThreadHandle(); + + void SetUIThreadHandle( + scoped_refptr<BrowserUIThreadScheduler::Handle> ui_thread_handle); + + std::unique_ptr<BrowserIOThreadDelegate> TakeDelegate() { + return std::move(browser_io_thread_delegate_); + } + + bool HasDelegateForTesting() const { return !!browser_io_thread_delegate_; } + + private: + BrowserThread::ID GetCurrentThreadID() const override; + + std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate_; + }; + static void CreateInternal( std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler, std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate); @@ -166,22 +241,17 @@ // For Get(); FRIEND_TEST_ALL_PREFIXES(BrowserTaskExecutorTest, RegisterExecutorForBothThreads); - explicit BrowserTaskExecutor( std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler, std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate); ~BrowserTaskExecutor() override; - scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner( - const base::TaskTraits& traits) const; + BrowserThread::ID GetCurrentThreadID() const override; static BrowserTaskExecutor* Get(); - std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler_; - scoped_refptr<BrowserUIThreadScheduler::Handle> browser_ui_thread_handle_; - - std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate_; - scoped_refptr<BrowserIOThreadDelegate::Handle> browser_io_thread_handle_; + std::unique_ptr<UIThreadExecutor> ui_thread_executor_; + std::unique_ptr<IOThreadExecutor> io_thread_executor_; DISALLOW_COPY_AND_ASSIGN(BrowserTaskExecutor); };
diff --git a/content/browser/scheduler/browser_task_executor_unittest.cc b/content/browser/scheduler/browser_task_executor_unittest.cc index 7d3701b..9ef50ad 100644 --- a/content/browser/scheduler/browser_task_executor_unittest.cc +++ b/content/browser/scheduler/browser_task_executor_unittest.cc
@@ -33,6 +33,7 @@ using ::testing::ElementsAre; using ::testing::Invoke; using ::testing::Mock; +using ::testing::NotNull; using ::testing::SizeIs; using QueueType = BrowserTaskQueues::QueueType; @@ -49,13 +50,13 @@ TEST_F(BrowserTaskExecutorTest, RegisterExecutorForBothThreads) { base::PostTask(FROM_HERE, {BrowserThread::UI}, base::BindOnce([]() { - EXPECT_EQ(BrowserTaskExecutor::Get(), - base::GetTaskExecutorForCurrentThread()); + EXPECT_THAT(base::GetTaskExecutorForCurrentThread(), + NotNull()); })); base::PostTask(FROM_HERE, {BrowserThread::IO}, base::BindOnce([]() { - EXPECT_EQ(BrowserTaskExecutor::Get(), - base::GetTaskExecutorForCurrentThread()); + EXPECT_THAT(base::GetTaskExecutorForCurrentThread(), + NotNull()); })); BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(BrowserThread::UI); @@ -123,6 +124,16 @@ // Helper to perform the same tets for all BrowserThread::ID values. class BrowserTaskTraitsMappingTest : public BrowserTaskExecutorTest { protected: + class TestExecutor : public BaseBrowserTaskExecutor { + public: + ~TestExecutor() override = default; + + BrowserThread::ID GetCurrentThreadID() const override { + NOTREACHED(); + return BrowserThread::UI; + } + }; + template <BrowserThread::ID ID> void CheckExpectations() { EXPECT_EQ(GetQueueType({ID, TaskPriority::BEST_EFFORT}), @@ -146,8 +157,10 @@ private: QueueType GetQueueType(const base::TaskTraits& traits) { - return BrowserTaskExecutor::GetThreadIdAndQueueType(traits).queue_type; + return test_executor_.GetThreadIdAndQueueType(traits).queue_type; } + + TestExecutor test_executor_; }; TEST_F(BrowserTaskTraitsMappingTest, BrowserTaskTraitsMapToProperPriorities) { @@ -194,9 +207,8 @@ QueueType::kDefault)); BrowserTaskExecutor::CreateForTesting( std::move(browser_ui_thread_scheduler), - std::make_unique<BrowserIOThreadDelegate>( - BrowserIOThreadDelegate::BrowserTaskExecutorPresent:: - kNoForTesting)); + BrowserIOThreadDelegate::CreateForTesting(sequence_manager())); + BrowserTaskExecutor::BindToUIThreadForTesting(); } }; @@ -256,4 +268,46 @@ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(100)); } +TEST_F(BrowserTaskExecutorTest, CurrentThread) { + base::PostTask( + FROM_HERE, {BrowserThread::UI}, base::BindOnce([]() { + base::PostTask( + FROM_HERE, {base::CurrentThread()}, base::BindOnce([]() { + EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); + })); + })); + BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(BrowserThread::UI); + + base::PostTask( + FROM_HERE, {BrowserThread::IO}, base::BindOnce([]() { + base::PostTask( + FROM_HERE, {base::CurrentThread()}, base::BindOnce([]() { + EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); + })); + })); + + BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(BrowserThread::IO); +} + +TEST_F(BrowserTaskExecutorTest, CurrentThreadAndOtherTraits) { + EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); + + auto ui_task_runner = base::CreateSingleThreadTaskRunner({BrowserThread::UI}); + auto ui_best_effort_runner = base::CreateSingleThreadTaskRunner( + {BrowserThread::UI, base::TaskPriority::BEST_EFFORT}); + auto ui_best_navigation_runner = base::CreateSingleThreadTaskRunner( + {BrowserThread::UI, BrowserTaskType::kNavigation}); + + EXPECT_EQ(ui_task_runner, + base::CreateSingleThreadTaskRunner({base::CurrentThread()})); + + EXPECT_EQ(ui_best_effort_runner, + base::CreateSingleThreadTaskRunner( + {base::CurrentThread(), base::TaskPriority::BEST_EFFORT})); + + EXPECT_EQ(ui_best_navigation_runner, + base::CreateSingleThreadTaskRunner( + {base::CurrentThread(), BrowserTaskType::kNavigation})); +} + } // namespace content
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/scheduler/UiThreadSchedulerTest.java b/content/public/android/javatests/src/org/chromium/content/browser/scheduler/UiThreadSchedulerTest.java index 1e9a9f9..076fa93 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/scheduler/UiThreadSchedulerTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/scheduler/UiThreadSchedulerTest.java
@@ -20,6 +20,7 @@ import org.chromium.base.ThreadUtils; import org.chromium.base.task.PostTask; +import org.chromium.base.task.SingleThreadTaskRunner; import org.chromium.base.task.TaskRunner; import org.chromium.base.task.TaskTraits; import org.chromium.base.test.BaseJUnit4ClassRunner; @@ -159,6 +160,103 @@ @Test @MediumTest + public void testPostTaskCurrentThreadBeforeNativeLoaded() throws Exception { + // This should not timeout. + final Object lock = new Object(); + final AtomicBoolean taskExecuted = new AtomicBoolean(); + PostTask.postTask(UiThreadTaskTraits.DEFAULT, new Runnable() { + @Override + public void run() { + PostTask.postTask(TaskTraits.CURRENT_THREAD, new Runnable() { + @Override + public void run() { + synchronized (lock) { + taskExecuted.set(true); + lock.notify(); + } + } + }); + } + }); + + synchronized (lock) { + while (!taskExecuted.get()) { + lock.wait(); + } + } + } + + @Test + @MediumTest + public void testPostTaskCurrentThreadAfterNativeLoaded() throws Exception { + startContentMainOnUiThread(); + + // This should not timeout. + final Object lock = new Object(); + final AtomicBoolean taskExecuted = new AtomicBoolean(); + PostTask.postTask(UiThreadTaskTraits.DEFAULT, new Runnable() { + @Override + public void run() { + PostTask.postTask(TaskTraits.CURRENT_THREAD, new Runnable() { + @Override + public void run() { + synchronized (lock) { + taskExecuted.set(true); + lock.notify(); + } + } + }); + } + }); + + synchronized (lock) { + while (!taskExecuted.get()) { + lock.wait(); + } + } + } + + @Test + @MediumTest + public void testPostTaskCurrentThreadInThreadpoolAfterNativeLoaded() throws Exception { + startContentMainOnUiThread(); + SingleThreadTaskRunner threadpoolTaskRunner = + PostTask.createSingleThreadTaskRunner(TaskTraits.THREAD_POOL_USER_BLOCKING); + SingleThreadTaskRunner uiThreadTaskRunner = + PostTask.createSingleThreadTaskRunner(UiThreadTaskTraits.DEFAULT); + + // This should not timeout. + final Object lock = new Object(); + final AtomicBoolean taskExecuted = new AtomicBoolean(); + threadpoolTaskRunner.postTask(new Runnable() { + @Override + public void run() { + PostTask.postTask(TaskTraits.CURRENT_THREAD, new Runnable() { + @Override + public void run() { + synchronized (lock) { + Assert.assertTrue(threadpoolTaskRunner.belongsToCurrentThread()); + Assert.assertFalse(uiThreadTaskRunner.belongsToCurrentThread()); + taskExecuted.set(true); + lock.notify(); + } + } + }); + } + }); + + synchronized (lock) { + while (!taskExecuted.get()) { + lock.wait(); + } + } + + uiThreadTaskRunner.destroy(); + threadpoolTaskRunner.destroy(); + } + + @Test + @MediumTest public void testTaskNotRunOnUiThreadWithoutUiThreadTaskTraits() { TaskRunner uiThreadTaskRunner = PostTask.createSingleThreadTaskRunner(TaskTraits.USER_BLOCKING);
diff --git a/content/public/browser/browser_task_traits.h b/content/public/browser/browser_task_traits.h index fb283f77..9695496 100644 --- a/content/public/browser/browser_task_traits.h +++ b/content/public/browser/browser_task_traits.h
@@ -80,11 +80,21 @@ base::trait_helpers::AreValidTraits<ValidTrait, ArgTypes...>::value>> constexpr BrowserTaskTraitsExtension(ArgTypes... args) : browser_thread_( - base::trait_helpers::GetEnum<BrowserThread::ID>(args...)), + base::trait_helpers::GetEnum<BrowserThread::ID, BrowserThread::UI>( + args...)), task_type_( base::trait_helpers::GetEnum<BrowserTaskType, BrowserTaskType::kDefault>(args...)), - nestable_(!base::trait_helpers::HasTrait<NonNestable, ArgTypes...>()) {} + nestable_(!base::trait_helpers::HasTrait<NonNestable, ArgTypes...>()) { + constexpr bool has_current_thread = + base::trait_helpers::HasTrait<base::CurrentThread, ArgTypes...>(); + constexpr bool has_browser_thread = + base::trait_helpers::HasTrait<BrowserThread::ID, ArgTypes...>(); + static_assert( + has_current_thread != has_browser_thread, + "Either content::BrowserThread::ID or base::CurrentThread must be set, " + "but not both"); + } // Keep in sync with UiThreadTaskTraits.java constexpr base::TaskTraitsExtensionStorage Serialize() const { @@ -105,7 +115,9 @@ static_cast<bool>(extension.data[2])); } + // This must be ignored if base::CurrentThread is specified. constexpr BrowserThread::ID browser_thread() const { return browser_thread_; } + constexpr BrowserTaskType task_type() const { return task_type_; } // Returns true if tasks with these traits may run in a nested RunLoop.
diff --git a/content/public/browser/browser_task_traits_unittest.nc b/content/public/browser/browser_task_traits_unittest.nc index 8738feb..7f2aa05 100644 --- a/content/public/browser/browser_task_traits_unittest.nc +++ b/content/public/browser/browser_task_traits_unittest.nc
@@ -7,14 +7,17 @@ #include "base/task/task_traits.h" #include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" namespace content { -#if defined(NCTEST_BROWSER_TASK_TRAITS_NO_THREAD) // [r"The traits bag is missing a required trait."] -constexpr base::TaskTraits traits = {NonNestable()}; +#if defined(NCTEST_BROWSER_TASK_TRAITS_NO_THREAD) // [r"Either content::BrowserThread::ID or base::CurrentThread must be set, but not both"] +constexpr base::TaskTraits traits = {BrowserTaskType::kNavigation}; #elif defined(NCTEST_BROWSER_TASK_TRAITS_MULTIPLE_THREADS) // [r"The traits bag contains multiple traits of the same type."] constexpr base::TaskTraits traits = {BrowserThread::UI, BrowserThread::IO}; +#elif defined(NCTEST_BROWSER_TASK_TRAITS_BROWSER_THREAD_AND_CURRENT_THREAD) // [r"Either content::BrowserThread::ID or base::CurrentThread must be set, but not both"] +constexpr base::TaskTraits traits = {BrowserThread::UI, base::CurrentThread()}; #endif } // namespace content
diff --git a/content/public/test/browser_task_environment.cc b/content/public/test/browser_task_environment.cc index a7aee30a..b877abd 100644 --- a/content/public/test/browser_task_environment.cc +++ b/content/public/test/browser_task_environment.cc
@@ -99,6 +99,7 @@ BrowserTaskExecutor::CreateForTesting(std::move(browser_ui_thread_scheduler), std::move(browser_io_thread_delegate)); + BrowserTaskExecutor::BindToUIThreadForTesting(); DeferredInitFromSubclass(std::move(default_ui_task_runner)); if (HasIOMainLoop()) {
diff --git a/content/public/test/browser_task_environment_unittest.cc b/content/public/test/browser_task_environment_unittest.cc index ab7adf3..cca1c2c 100644 --- a/content/public/test/browser_task_environment_unittest.cc +++ b/content/public/test/browser_task_environment_unittest.cc
@@ -10,6 +10,7 @@ #include "base/message_loop/message_loop_current.h" #include "base/synchronization/waitable_event.h" #include "base/task/post_task.h" +#include "base/test/bind_test_util.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "testing/gmock/include/gmock/gmock.h" @@ -176,4 +177,50 @@ EXPECT_THAT(task_environment.GetMockClock(), testing::NotNull()); } +TEST(BrowserTaskEnvironmentTest, CurrentThread) { + BrowserTaskEnvironment task_environment; + base::RunLoop run_loop; + + base::PostTask(FROM_HERE, {base::CurrentThread()}, + base::BindLambdaForTesting([&]() { + base::PostTask(FROM_HERE, {base::CurrentThread()}, + run_loop.QuitClosure()); + })); + + run_loop.Run(); +} + +TEST(BrowserTaskEnvironmentTest, CurrentThreadIO) { + BrowserTaskEnvironment task_environment; + base::RunLoop run_loop; + + auto io_task_runner = base::CreateSingleThreadTaskRunner({BrowserThread::IO}); + + base::PostTask( + FROM_HERE, {BrowserThread::IO}, base::BindLambdaForTesting([&]() { + EXPECT_EQ(io_task_runner, + base::CreateSingleThreadTaskRunner({base::CurrentThread()})); + run_loop.Quit(); + })); + + run_loop.Run(); +} + +TEST(BrowserTaskEnvironmentTest, CurrentThreadIOWithRealIOThread) { + BrowserTaskEnvironment task_environment( + BrowserTaskEnvironment::Options::REAL_IO_THREAD); + base::RunLoop run_loop; + + auto io_task_runner = base::CreateSingleThreadTaskRunner({BrowserThread::IO}); + + base::PostTask( + FROM_HERE, {BrowserThread::IO}, base::BindLambdaForTesting([&]() { + EXPECT_EQ(io_task_runner, + base::CreateSingleThreadTaskRunner({base::CurrentThread()})); + run_loop.Quit(); + })); + + run_loop.Run(); +} + } // namespace content
diff --git a/content/shell/browser/web_test/blink_test_controller.cc b/content/shell/browser/web_test/blink_test_controller.cc index 9c00f90f..befb67f 100644 --- a/content/shell/browser/web_test/blink_test_controller.cc +++ b/content/shell/browser/web_test/blink_test_controller.cc
@@ -448,18 +448,18 @@ // Shell::SizeTo is not implemented on all platforms. main_window_->SizeTo(initial_size_); #endif - main_window_->web_contents() - ->GetRenderViewHost() - ->GetWidget() - ->GetView() - ->SetSize(initial_size_); - // Try to reset the window size. This can fail, see crbug.com/772811 - main_window_->web_contents() - ->GetRenderViewHost() - ->GetWidget() - ->SynchronizeVisualProperties(); RenderViewHost* render_view_host = main_window_->web_contents()->GetRenderViewHost(); + RenderWidgetHost* render_widget_host = render_view_host->GetWidget(); + // Set a different size first to reset the possibly inconsistent state + // caused by the previous test using unfortunate synchronous resize mode. + // This forces SetSize() not to early return which would otherwise happen + // when we set the size to initial_size_ which is the same as its current + // size. See http://crbug.com/1011191 for more details. + render_widget_host->GetView()->SetSize( + gfx::Size(initial_size_.width() / 2, initial_size_.height())); + render_widget_host->GetView()->SetSize(initial_size_); + render_widget_host->SynchronizeVisualProperties(); if (is_devtools_protocol_test) { devtools_protocol_test_bindings_.reset( @@ -476,13 +476,10 @@ // Focus the RenderWidgetHost. This will send an IPC message to the // renderer to propagate the state change. - main_window_->web_contents()->GetRenderViewHost()->GetWidget()->Focus(); + render_widget_host->Focus(); // Flush various interfaces to ensure a test run begins from a known state. - main_window_->web_contents() - ->GetRenderViewHost() - ->GetWidget() - ->FlushForTesting(); + render_widget_host->FlushForTesting(); GetWebTestControlRemote(render_view_host->GetMainFrame()).FlushForTesting(); if (is_devtools_js_test) {
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt index 3bd9cb1..326d8a6 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -157,10 +157,6 @@ crbug.com/angleproject/1465 [ win ] conformance2/glsl3/tricky-loop-conditions.html [ Failure ] crbug.com/951628 [ win no-passthrough ] conformance/rendering/blending.html [ Failure ] -# Win / D3D11 backend -# This test seems to flakily pass sometimes (at least on AMD and Intel). -crbug.com/angleproject/3388 [ win d3d11 ] conformance2/uniforms/large-uniform-buffers.html [ Failure ] - # Win / NVidia crbug.com/631317 [ d3d11 win nvidia ] deqp/functional/gles3/fbomultisample* [ RetryOnFailure ] crbug.com/679639 [ d3d11 win nvidia ] conformance2/rendering/draw-with-integer-texture-base-level.html [ Failure ]
diff --git a/docs/clang.md b/docs/clang.md index d901dad..259560c1 100644 --- a/docs/clang.md +++ b/docs/clang.md
@@ -74,6 +74,12 @@ is_component_build = true ``` +On Windows, for `clang_base_path` use something like this instead: + +``` +clang_base_path = "c:/src/llvm-build" +``` + You can then run `head out/gn/toolchain.ninja` and check that the first to lines set `cc` and `cxx` to your clang binary. If things look good, run `ninja -C out/gn` to build.
diff --git a/ios/build/bots/chromium.fyi/ios12-beta-simulator.json b/ios/build/bots/chromium.fyi/ios12-beta-simulator.json index d18f3581..9ba6335 100644 --- a/ios/build/bots/chromium.fyi/ios12-beta-simulator.json +++ b/ios/build/bots/chromium.fyi/ios12-beta-simulator.json
@@ -13,5 +13,95 @@ "use_goma=true" ], "tests": [ + { + "include": "common_tests.json", + "device type": "iPhone X", + "os": "13.1", + "xcode build version": "11a1027", + "host os": "Mac-10.14.6", + "pool":"Chrome", + "test args": [ + "--run-with-custom-webkit" + ] + }, + { + "include": "screen_size_dependent_tests.json", + "device type": "iPhone X", + "os": "13.1", + "xcode build version": "11a1027", + "host os": "Mac-10.14.6", + "pool":"Chrome", + "test args": [ + "--run-with-custom-webkit" + ] + }, + { + "include": "eg_tests.json", + "device type": "iPhone X", + "os": "13.1", + "xcode build version": "11a1027", + "host os": "Mac-10.14.6", + "pool":"Chrome", + "test args": [ + "--run-with-custom-webkit" + ] + + }, + { + "include": "eg_cq_tests.json", + "device type": "iPhone X", + "os": "13.1", + "xcode build version": "11a1027", + "host os": "Mac-10.14.6", + "pool":"Chrome", + "test args": [ + "--run-with-custom-webkit" + ] + }, + { + "include": "common_tests.json", + "device type": "iPad Air 2", + "os": "13.1", + "xcode build version": "11a1027", + "host os": "Mac-10.14.6", + "pool":"Chrome", + "test args": [ + "--run-with-custom-webkit" + ] + }, + { + "include": "screen_size_dependent_tests.json", + "device type": "iPad Air 2", + "os": "13.1", + "xcode build version": "11a1027", + "host os": "Mac-10.14.6", + "pool":"Chrome", + "test args": [ + "--run-with-custom-webkit" + ] + }, + { + "include": "eg_tests.json", + "device type": "iPad Air 2", + "os": "13.1", + "xcode build version": "11a1027", + "host os": "Mac-10.14.6", + "pool":"Chrome", + "test args": [ + "--run-with-custom-webkit" + ] + + }, + { + "include": "eg_cq_tests.json", + "device type": "iPad Air 2", + "os": "13.1", + "xcode build version": "11a1027", + "host os": "Mac-10.14.6", + "pool":"Chrome", + "test args": [ + "--run-with-custom-webkit" + ] + } ] }
diff --git a/ios/chrome/browser/autofill/automation/automation_action.mm b/ios/chrome/browser/autofill/automation/automation_action.mm index 37937e9..f57c6cd 100644 --- a/ios/chrome/browser/autofill/automation/automation_action.mm +++ b/ios/chrome/browser/autofill/automation/automation_action.mm
@@ -4,25 +4,18 @@ #import "ios/chrome/browser/autofill/automation/automation_action.h" -#import <EarlGrey/EarlGrey.h> - -#include "base/guid.h" #include "base/mac/foundation_util.h" -#include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #import "base/test/ios/wait_util.h" -#include "components/autofill/core/browser/autofill_manager.h" -#include "components/autofill/core/browser/personal_data_manager.h" -#include "components/autofill/ios/browser/autofill_driver_ios.h" +#include "base/values.h" #import "ios/chrome/browser/autofill/form_suggestion_constants.h" #import "ios/chrome/browser/ui/infobars/infobar_constants.h" -#import "ios/chrome/test/app/tab_test_util.h" +#import "ios/chrome/test/earl_grey/chrome_actions.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" -#import "ios/web/public/js_messaging/web_frames_manager.h" -#import "ios/web/public/test/earl_grey/web_view_actions.h" -#import "ios/web/public/test/earl_grey/web_view_matchers.h" -#include "ios/web/public/test/element_selector.h" +#import "ios/chrome/test/earl_grey/chrome_matchers.h" +#import "ios/testing/earl_grey/earl_grey_test.h" +#import "ios/web/public/test/element_selector.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -198,27 +191,26 @@ // A shared flow across many actions, this waits for the target element to be // visible, scrolls it into view, then taps on it. - (void)tapOnTarget:(ElementSelector*)selector { - web::WebState* web_state = chrome_test_util::GetCurrentWebState(); // Wait for the element to be visible on the page. [ChromeEarlGrey waitForWebStateContainingElement:selector]; // Potentially scroll into view if below the fold. - [[EarlGrey selectElementWithMatcher:web::WebViewInWebState(web_state)] - performAction:WebViewScrollElementToVisible(web_state, selector)]; + [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()] + performAction:chrome_test_util::ScrollElementToVisible(selector)]; // Calling WebViewTapElement right after WebViewScrollElement caused flaky // issues with the wrong location being provided for the tap target, // seemingly caused by the screen not redrawing in-between these two actions. - // We force a brief wait here to avoid this issue. - [[GREYCondition conditionWithName:@"forced wait to allow for redraw" - block:^BOOL { - return false; - }] waitWithTimeout:0.1]; - + // We force a brief wait here to avoid this issue. |waitWithTimeout| requires + // its result to be used. Void the result as it's always false. + (void)[[GREYCondition conditionWithName:@"forced wait to allow for redraw" + block:^BOOL { + return false; + }] waitWithTimeout:0.1]; // Tap on the element. - [[EarlGrey selectElementWithMatcher:web::WebViewInWebState(web_state)] - performAction:web::WebViewTapElement(web_state, selector)]; + [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()] + performAction:chrome_test_util::TapWebElement(selector)]; } // Creates a selector targeting the element specified in the action.
diff --git a/ios/chrome/browser/prerender/preload_controller.mm b/ios/chrome/browser/prerender/preload_controller.mm index 37f3274..9debfbf5 100644 --- a/ios/chrome/browser/prerender/preload_controller.mm +++ b/ios/chrome/browser/prerender/preload_controller.mm
@@ -272,6 +272,7 @@ return !IsPrerenderTabEvictionExperimentalGroup() && self.preferenceEnabled && !ios::device_util::IsSingleCoreDevice() && ios::device_util::RamIsAtLeast512Mb() && + !net::NetworkChangeNotifier::IsOffline() && (!self.wifiOnly || !self.usingWWAN); }
diff --git a/ios/chrome/browser/prerender/preload_controller_unittest.mm b/ios/chrome/browser/prerender/preload_controller_unittest.mm index 78b1584..f36bfc7 100644 --- a/ios/chrome/browser/prerender/preload_controller_unittest.mm +++ b/ios/chrome/browser/prerender/preload_controller_unittest.mm
@@ -90,6 +90,11 @@ net::NetworkChangeNotifier::CONNECTION_WIFI); } + void SimulateOffline() { + network_change_notifier_->SimulateNetworkConnectionChange( + net::NetworkChangeNotifier::CONNECTION_NONE); + } + void SimulateCellularConnection() { network_change_notifier_->SimulateNetworkConnectionChange( net::NetworkChangeNotifier::CONNECTION_3G); @@ -133,13 +138,16 @@ TEST_F(PreloadControllerTest, TestIsPrerenderingEnabled_preloadAlways) { // With the "Preload Webpages" setting set to "Always", prerendering is - // enabled regardless of network type. + // enabled regardless of network type, unless offline. PreloadWebpagesAlways(); SimulateWiFiConnection(); EXPECT_TRUE(controller_.enabled || ios::device_util::IsSingleCoreDevice() || !ios::device_util::RamIsAtLeast512Mb()); + SimulateOffline(); + EXPECT_FALSE(controller_.enabled); + SimulateCellularConnection(); EXPECT_TRUE(controller_.enabled || ios::device_util::IsSingleCoreDevice() || !ios::device_util::RamIsAtLeast512Mb()); @@ -154,6 +162,9 @@ EXPECT_TRUE(controller_.enabled || ios::device_util::IsSingleCoreDevice() || !ios::device_util::RamIsAtLeast512Mb()); + SimulateOffline(); + EXPECT_FALSE(controller_.enabled); + SimulateCellularConnection(); EXPECT_FALSE(controller_.enabled); } @@ -166,6 +177,9 @@ SimulateWiFiConnection(); EXPECT_FALSE(controller_.enabled); + SimulateOffline(); + EXPECT_FALSE(controller_.enabled); + SimulateCellularConnection(); EXPECT_FALSE(controller_.enabled); }
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/all_password_coordinator.mm b/ios/chrome/browser/ui/autofill/manual_fill/all_password_coordinator.mm index 2b942bf4..9498d9c 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/all_password_coordinator.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/all_password_coordinator.mm
@@ -75,9 +75,8 @@ } - (void)stop { - [self.passwordViewController.presentingViewController - dismissViewControllerAnimated:YES - completion:nil]; + [self.passwordViewController dismissViewControllerAnimated:YES + completion:nil]; self.passwordViewController = nil; self.passwordMediator = nil; [super stop];
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm index 1b2ba38..5b737d8 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm
@@ -31,7 +31,6 @@ #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/web/public/test/earl_grey/web_view_matchers.h" #include "ios/web/public/test/element_selector.h" -#import "ios/web/public/web_client.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "url/gurl.h" @@ -528,45 +527,6 @@ } } -// Test that after searching in "Use Other Password" and selecting an option, -// the screen is dismissed. -- (void)testOtherPasswordsDismissAfterSearch { - // This test is failing on a legacy bot. Return early if running there. - if (![ChromeEarlGrey isSlimNavigationManagerEnabled]) { - EARL_GREY_TEST_SKIPPED(@"Skipped for Slim Navigation off."); - } - - // Bring up the keyboard. - [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()] - performAction:TapWebElementWithId(kFormElementUsername)]; - - // Tap the passwords icon. - [[EarlGrey selectElementWithMatcher:PasswordIconMatcher()] - performAction:grey_tap()]; - - // Tap "Use Other Password...". - [[EarlGrey selectElementWithMatcher:OtherPasswordsMatcher()] - performAction:grey_tap()]; - - // Verify "Use Other Passwords" opened. - [[EarlGrey selectElementWithMatcher:OtherPasswordsDismissMatcher()] - assertWithMatcher:grey_sufficientlyVisible()]; - - // Tap the password search bar. - [[EarlGrey selectElementWithMatcher:PasswordSearchBarMatcher()] - performAction:grey_typeText(@"user")]; - - // Select a username. - [[EarlGrey selectElementWithMatcher:UsernameButtonMatcher()] - performAction:grey_tap()]; - - // Verify the password list disappears. - [[EarlGrey selectElementWithMatcher:PasswordSearchBarMatcher()] - assertWithMatcher:grey_nil()]; - [[EarlGrey selectElementWithMatcher:OtherPasswordsMatcher()] - assertWithMatcher:grey_nil()]; -} - // Tests that the Password View Controller is dismissed when tapping the // keyboard icon. - (void)testKeyboardIconDismissPasswordController {
diff --git a/ios/chrome/browser/ui/passwords/password_breach_coordinator.mm b/ios/chrome/browser/ui/passwords/password_breach_coordinator.mm index 2dc516a..6c925478 100644 --- a/ios/chrome/browser/ui/passwords/password_breach_coordinator.mm +++ b/ios/chrome/browser/ui/passwords/password_breach_coordinator.mm
@@ -37,6 +37,7 @@ } - (void)stop { + [self.mediator disconnect]; self.mediator = nil; [self.viewController.presentingViewController dismissViewControllerAnimated:YES
diff --git a/ios/chrome/browser/ui/passwords/password_breach_mediator.h b/ios/chrome/browser/ui/passwords/password_breach_mediator.h index 4d1a69c..a111a4a 100644 --- a/ios/chrome/browser/ui/passwords/password_breach_mediator.h +++ b/ios/chrome/browser/ui/passwords/password_breach_mediator.h
@@ -36,6 +36,10 @@ - (instancetype)initWithCoder NS_UNAVAILABLE; +// Informs the mediator that its about to be destroyed, so it can perform any +// logging or clean up needed. +- (void)disconnect; + @end #endif // IOS_CHROME_BROWSER_UI_PASSWORDS_PASSWORD_BREACH_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/passwords/password_breach_mediator.mm b/ios/chrome/browser/ui/passwords/password_breach_mediator.mm index 20ddc19..427fa96 100644 --- a/ios/chrome/browser/ui/passwords/password_breach_mediator.mm +++ b/ios/chrome/browser/ui/passwords/password_breach_mediator.mm
@@ -6,6 +6,7 @@ #include "base/strings/sys_string_conversions.h" #include "components/password_manager/core/browser/leak_detection_dialog_utils.h" +#include "components/password_manager/core/browser/password_manager_metrics_util.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/passwords/password_breach_consumer.h" @@ -19,12 +20,22 @@ using password_manager::GetAcceptButtonLabel; using password_manager::GetCancelButtonLabel; using password_manager::GetDescription; +using password_manager::GetLeakDialogType; using password_manager::GetTitle; -using password_manager::ShouldCheckPasswords; using password_manager::GetPasswordCheckupURL; +using password_manager::ShouldCheckPasswords; +using password_manager::metrics_util::LeakDialogDismissalReason; +using password_manager::metrics_util::LeakDialogType; +using password_manager::metrics_util::LogLeakDialogTypeAndDismissalReason; @interface PasswordBreachMediator () +// Leak type of the dialog. +@property(nonatomic, assign) LeakDialogType leakType; + +// Dismiss reason, used for metrics. +@property(nonatomic, assign) LeakDialogDismissalReason dismissReason; + // The presenter of the feature. @property(nonatomic, weak) id<PasswordBreachPresenter> presenter; @@ -44,6 +55,9 @@ if (self) { _presenter = presenter; _dispatcher = dispatcher; + _leakType = GetLeakDialogType(leakType); + _dismissReason = LeakDialogDismissalReason::kNoDirectInteraction; + NSString* subtitle = SysUTF16ToNSString(GetDescription(leakType, URL)); NSString* primaryActionString = SysUTF16ToNSString(GetAcceptButtonLabel(leakType)); @@ -55,13 +69,21 @@ return self; } +- (void)disconnect { + LogLeakDialogTypeAndDismissalReason(self.leakType, self.dismissReason); +} + #pragma mark - PasswordBreachConsumerDelegate - (void)passwordBreachDone { + self.dismissReason = LeakDialogDismissalReason::kClickedOk; [self.presenter stop]; } - (void)passwordBreachPrimaryAction { + // Opening a new tab already stops the presentation in the presenter. + // No need to send |stop|. + self.dismissReason = LeakDialogDismissalReason::kClickedCheckPasswords; OpenNewTabCommand* newTabCommand = [OpenNewTabCommand commandWithURLFromChrome:GetPasswordCheckupURL()]; [self.dispatcher openURLInNewTab:newTabCommand];
diff --git a/ios/third_party/webkit/BUILD.gn b/ios/third_party/webkit/BUILD.gn index 0b3b89c8..1e5e9b9 100644 --- a/ios/third_party/webkit/BUILD.gn +++ b/ios/third_party/webkit/BUILD.gn
@@ -64,6 +64,14 @@ "$_framework_out_dir/WebKit.framework/WebKit", "$_framework_out_dir/WebKitLegacy.framework", "$_framework_out_dir/WebKitLegacy.framework/WebKitLegacy", + "$_framework_out_dir/com.apple.WebKit.Networking.xpc", + "$_framework_out_dir/com.apple.WebKit.Networking.xpc/com.apple.WebKit.Networking.Development", + "$_framework_out_dir/com.apple.WebKit.Plugin.64.xpc", + "$_framework_out_dir/com.apple.WebKit.Plugin.64.xpc/com.apple.WebKit.Plugin.64.Development", + "$_framework_out_dir/com.apple.WebKit.WebContent.Development.xpc", + "$_framework_out_dir/com.apple.WebKit.WebContent.Development.xpc/com.apple.WebKit.WebContent.Development.Development", + "$_framework_out_dir/com.apple.WebKit.WebContent.xpc", + "$_framework_out_dir/com.apple.WebKit.WebContent.xpc/com.apple.WebKit.WebContent.Development", ] # TODO(crbug.com/934252): "-j 4" restricts xcodebuild to four simultaneous @@ -91,6 +99,10 @@ "$_framework_out_dir/WebCore.framework", "$_framework_out_dir/WebKit.framework", "$_framework_out_dir/WebKitLegacy.framework", + "$_framework_out_dir/com.apple.WebKit.Networking.xpc", + "$_framework_out_dir/com.apple.WebKit.Plugin.64.xpc", + "$_framework_out_dir/com.apple.WebKit.WebContent.Development.xpc", + "$_framework_out_dir/com.apple.WebKit.WebContent.xpc", ] outputs = [ "{{bundle_contents_dir}}/WebKitFrameworks/{{source_file_part}}",
diff --git a/ios/web/common/features.h b/ios/web/common/features.h index 533239b..32213d9 100644 --- a/ios/web/common/features.h +++ b/ios/web/common/features.h
@@ -31,6 +31,11 @@ // Used to ensure that the render is not suspended. extern const base::Feature kKeepsRenderProcessAlive; +// Used to enable the workaround for a WKWebView WKNavigation leak. +// (crbug.com/1010765). Clear older pending navigation records when a +// navigation finishes. +extern const base::Feature kClearOldNavigationRecordsWorkaround; + // Used to enable committed interstitials for SSL errors. extern const base::Feature kSSLCommittedInterstitials;
diff --git a/ios/web/common/features.mm b/ios/web/common/features.mm index 357e0e6..f062aed 100644 --- a/ios/web/common/features.mm +++ b/ios/web/common/features.mm
@@ -29,6 +29,9 @@ const base::Feature kKeepsRenderProcessAlive{"KeepsRenderProcessAlive", base::FEATURE_ENABLED_BY_DEFAULT}; +const base::Feature kClearOldNavigationRecordsWorkaround{ + "ClearOldNavigationRecordsWorkaround", base::FEATURE_ENABLED_BY_DEFAULT}; + const base::Feature kSSLCommittedInterstitials{ "SSLCommittedInterstitials", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/web/navigation/crw_web_view_navigation_observer.h b/ios/web/navigation/crw_web_view_navigation_observer.h index 7ecebee..ebe436e2 100644 --- a/ios/web/navigation/crw_web_view_navigation_observer.h +++ b/ios/web/navigation/crw_web_view_navigation_observer.h
@@ -18,6 +18,9 @@ // The webView to observe. @property(nonatomic, weak) WKWebView* webView; +// Instructs this handler to close. +- (void)close; + @end #endif // IOS_WEB_NAVIGATION_CRW_WEB_VIEW_NAVIGATION_OBSERVER_H_
diff --git a/ios/web/navigation/crw_web_view_navigation_observer.mm b/ios/web/navigation/crw_web_view_navigation_observer.mm index 81e35541..5e752c4 100644 --- a/ios/web/navigation/crw_web_view_navigation_observer.mm +++ b/ios/web/navigation/crw_web_view_navigation_observer.mm
@@ -52,10 +52,19 @@ // The NavigationManagerImpl associated with the web state. @property(nonatomic, readonly) NavigationManagerImpl* navigationManagerImpl; +// Set to YES when [self close] is called. +@property(nonatomic, assign) BOOL beingDestroyed; + @end @implementation CRWWebViewNavigationObserver +#pragma mark - Public + +- (void)close { + self.beingDestroyed = YES; +} + #pragma mark - Property - (void)setWebView:(WKWebView*)webView { @@ -103,6 +112,7 @@ ofObject:(id)object change:(NSDictionary*)change context:(void*)context { + DCHECK(!self.beingDestroyed); NSString* dispatcherSelectorName = self.WKWebViewObservers[keyPath]; DCHECK(dispatcherSelectorName); if (dispatcherSelectorName) {
diff --git a/ios/web/navigation/crw_wk_navigation_states.mm b/ios/web/navigation/crw_wk_navigation_states.mm index 1bb1ec50..af3f0dc 100644 --- a/ios/web/navigation/crw_wk_navigation_states.mm +++ b/ios/web/navigation/crw_wk_navigation_states.mm
@@ -4,8 +4,12 @@ #import "ios/web/navigation/crw_wk_navigation_states.h" +#include "base/feature_list.h" #include "base/logging.h" +#include "base/metrics/histogram_macros.h" +#include "ios/web/common/features.h" #import "ios/web/navigation/navigation_context_impl.h" +#import "ios/web/public/web_client.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -145,6 +149,33 @@ if (state == web::WKNavigationState::COMMITTED) { record.committed = YES; } + + // Workaround for a WKWebView bug where WKNavigation's can leak, leaving a + // permanent pending URL, thus breaking the omnibox. While it is possible + // for navigations to finish out-of-order, it's an edge case that should be + // handled gracefully, as last committed will appear in the omnibox instead + // of the pending URL. See crbug.com/1010765 for details and a reproducible + // example. + if (state == web::WKNavigationState::FINISHED && + web::GetWebClient()->IsSlimNavigationManagerEnabled() && + base::FeatureList::IsEnabled( + web::features::kClearOldNavigationRecordsWorkaround)) { + NSUInteger finishedIndex = record.index; + NSMutableSet* navigationsToRemove = [NSMutableSet set]; + for (id navigation in _records) { + CRWWKNavigationsStateRecord* record = [_records objectForKey:navigation]; + if (record.index < finishedIndex) { + [navigationsToRemove addObject:navigation]; + } + } + for (id navigation in navigationsToRemove) { + [_records removeObjectForKey:navigation]; + } + + UMA_HISTOGRAM_BOOLEAN("IOS.CRWWKNavigationStatesRemoveOldPending", + navigationsToRemove.count > 0); + } + [_records setObject:record forKey:key]; }
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index 34d2ad9..861828d 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -603,6 +603,7 @@ self.swipeRecognizerProvider = nil; [self.legacyNativeController close]; [self.requestController close]; + [self.webViewNavigationObserver close]; // Mark the destruction sequence has started, in case someone else holds a // strong reference and tries to continue using the tab. @@ -1792,6 +1793,7 @@ ofObject:(id)object change:(NSDictionary*)change context:(void*)context { + DCHECK(!self.beingDestroyed); NSString* dispatcherSelectorName = self.WKWebViewObservers[keyPath]; DCHECK(dispatcherSelectorName); if (dispatcherSelectorName) {
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm index 0f74c4f..7694748f 100644 --- a/ios/web/web_state/ui/crw_web_controller_unittest.mm +++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -77,6 +77,46 @@ using base::test::ios::WaitUntilConditionOrTimeout; using base::test::ios::kWaitForPageLoadTimeout; +// Subclass of WKWebView to check that the observers are removed when the web +// state is destroyed. +@interface CRWFakeWKWebViewObserverCount : WKWebView + +// Array storing the different key paths observed. +@property(nonatomic, strong) NSMutableArray<NSString*>* keyPaths; +// Whether there was observers when the WebView was stopped. +@property(nonatomic, assign) BOOL hadObserversWhenStopping; + +@end + +@implementation CRWFakeWKWebViewObserverCount + +- (void)stopLoading { + [super stopLoading]; + self.hadObserversWhenStopping = + self.hadObserversWhenStopping || self.keyPaths.count > 0; +} + +- (void)removeObserver:(NSObject*)observer forKeyPath:(NSString*)keyPath { + [super removeObserver:observer forKeyPath:keyPath]; + [self.keyPaths removeObject:keyPath]; +} + +- (void)addObserver:(NSObject*)observer + forKeyPath:(NSString*)keyPath + options:(NSKeyValueObservingOptions)options + context:(void*)context { + [super addObserver:observer + forKeyPath:keyPath + options:options + context:context]; + if (!self.keyPaths) { + self.keyPaths = [[NSMutableArray alloc] init]; + } + [self.keyPaths addObject:keyPath]; +} + +@end + namespace web { namespace { @@ -1348,6 +1388,42 @@ INSTANTIATE_TEST_SUITES(CRWWebControllerWebProcessTest); +// Fixture class to test WKWebView crashes. +class CRWWebControllerWebViewTest + : public ProgrammaticWebTestWithWebController { + protected: + void SetUp() override { + ProgrammaticWebTestWithWebController::SetUp(); + web::TestBrowserState browser_state; + web_view_ = [[CRWFakeWKWebViewObserverCount alloc] init]; + TestWebViewContentView* webViewContentView = [[TestWebViewContentView alloc] + initWithMockWebView:web_view_ + scrollView:web_view_.scrollView]; + [web_controller() injectWebViewContentView:webViewContentView]; + } + CRWFakeWKWebViewObserverCount* web_view_; +}; + +// Tests that the KVO for the WebView are removed when the WebState is +// destroyed. See crbug.com/1002786. +TEST_P(CRWWebControllerWebViewTest, CheckNoKVOWhenWebStateDestroyed) { + // Load a first URL. + NSURL* URL = [NSURL URLWithString:@"about:blank"]; + NSURLRequest* request = [NSURLRequest requestWithURL:URL]; + [web_view_ loadRequest:request]; + base::test::ios::WaitUntilCondition(^bool() { + return !web_view_.loading; + }); + + // Destroying the WebState should call stop at a point where all observers are + // supposed to be removed. + DestroyWebState(); + + EXPECT_FALSE(web_view_.hadObserversWhenStopping); +} + +INSTANTIATE_TEST_SUITES(CRWWebControllerWebViewTest); + #undef INSTANTIATE_TEST_SUITES } // namespace web
diff --git a/ios/web_view/internal/translate/cwv_translation_controller.mm b/ios/web_view/internal/translate/cwv_translation_controller.mm index 13bee0b..08ef08a1 100644 --- a/ios/web_view/internal/translate/cwv_translation_controller.mm +++ b/ios/web_view/internal/translate/cwv_translation_controller.mm
@@ -10,6 +10,7 @@ #include "base/memory/ptr_util.h" #include "base/strings/string16.h" #include "base/strings/sys_string_conversions.h" +#include "base/time/time.h" #include "components/translate/core/browser/translate_download_manager.h" #import "ios/web_view/internal/cwv_web_view_configuration_internal.h" #import "ios/web_view/internal/translate/cwv_translation_language_internal.h" @@ -74,6 +75,7 @@ @implementation CWVTranslationController { ios_web_view::WebViewTranslateClient* _translateClient; std::unique_ptr<translate::TranslatePrefs> _translatePrefs; + base::Time _languagesLastUpdatedTime; } @synthesize delegate = _delegate; @@ -245,7 +247,10 @@ #pragma mark - Private Methods - (NSDictionary<NSString*, CWVTranslationLanguage*>*)supportedLanguagesByCode { - if (!_supportedLanguagesByCode) { + base::Time languagesLastUpdatedTime = + translate::TranslateDownloadManager::GetSupportedLanguagesLastUpdated(); + if (!_supportedLanguagesByCode || + _languagesLastUpdatedTime < languagesLastUpdatedTime) { NSMutableDictionary<NSString*, CWVTranslationLanguage*>* supportedLanguagesByCode = [NSMutableDictionary dictionary]; std::vector<std::string> languageCodes; @@ -265,7 +270,7 @@ supportedLanguagesByCode[language.languageCode] = language; } - + _languagesLastUpdatedTime = languagesLastUpdatedTime; _supportedLanguagesByCode = [supportedLanguagesByCode copy]; } return _supportedLanguagesByCode;
diff --git a/media/mojo/clients/mojo_video_decoder.cc b/media/mojo/clients/mojo_video_decoder.cc index 15c76d59..77b426e 100644 --- a/media/mojo/clients/mojo_video_decoder.cc +++ b/media/mojo/clients/mojo_video_decoder.cc
@@ -352,15 +352,17 @@ mojom::MediaLogAssociatedPtrInfo media_log_ptr_info; media_log_binding_.Bind(mojo::MakeRequest(&media_log_ptr_info)); - // Create |video_frame_handle_releaser| interface request, and bind + // Create |video_frame_handle_releaser| interface receiver, and bind // |mojo_video_frame_handle_releaser_| to it. - mojom::VideoFrameHandleReleaserRequest video_frame_handle_releaser_request; - mojom::VideoFrameHandleReleaserPtrInfo video_frame_handle_releaser_ptr_info; - video_frame_handle_releaser_request = - mojo::MakeRequest(&video_frame_handle_releaser_ptr_info); + mojo::PendingRemote<mojom::VideoFrameHandleReleaser> + video_frame_handle_releaser_pending_remote; + mojo::PendingReceiver<mojom::VideoFrameHandleReleaser> + video_frame_handle_releaser_receiver = + video_frame_handle_releaser_pending_remote + .InitWithNewPipeAndPassReceiver(); mojo_video_frame_handle_releaser_ = base::MakeRefCounted<MojoVideoFrameHandleReleaser>( - std::move(video_frame_handle_releaser_ptr_info), task_runner_); + std::move(video_frame_handle_releaser_pending_remote), task_runner_); mojo::ScopedDataPipeConsumerHandle remote_consumer_handle; mojo_decoder_buffer_writer_ = MojoDecoderBufferWriter::Create( @@ -379,7 +381,7 @@ remote_decoder_->Construct( std::move(client_ptr_info), std::move(media_log_ptr_info), - std::move(video_frame_handle_releaser_request), + std::move(video_frame_handle_releaser_receiver), std::move(remote_consumer_handle), std::move(command_buffer_id), video_decoder_implementation_, target_color_space_); }
diff --git a/media/mojo/mojom/video_decoder.mojom b/media/mojo/mojom/video_decoder.mojom index 12b0e59..2fdaddd2 100644 --- a/media/mojo/mojom/video_decoder.mojom +++ b/media/mojo/mojom/video_decoder.mojom
@@ -99,13 +99,14 @@ // // TODO(sandersd): Rename to Initialize() if/when // media::VideoDecoder::Initialize() is renamed to Configure(). - Construct(associated VideoDecoderClient client, - associated MediaLog media_log, - VideoFrameHandleReleaser& video_frame_handle_releaser, - handle<data_pipe_consumer> decoder_buffer_pipe, - CommandBufferId? command_buffer_id, - VideoDecoderImplementation implementation, - gfx.mojom.ColorSpace target_color_space); + Construct( + pending_associated_remote<VideoDecoderClient> client, + pending_associated_remote<MediaLog> media_log, + pending_receiver<VideoFrameHandleReleaser> video_frame_handle_releaser, + handle<data_pipe_consumer> decoder_buffer_pipe, + CommandBufferId? command_buffer_id, + VideoDecoderImplementation implementation, + gfx.mojom.ColorSpace target_color_space); // Configure (or reconfigure) the decoder. This must be called before decoding // any frames, and must not be called while there are pending Initialize(),
diff --git a/media/mojo/services/mojo_media_log.cc b/media/mojo/services/mojo_media_log.cc index 732ffa6..1eefbe3 100644 --- a/media/mojo/services/mojo_media_log.cc +++ b/media/mojo/services/mojo_media_log.cc
@@ -10,8 +10,9 @@ namespace media { -MojoMediaLog::MojoMediaLog(mojom::MediaLogAssociatedPtrInfo remote_media_log, - scoped_refptr<base::SequencedTaskRunner> task_runner) +MojoMediaLog::MojoMediaLog( + mojo::PendingAssociatedRemote<mojom::MediaLog> remote_media_log, + scoped_refptr<base::SequencedTaskRunner> task_runner) : remote_media_log_(std::move(remote_media_log)), task_runner_(std::move(task_runner)) { weak_this_ = weak_ptr_factory_.GetWeakPtr();
diff --git a/media/mojo/services/mojo_media_log.h b/media/mojo/services/mojo_media_log.h index 15835c3..da879c0 100644 --- a/media/mojo/services/mojo_media_log.h +++ b/media/mojo/services/mojo_media_log.h
@@ -13,6 +13,8 @@ #include "base/sequenced_task_runner.h" #include "media/base/media_log.h" #include "media/mojo/mojom/media_log.mojom.h" +#include "mojo/public/cpp/bindings/associated_remote.h" +#include "mojo/public/cpp/bindings/pending_associated_remote.h" namespace media { @@ -20,8 +22,9 @@ class MojoMediaLog final : public MediaLog { public: // TODO(sandersd): Template on Ptr type to support non-associated. - explicit MojoMediaLog(mojom::MediaLogAssociatedPtrInfo remote_media_log, - scoped_refptr<base::SequencedTaskRunner> task_runner); + explicit MojoMediaLog( + mojo::PendingAssociatedRemote<mojom::MediaLog> remote_media_log, + scoped_refptr<base::SequencedTaskRunner> task_runner); ~MojoMediaLog() final; protected: @@ -30,7 +33,7 @@ void AddEventLocked(std::unique_ptr<MediaLogEvent> event) override; private: - mojom::MediaLogAssociatedPtr remote_media_log_; + mojo::AssociatedRemote<mojom::MediaLog> remote_media_log_; // The mojo service thread on which we'll access |remote_media_log_|. scoped_refptr<base::SequencedTaskRunner> task_runner_;
diff --git a/media/mojo/services/mojo_video_decoder_service.cc b/media/mojo/services/mojo_video_decoder_service.cc index 6602500..ffa83a6 100644 --- a/media/mojo/services/mojo_video_decoder_service.cc +++ b/media/mojo/services/mojo_video_decoder_service.cc
@@ -118,9 +118,10 @@ } void MojoVideoDecoderService::Construct( - mojom::VideoDecoderClientAssociatedPtrInfo client, - mojom::MediaLogAssociatedPtrInfo media_log, - mojom::VideoFrameHandleReleaserRequest video_frame_handle_releaser, + mojo::PendingAssociatedRemote<mojom::VideoDecoderClient> client, + mojo::PendingAssociatedRemote<mojom::MediaLog> media_log, + mojo::PendingReceiver<mojom::VideoFrameHandleReleaser> + video_frame_handle_releaser_receiver, mojo::ScopedDataPipeConsumerHandle decoder_buffer_pipe, mojom::CommandBufferIdPtr command_buffer_id, VideoDecoderImplementation implementation, @@ -141,9 +142,9 @@ media_log_ = std::make_unique<MojoMediaLog>(std::move(media_log), task_runner); - video_frame_handle_releaser_ = - mojo::MakeStrongBinding(std::make_unique<VideoFrameHandleReleaserImpl>(), - std::move(video_frame_handle_releaser)); + video_frame_handle_releaser_ = mojo::MakeSelfOwnedReceiver( + std::make_unique<VideoFrameHandleReleaserImpl>(), + std::move(video_frame_handle_releaser_receiver)); mojo_decoder_buffer_reader_.reset( new MojoDecoderBufferReader(std::move(decoder_buffer_pipe)));
diff --git a/media/mojo/services/mojo_video_decoder_service.h b/media/mojo/services/mojo_video_decoder_service.h index 1c1f26c..95e1034 100644 --- a/media/mojo/services/mojo_video_decoder_service.h +++ b/media/mojo/services/mojo_video_decoder_service.h
@@ -18,6 +18,9 @@ #include "media/mojo/mojom/video_decoder.mojom.h" #include "media/mojo/services/media_mojo_export.h" #include "media/mojo/services/mojo_media_client.h" +#include "mojo/public/cpp/bindings/associated_remote.h" +#include "mojo/public/cpp/bindings/pending_associated_remote.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "mojo/public/cpp/bindings/strong_binding.h" namespace media { @@ -43,9 +46,10 @@ // mojom::VideoDecoder implementation void GetSupportedConfigs(GetSupportedConfigsCallback callback) final; void Construct( - mojom::VideoDecoderClientAssociatedPtrInfo client, - mojom::MediaLogAssociatedPtrInfo media_log, - mojom::VideoFrameHandleReleaserRequest video_frame_handle_releaser, + mojo::PendingAssociatedRemote<mojom::VideoDecoderClient> client, + mojo::PendingAssociatedRemote<mojom::MediaLog> media_log, + mojo::PendingReceiver<mojom::VideoFrameHandleReleaser> + video_frame_handle_receiver, mojo::ScopedDataPipeConsumerHandle decoder_buffer_pipe, mojom::CommandBufferIdPtr command_buffer_id, VideoDecoderImplementation implementation, @@ -93,14 +97,14 @@ MojoCdmServiceContext* const mojo_cdm_service_context_ = nullptr; // Channel for sending async messages to the client. - mojom::VideoDecoderClientAssociatedPtr client_; + mojo::AssociatedRemote<mojom::VideoDecoderClient> client_; // Proxy object for providing media log services. std::unique_ptr<MojoMediaLog> media_log_; // Holds VideoFrame references on behalf of the client, until the client // releases them or is disconnected. - mojo::StrongBindingPtr<mojom::VideoFrameHandleReleaser> + mojo::SelfOwnedReceiverRef<mojom::VideoFrameHandleReleaser> video_frame_handle_releaser_; // Helper for reading DecoderBuffer data from the DataPipe.
diff --git a/mojo/public/js/BUILD.gn b/mojo/public/js/BUILD.gn index 3f94385..b79ba2c 100644 --- a/mojo/public/js/BUILD.gn +++ b/mojo/public/js/BUILD.gn
@@ -38,7 +38,7 @@ # TODO(yzshen): Eventually we would like to use Closure Compiler to minify the # bindings instead of simply concatenating the files. - script = "//v8/tools/concatenate-files.py" + script = "//mojo/public/tools/bindings/concatenate-files.py" sources = bindings_js_files outputs = [
diff --git a/mojo/public/tools/bindings/concatenate-files.py b/mojo/public/tools/bindings/concatenate-files.py new file mode 100755 index 0000000..48bc66f --- /dev/null +++ b/mojo/public/tools/bindings/concatenate-files.py
@@ -0,0 +1,54 @@ +#!/usr/bin/env python +# 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. +# +# This utility concatenates several files into one. On Unix-like systems +# it is equivalent to: +# cat file1 file2 file3 ...files... > target +# +# The reason for writing a separate utility is that 'cat' is not available +# on all supported build platforms, but Python is, and hence this provides +# us with an easy and uniform way of doing this on all platforms. + +# for py2/py3 compatibility +from __future__ import print_function + +import optparse + + +def Concatenate(filenames): + """Concatenate files. + + Args: + files: Array of file names. + The last name is the target; all earlier ones are sources. + + Returns: + True, if the operation was successful. + """ + if len(filenames) < 2: + print("An error occurred generating %s:\nNothing to do." % filenames[-1]) + return False + + try: + with open(filenames[-1], "wb") as target: + for filename in filenames[:-1]: + with open(filename, "rb") as current: + target.write(current.read()) + return True + except IOError as e: + print("An error occurred when writing %s:\n%s" % (filenames[-1], e)) + return False + + +def main(): + parser = optparse.OptionParser() + parser.set_usage("""Concatenate several files into one. + Equivalent to: cat file1 ... > target.""") + (_options, args) = parser.parse_args() + exit(0 if Concatenate(args) else 1) + + +if __name__ == "__main__": + main()
diff --git a/net/BUILD.gn b/net/BUILD.gn index 8c6bd3c9..66f481c 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -554,6 +554,8 @@ "cert/cert_verify_proc_nss.h", "cert/cert_verify_proc_win.cc", "cert/cert_verify_proc_win.h", + "cert/coalescing_cert_verifier.cc", + "cert/coalescing_cert_verifier.h", "cert/ct_log_response_parser.cc", "cert/ct_log_response_parser.h", "cert/ct_log_verifier.cc", @@ -5113,6 +5115,7 @@ "cert/cert_verify_proc_ios_unittest.cc", "cert/cert_verify_proc_mac_unittest.cc", "cert/cert_verify_proc_unittest.cc", + "cert/coalescing_cert_verifier_unittest.cc", "cert/crl_set_unittest.cc", "cert/ct_log_response_parser_unittest.cc", "cert/ct_log_verifier_unittest.cc",
diff --git a/net/cert/cert_verifier.cc b/net/cert/cert_verifier.cc index fbf17c71..ec0ee94d 100644 --- a/net/cert/cert_verifier.cc +++ b/net/cert/cert_verifier.cc
@@ -18,6 +18,7 @@ #include "base/logging.h" #else #include "net/cert/caching_cert_verifier.h" +#include "net/cert/coalescing_cert_verifier.h" #include "net/cert/multi_threaded_cert_verifier.h" #endif @@ -101,7 +102,8 @@ #endif return std::make_unique<CachingCertVerifier>( - std::make_unique<MultiThreadedCertVerifier>(std::move(verify_proc))); + std::make_unique<CoalescingCertVerifier>( + std::make_unique<MultiThreadedCertVerifier>(std::move(verify_proc)))); #endif }
diff --git a/net/cert/coalescing_cert_verifier.cc b/net/cert/coalescing_cert_verifier.cc new file mode 100644 index 0000000..06099903 --- /dev/null +++ b/net/cert/coalescing_cert_verifier.cc
@@ -0,0 +1,463 @@ +// 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 "net/cert/coalescing_cert_verifier.h" + +#include <algorithm> + +#include "base/bind.h" +#include "base/containers/linked_list.h" +#include "base/containers/unique_ptr_adapters.h" +#include "base/memory/weak_ptr.h" +#include "base/metrics/histogram_macros.h" +#include "base/time/time.h" +#include "net/base/net_errors.h" +#include "net/cert/cert_verify_result.h" +#include "net/cert/x509_certificate_net_log_param.h" +#include "net/log/net_log_event_type.h" +#include "net/log/net_log_source.h" +#include "net/log/net_log_source_type.h" +#include "net/log/net_log_with_source.h" + +namespace net { + +// DESIGN OVERVIEW: +// +// The CoalescingCertVerifier implements an algorithm to group multiple calls +// to Verify() into a single Job. This avoids overloading the underlying +// CertVerifier, particularly those that are expensive to talk to (e.g. +// talking to the system verifier or across processes), batching multiple +// requests to CoaleacingCertVerifier::Verify() into a single underlying call. +// +// However, this makes lifetime management a bit more complex. +// - The Job object represents all of the state for a single verification to +// the CoalescingCertVerifier's underlying CertVerifier. +// * It keeps the CertVerifyResult alive, which is required as long as +// there is a pending verification. +// * It keeps the CertVerify::Request to the underlying verifier alive, +// as long as there is a pending Request attached to the Job. +// * It keeps track of every CoalescingCertVerifier::Request that is +// interested in receiving notification. However, it does NOT own +// these objects, and thus needs to coordinate with the Request (via +// AddRequest/AbortRequest) to make sure it never has a stale +// pointer. +// NB: It would have also been possible for the Job to only +// hold WeakPtr<Request>s, rather than Request*, but that seemed less +// clear as to the lifetime invariants, even if it was more clear +// about how the pointers are used. +// - The Job object is always owned by the CoalescingCertVerifier. If the +// CoalescingCertVerifier is deleted, all in-flight requests to the +// underlying verifier should be cancelled. When the Job goes away, all the +// Requests will be orphaned. +// - The Request object is always owned by the CALLER. It is a handle to +// allow a caller to cancel a request, per the CertVerifier interface. If +// the Request goes away, no caller callbacks should be invoked if the Job +// it was (previously) attached to completes. +// - Per the CertVerifier interface, when the CoalescingCertVerifier is +// deleted, then regardless of there being any live Requests, none of those +// caller callbacks should be invoked. +// +// Finally, to add to the complexity, it's possible that, during the handling +// of a result from the underlying CertVerifier, a Job may begin dispatching +// to its Requests. The Request may delete the CoalescingCertVerifier. If that +// happens, then the Job being processed is also deleted, and none of the +// other Requests should be notified. + +namespace { + +base::Value CertVerifyResultParams(const CertVerifyResult& verify_result) { + base::DictionaryValue results; + results.SetBoolean("has_md5", verify_result.has_md5); + results.SetBoolean("has_md2", verify_result.has_md2); + results.SetBoolean("has_md4", verify_result.has_md4); + results.SetBoolean("is_issued_by_known_root", + verify_result.is_issued_by_known_root); + results.SetBoolean("is_issued_by_additional_trust_anchor", + verify_result.is_issued_by_additional_trust_anchor); + results.SetInteger("cert_status", verify_result.cert_status); + results.SetKey("verified_cert", NetLogX509CertificateParams( + verify_result.verified_cert.get())); + + std::unique_ptr<base::ListValue> hashes(new base::ListValue()); + for (auto it = verify_result.public_key_hashes.begin(); + it != verify_result.public_key_hashes.end(); ++it) { + hashes->AppendString(it->ToString()); + } + results.Set("public_key_hashes", std::move(hashes)); + + return std::move(results); +} + +} // namespace + +// Job contains all the state for a single verification using the underlying +// verifier. +class CoalescingCertVerifier::Job { + public: + Job(CoalescingCertVerifier* parent, + const CertVerifier::RequestParams& params, + NetLog* net_log, + bool is_first_job); + ~Job(); + + const CertVerifier::RequestParams& params() const { return params_; } + const CertVerifyResult& verify_result() const { return verify_result_; } + + // Attaches |request|, causing it to be notified once this Job completes. + void AddRequest(CoalescingCertVerifier::Request* request); + + // Stops |request| from being notified. If there are no Requests remaining, + // the Job will be cancelled. + // NOTE: It's only necessary to call this if the Job has not yet completed. + // If the Request has been notified of completion, this should not be called. + void AbortRequest(CoalescingCertVerifier::Request* request); + + // Starts a verification using |underlying_verifier|. If this completes + // synchronously, returns the result code, with the associated result being + // available via |verify_result()|. Otherwise, it will complete + // asynchronously, notifying any Requests associated via |AttachRequest|. + int Start(CertVerifier* underlying_verifier); + + private: + void OnVerifyComplete(int result); + + void LogMetrics(); + + CoalescingCertVerifier* parent_verifier_; + const CertVerifier::RequestParams params_; + const NetLogWithSource net_log_; + bool is_first_job_ = false; + CertVerifyResult verify_result_; + + base::TimeTicks start_time_; + std::unique_ptr<CertVerifier::Request> pending_request_; + + base::LinkedList<CoalescingCertVerifier::Request> attached_requests_; + base::WeakPtrFactory<Job> weak_ptr_factory_{this}; +}; + +// Tracks the state associated with a single CoalescingCertVerifier::Verify +// request. +// +// There are two ways for requests to be cancelled: +// - The caller of Verify() can delete the Request object, indicating +// they are no longer interested in this particular request. +// - The caller can delete the CoalescingCertVerifier, which should cause +// all in-process Jobs to be aborted and deleted. Any Requests attached to +// Jobs should be orphaned, and do nothing when the Request is (eventually) +// deleted. +class CoalescingCertVerifier::Request + : public base::LinkNode<CoalescingCertVerifier::Request>, + public CertVerifier::Request { + public: + // Create a request that will be attached to |job|, and will notify + // |callback| and fill |verify_result| if the Job completes successfully. + // If the Request is deleted, or the Job is deleted, |callback| will not + // be notified. + Request(CoalescingCertVerifier::Job* job, + CertVerifyResult* verify_result, + CompletionOnceCallback callback, + const NetLogWithSource& net_log); + + ~Request() override; + + const NetLogWithSource& net_log() const { return net_log_; } + + // Called by Job to complete the requests (either successfully or as a sign + // that the underlying Job is going away). + void Complete(int result); + + // Called when |job_| is being deleted, to ensure that the Request does not + // attempt to access the Job further. No callbacks will be invoked, + // consistent with the CoalescingCertVerifier's contract. + void OnJobAbort(); + + private: + CoalescingCertVerifier::Job* job_; + + CertVerifyResult* verify_result_; + CompletionOnceCallback callback_; + const NetLogWithSource net_log_; +}; + +CoalescingCertVerifier::Job::Job(CoalescingCertVerifier* parent, + const CertVerifier::RequestParams& params, + NetLog* net_log, + bool is_first_job) + : parent_verifier_(parent), + params_(params), + net_log_( + NetLogWithSource::Make(net_log, NetLogSourceType::CERT_VERIFIER_JOB)), + is_first_job_(is_first_job) {} + +CoalescingCertVerifier::Job::~Job() { + // If there was at least one outstanding Request still pending, then this + // Job was aborted, rather than being completed normally and cleaned up. + if (!attached_requests_.empty() && pending_request_) { + net_log_.AddEvent(NetLogEventType::CANCELLED); + net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB); + } + + while (!attached_requests_.empty()) { + auto* link_node = attached_requests_.head(); + link_node->RemoveFromList(); + link_node->value()->OnJobAbort(); + } +} + +void CoalescingCertVerifier::Job::AddRequest( + CoalescingCertVerifier::Request* request) { + // There must be a pending asynchronous verification in process. + DCHECK(pending_request_); + + request->net_log().AddEventReferencingSource( + NetLogEventType::CERT_VERIFIER_REQUEST_BOUND_TO_JOB, net_log_.source()); + attached_requests_.Append(request); +} + +void CoalescingCertVerifier::Job::AbortRequest( + CoalescingCertVerifier::Request* request) { + // Check to make sure |request| hasn't already been removed. + DCHECK(request->previous() || request->next()); + + request->RemoveFromList(); + + // If there are no more pending requests, abort. This isn't strictly + // necessary; the request could be allowed to run to completion (and + // potentially to allow later Requests to join in), but in keeping with the + // idea of providing more stable guarantees about resources, clean up early. + if (attached_requests_.empty()) { + // If this was the last Request, then the Job had not yet completed; this + // matches the logic in the dtor, which handles when it's the Job that is + // deleted first, rather than the last Request. + net_log_.AddEvent(NetLogEventType::CANCELLED); + net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB); + + // DANGER: This will cause |this_| to be deleted! + parent_verifier_->RemoveJob(this); + return; + } +} + +int CoalescingCertVerifier::Job::Start(CertVerifier* underlying_verifier) { + // Requests are only attached for asynchronous completion, so they must + // always be attached after Start() has been called. + DCHECK(attached_requests_.empty()); + // There should not be a pending request already started (e.g. Start called + // multiple times). + DCHECK(!pending_request_); + + net_log_.BeginEvent(NetLogEventType::CERT_VERIFIER_JOB, [&] { + return NetLogX509CertificateParams(params_.certificate().get()); + }); + + verify_result_.Reset(); + + start_time_ = base::TimeTicks::Now(); + int result = underlying_verifier->Verify( + params_, &verify_result_, + // Safe, because |verify_request_| is self-owned and guarantees the + // callback won't be called if |this| is deleted. + base::Bind(&CoalescingCertVerifier::Job::OnVerifyComplete, + base::Unretained(this)), + &pending_request_, net_log_); + if (result != ERR_IO_PENDING) { + LogMetrics(); + net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB, + [&] { return CertVerifyResultParams(verify_result_); }); + } + + return result; +} + +void CoalescingCertVerifier::Job::OnVerifyComplete(int result) { + LogMetrics(); + + pending_request_.reset(); // Reset to signal clean completion. + net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB, + [&] { return CertVerifyResultParams(verify_result_); }); + + // It's possible that during the process of invoking a callback for a + // Request, |this| may get deleted (along with the associated parent). If + // that happens, it's important to ensure that processing of the Job is + // stopped - i.e. no other callbacks are invoked for other Requests, nor is + // |this| accessed. + // + // To help detect and protect against this, a WeakPtr to |this| is taken. If + // |this| is deleted, the destructor will have invalidated the WeakPtr. + // + // Note that if a Job had already been deleted, this method would not have + // been invoked in the first place, as the Job (via |pending_request_|) owns + // the underlying CertVerifier::Request that this method was bound to as a + // callback. This is why it's OK to grab the WeakPtr from |this| initially. + base::WeakPtr<Job> weak_this = weak_ptr_factory_.GetWeakPtr(); + while (!attached_requests_.empty()) { + // Note: It's also possible for additional Requests to be attached to the + // current Job while processing a Request. + auto* link_node = attached_requests_.head(); + link_node->RemoveFromList(); + + // Note: |this| MAY be deleted here. + // - If the CoalescingCertVerifier is deleted, it will delete the + // Jobs (including |this|) + // - If this is the second-to-last Request, and the completion of this + // event causes the other Request to be deleted, detaching that Request + // from this Job will lead to this Job being deleted (via + // Job::AbortRequest()) + link_node->value()->Complete(result); + + // Check if |this| has been deleted (which implicitly includes + // |parent_verifier_|), and abort if so, since no further cleanup is + // needed. + if (!weak_this) + return; + } + + // DANGER: |this| will be invalidated (deleted) after this point. + return parent_verifier_->RemoveJob(this); +} + +void CoalescingCertVerifier::Job::LogMetrics() { + base::TimeDelta latency = base::TimeTicks::Now() - start_time_; + UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency", latency, + base::TimeDelta::FromMilliseconds(1), + base::TimeDelta::FromMinutes(10), 100); + if (is_first_job_) { + UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_First_Job_Latency", latency, + base::TimeDelta::FromMilliseconds(1), + base::TimeDelta::FromMinutes(10), 100); + } +} + +CoalescingCertVerifier::Request::Request(CoalescingCertVerifier::Job* job, + CertVerifyResult* verify_result, + CompletionOnceCallback callback, + const NetLogWithSource& net_log) + : job_(job), + verify_result_(verify_result), + callback_(std::move(callback)), + net_log_(net_log) { + net_log_.BeginEvent(NetLogEventType::CERT_VERIFIER_REQUEST); +} + +CoalescingCertVerifier::Request::~Request() { + if (job_) { + net_log_.AddEvent(NetLogEventType::CANCELLED); + net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_REQUEST); + + // If the Request is deleted before the Job, then detach from the Job. + // Note: This may cause |job_| to be deleted. + job_->AbortRequest(this); + job_ = nullptr; + } +} + +void CoalescingCertVerifier::Request::Complete(int result) { + *verify_result_ = job_->verify_result(); + + // On successful completion, the Job removes the Request from its set; + // similarly, break the association here so that when the Request is + // deleted, it does not try to abort the (now-completed) Job. + job_ = nullptr; + + net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_REQUEST); + + // Run |callback_|, which may delete |this|. + std::move(callback_).Run(result); +} + +void CoalescingCertVerifier::Request::OnJobAbort() { + // If the Job is deleted before the Request, just clean up. The Request will + // eventually be deleted by the caller. + net_log_.AddEvent(NetLogEventType::CANCELLED); + net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_REQUEST); + + job_ = nullptr; +} + +CoalescingCertVerifier::CoalescingCertVerifier( + std::unique_ptr<CertVerifier> verifier) + : verifier_(std::move(verifier)), + config_id_(0), + requests_(0), + inflight_joins_(0) {} + +CoalescingCertVerifier::~CoalescingCertVerifier() = default; + +int CoalescingCertVerifier::Verify( + const RequestParams& params, + CertVerifyResult* verify_result, + CompletionOnceCallback callback, + std::unique_ptr<CertVerifier::Request>* out_req, + const NetLogWithSource& net_log) { + DCHECK(verify_result); + DCHECK(!callback.is_null()); + + out_req->reset(); + ++requests_; + + Job* job = FindJob(params); + if (job) { + // An identical request is in-flight and joinable, so just attach the + // callback. + ++inflight_joins_; + } else { + // No existing Jobs can be used. Create and start a new one. + std::unique_ptr<Job> new_job = + std::make_unique<Job>(this, params, net_log.net_log(), requests_ == 1); + int result = new_job->Start(verifier_.get()); + if (result != ERR_IO_PENDING) { + *verify_result = new_job->verify_result(); + return result; + } + + job = new_job.get(); + joinable_jobs_[params] = std::move(new_job); + } + + std::unique_ptr<CoalescingCertVerifier::Request> request = + std::make_unique<CoalescingCertVerifier::Request>( + job, verify_result, std::move(callback), net_log); + job->AddRequest(request.get()); + *out_req = std::move(request); + return ERR_IO_PENDING; +} + +void CoalescingCertVerifier::SetConfig(const CertVerifier::Config& config) { + ++config_id_; + verifier_->SetConfig(config); + + for (auto& job : joinable_jobs_) { + inflight_jobs_.emplace_back(std::move(job.second)); + } + joinable_jobs_.clear(); +} + +CoalescingCertVerifier::Job* CoalescingCertVerifier::FindJob( + const RequestParams& params) { + auto it = joinable_jobs_.find(params); + if (it != joinable_jobs_.end()) + return it->second.get(); + return nullptr; +} + +void CoalescingCertVerifier::RemoveJob(Job* job) { + // See if this was a job from the current configuration generation. + // Note: It's also necessary to compare that the underlying pointer is the + // same, and not merely a Job with the same parameters. + auto joinable_it = joinable_jobs_.find(job->params()); + if (joinable_it != joinable_jobs_.end() && joinable_it->second.get() == job) { + joinable_jobs_.erase(joinable_it); + return; + } + + // Otherwise, it MUST have been a job from a previous generation. + auto inflight_it = std::find_if(inflight_jobs_.begin(), inflight_jobs_.end(), + base::MatchesUniquePtr(job)); + DCHECK(inflight_it != inflight_jobs_.end()); + inflight_jobs_.erase(inflight_it); + return; +} + +} // namespace net
diff --git a/net/cert/coalescing_cert_verifier.h b/net/cert/coalescing_cert_verifier.h new file mode 100644 index 0000000..60b4682 --- /dev/null +++ b/net/cert/coalescing_cert_verifier.h
@@ -0,0 +1,80 @@ +// 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 NET_CERT_COALESCING_CERT_VERIFIER_H_ +#define NET_CERT_COALESCING_CERT_VERIFIER_H_ + +#include <stdint.h> + +#include <map> +#include <memory> +#include <vector> + +#include "base/macros.h" +#include "net/base/net_export.h" +#include "net/cert/cert_verifier.h" + +namespace net { + +// CoalescingCertVerifier is a CertVerifier that keeps track of in-flight +// CertVerifier Verify() requests. If a new call to Verify() is started that +// matches the same parameters as an in-progress verification, the new +// Verify() call will be joined to the existing, in-progress verification, +// completing when it does. If no in-flight requests match, a new request to +// the underlying verifier will be started. +// +// If the underlying configuration changes, existing requests are allowed to +// complete, but any new requests will not be seen as matching, even if they +// share the same parameters. This ensures configuration changes propagate +// "immediately" for all new requests. +class NET_EXPORT CoalescingCertVerifier : public CertVerifier { + public: + // Create a new verifier that will forward calls to |verifier|, coalescing + // any in-flight, not-yet-completed calls to Verify(). + explicit CoalescingCertVerifier(std::unique_ptr<CertVerifier> verifier); + + ~CoalescingCertVerifier() override; + + // CertVerifier implementation: + int Verify(const RequestParams& params, + CertVerifyResult* verify_result, + CompletionOnceCallback callback, + std::unique_ptr<CertVerifier::Request>* out_req, + const NetLogWithSource& net_log) override; + void SetConfig(const CertVerifier::Config& config) override; + + uint64_t requests_for_testing() const { return requests_; } + uint64_t inflight_joins_for_testing() const { return inflight_joins_; } + + private: + class Job; + class Request; + + // If there is a pending request that matches |params|, and which can be + // joined (it shares the same config), returns that Job. + // Otherwise, returns nullptr, meaning a new Job should be started. + Job* FindJob(const RequestParams& params); + void RemoveJob(Job* job); + + // Contains the set of Jobs for which an active verification is taking + // place and which can be used for new requests (e.g. the config is the + // same). + std::map<CertVerifier::RequestParams, std::unique_ptr<Job>> joinable_jobs_; + + // Contains all pending Jobs that are in-flight, but cannot be joined, due + // to the configuration having changed since they were started. + std::vector<std::unique_ptr<Job>> inflight_jobs_; + + std::unique_ptr<CertVerifier> verifier_; + + uint32_t config_id_; + uint64_t requests_; + uint64_t inflight_joins_; + + DISALLOW_COPY_AND_ASSIGN(CoalescingCertVerifier); +}; + +} // namespace net + +#endif // NET_CERT_COALESCING_CERT_VERIFIER_H_
diff --git a/net/cert/coalescing_cert_verifier_unittest.cc b/net/cert/coalescing_cert_verifier_unittest.cc new file mode 100644 index 0000000..c90f989 --- /dev/null +++ b/net/cert/coalescing_cert_verifier_unittest.cc
@@ -0,0 +1,518 @@ +// 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 "net/cert/coalescing_cert_verifier.h" + +#include <memory> + +#include "base/bind.h" +#include "base/test/bind_test_util.h" +#include "base/test/metrics/histogram_tester.h" +#include "net/base/net_errors.h" +#include "net/base/test_completion_callback.h" +#include "net/cert/mock_cert_verifier.h" +#include "net/cert/x509_certificate.h" +#include "net/log/net_log_with_source.h" +#include "net/test/cert_test_util.h" +#include "net/test/gtest_util.h" +#include "net/test/test_data_directory.h" +#include "net/test/test_with_task_environment.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using net::test::IsError; +using net::test::IsOk; + +namespace net { + +using CoalescingCertVerifierTest = TestWithTaskEnvironment; + +// Tests that synchronous completion does not cause any issues. +TEST_F(CoalescingCertVerifierTest, SyncCompletion) { + scoped_refptr<X509Certificate> test_cert( + ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); + ASSERT_TRUE(test_cert); + + CertVerifyResult fake_result; + fake_result.verified_cert = test_cert; + + std::unique_ptr<MockCertVerifier> mock_verifier_owner = + std::make_unique<MockCertVerifier>(); + MockCertVerifier* mock_verifier = mock_verifier_owner.get(); + mock_verifier->set_async(false); // Force sync completion. + mock_verifier->AddResultForCert(test_cert, fake_result, OK); + + CoalescingCertVerifier verifier(std::move(mock_verifier_owner)); + + CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0, + /*ocsp_response=*/std::string(), + /*sct_list=*/std::string()); + + CertVerifyResult result1, result2; + TestCompletionCallback callback1, callback2; + std::unique_ptr<CertVerifier::Request> request1, request2; + + // Start an (asynchronous) initial request. + int error = verifier.Verify(request_params, &result1, callback1.callback(), + &request1, NetLogWithSource()); + ASSERT_THAT(error, IsOk()); + ASSERT_FALSE(request1); + ASSERT_TRUE(result1.verified_cert); +} + +// Test that requests with identical parameters only result in a single +// underlying verification; that is, the second Request is joined to the +// in-progress first Request. +TEST_F(CoalescingCertVerifierTest, InflightJoin) { + scoped_refptr<X509Certificate> test_cert( + ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); + ASSERT_TRUE(test_cert); + + base::HistogramTester histograms; + + CertVerifyResult fake_result; + fake_result.verified_cert = test_cert; + + std::unique_ptr<MockCertVerifier> mock_verifier_owner = + std::make_unique<MockCertVerifier>(); + MockCertVerifier* mock_verifier = mock_verifier_owner.get(); + mock_verifier->set_async(true); // Always complete via PostTask + mock_verifier->AddResultForCert(test_cert, fake_result, OK); + + CoalescingCertVerifier verifier(std::move(mock_verifier_owner)); + + CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0, + /*ocsp_response=*/std::string(), + /*sct_list=*/std::string()); + + CertVerifyResult result1, result2; + TestCompletionCallback callback1, callback2; + std::unique_ptr<CertVerifier::Request> request1, request2; + + // Start an (asynchronous) initial request. + int error = verifier.Verify(request_params, &result1, callback1.callback(), + &request1, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request1); + + // Simulate the underlying verifier returning different results if another + // verification is done. + mock_verifier->ClearRules(); + mock_verifier->AddResultForCert(test_cert, fake_result, ERR_CERT_REVOKED); + + // Start a second request; this should join the first request. + error = verifier.Verify(request_params, &result2, callback2.callback(), + &request2, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request2); + + // Ensure only one request was ever started. + EXPECT_EQ(2u, verifier.requests_for_testing()); + EXPECT_EQ(1u, verifier.inflight_joins_for_testing()); + + // Make sure both results completed. + EXPECT_THAT(callback1.WaitForResult(), IsOk()); + EXPECT_THAT(callback2.WaitForResult(), IsOk()); + + // There should only have been one Job started. + histograms.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + histograms.ExpectTotalCount("Net.CertVerifier_First_Job_Latency", 1); +} + +// Test that changing configurations between Requests prevents the second +// Request from being attached to the first Request. There should be two +// Requests to the underlying CertVerifier, and the correct results should be +// received by each. +TEST_F(CoalescingCertVerifierTest, DoesNotJoinAfterConfigChange) { + scoped_refptr<X509Certificate> test_cert( + ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); + ASSERT_TRUE(test_cert); + + base::HistogramTester histograms; + + CertVerifyResult fake_result; + fake_result.verified_cert = test_cert; + + std::unique_ptr<MockCertVerifier> mock_verifier_owner = + std::make_unique<MockCertVerifier>(); + MockCertVerifier* mock_verifier = mock_verifier_owner.get(); + mock_verifier->set_async(true); // Always complete via PostTask + mock_verifier->AddResultForCert(test_cert, fake_result, OK); + + CoalescingCertVerifier verifier(std::move(mock_verifier_owner)); + + CertVerifier::Config config1; + verifier.SetConfig(config1); + + CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0, + /*ocsp_response=*/std::string(), + /*sct_list=*/std::string()); + + CertVerifyResult result1, result2; + TestCompletionCallback callback1, callback2; + std::unique_ptr<CertVerifier::Request> request1, request2; + + // Start an (asynchronous) initial request. + int error = verifier.Verify(request_params, &result1, callback1.callback(), + &request1, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request1); + + // Change the configuration, and change the result to to simulate the + // configuration change affecting behavior. + CertVerifier::Config config2; + config2.enable_rev_checking = !config1.enable_rev_checking; + verifier.SetConfig(config2); + mock_verifier->ClearRules(); + mock_verifier->AddResultForCert(test_cert, fake_result, ERR_CERT_REVOKED); + + // Start a second request; this should not join the first request, as the + // config is different. + error = verifier.Verify(request_params, &result2, callback2.callback(), + &request2, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request2); + + // Ensure a total of two requests were started, and neither were joined. + EXPECT_EQ(2u, verifier.requests_for_testing()); + EXPECT_EQ(0u, verifier.inflight_joins_for_testing()); + + // Make sure both results completed. + EXPECT_THAT(callback1.WaitForResult(), IsOk()); + EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CERT_REVOKED)); + + // There should have been two separate Jobs. + histograms.ExpectTotalCount("Net.CertVerifier_Job_Latency", 2); + histograms.ExpectTotalCount("Net.CertVerifier_First_Job_Latency", 1); +} + +// Test that when two Requests are attached to the same Job, it's safe to +// delete the second Request while processing the response to the first. The +// second Request should not cause the second callback to be called. +TEST_F(CoalescingCertVerifierTest, DeleteSecondRequestDuringFirstCompletion) { + scoped_refptr<X509Certificate> test_cert( + ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); + ASSERT_TRUE(test_cert); + + CertVerifyResult fake_result; + fake_result.verified_cert = test_cert; + + std::unique_ptr<MockCertVerifier> mock_verifier_owner = + std::make_unique<MockCertVerifier>(); + MockCertVerifier* mock_verifier = mock_verifier_owner.get(); + mock_verifier->set_async(true); // Always complete via PostTask + mock_verifier->AddResultForCert(test_cert, fake_result, OK); + + CoalescingCertVerifier verifier(std::move(mock_verifier_owner)); + + CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0, + /*ocsp_response=*/std::string(), + /*sct_list=*/std::string()); + + CertVerifyResult result1, result2; + TestCompletionCallback callback1, callback2; + std::unique_ptr<CertVerifier::Request> request1, request2; + + // Start an (asynchronous) initial request. When this request is completed, + // it will delete (reset) |request2|, which should prevent it from being + // called. + int error = verifier.Verify( + request_params, &result1, + base::BindLambdaForTesting([&callback1, &request2](int result) { + request2.reset(); + callback1.callback().Run(result); + }), + &request1, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request1); + + // Start a second request; this should join the first request. + error = verifier.Verify(request_params, &result2, callback2.callback(), + &request2, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request2); + + // Ensure only one underlying verification was started. + ASSERT_EQ(2u, verifier.requests_for_testing()); + ASSERT_EQ(1u, verifier.inflight_joins_for_testing()); + + // Make sure that only the first callback is invoked; because the second + // CertVerifier::Request was deleted during processing the first's callback, + // the second callback should not be invoked. + EXPECT_THAT(callback1.WaitForResult(), IsOk()); + ASSERT_FALSE(callback2.have_result()); + ASSERT_FALSE(request2); + + // While CoalescingCertVerifier doesn't use PostTask, make sure to flush the + // tasks as well, in case the implementation changes in the future. + RunUntilIdle(); + ASSERT_FALSE(callback2.have_result()); + ASSERT_FALSE(request2); +} + +// Test that it's safe to delete the CoalescingCertVerifier during completion, +// even when there are outstanding Requests to be processed. The additional +// Requests should not invoke the user callback once the +// CoalescingCertVerifier is deleted. +TEST_F(CoalescingCertVerifierTest, DeleteVerifierDuringCompletion) { + scoped_refptr<X509Certificate> test_cert( + ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); + ASSERT_TRUE(test_cert); + + CertVerifyResult fake_result; + fake_result.verified_cert = test_cert; + + std::unique_ptr<MockCertVerifier> mock_verifier_owner = + std::make_unique<MockCertVerifier>(); + MockCertVerifier* mock_verifier = mock_verifier_owner.get(); + mock_verifier->set_async(true); // Always complete via PostTask + mock_verifier->AddResultForCert(test_cert, fake_result, OK); + + auto verifier = + std::make_unique<CoalescingCertVerifier>(std::move(mock_verifier_owner)); + + CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0, + /*ocsp_response=*/std::string(), + /*sct_list=*/std::string()); + + CertVerifyResult result1, result2; + TestCompletionCallback callback1, callback2; + std::unique_ptr<CertVerifier::Request> request1, request2; + + // Start an (asynchronous) initial request. When this request is completed, + // it will delete (reset) |request2|, which should prevent it from being + // called. + int error = verifier->Verify( + request_params, &result1, + base::BindLambdaForTesting([&callback1, &verifier](int result) { + verifier.reset(); + callback1.callback().Run(result); + }), + &request1, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request1); + + // Start a second request; this should join the first request. + error = verifier->Verify(request_params, &result2, callback2.callback(), + &request2, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request2); + + // Ensure only one underlying verification was started. + ASSERT_EQ(2u, verifier->requests_for_testing()); + ASSERT_EQ(1u, verifier->inflight_joins_for_testing()); + + // Make sure that only the first callback is invoked. This will delete the + // underlying CoalescingCertVerifier, which should prevent the second + // request's callback from being invoked. + EXPECT_THAT(callback1.WaitForResult(), IsOk()); + ASSERT_FALSE(callback2.have_result()); + ASSERT_TRUE(request2); + + // While CoalescingCertVerifier doesn't use PostTask, make sure to flush the + // tasks as well, in case the implementation changes in the future. + RunUntilIdle(); + ASSERT_FALSE(callback2.have_result()); + ASSERT_TRUE(request2); +} + +// Test that it's safe to delete a Request before the underlying verifier has +// completed. This is a guard against memory safety (e.g. when this Request +// is the last/only Request remaining). +TEST_F(CoalescingCertVerifierTest, DeleteRequestBeforeCompletion) { + scoped_refptr<X509Certificate> test_cert( + ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); + ASSERT_TRUE(test_cert); + + CertVerifyResult fake_result; + fake_result.verified_cert = test_cert; + + std::unique_ptr<MockCertVerifier> mock_verifier_owner = + std::make_unique<MockCertVerifier>(); + MockCertVerifier* mock_verifier = mock_verifier_owner.get(); + mock_verifier->set_async(true); // Always complete via PostTask + mock_verifier->AddResultForCert(test_cert, fake_result, OK); + + CoalescingCertVerifier verifier(std::move(mock_verifier_owner)); + + CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0, + /*ocsp_response=*/std::string(), + /*sct_list=*/std::string()); + + CertVerifyResult result1; + TestCompletionCallback callback1; + std::unique_ptr<CertVerifier::Request> request1; + + // Start an (asynchronous) initial request. + int error = verifier.Verify(request_params, &result1, callback1.callback(), + &request1, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request1); + + // Abandon the request before it's completed. + request1.reset(); + EXPECT_FALSE(callback1.have_result()); + + // Make sure the request never completes / the callback is never invoked. + RunUntilIdle(); + EXPECT_FALSE(callback1.have_result()); +} + +// Test that it's safe to delete a Request before the underlying verifier has +// completed. This is a correctness test, to ensure that other Requests are +// still notified. +TEST_F(CoalescingCertVerifierTest, + DeleteFirstRequestBeforeCompletionStillCompletesSecondRequest) { + scoped_refptr<X509Certificate> test_cert( + ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); + ASSERT_TRUE(test_cert); + + CertVerifyResult fake_result; + fake_result.verified_cert = test_cert; + + std::unique_ptr<MockCertVerifier> mock_verifier_owner = + std::make_unique<MockCertVerifier>(); + MockCertVerifier* mock_verifier = mock_verifier_owner.get(); + mock_verifier->set_async(true); // Always complete via PostTask + mock_verifier->AddResultForCert(test_cert, fake_result, OK); + + CoalescingCertVerifier verifier(std::move(mock_verifier_owner)); + + CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0, + /*ocsp_response=*/std::string(), + /*sct_list=*/std::string()); + + CertVerifyResult result1, result2; + TestCompletionCallback callback1, callback2; + std::unique_ptr<CertVerifier::Request> request1, request2; + + // Start an (asynchronous) initial request. + int error = verifier.Verify(request_params, &result1, callback1.callback(), + &request1, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request1); + + // Start a second request; this should join the first request. + error = verifier.Verify(request_params, &result2, callback2.callback(), + &request2, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request2); + + // Ensure only one underlying verification was started. + ASSERT_EQ(2u, verifier.requests_for_testing()); + ASSERT_EQ(1u, verifier.inflight_joins_for_testing()); + + // Abandon the first request before it's completed. + request1.reset(); + + // Make sure the first request never completes / the callback is never + // invoked, while the second request completes normally. + EXPECT_THAT(callback2.WaitForResult(), IsOk()); + EXPECT_FALSE(callback1.have_result()); + + // Simulate the second request going away during processing. + request2.reset(); + + // Flush any events, although there should not be any. + RunUntilIdle(); + EXPECT_FALSE(callback1.have_result()); +} + +TEST_F(CoalescingCertVerifierTest, DeleteRequestDuringCompletion) { + scoped_refptr<X509Certificate> test_cert( + ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); + ASSERT_TRUE(test_cert); + + CertVerifyResult fake_result; + fake_result.verified_cert = test_cert; + + std::unique_ptr<MockCertVerifier> mock_verifier_owner = + std::make_unique<MockCertVerifier>(); + MockCertVerifier* mock_verifier = mock_verifier_owner.get(); + mock_verifier->set_async(true); // Always complete via PostTask + mock_verifier->AddResultForCert(test_cert, fake_result, OK); + + CoalescingCertVerifier verifier(std::move(mock_verifier_owner)); + + CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0, + /*ocsp_response=*/std::string(), + /*sct_list=*/std::string()); + + CertVerifyResult result1; + TestCompletionCallback callback1; + std::unique_ptr<CertVerifier::Request> request1; + + // Start an (asynchronous) initial request. + int error = verifier.Verify( + request_params, &result1, + base::BindLambdaForTesting([&callback1, &request1](int result) { + // Delete the Request during the completion callback. This should be + // perfectly safe, and not cause any memory trouble, because the + // Request was already detached from the Job prior to being invoked. + request1.reset(); + callback1.callback().Run(result); + }), + &request1, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request1); + + // The result should be available, even though the request is deleted + // during the result processing. This should not cause any memory errors. + EXPECT_THAT(callback1.WaitForResult(), IsOk()); +} + +TEST_F(CoalescingCertVerifierTest, DeleteVerifierBeforeRequest) { + scoped_refptr<X509Certificate> test_cert( + ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); + ASSERT_TRUE(test_cert); + + base::HistogramTester histograms; + + CertVerifyResult fake_result; + fake_result.verified_cert = test_cert; + + std::unique_ptr<MockCertVerifier> mock_verifier_owner = + std::make_unique<MockCertVerifier>(); + MockCertVerifier* mock_verifier = mock_verifier_owner.get(); + mock_verifier->set_async(true); // Always complete via PostTask + mock_verifier->AddResultForCert(test_cert, fake_result, OK); + + auto verifier = + std::make_unique<CoalescingCertVerifier>(std::move(mock_verifier_owner)); + + CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0, + /*ocsp_response=*/std::string(), + /*sct_list=*/std::string()); + + CertVerifyResult result1; + TestCompletionCallback callback1; + std::unique_ptr<CertVerifier::Request> request1; + + // Start an (asynchronous) initial request. + int error = verifier->Verify(request_params, &result1, callback1.callback(), + &request1, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request1); + + // Delete the CoalescingCertVerifier first. This should orphan all + // outstanding Requests and delete all associated Jobs. + verifier.reset(); + + // Flush any pending tasks; there should not be any, at this point, but use + // it in case the implementation changes. + RunUntilIdle(); + + // Make sure the callback was never called. + EXPECT_FALSE(callback1.have_result()); + + // Delete the Request. This should be a no-op as the Request was orphaned + // when the CoalescingCertVerifier was deleted. + request1.reset(); + + // There should not have been any histograms logged. + histograms.ExpectTotalCount("Net.CertVerifier_Job_Latency", 0); + histograms.ExpectTotalCount("Net.CertVerifier_First_Job_Latency", 0); +} + +} // namespace net
diff --git a/net/cert/mock_cert_verifier.cc b/net/cert/mock_cert_verifier.cc index e65dadb..1660818 100644 --- a/net/cert/mock_cert_verifier.cc +++ b/net/cert/mock_cert_verifier.cc
@@ -99,6 +99,10 @@ rules_.push_back(Rule(std::move(cert), host_pattern, verify_result, rv)); } +void MockCertVerifier::ClearRules() { + rules_.clear(); +} + int MockCertVerifier::VerifyImpl(const RequestParams& params, CertVerifyResult* verify_result) { for (const Rule& rule : rules_) {
diff --git a/net/cert/mock_cert_verifier.h b/net/cert/mock_cert_verifier.h index 6c34a06..66b82c7 100644 --- a/net/cert/mock_cert_verifier.h +++ b/net/cert/mock_cert_verifier.h
@@ -58,6 +58,9 @@ const CertVerifyResult& verify_result, int rv); + // Clear all existing rules. + void ClearRules(); + private: struct Rule; using RuleList = std::list<Rule>;
diff --git a/net/cert/multi_threaded_cert_verifier.cc b/net/cert/multi_threaded_cert_verifier.cc index 32222db..7c76599 100644 --- a/net/cert/multi_threaded_cert_verifier.cc +++ b/net/cert/multi_threaded_cert_verifier.cc
@@ -4,34 +4,18 @@ #include "net/cert/multi_threaded_cert_verifier.h" -#include <algorithm> -#include <iterator> -#include <utility> - #include "base/bind.h" #include "base/bind_helpers.h" -#include "base/compiler_specific.h" -#include "base/containers/linked_list.h" -#include "base/memory/ptr_util.h" -#include "base/metrics/histogram_macros.h" +#include "base/memory/weak_ptr.h" #include "base/task/post_task.h" #include "base/threading/thread_restrictions.h" -#include "base/time/time.h" #include "base/trace_event/trace_event.h" -#include "base/values.h" -#include "net/base/hash_value.h" #include "net/base/net_errors.h" #include "net/base/trace_constants.h" #include "net/cert/cert_verify_proc.h" #include "net/cert/cert_verify_result.h" #include "net/cert/crl_set.h" #include "net/cert/x509_certificate.h" -#include "net/cert/x509_certificate_net_log_param.h" -#include "net/log/net_log_capture_mode.h" -#include "net/log/net_log_event_type.h" -#include "net/log/net_log_source.h" -#include "net/log/net_log_source_type.h" -#include "net/log/net_log_with_source.h" namespace net { @@ -43,67 +27,8 @@ class MultiThreadedCertVerifierScopedAllowBaseSyncPrimitives : public base::ScopedAllowBaseSyncPrimitives {}; -//////////////////////////////////////////////////////////////////////////// -// -// MultiThreadedCertVerifier is a thread-unsafe object which lives, dies, and is -// operated on a single thread, henceforth referred to as the "origin" thread. -// -// When an incoming Verify() request is received, MultiThreadedCertVerifier -// checks if there is an outstanding "job" (CertVerifierJob) in progress that -// can service the request. If there is, the request is attached to that job. -// Otherwise a new job is started. -// -// A job (CertVerifierJob) is a way to de-duplicate requests that are -// fundamentally doing the same verification. CertVerifierJob is similarly -// thread-unsafe and lives on the origin thread. -// -// To do the actual work, CertVerifierJob posts a task to ThreadPool -// (PostTaskAndReply), and on completion notifies all requests attached to it. -// -// Cancellation: -// -// There are two ways for a request to be cancelled. -// -// (1) When the caller explicitly frees the Request. -// -// If the request was in-flight (attached to a job), then it is detached. -// Note that no effort is made to reap jobs which have no attached requests. -// (Because the worker task isn't cancelable). -// -// (2) When the MultiThreadedCertVerifier is deleted. -// -// This automatically cancels all outstanding requests. This is accomplished -// by deleting each of the jobs owned by the MultiThreadedCertVerifier, -// whose destructor in turn marks each attached request as canceled. -// -// TODO(eroman): If the MultiThreadedCertVerifier is deleted from within a -// callback, the remaining requests in the completing job will NOT be cancelled. - namespace { -base::Value CertVerifyResultParams(const CertVerifyResult& verify_result) { - base::DictionaryValue results; - results.SetBoolean("has_md5", verify_result.has_md5); - results.SetBoolean("has_md2", verify_result.has_md2); - results.SetBoolean("has_md4", verify_result.has_md4); - results.SetBoolean("is_issued_by_known_root", - verify_result.is_issued_by_known_root); - results.SetBoolean("is_issued_by_additional_trust_anchor", - verify_result.is_issued_by_additional_trust_anchor); - results.SetInteger("cert_status", verify_result.cert_status); - results.SetKey("verified_cert", NetLogX509CertificateParams( - verify_result.verified_cert.get())); - - std::unique_ptr<base::ListValue> hashes(new base::ListValue()); - for (auto it = verify_result.public_key_hashes.begin(); - it != verify_result.public_key_hashes.end(); ++it) { - hashes->AppendString(it->ToString()); - } - results.Set("public_key_hashes", std::move(hashes)); - - return std::move(results); -} - // Used to pass the result of CertVerifierJob::DoVerifyOnWorkerThread() to // CertVerifierJob::OnJobCompleted(). struct ResultHelper { @@ -126,65 +51,6 @@ return flags; } -} // namespace - -// Represents the output and result callback of a request. The -// CertVerifierRequest is owned by the caller that initiated the call to -// CertVerifier::Verify(). -class CertVerifierRequest : public base::LinkNode<CertVerifierRequest>, - public CertVerifier::Request { - public: - CertVerifierRequest(CertVerifierJob* job, - CompletionOnceCallback callback, - CertVerifyResult* verify_result, - const NetLogWithSource& net_log) - : job_(job), - callback_(std::move(callback)), - verify_result_(verify_result), - net_log_(net_log) { - net_log_.BeginEvent(NetLogEventType::CERT_VERIFIER_REQUEST); - } - - // Cancels the request. - ~CertVerifierRequest() override { - if (job_) { - // Cancel the outstanding request. - net_log_.AddEvent(NetLogEventType::CANCELLED); - net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_REQUEST); - - // Remove the request from the Job. No attempt is made to cancel the job - // even though it may no longer have any requests attached to it. Because - // it is running on a worker thread aborting it isn't feasible. - RemoveFromList(); - } - } - - // Copies the contents of |verify_result| to the caller's - // CertVerifyResult and calls the callback. - void Post(const ResultHelper& verify_result) { - DCHECK(job_); - job_ = nullptr; - - net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_REQUEST); - *verify_result_ = verify_result.result; - - std::move(callback_).Run(verify_result.error); - } - - void OnJobCancelled() { - job_ = nullptr; - callback_.Reset(); - } - - const NetLogWithSource& net_log() const { return net_log_; } - - private: - CertVerifierJob* job_; // Not owned. - CompletionOnceCallback callback_; - CertVerifyResult* verify_result_; - const NetLogWithSource net_log_; -}; - // DoVerifyOnWorkerThread runs the verification synchronously on a worker // thread. std::unique_ptr<ResultHelper> DoVerifyOnWorkerThread( @@ -210,149 +76,69 @@ return verify_result; } -// CertVerifierJob lives only on the verifier's origin message loop. -class CertVerifierJob { +// Helper to allow callers to cancel pending CertVerifier::Verify requests. +// Note that because the CertVerifyProc is blocking, it's not actually +// possible to cancel the in-progress request; instead, this simply guarantees +// that the provided callback will not be invoked if the Request is deleted. +class InternalRequest : public CertVerifier::Request { public: - CertVerifierJob(const CertVerifier::RequestParams& key, - NetLog* net_log, - MultiThreadedCertVerifier* cert_verifier) - : key_(key), - start_time_(base::TimeTicks::Now()), - net_log_(NetLogWithSource::Make(net_log, - NetLogSourceType::CERT_VERIFIER_JOB)), - cert_verifier_(cert_verifier), - is_first_job_(false) { - net_log_.BeginEvent(NetLogEventType::CERT_VERIFIER_JOB, [&] { - return NetLogX509CertificateParams(key.certificate().get()); - }); - } + InternalRequest(CompletionOnceCallback callback, + CertVerifyResult* caller_result); + ~InternalRequest() override; - // Indicates whether this was the first job started by the CertVerifier. This - // is only used for logging certain UMA stats. - void set_is_first_job(bool is_first_job) { is_first_job_ = is_first_job; } - - const CertVerifier::RequestParams& key() const { return key_; } - - // Posts a task to ThreadPool to do the verification. Once the verification - // has completed, it will call OnJobCompleted() on the origin thread. void Start(const scoped_refptr<CertVerifyProc>& verify_proc, const CertVerifier::Config& config, - uint32_t config_id) { - int flags = GetFlagsForConfig(config); - if (key_.flags() & CertVerifier::VERIFY_DISABLE_NETWORK_FETCHES) { - flags &= ~CertVerifyProc::VERIFY_REV_CHECKING_ENABLED; - flags &= ~CertVerifyProc::VERIFY_REV_CHECKING_REQUIRED_LOCAL_ANCHORS; - } - DCHECK(config.crl_set); - base::PostTaskAndReplyWithResult( - FROM_HERE, - {base::ThreadPool(), base::MayBlock(), - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, - base::BindOnce(&DoVerifyOnWorkerThread, verify_proc, key_.certificate(), - key_.hostname(), key_.ocsp_response(), key_.sct_list(), - flags, config.crl_set, config.additional_trust_anchors), - base::BindOnce(&CertVerifierJob::OnJobCompleted, - weak_ptr_factory_.GetWeakPtr(), config_id)); - } - - ~CertVerifierJob() { - // If the job is in progress, cancel it. - if (cert_verifier_) { - cert_verifier_ = nullptr; - - net_log_.AddEvent(NetLogEventType::CANCELLED); - net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB); - - // Notify each request of the cancellation. - for (base::LinkNode<CertVerifierRequest>* it = requests_.head(); - it != requests_.end(); it = it->next()) { - it->value()->OnJobCancelled(); - } - } - } - - // Creates and attaches a request to the Job. - std::unique_ptr<CertVerifierRequest> CreateRequest( - CompletionOnceCallback callback, - CertVerifyResult* verify_result, - const NetLogWithSource& net_log) { - std::unique_ptr<CertVerifierRequest> request(new CertVerifierRequest( - this, std::move(callback), verify_result, net_log)); - - request->net_log().AddEventReferencingSource( - NetLogEventType::CERT_VERIFIER_REQUEST_BOUND_TO_JOB, net_log_.source()); - - requests_.Append(request.get()); - return request; - } + const CertVerifier::RequestParams& params); private: - using RequestList = base::LinkedList<CertVerifierRequest>; + void OnJobComplete(std::unique_ptr<ResultHelper> verify_result); - // Called on completion of the Job to log UMA metrics and NetLog events. - void LogMetrics(const ResultHelper& verify_result) { - net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB, [&] { - return CertVerifyResultParams(verify_result.result); - }); - base::TimeDelta latency = base::TimeTicks::Now() - start_time_; - if (cert_verifier_->should_record_histograms_) { - UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency", latency, - base::TimeDelta::FromMilliseconds(1), - base::TimeDelta::FromMinutes(10), 100); - if (is_first_job_) { - UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_First_Job_Latency", - latency, - base::TimeDelta::FromMilliseconds(1), - base::TimeDelta::FromMinutes(10), 100); - } - } - } + CompletionOnceCallback callback_; + CertVerifyResult* caller_result_; - void OnJobCompleted(uint32_t config_id, - std::unique_ptr<ResultHelper> verify_result) { - TRACE_EVENT0(NetTracingCategory(), "CertVerifierJob::OnJobCompleted"); - std::unique_ptr<CertVerifierJob> keep_alive = - cert_verifier_->RemoveJob(this); - - LogMetrics(*verify_result); - if (cert_verifier_->verify_complete_callback_ && - config_id == cert_verifier_->config_id_) { - cert_verifier_->verify_complete_callback_.Run( - key_, net_log_, verify_result->error, verify_result->result, - base::TimeTicks::Now() - start_time_, is_first_job_); - } - cert_verifier_ = nullptr; - - // TODO(eroman): If the cert_verifier_ is deleted from within one of the - // callbacks, any remaining requests for that job should be cancelled. Right - // now they will be called. - while (!requests_.empty()) { - base::LinkNode<CertVerifierRequest>* request = requests_.head(); - request->RemoveFromList(); - request->value()->Post(*verify_result); - } - } - - const CertVerifier::RequestParams key_; - // The tick count of when the job started. This is used to measure how long - // the job actually took to complete. - const base::TimeTicks start_time_; - - RequestList requests_; // Non-owned. - - const NetLogWithSource net_log_; - MultiThreadedCertVerifier* cert_verifier_; // Non-owned. - - bool is_first_job_; - base::WeakPtrFactory<CertVerifierJob> weak_ptr_factory_{this}; + base::WeakPtrFactory<InternalRequest> weak_factory_{this}; }; +InternalRequest::InternalRequest(CompletionOnceCallback callback, + CertVerifyResult* caller_result) + : callback_(std::move(callback)), caller_result_(caller_result) {} + +InternalRequest::~InternalRequest() = default; + +void InternalRequest::Start(const scoped_refptr<CertVerifyProc>& verify_proc, + const CertVerifier::Config& config, + const CertVerifier::RequestParams& params) { + int flags = GetFlagsForConfig(config); + if (params.flags() & CertVerifier::VERIFY_DISABLE_NETWORK_FETCHES) { + flags &= ~CertVerifyProc::VERIFY_REV_CHECKING_ENABLED; + flags &= ~CertVerifyProc::VERIFY_REV_CHECKING_REQUIRED_LOCAL_ANCHORS; + } + DCHECK(config.crl_set); + base::PostTaskAndReplyWithResult( + FROM_HERE, + {base::ThreadPool(), base::MayBlock(), + base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, + base::BindOnce(&DoVerifyOnWorkerThread, verify_proc, params.certificate(), + params.hostname(), params.ocsp_response(), + params.sct_list(), flags, config.crl_set, + config.additional_trust_anchors), + base::BindOnce(&InternalRequest::OnJobComplete, + weak_factory_.GetWeakPtr())); +} + +void InternalRequest::OnJobComplete( + std::unique_ptr<ResultHelper> verify_result) { + *caller_result_ = verify_result->result; + // Note: May delete |this|. + std::move(callback_).Run(verify_result->error); +} + +} // namespace + MultiThreadedCertVerifier::MultiThreadedCertVerifier( scoped_refptr<CertVerifyProc> verify_proc) - : config_id_(0), - requests_(0), - inflight_joins_(0), - verify_proc_(verify_proc) { + : verify_proc_(std::move(verify_proc)) { + // Guarantee there is always a CRLSet (this can be overridden via SetConfig). config_.crl_set = CRLSet::BuiltinCRLSet(); } @@ -360,17 +146,6 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); } -// static -std::unique_ptr<MultiThreadedCertVerifier> -MultiThreadedCertVerifier::CreateForDualVerificationTrial( - scoped_refptr<CertVerifyProc> verify_proc, - VerifyCompleteCallback verify_complete_callback, - bool should_record_histograms) { - return base::WrapUnique(new net::MultiThreadedCertVerifier( - std::move(verify_proc), std::move(verify_complete_callback), - should_record_histograms)); -} - int MultiThreadedCertVerifier::Verify(const RequestParams& params, CertVerifyResult* verify_result, CompletionOnceCallback callback, @@ -383,100 +158,17 @@ if (callback.is_null() || !verify_result || params.hostname().empty()) return ERR_INVALID_ARGUMENT; - requests_++; - - // See if an identical request is currently in flight. - CertVerifierJob* job = FindJob(params); - if (job) { - // An identical request is in flight already. We'll just attach our - // callback. - inflight_joins_++; - } else { - // Need to make a new job. - std::unique_ptr<CertVerifierJob> new_job = - std::make_unique<CertVerifierJob>(params, net_log.net_log(), this); - - new_job->Start(verify_proc_, config_, config_id_); - - job = new_job.get(); - joinable_[job] = std::move(new_job); - - if (requests_ == 1) - job->set_is_first_job(true); - } - - std::unique_ptr<CertVerifierRequest> request = - job->CreateRequest(std::move(callback), verify_result, net_log); + std::unique_ptr<InternalRequest> request = + std::make_unique<InternalRequest>(std::move(callback), verify_result); + request->Start(verify_proc_, config_, params); *out_req = std::move(request); return ERR_IO_PENDING; } void MultiThreadedCertVerifier::SetConfig(const CertVerifier::Config& config) { - ++config_id_; config_ = config; if (!config_.crl_set) config_.crl_set = CRLSet::BuiltinCRLSet(); - - // In C++17, this would be a .merge() call to combine |joinable_| into - // |inflight_|. - inflight_.insert(std::make_move_iterator(joinable_.begin()), - std::make_move_iterator(joinable_.end())); - joinable_.clear(); -} - -bool MultiThreadedCertVerifier::JobComparator::operator()( - const CertVerifierJob* job1, - const CertVerifierJob* job2) const { - return job1->key() < job2->key(); -} - -MultiThreadedCertVerifier::MultiThreadedCertVerifier( - scoped_refptr<CertVerifyProc> verify_proc, - VerifyCompleteCallback verify_complete_callback, - bool should_record_histograms) - : MultiThreadedCertVerifier(verify_proc) { - verify_complete_callback_ = std::move(verify_complete_callback); - should_record_histograms_ = should_record_histograms; -} - -std::unique_ptr<CertVerifierJob> MultiThreadedCertVerifier::RemoveJob( - CertVerifierJob* job) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - - // See if it's a job from the current generation. - auto joinable_it = joinable_.find(job); - if (joinable_it != joinable_.end()) { - std::unique_ptr<CertVerifierJob> job_ptr = std::move(joinable_it->second); - joinable_.erase(joinable_it); - return job_ptr; - } - - // Otherwise, find it and remove it from previous generations. - auto it = inflight_.find(job); - DCHECK(it != inflight_.end()); - std::unique_ptr<CertVerifierJob> job_ptr = std::move(it->second); - inflight_.erase(it); - return job_ptr; -} - -struct MultiThreadedCertVerifier::JobToRequestParamsComparator { - bool operator()(const std::pair<CertVerifierJob* const, - std::unique_ptr<CertVerifierJob>>& item, - const CertVerifier::RequestParams& value) const { - return item.first->key() < value; - } -}; - -CertVerifierJob* MultiThreadedCertVerifier::FindJob(const RequestParams& key) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - - // The JobSet is kept in sorted order so items can be found using binary - // search. - auto it = std::lower_bound(joinable_.begin(), joinable_.end(), key, - JobToRequestParamsComparator()); - if (it != joinable_.end() && !(key < it->first->key())) - return it->first; - return nullptr; } } // namespace net
diff --git a/net/cert/multi_threaded_cert_verifier.h b/net/cert/multi_threaded_cert_verifier.h index 03804ea..28c7bf7 100644 --- a/net/cert/multi_threaded_cert_verifier.h +++ b/net/cert/multi_threaded_cert_verifier.h
@@ -10,55 +10,27 @@ #include <map> #include <memory> -#include <string> -#include <vector> -#include "base/gtest_prod_util.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/threading/thread_checker.h" -#include "net/base/completion_once_callback.h" #include "net/base/net_export.h" #include "net/cert/cert_verifier.h" namespace net { -class CertVerifierJob; -class CertVerifierRequest; class CertVerifyProc; // MultiThreadedCertVerifier is a CertVerifier implementation that runs // synchronous CertVerifier implementations on worker threads. class NET_EXPORT_PRIVATE MultiThreadedCertVerifier : public CertVerifier { public: - using VerifyCompleteCallback = - base::RepeatingCallback<void(const RequestParams&, - const NetLogWithSource&, - int, - const CertVerifyResult&, - base::TimeDelta, - bool)>; - explicit MultiThreadedCertVerifier(scoped_refptr<CertVerifyProc> verify_proc); // When the verifier is destroyed, all certificate verifications requests are // canceled, and their completion callbacks will not be called. ~MultiThreadedCertVerifier() override; - // Creates a MultiThreadedCertVerifier that will call - // |verify_complete_callback| once for each verification that has completed - // (if it is non-null). Histograms will have |histogram_suffix| appended, if - // it is non-empty. - // This factory method is temporary, and should not be used without - // consulting with OWNERS. - // TODO(mattm): remove this once the dual verification trial is complete. - // (See https://crbug.com/649026.) - static std::unique_ptr<MultiThreadedCertVerifier> - CreateForDualVerificationTrial( - scoped_refptr<CertVerifyProc> verify_proc, - VerifyCompleteCallback verify_complete_callback, - bool should_record_histograms); - // CertVerifier implementation int Verify(const RequestParams& params, CertVerifyResult* verify_result, @@ -68,64 +40,9 @@ void SetConfig(const CertVerifier::Config& config) override; private: - struct JobToRequestParamsComparator; - friend class CertVerifierRequest; - friend class CertVerifierJob; - friend class MultiThreadedCertVerifierTest; - FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, InflightJoin); - FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, MultipleInflightJoin); - FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, CancelRequest); - - struct JobComparator { - bool operator()(const CertVerifierJob* job1, - const CertVerifierJob* job2) const; - }; - - // TODO(mattm): remove this once the dual verification trial is complete. - // (See https://crbug.com/649026.) - MultiThreadedCertVerifier(scoped_refptr<CertVerifyProc> verify_proc, - VerifyCompleteCallback verify_complete_callback, - bool should_record_histograms); - - // Returns an inflight job for |key|, if it can be joined. If there is no - // such job then returns null. - CertVerifierJob* FindJob(const RequestParams& key); - - // Removes |job| from the inflight set, and passes ownership back to the - // caller. |job| must already be |inflight_|. - std::unique_ptr<CertVerifierJob> RemoveJob(CertVerifierJob* job); - - // For unit testing. - uint64_t requests() const { return requests_; } - uint64_t inflight_joins() const { return inflight_joins_; } - - // |joinable_| holds the jobs for which an active verification is taking - // place and can be joined by new requests (e.g. the config is the same), - // mapping the job's raw pointer to an owned pointer. - // TODO(rsleevi): Once C++17 is supported, switch this to be a std::set<>, - // which supports extracting owned objects from the set. - std::map<CertVerifierJob*, std::unique_ptr<CertVerifierJob>, JobComparator> - joinable_; - - // |inflight_| contains all jobs that are still undergoing active - // verification, but which can no longer be joined - such as due to the - // underlying configuration changing. - std::map<CertVerifierJob*, std::unique_ptr<CertVerifierJob>, JobComparator> - inflight_; - - uint32_t config_id_; Config config_; - - uint64_t requests_; - uint64_t inflight_joins_; - scoped_refptr<CertVerifyProc> verify_proc_; - // Members for dual verification trial. TODO(mattm): Remove these. - // (See https://crbug.com/649026.) - VerifyCompleteCallback verify_complete_callback_; - bool should_record_histograms_ = true; - THREAD_CHECKER(thread_checker_); DISALLOW_COPY_AND_ASSIGN(MultiThreadedCertVerifier);
diff --git a/net/cert/multi_threaded_cert_verifier_unittest.cc b/net/cert/multi_threaded_cert_verifier_unittest.cc index 789ce742..933f84b 100644 --- a/net/cert/multi_threaded_cert_verifier_unittest.cc +++ b/net/cert/multi_threaded_cert_verifier_unittest.cc
@@ -90,43 +90,6 @@ MultiThreadedCertVerifier verifier_; }; -// Tests an inflight join. -TEST_F(MultiThreadedCertVerifierTest, InflightJoin) { - base::FilePath certs_dir = GetTestCertsDirectory(); - scoped_refptr<X509Certificate> test_cert( - ImportCertFromFile(certs_dir, "ok_cert.pem")); - ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get()); - - int error; - CertVerifyResult verify_result; - TestCompletionCallback callback; - std::unique_ptr<CertVerifier::Request> request; - CertVerifyResult verify_result2; - TestCompletionCallback callback2; - std::unique_ptr<CertVerifier::Request> request2; - - error = verifier_.Verify( - CertVerifier::RequestParams(test_cert, "www.example.com", 0, - /*ocsp_response=*/std::string(), - /*sct_list=*/std::string()), - &verify_result, callback.callback(), &request, NetLogWithSource()); - ASSERT_THAT(error, IsError(ERR_IO_PENDING)); - EXPECT_TRUE(request); - error = verifier_.Verify( - CertVerifier::RequestParams(test_cert, "www.example.com", 0, - /*ocsp_response=*/std::string(), - /*sct_list=*/std::string()), - &verify_result2, callback2.callback(), &request2, NetLogWithSource()); - EXPECT_THAT(error, IsError(ERR_IO_PENDING)); - EXPECT_TRUE(request2); - error = callback.WaitForResult(); - EXPECT_TRUE(IsCertificateError(error)); - error = callback2.WaitForResult(); - ASSERT_TRUE(IsCertificateError(error)); - ASSERT_EQ(2u, verifier_.requests()); - ASSERT_EQ(1u, verifier_.inflight_joins()); -} - // Tests that the callback of a canceled request is never made. TEST_F(MultiThreadedCertVerifierTest, CancelRequest) { base::FilePath certs_dir = GetTestCertsDirectory(); @@ -195,89 +158,6 @@ // Destroy |verifier| by going out of scope. } -// Tests de-duplication of requests. -// Starts up 5 requests, of which 3 are unique. -TEST_F(MultiThreadedCertVerifierTest, MultipleInflightJoin) { - base::FilePath certs_dir = GetTestCertsDirectory(); - scoped_refptr<X509Certificate> test_cert( - ImportCertFromFile(certs_dir, "ok_cert.pem")); - ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get()); - - int error; - CertVerifyResult verify_result1; - TestCompletionCallback callback1; - std::unique_ptr<CertVerifier::Request> request1; - CertVerifyResult verify_result2; - TestCompletionCallback callback2; - std::unique_ptr<CertVerifier::Request> request2; - CertVerifyResult verify_result3; - TestCompletionCallback callback3; - std::unique_ptr<CertVerifier::Request> request3; - CertVerifyResult verify_result4; - TestCompletionCallback callback4; - std::unique_ptr<CertVerifier::Request> request4; - CertVerifyResult verify_result5; - TestCompletionCallback callback5; - std::unique_ptr<CertVerifier::Request> request5; - - const char domain1[] = "www.example1.com"; - const char domain2[] = "www.exampleB.com"; - const char domain3[] = "www.example3.com"; - - // Start 3 unique requests. - error = verifier_.Verify( - CertVerifier::RequestParams(test_cert, domain2, 0, - /*ocsp_response=*/std::string(), - /*sct_list=*/std::string()), - &verify_result1, callback1.callback(), &request1, NetLogWithSource()); - ASSERT_THAT(error, IsError(ERR_IO_PENDING)); - EXPECT_TRUE(request1); - - error = verifier_.Verify( - CertVerifier::RequestParams(test_cert, domain2, 0, - /*ocsp_response=*/std::string(), - /*sct_list=*/std::string()), - &verify_result2, callback2.callback(), &request2, NetLogWithSource()); - EXPECT_THAT(error, IsError(ERR_IO_PENDING)); - EXPECT_TRUE(request2); - - error = verifier_.Verify( - CertVerifier::RequestParams(test_cert, domain3, 0, - /*ocsp_response=*/std::string(), - /*sct_list=*/std::string()), - &verify_result3, callback3.callback(), &request3, NetLogWithSource()); - EXPECT_THAT(error, IsError(ERR_IO_PENDING)); - EXPECT_TRUE(request3); - - // Start duplicate requests (which should join to existing jobs). - error = verifier_.Verify( - CertVerifier::RequestParams(test_cert, domain1, 0, - /*ocsp_response=*/std::string(), - /*sct_list=*/std::string()), - &verify_result4, callback4.callback(), &request4, NetLogWithSource()); - EXPECT_THAT(error, IsError(ERR_IO_PENDING)); - EXPECT_TRUE(request4); - - error = verifier_.Verify( - CertVerifier::RequestParams(test_cert, domain2, 0, - /*ocsp_response=*/std::string(), - /*sct_list=*/std::string()), - &verify_result5, callback5.callback(), &request5, NetLogWithSource()); - EXPECT_THAT(error, IsError(ERR_IO_PENDING)); - EXPECT_TRUE(request5); - - error = callback1.WaitForResult(); - EXPECT_TRUE(IsCertificateError(error)); - error = callback2.WaitForResult(); - ASSERT_TRUE(IsCertificateError(error)); - error = callback4.WaitForResult(); - ASSERT_TRUE(IsCertificateError(error)); - - // Let the other requests automatically cancel. - ASSERT_EQ(5u, verifier_.requests()); - ASSERT_EQ(2u, verifier_.inflight_joins()); -} - // Tests propagation of configuration options into CertVerifyProc flags TEST_F(MultiThreadedCertVerifierTest, ConvertsConfigToFlags) { base::FilePath certs_dir = GetTestCertsDirectory();
diff --git a/net/cert/trial_comparison_cert_verifier.cc b/net/cert/trial_comparison_cert_verifier.cc index f3bd119c..d91f542 100644 --- a/net/cert/trial_comparison_cert_verifier.cc +++ b/net/cert/trial_comparison_cert_verifier.cc
@@ -31,12 +31,16 @@ namespace { -base::Value TrialVerificationJobResultParams(bool trial_success) { +base::Value JobResultParams(bool trial_success) { base::Value results(base::Value::Type::DICTIONARY); results.SetBoolKey("trial_success", trial_success); return results; } +// Note: This ignores the result of stapled OCSP (which is the same for both +// verifiers) and informational statuses about the certificate algorithms and +// the hashes, since they will be the same if the certificate chains are the +// same. bool CertVerifyResultEqual(const CertVerifyResult& a, const CertVerifyResult& b) { return std::tie(a.cert_status, a.is_issued_by_known_root) == @@ -120,302 +124,525 @@ } // namespace -class TrialComparisonCertVerifier::TrialVerificationJob { +// The Job represents the state machine for a trial cert verification. +// The Job is always owned by the TrialComparisonCertVerifier. However, a +// reference to the Job is given by the CertVerifier::Request returned by +// Start(), allowing the caller to indicate they're no longer interested in +// the Job if it's not yet completed. +// +// The Job may be deleted while processing the initial verification completion, +// by the client callback deleting the associated TrialComparisonCertVerifier. +class TrialComparisonCertVerifier::Job { public: - TrialVerificationJob(const CertVerifier::Config& config, - const CertVerifier::RequestParams& params, - const NetLogWithSource& source_net_log, - TrialComparisonCertVerifier* cert_verifier, - int primary_error, - const CertVerifyResult& primary_result) - : config_(config), - config_changed_(false), - params_(params), - net_log_( - NetLogWithSource::Make(source_net_log.net_log(), - NetLogSourceType::TRIAL_CERT_VERIFIER_JOB)), - cert_verifier_(cert_verifier), - primary_error_(primary_error), - primary_result_(primary_result) { - net_log_.BeginEvent(NetLogEventType::TRIAL_CERT_VERIFIER_JOB); - source_net_log.AddEventReferencingSource( - NetLogEventType::TRIAL_CERT_VERIFIER_JOB_COMPARISON_STARTED, - net_log_.source()); - } + Job(const CertVerifier::Config& config, + const CertVerifier::RequestParams& params, + const NetLogWithSource& source_net_log, + TrialComparisonCertVerifier* parent); + ~Job(); - ~TrialVerificationJob() { - if (cert_verifier_) { - net_log_.AddEvent(NetLogEventType::CANCELLED); - net_log_.EndEvent(NetLogEventType::TRIAL_CERT_VERIFIER_JOB); - } - } + // Start the Job, attempting first to verify with the parent's primary + // verifier. |client_result|, |client_callback|, and |client_request| are + // the parameters to the TrialComparisonCertVerifier::Verify(), allowing the + // caller to register interest in the primary results. |client_request| will + // be filled with a handle that the caller can use to abort the request. + int Start(CertVerifyResult* client_result, + CompletionOnceCallback client_callback, + std::unique_ptr<CertVerifier::Request>* client_request); + void OnConfigChanged(); - void Start() { - // Unretained is safe because trial_request_ will cancel the callback on - // destruction. - int rv = cert_verifier_->trial_verifier()->Verify( - params_, &trial_result_, - base::BindOnce(&TrialVerificationJob::OnJobCompleted, - base::Unretained(this)), - &trial_request_, net_log_); - if (rv != ERR_IO_PENDING) - OnJobCompleted(rv); - } + private: + class Request; + friend class Request; - void OnConfigChanged() { config_changed_ = true; } + // If the Job has not yet completed the primary verification, this can be + // called to indicate that the Request is no longer interested (e.g. the + // Request is being deleted). + void DetachRequest(); - void Finish(bool is_success, TrialComparisonResult result_code) { - TrialComparisonCertVerifier* cert_verifier = cert_verifier_; - cert_verifier_ = nullptr; + void Finish(bool is_success, TrialComparisonResult result_code); + void FinishSuccess(TrialComparisonResult result_code); + void FinishWithError(); - UMA_HISTOGRAM_ENUMERATION("Net.CertVerifier_TrialComparisonResult", - result_code); + // Called when the primary verifier is completed. + // DANGER: |this| may be deleted when calling this. + void OnPrimaryJobCompleted(int result); - net_log_.EndEvent(NetLogEventType::TRIAL_CERT_VERIFIER_JOB, [&] { - return TrialVerificationJobResultParams(is_success); - }); - - if (!is_success) { - cert_verifier->report_callback_.Run( - params_.hostname(), params_.certificate(), - config_.enable_rev_checking, - config_.require_rev_checking_local_anchors, - config_.enable_sha1_local_anchors, - config_.disable_symantec_enforcement, primary_result_, trial_result_); - } - - // |this| is deleted after RemoveJob returns. - cert_verifier->RemoveJob(this); - } - - void FinishSuccess(TrialComparisonResult result_code) { - Finish(true /* is_success */, result_code); - } - - void FinishWithError() { - DCHECK(trial_error_ != primary_error_ || - !CertVerifyResultEqual(trial_result_, primary_result_)); - - TrialComparisonResult result_code = kInvalid; - - if (primary_error_ == OK && trial_error_ == OK) { - result_code = kBothValidDifferentDetails; - } else if (primary_error_ == OK) { - result_code = kPrimaryValidSecondaryError; - } else if (trial_error_ == OK) { - result_code = kPrimaryErrorSecondaryValid; - } else { - result_code = kBothErrorDifferentDetails; - } - Finish(false /* is_success */, result_code); - } - - void OnJobCompleted(int trial_result_error) { - DCHECK(primary_result_.verified_cert); - DCHECK(trial_result_.verified_cert); - - trial_error_ = trial_result_error; - - bool errors_equal = trial_result_error == primary_error_; - bool details_equal = CertVerifyResultEqual(trial_result_, primary_result_); - bool trial_success = errors_equal && details_equal; - - if (trial_success) { - FinishSuccess(kEqual); - return; - } + // Called when the initial trial comparison is completed. + void OnTrialJobCompleted(int result); #if defined(OS_MACOSX) - if (primary_error_ == ERR_CERT_REVOKED && !config_.enable_rev_checking && - !(primary_result_.cert_status & CERT_STATUS_REV_CHECKING_ENABLED) && - !(trial_result_.cert_status & - (CERT_STATUS_REVOKED | CERT_STATUS_REV_CHECKING_ENABLED))) { - if (config_changed_) { - FinishSuccess(kIgnoredConfigurationChanged); - return; - } - // CertVerifyProcMac does some revocation checking even if we didn't want - // it. Try verifying with the trial verifier with revocation checking - // enabled, see if it then returns REVOKED. - - int rv = cert_verifier_->revocation_trial_verifier()->Verify( - params_, &reverification_result_, - base::BindOnce( - &TrialVerificationJob::OnMacRevcheckingReverificationJobCompleted, - base::Unretained(this)), - &reverification_request_, net_log_); - if (rv != ERR_IO_PENDING) - OnMacRevcheckingReverificationJobCompleted(rv); - return; - } + // On some versions of macOS, revocation checking is always force-enabled + // for the system. For comparing with the built-in verifier to rule out + // "expected" differences, it's necessary to retry verification with + // revocation checking enabled, to match the (effective) configuration of + // the system verifier. + void OnMacRevCheckingReverificationJobCompleted(int result); #endif - const bool chains_equal = - primary_result_.verified_cert->EqualsIncludingChain( - trial_result_.verified_cert.get()); - - if (!chains_equal && (trial_error_ == OK || primary_error_ != OK)) { - if (config_changed_) { - FinishSuccess(kIgnoredConfigurationChanged); - return; - } - // Chains were different, reverify the trial_result_.verified_cert chain - // using the platform verifier and compare results again. - RequestParams reverification_params( - trial_result_.verified_cert, params_.hostname(), params_.flags(), - params_.ocsp_response(), params_.sct_list()); - - int rv = cert_verifier_->primary_reverifier()->Verify( - reverification_params, &reverification_result_, - base::BindOnce(&TrialVerificationJob:: - OnPrimaryReverifiyWithSecondaryChainCompleted, - base::Unretained(this)), - &reverification_request_, net_log_); - if (rv != ERR_IO_PENDING) - OnPrimaryReverifiyWithSecondaryChainCompleted(rv); - return; - } - - TrialComparisonResult ignorable_difference = - IsSynchronouslyIgnorableDifference(primary_error_, primary_result_, - trial_error_, trial_result_); - if (ignorable_difference != kInvalid) { - FinishSuccess(ignorable_difference); - return; - } - - FinishWithError(); - } + // The primary (system) and trial (built-in) verifiers may both construct + // valid chains, but they use different paths. If that happens, a second + // verification with the system verifier is used, using the path that the + // built-in verifier constructed, to compare results. This is called when + // that re-verification completes. + void OnPrimaryReverifyWithSecondaryChainCompleted(int result); // Check if the differences between the primary and trial verifiers can be // ignored. This only handles differences that can be checked synchronously. // If the difference is ignorable, returns the relevant TrialComparisonResult, // otherwise returns kInvalid. - static TrialComparisonResult IsSynchronouslyIgnorableDifference( + TrialComparisonResult IsSynchronouslyIgnorableDifference( int primary_error, const CertVerifyResult& primary_result, int trial_error, - const CertVerifyResult& trial_result) { - DCHECK(primary_result.verified_cert); - DCHECK(trial_result.verified_cert); + const CertVerifyResult& trial_result); - if (primary_error == OK && - primary_result.verified_cert->intermediate_buffers().empty()) { - // Platform may support trusting a leaf certificate directly. Builtin - // verifier does not. See https://crbug.com/814994. - return kIgnoredLocallyTrustedLeaf; - } - - const bool chains_equal = - primary_result.verified_cert->EqualsIncludingChain( - trial_result.verified_cert.get()); - - if (chains_equal && (trial_result.cert_status & CERT_STATUS_IS_EV) && - !(primary_result.cert_status & CERT_STATUS_IS_EV) && - (primary_error == trial_error)) { - // The platform CertVerifyProc impls only check a single potential EV - // policy from the leaf. If the leaf had multiple policies, builtin - // verifier may verify it as EV when the platform verifier did not. - if (CertHasMultipleEVPoliciesAndOneMatchesRoot( - trial_result.verified_cert.get())) { - return kIgnoredMultipleEVPoliciesAndOneMatchesRoot; - } - } - return kInvalid; - } - -#if defined(OS_MACOSX) - void OnMacRevcheckingReverificationJobCompleted(int reverification_error) { - if (reverification_error == ERR_CERT_REVOKED) { - FinishSuccess(kIgnoredMacUndesiredRevocationChecking); - return; - } - FinishWithError(); - } -#endif - - void OnPrimaryReverifiyWithSecondaryChainCompleted(int reverification_error) { - if (reverification_error == trial_error_ && - CertVerifyResultEqual(reverification_result_, trial_result_)) { - // The new result matches the builtin verifier, so this was just - // a difference in the platform's path-building ability. - // Ignore the difference. - FinishSuccess(kIgnoredDifferentPathReVerifiesEquivalent); - return; - } - - if (IsSynchronouslyIgnorableDifference(reverification_error, - reverification_result_, trial_error_, - trial_result_) != kInvalid) { - // The new result matches if ignoring differences. Still use the - // |kIgnoredDifferentPathReVerifiesEquivalent| code rather than the - // result of IsSynchronouslyIgnorableDifference, since it's the higher - // level description of what the difference is in this case. - FinishSuccess(kIgnoredDifferentPathReVerifiesEquivalent); - return; - } - - FinishWithError(); - } - - private: const CertVerifier::Config config_; - bool config_changed_; + bool config_changed_ = false; const CertVerifier::RequestParams params_; const NetLogWithSource net_log_; - TrialComparisonCertVerifier* cert_verifier_; // Non-owned. + + TrialComparisonCertVerifier* parent_ = nullptr; // Non-owned. + Request* request_ = nullptr; // Non-owned. + + // Results from the primary verification. + base::TimeTicks primary_start_; + int primary_error_; + CertVerifyResult primary_result_; + std::unique_ptr<CertVerifier::Request> primary_request_; // Results from the trial verification. + base::TimeTicks trial_start_; int trial_error_; CertVerifyResult trial_result_; std::unique_ptr<CertVerifier::Request> trial_request_; - // Saved results of the primary verification. - int primary_error_; - const CertVerifyResult primary_result_; - - // Results from re-verification attempt. + // Results from the re-verification attempt. CertVerifyResult reverification_result_; std::unique_ptr<CertVerifier::Request> reverification_request_; - DISALLOW_COPY_AND_ASSIGN(TrialVerificationJob); + base::WeakPtrFactory<Job> weak_factory_{this}; + + DISALLOW_COPY_AND_ASSIGN(Job); }; +// The Request is vended to the TrialComparisonCertVerifier::Verify() callers, +// which they fully own and will ultimately destroy. It's used to coordinate +// state with the Job. +// +// If the Job has not yet completed the primary verification request, deleting +// this will abort that Job, ultimately leading to the Job being deleted. +// However, if the primary verification has completed, deleting the Request +// simply becomes a no-op. +class TrialComparisonCertVerifier::Job::Request : public CertVerifier::Request { + public: + Request(TrialComparisonCertVerifier::Job* parent, + CertVerifyResult* client_result, + CompletionOnceCallback client_callback); + ~Request() override; + + // Called when the Job has completed, and used to invoke the client + // callback. + // Note: |this| may be deleted after calling this. + void OnJobComplete(int result, const CertVerifyResult& verify_result); + + // Called when the Job is aborted (e.g. the underlying + // TrialComparisonCertVerifier is being deleted). + void OnJobAborted(); + + private: + TrialComparisonCertVerifier::Job* parent_; + CertVerifyResult* client_result_; + CompletionOnceCallback client_callback_; + + DISALLOW_COPY_AND_ASSIGN(Request); +}; + +TrialComparisonCertVerifier::Job::Job(const CertVerifier::Config& config, + const CertVerifier::RequestParams& params, + const NetLogWithSource& source_net_log, + TrialComparisonCertVerifier* parent) + : config_(config), + params_(params), + net_log_( + NetLogWithSource::Make(source_net_log.net_log(), + NetLogSourceType::TRIAL_CERT_VERIFIER_JOB)), + parent_(parent) { + net_log_.BeginEvent(NetLogEventType::TRIAL_CERT_VERIFIER_JOB); + source_net_log.AddEventReferencingSource( + NetLogEventType::TRIAL_CERT_VERIFIER_JOB_COMPARISON_STARTED, + net_log_.source()); +} + +TrialComparisonCertVerifier::Job::~Job() { + if (request_) { + request_->OnJobAborted(); + } + + if (parent_) { + net_log_.AddEvent(NetLogEventType::CANCELLED); + net_log_.EndEvent(NetLogEventType::TRIAL_CERT_VERIFIER_JOB); + } +} + +int TrialComparisonCertVerifier::Job::Start( + CertVerifyResult* client_result, + CompletionOnceCallback client_callback, + std::unique_ptr<CertVerifier::Request>* client_request) { + DCHECK(!request_); + DCHECK(parent_); + + primary_start_ = base::TimeTicks::Now(); + + // Unretained is safe because |primary_request_| will cancel the + // callback on destruction. + primary_error_ = parent_->primary_verifier()->Verify( + params_, &primary_result_, + base::Bind(&Job::OnPrimaryJobCompleted, base::Unretained(this)), + &primary_request_, net_log_); + + if (primary_error_ != ERR_IO_PENDING) { + *client_result = primary_result_; + int result = primary_error_; + + // NOTE: |this| may be deleted here, in the event that every resulting + // trial comparison also completes synchronously. + OnPrimaryJobCompleted(result); + return result; + } + + // Create a new Request that will be used to manage the state for the + // primary verification and allow cancellation. + auto request = std::make_unique<Request>(this, client_result, + std::move(client_callback)); + request_ = request.get(); + *client_request = std::move(request); + return ERR_IO_PENDING; +} + +void TrialComparisonCertVerifier::Job::OnConfigChanged() { + config_changed_ = true; +} + +void TrialComparisonCertVerifier::Job::DetachRequest() { + // This should only be called while waiting for the primary verification. + DCHECK(primary_request_); + DCHECK(request_); + + request_ = nullptr; +} + +void TrialComparisonCertVerifier::Job::Finish( + bool is_success, + TrialComparisonResult result_code) { + // There should never be a pending initial verification. + DCHECK(!request_); + DCHECK(!primary_request_); + + UMA_HISTOGRAM_ENUMERATION("Net.CertVerifier_TrialComparisonResult", + result_code); + + net_log_.EndEvent(NetLogEventType::TRIAL_CERT_VERIFIER_JOB, + [&] { return JobResultParams(is_success); }); + + // Reset |parent_| to indicate the Job successfully completed (i.e. it was + // not deleted by the TrialComparisonCertVerifier while still waiting for + // results). + TrialComparisonCertVerifier* parent = parent_; + parent_ = nullptr; + + // Invoking the report callback may result in the + // TrialComparisonCertVerifier being deleted, which will delete this Job. + // Guard against this by grabbing a WeakPtr to |this|. + base::WeakPtr<Job> weak_this = weak_factory_.GetWeakPtr(); + if (!is_success) { + parent->report_callback_.Run( + params_.hostname(), params_.certificate(), config_.enable_rev_checking, + config_.require_rev_checking_local_anchors, + config_.enable_sha1_local_anchors, config_.disable_symantec_enforcement, + primary_result_, trial_result_); + } + + if (weak_this) { + // If the Job is still alive, delete it now. + parent->RemoveJob(this); + return; + } +} + +void TrialComparisonCertVerifier::Job::FinishSuccess( + TrialComparisonResult result_code) { + Finish(/*is_success=*/true, result_code); +} + +void TrialComparisonCertVerifier::Job::FinishWithError() { + DCHECK(trial_error_ != primary_error_ || + !CertVerifyResultEqual(trial_result_, primary_result_)); + + TrialComparisonResult result_code = kInvalid; + + if (primary_error_ == OK && trial_error_ == OK) { + result_code = kBothValidDifferentDetails; + } else if (primary_error_ == OK) { + result_code = kPrimaryValidSecondaryError; + } else if (trial_error_ == OK) { + result_code = kPrimaryErrorSecondaryValid; + } else { + result_code = kBothErrorDifferentDetails; + } + Finish(/*is_success=*/false, result_code); +} + +void TrialComparisonCertVerifier::Job::OnPrimaryJobCompleted(int result) { + base::TimeDelta primary_latency = base::TimeTicks::Now() - primary_start_; + + primary_error_ = result; + primary_request_.reset(); + + // Notify the original requestor that the primary verification has now + // completed. This may result in |this| being deleted (if the associated + // TrialComparisonCertVerifier is deleted); to detect this situation, grab + // a WeakPtr to |this|. + base::WeakPtr<Job> weak_this = weak_factory_.GetWeakPtr(); + if (request_) { + Request* request = request_; + request_ = nullptr; + + // Note: May delete |this|. + request->OnJobComplete(primary_error_, primary_result_); + } + + if (!weak_this) + return; + + if (config_changed_ || !parent_->trial_allowed()) { + // If the trial will not be run, then delete |this|. + parent_->RemoveJob(this); + return; + } + + // Only record the TrialPrimary histograms for the same set of requests + // that TrialSecondary histograms will be recorded for, in order to get a + // direct comparison. + UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency_TrialPrimary", + primary_latency, + base::TimeDelta::FromMilliseconds(1), + base::TimeDelta::FromMinutes(10), 100); + + trial_start_ = base::TimeTicks::Now(); + int rv = parent_->trial_verifier()->Verify( + params_, &trial_result_, + base::BindOnce(&Job::OnTrialJobCompleted, base::Unretained(this)), + &trial_request_, net_log_); + if (rv != ERR_IO_PENDING) + OnTrialJobCompleted(rv); // Note: May delete |this|. +} + +void TrialComparisonCertVerifier::Job::OnTrialJobCompleted(int result) { + DCHECK(primary_result_.verified_cert); + DCHECK(trial_result_.verified_cert); + + base::TimeDelta latency = base::TimeTicks::Now() - trial_start_; + trial_error_ = result; + + UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency_TrialSecondary", + latency, base::TimeDelta::FromMilliseconds(1), + base::TimeDelta::FromMinutes(10), 100); + + bool errors_equal = trial_error_ == primary_error_; + bool details_equal = CertVerifyResultEqual(trial_result_, primary_result_); + bool trial_success = errors_equal && details_equal; + + if (trial_success) { + // Note: Will delete |this|. + FinishSuccess(kEqual); + return; + } + +#if defined(OS_MACOSX) + if (primary_error_ == ERR_CERT_REVOKED && !config_.enable_rev_checking && + !(primary_result_.cert_status & CERT_STATUS_REV_CHECKING_ENABLED) && + !(trial_result_.cert_status & + (CERT_STATUS_REVOKED | CERT_STATUS_REV_CHECKING_ENABLED))) { + if (config_changed_) { + // Note: Will delete |this|. + FinishSuccess(kIgnoredConfigurationChanged); + return; + } + + // CertVerifyProcMac does some revocation checking even if we didn't want + // it. Try verifying with the trial verifier with revocation checking + // enabled, see if it then returns REVOKED. + int rv = parent_->revocation_trial_verifier()->Verify( + params_, &reverification_result_, + base::BindOnce(&Job::OnMacRevCheckingReverificationJobCompleted, + base::Unretained(this)), + &reverification_request_, net_log_); + if (rv != ERR_IO_PENDING) { + // Note: May delete |this|. + OnMacRevCheckingReverificationJobCompleted(rv); + } + return; + } +#endif + + const bool chains_equal = primary_result_.verified_cert->EqualsIncludingChain( + trial_result_.verified_cert.get()); + + if (!chains_equal && (trial_error_ == OK || primary_error_ != OK)) { + if (config_changed_) { + // Note: Will delete |this|. + FinishSuccess(kIgnoredConfigurationChanged); + return; + } + + // Chains were different, reverify the trial_result_.verified_cert chain + // using the platform verifier and compare results again. + RequestParams reverification_params( + trial_result_.verified_cert, params_.hostname(), params_.flags(), + params_.ocsp_response(), params_.sct_list()); + + int rv = parent_->primary_reverifier()->Verify( + reverification_params, &reverification_result_, + base::BindOnce(&Job::OnPrimaryReverifyWithSecondaryChainCompleted, + base::Unretained(this)), + &reverification_request_, net_log_); + if (rv != ERR_IO_PENDING) { + // Note: May delete |this|. + OnPrimaryReverifyWithSecondaryChainCompleted(rv); + } + return; + } + + TrialComparisonResult ignorable_difference = + IsSynchronouslyIgnorableDifference(primary_error_, primary_result_, + trial_error_, trial_result_); + if (ignorable_difference != kInvalid) { + FinishSuccess(ignorable_difference); // Note: Will delete |this|. + return; + } + + FinishWithError(); // Note: Will delete |this|. +} + +#if defined(OS_MACOSX) +void TrialComparisonCertVerifier::Job:: + OnMacRevCheckingReverificationJobCompleted(int result) { + if (result == ERR_CERT_REVOKED) { + // Will delete |this|. + FinishSuccess(kIgnoredMacUndesiredRevocationChecking); + return; + } + FinishWithError(); // Note: Will delete |this|. +} +#endif + +void TrialComparisonCertVerifier::Job:: + OnPrimaryReverifyWithSecondaryChainCompleted(int result) { + if (result == trial_error_ && + CertVerifyResultEqual(reverification_result_, trial_result_)) { + // The new result matches the builtin verifier, so this was just a + // difference in the platform's path-building ability. + // Ignore the difference. + // + // Note: Will delete |this|. + FinishSuccess(kIgnoredDifferentPathReVerifiesEquivalent); + return; + } + + if (IsSynchronouslyIgnorableDifference(result, reverification_result_, + trial_error_, + trial_result_) != kInvalid) { + // The new result matches if ignoring differences. Still use the + // |kIgnoredDifferentPathReVerifiesEquivalent| code rather than the result + // of IsSynchronouslyIgnorableDifference, since it's the higher level + // description of what the difference is in this case. + // + // Note: Will delete |this|. + FinishSuccess(kIgnoredDifferentPathReVerifiesEquivalent); + return; + } + + // Note: Will delete |this|. + FinishWithError(); +} + +TrialComparisonCertVerifier::TrialComparisonResult +TrialComparisonCertVerifier::Job::IsSynchronouslyIgnorableDifference( + int primary_error, + const CertVerifyResult& primary_result, + int trial_error, + const CertVerifyResult& trial_result) { + DCHECK(primary_result.verified_cert); + DCHECK(trial_result.verified_cert); + + if (primary_error == OK && + primary_result.verified_cert->intermediate_buffers().empty()) { + // Platform may support trusting a leaf certificate directly. Builtin + // verifier does not. See https://crbug.com/814994. + return kIgnoredLocallyTrustedLeaf; + } + + const bool chains_equal = primary_result.verified_cert->EqualsIncludingChain( + trial_result.verified_cert.get()); + + if (chains_equal && (trial_result.cert_status & CERT_STATUS_IS_EV) && + !(primary_result.cert_status & CERT_STATUS_IS_EV) && + (primary_error == trial_error)) { + // The platform CertVerifyProc impls only check a single potential EV + // policy from the leaf. If the leaf had multiple policies, builtin + // verifier may verify it as EV when the platform verifier did not. + if (CertHasMultipleEVPoliciesAndOneMatchesRoot( + trial_result.verified_cert.get())) { + return kIgnoredMultipleEVPoliciesAndOneMatchesRoot; + } + } + return kInvalid; +} + +TrialComparisonCertVerifier::Job::Request::Request( + TrialComparisonCertVerifier::Job* parent, + CertVerifyResult* client_result, + CompletionOnceCallback client_callback) + : parent_(parent), + client_result_(client_result), + client_callback_(std::move(client_callback)) {} + +TrialComparisonCertVerifier::Job::Request::~Request() { + if (parent_) + parent_->DetachRequest(); +} + +void TrialComparisonCertVerifier::Job::Request::OnJobComplete( + int result, + const CertVerifyResult& verify_result) { + DCHECK(parent_); + parent_ = nullptr; + + *client_result_ = verify_result; + + // DANGER: |this| may be deleted when this callback is run (as well as + // |parent_|, but that's been reset above). + std::move(client_callback_).Run(result); +} + +void TrialComparisonCertVerifier::Job::Request::OnJobAborted() { + DCHECK(parent_); + parent_ = nullptr; +} + TrialComparisonCertVerifier::TrialComparisonCertVerifier( - bool initial_allowed, scoped_refptr<CertVerifyProc> primary_verify_proc, scoped_refptr<CertVerifyProc> trial_verify_proc, ReportCallback report_callback) - : allowed_(initial_allowed), - report_callback_(report_callback), + : report_callback_(std::move(report_callback)), primary_verifier_( - MultiThreadedCertVerifier::CreateForDualVerificationTrial( - primary_verify_proc, - // Unretained is safe since the callback won't be called after - // |primary_verifier_| is destroyed. - base::BindRepeating( - &TrialComparisonCertVerifier::OnPrimaryVerifierComplete, - base::Unretained(this)), - true /* should_record_histograms */)), + std::make_unique<MultiThreadedCertVerifier>(primary_verify_proc)), primary_reverifier_( std::make_unique<MultiThreadedCertVerifier>(primary_verify_proc)), - trial_verifier_(MultiThreadedCertVerifier::CreateForDualVerificationTrial( - trial_verify_proc, - // Unretained is safe since the callback won't be called after - // |trial_verifier_| is destroyed. - base::BindRepeating( - &TrialComparisonCertVerifier::OnTrialVerifierComplete, - base::Unretained(this)), - false /* should_record_histograms */)), + trial_verifier_( + std::make_unique<MultiThreadedCertVerifier>(trial_verify_proc)), revocation_trial_verifier_( - MultiThreadedCertVerifier::CreateForDualVerificationTrial( - trial_verify_proc, - // Unretained is safe since the callback won't be called after - // |trial_verifier_| is destroyed. - base::BindRepeating( - &TrialComparisonCertVerifier::OnTrialVerifierComplete, - base::Unretained(this)), - false /* should_record_histograms */)) { + std::make_unique<MultiThreadedCertVerifier>(trial_verify_proc)) { CertVerifier::Config config; config.enable_rev_checking = true; revocation_trial_verifier_->SetConfig(config); @@ -430,8 +657,17 @@ const NetLogWithSource& net_log) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - return primary_verifier_->Verify(params, verify_result, std::move(callback), - out_req, net_log); + if (!trial_allowed()) { + return primary_verifier_->Verify(params, verify_result, std::move(callback), + out_req, net_log); + } + + std::unique_ptr<Job> job = + std::make_unique<Job>(config_, params, net_log, this); + Job* job_ptr = job.get(); + jobs_.insert(std::move(job)); + + return job_ptr->Start(verify_result, std::move(callback), out_req); } void TrialComparisonCertVerifier::SetConfig(const Config& config) { @@ -452,62 +688,9 @@ } } -void TrialComparisonCertVerifier::OnPrimaryVerifierComplete( - const RequestParams& params, - const NetLogWithSource& net_log, - int primary_error, - const CertVerifyResult& primary_result, - base::TimeDelta primary_latency, - bool is_first_job) { +void TrialComparisonCertVerifier::RemoveJob(Job* job_ptr) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - if (!trial_allowed()) - return; - - // Only record the TrialPrimary histograms for the same set of requests - // that TrialSecondary histograms will be recorded for, in order to get a - // direct comparison. - UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency_TrialPrimary", - primary_latency, - base::TimeDelta::FromMilliseconds(1), - base::TimeDelta::FromMinutes(10), 100); - if (is_first_job) { - UMA_HISTOGRAM_CUSTOM_TIMES( - "Net.CertVerifier_First_Job_Latency_TrialPrimary", primary_latency, - base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10), - 100); - } - - std::unique_ptr<TrialVerificationJob> job = - std::make_unique<TrialVerificationJob>(config_, params, net_log, this, - primary_error, primary_result); - TrialVerificationJob* job_ptr = job.get(); - jobs_.insert(std::move(job)); - job_ptr->Start(); -} - -void TrialComparisonCertVerifier::OnTrialVerifierComplete( - const RequestParams& params, - const NetLogWithSource& net_log, - int trial_error, - const CertVerifyResult& trial_result, - base::TimeDelta latency, - bool is_first_job) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - - UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency_TrialSecondary", - latency, base::TimeDelta::FromMilliseconds(1), - base::TimeDelta::FromMinutes(10), 100); - if (is_first_job) { - UMA_HISTOGRAM_CUSTOM_TIMES( - "Net.CertVerifier_First_Job_Latency_TrialSecondary", latency, - base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10), - 100); - } -} - -void TrialComparisonCertVerifier::RemoveJob(TrialVerificationJob* job_ptr) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); auto it = jobs_.find(job_ptr); DCHECK(it != jobs_.end()); jobs_.erase(it);
diff --git a/net/cert/trial_comparison_cert_verifier.h b/net/cert/trial_comparison_cert_verifier.h index cb04bcd5..5617f2b 100644 --- a/net/cert/trial_comparison_cert_verifier.h +++ b/net/cert/trial_comparison_cert_verifier.h
@@ -22,6 +22,10 @@ namespace net { class CertVerifyProc; +// TrialComparisonCertVerifier is a CertVerifier that can be used to compare +// the results between two different CertVerifyProcs. The results are reported +// back to the caller via a ReportCallback, allowing the caller to further +// examine the differences. class NET_EXPORT TrialComparisonCertVerifier : public CertVerifier { public: // These values are persisted to logs. Entries should not be renumbered and @@ -51,8 +55,33 @@ const net::CertVerifyResult& primary_result, const net::CertVerifyResult& trial_result)>; - TrialComparisonCertVerifier(bool initial_allowed, - scoped_refptr<CertVerifyProc> primary_verify_proc, + // Create a new TrialComparisonCertVerifier. Initially, no trial + // verifications will actually be performed; that is, calls to Verify() will + // be dispatched to the underlying |primary_verify_proc|. This can be changed + // by calling set_trial_allowed(). + // + // When trial verifications are enabled, calls to Verify() will first call + // into |primary_verify_proc| to verify. The result of this verification will + // be immediately returned to the caller of Verify, allowing them to proceed. + // However, the verifier will continue in the background, attempting to + // verify the same RequestParams using |trial_verify_proc|. If there are + // differences in the results, they will be reported via |report_callback|, + // allowing the creator to receive information about differences. + // + // If the caller abandons the CertVerifier::Request prior to the primary + // verification completed, no trial verification will be done. However, once + // the primary verifier has returned, the trial verifications will continue, + // provided that the underlying configuration has not been changed by + // calling SetConfig(). + // + // Note that there may be multiple calls to both |primary_verify_proc| and + // |trial_verify_proc|, using different parameters to account for platform + // differences. + // + // TODO(rsleevi): Make the types distinct, to guarantee that + // |primary_verify_proc| is a System CertVerifyProc, and |trial_verify_proc| + // is the Builtin CertVerifyProc. + TrialComparisonCertVerifier(scoped_refptr<CertVerifyProc> primary_verify_proc, scoped_refptr<CertVerifyProc> trial_verify_proc, ReportCallback report_callback); @@ -69,36 +98,21 @@ const NetLogWithSource& net_log) override; void SetConfig(const Config& config) override; - // Returns a CertVerifier using the primary CertVerifyProc, which will not - // cause OnPrimaryVerifierComplete to be called. This can be used to - // attempt to re-verify a cert with different chain or flags without - // messing up the stats or potentially causing an infinite loop. + private: + class Job; + friend class Job; + + CertVerifier* primary_verifier() const { return primary_verifier_.get(); } CertVerifier* primary_reverifier() const { return primary_reverifier_.get(); } CertVerifier* trial_verifier() const { return trial_verifier_.get(); } CertVerifier* revocation_trial_verifier() const { return revocation_trial_verifier_.get(); } - private: - class TrialVerificationJob; - - void OnPrimaryVerifierComplete(const RequestParams& params, - const NetLogWithSource& net_log, - int primary_error, - const CertVerifyResult& primary_result, - base::TimeDelta primary_latency, - bool is_first_job); - void OnTrialVerifierComplete(const RequestParams& params, - const NetLogWithSource& net_log, - int trial_error, - const CertVerifyResult& trial_result, - base::TimeDelta latency, - bool is_first_job); - - void RemoveJob(TrialVerificationJob* job_ptr); + void RemoveJob(Job* job_ptr); // Whether the trial is allowed. - bool allowed_; + bool allowed_ = false; // Callback that reports are sent to. ReportCallback report_callback_; @@ -111,8 +125,7 @@ // revocation information. std::unique_ptr<CertVerifier> revocation_trial_verifier_; - std::set<std::unique_ptr<TrialVerificationJob>, base::UniquePtrComparator> - jobs_; + std::set<std::unique_ptr<Job>, base::UniquePtrComparator> jobs_; THREAD_CHECKER(thread_checker_);
diff --git a/net/cert/trial_comparison_cert_verifier_unittest.cc b/net/cert/trial_comparison_cert_verifier_unittest.cc index 148fffef..6c053b0 100644 --- a/net/cert/trial_comparison_cert_verifier_unittest.cc +++ b/net/cert/trial_comparison_cert_verifier_unittest.cc
@@ -8,6 +8,7 @@ #include <vector> #include "base/bind.h" +#include "base/test/bind_test_util.h" #include "base/test/metrics/histogram_tester.h" #include "base/threading/sequenced_task_runner_handle.h" #include "build/build_config.h" @@ -109,6 +110,7 @@ main_task_runner_(base::SequencedTaskRunnerHandle::Get()) {} void WaitForVerifyCall() { verify_called_.WaitForResult(); } + int num_verifications() const { return num_verifications_; } // CertVerifyProc implementation: bool SupportsAdditionalTrustAnchors() const override { return false; } @@ -126,8 +128,12 @@ const CertificateList& additional_trust_anchors, CertVerifyResult* verify_result) override; + // Runs on the main thread + void VerifyCalled(); + const int result_error_; const CertVerifyResult result_; + int num_verifications_ = 0; RepeatedTestClosure verify_called_; scoped_refptr<base::TaskRunner> main_task_runner_; @@ -144,10 +150,16 @@ const CertificateList& additional_trust_anchors, CertVerifyResult* verify_result) { *verify_result = result_; - main_task_runner_->PostTask(FROM_HERE, verify_called_.closure()); + main_task_runner_->PostTask( + FROM_HERE, base::Bind(&FakeCertVerifyProc::VerifyCalled, this)); return result_error_; } +void FakeCertVerifyProc::VerifyCalled() { + ++num_verifications_; + verify_called_.closure().Run(); +} + // Fake CertVerifyProc that causes a failure if it is called. class NotCalledCertVerifyProc : public CertVerifyProc { public: @@ -282,11 +294,10 @@ CertVerifyResult dummy_result; dummy_result.verified_cert = cert_chain_1_; + auto verify_proc = base::MakeRefCounted<FakeCertVerifyProc>(OK, dummy_result); std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - false /* initial_allowed */, - base::MakeRefCounted<FakeCertVerifyProc>(OK, dummy_result), - base::MakeRefCounted<NotCalledCertVerifyProc>(), + verify_proc, base::MakeRefCounted<NotCalledCertVerifyProc>(), base::BindRepeating(&RecordTrialReport, &reports)); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -300,7 +311,7 @@ EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); RunUntilIdle(); @@ -308,7 +319,7 @@ EXPECT_TRUE(reports.empty()); // Primary verifier should have ran, trial verifier should not have. - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 0); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 0); @@ -347,7 +358,7 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - false /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); CertVerifier::RequestParams params(leaf, "t0.test", /*flags=*/0, @@ -361,7 +372,7 @@ ASSERT_THAT(error, IsError(ERR_IO_PENDING)); EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); // Enable the trial and do another verification. verifier.set_trial_allowed(true); @@ -377,13 +388,14 @@ EXPECT_TRUE(request2); error = callback2.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); verify_proc2->WaitForVerifyCall(); RunUntilIdle(); // Primary verifier should have run twice, trial verifier should run once. - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 2); + EXPECT_EQ(2, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -429,8 +441,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf, "t0.test", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -443,7 +456,7 @@ ASSERT_THAT(error, IsError(ERR_IO_PENDING)); EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); // Disable the trial and do another verification. verifier.set_trial_allowed(false); @@ -459,13 +472,14 @@ EXPECT_TRUE(request2); error = callback2.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); verify_proc2->WaitForVerifyCall(); RunUntilIdle(); // Primary verifier should have run twice, trial verifier should run once. - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 2); + EXPECT_EQ(2, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -488,9 +502,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, - base::MakeRefCounted<NotCalledCertVerifyProc>(), + verify_proc1, base::MakeRefCounted<NotCalledCertVerifyProc>(), base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -509,12 +523,12 @@ verifier.SetConfig(config); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); RunUntilIdle(); // Since the config changed, trial verifier should not run. - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 0); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 0); @@ -540,8 +554,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -555,7 +570,7 @@ EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); // Change the verifier config during the trial verification. CertVerifier::Config config; @@ -566,13 +581,11 @@ // Since the config was the same when both primary and trial verification // started, the result should still be reported. - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); - // CertVerifier_Job_Latency_TrialSecondary is not recorded due to - // MultiThreadedCertVerifier's config_id_ check before calling the - // verify_complete_callback_. histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", - 0); + 1); histograms_.ExpectUniqueSample( "Net.CertVerifier_TrialComparisonResult", TrialComparisonCertVerifier::kPrimaryValidSecondaryError, 1); @@ -595,8 +608,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -610,7 +624,7 @@ EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); verify_proc2->WaitForVerifyCall(); RunUntilIdle(); @@ -618,7 +632,8 @@ // Expect no report. EXPECT_TRUE(reports.empty()); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -642,8 +657,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -680,7 +696,8 @@ EXPECT_FALSE(report.enable_sha1_local_anchors); EXPECT_FALSE(report.disable_symantec_enforcement); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -705,8 +722,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -720,7 +738,7 @@ EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); verify_proc2->WaitForVerifyCall(); RunUntilIdle(); @@ -738,7 +756,8 @@ cert_chain_1_.get())); EXPECT_TRUE(report.unverified_cert->EqualsIncludingChain(leaf_cert_1_.get())); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -766,8 +785,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -799,7 +819,8 @@ cert_chain_1_.get())); EXPECT_TRUE(report.unverified_cert->EqualsIncludingChain(leaf_cert_1_.get())); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -824,8 +845,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -839,7 +861,7 @@ EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); verify_proc2->WaitForVerifyCall(); RunUntilIdle(); @@ -857,11 +879,10 @@ cert_chain_2_.get())); EXPECT_TRUE(report.unverified_cert->EqualsIncludingChain(leaf_cert_1_.get())); - // Main CertVerifier_Job_Latency should have 2 counts since the - // primary_reverifier was used. - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 2); - // CertVerifier_Job_Latency_TrialPrimary only has 1 count since - // primary_reverifier doesn't use the same CertVerifier. + // The primary verifier should be used twice (first with the initial chain, + // then with the results of the trial verifier). + EXPECT_EQ(2, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -871,6 +892,66 @@ } TEST_F(TrialComparisonCertVerifierTest, + DifferentVerifiedChainsAndConfigHasChanged) { + // Primary verifier returns chain1 regardless of arguments. + CertVerifyResult primary_result; + primary_result.verified_cert = cert_chain_1_; + scoped_refptr<FakeCertVerifyProc> verify_proc1 = + base::MakeRefCounted<FakeCertVerifyProc>(ERR_CERT_REVOKED, + primary_result); + + // Trial verifier returns a different verified cert chain. + CertVerifyResult secondary_result; + secondary_result.verified_cert = cert_chain_2_; + scoped_refptr<FakeCertVerifyProc> verify_proc2 = + base::MakeRefCounted<FakeCertVerifyProc>(OK, secondary_result); + + std::vector<TrialReportInfo> reports; + TrialComparisonCertVerifier verifier( + verify_proc1, verify_proc2, + base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); + + CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, + /*ocsp_response=*/std::string(), + /*sct_list=*/std::string()); + CertVerifyResult result; + TestCompletionCallback callback; + std::unique_ptr<CertVerifier::Request> request; + int error = verifier.Verify(params, &result, callback.callback(), &request, + NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request); + + error = callback.WaitForResult(); + EXPECT_THAT(error, IsError(ERR_CERT_REVOKED)); + + // Change the configuration. The trial verification should complete, but + // the difference in verified chains should prevent a trial reverification. + CertVerifier::Config config; + config.enable_sha1_local_anchors = true; + verifier.SetConfig(config); + + verify_proc2->WaitForVerifyCall(); + RunUntilIdle(); + + // Expect no report, since the configuration changed and the primary + // verifier could not be used to retry. + ASSERT_EQ(0U, reports.size()); + + // The primary verifier should only be used once, as the configuration + // changes after the trial verification is started. + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); + histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); + histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", + 1); + histograms_.ExpectUniqueSample( + "Net.CertVerifier_TrialComparisonResult", + TrialComparisonCertVerifier::kIgnoredConfigurationChanged, 1); +} + +TEST_F(TrialComparisonCertVerifierTest, BothVerifiersOkDifferentVerifiedChainsEqualAfterReverification) { CertVerifyResult chain1_result; chain1_result.verified_cert = cert_chain_1_; @@ -882,11 +963,11 @@ // Primary verifier returns ok status and chain1 if verifying the leaf alone. EXPECT_CALL(*verify_proc1, VerifyInternal(leaf_cert_1_.get(), _, _, _, _, _, _, _)) - .WillRepeatedly(DoAll(SetArgPointee<7>(chain1_result), Return(OK))); + .WillOnce(DoAll(SetArgPointee<7>(chain1_result), Return(OK))); // Primary verifier returns ok status and chain2 if verifying chain2. EXPECT_CALL(*verify_proc1, VerifyInternal(cert_chain_2_.get(), _, _, _, _, _, _, _)) - .WillRepeatedly(DoAll(SetArgPointee<7>(chain2_result), Return(OK))); + .WillOnce(DoAll(SetArgPointee<7>(chain2_result), Return(OK))); // Trial verifier returns ok status and chain2. scoped_refptr<FakeCertVerifyProc> verify_proc2 = @@ -894,8 +975,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -909,7 +991,7 @@ EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); verify_proc2->WaitForVerifyCall(); RunUntilIdle(); @@ -917,11 +999,8 @@ // Expect no report. EXPECT_TRUE(reports.empty()); - // Main CertVerifier_Job_Latency should have 2 counts since the - // primary_reverifier was used. - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 2); - // CertVerifier_Job_Latency_TrialPrimary only has 1 count since - // primary_reverifier doesn't use the same CertVerifier. + testing::Mock::VerifyAndClear(verify_proc1.get()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -984,13 +1063,12 @@ // Primary verifier returns ok status and different_chain if verifying leaf // alone. EXPECT_CALL(*verify_proc1, VerifyInternal(leaf.get(), _, _, _, _, _, _, _)) - .WillRepeatedly( - DoAll(SetArgPointee<7>(different_chain_result), Return(OK))); + .WillOnce(DoAll(SetArgPointee<7>(different_chain_result), Return(OK))); // Primary verifier returns ok status and nonev_chain_result if verifying // cert_chain. EXPECT_CALL(*verify_proc1, VerifyInternal(cert_chain.get(), _, _, _, _, _, _, _)) - .WillRepeatedly(DoAll(SetArgPointee<7>(nonev_chain_result), Return(OK))); + .WillOnce(DoAll(SetArgPointee<7>(nonev_chain_result), Return(OK))); // Trial verifier returns ok status and ev_chain_result. scoped_refptr<FakeCertVerifyProc> verify_proc2 = @@ -998,8 +1076,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf, "test.example", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -1013,7 +1092,7 @@ EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); verify_proc2->WaitForVerifyCall(); RunUntilIdle(); @@ -1021,11 +1100,10 @@ // Expect no report. EXPECT_TRUE(reports.empty()); - // Main CertVerifier_Job_Latency should have 2 counts since the - // primary_reverifier was used. - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 2); - // CertVerifier_Job_Latency_TrialPrimary only has 1 count since - // primary_reverifier doesn't use the same CertVerifier. + // Primary verifier should be used twice, the second time with the chain + // from the trial verifier. + testing::Mock::VerifyAndClear(verify_proc1.get()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -1051,8 +1129,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::Config config; config.enable_rev_checking = true; @@ -1071,7 +1150,7 @@ EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); verify_proc2->WaitForVerifyCall(); RunUntilIdle(); @@ -1095,7 +1174,8 @@ cert_chain_1_.get())); EXPECT_TRUE(report.unverified_cert->EqualsIncludingChain(leaf_cert_1_.get())); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -1104,82 +1184,6 @@ TrialComparisonCertVerifier::kBothValidDifferentDetails, 1); } -TEST_F(TrialComparisonCertVerifierTest, Coalescing) { - // Primary verifier returns an error status. - CertVerifyResult primary_result; - primary_result.verified_cert = cert_chain_1_; - primary_result.cert_status = CERT_STATUS_DATE_INVALID; - scoped_refptr<FakeCertVerifyProc> verify_proc1 = - base::MakeRefCounted<FakeCertVerifyProc>(ERR_CERT_DATE_INVALID, - primary_result); - - // Trial verifier has ok status. - CertVerifyResult secondary_result; - secondary_result.verified_cert = cert_chain_1_; - scoped_refptr<FakeCertVerifyProc> verify_proc2 = - base::MakeRefCounted<FakeCertVerifyProc>(OK, secondary_result); - - std::vector<TrialReportInfo> reports; - TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, - base::BindRepeating(&RecordTrialReport, &reports)); - - CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, - /*ocsp_response=*/std::string(), - /*sct_list=*/std::string()); - - // Start first verification request. - CertVerifyResult result_1; - std::unique_ptr<CertVerifier::Request> request_1; - TestCompletionCallback callback_1; - int error = verifier.Verify(params, &result_1, callback_1.callback(), - &request_1, NetLogWithSource()); - ASSERT_THAT(error, IsError(ERR_IO_PENDING)); - EXPECT_TRUE(request_1); - - // Start second verification request with same params. - CertVerifyResult result_2; - std::unique_ptr<CertVerifier::Request> request_2; - TestCompletionCallback callback_2; - error = verifier.Verify(params, &result_2, callback_2.callback(), &request_2, - NetLogWithSource()); - ASSERT_THAT(error, IsError(ERR_IO_PENDING)); - EXPECT_TRUE(request_2); - - // Both callbacks should be called with same error code. - error = callback_1.WaitForResult(); - EXPECT_THAT(error, IsError(ERR_CERT_DATE_INVALID)); - error = callback_2.WaitForResult(); - EXPECT_THAT(error, IsError(ERR_CERT_DATE_INVALID)); - - // Trial verifier should run. - verify_proc2->WaitForVerifyCall(); - RunUntilIdle(); - - // Expect a single report. - ASSERT_EQ(1U, reports.size()); - const TrialReportInfo& report = reports[0]; - - EXPECT_EQ(CERT_STATUS_DATE_INVALID, report.primary_result.cert_status); - EXPECT_EQ(0U, report.trial_result.cert_status); - - EXPECT_TRUE(report.primary_result.verified_cert->EqualsIncludingChain( - cert_chain_1_.get())); - EXPECT_TRUE(report.trial_result.verified_cert->EqualsIncludingChain( - cert_chain_1_.get())); - EXPECT_TRUE(report.unverified_cert->EqualsIncludingChain(leaf_cert_1_.get())); - - // Only one verification should be done by primary verifier. - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); - // Only one verification should be done by secondary verifier. - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", - 1); - histograms_.ExpectUniqueSample( - "Net.CertVerifier_TrialComparisonResult", - TrialComparisonCertVerifier::kPrimaryErrorSecondaryValid, 1); -} - TEST_F(TrialComparisonCertVerifierTest, CancelledDuringPrimaryVerification) { // Primary verifier returns an error status. CertVerifyResult primary_result; @@ -1197,8 +1201,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -1234,7 +1239,8 @@ cert_chain_1_.get())); EXPECT_TRUE(report.unverified_cert->EqualsIncludingChain(leaf_cert_1_.get())); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -1254,9 +1260,9 @@ std::vector<TrialReportInfo> reports; auto verifier = std::make_unique<TrialComparisonCertVerifier>( - true /* initial_allowed */, verify_proc1, - base::MakeRefCounted<NotCalledCertVerifyProc>(), + verify_proc1, base::MakeRefCounted<NotCalledCertVerifyProc>(), base::BindRepeating(&RecordTrialReport, &reports)); + verifier->set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -1282,14 +1288,135 @@ // Expect no report. EXPECT_TRUE(reports.empty()); - // Histograms should not be recorded. - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 0); + // The trial verifier should never be called, nor histograms recorded. + EXPECT_EQ(1, verify_proc1->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 0); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 0); histograms_.ExpectTotalCount("Net.CertVerifier_TrialComparisonResult", 0); } +TEST_F(TrialComparisonCertVerifierTest, DeletedDuringVerificationResult) { + // Primary verifier returns an error status. + CertVerifyResult primary_result; + primary_result.verified_cert = cert_chain_1_; + primary_result.cert_status = CERT_STATUS_DATE_INVALID; + scoped_refptr<FakeCertVerifyProc> verify_proc1 = + base::MakeRefCounted<FakeCertVerifyProc>(ERR_CERT_DATE_INVALID, + primary_result); + + std::vector<TrialReportInfo> reports; + auto verifier = std::make_unique<TrialComparisonCertVerifier>( + verify_proc1, base::MakeRefCounted<NotCalledCertVerifyProc>(), + base::BindRepeating(&RecordTrialReport, &reports)); + verifier->set_trial_allowed(true); + + CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, + /*ocsp_response=*/std::string(), + /*sct_list=*/std::string()); + CertVerifyResult result; + TestCompletionCallback callback; + std::unique_ptr<CertVerifier::Request> request; + int error = verifier->Verify( + params, &result, + base::BindLambdaForTesting([&callback, &verifier](int result) { + // Delete the verifier while processing the result. This should not + // start a trial verification. + verifier.reset(); + callback.callback().Run(result); + }), + &request, NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request); + + // Wait for primary verifier to finish. + error = callback.WaitForResult(); + EXPECT_THAT(error, IsError(ERR_CERT_DATE_INVALID)); + + // The callback to the trial verifier does not run. No verification task + // should start, as the verifier was deleted before the trial verification + // was started. + + // Wait for any tasks to finish. + RunUntilIdle(); + + // Expect no report. + EXPECT_TRUE(reports.empty()); + + // Histograms for the primary or trial verification should not be recorded, + // as the trial verification was cancelled by deleting the verifier. + EXPECT_EQ(1, verify_proc1->num_verifications()); + histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 0); + histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", + 0); + histograms_.ExpectTotalCount("Net.CertVerifier_TrialComparisonResult", 0); +} + +TEST_F(TrialComparisonCertVerifierTest, DeletedDuringTrialReport) { + // Primary verifier returns an error status. + CertVerifyResult primary_result; + primary_result.verified_cert = cert_chain_1_; + primary_result.cert_status = CERT_STATUS_DATE_INVALID; + scoped_refptr<FakeCertVerifyProc> verify_proc1 = + base::MakeRefCounted<FakeCertVerifyProc>(ERR_CERT_DATE_INVALID, + primary_result); + + // Trial verifier has ok status. + CertVerifyResult secondary_result; + secondary_result.verified_cert = cert_chain_1_; + scoped_refptr<FakeCertVerifyProc> verify_proc2 = + base::MakeRefCounted<FakeCertVerifyProc>(OK, secondary_result); + + bool was_report_callback_called = false; + std::unique_ptr<TrialComparisonCertVerifier> verifier; + verifier = std::make_unique<TrialComparisonCertVerifier>( + verify_proc1, verify_proc2, + base::BindLambdaForTesting( + [&verifier, &was_report_callback_called]( + const std::string& hostname, + const scoped_refptr<X509Certificate>& unverified_cert, + bool enable_rev_checking, bool require_rev_checking_local_anchors, + bool enable_sha1_local_anchors, bool disable_symantec_enforcement, + const net::CertVerifyResult& primary_result, + const net::CertVerifyResult& trial_result) { + // During processing of a report, delete the underlying verifier. + // This should not cause any issues. + was_report_callback_called = true; + verifier.reset(); + })); + verifier->set_trial_allowed(true); + + CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, + /*ocsp_response=*/std::string(), + /*sct_list=*/std::string()); + CertVerifyResult result; + TestCompletionCallback callback; + std::unique_ptr<CertVerifier::Request> request; + int error = verifier->Verify(params, &result, callback.callback(), &request, + NetLogWithSource()); + ASSERT_THAT(error, IsError(ERR_IO_PENDING)); + EXPECT_TRUE(request); + + // The callback should be notified of the primary result. + ASSERT_THAT(callback.WaitForResult(), IsError(ERR_CERT_DATE_INVALID)); + + // Wait for the verification task to complete in the background. This + // should ultimately call the ReportCallback that will delete the + // verifier. + RunUntilIdle(); + + EXPECT_TRUE(was_report_callback_called); + + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); + histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); + histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", + 1); + histograms_.ExpectUniqueSample( + "Net.CertVerifier_TrialComparisonResult", + TrialComparisonCertVerifier::kPrimaryErrorSecondaryValid, 1); +} + TEST_F(TrialComparisonCertVerifierTest, DeletedAfterTrialVerificationStarted) { // Primary verifier returns an error status. CertVerifyResult primary_result; @@ -1307,8 +1434,9 @@ std::vector<TrialReportInfo> reports; auto verifier = std::make_unique<TrialComparisonCertVerifier>( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier->set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -1340,7 +1468,8 @@ // Expect no report. EXPECT_TRUE(reports.empty()); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); // Histograms for trial verifier should not be recorded. histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", @@ -1365,19 +1494,24 @@ base::MakeRefCounted<MockCertVerifyProc>(); // Secondary verifier returns ok status... EXPECT_CALL(*verify_proc2, VerifyInternal(_, _, _, _, _, _, _, _)) - .WillRepeatedly(DoAll(SetArgPointee<7>(ok_result), Return(OK))); - // ...unless it was called with REV_CHECKING_ENABLED. + .WillOnce(DoAll(SetArgPointee<7>(ok_result), Return(OK))); + +#if defined(OS_MACOSX) + // The secondary should have been called twice on Mac due to attempting + // the kIgnoredMacUndesiredRevocationCheckingWorkaround. EXPECT_CALL( *verify_proc2, VerifyInternal(_, _, _, _, CertVerifyProc::VERIFY_REV_CHECKING_ENABLED, _, _, _)) - .WillRepeatedly( + .WillOnce( DoAll(SetArgPointee<7>(revoked_result), Return(ERR_CERT_REVOKED))); +#endif std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -1395,27 +1529,25 @@ RunUntilIdle(); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + testing::Mock::VerifyAndClear(verify_proc2.get()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); + histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", + 1); #if defined(OS_MACOSX) // Expect no report. EXPECT_EQ(0U, reports.size()); - // Secondary should have been called twice - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", - 2); histograms_.ExpectUniqueSample( "Net.CertVerifier_TrialComparisonResult", TrialComparisonCertVerifier::kIgnoredMacUndesiredRevocationChecking, 1); #else - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", - 1); + // Expect a report. + EXPECT_EQ(1U, reports.size()); + histograms_.ExpectUniqueSample( "Net.CertVerifier_TrialComparisonResult", TrialComparisonCertVerifier::kPrimaryErrorSecondaryValid, 1); - - // Expect a report. - EXPECT_EQ(1U, reports.size()); #endif } @@ -1437,12 +1569,20 @@ scoped_refptr<MockCertVerifyProc> verify_proc2 = base::MakeRefCounted<MockCertVerifyProc>(); EXPECT_CALL(*verify_proc2, VerifyInternal(_, _, _, _, _, _, _, _)) +#if defined(OS_MACOSX) + // The secondary should have been called twice on Mac due to attempting + // the kIgnoredMacUndesiredRevocationCheckingWorkaround. + .Times(2) +#else + .Times(1) +#endif .WillRepeatedly(DoAll(SetArgPointee<7>(ok_result), Return(OK))); std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -1460,18 +1600,11 @@ RunUntilIdle(); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + testing::Mock::VerifyAndClear(verify_proc2.get()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); -#if defined(OS_MACOSX) - // Secondary should have been called twice on mac due to attempting the - // kIgnoredMacUndesiredRevocationChecking workaround. - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", - 2); -#else histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); - -#endif histograms_.ExpectUniqueSample( "Net.CertVerifier_TrialComparisonResult", TrialComparisonCertVerifier::kPrimaryErrorSecondaryValid, 1); @@ -1518,8 +1651,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -1533,7 +1667,7 @@ EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); verify_proc2->WaitForVerifyCall(); RunUntilIdle(); @@ -1541,7 +1675,8 @@ // Expect no report. EXPECT_TRUE(reports.empty()); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -1582,8 +1717,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -1597,7 +1733,7 @@ EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); verify_proc2->WaitForVerifyCall(); RunUntilIdle(); @@ -1605,7 +1741,8 @@ // Expect a report. ASSERT_EQ(1U, reports.size()); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -1649,8 +1786,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -1664,7 +1802,7 @@ EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); verify_proc2->WaitForVerifyCall(); RunUntilIdle(); @@ -1672,7 +1810,8 @@ // Expect a report. ASSERT_EQ(1U, reports.size()); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1); @@ -1698,8 +1837,9 @@ std::vector<TrialReportInfo> reports; TrialComparisonCertVerifier verifier( - true /* initial_allowed */, verify_proc1, verify_proc2, + verify_proc1, verify_proc2, base::BindRepeating(&RecordTrialReport, &reports)); + verifier.set_trial_allowed(true); CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0, /*ocsp_response=*/std::string(), @@ -1713,7 +1853,7 @@ EXPECT_TRUE(request); error = callback.WaitForResult(); - EXPECT_THAT(error, IsError(OK)); + EXPECT_THAT(error, IsOk()); verify_proc2->WaitForVerifyCall(); RunUntilIdle(); @@ -1721,7 +1861,8 @@ // Expect no report. EXPECT_TRUE(reports.empty()); - histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1); + EXPECT_EQ(1, verify_proc1->num_verifications()); + EXPECT_EQ(1, verify_proc2->num_verifications()); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1); histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary", 1);
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc index 6c2abf8..81b6395a 100644 --- a/net/cookies/cookie_monster.cc +++ b/net/cookies/cookie_monster.cc
@@ -518,11 +518,6 @@ return change_dispatcher_; } -void CookieMonster::SetCookieAccessDelegate( - std::unique_ptr<CookieAccessDelegate> delegate) { - cookie_access_delegate_ = std::move(delegate); -} - void CookieMonster::DumpMemoryStats( base::trace_event::ProcessMemoryDump* pmd, const std::string& parent_absolute_name) const { @@ -1676,8 +1671,8 @@ CookieAccessSemantics CookieMonster::GetAccessSemanticsForCookie( const CanonicalCookie& cookie) const { - if (cookie_access_delegate_) - return cookie_access_delegate_->GetAccessSemantics(cookie); + if (cookie_access_delegate()) + return cookie_access_delegate()->GetAccessSemantics(cookie); return CookieAccessSemantics::UNKNOWN; }
diff --git a/net/cookies/cookie_monster.h b/net/cookies/cookie_monster.h index e739587..de36d79 100644 --- a/net/cookies/cookie_monster.h +++ b/net/cookies/cookie_monster.h
@@ -192,10 +192,6 @@ static const char* const kDefaultCookieableSchemes[]; static const int kDefaultCookieableSchemesCount; - // Take ownership of a CookieAccessDelegate. - void SetCookieAccessDelegate( - std::unique_ptr<CookieAccessDelegate> delegate) override; - void DumpMemoryStats(base::trace_event::ProcessMemoryDump* pmd, const std::string& parent_absolute_name) const override; @@ -628,10 +624,6 @@ bool persist_session_cookies_; - // Used to determine whether a particular cookie should be subject to legacy - // or non-legacy access semantics. - std::unique_ptr<CookieAccessDelegate> cookie_access_delegate_; - base::ThreadChecker thread_checker_; base::WeakPtrFactory<CookieMonster> weak_ptr_factory_{this};
diff --git a/net/cookies/cookie_store.cc b/net/cookies/cookie_store.cc index 6c31a75..0556a07 100644 --- a/net/cookies/cookie_store.cc +++ b/net/cookies/cookie_store.cc
@@ -9,6 +9,8 @@ namespace net { +CookieStore::CookieStore() = default; + CookieStore::~CookieStore() = default; void CookieStore::DeleteAllAsync(DeleteCallback callback) { @@ -22,7 +24,7 @@ void CookieStore::SetCookieAccessDelegate( std::unique_ptr<CookieAccessDelegate> delegate) { - // By default, do nothing. + cookie_access_delegate_ = std::move(delegate); } void CookieStore::DumpMemoryStats(
diff --git a/net/cookies/cookie_store.h b/net/cookies/cookie_store.h index ccc3471..102428f 100644 --- a/net/cookies/cookie_store.h +++ b/net/cookies/cookie_store.h
@@ -54,6 +54,7 @@ using DeleteCallback = base::OnceCallback<void(uint32_t num_deleted)>; using SetCookieableSchemesCallback = base::OnceCallback<void(bool success)>; + CookieStore(); virtual ~CookieStore(); // Set the cookie on the cookie store. |cookie.IsCanonical()| must @@ -129,12 +130,23 @@ SetCookieableSchemesCallback callback) = 0; // Transfer ownership of a CookieAccessDelegate. - virtual void SetCookieAccessDelegate( - std::unique_ptr<CookieAccessDelegate> delegate); + void SetCookieAccessDelegate(std::unique_ptr<CookieAccessDelegate> delegate); // Reports the estimate of dynamically allocated memory in bytes. virtual void DumpMemoryStats(base::trace_event::ProcessMemoryDump* pmd, const std::string& parent_absolute_name) const; + + protected: + // This may be null if no delegate has been set yet, or the delegate has been + // reset to null. + const CookieAccessDelegate* cookie_access_delegate() const { + return cookie_access_delegate_.get(); + } + + private: + // Used to determine whether a particular cookie should be subject to legacy + // or non-legacy access semantics. + std::unique_ptr<CookieAccessDelegate> cookie_access_delegate_; }; } // namespace net
diff --git a/services/metrics/ukm_api.md b/services/metrics/ukm_api.md index eeb7c2b..af637e61 100644 --- a/services/metrics/ukm_api.md +++ b/services/metrics/ukm_api.md
@@ -254,7 +254,7 @@ ### Local Testing -Build Chromium and run it with '--force-enable-metrics-reporting'. Trigger your event locally and check chrome://ukm to make sure the data was recorded correctly. +Build Chromium and run it with '--force-enable-metrics-reporting --metrics-upload-interval=N'. You may want some small N if you are interested in seeing behavior when UKM reports are emitted. Trigger your event locally and check chrome://ukm to make sure the data was recorded correctly. ## Unit Testing
diff --git a/services/network/cert_verifier_with_trust_anchors.cc b/services/network/cert_verifier_with_trust_anchors.cc index 0441894..f307277d 100644 --- a/services/network/cert_verifier_with_trust_anchors.cc +++ b/services/network/cert_verifier_with_trust_anchors.cc
@@ -11,6 +11,7 @@ #include "net/base/net_errors.h" #include "net/cert/caching_cert_verifier.h" #include "net/cert/cert_verify_proc.h" +#include "net/cert/coalescing_cert_verifier.h" #include "net/cert/multi_threaded_cert_verifier.h" namespace network { @@ -65,7 +66,8 @@ << "Additional trust anchors not supported on the current platform!"; } delegate_ = std::make_unique<net::CachingCertVerifier>( - std::make_unique<net::MultiThreadedCertVerifier>(verify_proc.get())); + std::make_unique<net::CoalescingCertVerifier>( + std::make_unique<net::MultiThreadedCertVerifier>(verify_proc.get()))); delegate_->SetConfig(ExtendTrustAnchors(orig_config_, trust_anchors_)); }
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index 4321c306..7e154991 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -42,6 +42,7 @@ #include "net/base/network_isolation_key.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "net/cert/cert_verifier.h" +#include "net/cert/coalescing_cert_verifier.h" #include "net/cert/ct_verify_result.h" #include "net/cert_net/cert_net_fetcher_impl.h" #include "net/cookies/cookie_monster.h" @@ -1541,14 +1542,18 @@ #elif BUILDFLAG(TRIAL_COMPARISON_CERT_VERIFIER_SUPPORTED) if (params_->trial_comparison_cert_verifier_params) { cert_verifier = std::make_unique<net::CachingCertVerifier>( - std::make_unique<TrialComparisonCertVerifierMojo>( - params_->trial_comparison_cert_verifier_params->initial_allowed, - std::move(params_->trial_comparison_cert_verifier_params - ->config_client_request), - std::move(params_->trial_comparison_cert_verifier_params - ->report_client), - net::CertVerifyProc::CreateSystemVerifyProc(cert_net_fetcher_), - net::CertVerifyProc::CreateBuiltinVerifyProc(cert_net_fetcher_))); + std::make_unique<net::CoalescingCertVerifier>( + std::make_unique<TrialComparisonCertVerifierMojo>( + params_->trial_comparison_cert_verifier_params + ->initial_allowed, + std::move(params_->trial_comparison_cert_verifier_params + ->config_client_request), + std::move(params_->trial_comparison_cert_verifier_params + ->report_client), + net::CertVerifyProc::CreateSystemVerifyProc( + cert_net_fetcher_), + net::CertVerifyProc::CreateBuiltinVerifyProc( + cert_net_fetcher_)))); } #endif if (!cert_verifier)
diff --git a/services/network/trial_comparison_cert_verifier_mojo.cc b/services/network/trial_comparison_cert_verifier_mojo.cc index a2a6eba..1729b2e8 100644 --- a/services/network/trial_comparison_cert_verifier_mojo.cc +++ b/services/network/trial_comparison_cert_verifier_mojo.cc
@@ -29,12 +29,13 @@ report_client_(std::move(report_client)) { trial_comparison_cert_verifier_ = std::make_unique<net::TrialComparisonCertVerifier>( - initial_allowed, primary_verify_proc, trial_verify_proc, + primary_verify_proc, trial_verify_proc, base::BindRepeating( &TrialComparisonCertVerifierMojo::OnSendTrialReport, // Unretained safe because the report_callback will not be called // after trial_comparison_cert_verifier_ is destroyed. base::Unretained(this))); + trial_comparison_cert_verifier_->set_trial_allowed(initial_allowed); } TrialComparisonCertVerifierMojo::~TrialComparisonCertVerifierMojo() = default;
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index 0bcad6e..868ad5a 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -145,8 +145,7 @@ ], "name": "shard #${SHARD_INDEX} logcats" } - ], - "shards": 10 + ] }, "test": "android_browsertests" }, @@ -194,7 +193,7 @@ "name": "shard #${SHARD_INDEX} logcats" } ], - "shards": 10 + "shards": 20 }, "test": "chrome_public_test_apk" }, @@ -242,7 +241,7 @@ "name": "shard #${SHARD_INDEX} logcats" } ], - "shards": 10 + "shards": 20 }, "test": "content_browsertests" }, @@ -290,7 +289,7 @@ "name": "shard #${SHARD_INDEX} logcats" } ], - "shards": 10 + "shards": 5 }, "test": "content_shell_test_apk" }, @@ -337,7 +336,8 @@ ], "name": "shard #${SHARD_INDEX} logcats" } - ] + ], + "shards": 10 }, "test": "content_unittests" }, @@ -384,7 +384,8 @@ ], "name": "shard #${SHARD_INDEX} logcats" } - ] + ], + "shards": 10 }, "test": "unit_tests" }
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index dd5cf2a..f96c1b7f 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -10526,7 +10526,7 @@ "os": "Ubuntu-16.04" } ], - "shards": 10 + "shards": 20 }, "test": "content_browsertests" }, @@ -10546,7 +10546,8 @@ { "os": "Ubuntu-16.04" } - ] + ], + "shards": 10 }, "test": "content_unittests" }, @@ -10566,7 +10567,8 @@ { "os": "Ubuntu-16.04" } - ] + ], + "shards": 10 }, "test": "unit_tests" }
diff --git a/testing/buildbot/filters/bfcache.chrome_public_test_apk.filter b/testing/buildbot/filters/bfcache.chrome_public_test_apk.filter index 1ee44b5..891db3e 100644 --- a/testing/buildbot/filters/bfcache.chrome_public_test_apk.filter +++ b/testing/buildbot/filters/bfcache.chrome_public_test_apk.filter
@@ -22,14 +22,13 @@ -org.chromium.chrome.browser.infobar.InfoBarTest.testInfoBarForGeolocationDisappearsOnBack -org.chromium.chrome.browser.keyboard_accessory.PasswordGenerationIntegrationTest.testAutomaticGenerationUsePassword -org.chromium.chrome.browser.keyboard_accessory.PasswordGenerationIntegrationTest.testManualGenerationUsePassword --org.chromium.chrome.browser.media.* -org.chromium.chrome.browser.notifications.NotificationPlatformBridgeIntentTest.testLaunchNotificationPreferencesForCategory -org.chromium.chrome.browser.notifications.NotificationPlatformBridgeIntentTest.testLaunchNotificationPreferencesForWebsite -org.chromium.chrome.browser.offlinepages.* --org.chromium.chrome.browser.password_manager.OnboardingDialogIntegrationTest.testOnboardingAccepted --org.chromium.chrome.browser.password_manager.OnboardingDialogIntegrationTest.testOnboardingDismissedPressedBack --org.chromium.chrome.browser.password_manager.OnboardingDialogIntegrationTest.testOnboardingIsShown --org.chromium.chrome.browser.password_manager.OnboardingDialogIntegrationTest.testOnboardingRejected -org.chromium.chrome.browser.profiling_host.ProfilingProcessHostAndroidTest.testModeBrowser -org.chromium.chrome.browser.tabmodel.IncognitoTabModelTest.testRecreateInIncognito -org.chromium.chrome.browser.toolbar.top.BrandColorTest.testBrandColorInterstitial + +# Autofill / password manager. +# https://crbug.com/1011799 +-org.chromium.chrome.browser.password_manager.OnboardingDialogIntegrationTest.testOnboardingDismissedPressedBack
diff --git a/testing/buildbot/filters/bfcache.content_browsertests.filter b/testing/buildbot/filters/bfcache.content_browsertests.filter index 2ab98d0b..d56c279 100644 --- a/testing/buildbot/filters/bfcache.content_browsertests.filter +++ b/testing/buildbot/filters/bfcache.content_browsertests.filter
@@ -95,17 +95,13 @@ # Failing on android only, need to be triaged, see https://crbug.com/1006267. -BackForwardCacheMetricsBrowserTest.Fetch -BackForwardCacheMetricsBrowserTest.XHR +-WebContentsSplitCacheBrowserTestEnabled.SplitCache* -WebRtcBrowserTest.CanSetupH264VideoCallOnSupportedDevice -WithoutCORBProtectionSniffing/CrossSiteDocumentBlockingTest.* -WithCORBProtectionSniffing/CrossSiteDocumentBlockingTest.* # Flaky on android only, need to be triaged, see https://crbug.com/1006267. -IndexedDBBrowserTest* --MediaCanPlayTypeTest.* --MediaSessionImplBrowserTest.* --MediaSessionImplParamBrowserTest.* --MediaSourceTest.* --MidiBrowserTest.* -MHTMLGenerationTest/MHTMLGenerationTest.* -MSE_ClearKey/EncryptedMediaTest.* -MSE_ExternalClearKey/EncryptedMediaTest.*
diff --git a/testing/buildbot/filters/bfcache.content_unittests.filter b/testing/buildbot/filters/bfcache.content_unittests.filter index 3a35d00..7c474576 100644 --- a/testing/buildbot/filters/bfcache.content_unittests.filter +++ b/testing/buildbot/filters/bfcache.content_unittests.filter
@@ -49,10 +49,5 @@ -GeolocationServiceTest.* -MediaInternalsAudioLogTest/MediaInternalsAudioLogTest.* -MediaInternalsVideoCaptureDeviceTest.NotifyVideoCaptureDeviceCapabilitiesEnumerated --MediaSessionControllerTest.* --MediaSessionEnabledTestInstances/MediaSessionControllersManagerTest.* --MediaSessionImplServiceRoutingTest.* --MediaSessionImplTest.* --MediaSessionImplUmaTest.* -MediaStreamManagerTest.* -RenderFrameAudioOutputStreamFactoryTest.*
diff --git a/testing/buildbot/filters/bfcache.unit_tests.filter b/testing/buildbot/filters/bfcache.unit_tests.filter index 0918c5a..6eaa384 100644 --- a/testing/buildbot/filters/bfcache.unit_tests.filter +++ b/testing/buildbot/filters/bfcache.unit_tests.filter
@@ -19,6 +19,5 @@ -CreditCardAccessoryControllerTest.ServerCardUnmask # Other failures --MediaDrmOriginIdManagerTest.NetworkChangeFails -OfflinePageUtilsTest.* -PreviewsUKMObserverTest.TestPageEndReasonUMA
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 9fb4278..bdf12ab 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -210,9 +210,6 @@ '--enable-features=BackForwardCache', '--test-launcher-filter-file=../../testing/buildbot/filters/bfcache.android_browsertests.filter' ], - 'swarming': { - 'shards': 10, - }, 'test': 'android_browsertests', }, 'bf_cache_content_shell_test_apk': { @@ -221,7 +218,7 @@ '--test-launcher-filter-file=../../testing/buildbot/filters/bfcache.content_shell_test_apk.filter' ], 'swarming': { - 'shards': 10, + 'shards': 5, }, 'test': 'content_shell_test_apk', }, @@ -231,7 +228,7 @@ '--test-launcher-filter-file=../../testing/buildbot/filters/bfcache.chrome_public_test_apk.filter' ], 'swarming': { - 'shards': 10, + 'shards': 20, }, 'test': 'chrome_public_test_apk', }, @@ -243,6 +240,9 @@ '--enable-features=BackForwardCache', '--test-launcher-filter-file=../../testing/buildbot/filters/bfcache.content_unittests.filter' ], + 'swarming': { + 'shards': 10, + }, 'test': 'content_unittests', }, 'bf_cache_unit_tests': { @@ -250,6 +250,9 @@ '--enable-features=BackForwardCache', '--test-launcher-filter-file=../../testing/buildbot/filters/bfcache.unit_tests.filter' ], + 'swarming': { + 'shards': 10, + }, 'test': 'unit_tests', }, 'bf_cache_content_browsertests': { @@ -258,7 +261,7 @@ '--test-launcher-filter-file=../../testing/buildbot/filters/bfcache.content_browsertests.filter' ], 'swarming': { - 'shards': 10, + 'shards': 20, }, 'test': 'content_browsertests', },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 3fd106d..873d84b7 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1460,6 +1460,25 @@ ] } ], + "CacheStorageSequence": [ + { + "platforms": [ + "windows", + "mac", + "chromeos", + "linux", + "android" + ], + "experiments": [ + { + "name": "Enabled1", + "enable_features": [ + "CacheStorageSequence" + ] + } + ] + } + ], "CertDualVerificationTrial": [ { "platforms": [
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn index 3d70bf2..7b773af 100644 --- a/third_party/blink/public/BUILD.gn +++ b/third_party/blink/public/BUILD.gn
@@ -564,21 +564,27 @@ ] } +if (external_devtools_frontend) { + devtools_frontend_path = "//third_party/devtools-frontend" +} else { + devtools_frontend_path = "//third_party/blink/renderer/devtools" +} + group("blink_devtools_frontend_resources") { public_deps = [ - "//third_party/blink/renderer/devtools:devtools_frontend_resources", + "$devtools_frontend_path:devtools_frontend_resources", ] } group("blink_devtools_frontend_resources_files") { data_deps = [ - "//third_party/blink/renderer/devtools:devtools_all_files", + "$devtools_frontend_path:devtools_all_files", ] } group("blink_generate_devtools_grd") { public_deps = [ - "//third_party/blink/renderer/devtools:generate_devtools_grd", + "$devtools_frontend_path:generate_devtools_grd", ] }
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom index fcb0387e..827a217 100644 --- a/third_party/blink/public/mojom/web_feature/web_feature.mojom +++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2433,6 +2433,7 @@ kRenderSubtreeAttribute = 3049, kARIAAnnotationRoles = 3050, kIntersectionObserverV2 = 3051, + kHeavyAdIntervention = 3052, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/public_features.gni b/third_party/blink/public/public_features.gni index f9775696..c4834ef 100644 --- a/third_party/blink/public/public_features.gni +++ b/third_party/blink/public/public_features.gni
@@ -10,6 +10,10 @@ # resources.pak. It is still possible to load JS files from disk by passing # --debug-devtools cmdline switch. debug_devtools = false + + # If external_devtools_frontend is set to true, use DevTools frontend that is + # pulled as external dependency. + external_devtools_frontend = false } # Unhandled Tap enable means Contextual Search aka Tap to Search.
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc b/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc index bf4203e..41870574 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
@@ -173,8 +173,9 @@ uint16_t class_id) override; // v8::EmbedderHeapTracer::TracedGlobalHandleVisitor override. - void VisitTracedGlobalHandle( - const v8::TracedGlobal<v8::Value>& value) override; + void VisitTracedReference( + const v8::TracedReference<v8::Value>& value) override; + void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>&) override; // Visitor overrides. void VisitRoot(void*, TraceDescriptor, const base::Location&) final; @@ -508,8 +509,8 @@ } } -void V8EmbedderGraphBuilder::VisitTracedGlobalHandle( - const v8::TracedGlobal<v8::Value>& value) { +void V8EmbedderGraphBuilder::VisitTracedReference( + const v8::TracedReference<v8::Value>& value) { const uint16_t class_id = value.WrapperClassId(); if (class_id != WrapperTypeInfo::kNodeClassId && class_id != WrapperTypeInfo::kObjectClassId) @@ -517,6 +518,11 @@ VisitPersistentHandleInternal(value.As<v8::Object>().Get(isolate_), class_id); } +void V8EmbedderGraphBuilder::VisitTracedGlobalHandle( + const v8::TracedGlobal<v8::Value>&) { + CHECK(false) << "Blink does not use v8::TracedGlobal."; +} + void V8EmbedderGraphBuilder::VisitPersistentHandle( v8::Persistent<v8::Value>* value, uint16_t class_id) {
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc index 2620f658..de32813 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
@@ -252,7 +252,11 @@ VisitHandle(value, class_id); } - void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>& value) final { + void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>&) final { + CHECK(false) << "Blink does not use v8::TracedGlobal."; + } + + void VisitTracedReference(const v8::TracedReference<v8::Value>& value) final { VisitHandle(&value, value.WrapperClassId()); }
diff --git a/third_party/blink/renderer/core/DEPS b/third_party/blink/renderer/core/DEPS index 6d9845f..b72fb9b 100644 --- a/third_party/blink/renderer/core/DEPS +++ b/third_party/blink/renderer/core/DEPS
@@ -42,7 +42,7 @@ "+cc/layers/layer_position_constraint.h", "+cc/layers/layer_sticky_position_constraint.h", "+cc/layers/picture_layer.h", - "+cc/layers/scrollbar_layer_interface.h", + "+cc/layers/scrollbar_layer_base.h", "+cc/layers/surface_layer.h", "+cc/metrics/begin_main_frame_metrics.h", "+cc/paint/display_item_list.h",
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 704aee4..29365b5 100644 --- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc +++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -305,7 +305,7 @@ // See https://drafts.csswg.org/css-display/#unbox-html // Some of these elements are handled with other adjustments above. if (IsA<HTMLBRElement>(element) || IsHTMLWBRElement(element) || - IsA<HTMLMeterElement>(element) || IsHTMLProgressElement(element) || + IsA<HTMLMeterElement>(element) || IsA<HTMLProgressElement>(element) || IsA<HTMLCanvasElement>(element) || IsHTMLMediaElement(element) || IsHTMLInputElement(element) || IsHTMLTextAreaElement(element) || IsHTMLSelectElement(element)) {
diff --git a/third_party/blink/renderer/core/dom/flat_tree_traversal.cc b/third_party/blink/renderer/core/dom/flat_tree_traversal.cc index 18d31ac..bb95f1b 100644 --- a/third_party/blink/renderer/core/dom/flat_tree_traversal.cc +++ b/third_party/blink/renderer/core/dom/flat_tree_traversal.cc
@@ -138,7 +138,7 @@ ? insertion_point.FirstDistributedNode() : insertion_point.LastDistributedNode())) return found; - DCHECK(IsHTMLShadowElement(insertion_point) || + DCHECK(IsA<HTMLShadowElement>(insertion_point) || (IsA<HTMLContentElement>(insertion_point) && !insertion_point.HasChildren())); }
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc index 10f5c24..e5de4bb3 100644 --- a/third_party/blink/renderer/core/dom/node.cc +++ b/third_party/blink/renderer/core/dom/node.cc
@@ -2567,9 +2567,9 @@ if (HasEventTargetData()) return *GetEventTargetDataMap().at(this); DCHECK(!GetEventTargetDataMap().Contains(this)); - SetHasEventTargetData(true); EventTargetData* data = MakeGarbageCollected<EventTargetData>(); GetEventTargetDataMap().Set(this, data); + SetHasEventTargetData(true); return *data; }
diff --git a/third_party/blink/renderer/core/dom/shadow_root_v0.cc b/third_party/blink/renderer/core/dom/shadow_root_v0.cc index b9f0581..c4cf987 100644 --- a/third_party/blink/renderer/core/dom/shadow_root_v0.cc +++ b/third_party/blink/renderer/core/dom/shadow_root_v0.cc
@@ -168,7 +168,7 @@ for (const auto& point : DescendantInsertionPoints()) { if (!point->IsActive()) continue; - if (auto* shadow = ToHTMLShadowElementOrNull(*point)) { + if (auto* shadow = DynamicTo<HTMLShadowElement>(*point)) { DCHECK(!shadow_insertion_point); shadow_insertion_point = shadow; } else {
diff --git a/third_party/blink/renderer/core/dom/shadow_root_v0.h b/third_party/blink/renderer/core/dom/shadow_root_v0.h index a8d93d3..974294b2 100644 --- a/third_party/blink/renderer/core/dom/shadow_root_v0.h +++ b/third_party/blink/renderer/core/dom/shadow_root_v0.h
@@ -103,7 +103,7 @@ inline void ShadowRootV0::DidAddInsertionPoint(V0InsertionPoint* point) { DCHECK(point); - if (IsHTMLShadowElement(*point)) + if (IsA<HTMLShadowElement>(*point)) ++descendant_shadow_element_count_; else if (IsA<HTMLContentElement>(*point)) ++descendant_content_element_count_; @@ -114,7 +114,7 @@ inline void ShadowRootV0::DidRemoveInsertionPoint(V0InsertionPoint* point) { DCHECK(point); - if (IsHTMLShadowElement(*point)) { + if (IsA<HTMLShadowElement>(*point)) { DCHECK_GT(descendant_shadow_element_count_, 0u); --descendant_shadow_element_count_; } else if (IsA<HTMLContentElement>(*point)) {
diff --git a/third_party/blink/renderer/core/dom/v0_insertion_point.cc b/third_party/blink/renderer/core/dom/v0_insertion_point.cc index f2694f2..0aff714 100644 --- a/third_party/blink/renderer/core/dom/v0_insertion_point.cc +++ b/third_party/blink/renderer/core/dom/v0_insertion_point.cc
@@ -193,14 +193,14 @@ return false; ShadowRoot* shadow_root = ContainingShadowRoot(); DCHECK(shadow_root); - if (!IsHTMLShadowElement(*this) || + if (!IsA<HTMLShadowElement>(*this) || shadow_root->V0().DescendantShadowElementCount() <= 1) return true; // Slow path only when there are more than one shadow elements in a shadow // tree. That should be a rare case. for (const auto& point : shadow_root->V0().DescendantInsertionPoints()) { - if (IsHTMLShadowElement(*point)) + if (IsA<HTMLShadowElement>(*point)) return point == this; } return true;
diff --git a/third_party/blink/renderer/core/editing/finder/find_buffer.cc b/third_party/blink/renderer/core/editing/finder/find_buffer.cc index a96e206..3e78579 100644 --- a/third_party/blink/renderer/core/editing/finder/find_buffer.cc +++ b/third_party/blink/renderer/core/editing/finder/find_buffer.cc
@@ -104,7 +104,7 @@ return (!element->ShouldSerializeEndTag() && !IsHTMLInputElement(*element)) || IsA<HTMLIFrameElement>(*element) || IsHTMLImageElement(*element) || IsA<HTMLLegendElement>(*element) || IsA<HTMLMeterElement>(*element) || - IsHTMLObjectElement(*element) || IsHTMLProgressElement(*element) || + IsHTMLObjectElement(*element) || IsA<HTMLProgressElement>(*element) || (IsHTMLSelectElement(*element) && ToHTMLSelectElement(*element).UsesMenuList()) || IsHTMLStyleElement(*element) || IsHTMLScriptElement(*element) ||
diff --git a/third_party/blink/renderer/core/editing/iterators/text_iterator.cc b/third_party/blink/renderer/core/editing/iterators/text_iterator.cc index 276df9d7..62879e20 100644 --- a/third_party/blink/renderer/core/editing/iterators/text_iterator.cc +++ b/third_party/blink/renderer/core/editing/iterators/text_iterator.cc
@@ -379,7 +379,7 @@ IsA<HTMLLegendElement>(html_element) || IsHTMLImageElement(html_element) || IsA<HTMLMeterElement>(html_element) || - IsHTMLProgressElement(html_element))))) { + IsA<HTMLProgressElement>(html_element))))) { HandleReplacedElement(); } else { HandleNonTextNode();
diff --git a/third_party/blink/renderer/core/events/message_event.cc b/third_party/blink/renderer/core/events/message_event.cc index b008fd9..782ff96 100644 --- a/third_party/blink/renderer/core/events/message_event.cc +++ b/third_party/blink/renderer/core/events/message_event.cc
@@ -41,7 +41,7 @@ static inline bool IsValidSource(EventTarget* source) { return !source || source->ToLocalDOMWindow() || source->ToMessagePort() || source->ToServiceWorker() || source->ToPortalHost() || - ToHTMLPortalElementOrNull(source->ToNode()); + IsA<HTMLPortalElement>(source->ToNode()); } MessageEvent::V8GCAwareString::V8GCAwareString(const String& value)
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.cc b/third_party/blink/renderer/core/frame/visual_viewport.cc index c9ade44..2cedb01 100644 --- a/third_party/blink/renderer/core/frame/visual_viewport.cc +++ b/third_party/blink/renderer/core/frame/visual_viewport.cc
@@ -34,7 +34,7 @@ #include "cc/input/main_thread_scrolling_reason.h" #include "cc/layers/picture_layer.h" -#include "cc/layers/scrollbar_layer_interface.h" +#include "cc/layers/scrollbar_layer_base.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/web_scroll_into_view_params.h" #include "third_party/blink/renderer/core/frame/local_frame.h" @@ -293,7 +293,7 @@ IntPoint()); } - if (overlay_scrollbar_horizontal_) { + if (scrollbar_graphics_layer_horizontal_) { EffectPaintPropertyNode::State state; state.local_transform_space = transform_parent; state.direct_compositing_reasons = @@ -310,13 +310,13 @@ *effect_parent, std::move(state))); } - overlay_scrollbar_horizontal_->SetLayerState( + scrollbar_graphics_layer_horizontal_->SetLayerState( PropertyTreeState(*transform_parent, *context.current.clip, *horizontal_scrollbar_effect_node_), ScrollbarOffset(ScrollbarOrientation::kHorizontalScrollbar)); } - if (overlay_scrollbar_vertical_) { + if (scrollbar_graphics_layer_vertical_) { EffectPaintPropertyNode::State state; state.local_transform_space = transform_parent; state.direct_compositing_reasons = @@ -333,7 +333,7 @@ *effect_parent, std::move(state))); } - overlay_scrollbar_vertical_->SetLayerState( + scrollbar_graphics_layer_vertical_->SetLayerState( PropertyTreeState(*transform_parent, *context.current.clip, *vertical_scrollbar_effect_node_), ScrollbarOffset(ScrollbarOrientation::kVerticalScrollbar)); @@ -382,8 +382,8 @@ ViewportToTracedValue()); // Need to re-compute sizes for the overlay scrollbars. - if (overlay_scrollbar_horizontal_) { - DCHECK(overlay_scrollbar_vertical_); + if (scrollbar_graphics_layer_horizontal_) { + DCHECK(scrollbar_graphics_layer_vertical_); SetupScrollbar(kHorizontalScrollbar); SetupScrollbar(kVerticalScrollbar); } @@ -582,7 +582,8 @@ if (scroll_layer_) return; - DCHECK(!overlay_scrollbar_horizontal_ && !overlay_scrollbar_vertical_); + DCHECK(!scrollbar_graphics_layer_horizontal_ && + !scrollbar_graphics_layer_vertical_); needs_paint_property_update_ = true; @@ -632,15 +633,16 @@ if (VisualViewportSuppliesScrollbars() && !GetPage().GetSettings().GetHideScrollbars()) { - DCHECK(!overlay_scrollbar_horizontal_); - DCHECK(!overlay_scrollbar_vertical_); - overlay_scrollbar_horizontal_ = std::make_unique<GraphicsLayer>(*this); - overlay_scrollbar_vertical_ = std::make_unique<GraphicsLayer>(*this); + DCHECK(!scrollbar_graphics_layer_horizontal_); + DCHECK(!scrollbar_graphics_layer_vertical_); + scrollbar_graphics_layer_horizontal_ = + std::make_unique<GraphicsLayer>(*this); + scrollbar_graphics_layer_vertical_ = std::make_unique<GraphicsLayer>(*this); SetupScrollbar(kHorizontalScrollbar); SetupScrollbar(kVerticalScrollbar); } else { - overlay_scrollbar_horizontal_ = nullptr; - overlay_scrollbar_vertical_ = nullptr; + scrollbar_graphics_layer_horizontal_ = nullptr; + scrollbar_graphics_layer_vertical_ = nullptr; } // Ensure existing LocalFrameView scrollbars are removed if the visual @@ -674,15 +676,14 @@ void VisualViewport::SetupScrollbar(ScrollbarOrientation orientation) { bool is_horizontal = orientation == kHorizontalScrollbar; GraphicsLayer* scrollbar_graphics_layer = - is_horizontal ? overlay_scrollbar_horizontal_.get() - : overlay_scrollbar_vertical_.get(); - std::unique_ptr<ScrollingCoordinator::ScrollbarLayerGroup>& - scrollbar_layer_group = is_horizontal ? scrollbar_layer_group_horizontal_ - : scrollbar_layer_group_vertical_; + is_horizontal ? scrollbar_graphics_layer_horizontal_.get() + : scrollbar_graphics_layer_vertical_.get(); + scoped_refptr<cc::ScrollbarLayerBase>& scrollbar_layer = + is_horizontal ? scrollbar_layer_horizontal_ : scrollbar_layer_vertical_; if (!scrollbar_graphics_layer->Parent()) root_transform_layer_->AddChild(scrollbar_graphics_layer); - if (!scrollbar_layer_group) { + if (!scrollbar_layer) { ScrollingCoordinator* coordinator = GetPage().GetScrollingCoordinator(); DCHECK(coordinator); @@ -693,20 +694,16 @@ int scrollbar_margin = clampTo<int>( std::floor(GetPage().GetChromeClient().WindowToViewportScalar( theme.ScrollbarMargin()))); - scrollbar_layer_group = coordinator->CreateSolidColorScrollbarLayer( + scrollbar_layer = coordinator->CreateSolidColorScrollbarLayer( orientation, thumb_thickness, scrollbar_margin, false, GetScrollbarElementId(orientation)); - // The compositor will control the scrollbar's visibility. Set to invisible - // by default so scrollbars don't show up in web tests. - scrollbar_layer_group->layer->SetOpacity(0.f); scrollbar_graphics_layer->SetContentsToCcLayer( - scrollbar_layer_group->layer.get(), + scrollbar_layer.get(), /*prevent_contents_opaque_changes=*/false); scrollbar_graphics_layer->SetDrawsContent(false); scrollbar_graphics_layer->SetHitTestable(false); - scrollbar_layer_group->scrollbar_layer->SetScrollElementId( - scroll_layer_->CcLayer()->element_id()); + scrollbar_layer->SetScrollElementId(scroll_layer_->CcLayer()->element_id()); } // Use the GraphicsLayer to position the scrollbars. @@ -927,11 +924,11 @@ } GraphicsLayer* VisualViewport::LayerForHorizontalScrollbar() const { - return overlay_scrollbar_horizontal_.get(); + return scrollbar_graphics_layer_horizontal_.get(); } GraphicsLayer* VisualViewport::LayerForVerticalScrollbar() const { - return overlay_scrollbar_vertical_.get(); + return scrollbar_graphics_layer_vertical_.get(); } IntRect VisualViewport::ComputeInterestRect(const GraphicsLayer*, @@ -1141,9 +1138,9 @@ String name; if (graphics_layer == scroll_layer_.get()) { name = "Inner Viewport Scroll Layer"; - } else if (graphics_layer == overlay_scrollbar_horizontal_.get()) { + } else if (graphics_layer == scrollbar_graphics_layer_horizontal_.get()) { name = "Overlay Scrollbar Horizontal Layer"; - } else if (graphics_layer == overlay_scrollbar_vertical_.get()) { + } else if (graphics_layer == scrollbar_graphics_layer_vertical_.get()) { name = "Overlay Scrollbar Vertical Layer"; } else if (graphics_layer == root_transform_layer_.get()) { name = "Root Transform Layer"; @@ -1176,12 +1173,12 @@ void VisualViewport::DisposeImpl() { root_transform_layer_.reset(); scroll_layer_.reset(); - // scrollbar_layer_group_* are referenced from overlay_scrollbar_*, thus - // overlay_scrollbar_* must be destroyed before scrollbar_layer_group_*. - overlay_scrollbar_horizontal_.reset(); - overlay_scrollbar_vertical_.reset(); - scrollbar_layer_group_horizontal_.reset(); - scrollbar_layer_group_vertical_.reset(); + // scrollbar_layer_* are referenced from scrollbar_graphics_layer_*, thus + // scrollbar_graphics_layer_* must be destroyed before scrollbar_layer_*. + scrollbar_graphics_layer_horizontal_.reset(); + scrollbar_graphics_layer_vertical_.reset(); + scrollbar_layer_horizontal_.reset(); + scrollbar_layer_vertical_.reset(); device_emulation_transform_node_.reset(); overscroll_elasticity_transform_node_.reset(); page_scale_node_.reset();
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.h b/third_party/blink/renderer/core/frame/visual_viewport.h index 6b65eb6c..b675a62 100644 --- a/third_party/blink/renderer/core/frame/visual_viewport.h +++ b/third_party/blink/renderer/core/frame/visual_viewport.h
@@ -79,8 +79,8 @@ // root_transform_layer_ // +- scroll_layer_ (transform: scroll_translation_node_) // | +- LayoutView CompositedLayerMapping layers -// +- overlay_scrollbar_horizontal_ (optional, transform: DET_or_parent) -// +- overlay_scrollbar_vertical_ (optional, transform: DET_or_parent) +// +- scrollbar_graphics_layer_horizontal_ (optional, transform: DET_or_parent) +// +- scrollbar_graphics_layer_vertical_ (optional, transform: DET_or_parent) // (DET_or_parent: device_emulation_transform_node_ if exists, // or the parent transform state) // @@ -338,12 +338,10 @@ // The layers of the ScrollbarLayerGroups are referenced from the // GraphicsLayers, so the GraphicsLayers must be destructed first (declared // after). - std::unique_ptr<ScrollingCoordinator::ScrollbarLayerGroup> - scrollbar_layer_group_horizontal_; - std::unique_ptr<ScrollingCoordinator::ScrollbarLayerGroup> - scrollbar_layer_group_vertical_; - std::unique_ptr<GraphicsLayer> overlay_scrollbar_horizontal_; - std::unique_ptr<GraphicsLayer> overlay_scrollbar_vertical_; + scoped_refptr<cc::ScrollbarLayerBase> scrollbar_layer_horizontal_; + scoped_refptr<cc::ScrollbarLayerBase> scrollbar_layer_vertical_; + std::unique_ptr<GraphicsLayer> scrollbar_graphics_layer_horizontal_; + std::unique_ptr<GraphicsLayer> scrollbar_graphics_layer_vertical_; scoped_refptr<TransformPaintPropertyNode> device_emulation_transform_node_; scoped_refptr<TransformPaintPropertyNode>
diff --git a/third_party/blink/renderer/core/html/portal/portal_post_message_helper.cc b/third_party/blink/renderer/core/html/portal/portal_post_message_helper.cc index 82e04cc..d9a2ae3 100644 --- a/third_party/blink/renderer/core/html/portal/portal_post_message_helper.cc +++ b/third_party/blink/renderer/core/html/portal/portal_post_message_helper.cc
@@ -67,8 +67,7 @@ scoped_refptr<const SecurityOrigin> source_origin, scoped_refptr<const SecurityOrigin> target_origin) { DCHECK(event_target->ToPortalHost() || - (event_target->ToNode() && - ToHTMLPortalElementOrNull(event_target->ToNode()))); + IsA<HTMLPortalElement>(event_target->ToNode())); if (target_origin && !target_origin->IsSameSchemeHostPort(
diff --git a/third_party/blink/renderer/core/html/shadow/progress_shadow_element.cc b/third_party/blink/renderer/core/html/shadow/progress_shadow_element.cc index f8a92e7..f1cea38 100644 --- a/third_party/blink/renderer/core/html/shadow/progress_shadow_element.cc +++ b/third_party/blink/renderer/core/html/shadow/progress_shadow_element.cc
@@ -41,7 +41,7 @@ } HTMLProgressElement* ProgressShadowElement::ProgressElement() const { - return ToHTMLProgressElement(OwnerShadowHost()); + return To<HTMLProgressElement>(OwnerShadowHost()); } scoped_refptr<ComputedStyle>
diff --git a/third_party/blink/renderer/core/html/shadow/progress_shadow_element_test.cc b/third_party/blink/renderer/core/html/shadow/progress_shadow_element_test.cc index b193f6f..8fd9326 100644 --- a/third_party/blink/renderer/core/html/shadow/progress_shadow_element_test.cc +++ b/third_party/blink/renderer/core/html/shadow/progress_shadow_element_test.cc
@@ -30,8 +30,8 @@ <progress id='prog' style='-webkit-appearance:none' /> )HTML"); - HTMLProgressElement* progress = - ToHTMLProgressElement(GetDocument().getElementById("prog")); + auto* progress = + To<HTMLProgressElement>(GetDocument().getElementById("prog")); ASSERT_TRUE(progress); auto* shadow_element = To<Element>(progress->GetShadowRoot()->firstChild());
diff --git a/third_party/blink/renderer/core/layout/layout_progress.cc b/third_party/blink/renderer/core/layout/layout_progress.cc index 76f2ef7..e2cdda71 100644 --- a/third_party/blink/renderer/core/layout/layout_progress.cc +++ b/third_party/blink/renderer/core/layout/layout_progress.cc
@@ -105,7 +105,7 @@ } HTMLProgressElement* LayoutProgress::ProgressElement() const { - return ToHTMLProgressElement(GetNode()); + return To<HTMLProgressElement>(GetNode()); } } // namespace blink
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc index 46870d2e..8437734 100644 --- a/third_party/blink/renderer/core/loader/document_loader.cc +++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -504,6 +504,12 @@ params->previews_state = previews_state_; params->requestor_origin = requestor_origin_; params->origin_policy = origin_policy_; + // Force the commit origin for the error page to be opaque and + // contain precursor information from the document's origin. + // This is only used for renderer-side enforcement of CSP and the + // document origin used here is the origin of the document that was blocked. + params->origin_to_commit = + frame_->GetDocument()->GetSecurityOrigin()->DeriveNewOpaqueOrigin(); } void DocumentLoader::SetHistoryItemStateForCommit(
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc index 346acfd..eb84f23 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
@@ -34,7 +34,7 @@ #include "cc/layers/painted_overlay_scrollbar_layer.h" #include "cc/layers/painted_scrollbar_layer.h" #include "cc/layers/picture_layer.h" -#include "cc/layers/scrollbar_layer_interface.h" +#include "cc/layers/scrollbar_layer_base.h" #include "cc/layers/solid_color_scrollbar_layer.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" @@ -238,50 +238,42 @@ void ScrollingCoordinator::WillDestroyScrollableArea( ScrollableArea* scrollable_area) { - RemoveScrollbarLayerGroup(scrollable_area, kHorizontalScrollbar); - RemoveScrollbarLayerGroup(scrollable_area, kVerticalScrollbar); + RemoveScrollbarLayer(scrollable_area, kHorizontalScrollbar); + RemoveScrollbarLayer(scrollable_area, kVerticalScrollbar); } -void ScrollingCoordinator::RemoveScrollbarLayerGroup( +void ScrollingCoordinator::RemoveScrollbarLayer( ScrollableArea* scrollable_area, ScrollbarOrientation orientation) { ScrollbarMap& scrollbars = orientation == kHorizontalScrollbar ? horizontal_scrollbars_ : vertical_scrollbars_; - if (std::unique_ptr<ScrollbarLayerGroup> scrollbar_layer_group = + if (scoped_refptr<cc::ScrollbarLayerBase> scrollbar_layer = scrollbars.Take(scrollable_area)) { - GraphicsLayer::UnregisterContentsLayer(scrollbar_layer_group->layer.get()); + GraphicsLayer::UnregisterContentsLayer(scrollbar_layer.get()); } } -static std::unique_ptr<ScrollingCoordinator::ScrollbarLayerGroup> -CreateScrollbarLayer(Scrollbar& scrollbar, float device_scale_factor) { +static scoped_refptr<cc::ScrollbarLayerBase> CreateScrollbarLayer( + Scrollbar& scrollbar, + float device_scale_factor) { ScrollbarTheme& theme = scrollbar.GetTheme(); auto scrollbar_delegate = std::make_unique<ScrollbarLayerDelegate>(scrollbar, device_scale_factor); - - auto layer_group = - std::make_unique<ScrollingCoordinator::ScrollbarLayerGroup>(); + scoped_refptr<cc::ScrollbarLayerBase> scrollbar_layer; if (theme.UsesOverlayScrollbars() && theme.UsesNinePatchThumbResource()) { - auto scrollbar_layer = + scrollbar_layer = cc::PaintedOverlayScrollbarLayer::Create(std::move(scrollbar_delegate)); - scrollbar_layer->SetElementId(scrollbar.GetElementId()); - layer_group->scrollbar_layer = scrollbar_layer.get(); - layer_group->layer = std::move(scrollbar_layer); } else { - auto scrollbar_layer = + scrollbar_layer = cc::PaintedScrollbarLayer::Create(std::move(scrollbar_delegate)); - scrollbar_layer->SetElementId(scrollbar.GetElementId()); - layer_group->scrollbar_layer = scrollbar_layer.get(); - layer_group->layer = std::move(scrollbar_layer); } - - GraphicsLayer::RegisterContentsLayer(layer_group->layer.get()); - - return layer_group; + scrollbar_layer->SetElementId(scrollbar.GetElementId()); + GraphicsLayer::RegisterContentsLayer(scrollbar_layer.get()); + return scrollbar_layer; } -std::unique_ptr<ScrollingCoordinator::ScrollbarLayerGroup> +scoped_refptr<cc::ScrollbarLayerBase> ScrollingCoordinator::CreateSolidColorScrollbarLayer( ScrollbarOrientation orientation, int thumb_thickness, @@ -294,13 +286,8 @@ cc_orientation, thumb_thickness, track_start, is_left_side_vertical_scrollbar); scrollbar_layer->SetElementId(element_id); - - auto layer_group = std::make_unique<ScrollbarLayerGroup>(); - layer_group->scrollbar_layer = scrollbar_layer.get(); - layer_group->layer = std::move(scrollbar_layer); - GraphicsLayer::RegisterContentsLayer(layer_group->layer.get()); - - return layer_group; + GraphicsLayer::RegisterContentsLayer(scrollbar_layer.get()); + return scrollbar_layer; } static void DetachScrollbarLayer(GraphicsLayer* scrollbar_graphics_layer) { @@ -311,10 +298,9 @@ scrollbar_graphics_layer->SetHitTestable(true); } -static void SetupScrollbarLayer( - GraphicsLayer* scrollbar_graphics_layer, - const ScrollingCoordinator::ScrollbarLayerGroup* scrollbar_layer_group, - cc::Layer* scrolling_layer) { +static void SetupScrollbarLayer(GraphicsLayer* scrollbar_graphics_layer, + cc::ScrollbarLayerBase* scrollbar_layer, + cc::Layer* scrolling_layer) { DCHECK(scrollbar_graphics_layer); if (!scrolling_layer) { @@ -322,28 +308,27 @@ return; } - scrollbar_layer_group->scrollbar_layer->SetScrollElementId( - scrolling_layer->element_id()); + scrollbar_layer->SetScrollElementId(scrolling_layer->element_id()); scrollbar_graphics_layer->SetContentsToCcLayer( - scrollbar_layer_group->layer.get(), + scrollbar_layer, /*prevent_contents_opaque_changes=*/false); scrollbar_graphics_layer->SetDrawsContent(false); scrollbar_graphics_layer->SetHitTestable(false); } -void ScrollingCoordinator::AddScrollbarLayerGroup( +void ScrollingCoordinator::AddScrollbarLayer( ScrollableArea* scrollable_area, ScrollbarOrientation orientation, - std::unique_ptr<ScrollbarLayerGroup> scrollbar_layer_group) { + scoped_refptr<cc::ScrollbarLayerBase> scrollbar_layer_group) { ScrollbarMap& scrollbars = orientation == kHorizontalScrollbar ? horizontal_scrollbars_ : vertical_scrollbars_; scrollbars.insert(scrollable_area, std::move(scrollbar_layer_group)); } -ScrollingCoordinator::ScrollbarLayerGroup* -ScrollingCoordinator::GetScrollbarLayerGroup(ScrollableArea* scrollable_area, - ScrollbarOrientation orientation) { +cc::ScrollbarLayerBase* ScrollingCoordinator::GetScrollbarLayer( + ScrollableArea* scrollable_area, + ScrollbarOrientation orientation) { ScrollbarMap& scrollbars = orientation == kHorizontalScrollbar ? horizontal_scrollbars_ : vertical_scrollbars_; @@ -371,31 +356,32 @@ return; } - ScrollbarLayerGroup* scrollbar_layer_group = - GetScrollbarLayerGroup(scrollable_area, orientation); - if (!scrollbar_layer_group) { + cc::ScrollbarLayerBase* scrollbar_layer = + GetScrollbarLayer(scrollable_area, orientation); + if (!scrollbar_layer) { Settings* settings = page_->MainFrame()->GetSettings(); - std::unique_ptr<ScrollbarLayerGroup> group; + scoped_refptr<cc::ScrollbarLayerBase> new_scrollbar_layer; if (settings->GetUseSolidColorScrollbars()) { DCHECK(RuntimeEnabledFeatures::OverlayScrollbarsEnabled()); - group = CreateSolidColorScrollbarLayer( + new_scrollbar_layer = CreateSolidColorScrollbarLayer( orientation, scrollbar.GetTheme().ThumbThickness(scrollbar), scrollbar.GetTheme().TrackPosition(scrollbar), scrollable_area->ShouldPlaceVerticalScrollbarOnLeft(), scrollable_area->GetScrollbarElementId(orientation)); } else { - group = CreateScrollbarLayer(scrollbar, - page_->DeviceScaleFactorDeprecated()); + new_scrollbar_layer = CreateScrollbarLayer( + scrollbar, page_->DeviceScaleFactorDeprecated()); } - scrollbar_layer_group = group.get(); - AddScrollbarLayerGroup(scrollable_area, orientation, std::move(group)); + scrollbar_layer = new_scrollbar_layer.get(); + AddScrollbarLayer(scrollable_area, orientation, + std::move(new_scrollbar_layer)); } cc::Layer* scroll_layer = GraphicsLayerToCcLayer(scrollable_area->LayerForScrolling()); - SetupScrollbarLayer(scrollbar_graphics_layer, scrollbar_layer_group, + SetupScrollbarLayer(scrollbar_graphics_layer, scrollbar_layer, scroll_layer); // Root layer non-overlay scrollbars should be marked opaque to disable @@ -404,7 +390,7 @@ scrollbar_graphics_layer->SetContentsOpaque( IsForMainFrame(scrollable_area) && is_opaque_scrollbar); } else { - RemoveScrollbarLayerGroup(scrollable_area, orientation); + RemoveScrollbarLayer(scrollable_area, orientation); } } @@ -469,23 +455,19 @@ scrollable_area->LayerForScrolling()->SetSize( static_cast<gfx::Size>(scroll_contents_size)); } - if (ScrollbarLayerGroup* scrollbar_layer_group = - GetScrollbarLayerGroup(scrollable_area, kHorizontalScrollbar)) { - GraphicsLayer* horizontal_scrollbar_layer = - scrollable_area->LayerForHorizontalScrollbar(); - if (horizontal_scrollbar_layer) { - SetupScrollbarLayer(horizontal_scrollbar_layer, scrollbar_layer_group, + if (cc::ScrollbarLayerBase* scrollbar_layer = + GetScrollbarLayer(scrollable_area, kHorizontalScrollbar)) { + if (GraphicsLayer* horizontal_scrollbar_layer = + scrollable_area->LayerForHorizontalScrollbar()) { + SetupScrollbarLayer(horizontal_scrollbar_layer, scrollbar_layer, cc_layer); } } - if (ScrollbarLayerGroup* scrollbar_layer_group = - GetScrollbarLayerGroup(scrollable_area, kVerticalScrollbar)) { - GraphicsLayer* vertical_scrollbar_layer = - scrollable_area->LayerForVerticalScrollbar(); - - if (vertical_scrollbar_layer) { - SetupScrollbarLayer(vertical_scrollbar_layer, scrollbar_layer_group, - cc_layer); + if (cc::ScrollbarLayerBase* scrollbar_layer = + GetScrollbarLayer(scrollable_area, kVerticalScrollbar)) { + if (GraphicsLayer* vertical_scrollbar_layer = + scrollable_area->LayerForVerticalScrollbar()) { + SetupScrollbarLayer(vertical_scrollbar_layer, scrollbar_layer, cc_layer); } } @@ -518,9 +500,9 @@ void ScrollingCoordinator::Reset(LocalFrame* frame) { for (const auto& scrollbar : horizontal_scrollbars_) - GraphicsLayer::UnregisterContentsLayer(scrollbar.value->layer.get()); + GraphicsLayer::UnregisterContentsLayer(scrollbar.value.get()); for (const auto& scrollbar : vertical_scrollbars_) - GraphicsLayer::UnregisterContentsLayer(scrollbar.value->layer.get()); + GraphicsLayer::UnregisterContentsLayer(scrollbar.value.get()); horizontal_scrollbars_.clear(); vertical_scrollbars_.clear(); @@ -595,9 +577,9 @@ page_ = nullptr; for (const auto& scrollbar : horizontal_scrollbars_) - GraphicsLayer::UnregisterContentsLayer(scrollbar.value->layer.get()); + GraphicsLayer::UnregisterContentsLayer(scrollbar.value.get()); for (const auto& scrollbar : vertical_scrollbars_) - GraphicsLayer::UnregisterContentsLayer(scrollbar.value->layer.get()); + GraphicsLayer::UnregisterContentsLayer(scrollbar.value.get()); } bool ScrollingCoordinator::CoordinatesScrollingForFrameView(
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h index 99f1851..30f3fd98 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h
@@ -38,8 +38,7 @@ namespace cc { class AnimationHost; -class Layer; -class ScrollbarLayerInterface; +class ScrollbarLayerBase; } // namespace cc namespace blink { @@ -64,15 +63,6 @@ class CORE_EXPORT ScrollingCoordinator final : public GarbageCollected<ScrollingCoordinator> { public: - struct ScrollbarLayerGroup { - // The compositor layer for the scrollbar. It can be one of a few - // concrete types, so we store the base type. - scoped_refptr<cc::Layer> layer; - // An interface shared by all scrollbar layer types since we don't know - // the concrete |layer| type. - cc::ScrollbarLayerInterface* scrollbar_layer = nullptr; - }; - explicit ScrollingCoordinator(Page*); ~ScrollingCoordinator(); void Trace(blink::Visitor*); @@ -109,7 +99,7 @@ // Should be called whenever the root layer for the given frame view changes. void FrameViewRootLayerDidChange(LocalFrameView*); - std::unique_ptr<ScrollbarLayerGroup> CreateSolidColorScrollbarLayer( + scoped_refptr<cc::ScrollbarLayerBase> CreateSolidColorScrollbarLayer( ScrollbarOrientation, int thumb_thickness, int track_start, @@ -184,12 +174,12 @@ bool should_scroll_on_main_thread_dirty_; private: - void AddScrollbarLayerGroup(ScrollableArea*, - ScrollbarOrientation, - std::unique_ptr<ScrollbarLayerGroup>); - ScrollbarLayerGroup* GetScrollbarLayerGroup(ScrollableArea*, - ScrollbarOrientation); - void RemoveScrollbarLayerGroup(ScrollableArea*, ScrollbarOrientation); + void AddScrollbarLayer(ScrollableArea*, + ScrollbarOrientation, + scoped_refptr<cc::ScrollbarLayerBase>); + cc::ScrollbarLayerBase* GetScrollbarLayer(ScrollableArea*, + ScrollbarOrientation); + void RemoveScrollbarLayer(ScrollableArea*, ScrollbarOrientation); bool FrameScrollerIsDirty(LocalFrameView*) const; @@ -197,8 +187,8 @@ std::unique_ptr<CompositorAnimationTimeline> programmatic_scroll_animator_timeline_; - using ScrollbarMap = - HeapHashMap<Member<ScrollableArea>, std::unique_ptr<ScrollbarLayerGroup>>; + using ScrollbarMap = HeapHashMap<Member<ScrollableArea>, + scoped_refptr<cc::ScrollbarLayerBase>>; ScrollbarMap horizontal_scrollbars_; ScrollbarMap vertical_scrollbars_;
diff --git a/third_party/blink/renderer/devtools/BUILD.gn b/third_party/blink/renderer/devtools/BUILD.gn index 2003e7a..3874d856 100644 --- a/third_party/blink/renderer/devtools/BUILD.gn +++ b/third_party/blink/renderer/devtools/BUILD.gn
@@ -6,1813 +6,1840 @@ import("//third_party/blink/public/public_features.gni") import("//third_party/blink/renderer/core/core.gni") -all_devtools_files = [ - "front_end/accessibility/AccessibilityModel.js", - "front_end/accessibility/accessibilityNode.css", - "front_end/accessibility/AccessibilityNodeView.js", - "front_end/accessibility/accessibilityProperties.css", - "front_end/accessibility/AccessibilitySidebarView.js", - "front_end/accessibility/AccessibilityStrings.js", - "front_end/accessibility/ARIAAttributesView.js", - "front_end/accessibility/ARIAMetadata.js", - "front_end/accessibility/axBreadcrumbs.css", - "front_end/accessibility/AXBreadcrumbsPane.js", - "front_end/accessibility/module.json", - "front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js", - "front_end/accessibility_test_runner/module.json", - "front_end/animation/AnimationGroupPreviewUI.js", - "front_end/animation/AnimationModel.js", - "front_end/animation/animationScreenshotPopover.css", - "front_end/animation/AnimationScreenshotPopover.js", - "front_end/animation/animationTimeline.css", - "front_end/animation/AnimationTimeline.js", - "front_end/animation/AnimationUI.js", - "front_end/animation/module.json", - "front_end/application_test_runner/AppcacheTestRunner.js", - "front_end/application_test_runner/CacheStorageTestRunner.js", - "front_end/application_test_runner/IndexedDBTestRunner.js", - "front_end/application_test_runner/module.json", - "front_end/application_test_runner/ResourcesTestRunner.js", - "front_end/application_test_runner/ResourceTreeTestRunner.js", - "front_end/application_test_runner/ServiceWorkersTestRunner.js", - "front_end/audits_worker.js", - "front_end/audits_worker.json", - "front_end/audits_worker/AuditsService.js", - "front_end/audits_worker/lighthouse/lighthouse-dt-bundle.js", - "front_end/audits_worker/module.json", - "front_end/audits/AuditsPanel.js", - "front_end/audits/AuditsController.js", - "front_end/audits/AuditsReportSelector.js", - "front_end/audits/AuditsReportRenderer.js", - "front_end/audits/AuditsStartView.js", - "front_end/audits/AuditsProtocolService.js", - "front_end/audits/AuditsStatusView.js", - "front_end/audits/auditsDialog.css", - "front_end/audits/auditsStartView.css", - "front_end/audits/auditsPanel.css", - "front_end/audits/RadioSetting.js", - "front_end/audits/lighthouse/report.css", - "front_end/audits/lighthouse/report.js", - "front_end/audits/lighthouse/report-generator.js", - "front_end/audits/lighthouse/template.html", - "front_end/audits/lighthouse/templates.html", - "front_end/audits/module.json", - "front_end/audits_test_runner/AuditsTestRunner.js", - "front_end/audits_test_runner/module.json", - "front_end/axe_core_test_runner/AxeCoreTestRunner.js", - "front_end/axe_core_test_runner/module.json", - "front_end/bindings/module.json", - "front_end/bindings_test_runner/AutomappingTestRunner.js", - "front_end/bindings_test_runner/BindingsTestRunner.js", - "front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js", - "front_end/bindings_test_runner/module.json", - "front_end/bindings_test_runner/PersistenceTestRunner.js", - "front_end/bindings_test_runner/OverridesTestRunner.js", - "front_end/browser_debugger/DOMBreakpointsSidebarPane.js", - "front_end/browser_debugger/EventListenerBreakpointsSidebarPane.js", - "front_end/browser_debugger/ObjectEventListenersSidebarPane.js", - "front_end/browser_debugger/XHRBreakpointsSidebarPane.js", - "front_end/browser_debugger/domBreakpointsSidebarPane.css", - "front_end/browser_debugger/eventListenerBreakpoints.css", - "front_end/browser_debugger/module.json", - "front_end/browser_debugger/xhrBreakpointsSidebarPane.css", - "front_end/browser_sdk/LogManager.js", - "front_end/browser_sdk/module.json", - "front_end/css_overview/cssOverview.css", - "front_end/css_overview/cssOverviewStartView.css", - "front_end/css_overview/cssOverviewProcessingView.css", - "front_end/css_overview/cssOverviewCompletedView.css", - "front_end/css_overview/CSSOverviewController.js", - "front_end/css_overview/CSSOverviewStartView.js", - "front_end/css_overview/CSSOverviewProcessingView.js", - "front_end/css_overview/CSSOverviewCompletedView.js", - "front_end/css_overview/CSSOverviewModel.js", - "front_end/css_overview/CSSOverviewSidebarPanel.js", - "front_end/css_overview/cssOverviewSidebarPanel.css", - "front_end/css_overview/CSSOverviewPanel.js", - "front_end/css_overview/module.json", - "front_end/changes/ChangesHighlighter.js", - "front_end/changes/changesView.css", - "front_end/changes/ChangesView.js", - "front_end/changes/changesSidebar.css", - "front_end/changes/ChangesSidebar.js", - "front_end/changes/module.json", - "front_end/cm/active-line.js", - "front_end/cm/brace-fold.js", - "front_end/cm/closebrackets.js", - "front_end/cm/codemirror.css", - "front_end/cm/codemirror.js", - "front_end/cm/comment.js", - "front_end/cm/foldcode.js", - "front_end/cm/foldgutter.js", - "front_end/cm/mark-selection.js", - "front_end/cm/matchbrackets.js", - "front_end/cm/module.json", - "front_end/cm/multiplex.js", - "front_end/cm/overlay.js", - "front_end/cm_headless/headlesscodemirror.js", - "front_end/cm_headless/module.json", - "front_end/cm_modes/clike.js", - "front_end/cm_modes/clojure.js", - "front_end/cm_modes/coffeescript.js", - "front_end/cm_modes/DefaultCodeMirrorMimeMode.js", - "front_end/cm_modes/jsx.js", - "front_end/cm_modes/livescript.js", - "front_end/cm_modes/markdown.js", - "front_end/cm_modes/module.json", - "front_end/cm_modes/php.js", - "front_end/cm_modes/python.js", - "front_end/cm_modes/shell.js", - "front_end/cm_modes/stylus.js", - "front_end/cm_web_modes/css.js", - "front_end/cm_web_modes/htmlembedded.js", - "front_end/cm_web_modes/htmlmixed.js", - "front_end/cm_web_modes/javascript.js", - "front_end/cm_web_modes/xml.js", - "front_end/color_picker/ContrastDetails.js", - "front_end/color_picker/ContrastInfo.js", - "front_end/color_picker/ContrastOverlay.js", - "front_end/color_picker/module.json", - "front_end/color_picker/spectrum.css", - "front_end/color_picker/Spectrum.js", - "front_end/common/module.json", - "front_end/components/DockController.js", - "front_end/components/ImagePreview.js", - "front_end/components/imagePreview.css", - "front_end/components/JSPresentationUtils.js", - "front_end/components/Linkifier.js", - "front_end/components/TargetDetachedDialog.js", - "front_end/components/Reload.js", - "front_end/components/jsUtils.css", - "front_end/components/module.json", - "front_end/console/ConsoleContextSelector.js", - "front_end/console/ConsoleFilter.js", - "front_end/console/ConsoleSidebar.js", - "front_end/console/ConsolePanel.js", - "front_end/console/ConsolePinPane.js", - "front_end/console/ConsolePrompt.js", - "front_end/console/consoleView.css", - "front_end/console/consoleContextSelector.css", - "front_end/console/consolePinPane.css", - "front_end/console/consolePrompt.css", - "front_end/console/consoleSidebar.css", - "front_end/console/ConsoleView.js", - "front_end/console/ConsoleViewMessage.js", - "front_end/console/ConsoleViewport.js", - "front_end/console/module.json", - "front_end/console_counters/errorWarningCounter.css", - "front_end/console_counters/module.json", - "front_end/console_counters/WarningErrorCounter.js", - "front_end/console_test_runner/ConsoleTestRunner.js", - "front_end/console_test_runner/module.json", - "front_end/cookie_table/CookiesTable.js", - "front_end/cookie_table/module.json", - "front_end/coverage/coverageListView.css", - "front_end/coverage/CoverageDecorationManager.js", - "front_end/coverage/CoverageListView.js", - "front_end/coverage/CoverageModel.js", - "front_end/coverage/coverageView.css", - "front_end/coverage/CoverageView.js", - "front_end/coverage/module.json", - "front_end/coverage_test_runner/CoverageTestRunner.js", - "front_end/coverage_test_runner/module.json", - "front_end/cpu_profiler_test_runner/module.json", - "front_end/cpu_profiler_test_runner/ProfilerTestRunner.js", - "front_end/dagre_layout/dagre.js", - "front_end/dagre_layout/module.json", - "front_end/data_grid/dataGrid.css", - "front_end/data_grid/DataGrid.js", - "front_end/data_grid/module.json", - "front_end/data_grid/ShowMoreDataGridNode.js", - "front_end/data_grid/SortableDataGrid.js", - "front_end/data_grid/ViewportDataGrid.js", - "front_end/data_grid_test_runner/DataGridTestRunner.js", - "front_end/data_grid_test_runner/module.json", - "front_end/device_mode_test_runner/DeviceModeTestRunner.js", - "front_end/device_mode_test_runner/module.json", - "front_end/devices/DevicesView.js", - "front_end/devices/devicesView.css", - "front_end/devices/module.json", - "front_end/diff/diff_match_patch.js", - "front_end/diff/Diff.js", - "front_end/diff/module.json", - "front_end/dom_extension/module.json", - "front_end/elements/breadcrumbs.css", - "front_end/elements/classesPaneWidget.css", - "front_end/elements/ClassesPaneWidget.js", - "front_end/elements/ColorSwatchPopoverIcon.js", - "front_end/elements/ComputedStyleModel.js", - "front_end/elements/computedStyleSidebarPane.css", - "front_end/elements/computedStyleWidgetTree.css", - "front_end/elements/ComputedStyleWidget.js", - "front_end/elements/DOMLinkifier.js", - "front_end/elements/domLinkifier.css", - "front_end/elements/DOMPath.js", - "front_end/elements/ElementsBreadcrumbs.js", - "front_end/elements/elementsPanel.css", - "front_end/elements/ElementsPanel.js", - "front_end/elements/ElementsSidebarPane.js", - "front_end/elements/elementStatePaneWidget.css", - "front_end/elements/ElementStatePaneWidget.js", - "front_end/elements/ElementsTreeElement.js", - "front_end/elements/ElementsTreeElementHighlighter.js", - "front_end/elements/elementsTreeOutline.css", - "front_end/elements/ElementsTreeOutline.js", - "front_end/elements/EventListenersWidget.js", - "front_end/elements/InspectElementModeController.js", - "front_end/elements/MarkerDecorator.js", - "front_end/elements/metricsSidebarPane.css", - "front_end/elements/MetricsSidebarPane.js", - "front_end/elements/nodeStackTraceWidget.css", - "front_end/elements/NodeStackTraceWidget.js", - "front_end/elements/module.json", - "front_end/elements/platformFontsWidget.css", - "front_end/elements/PlatformFontsWidget.js", - "front_end/elements/propertiesWidget.css", - "front_end/elements/PropertiesWidget.js", - "front_end/elements/StylePropertyHighlighter.js", - "front_end/elements/stylesSectionTree.css", - "front_end/elements/stylesSidebarPane.css", - "front_end/elements/StylesSidebarPane.js", - "front_end/elements/StylePropertyTreeElement.js", - "front_end/elements_test_runner/EditDOMTestRunner.js", - "front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js", - "front_end/elements_test_runner/ElementsTestRunner.js", - "front_end/elements_test_runner/module.json", - "front_end/elements_test_runner/SetOuterHTMLTestRunner.js", - "front_end/elements_test_runner/StylesUpdateLinksTestRunner.js", - "front_end/emulated_devices/module.json", - "front_end/emulation/AdvancedApp.js", - "front_end/emulation/DeviceModeModel.js", - "front_end/emulation/deviceModeToolbar.css", - "front_end/emulation/DeviceModeToolbar.js", - "front_end/emulation/deviceModeView.css", - "front_end/emulation/DeviceModeView.js", - "front_end/emulation/DeviceModeWrapper.js", - "front_end/emulation/devicesSettingsTab.css", - "front_end/emulation/DevicesSettingsTab.js", - "front_end/emulation/EmulatedDevices.js", - "front_end/emulation/geolocationsSettingsTab.css", - "front_end/emulation/GeolocationsSettingsTab.js", - "front_end/emulation/inspectedPagePlaceholder.css", - "front_end/emulation/InspectedPagePlaceholder.js", - "front_end/emulation/mediaQueryInspector.css", - "front_end/emulation/MediaQueryInspector.js", - "front_end/emulation/module.json", - "front_end/emulation/sensors.css", - "front_end/emulation/SensorsView.js", - "front_end/event_listeners/EventListenersUtils.js", - "front_end/event_listeners/eventListenersView.css", - "front_end/event_listeners/EventListenersView.js", - "front_end/event_listeners/module.json", - "front_end/extensions/ExtensionAPI.js", - "front_end/extensions/ExtensionPanel.js", - "front_end/extensions/ExtensionServer.js", - "front_end/extensions/ExtensionTraceProvider.js", - "front_end/extensions/ExtensionView.js", - "front_end/extensions/module.json", - "front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js", - "front_end/extensions_test_runner/ExtensionsTestRunner.js", - "front_end/extensions_test_runner/module.json", - "front_end/formatter/FormatterWorkerPool.js", - "front_end/formatter/module.json", - "front_end/formatter/ScriptFormatter.js", - "front_end/formatter_worker.js", - "front_end/formatter_worker.json", - "front_end/formatter_worker/AcornTokenizer.js", - "front_end/formatter_worker/CSSFormatter.js", - "front_end/formatter_worker/CSSRuleParser.js", - "front_end/formatter_worker/ESTreeWalker.js", - "front_end/formatter_worker/FormattedContentBuilder.js", - "front_end/formatter_worker/FormatterWorker.js", - "front_end/formatter_worker/HTMLFormatter.js", - "front_end/formatter_worker/IdentityFormatter.js", - "front_end/formatter_worker/JavaScriptFormatter.js", - "front_end/formatter_worker/JavaScriptOutline.js", - "front_end/formatter_worker/RelaxedJSONParser.js", - "front_end/formatter_worker/acorn/acorn.js", - "front_end/formatter_worker/acorn/acorn_loose.js", - "front_end/formatter_worker/module.json", - "front_end/har_importer/HARFormat.js", - "front_end/har_importer/HARImporter.js", - "front_end/har_importer/module.json", - "front_end/heap_profiler_test_runner/HeapProfilerTestRunner.js", - "front_end/heap_profiler_test_runner/module.json", - "front_end/heap_snapshot_model/HeapSnapshotModel.js", - "front_end/heap_snapshot_model/module.json", - "front_end/heap_snapshot_worker.js", - "front_end/heap_snapshot_worker.json", - "front_end/heap_snapshot_worker/AllocationProfile.js", - "front_end/heap_snapshot_worker/HeapSnapshot.js", - "front_end/heap_snapshot_worker/HeapSnapshotLoader.js", - "front_end/heap_snapshot_worker/HeapSnapshotWorker.js", - "front_end/heap_snapshot_worker/HeapSnapshotWorkerDispatcher.js", - "front_end/heap_snapshot_worker/module.json", - "front_end/help/Help.js", - "front_end/help/module.json", - "front_end/help/releaseNote.css", - "front_end/help/ReleaseNoteText.js", - "front_end/help/ReleaseNoteView.js", - "front_end/host/module.json", - "front_end/inline_editor/bezierEditor.css", - "front_end/inline_editor/BezierEditor.js", - "front_end/inline_editor/bezierSwatch.css", - "front_end/inline_editor/BezierUI.js", - "front_end/inline_editor/colorSwatch.css", - "front_end/inline_editor/ColorSwatch.js", - "front_end/inline_editor/cssShadowEditor.css", - "front_end/inline_editor/CSSShadowEditor.js", - "front_end/inline_editor/CSSShadowModel.js", - "front_end/inline_editor/cssShadowSwatch.css", - "front_end/inline_editor/module.json", - "front_end/inline_editor/swatchPopover.css", - "front_end/inline_editor/SwatchPopoverHelper.js", - "front_end/inspector.js", - "front_end/inspector.json", - "front_end/inspector_main/InspectorMain.js", - "front_end/inspector_main/module.json", - "front_end/inspector_main/nodeIcon.css", - "front_end/inspector_main/renderingOptions.css", - "front_end/inspector_main/RenderingOptions.js", - "front_end/integration_test_runner.js", - "front_end/integration_test_runner.json", - "front_end/javascript_metadata/module.json", - "front_end/javascript_metadata/NativeFunctions.js", - "front_end/javascript_metadata/JavaScriptMetadata.js", - "front_end/js_main/JsMain.js", - "front_end/js_main/module.json", - "front_end/js_profiler/module.json", - "front_end/layer_viewer/layerDetailsView.css", - "front_end/layer_viewer/LayerDetailsView.js", - "front_end/layer_viewer/layers3DView.css", - "front_end/layer_viewer/Layers3DView.js", - "front_end/layer_viewer/LayerTreeOutline.js", - "front_end/layer_viewer/LayerViewHost.js", - "front_end/layer_viewer/module.json", - "front_end/layer_viewer/paintProfiler.css", - "front_end/layer_viewer/PaintProfilerView.js", - "front_end/layer_viewer/TransformController.js", - "front_end/layers/LayerPaintProfilerView.js", - "front_end/layers/LayersPanel.js", - "front_end/layers/LayerTreeModel.js", - "front_end/layers/module.json", - "front_end/layers_test_runner/LayersTestRunner.js", - "front_end/layers_test_runner/module.json", - "front_end/main/ExecutionContextSelector.js", - "front_end/main/Main.js", - "front_end/main/module.json", - "front_end/main/SimpleApp.js", - "front_end/protocol_monitor/ProtocolMonitor.js", - "front_end/protocol_monitor/protocolMonitor.css", - "front_end/protocol_monitor/module.json", - "front_end/mobile_throttling/MobileThrottlingSelector.js", - "front_end/mobile_throttling/module.json", - "front_end/mobile_throttling/NetworkPanelIndicator.js", - "front_end/mobile_throttling/NetworkThrottlingSelector.js", - "front_end/mobile_throttling/ThrottlingManager.js", - "front_end/mobile_throttling/ThrottlingPresets.js", - "front_end/mobile_throttling/throttlingSettingsTab.css", - "front_end/mobile_throttling/ThrottlingSettingsTab.js", - "front_end/media/eventDisplayTable.css", - "front_end/media/EventDisplayTable.js", - "front_end/media/MainView.js", - "front_end/media/MediaTable.js", - "front_end/media/PlayerDetailView.js", - "front_end/media/playerListView.css", - "front_end/media/PlayerListView.js", - "front_end/media/module.json", - "front_end/media/MediaModel.js", - "front_end/media/mediaView.css", - "front_end/ndb_app.json", - "front_end/network/binaryResourceView.css", - "front_end/network/blockedURLsPane.css", - "front_end/network/BinaryResourceView.js", - "front_end/network/BlockedURLsPane.js", - "front_end/network/eventSourceMessagesView.css", - "front_end/network/EventSourceMessagesView.js", - "front_end/network/HARWriter.js", - "front_end/network/module.json", - "front_end/network/networkConfigView.css", - "front_end/network/NetworkConfigView.js", - "front_end/network/NetworkDataGridNode.js", - "front_end/network/NetworkItemView.js", - "front_end/network/networkLogView.css", - "front_end/network/NetworkLogView.js", - "front_end/network/NetworkLogViewColumns.js", - "front_end/network/NetworkFrameGrouper.js", - "front_end/network/networkManageCustomHeadersView.css", - "front_end/network/NetworkManageCustomHeadersView.js", - "front_end/network/NetworkOverview.js", - "front_end/network/networkPanel.css", - "front_end/network/NetworkPanel.js", - "front_end/network/NetworkSearchScope.js", - "front_end/network/NetworkTimeCalculator.js", - "front_end/network/networkTimingTable.css", - "front_end/network/networkWaterfallColumn.css", - "front_end/network/NetworkWaterfallColumn.js", - "front_end/network/requestCookiesView.css", - "front_end/network/RequestCookiesView.js", - "front_end/network/requestHeadersTree.css", - "front_end/network/requestHeadersView.css", - "front_end/network/RequestHeadersView.js", - "front_end/network/requestHTMLView.css", - "front_end/network/RequestHTMLView.js", - "front_end/network/requestInitiatorView.css", - "front_end/network/RequestInitiatorView.js", - "front_end/network/RequestPreviewView.js", - "front_end/network/RequestResponseView.js", - "front_end/network/RequestTimingView.js", - "front_end/network/ResourceWebSocketFrameView.js", - "front_end/network/signedExchangeInfoTree.css", - "front_end/network/signedExchangeInfoView.css", - "front_end/network/SignedExchangeInfoView.js", - "front_end/network/webSocketFrameView.css", - "front_end/network_test_runner/module.json", - "front_end/network_test_runner/NetworkTestRunner.js", - "front_end/network_test_runner/ProductRegistryTestRunner.js", - "front_end/node_debugger/module.json", - "front_end/node_main/NodeConnectionsPanel.js", - "front_end/node_main/nodeConnectionsPanel.css", - "front_end/node_main/NodeMain.js", - "front_end/node_main/module.json", - "front_end/object_ui/customPreviewComponent.css", - "front_end/object_ui/CustomPreviewComponent.js", - "front_end/object_ui/JavaScriptAutocomplete.js", - "front_end/object_ui/JavaScriptREPL.js", - "front_end/object_ui/module.json", - "front_end/object_ui/objectPopover.css", - "front_end/object_ui/ObjectPopoverHelper.js", - "front_end/object_ui/objectPropertiesSection.css", - "front_end/object_ui/ObjectPropertiesSection.js", - "front_end/object_ui/objectValue.css", - "front_end/object_ui/RemoteObjectPreviewFormatter.js", - "front_end/perf_ui/ChartViewport.js", - "front_end/perf_ui/FilmStripView.js", - "front_end/perf_ui/FlameChart.js", - "front_end/perf_ui/GCActionDelegate.js", - "front_end/perf_ui/LineLevelProfile.js", - "front_end/perf_ui/LiveHeapProfile.js", - "front_end/perf_ui/NetworkPriorities.js", - "front_end/perf_ui/OverviewGrid.js", - "front_end/perf_ui/PieChart.js", - "front_end/perf_ui/TimelineGrid.js", - "front_end/perf_ui/TimelineOverviewPane.js", - "front_end/perf_ui/chartViewport.css", - "front_end/perf_ui/filmStripView.css", - "front_end/perf_ui/flameChart.css", - "front_end/perf_ui/module.json", - "front_end/perf_ui/overviewGrid.css", - "front_end/perf_ui/pieChart.css", - "front_end/perf_ui/timelineGrid.css", - "front_end/perf_ui/timelineOverviewInfo.css", - "front_end/performance_monitor/PerformanceMonitor.js", - "front_end/performance_monitor/performanceMonitor.css", - "front_end/performance_monitor/module.json", - "front_end/performance_test_runner/module.json", - "front_end/performance_test_runner/TimelineDataTestRunner.js", - "front_end/performance_test_runner/TimelineTestRunner.js", - "front_end/persistence/Automapping.js", - "front_end/persistence/editFileSystemView.css", - "front_end/persistence/EditFileSystemView.js", - "front_end/persistence/FileSystemWorkspaceBinding.js", - "front_end/persistence/IsolatedFileSystem.js", - "front_end/persistence/IsolatedFileSystemManager.js", - "front_end/persistence/module.json", - "front_end/persistence/NetworkPersistenceManager.js", - "front_end/persistence/Persistence.js", - "front_end/persistence/PersistenceActions.js", - "front_end/persistence/PersistenceUtils.js", - "front_end/persistence/PlatformFileSystem.js", - "front_end/persistence/workspaceSettingsTab.css", - "front_end/persistence/WorkspaceSettingsTab.js", - "front_end/platform/module.json", - "front_end/product_registry/BadgePool.js", - "front_end/product_registry/ProductRegistry.js", - "front_end/product_registry/badge.css", - "front_end/product_registry/module.json", - "front_end/product_registry/popup.css", - "front_end/product_registry_impl/module.json", - "front_end/product_registry_impl/ProductRegistryImpl.js", - "front_end/product_registry_impl/ProductRegistryData.js", - "front_end/product_registry_impl/sha1/sha1.js", - "front_end/profiler/BottomUpProfileDataGrid.js", - "front_end/profiler/CPUProfileFlameChart.js", - "front_end/profiler/CPUProfileView.js", - "front_end/profiler/heapProfiler.css", - "front_end/profiler/HeapProfileView.js", - "front_end/profiler/HeapProfilerPanel.js", - "front_end/profiler/HeapSnapshotDataGrids.js", - "front_end/profiler/HeapSnapshotGridNodes.js", - "front_end/profiler/HeapSnapshotProxy.js", - "front_end/profiler/HeapSnapshotView.js", - "front_end/profiler/HeapTimelineOverview.js", - "front_end/profiler/IsolateSelector.js", - "front_end/profiler/LiveHeapProfileView.js", - "front_end/profiler/liveHeapProfile.css", - "front_end/profiler/module.json", - "front_end/profiler/ProfileDataGrid.js", - "front_end/profiler/ProfileHeader.js", - "front_end/profiler/profileLauncherView.css", - "front_end/profiler/ProfileLauncherView.js", - "front_end/profiler/ProfileType.js", - "front_end/profiler/profilesPanel.css", - "front_end/profiler/ProfilesPanel.js", - "front_end/profiler/profilesSidebarTree.css", - "front_end/profiler/ProfileTypeRegistry.js", - "front_end/profiler/ProfileView.js", - "front_end/profiler/TopDownProfileDataGrid.js", - "front_end/protocol/module.json", - "front_end/quick_open/CommandMenu.js", - "front_end/quick_open/filteredListWidget.css", - "front_end/quick_open/FilteredListWidget.js", - "front_end/quick_open/HelpQuickOpen.js", - "front_end/quick_open/QuickOpen.js", - "front_end/quick_open/module.json", - "front_end/resources/ApplicationCacheModel.js", - "front_end/resources/ApplicationCacheItemsView.js", - "front_end/resources/ApplicationPanelSidebar.js", - "front_end/resources/appManifestView.css", - "front_end/resources/AppManifestView.js", - "front_end/resources/BackgroundServiceModel.js", - "front_end/resources/backgroundServiceView.css", - "front_end/resources/BackgroundServiceView.js", - "front_end/resources/clearStorageView.css", - "front_end/resources/ClearStorageView.js", - "front_end/resources/CookieItemsView.js", - "front_end/resources/cookieItemsView.css", - "front_end/resources/DatabaseModel.js", - "front_end/resources/DatabaseQueryView.js", - "front_end/resources/DatabaseTableView.js", - "front_end/resources/DOMStorageItemsView.js", - "front_end/resources/DOMStorageModel.js", - "front_end/resources/IndexedDBModel.js", - "front_end/resources/indexedDBViews.css", - "front_end/resources/IndexedDBViews.js", - "front_end/resources/module.json", - "front_end/resources/resourcesPanel.css", - "front_end/resources/ResourcesPanel.js", - "front_end/resources/ResourcesSection.js", - "front_end/resources/resourcesSidebar.css", - "front_end/resources/serviceWorkerCacheViews.css", - "front_end/resources/ServiceWorkerCacheViews.js", - "front_end/resources/serviceWorkersView.css", - "front_end/resources/ServiceWorkersView.js", - "front_end/resources/StorageItemsView.js", - "front_end/shell.json", - "front_end/screencast/InputModel.js", - "front_end/screencast/module.json", - "front_end/screencast/ScreencastApp.js", - "front_end/screencast/screencastView.css", - "front_end/screencast/ScreencastView.js", - "front_end/sdk/module.json", - "front_end/sdk_test_runner/module.json", - "front_end/sdk_test_runner/PageMockTestRunner.js", - "front_end/search/module.json", - "front_end/search/SearchConfig.js", - "front_end/search/searchResultsPane.css", - "front_end/search/SearchResultsPane.js", - "front_end/search/searchView.css", - "front_end/search/SearchView.js", - "front_end/security/lockIcon.css", - "front_end/security/mainView.css", - "front_end/security/module.json", - "front_end/security/originView.css", - "front_end/security/SecurityModel.js", - "front_end/security/SecurityPanel.js", - "front_end/security/sidebar.css", - "front_end/security_test_runner/module.json", - "front_end/security_test_runner/SecurityTestRunner.js", - "front_end/services/module.json", - "front_end/settings/frameworkBlackboxSettingsTab.css", - "front_end/settings/FrameworkBlackboxSettingsTab.js", - "front_end/settings/module.json", - "front_end/settings/settingsScreen.css", - "front_end/settings/SettingsScreen.js", - "front_end/snippets/module.json", - "front_end/snippets/ScriptSnippetFileSystem.js", - "front_end/snippets/SnippetsQuickOpen.js", - "front_end/source_frame/BinaryResourceViewFactory.js", - "front_end/source_frame/fontView.css", - "front_end/source_frame/FontView.js", - "front_end/source_frame/imageView.css", - "front_end/source_frame/jsonView.css", - "front_end/source_frame/JSONView.js", - "front_end/source_frame/ImageView.js", - "front_end/source_frame/messagesPopover.css", - "front_end/source_frame/module.json", - "front_end/source_frame/PreviewFactory.js", - "front_end/source_frame/resourceSourceFrame.css", - "front_end/source_frame/ResourceSourceFrame.js", - "front_end/source_frame/SourceCodeDiff.js", - "front_end/source_frame/SourceFrame.js", - "front_end/source_frame/SourcesTextEditor.js", - "front_end/source_frame/xmlTree.css", - "front_end/source_frame/xmlView.css", - "front_end/source_frame/XMLView.js", - "front_end/sources/AddSourceMapURLDialog.js", - "front_end/sources/breakpointEditDialog.css", - "front_end/sources/BreakpointEditDialog.js", - "front_end/sources/callStackSidebarPane.css", - "front_end/sources/CallStackSidebarPane.js", - "front_end/sources/CSSPlugin.js", - "front_end/sources/DebuggerPlugin.js", - "front_end/sources/dialog.css", - "front_end/sources/debuggerPausedMessage.css", - "front_end/sources/DebuggerPausedMessage.js", - "front_end/sources/EditingLocationHistoryManager.js", - "front_end/sources/FilePathScoreFunction.js", - "front_end/sources/FilteredUISourceCodeListProvider.js", - "front_end/sources/GoToLineQuickOpen.js", - "front_end/sources/GutterDiffPlugin.js", - "front_end/sources/InplaceFormatterEditorAction.js", - "front_end/sources/javaScriptBreakpointsSidebarPane.css", - "front_end/sources/JavaScriptBreakpointsSidebarPane.js", - "front_end/sources/JavaScriptCompilerPlugin.js", - "front_end/sources/module.json", - "front_end/sources/navigatorTree.css", - "front_end/sources/navigatorView.css", - "front_end/sources/NavigatorView.js", - "front_end/sources/OpenFileQuickOpen.js", - "front_end/sources/OutlineQuickOpen.js", - "front_end/sources/scopeChainSidebarPane.css", - "front_end/sources/ScopeChainSidebarPane.js", - "front_end/sources/ScriptFormatterEditorAction.js", - "front_end/sources/ScriptOriginPlugin.js", - "front_end/sources/SearchSourcesView.js", - "front_end/sources/SimpleHistoryManager.js", - "front_end/sources/SnippetsPlugin.js", - "front_end/sources/SourceFormatter.js", - "front_end/sources/SourceMapNamesResolver.js", - "front_end/sources/SourcesNavigator.js", - "front_end/sources/sourcesPanel.css", - "front_end/sources/SourcesPanel.js", - "front_end/sources/SourcesSearchScope.js", - "front_end/sources/sourcesView.css", - "front_end/sources/SourcesView.js", - "front_end/sources/UISourceCodeFrame.js", - "front_end/sources/TabbedEditorContainer.js", - "front_end/sources/threadsSidebarPane.css", - "front_end/sources/ThreadsSidebarPane.js", - "front_end/sources/watchExpressionsSidebarPane.css", - "front_end/sources/WatchExpressionsSidebarPane.js", - "front_end/sources_test_runner/AutocompleteTestRunner.js", - "front_end/sources_test_runner/DebuggerTestRunner.js", - "front_end/sources_test_runner/EditorTestRunner.js", - "front_end/sources_test_runner/LiveEditTestRunner.js", - "front_end/sources_test_runner/SearchTestRunner.js", - "front_end/sources_test_runner/SourcesTestRunner.js", - "front_end/sources_test_runner/module.json", - "front_end/terminal/module.json", - "front_end/terminal/terminal.css", - "front_end/terminal/TerminalWidget.js", - "front_end/terminal/xterm.js/addons/fit/fit.js", - "front_end/terminal/xterm.js/build/xterm.css", - "front_end/terminal/xterm.js/build/xterm.js", - "front_end/test_runner/module.json", - "front_end/test_runner/TestRunner.js", - "front_end/text_editor/autocompleteTooltip.css", - "front_end/text_editor/cmdevtools.css", - "front_end/text_editor/CodeMirrorTextEditor.js", - "front_end/text_editor/CodeMirrorUtils.js", - "front_end/text_editor/module.json", - "front_end/text_editor/TextEditorAutocompleteController.js", - "front_end/text_utils/module.json", - "front_end/text_utils/Text.js", - "front_end/text_utils/TextRange.js", - "front_end/text_utils/TextUtils.js", - "front_end/timeline_model/module.json", - "front_end/timeline_model/TimelineFrameModel.js", - "front_end/timeline_model/TimelineIRModel.js", - "front_end/timeline_model/TimelineJSProfile.js", - "front_end/timeline_model/TimelineModel.js", - "front_end/timeline_model/TimelineModelFilter.js", - "front_end/timeline_model/TimelineProfileTree.js", - "front_end/timeline_model/TracingLayerTree.js", - "front_end/timeline/CountersGraph.js", - "front_end/timeline/EventsTimelineTreeView.js", - "front_end/timeline/ExtensionTracingSession.js", - "front_end/timeline/historyToolbarButton.css", - "front_end/timeline/invalidationsTree.css", - "front_end/timeline/module.json", - "front_end/timeline/PerformanceModel.js", - "front_end/timeline/TimelineController.js", - "front_end/timeline/TimelineDetailsView.js", - "front_end/timeline/TimelineEventOverview.js", - "front_end/timeline/TimelineFilters.js", - "front_end/timeline/TimelineFlameChartDataProvider.js", - "front_end/timeline/TimelineFlameChartNetworkDataProvider.js", - "front_end/timeline/timelineFlamechartPopover.css", - "front_end/timeline/TimelineFlameChartView.js", - "front_end/timeline/timelineHistoryManager.css", - "front_end/timeline/TimelineHistoryManager.js", - "front_end/timeline/TimelineLayersView.js", - "front_end/timeline/TimelineLoader.js", - "front_end/timeline/timelinePaintProfiler.css", - "front_end/timeline/TimelinePaintProfilerView.js", - "front_end/timeline/timelinePanel.css", - "front_end/timeline/TimelinePanel.js", - "front_end/timeline/timelineStatusDialog.css", - "front_end/timeline/TimelineTreeView.js", - "front_end/timeline/TimelineUIUtils.js", - "front_end/timeline/UIDevtoolsController.js", - "front_end/timeline/UIDevtoolsUtils.js", - "front_end/toolbox_bootstrap/module.json", - "front_end/toolbox_bootstrap/Toolbox.js", - "front_end/toolbox.js", - "front_end/toolbox.json", - "front_end/ui/checkboxTextLabel.css", - "front_end/ui/closeButton.css", - "front_end/ui/confirmDialog.css", - "front_end/ui/dialog.css", - "front_end/ui/dropTarget.css", - "front_end/ui/emptyWidget.css", - "front_end/ui/filter.css", - "front_end/ui/glassPane.css", - "front_end/ui/infobar.css", - "front_end/ui/inlineButton.css", - "front_end/ui/inspectorCommon.css", - "front_end/ui/inspectorStyle.css", - "front_end/ui/inspectorSyntaxHighlight.css", - "front_end/ui/inspectorSyntaxHighlightDark.css", - "front_end/ui/inspectorViewTabbedPane.css", - "front_end/ui/listWidget.css", - "front_end/ui/module.json", - "front_end/ui/popover.css", - "front_end/ui/progressIndicator.css", - "front_end/ui/radioButton.css", - "front_end/ui/reportView.css", - "front_end/ui/remoteDebuggingTerminatedScreen.css", - "front_end/ui/rootView.css", - "front_end/ui/searchableView.css", - "front_end/ui/segmentedButton.css", - "front_end/ui/slider.css", - "front_end/ui/smallBubble.css", - "front_end/ui/softContextMenu.css", - "front_end/ui/softDropDown.css", - "front_end/ui/softDropDownButton.css", - "front_end/ui/splitWidget.css", - "front_end/ui/suggestBox.css", - "front_end/ui/tabbedPane.css", - "front_end/ui/targetCrashedScreen.css", - "front_end/ui/textButton.css", - "front_end/ui/textPrompt.css", - "front_end/ui/toolbar.css", - "front_end/ui/tooltip.css", - "front_end/ui/treeoutline.css", - "front_end/ui/viewContainers.css", - "front_end/web_audio/AudioContextContentBuilder.js", - "front_end/web_audio/audioContextSelector.css", - "front_end/web_audio/AudioContextSelector.js", - "front_end/web_audio/module.json", - "front_end/web_audio/webAudio.css", - "front_end/web_audio/WebAudioModel.js", - "front_end/web_audio/WebAudioView.js", - "front_end/web_audio/graph_visualizer/Types.js", - "front_end/web_audio/graph_visualizer/GraphStyle.js", - "front_end/web_audio/graph_visualizer/GraphManager.js", - "front_end/web_audio/graph_visualizer/NodeRendererUtility.js", - "front_end/web_audio/graph_visualizer/NodeView.js", - "front_end/web_audio/graph_visualizer/EdgeView.js", - "front_end/web_audio/graph_visualizer/GraphView.js", - "front_end/worker_main/WorkerMain.js", - "front_end/worker_main/module.json", - "front_end/worker_service/module.json", - "front_end/worker_service/ServiceDispatcher.js", - "front_end/workspace/module.json", - "front_end/workspace_diff/WorkspaceDiff.js", - "front_end/workspace_diff/module.json", -] - -lighthouse_locale_files = [ - "front_end/audits_worker/lighthouse/locales/ar-XB.json", - "front_end/audits_worker/lighthouse/locales/ar.json", - "front_end/audits_worker/lighthouse/locales/bg.json", - "front_end/audits_worker/lighthouse/locales/ca.json", - "front_end/audits_worker/lighthouse/locales/cs.json", - "front_end/audits_worker/lighthouse/locales/da.json", - "front_end/audits_worker/lighthouse/locales/de.json", - "front_end/audits_worker/lighthouse/locales/el.json", - "front_end/audits_worker/lighthouse/locales/en-GB.json", - "front_end/audits_worker/lighthouse/locales/en-US.json", - "front_end/audits_worker/lighthouse/locales/en-XA.json", - "front_end/audits_worker/lighthouse/locales/en-XL.json", - "front_end/audits_worker/lighthouse/locales/es-419.json", - "front_end/audits_worker/lighthouse/locales/es.json", - "front_end/audits_worker/lighthouse/locales/fi.json", - "front_end/audits_worker/lighthouse/locales/fil.json", - "front_end/audits_worker/lighthouse/locales/fr.json", - "front_end/audits_worker/lighthouse/locales/he.json", - "front_end/audits_worker/lighthouse/locales/hi.json", - "front_end/audits_worker/lighthouse/locales/hr.json", - "front_end/audits_worker/lighthouse/locales/hu.json", - "front_end/audits_worker/lighthouse/locales/id.json", - "front_end/audits_worker/lighthouse/locales/it.json", - "front_end/audits_worker/lighthouse/locales/ja.json", - "front_end/audits_worker/lighthouse/locales/ko.json", - "front_end/audits_worker/lighthouse/locales/lt.json", - "front_end/audits_worker/lighthouse/locales/lv.json", - "front_end/audits_worker/lighthouse/locales/nl.json", - "front_end/audits_worker/lighthouse/locales/no.json", - "front_end/audits_worker/lighthouse/locales/pl.json", - "front_end/audits_worker/lighthouse/locales/pt-PT.json", - "front_end/audits_worker/lighthouse/locales/pt.json", - "front_end/audits_worker/lighthouse/locales/ro.json", - "front_end/audits_worker/lighthouse/locales/ru.json", - "front_end/audits_worker/lighthouse/locales/sk.json", - "front_end/audits_worker/lighthouse/locales/sl.json", - "front_end/audits_worker/lighthouse/locales/sr-Latn.json", - "front_end/audits_worker/lighthouse/locales/sr.json", - "front_end/audits_worker/lighthouse/locales/sv.json", - "front_end/audits_worker/lighthouse/locales/ta.json", - "front_end/audits_worker/lighthouse/locales/te.json", - "front_end/audits_worker/lighthouse/locales/th.json", - "front_end/audits_worker/lighthouse/locales/tr.json", - "front_end/audits_worker/lighthouse/locales/uk.json", - "front_end/audits_worker/lighthouse/locales/vi.json", - "front_end/audits_worker/lighthouse/locales/zh-HK.json", - "front_end/audits_worker/lighthouse/locales/zh-TW.json", - "front_end/audits_worker/lighthouse/locales/zh.json", -] - -all_devtools_files += lighthouse_locale_files - -all_devtools_modules = [ - "front_end/bindings/bindings.js", - "front_end/bindings/TempFile.js", - "front_end/bindings/StylesSourceMapping.js", - "front_end/bindings/SASSSourceMapping.js", - "front_end/bindings/ResourceUtils.js", - "front_end/bindings/ResourceScriptMapping.js", - "front_end/bindings/ResourceMapping.js", - "front_end/bindings/PresentationConsoleMessageHelper.js", - "front_end/bindings/NetworkProject.js", - "front_end/bindings/LiveLocation.js", - "front_end/bindings/FileUtils.js", - "front_end/bindings/DefaultScriptMapping.js", - "front_end/bindings/DebuggerWorkspaceBinding.js", - "front_end/bindings/CSSWorkspaceBinding.js", - "front_end/bindings/ContentProviderBasedProject.js", - "front_end/bindings/CompilerScriptMapping.js", - "front_end/bindings/BreakpointManager.js", - "front_end/bindings/BlackboxManager.js", - "front_end/workspace/workspace.js", - "front_end/workspace/WorkspaceImpl.js", - "front_end/workspace/UISourceCode.js", - "front_end/workspace/FileManager.js", - "front_end/services/services.js", - "front_end/services/ServiceManager.js", - "front_end/sdk/sdk.js", - "front_end/sdk/TracingModel.js", - "front_end/sdk/TracingManager.js", - "front_end/sdk/TargetManager.js", - "front_end/sdk/Target.js", - "front_end/sdk/SourceMapManager.js", - "front_end/sdk/SourceMap.js", - "front_end/sdk/ServiceWorkerManager.js", - "front_end/sdk/ServiceWorkerCacheModel.js", - "front_end/sdk/ServerTiming.js", - "front_end/sdk/SecurityOriginManager.js", - "front_end/sdk/SDKModel.js", - "front_end/sdk/Script.js", - "front_end/sdk/ScreenCaptureModel.js", - "front_end/sdk/RuntimeModel.js", - "front_end/sdk/ResourceTreeModel.js", - "front_end/sdk/Resource.js", - "front_end/sdk/RemoteObject.js", - "front_end/sdk/ProfileTreeModel.js", - "front_end/sdk/PerformanceMetricsModel.js", - "front_end/sdk/PaintProfiler.js", - "front_end/sdk/OverlayModel.js", - "front_end/sdk/NetworkRequest.js", - "front_end/sdk/NetworkManager.js", - "front_end/sdk/NetworkLog.js", - "front_end/sdk/LogModel.js", - "front_end/sdk/LayerTreeBase.js", - "front_end/sdk/IsolateManager.js", - "front_end/sdk/HeapProfilerModel.js", - "front_end/sdk/HARLog.js", - "front_end/sdk/FilmStripModel.js", - "front_end/sdk/EmulationModel.js", - "front_end/sdk/DOMModel.js", - "front_end/sdk/DOMDebuggerModel.js", - "front_end/sdk/DebuggerModel.js", - "front_end/sdk/CSSStyleSheetHeader.js", - "front_end/sdk/CSSStyleDeclaration.js", - "front_end/sdk/CSSRule.js", - "front_end/sdk/CSSProperty.js", - "front_end/sdk/CSSModel.js", - "front_end/sdk/CSSMetadata.js", - "front_end/sdk/CSSMedia.js", - "front_end/sdk/CSSMatchedStyles.js", - "front_end/sdk/CPUProfilerModel.js", - "front_end/sdk/CPUProfileDataModel.js", - "front_end/sdk/CookieParser.js", - "front_end/sdk/CookieModel.js", - "front_end/sdk/CompilerSourceMappingContentProvider.js", - "front_end/sdk/ConsoleModel.js", - "front_end/sdk/Connections.js", - "front_end/sdk/ChildTargetManager.js", - "front_end/protocol/protocol.js", - "front_end/protocol/NodeURL.js", - "front_end/protocol/InspectorBackend.js", - "front_end/host/host.js", - "front_end/host/UserMetrics.js", - "front_end/host/ResourceLoader.js", - "front_end/host/Platform.js", - "front_end/host/InspectorFrontendHost.js", - "front_end/host/InspectorFrontendHostAPI.js", - "front_end/dom_extension/DOMExtension.js", - "front_end/root.js", - "front_end/Runtime.js", - "front_end/platform/utilities.js", - "front_end/ui/ARIAUtils.js", - "front_end/ui/ZoomManager.js", - "front_end/ui/XWidget.js", - "front_end/ui/XLink.js", - "front_end/ui/XElement.js", - "front_end/ui/Widget.js", - "front_end/ui/View.js", - "front_end/ui/ViewManager.js", - "front_end/ui/UIUtils.js", - "front_end/ui/ui.js", - "front_end/ui/Treeoutline.js", - "front_end/ui/Tooltip.js", - "front_end/ui/Toolbar.js", - "front_end/ui/ThrottledWidget.js", - "front_end/ui/TextPrompt.js", - "front_end/ui/TextEditor.js", - "front_end/ui/TargetCrashedScreen.js", - "front_end/ui/TabbedPane.js", - "front_end/ui/SyntaxHighlighter.js", - "front_end/ui/SuggestBox.js", - "front_end/ui/SplitWidget.js", - "front_end/ui/SoftDropDown.js", - "front_end/ui/SoftContextMenu.js", - "front_end/ui/ShortcutsScreen.js", - "front_end/ui/ShortcutRegistry.js", - "front_end/ui/SettingsUI.js", - "front_end/ui/SegmentedButton.js", - "front_end/ui/SearchableView.js", - "front_end/ui/RootView.js", - "front_end/ui/ResizerWidget.js", - "front_end/ui/ReportView.js", - "front_end/ui/RemoteDebuggingTerminatedScreen.js", - "front_end/ui/ProgressIndicator.js", - "front_end/ui/PopoverHelper.js", - "front_end/ui/Panel.js", - "front_end/ui/ListWidget.js", - "front_end/ui/ListModel.js", - "front_end/ui/ListControl.js", - "front_end/ui/KeyboardShortcut.js", - "front_end/ui/InspectorView.js", - "front_end/ui/InplaceEditor.js", - "front_end/ui/Infobar.js", - "front_end/ui/Icon.js", - "front_end/ui/HistoryInput.js", - "front_end/ui/GlassPane.js", - "front_end/ui/Geometry.js", - "front_end/ui/Fragment.js", - "front_end/ui/ForwardedInputEventHandler.js", - "front_end/ui/FilterSuggestionBuilder.js", - "front_end/ui/FilterBar.js", - "front_end/ui/EmptyWidget.js", - "front_end/ui/DropTarget.js", - "front_end/ui/Dialog.js", - "front_end/ui/ContextMenu.js", - "front_end/ui/Context.js", - "front_end/ui/ARIAUtils.js", - "front_end/ui/ActionRegistry.js", - "front_end/ui/Action.js", - "front_end/ui/ActionDelegate.js", - "front_end/ui/ContextFlavorListener.js", - "front_end/root.js", - "front_end/common/common.js", - "front_end/common/App.js", - "front_end/common/AppProvider.js", - "front_end/common/CharacterIdMap.js", - "front_end/common/Color.js", - "front_end/common/ContentProvider.js", - "front_end/common/EventTarget.js", - "front_end/common/JavaScriptMetaData.js", - "front_end/common/Linkifier.js", - "front_end/common/Object.js", - "front_end/common/Console.js", - "front_end/common/ParsedURL.js", - "front_end/common/Progress.js", - "front_end/common/QueryParamHandler.js", - "front_end/common/ResourceType.js", - "front_end/common/Revealer.js", - "front_end/common/Runnable.js", - "front_end/common/SegmentedRange.js", - "front_end/common/Settings.js", - "front_end/common/StaticContentProvider.js", - "front_end/common/StringOutputStream.js", - "front_end/common/TextDictionary.js", - "front_end/common/Throttler.js", - "front_end/common/Trie.js", - "front_end/common/UIString.js", - "front_end/common/Worker.js", -] - -devtools_test_files = [ - "//third_party/axe-core/axe.js", - "front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js", - "front_end/accessibility_test_runner/module.json", - "front_end/application_test_runner/AppcacheTestRunner.js", - "front_end/application_test_runner/CacheStorageTestRunner.js", - "front_end/application_test_runner/IndexedDBTestRunner.js", - "front_end/application_test_runner/module.json", - "front_end/application_test_runner/ResourcesTestRunner.js", - "front_end/application_test_runner/ResourceTreeTestRunner.js", - "front_end/application_test_runner/ServiceWorkersTestRunner.js", - "front_end/audits_test_runner/AuditsTestRunner.js", - "front_end/audits_test_runner/module.json", - "front_end/axe_core_test_runner/AxeCoreTestRunner.js", - "front_end/axe_core_test_runner/module.json", - "front_end/bindings_test_runner/AutomappingTestRunner.js", - "front_end/bindings_test_runner/BindingsTestRunner.js", - "front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js", - "front_end/bindings_test_runner/module.json", - "front_end/bindings_test_runner/OverridesTestRunner.js", - "front_end/bindings_test_runner/PersistenceTestRunner.js", - "front_end/console_test_runner/ConsoleTestRunner.js", - "front_end/console_test_runner/module.json", - "front_end/coverage_test_runner/CoverageTestRunner.js", - "front_end/coverage_test_runner/module.json", - "front_end/cpu_profiler_test_runner/module.json", - "front_end/cpu_profiler_test_runner/ProfilerTestRunner.js", - "front_end/data_grid_test_runner/DataGridTestRunner.js", - "front_end/data_grid_test_runner/module.json", - "front_end/device_mode_test_runner/DeviceModeTestRunner.js", - "front_end/device_mode_test_runner/module.json", - "front_end/elements_test_runner/EditDOMTestRunner.js", - "front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js", - "front_end/elements_test_runner/ElementsTestRunner.js", - "front_end/elements_test_runner/module.json", - "front_end/elements_test_runner/SetOuterHTMLTestRunner.js", - "front_end/elements_test_runner/StylesUpdateLinksTestRunner.js", - "front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js", - "front_end/extensions_test_runner/ExtensionsTestRunner.js", - "front_end/extensions_test_runner/module.json", - "front_end/heap_profiler_test_runner/HeapProfilerTestRunner.js", - "front_end/heap_profiler_test_runner/module.json", - "front_end/integration_test_runner.html", - "front_end/integration_test_runner.js", - "front_end/integration_test_runner.json", - "front_end/layers_test_runner/LayersTestRunner.js", - "front_end/layers_test_runner/module.json", - "front_end/network_test_runner/module.json", - "front_end/network_test_runner/NetworkTestRunner.js", - "front_end/network_test_runner/ProductRegistryTestRunner.js", - "front_end/performance_test_runner/module.json", - "front_end/performance_test_runner/TimelineDataTestRunner.js", - "front_end/performance_test_runner/TimelineTestRunner.js", - "front_end/sdk_test_runner/module.json", - "front_end/sdk_test_runner/PageMockTestRunner.js", - "front_end/security_test_runner/module.json", - "front_end/security_test_runner/SecurityTestRunner.js", - "front_end/sources_test_runner/AutocompleteTestRunner.js", - "front_end/sources_test_runner/DebuggerTestRunner.js", - "front_end/sources_test_runner/EditorTestRunner.js", - "front_end/sources_test_runner/LiveEditTestRunner.js", - "front_end/sources_test_runner/module.json", - "front_end/sources_test_runner/SearchTestRunner.js", - "front_end/sources_test_runner/SourcesTestRunner.js", - "front_end/test_runner/module.json", - "front_end/test_runner/TestRunner.js", -] - -devtools_embedder_scripts = [ - "front_end/devtools_compatibility.js", - "front_end/Tests.js", -] - -devtools_emulated_devices_images = [ - "front_end/emulated_devices/google-nexus-5-horizontal-default-1x.png", - "front_end/emulated_devices/google-nexus-5-horizontal-default-2x.png", - "front_end/emulated_devices/google-nexus-5-horizontal-keyboard-1x.png", - "front_end/emulated_devices/google-nexus-5-horizontal-keyboard-2x.png", - "front_end/emulated_devices/google-nexus-5-horizontal-navigation-1x.png", - "front_end/emulated_devices/google-nexus-5-horizontal-navigation-2x.png", - "front_end/emulated_devices/google-nexus-5-vertical-default-1x.png", - "front_end/emulated_devices/google-nexus-5-vertical-default-2x.png", - "front_end/emulated_devices/google-nexus-5-vertical-keyboard-1x.png", - "front_end/emulated_devices/google-nexus-5-vertical-keyboard-2x.png", - "front_end/emulated_devices/google-nexus-5-vertical-navigation-1x.png", - "front_end/emulated_devices/google-nexus-5-vertical-navigation-2x.png", - "front_end/emulated_devices/google-nexus-5x-horizontal-default-1x.png", - "front_end/emulated_devices/google-nexus-5x-horizontal-default-2x.png", - "front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-1x.png", - "front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-2x.png", - "front_end/emulated_devices/google-nexus-5x-horizontal-navigation-1x.png", - "front_end/emulated_devices/google-nexus-5x-horizontal-navigation-2x.png", - "front_end/emulated_devices/google-nexus-5x-vertical-default-1x.png", - "front_end/emulated_devices/google-nexus-5x-vertical-default-2x.png", - "front_end/emulated_devices/google-nexus-5x-vertical-keyboard-1x.png", - "front_end/emulated_devices/google-nexus-5x-vertical-keyboard-2x.png", - "front_end/emulated_devices/google-nexus-5x-vertical-navigation-1x.png", - "front_end/emulated_devices/google-nexus-5x-vertical-navigation-2x.png", - "front_end/emulated_devices/iPad-landscape.svg", - "front_end/emulated_devices/iPad-portrait.svg", - "front_end/emulated_devices/iPhone5-landscape.svg", - "front_end/emulated_devices/iPhone5-portrait.svg", - "front_end/emulated_devices/iPhone6-landscape.svg", - "front_end/emulated_devices/iPhone6-portrait.svg", - "front_end/emulated_devices/iPhone6Plus-landscape.svg", - "front_end/emulated_devices/iPhone6Plus-portrait.svg", - "front_end/emulated_devices/Nexus5X-landscape.svg", - "front_end/emulated_devices/Nexus5X-portrait.svg", - "front_end/emulated_devices/Nexus6P-landscape.svg", - "front_end/emulated_devices/Nexus6P-portrait.svg", -] - -devtools_image_files = [ - "front_end/Images/accelerometer-back.svg", - "front_end/Images/accelerometer-bottom.png", - "front_end/Images/accelerometer-front.svg", - "front_end/Images/accelerometer-left.png", - "front_end/Images/accelerometer-right.png", - "front_end/Images/accelerometer-top.png", - "front_end/Images/audits_logo.svg", - "front_end/Images/breakpoint.svg", - "front_end/Images/breakpointConditional.svg", - "front_end/Images/checkboxCheckmark.svg", - "front_end/Images/checker.png", - "front_end/Images/chevrons.svg", - "front_end/Images/chromeDisabledSelect.png", - "front_end/Images/chromeDisabledSelect_2x.png", - "front_end/Images/chromeLeft.png", - "front_end/Images/chromeMiddle.png", - "front_end/Images/chromeRight.png", - "front_end/Images/chromeSelect.png", - "front_end/Images/chromeSelect_2x.png", - "front_end/Images/errorWave.svg", - "front_end/Images/ic_info_black_18dp.svg", - "front_end/Images/ic_warning_black_18dp.svg", - "front_end/Images/largeIcons.svg", - "front_end/Images/mediumIcons.svg", - "front_end/Images/navigationControls.png", - "front_end/Images/navigationControls_2x.png", - "front_end/Images/nodeIcon.png", - "front_end/Images/popoverArrows.png", - "front_end/Images/profileGroupIcon.png", - "front_end/Images/profileIcon.png", - "front_end/Images/profileSmallIcon.png", - "front_end/Images/radioDot.png", - "front_end/Images/resizeDiagonal.png", - "front_end/Images/resizeDiagonal_2x.png", - "front_end/Images/resizeHorizontal.png", - "front_end/Images/resizeHorizontal_2x.png", - "front_end/Images/resizeVertical.png", - "front_end/Images/resizeVertical_2x.png", - "front_end/Images/resourceCSSIcon.png", - "front_end/Images/resourceDocumentIcon.png", - "front_end/Images/resourceDocumentIconSmall.png", - "front_end/Images/resourceJSIcon.png", - "front_end/Images/resourcePlainIcon.png", - "front_end/Images/resourcePlainIconSmall.png", - "front_end/Images/resourcesTimeGraphIcon.png", - "front_end/Images/searchNext.png", - "front_end/Images/searchPrev.png", - "front_end/Images/securityIcons.svg", - "front_end/Images/speech.png", - "front_end/Images/smallIcons.svg", - "front_end/Images/toolbarResizerVertical.png", - "front_end/Images/touchCursor.png", - "front_end/Images/touchCursor_2x.png", - "front_end/Images/treeoutlineTriangles.svg", - "front_end/Images/whatsnew.png", -] - -resources_out_dir = "$root_out_dir/resources/inspector" - -generated_scripts = [ - "$resources_out_dir/InspectorBackendCommands.js", - "$resources_out_dir/SupportedCSSProperties.js", -] - -generated_aria_properties = - [ "$resources_out_dir/accessibility/ARIAProperties.js" ] - -application_templates = [ - "front_end/devtools_app.html", - "front_end/inspector.html", - "front_end/integration_test_runner.html", - "front_end/js_app.html", - "front_end/ndb_app.html", - "front_end/node_app.html", - "front_end/toolbox.html", - "front_end/worker_app.html", -] - -copied_devtools_modules = [ - "$resources_out_dir/bindings/bindings.js", - "$resources_out_dir/bindings/TempFile.js", - "$resources_out_dir/bindings/StylesSourceMapping.js", - "$resources_out_dir/bindings/SASSSourceMapping.js", - "$resources_out_dir/bindings/ResourceUtils.js", - "$resources_out_dir/bindings/ResourceScriptMapping.js", - "$resources_out_dir/bindings/ResourceMapping.js", - "$resources_out_dir/bindings/PresentationConsoleMessageHelper.js", - "$resources_out_dir/bindings/NetworkProject.js", - "$resources_out_dir/bindings/LiveLocation.js", - "$resources_out_dir/bindings/FileUtils.js", - "$resources_out_dir/bindings/DefaultScriptMapping.js", - "$resources_out_dir/bindings/DebuggerWorkspaceBinding.js", - "$resources_out_dir/bindings/CSSWorkspaceBinding.js", - "$resources_out_dir/bindings/ContentProviderBasedProject.js", - "$resources_out_dir/bindings/CompilerScriptMapping.js", - "$resources_out_dir/bindings/BreakpointManager.js", - "$resources_out_dir/bindings/BlackboxManager.js", - "$resources_out_dir/workspace/workspace.js", - "$resources_out_dir/workspace/WorkspaceImpl.js", - "$resources_out_dir/workspace/UISourceCode.js", - "$resources_out_dir/workspace/FileManager.js", - "$resources_out_dir/services/services.js", - "$resources_out_dir/services/ServiceManager.js", - "$resources_out_dir/sdk/sdk.js", - "$resources_out_dir/sdk/TracingModel.js", - "$resources_out_dir/sdk/TracingManager.js", - "$resources_out_dir/sdk/TargetManager.js", - "$resources_out_dir/sdk/Target.js", - "$resources_out_dir/sdk/SourceMapManager.js", - "$resources_out_dir/sdk/SourceMap.js", - "$resources_out_dir/sdk/ServiceWorkerManager.js", - "$resources_out_dir/sdk/ServiceWorkerCacheModel.js", - "$resources_out_dir/sdk/ServerTiming.js", - "$resources_out_dir/sdk/SecurityOriginManager.js", - "$resources_out_dir/sdk/SDKModel.js", - "$resources_out_dir/sdk/Script.js", - "$resources_out_dir/sdk/ScreenCaptureModel.js", - "$resources_out_dir/sdk/RuntimeModel.js", - "$resources_out_dir/sdk/ResourceTreeModel.js", - "$resources_out_dir/sdk/Resource.js", - "$resources_out_dir/sdk/RemoteObject.js", - "$resources_out_dir/sdk/ProfileTreeModel.js", - "$resources_out_dir/sdk/PerformanceMetricsModel.js", - "$resources_out_dir/sdk/PaintProfiler.js", - "$resources_out_dir/sdk/OverlayModel.js", - "$resources_out_dir/sdk/NetworkRequest.js", - "$resources_out_dir/sdk/NetworkManager.js", - "$resources_out_dir/sdk/NetworkLog.js", - "$resources_out_dir/sdk/LogModel.js", - "$resources_out_dir/sdk/LayerTreeBase.js", - "$resources_out_dir/sdk/IsolateManager.js", - "$resources_out_dir/sdk/HeapProfilerModel.js", - "$resources_out_dir/sdk/HARLog.js", - "$resources_out_dir/sdk/FilmStripModel.js", - "$resources_out_dir/sdk/EmulationModel.js", - "$resources_out_dir/sdk/DOMModel.js", - "$resources_out_dir/sdk/DOMDebuggerModel.js", - "$resources_out_dir/sdk/DebuggerModel.js", - "$resources_out_dir/sdk/CSSStyleSheetHeader.js", - "$resources_out_dir/sdk/CSSStyleDeclaration.js", - "$resources_out_dir/sdk/CSSRule.js", - "$resources_out_dir/sdk/CSSProperty.js", - "$resources_out_dir/sdk/CSSModel.js", - "$resources_out_dir/sdk/CSSMetadata.js", - "$resources_out_dir/sdk/CSSMedia.js", - "$resources_out_dir/sdk/CSSMatchedStyles.js", - "$resources_out_dir/sdk/CPUProfilerModel.js", - "$resources_out_dir/sdk/CPUProfileDataModel.js", - "$resources_out_dir/sdk/CookieParser.js", - "$resources_out_dir/sdk/CookieModel.js", - "$resources_out_dir/sdk/CompilerSourceMappingContentProvider.js", - "$resources_out_dir/sdk/ConsoleModel.js", - "$resources_out_dir/sdk/Connections.js", - "$resources_out_dir/sdk/ChildTargetManager.js", - "$resources_out_dir/protocol/protocol.js", - "$resources_out_dir/protocol/NodeURL.js", - "$resources_out_dir/protocol/InspectorBackend.js", - "$resources_out_dir/host/host.js", - "$resources_out_dir/host/UserMetrics.js", - "$resources_out_dir/host/ResourceLoader.js", - "$resources_out_dir/host/Platform.js", - "$resources_out_dir/host/InspectorFrontendHost.js", - "$resources_out_dir/host/InspectorFrontendHostAPI.js", - "$resources_out_dir/dom_extension/DOMExtension.js", - "$resources_out_dir/root.js", - "$resources_out_dir/Runtime.js", - "$resources_out_dir/platform/utilities.js", - "$resources_out_dir/ui/ui.js", - "$resources_out_dir/common/common.js", - "$resources_out_dir/ui/ZoomManager.js", - "$resources_out_dir/ui/XWidget.js", - "$resources_out_dir/ui/XLink.js", - "$resources_out_dir/ui/XElement.js", - "$resources_out_dir/ui/Widget.js", - "$resources_out_dir/ui/View.js", - "$resources_out_dir/ui/ViewManager.js", - "$resources_out_dir/ui/UIUtils.js", - "$resources_out_dir/ui/Treeoutline.js", - "$resources_out_dir/ui/Tooltip.js", - "$resources_out_dir/ui/Toolbar.js", - "$resources_out_dir/ui/ThrottledWidget.js", - "$resources_out_dir/ui/TextPrompt.js", - "$resources_out_dir/ui/TextEditor.js", - "$resources_out_dir/ui/TargetCrashedScreen.js", - "$resources_out_dir/ui/TabbedPane.js", - "$resources_out_dir/ui/SyntaxHighlighter.js", - "$resources_out_dir/ui/SuggestBox.js", - "$resources_out_dir/ui/SplitWidget.js", - "$resources_out_dir/ui/SoftDropDown.js", - "$resources_out_dir/ui/SoftContextMenu.js", - "$resources_out_dir/ui/ShortcutsScreen.js", - "$resources_out_dir/ui/ShortcutRegistry.js", - "$resources_out_dir/ui/SettingsUI.js", - "$resources_out_dir/ui/SegmentedButton.js", - "$resources_out_dir/ui/SearchableView.js", - "$resources_out_dir/ui/RootView.js", - "$resources_out_dir/ui/ResizerWidget.js", - "$resources_out_dir/ui/ReportView.js", - "$resources_out_dir/ui/RemoteDebuggingTerminatedScreen.js", - "$resources_out_dir/ui/ProgressIndicator.js", - "$resources_out_dir/ui/PopoverHelper.js", - "$resources_out_dir/ui/Panel.js", - "$resources_out_dir/ui/ListWidget.js", - "$resources_out_dir/ui/ListModel.js", - "$resources_out_dir/ui/ListControl.js", - "$resources_out_dir/ui/KeyboardShortcut.js", - "$resources_out_dir/ui/InspectorView.js", - "$resources_out_dir/ui/InplaceEditor.js", - "$resources_out_dir/ui/Infobar.js", - "$resources_out_dir/ui/Icon.js", - "$resources_out_dir/ui/HistoryInput.js", - "$resources_out_dir/ui/GlassPane.js", - "$resources_out_dir/ui/Geometry.js", - "$resources_out_dir/ui/Fragment.js", - "$resources_out_dir/ui/ForwardedInputEventHandler.js", - "$resources_out_dir/ui/FilterSuggestionBuilder.js", - "$resources_out_dir/ui/FilterBar.js", - "$resources_out_dir/ui/EmptyWidget.js", - "$resources_out_dir/ui/DropTarget.js", - "$resources_out_dir/ui/Dialog.js", - "$resources_out_dir/ui/ContextMenu.js", - "$resources_out_dir/ui/Context.js", - "$resources_out_dir/ui/ARIAUtils.js", - "$resources_out_dir/ui/ActionRegistry.js", - "$resources_out_dir/ui/Action.js", - "$resources_out_dir/ui/ActionDelegate.js", - "$resources_out_dir/ui/ContextFlavorListener.js", - "$resources_out_dir/common/App.js", - "$resources_out_dir/common/AppProvider.js", - "$resources_out_dir/common/CharacterIdMap.js", - "$resources_out_dir/common/Color.js", - "$resources_out_dir/common/ContentProvider.js", - "$resources_out_dir/common/EventTarget.js", - "$resources_out_dir/common/JavaScriptMetaData.js", - "$resources_out_dir/common/Linkifier.js", - "$resources_out_dir/common/Object.js", - "$resources_out_dir/common/Console.js", - "$resources_out_dir/common/ParsedURL.js", - "$resources_out_dir/common/Progress.js", - "$resources_out_dir/common/QueryParamHandler.js", - "$resources_out_dir/common/ResourceType.js", - "$resources_out_dir/common/Revealer.js", - "$resources_out_dir/common/Runnable.js", - "$resources_out_dir/common/SegmentedRange.js", - "$resources_out_dir/common/Settings.js", - "$resources_out_dir/common/StaticContentProvider.js", - "$resources_out_dir/common/StringOutputStream.js", - "$resources_out_dir/common/TextDictionary.js", - "$resources_out_dir/common/Throttler.js", - "$resources_out_dir/common/Trie.js", - "$resources_out_dir/common/UIString.js", - "$resources_out_dir/common/Worker.js", -] - -generated_applications = [ - "$resources_out_dir/audits_worker.js", - "$resources_out_dir/devtools_app.html", - "$resources_out_dir/devtools_app.js", - "$resources_out_dir/formatter_worker.js", - "$resources_out_dir/heap_snapshot_worker.js", - "$resources_out_dir/inspector.html", - "$resources_out_dir/inspector.js", - "$resources_out_dir/js_app.html", - "$resources_out_dir/js_app.js", - "$resources_out_dir/node_app.html", - "$resources_out_dir/node_app.js", - "$resources_out_dir/shell.js", - "$resources_out_dir/toolbox.html", - "$resources_out_dir/toolbox.js", - "$resources_out_dir/worker_app.html", - "$resources_out_dir/worker_app.js", -] - -generated_non_autostart_non_remote_modules = [ - "$resources_out_dir/animation/animation_module.js", - "$resources_out_dir/audits/audits_module.js", - "$resources_out_dir/browser_debugger/browser_debugger_module.js", - "$resources_out_dir/changes/changes_module.js", - "$resources_out_dir/protocol_monitor/protocol_monitor_module.js", - "$resources_out_dir/css_overview/css_overview_module.js", - "$resources_out_dir/cm/cm_module.js", - "$resources_out_dir/color_picker/color_picker_module.js", - "$resources_out_dir/console/console_module.js", - "$resources_out_dir/cookie_table/cookie_table_module.js", - "$resources_out_dir/coverage/coverage_module.js", - "$resources_out_dir/data_grid/data_grid_module.js", - "$resources_out_dir/devices/devices_module.js", - "$resources_out_dir/diff/diff_module.js", - "$resources_out_dir/elements/elements_module.js", - "$resources_out_dir/event_listeners/event_listeners_module.js", - "$resources_out_dir/formatter/formatter_module.js", - "$resources_out_dir/har_importer/har_importer_module.js", - "$resources_out_dir/heap_snapshot_model/heap_snapshot_model_module.js", - "$resources_out_dir/help/help_module.js", - "$resources_out_dir/inline_editor/inline_editor_module.js", - "$resources_out_dir/javascript_metadata/javascript_metadata_module.js", - "$resources_out_dir/js_profiler/js_profiler_module.js", - "$resources_out_dir/layer_viewer/layer_viewer_module.js", - "$resources_out_dir/layers/layers_module.js", - "$resources_out_dir/media/media_module.js", - "$resources_out_dir/network/network_module.js", - "$resources_out_dir/node_debugger/node_debugger_module.js", - "$resources_out_dir/object_ui/object_ui_module.js", - "$resources_out_dir/perf_ui/perf_ui_module.js", - "$resources_out_dir/performance_monitor/performance_monitor_module.js", - "$resources_out_dir/profiler/profiler_module.js", - "$resources_out_dir/quick_open/quick_open_module.js", - "$resources_out_dir/resources/resources_module.js", - "$resources_out_dir/search/search_module.js", - "$resources_out_dir/security/security_module.js", - "$resources_out_dir/settings/settings_module.js", - "$resources_out_dir/snippets/snippets_module.js", - "$resources_out_dir/source_frame/source_frame_module.js", - "$resources_out_dir/sources/sources_module.js", - "$resources_out_dir/text_editor/text_editor_module.js", - "$resources_out_dir/timeline_model/timeline_model_module.js", - "$resources_out_dir/timeline/timeline_module.js", - "$resources_out_dir/web_audio/web_audio_module.js", - "$resources_out_dir/workspace_diff/workspace_diff_module.js", -] - -generated_remote_modules = [ - "$resources_out_dir/accessibility/accessibility_module.js", - "$resources_out_dir/audits_worker/audits_worker_module.js", - "$resources_out_dir/cm_modes/cm_modes_module.js", - "$resources_out_dir/dagre_layout/dagre_layout_module.js", - "$resources_out_dir/emulated_devices/emulated_devices_module.js", - "$resources_out_dir/product_registry_impl/product_registry_impl_module.js", -] - -generated_test_modules = [ - "$resources_out_dir/accessibility_test_runner/accessibility_test_runner_module.js", - "$resources_out_dir/application_test_runner/application_test_runner_module.js", - "$resources_out_dir/audits_test_runner/audits_test_runner_module.js", - "$resources_out_dir/axe_core_test_runner/axe_core_test_runner_module.js", - "$resources_out_dir/bindings_test_runner/bindings_test_runner_module.js", - "$resources_out_dir/console_test_runner/console_test_runner_module.js", - "$resources_out_dir/coverage_test_runner/coverage_test_runner_module.js", - "$resources_out_dir/cpu_profiler_test_runner/cpu_profiler_test_runner_module.js", - "$resources_out_dir/data_grid_test_runner/data_grid_test_runner_module.js", - "$resources_out_dir/device_mode_test_runner/device_mode_test_runner_module.js", - "$resources_out_dir/elements_test_runner/elements_test_runner_module.js", - "$resources_out_dir/extensions_test_runner/extensions_test_runner_module.js", - "$resources_out_dir/heap_profiler_test_runner/heap_profiler_test_runner_module.js", - "$resources_out_dir/heap_snapshot_worker/heap_snapshot_worker_module.js", - "$resources_out_dir/integration_test_runner.html", - "$resources_out_dir/integration_test_runner.js", - "$resources_out_dir/layers_test_runner/layers_test_runner_module.js", - "$resources_out_dir/network_test_runner/network_test_runner_module.js", - "$resources_out_dir/performance_test_runner/performance_test_runner_module.js", - "$resources_out_dir/sdk_test_runner/sdk_test_runner_module.js", - "$resources_out_dir/security_test_runner/security_test_runner_module.js", - "$resources_out_dir/sources_test_runner/sources_test_runner_module.js", -] - -devtools_applications = [ - "audits_worker", - "devtools_app", - "formatter_worker", - "heap_snapshot_worker", - "inspector", - "integration_test_runner", - "js_app", - "ndb_app", - "node_app", - "shell", - "toolbox", - "worker_app", -] - -#------------------------------------------------------------------------------- - -visibility = [ "//third_party/blink/*" ] - -group("devtools_all_files") { - data = all_devtools_files + all_devtools_modules - deps = [ - ":devtools_frontend_resources_data", - ] -} - -devtools_frontend_resources_deps = [ - ":aria_properties", - ":build_release_devtools", - ":copy_embedder_scripts", - ":copy_emulated_devices_images", - ":copy_htaccess", - ":copy_inspector_images", - ":copy_lighthouse_locale_files", - ":devtools_extension_api", - ":frontend_protocol_sources", - ":supported_css_properties", - ":copy_devtools_modules", -] - -if (debug_devtools) { - devtools_frontend_resources_deps += [ - ":build_debug_devtools", - ":copy_aria_properties", - ":copy_generated_scripts", - ] -} - -group("devtools_frontend_resources") { - public_deps = devtools_frontend_resources_deps -} - -# Do not use this unless you need unpacked devtools at runtime. -group("devtools_frontend_resources_data") { - data_deps = devtools_frontend_resources_deps -} - -copy("copy_embedder_scripts") { - sources = devtools_embedder_scripts - outputs = [ - "$resources_out_dir/{{source_file_part}}", - ] -} - -copy("copy_htaccess") { - sources = [ - "htaccess", - ] - outputs = [ - "$resources_out_dir/.htaccess", - ] -} - -copy("copy_inspector_images") { - sources = devtools_image_files - outputs = [ - "$resources_out_dir/Images/{{source_file_part}}", - ] -} - -copy("copy_emulated_devices_images") { - sources = devtools_emulated_devices_images - outputs = [ - "$resources_out_dir/emulated_devices/{{source_file_part}}", - ] -} - -copy("copy_lighthouse_locale_files") { - sources = lighthouse_locale_files - outputs = [ - "$resources_out_dir/audits_worker/lighthouse/locales/{{source_file_part}}", - ] -} - -action("generate_devtools_grd") { - script = "scripts/build/generate_devtools_grd.py" - - deps = [ - ":devtools_frontend_resources", +if (!external_devtools_frontend) { + all_devtools_files = [ + "front_end/accessibility/AccessibilityModel.js", + "front_end/accessibility/accessibilityNode.css", + "front_end/accessibility/AccessibilityNodeView.js", + "front_end/accessibility/accessibilityProperties.css", + "front_end/accessibility/AccessibilitySidebarView.js", + "front_end/accessibility/AccessibilityStrings.js", + "front_end/accessibility/ARIAAttributesView.js", + "front_end/accessibility/ARIAMetadata.js", + "front_end/accessibility/axBreadcrumbs.css", + "front_end/accessibility/AXBreadcrumbsPane.js", + "front_end/accessibility/module.json", + "front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js", + "front_end/accessibility_test_runner/module.json", + "front_end/animation/AnimationGroupPreviewUI.js", + "front_end/animation/AnimationModel.js", + "front_end/animation/animationScreenshotPopover.css", + "front_end/animation/AnimationScreenshotPopover.js", + "front_end/animation/animationTimeline.css", + "front_end/animation/AnimationTimeline.js", + "front_end/animation/AnimationUI.js", + "front_end/animation/module.json", + "front_end/application_test_runner/AppcacheTestRunner.js", + "front_end/application_test_runner/CacheStorageTestRunner.js", + "front_end/application_test_runner/IndexedDBTestRunner.js", + "front_end/application_test_runner/module.json", + "front_end/application_test_runner/ResourcesTestRunner.js", + "front_end/application_test_runner/ResourceTreeTestRunner.js", + "front_end/application_test_runner/ServiceWorkersTestRunner.js", + "front_end/audits_worker.js", + "front_end/audits_worker.json", + "front_end/audits_worker/AuditsService.js", + "front_end/audits_worker/lighthouse/lighthouse-dt-bundle.js", + "front_end/audits_worker/module.json", + "front_end/audits/AuditsPanel.js", + "front_end/audits/AuditsController.js", + "front_end/audits/AuditsReportSelector.js", + "front_end/audits/AuditsReportRenderer.js", + "front_end/audits/AuditsStartView.js", + "front_end/audits/AuditsProtocolService.js", + "front_end/audits/AuditsStatusView.js", + "front_end/audits/auditsDialog.css", + "front_end/audits/auditsStartView.css", + "front_end/audits/auditsPanel.css", + "front_end/audits/RadioSetting.js", + "front_end/audits/lighthouse/report.css", + "front_end/audits/lighthouse/report.js", + "front_end/audits/lighthouse/report-generator.js", + "front_end/audits/lighthouse/template.html", + "front_end/audits/lighthouse/templates.html", + "front_end/audits/module.json", + "front_end/audits_test_runner/AuditsTestRunner.js", + "front_end/audits_test_runner/module.json", + "front_end/axe_core_test_runner/AxeCoreTestRunner.js", + "front_end/axe_core_test_runner/module.json", + "front_end/bindings/module.json", + "front_end/bindings_test_runner/AutomappingTestRunner.js", + "front_end/bindings_test_runner/BindingsTestRunner.js", + "front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js", + "front_end/bindings_test_runner/module.json", + "front_end/bindings_test_runner/PersistenceTestRunner.js", + "front_end/bindings_test_runner/OverridesTestRunner.js", + "front_end/browser_debugger/DOMBreakpointsSidebarPane.js", + "front_end/browser_debugger/EventListenerBreakpointsSidebarPane.js", + "front_end/browser_debugger/ObjectEventListenersSidebarPane.js", + "front_end/browser_debugger/XHRBreakpointsSidebarPane.js", + "front_end/browser_debugger/domBreakpointsSidebarPane.css", + "front_end/browser_debugger/eventListenerBreakpoints.css", + "front_end/browser_debugger/module.json", + "front_end/browser_debugger/xhrBreakpointsSidebarPane.css", + "front_end/browser_sdk/module.json", + "front_end/css_overview/cssOverview.css", + "front_end/css_overview/cssOverviewStartView.css", + "front_end/css_overview/cssOverviewProcessingView.css", + "front_end/css_overview/cssOverviewCompletedView.css", + "front_end/css_overview/CSSOverviewController.js", + "front_end/css_overview/CSSOverviewStartView.js", + "front_end/css_overview/CSSOverviewProcessingView.js", + "front_end/css_overview/CSSOverviewCompletedView.js", + "front_end/css_overview/CSSOverviewModel.js", + "front_end/css_overview/CSSOverviewSidebarPanel.js", + "front_end/css_overview/cssOverviewSidebarPanel.css", + "front_end/css_overview/CSSOverviewPanel.js", + "front_end/css_overview/module.json", + "front_end/changes/ChangesHighlighter.js", + "front_end/changes/changesView.css", + "front_end/changes/ChangesView.js", + "front_end/changes/changesSidebar.css", + "front_end/changes/ChangesSidebar.js", + "front_end/changes/module.json", + "front_end/cm/active-line.js", + "front_end/cm/brace-fold.js", + "front_end/cm/closebrackets.js", + "front_end/cm/codemirror.css", + "front_end/cm/codemirror.js", + "front_end/cm/comment.js", + "front_end/cm/foldcode.js", + "front_end/cm/foldgutter.js", + "front_end/cm/mark-selection.js", + "front_end/cm/matchbrackets.js", + "front_end/cm/module.json", + "front_end/cm/multiplex.js", + "front_end/cm/overlay.js", + "front_end/cm_headless/headlesscodemirror.js", + "front_end/cm_headless/module.json", + "front_end/cm_modes/clike.js", + "front_end/cm_modes/clojure.js", + "front_end/cm_modes/coffeescript.js", + "front_end/cm_modes/DefaultCodeMirrorMimeMode.js", + "front_end/cm_modes/jsx.js", + "front_end/cm_modes/livescript.js", + "front_end/cm_modes/markdown.js", + "front_end/cm_modes/module.json", + "front_end/cm_modes/php.js", + "front_end/cm_modes/python.js", + "front_end/cm_modes/shell.js", + "front_end/cm_modes/stylus.js", + "front_end/cm_web_modes/css.js", + "front_end/cm_web_modes/htmlembedded.js", + "front_end/cm_web_modes/htmlmixed.js", + "front_end/cm_web_modes/javascript.js", + "front_end/cm_web_modes/xml.js", + "front_end/color_picker/ContrastDetails.js", + "front_end/color_picker/ContrastInfo.js", + "front_end/color_picker/ContrastOverlay.js", + "front_end/color_picker/module.json", + "front_end/color_picker/spectrum.css", + "front_end/color_picker/Spectrum.js", + "front_end/common/module.json", + "front_end/components/imagePreview.css", + "front_end/components/jsUtils.css", + "front_end/components/module.json", + "front_end/console/ConsoleContextSelector.js", + "front_end/console/ConsoleFilter.js", + "front_end/console/ConsoleSidebar.js", + "front_end/console/ConsolePanel.js", + "front_end/console/ConsolePinPane.js", + "front_end/console/ConsolePrompt.js", + "front_end/console/consoleView.css", + "front_end/console/consoleContextSelector.css", + "front_end/console/consolePinPane.css", + "front_end/console/consolePrompt.css", + "front_end/console/consoleSidebar.css", + "front_end/console/ConsoleView.js", + "front_end/console/ConsoleViewMessage.js", + "front_end/console/ConsoleViewport.js", + "front_end/console/module.json", + "front_end/console_counters/errorWarningCounter.css", + "front_end/console_counters/module.json", + "front_end/console_counters/WarningErrorCounter.js", + "front_end/console_test_runner/ConsoleTestRunner.js", + "front_end/console_test_runner/module.json", + "front_end/cookie_table/CookiesTable.js", + "front_end/cookie_table/module.json", + "front_end/coverage/coverageListView.css", + "front_end/coverage/CoverageDecorationManager.js", + "front_end/coverage/CoverageListView.js", + "front_end/coverage/CoverageModel.js", + "front_end/coverage/coverageView.css", + "front_end/coverage/CoverageView.js", + "front_end/coverage/module.json", + "front_end/coverage_test_runner/CoverageTestRunner.js", + "front_end/coverage_test_runner/module.json", + "front_end/cpu_profiler_test_runner/module.json", + "front_end/cpu_profiler_test_runner/ProfilerTestRunner.js", + "front_end/dagre_layout/dagre.js", + "front_end/dagre_layout/module.json", + "front_end/data_grid/dataGrid.css", + "front_end/data_grid/DataGrid.js", + "front_end/data_grid/module.json", + "front_end/data_grid/ShowMoreDataGridNode.js", + "front_end/data_grid/SortableDataGrid.js", + "front_end/data_grid/ViewportDataGrid.js", + "front_end/data_grid_test_runner/DataGridTestRunner.js", + "front_end/data_grid_test_runner/module.json", + "front_end/device_mode_test_runner/DeviceModeTestRunner.js", + "front_end/device_mode_test_runner/module.json", + "front_end/devices/DevicesView.js", + "front_end/devices/devicesView.css", + "front_end/devices/module.json", + "front_end/diff/diff_match_patch.js", + "front_end/diff/Diff.js", + "front_end/diff/module.json", + "front_end/dom_extension/module.json", + "front_end/elements/breadcrumbs.css", + "front_end/elements/classesPaneWidget.css", + "front_end/elements/ClassesPaneWidget.js", + "front_end/elements/ColorSwatchPopoverIcon.js", + "front_end/elements/ComputedStyleModel.js", + "front_end/elements/computedStyleSidebarPane.css", + "front_end/elements/computedStyleWidgetTree.css", + "front_end/elements/ComputedStyleWidget.js", + "front_end/elements/DOMLinkifier.js", + "front_end/elements/domLinkifier.css", + "front_end/elements/DOMPath.js", + "front_end/elements/ElementsBreadcrumbs.js", + "front_end/elements/elementsPanel.css", + "front_end/elements/ElementsPanel.js", + "front_end/elements/ElementsSidebarPane.js", + "front_end/elements/elementStatePaneWidget.css", + "front_end/elements/ElementStatePaneWidget.js", + "front_end/elements/ElementsTreeElement.js", + "front_end/elements/ElementsTreeElementHighlighter.js", + "front_end/elements/elementsTreeOutline.css", + "front_end/elements/ElementsTreeOutline.js", + "front_end/elements/EventListenersWidget.js", + "front_end/elements/InspectElementModeController.js", + "front_end/elements/MarkerDecorator.js", + "front_end/elements/metricsSidebarPane.css", + "front_end/elements/MetricsSidebarPane.js", + "front_end/elements/nodeStackTraceWidget.css", + "front_end/elements/NodeStackTraceWidget.js", + "front_end/elements/module.json", + "front_end/elements/platformFontsWidget.css", + "front_end/elements/PlatformFontsWidget.js", + "front_end/elements/propertiesWidget.css", + "front_end/elements/PropertiesWidget.js", + "front_end/elements/StylePropertyHighlighter.js", + "front_end/elements/stylesSectionTree.css", + "front_end/elements/stylesSidebarPane.css", + "front_end/elements/StylesSidebarPane.js", + "front_end/elements/StylePropertyTreeElement.js", + "front_end/elements_test_runner/EditDOMTestRunner.js", + "front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js", + "front_end/elements_test_runner/ElementsTestRunner.js", + "front_end/elements_test_runner/module.json", + "front_end/elements_test_runner/SetOuterHTMLTestRunner.js", + "front_end/elements_test_runner/StylesUpdateLinksTestRunner.js", + "front_end/emulated_devices/module.json", + "front_end/emulation/AdvancedApp.js", + "front_end/emulation/DeviceModeModel.js", + "front_end/emulation/deviceModeToolbar.css", + "front_end/emulation/DeviceModeToolbar.js", + "front_end/emulation/deviceModeView.css", + "front_end/emulation/DeviceModeView.js", + "front_end/emulation/DeviceModeWrapper.js", + "front_end/emulation/devicesSettingsTab.css", + "front_end/emulation/DevicesSettingsTab.js", + "front_end/emulation/EmulatedDevices.js", + "front_end/emulation/geolocationsSettingsTab.css", + "front_end/emulation/GeolocationsSettingsTab.js", + "front_end/emulation/inspectedPagePlaceholder.css", + "front_end/emulation/InspectedPagePlaceholder.js", + "front_end/emulation/mediaQueryInspector.css", + "front_end/emulation/MediaQueryInspector.js", + "front_end/emulation/module.json", + "front_end/emulation/sensors.css", + "front_end/emulation/SensorsView.js", + "front_end/event_listeners/EventListenersUtils.js", + "front_end/event_listeners/eventListenersView.css", + "front_end/event_listeners/EventListenersView.js", + "front_end/event_listeners/module.json", + "front_end/extensions/ExtensionAPI.js", + "front_end/extensions/ExtensionPanel.js", + "front_end/extensions/ExtensionServer.js", + "front_end/extensions/ExtensionTraceProvider.js", + "front_end/extensions/ExtensionView.js", + "front_end/extensions/module.json", + "front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js", + "front_end/extensions_test_runner/ExtensionsTestRunner.js", + "front_end/extensions_test_runner/module.json", + "front_end/formatter/FormatterWorkerPool.js", + "front_end/formatter/module.json", + "front_end/formatter/ScriptFormatter.js", + "front_end/formatter_worker.js", + "front_end/formatter_worker.json", + "front_end/formatter_worker/AcornTokenizer.js", + "front_end/formatter_worker/CSSFormatter.js", + "front_end/formatter_worker/CSSRuleParser.js", + "front_end/formatter_worker/ESTreeWalker.js", + "front_end/formatter_worker/FormattedContentBuilder.js", + "front_end/formatter_worker/FormatterWorker.js", + "front_end/formatter_worker/HTMLFormatter.js", + "front_end/formatter_worker/IdentityFormatter.js", + "front_end/formatter_worker/JavaScriptFormatter.js", + "front_end/formatter_worker/JavaScriptOutline.js", + "front_end/formatter_worker/RelaxedJSONParser.js", + "front_end/formatter_worker/acorn/acorn.js", + "front_end/formatter_worker/acorn/acorn_loose.js", + "front_end/formatter_worker/module.json", + "front_end/har_importer/HARFormat.js", + "front_end/har_importer/HARImporter.js", + "front_end/har_importer/module.json", + "front_end/heap_profiler_test_runner/HeapProfilerTestRunner.js", + "front_end/heap_profiler_test_runner/module.json", + "front_end/heap_snapshot_model/HeapSnapshotModel.js", + "front_end/heap_snapshot_model/module.json", + "front_end/heap_snapshot_worker.js", + "front_end/heap_snapshot_worker.json", + "front_end/heap_snapshot_worker/AllocationProfile.js", + "front_end/heap_snapshot_worker/HeapSnapshot.js", + "front_end/heap_snapshot_worker/HeapSnapshotLoader.js", + "front_end/heap_snapshot_worker/HeapSnapshotWorker.js", + "front_end/heap_snapshot_worker/HeapSnapshotWorkerDispatcher.js", + "front_end/heap_snapshot_worker/module.json", + "front_end/help/Help.js", + "front_end/help/module.json", + "front_end/help/releaseNote.css", + "front_end/help/ReleaseNoteText.js", + "front_end/help/ReleaseNoteView.js", + "front_end/host/module.json", + "front_end/inline_editor/bezierEditor.css", + "front_end/inline_editor/BezierEditor.js", + "front_end/inline_editor/bezierSwatch.css", + "front_end/inline_editor/BezierUI.js", + "front_end/inline_editor/colorSwatch.css", + "front_end/inline_editor/ColorSwatch.js", + "front_end/inline_editor/cssShadowEditor.css", + "front_end/inline_editor/CSSShadowEditor.js", + "front_end/inline_editor/CSSShadowModel.js", + "front_end/inline_editor/cssShadowSwatch.css", + "front_end/inline_editor/module.json", + "front_end/inline_editor/swatchPopover.css", + "front_end/inline_editor/SwatchPopoverHelper.js", + "front_end/inspector.js", + "front_end/inspector.json", + "front_end/inspector_main/InspectorMain.js", + "front_end/inspector_main/module.json", + "front_end/inspector_main/nodeIcon.css", + "front_end/inspector_main/renderingOptions.css", + "front_end/inspector_main/RenderingOptions.js", + "front_end/integration_test_runner.js", + "front_end/integration_test_runner.json", + "front_end/javascript_metadata/module.json", + "front_end/javascript_metadata/NativeFunctions.js", + "front_end/javascript_metadata/JavaScriptMetadata.js", + "front_end/js_main/JsMain.js", + "front_end/js_main/module.json", + "front_end/js_profiler/module.json", + "front_end/layer_viewer/layerDetailsView.css", + "front_end/layer_viewer/LayerDetailsView.js", + "front_end/layer_viewer/layers3DView.css", + "front_end/layer_viewer/Layers3DView.js", + "front_end/layer_viewer/LayerTreeOutline.js", + "front_end/layer_viewer/LayerViewHost.js", + "front_end/layer_viewer/module.json", + "front_end/layer_viewer/paintProfiler.css", + "front_end/layer_viewer/PaintProfilerView.js", + "front_end/layer_viewer/TransformController.js", + "front_end/layers/LayerPaintProfilerView.js", + "front_end/layers/LayersPanel.js", + "front_end/layers/LayerTreeModel.js", + "front_end/layers/module.json", + "front_end/layers_test_runner/LayersTestRunner.js", + "front_end/layers_test_runner/module.json", + "front_end/main/ExecutionContextSelector.js", + "front_end/main/Main.js", + "front_end/main/module.json", + "front_end/main/SimpleApp.js", + "front_end/protocol_monitor/ProtocolMonitor.js", + "front_end/protocol_monitor/protocolMonitor.css", + "front_end/protocol_monitor/module.json", + "front_end/mobile_throttling/MobileThrottlingSelector.js", + "front_end/mobile_throttling/module.json", + "front_end/mobile_throttling/NetworkPanelIndicator.js", + "front_end/mobile_throttling/NetworkThrottlingSelector.js", + "front_end/mobile_throttling/ThrottlingManager.js", + "front_end/mobile_throttling/ThrottlingPresets.js", + "front_end/mobile_throttling/throttlingSettingsTab.css", + "front_end/mobile_throttling/ThrottlingSettingsTab.js", + "front_end/media/eventDisplayTable.css", + "front_end/media/EventDisplayTable.js", + "front_end/media/MainView.js", + "front_end/media/MediaTable.js", + "front_end/media/PlayerDetailView.js", + "front_end/media/playerListView.css", + "front_end/media/PlayerListView.js", + "front_end/media/module.json", + "front_end/media/MediaModel.js", + "front_end/media/mediaView.css", + "front_end/ndb_app.json", + "front_end/network/binaryResourceView.css", + "front_end/network/blockedURLsPane.css", + "front_end/network/BinaryResourceView.js", + "front_end/network/BlockedURLsPane.js", + "front_end/network/eventSourceMessagesView.css", + "front_end/network/EventSourceMessagesView.js", + "front_end/network/HARWriter.js", + "front_end/network/module.json", + "front_end/network/networkConfigView.css", + "front_end/network/NetworkConfigView.js", + "front_end/network/NetworkDataGridNode.js", + "front_end/network/NetworkItemView.js", + "front_end/network/networkLogView.css", + "front_end/network/NetworkLogView.js", + "front_end/network/NetworkLogViewColumns.js", + "front_end/network/NetworkFrameGrouper.js", + "front_end/network/networkManageCustomHeadersView.css", + "front_end/network/NetworkManageCustomHeadersView.js", + "front_end/network/NetworkOverview.js", + "front_end/network/networkPanel.css", + "front_end/network/NetworkPanel.js", + "front_end/network/NetworkSearchScope.js", + "front_end/network/NetworkTimeCalculator.js", + "front_end/network/networkTimingTable.css", + "front_end/network/networkWaterfallColumn.css", + "front_end/network/NetworkWaterfallColumn.js", + "front_end/network/requestCookiesView.css", + "front_end/network/RequestCookiesView.js", + "front_end/network/requestHeadersTree.css", + "front_end/network/requestHeadersView.css", + "front_end/network/RequestHeadersView.js", + "front_end/network/requestHTMLView.css", + "front_end/network/RequestHTMLView.js", + "front_end/network/requestInitiatorView.css", + "front_end/network/RequestInitiatorView.js", + "front_end/network/RequestPreviewView.js", + "front_end/network/RequestResponseView.js", + "front_end/network/RequestTimingView.js", + "front_end/network/ResourceWebSocketFrameView.js", + "front_end/network/signedExchangeInfoTree.css", + "front_end/network/signedExchangeInfoView.css", + "front_end/network/SignedExchangeInfoView.js", + "front_end/network/webSocketFrameView.css", + "front_end/network_test_runner/module.json", + "front_end/network_test_runner/NetworkTestRunner.js", + "front_end/network_test_runner/ProductRegistryTestRunner.js", + "front_end/node_debugger/module.json", + "front_end/node_main/NodeConnectionsPanel.js", + "front_end/node_main/nodeConnectionsPanel.css", + "front_end/node_main/NodeMain.js", + "front_end/node_main/module.json", + "front_end/object_ui/customPreviewComponent.css", + "front_end/object_ui/CustomPreviewComponent.js", + "front_end/object_ui/JavaScriptAutocomplete.js", + "front_end/object_ui/JavaScriptREPL.js", + "front_end/object_ui/module.json", + "front_end/object_ui/objectPopover.css", + "front_end/object_ui/ObjectPopoverHelper.js", + "front_end/object_ui/objectPropertiesSection.css", + "front_end/object_ui/ObjectPropertiesSection.js", + "front_end/object_ui/objectValue.css", + "front_end/object_ui/RemoteObjectPreviewFormatter.js", + "front_end/perf_ui/ChartViewport.js", + "front_end/perf_ui/FilmStripView.js", + "front_end/perf_ui/FlameChart.js", + "front_end/perf_ui/GCActionDelegate.js", + "front_end/perf_ui/LineLevelProfile.js", + "front_end/perf_ui/LiveHeapProfile.js", + "front_end/perf_ui/NetworkPriorities.js", + "front_end/perf_ui/OverviewGrid.js", + "front_end/perf_ui/PieChart.js", + "front_end/perf_ui/TimelineGrid.js", + "front_end/perf_ui/TimelineOverviewPane.js", + "front_end/perf_ui/chartViewport.css", + "front_end/perf_ui/filmStripView.css", + "front_end/perf_ui/flameChart.css", + "front_end/perf_ui/module.json", + "front_end/perf_ui/overviewGrid.css", + "front_end/perf_ui/pieChart.css", + "front_end/perf_ui/timelineGrid.css", + "front_end/perf_ui/timelineOverviewInfo.css", + "front_end/performance_monitor/PerformanceMonitor.js", + "front_end/performance_monitor/performanceMonitor.css", + "front_end/performance_monitor/module.json", + "front_end/performance_test_runner/module.json", + "front_end/performance_test_runner/TimelineDataTestRunner.js", + "front_end/performance_test_runner/TimelineTestRunner.js", + "front_end/persistence/editFileSystemView.css", + "front_end/persistence/module.json", + "front_end/persistence/workspaceSettingsTab.css", + "front_end/platform/module.json", + "front_end/product_registry/BadgePool.js", + "front_end/product_registry/ProductRegistry.js", + "front_end/product_registry/badge.css", + "front_end/product_registry/module.json", + "front_end/product_registry/popup.css", + "front_end/product_registry_impl/module.json", + "front_end/product_registry_impl/ProductRegistryImpl.js", + "front_end/product_registry_impl/ProductRegistryData.js", + "front_end/product_registry_impl/sha1/sha1.js", + "front_end/profiler/BottomUpProfileDataGrid.js", + "front_end/profiler/CPUProfileFlameChart.js", + "front_end/profiler/CPUProfileView.js", + "front_end/profiler/heapProfiler.css", + "front_end/profiler/HeapProfileView.js", + "front_end/profiler/HeapProfilerPanel.js", + "front_end/profiler/HeapSnapshotDataGrids.js", + "front_end/profiler/HeapSnapshotGridNodes.js", + "front_end/profiler/HeapSnapshotProxy.js", + "front_end/profiler/HeapSnapshotView.js", + "front_end/profiler/HeapTimelineOverview.js", + "front_end/profiler/IsolateSelector.js", + "front_end/profiler/LiveHeapProfileView.js", + "front_end/profiler/liveHeapProfile.css", + "front_end/profiler/module.json", + "front_end/profiler/ProfileDataGrid.js", + "front_end/profiler/ProfileHeader.js", + "front_end/profiler/profileLauncherView.css", + "front_end/profiler/ProfileLauncherView.js", + "front_end/profiler/ProfileType.js", + "front_end/profiler/profilesPanel.css", + "front_end/profiler/ProfilesPanel.js", + "front_end/profiler/profilesSidebarTree.css", + "front_end/profiler/ProfileTypeRegistry.js", + "front_end/profiler/ProfileView.js", + "front_end/profiler/TopDownProfileDataGrid.js", + "front_end/protocol/module.json", + "front_end/quick_open/CommandMenu.js", + "front_end/quick_open/filteredListWidget.css", + "front_end/quick_open/FilteredListWidget.js", + "front_end/quick_open/HelpQuickOpen.js", + "front_end/quick_open/QuickOpen.js", + "front_end/quick_open/module.json", + "front_end/resources/ApplicationCacheModel.js", + "front_end/resources/ApplicationCacheItemsView.js", + "front_end/resources/ApplicationPanelSidebar.js", + "front_end/resources/appManifestView.css", + "front_end/resources/AppManifestView.js", + "front_end/resources/BackgroundServiceModel.js", + "front_end/resources/backgroundServiceView.css", + "front_end/resources/BackgroundServiceView.js", + "front_end/resources/clearStorageView.css", + "front_end/resources/ClearStorageView.js", + "front_end/resources/CookieItemsView.js", + "front_end/resources/cookieItemsView.css", + "front_end/resources/DatabaseModel.js", + "front_end/resources/DatabaseQueryView.js", + "front_end/resources/DatabaseTableView.js", + "front_end/resources/DOMStorageItemsView.js", + "front_end/resources/DOMStorageModel.js", + "front_end/resources/IndexedDBModel.js", + "front_end/resources/indexedDBViews.css", + "front_end/resources/IndexedDBViews.js", + "front_end/resources/module.json", + "front_end/resources/resourcesPanel.css", + "front_end/resources/ResourcesPanel.js", + "front_end/resources/ResourcesSection.js", + "front_end/resources/resourcesSidebar.css", + "front_end/resources/serviceWorkerCacheViews.css", + "front_end/resources/ServiceWorkerCacheViews.js", + "front_end/resources/serviceWorkersView.css", + "front_end/resources/ServiceWorkersView.js", + "front_end/resources/StorageItemsView.js", + "front_end/shell.json", + "front_end/screencast/InputModel.js", + "front_end/screencast/module.json", + "front_end/screencast/ScreencastApp.js", + "front_end/screencast/screencastView.css", + "front_end/screencast/ScreencastView.js", + "front_end/sdk/module.json", + "front_end/sdk_test_runner/module.json", + "front_end/sdk_test_runner/PageMockTestRunner.js", + "front_end/search/module.json", + "front_end/search/SearchConfig.js", + "front_end/search/searchResultsPane.css", + "front_end/search/SearchResultsPane.js", + "front_end/search/searchView.css", + "front_end/search/SearchView.js", + "front_end/security/lockIcon.css", + "front_end/security/mainView.css", + "front_end/security/module.json", + "front_end/security/originView.css", + "front_end/security/SecurityModel.js", + "front_end/security/SecurityPanel.js", + "front_end/security/sidebar.css", + "front_end/security_test_runner/module.json", + "front_end/security_test_runner/SecurityTestRunner.js", + "front_end/services/module.json", + "front_end/settings/frameworkBlackboxSettingsTab.css", + "front_end/settings/FrameworkBlackboxSettingsTab.js", + "front_end/settings/module.json", + "front_end/settings/settingsScreen.css", + "front_end/settings/SettingsScreen.js", + "front_end/snippets/module.json", + "front_end/snippets/ScriptSnippetFileSystem.js", + "front_end/snippets/SnippetsQuickOpen.js", + "front_end/source_frame/BinaryResourceViewFactory.js", + "front_end/source_frame/fontView.css", + "front_end/source_frame/FontView.js", + "front_end/source_frame/imageView.css", + "front_end/source_frame/jsonView.css", + "front_end/source_frame/JSONView.js", + "front_end/source_frame/ImageView.js", + "front_end/source_frame/messagesPopover.css", + "front_end/source_frame/module.json", + "front_end/source_frame/PreviewFactory.js", + "front_end/source_frame/resourceSourceFrame.css", + "front_end/source_frame/ResourceSourceFrame.js", + "front_end/source_frame/SourceCodeDiff.js", + "front_end/source_frame/SourceFrame.js", + "front_end/source_frame/SourcesTextEditor.js", + "front_end/source_frame/xmlTree.css", + "front_end/source_frame/xmlView.css", + "front_end/source_frame/XMLView.js", + "front_end/sources/AddSourceMapURLDialog.js", + "front_end/sources/breakpointEditDialog.css", + "front_end/sources/BreakpointEditDialog.js", + "front_end/sources/callStackSidebarPane.css", + "front_end/sources/CallStackSidebarPane.js", + "front_end/sources/CSSPlugin.js", + "front_end/sources/DebuggerPlugin.js", + "front_end/sources/dialog.css", + "front_end/sources/debuggerPausedMessage.css", + "front_end/sources/DebuggerPausedMessage.js", + "front_end/sources/EditingLocationHistoryManager.js", + "front_end/sources/FilePathScoreFunction.js", + "front_end/sources/FilteredUISourceCodeListProvider.js", + "front_end/sources/GoToLineQuickOpen.js", + "front_end/sources/GutterDiffPlugin.js", + "front_end/sources/InplaceFormatterEditorAction.js", + "front_end/sources/javaScriptBreakpointsSidebarPane.css", + "front_end/sources/JavaScriptBreakpointsSidebarPane.js", + "front_end/sources/JavaScriptCompilerPlugin.js", + "front_end/sources/module.json", + "front_end/sources/navigatorTree.css", + "front_end/sources/navigatorView.css", + "front_end/sources/NavigatorView.js", + "front_end/sources/OpenFileQuickOpen.js", + "front_end/sources/OutlineQuickOpen.js", + "front_end/sources/scopeChainSidebarPane.css", + "front_end/sources/ScopeChainSidebarPane.js", + "front_end/sources/ScriptFormatterEditorAction.js", + "front_end/sources/ScriptOriginPlugin.js", + "front_end/sources/SearchSourcesView.js", + "front_end/sources/SimpleHistoryManager.js", + "front_end/sources/SnippetsPlugin.js", + "front_end/sources/SourceFormatter.js", + "front_end/sources/SourceMapNamesResolver.js", + "front_end/sources/SourcesNavigator.js", + "front_end/sources/sourcesPanel.css", + "front_end/sources/SourcesPanel.js", + "front_end/sources/SourcesSearchScope.js", + "front_end/sources/sourcesView.css", + "front_end/sources/SourcesView.js", + "front_end/sources/UISourceCodeFrame.js", + "front_end/sources/TabbedEditorContainer.js", + "front_end/sources/threadsSidebarPane.css", + "front_end/sources/ThreadsSidebarPane.js", + "front_end/sources/watchExpressionsSidebarPane.css", + "front_end/sources/WatchExpressionsSidebarPane.js", + "front_end/sources_test_runner/AutocompleteTestRunner.js", + "front_end/sources_test_runner/DebuggerTestRunner.js", + "front_end/sources_test_runner/EditorTestRunner.js", + "front_end/sources_test_runner/LiveEditTestRunner.js", + "front_end/sources_test_runner/SearchTestRunner.js", + "front_end/sources_test_runner/SourcesTestRunner.js", + "front_end/sources_test_runner/module.json", + "front_end/terminal/module.json", + "front_end/terminal/terminal.css", + "front_end/terminal/TerminalWidget.js", + "front_end/terminal/xterm.js/addons/fit/fit.js", + "front_end/terminal/xterm.js/build/xterm.css", + "front_end/terminal/xterm.js/build/xterm.js", + "front_end/test_runner/module.json", + "front_end/test_runner/TestRunner.js", + "front_end/text_editor/autocompleteTooltip.css", + "front_end/text_editor/cmdevtools.css", + "front_end/text_editor/CodeMirrorTextEditor.js", + "front_end/text_editor/CodeMirrorUtils.js", + "front_end/text_editor/module.json", + "front_end/text_editor/TextEditorAutocompleteController.js", + "front_end/text_utils/module.json", + "front_end/text_utils/Text.js", + "front_end/text_utils/TextRange.js", + "front_end/text_utils/TextUtils.js", + "front_end/timeline_model/module.json", + "front_end/timeline_model/TimelineFrameModel.js", + "front_end/timeline_model/TimelineIRModel.js", + "front_end/timeline_model/TimelineJSProfile.js", + "front_end/timeline_model/TimelineModel.js", + "front_end/timeline_model/TimelineModelFilter.js", + "front_end/timeline_model/TimelineProfileTree.js", + "front_end/timeline_model/TracingLayerTree.js", + "front_end/timeline/CountersGraph.js", + "front_end/timeline/EventsTimelineTreeView.js", + "front_end/timeline/ExtensionTracingSession.js", + "front_end/timeline/historyToolbarButton.css", + "front_end/timeline/invalidationsTree.css", + "front_end/timeline/module.json", + "front_end/timeline/PerformanceModel.js", + "front_end/timeline/TimelineController.js", + "front_end/timeline/TimelineDetailsView.js", + "front_end/timeline/TimelineEventOverview.js", + "front_end/timeline/TimelineFilters.js", + "front_end/timeline/TimelineFlameChartDataProvider.js", + "front_end/timeline/TimelineFlameChartNetworkDataProvider.js", + "front_end/timeline/timelineFlamechartPopover.css", + "front_end/timeline/TimelineFlameChartView.js", + "front_end/timeline/timelineHistoryManager.css", + "front_end/timeline/TimelineHistoryManager.js", + "front_end/timeline/TimelineLayersView.js", + "front_end/timeline/TimelineLoader.js", + "front_end/timeline/timelinePaintProfiler.css", + "front_end/timeline/TimelinePaintProfilerView.js", + "front_end/timeline/timelinePanel.css", + "front_end/timeline/TimelinePanel.js", + "front_end/timeline/timelineStatusDialog.css", + "front_end/timeline/TimelineTreeView.js", + "front_end/timeline/TimelineUIUtils.js", + "front_end/timeline/UIDevtoolsController.js", + "front_end/timeline/UIDevtoolsUtils.js", + "front_end/toolbox_bootstrap/module.json", + "front_end/toolbox_bootstrap/Toolbox.js", + "front_end/toolbox.js", + "front_end/toolbox.json", + "front_end/ui/checkboxTextLabel.css", + "front_end/ui/closeButton.css", + "front_end/ui/confirmDialog.css", + "front_end/ui/dialog.css", + "front_end/ui/dropTarget.css", + "front_end/ui/emptyWidget.css", + "front_end/ui/filter.css", + "front_end/ui/glassPane.css", + "front_end/ui/infobar.css", + "front_end/ui/inlineButton.css", + "front_end/ui/inspectorCommon.css", + "front_end/ui/inspectorStyle.css", + "front_end/ui/inspectorSyntaxHighlight.css", + "front_end/ui/inspectorSyntaxHighlightDark.css", + "front_end/ui/inspectorViewTabbedPane.css", + "front_end/ui/listWidget.css", + "front_end/ui/module.json", + "front_end/ui/popover.css", + "front_end/ui/progressIndicator.css", + "front_end/ui/radioButton.css", + "front_end/ui/reportView.css", + "front_end/ui/remoteDebuggingTerminatedScreen.css", + "front_end/ui/rootView.css", + "front_end/ui/searchableView.css", + "front_end/ui/segmentedButton.css", + "front_end/ui/slider.css", + "front_end/ui/smallBubble.css", + "front_end/ui/softContextMenu.css", + "front_end/ui/softDropDown.css", + "front_end/ui/softDropDownButton.css", + "front_end/ui/splitWidget.css", + "front_end/ui/suggestBox.css", + "front_end/ui/tabbedPane.css", + "front_end/ui/targetCrashedScreen.css", + "front_end/ui/textButton.css", + "front_end/ui/textPrompt.css", + "front_end/ui/toolbar.css", + "front_end/ui/tooltip.css", + "front_end/ui/treeoutline.css", + "front_end/ui/viewContainers.css", + "front_end/web_audio/AudioContextContentBuilder.js", + "front_end/web_audio/audioContextSelector.css", + "front_end/web_audio/AudioContextSelector.js", + "front_end/web_audio/module.json", + "front_end/web_audio/webAudio.css", + "front_end/web_audio/WebAudioModel.js", + "front_end/web_audio/WebAudioView.js", + "front_end/web_audio/graph_visualizer/Types.js", + "front_end/web_audio/graph_visualizer/GraphStyle.js", + "front_end/web_audio/graph_visualizer/GraphManager.js", + "front_end/web_audio/graph_visualizer/NodeRendererUtility.js", + "front_end/web_audio/graph_visualizer/NodeView.js", + "front_end/web_audio/graph_visualizer/EdgeView.js", + "front_end/web_audio/graph_visualizer/GraphView.js", + "front_end/worker_main/WorkerMain.js", + "front_end/worker_main/module.json", + "front_end/worker_service/module.json", + "front_end/worker_service/ServiceDispatcher.js", + "front_end/workspace/module.json", + "front_end/workspace_diff/WorkspaceDiff.js", + "front_end/workspace_diff/module.json", ] - grd_files = - copied_devtools_modules + generated_applications + - generated_non_autostart_non_remote_modules + devtools_embedder_scripts + - [ - "$resources_out_dir/devtools_extension_api.js", - "$resources_out_dir/SupportedCSSProperties.js", - "$resources_out_dir/InspectorBackendCommands.js", - ] - - # Bundle remote modules in ChromeOS. - if (is_chromeos) { - grd_files += generated_remote_modules + devtools_emulated_devices_images + - lighthouse_locale_files - } - - inputs = grd_files + devtools_image_files - outfile = "$root_gen_dir/devtools/devtools_resources.grd" - outputs = [ - outfile, + lighthouse_locale_files = [ + "front_end/audits_worker/lighthouse/locales/ar-XB.json", + "front_end/audits_worker/lighthouse/locales/ar.json", + "front_end/audits_worker/lighthouse/locales/bg.json", + "front_end/audits_worker/lighthouse/locales/ca.json", + "front_end/audits_worker/lighthouse/locales/cs.json", + "front_end/audits_worker/lighthouse/locales/da.json", + "front_end/audits_worker/lighthouse/locales/de.json", + "front_end/audits_worker/lighthouse/locales/el.json", + "front_end/audits_worker/lighthouse/locales/en-GB.json", + "front_end/audits_worker/lighthouse/locales/en-US.json", + "front_end/audits_worker/lighthouse/locales/en-XA.json", + "front_end/audits_worker/lighthouse/locales/en-XL.json", + "front_end/audits_worker/lighthouse/locales/es-419.json", + "front_end/audits_worker/lighthouse/locales/es.json", + "front_end/audits_worker/lighthouse/locales/fi.json", + "front_end/audits_worker/lighthouse/locales/fil.json", + "front_end/audits_worker/lighthouse/locales/fr.json", + "front_end/audits_worker/lighthouse/locales/he.json", + "front_end/audits_worker/lighthouse/locales/hi.json", + "front_end/audits_worker/lighthouse/locales/hr.json", + "front_end/audits_worker/lighthouse/locales/hu.json", + "front_end/audits_worker/lighthouse/locales/id.json", + "front_end/audits_worker/lighthouse/locales/it.json", + "front_end/audits_worker/lighthouse/locales/ja.json", + "front_end/audits_worker/lighthouse/locales/ko.json", + "front_end/audits_worker/lighthouse/locales/lt.json", + "front_end/audits_worker/lighthouse/locales/lv.json", + "front_end/audits_worker/lighthouse/locales/nl.json", + "front_end/audits_worker/lighthouse/locales/no.json", + "front_end/audits_worker/lighthouse/locales/pl.json", + "front_end/audits_worker/lighthouse/locales/pt-PT.json", + "front_end/audits_worker/lighthouse/locales/pt.json", + "front_end/audits_worker/lighthouse/locales/ro.json", + "front_end/audits_worker/lighthouse/locales/ru.json", + "front_end/audits_worker/lighthouse/locales/sk.json", + "front_end/audits_worker/lighthouse/locales/sl.json", + "front_end/audits_worker/lighthouse/locales/sr-Latn.json", + "front_end/audits_worker/lighthouse/locales/sr.json", + "front_end/audits_worker/lighthouse/locales/sv.json", + "front_end/audits_worker/lighthouse/locales/ta.json", + "front_end/audits_worker/lighthouse/locales/te.json", + "front_end/audits_worker/lighthouse/locales/th.json", + "front_end/audits_worker/lighthouse/locales/tr.json", + "front_end/audits_worker/lighthouse/locales/uk.json", + "front_end/audits_worker/lighthouse/locales/vi.json", + "front_end/audits_worker/lighthouse/locales/zh-HK.json", + "front_end/audits_worker/lighthouse/locales/zh-TW.json", + "front_end/audits_worker/lighthouse/locales/zh.json", ] - relative_path_dirs = [ - resources_out_dir, - "front_end", + all_devtools_files += lighthouse_locale_files + + all_devtools_modules = [ + "front_end/browser_sdk/browser_sdk.js", + "front_end/browser_sdk/LogManager.js", + "front_end/persistence/persistence.js", + "front_end/persistence/WorkspaceSettingsTab.js", + "front_end/persistence/PlatformFileSystem.js", + "front_end/persistence/PersistenceUtils.js", + "front_end/persistence/PersistenceImpl.js", + "front_end/persistence/PersistenceActions.js", + "front_end/persistence/NetworkPersistenceManager.js", + "front_end/persistence/IsolatedFileSystemManager.js", + "front_end/persistence/IsolatedFileSystem.js", + "front_end/persistence/FileSystemWorkspaceBinding.js", + "front_end/persistence/EditFileSystemView.js", + "front_end/persistence/Automapping.js", + "front_end/components/components.js", + "front_end/components/TargetDetachedDialog.js", + "front_end/components/Reload.js", + "front_end/components/Linkifier.js", + "front_end/components/JSPresentationUtils.js", + "front_end/components/ImagePreview.js", + "front_end/components/DockController.js", + "front_end/bindings/bindings.js", + "front_end/bindings/TempFile.js", + "front_end/bindings/StylesSourceMapping.js", + "front_end/bindings/SASSSourceMapping.js", + "front_end/bindings/ResourceUtils.js", + "front_end/bindings/ResourceScriptMapping.js", + "front_end/bindings/ResourceMapping.js", + "front_end/bindings/PresentationConsoleMessageHelper.js", + "front_end/bindings/NetworkProject.js", + "front_end/bindings/LiveLocation.js", + "front_end/bindings/FileUtils.js", + "front_end/bindings/DefaultScriptMapping.js", + "front_end/bindings/DebuggerWorkspaceBinding.js", + "front_end/bindings/CSSWorkspaceBinding.js", + "front_end/bindings/ContentProviderBasedProject.js", + "front_end/bindings/CompilerScriptMapping.js", + "front_end/bindings/BreakpointManager.js", + "front_end/bindings/BlackboxManager.js", + "front_end/workspace/workspace.js", + "front_end/workspace/WorkspaceImpl.js", + "front_end/workspace/UISourceCode.js", + "front_end/workspace/FileManager.js", + "front_end/services/services.js", + "front_end/services/ServiceManager.js", + "front_end/sdk/sdk.js", + "front_end/sdk/TracingModel.js", + "front_end/sdk/TracingManager.js", + "front_end/sdk/TargetManager.js", + "front_end/sdk/Target.js", + "front_end/sdk/SourceMapManager.js", + "front_end/sdk/SourceMap.js", + "front_end/sdk/ServiceWorkerManager.js", + "front_end/sdk/ServiceWorkerCacheModel.js", + "front_end/sdk/ServerTiming.js", + "front_end/sdk/SecurityOriginManager.js", + "front_end/sdk/SDKModel.js", + "front_end/sdk/Script.js", + "front_end/sdk/ScreenCaptureModel.js", + "front_end/sdk/RuntimeModel.js", + "front_end/sdk/ResourceTreeModel.js", + "front_end/sdk/Resource.js", + "front_end/sdk/RemoteObject.js", + "front_end/sdk/ProfileTreeModel.js", + "front_end/sdk/PerformanceMetricsModel.js", + "front_end/sdk/PaintProfiler.js", + "front_end/sdk/OverlayModel.js", + "front_end/sdk/NetworkRequest.js", + "front_end/sdk/NetworkManager.js", + "front_end/sdk/NetworkLog.js", + "front_end/sdk/LogModel.js", + "front_end/sdk/LayerTreeBase.js", + "front_end/sdk/IsolateManager.js", + "front_end/sdk/HeapProfilerModel.js", + "front_end/sdk/HARLog.js", + "front_end/sdk/FilmStripModel.js", + "front_end/sdk/EmulationModel.js", + "front_end/sdk/DOMModel.js", + "front_end/sdk/DOMDebuggerModel.js", + "front_end/sdk/DebuggerModel.js", + "front_end/sdk/CSSStyleSheetHeader.js", + "front_end/sdk/CSSStyleDeclaration.js", + "front_end/sdk/CSSRule.js", + "front_end/sdk/CSSProperty.js", + "front_end/sdk/CSSModel.js", + "front_end/sdk/CSSMetadata.js", + "front_end/sdk/CSSMedia.js", + "front_end/sdk/CSSMatchedStyles.js", + "front_end/sdk/CPUProfilerModel.js", + "front_end/sdk/CPUProfileDataModel.js", + "front_end/sdk/CookieParser.js", + "front_end/sdk/CookieModel.js", + "front_end/sdk/CompilerSourceMappingContentProvider.js", + "front_end/sdk/ConsoleModel.js", + "front_end/sdk/Connections.js", + "front_end/sdk/ChildTargetManager.js", + "front_end/protocol/protocol.js", + "front_end/protocol/NodeURL.js", + "front_end/protocol/InspectorBackend.js", + "front_end/host/host.js", + "front_end/host/UserMetrics.js", + "front_end/host/ResourceLoader.js", + "front_end/host/Platform.js", + "front_end/host/InspectorFrontendHost.js", + "front_end/host/InspectorFrontendHostAPI.js", + "front_end/dom_extension/DOMExtension.js", + "front_end/root.js", + "front_end/Runtime.js", + "front_end/platform/utilities.js", + "front_end/ui/ARIAUtils.js", + "front_end/ui/ZoomManager.js", + "front_end/ui/XWidget.js", + "front_end/ui/XLink.js", + "front_end/ui/XElement.js", + "front_end/ui/Widget.js", + "front_end/ui/View.js", + "front_end/ui/ViewManager.js", + "front_end/ui/UIUtils.js", + "front_end/ui/ui.js", + "front_end/ui/Treeoutline.js", + "front_end/ui/Tooltip.js", + "front_end/ui/Toolbar.js", + "front_end/ui/ThrottledWidget.js", + "front_end/ui/TextPrompt.js", + "front_end/ui/TextEditor.js", + "front_end/ui/TargetCrashedScreen.js", + "front_end/ui/TabbedPane.js", + "front_end/ui/SyntaxHighlighter.js", + "front_end/ui/SuggestBox.js", + "front_end/ui/SplitWidget.js", + "front_end/ui/SoftDropDown.js", + "front_end/ui/SoftContextMenu.js", + "front_end/ui/ShortcutsScreen.js", + "front_end/ui/ShortcutRegistry.js", + "front_end/ui/SettingsUI.js", + "front_end/ui/SegmentedButton.js", + "front_end/ui/SearchableView.js", + "front_end/ui/RootView.js", + "front_end/ui/ResizerWidget.js", + "front_end/ui/ReportView.js", + "front_end/ui/RemoteDebuggingTerminatedScreen.js", + "front_end/ui/ProgressIndicator.js", + "front_end/ui/PopoverHelper.js", + "front_end/ui/Panel.js", + "front_end/ui/ListWidget.js", + "front_end/ui/ListModel.js", + "front_end/ui/ListControl.js", + "front_end/ui/KeyboardShortcut.js", + "front_end/ui/InspectorView.js", + "front_end/ui/InplaceEditor.js", + "front_end/ui/Infobar.js", + "front_end/ui/Icon.js", + "front_end/ui/HistoryInput.js", + "front_end/ui/GlassPane.js", + "front_end/ui/Geometry.js", + "front_end/ui/Fragment.js", + "front_end/ui/ForwardedInputEventHandler.js", + "front_end/ui/FilterSuggestionBuilder.js", + "front_end/ui/FilterBar.js", + "front_end/ui/EmptyWidget.js", + "front_end/ui/DropTarget.js", + "front_end/ui/Dialog.js", + "front_end/ui/ContextMenu.js", + "front_end/ui/Context.js", + "front_end/ui/ARIAUtils.js", + "front_end/ui/ActionRegistry.js", + "front_end/ui/Action.js", + "front_end/ui/ActionDelegate.js", + "front_end/ui/ContextFlavorListener.js", + "front_end/root.js", + "front_end/common/common.js", + "front_end/common/App.js", + "front_end/common/AppProvider.js", + "front_end/common/CharacterIdMap.js", + "front_end/common/Color.js", + "front_end/common/ContentProvider.js", + "front_end/common/EventTarget.js", + "front_end/common/JavaScriptMetaData.js", + "front_end/common/Linkifier.js", + "front_end/common/Object.js", + "front_end/common/Console.js", + "front_end/common/ParsedURL.js", + "front_end/common/Progress.js", + "front_end/common/QueryParamHandler.js", + "front_end/common/ResourceType.js", + "front_end/common/Revealer.js", + "front_end/common/Runnable.js", + "front_end/common/SegmentedRange.js", + "front_end/common/Settings.js", + "front_end/common/StaticContentProvider.js", + "front_end/common/StringOutputStream.js", + "front_end/common/TextDictionary.js", + "front_end/common/Throttler.js", + "front_end/common/Trie.js", + "front_end/common/UIString.js", + "front_end/common/Worker.js", ] - args = rebase_path(grd_files, root_build_dir) + [ "--relative_path_dirs" ] + - rebase_path(relative_path_dirs, root_build_dir) + - [ - "--images", - rebase_path("front_end/Images", root_build_dir), - "--output", - rebase_path(outfile, root_build_dir), - ] -} - -action("devtools_extension_api") { - script = "scripts/build/generate_devtools_extension_api.py" - - devtools_extension_api_files = [ "front_end/extensions/ExtensionAPI.js" ] - inputs = devtools_extension_api_files - outputs = [ - "$resources_out_dir/devtools_extension_api.js", + devtools_test_files = [ + "//third_party/axe-core/axe.js", + "front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js", + "front_end/accessibility_test_runner/module.json", + "front_end/application_test_runner/AppcacheTestRunner.js", + "front_end/application_test_runner/CacheStorageTestRunner.js", + "front_end/application_test_runner/IndexedDBTestRunner.js", + "front_end/application_test_runner/module.json", + "front_end/application_test_runner/ResourcesTestRunner.js", + "front_end/application_test_runner/ResourceTreeTestRunner.js", + "front_end/application_test_runner/ServiceWorkersTestRunner.js", + "front_end/audits_test_runner/AuditsTestRunner.js", + "front_end/audits_test_runner/module.json", + "front_end/axe_core_test_runner/AxeCoreTestRunner.js", + "front_end/axe_core_test_runner/module.json", + "front_end/bindings_test_runner/AutomappingTestRunner.js", + "front_end/bindings_test_runner/BindingsTestRunner.js", + "front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js", + "front_end/bindings_test_runner/module.json", + "front_end/bindings_test_runner/OverridesTestRunner.js", + "front_end/bindings_test_runner/PersistenceTestRunner.js", + "front_end/console_test_runner/ConsoleTestRunner.js", + "front_end/console_test_runner/module.json", + "front_end/coverage_test_runner/CoverageTestRunner.js", + "front_end/coverage_test_runner/module.json", + "front_end/cpu_profiler_test_runner/module.json", + "front_end/cpu_profiler_test_runner/ProfilerTestRunner.js", + "front_end/data_grid_test_runner/DataGridTestRunner.js", + "front_end/data_grid_test_runner/module.json", + "front_end/device_mode_test_runner/DeviceModeTestRunner.js", + "front_end/device_mode_test_runner/module.json", + "front_end/elements_test_runner/EditDOMTestRunner.js", + "front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js", + "front_end/elements_test_runner/ElementsTestRunner.js", + "front_end/elements_test_runner/module.json", + "front_end/elements_test_runner/SetOuterHTMLTestRunner.js", + "front_end/elements_test_runner/StylesUpdateLinksTestRunner.js", + "front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js", + "front_end/extensions_test_runner/ExtensionsTestRunner.js", + "front_end/extensions_test_runner/module.json", + "front_end/heap_profiler_test_runner/HeapProfilerTestRunner.js", + "front_end/heap_profiler_test_runner/module.json", + "front_end/integration_test_runner.html", + "front_end/integration_test_runner.js", + "front_end/integration_test_runner.json", + "front_end/layers_test_runner/LayersTestRunner.js", + "front_end/layers_test_runner/module.json", + "front_end/network_test_runner/module.json", + "front_end/network_test_runner/NetworkTestRunner.js", + "front_end/network_test_runner/ProductRegistryTestRunner.js", + "front_end/performance_test_runner/module.json", + "front_end/performance_test_runner/TimelineDataTestRunner.js", + "front_end/performance_test_runner/TimelineTestRunner.js", + "front_end/sdk_test_runner/module.json", + "front_end/sdk_test_runner/PageMockTestRunner.js", + "front_end/security_test_runner/module.json", + "front_end/security_test_runner/SecurityTestRunner.js", + "front_end/sources_test_runner/AutocompleteTestRunner.js", + "front_end/sources_test_runner/DebuggerTestRunner.js", + "front_end/sources_test_runner/EditorTestRunner.js", + "front_end/sources_test_runner/LiveEditTestRunner.js", + "front_end/sources_test_runner/module.json", + "front_end/sources_test_runner/SearchTestRunner.js", + "front_end/sources_test_runner/SourcesTestRunner.js", + "front_end/test_runner/module.json", + "front_end/test_runner/TestRunner.js", ] - args = rebase_path(outputs, root_build_dir) + - rebase_path(devtools_extension_api_files, root_build_dir) -} - -action("supported_css_properties") { - script = "scripts/build/generate_supported_css.py" - - inputs = [ - "../core/css/css_properties.json5", + devtools_embedder_scripts = [ + "front_end/devtools_compatibility.js", + "front_end/Tests.js", ] - outputs = [ + devtools_emulated_devices_images = [ + "front_end/emulated_devices/google-nexus-5-horizontal-default-1x.png", + "front_end/emulated_devices/google-nexus-5-horizontal-default-2x.png", + "front_end/emulated_devices/google-nexus-5-horizontal-keyboard-1x.png", + "front_end/emulated_devices/google-nexus-5-horizontal-keyboard-2x.png", + "front_end/emulated_devices/google-nexus-5-horizontal-navigation-1x.png", + "front_end/emulated_devices/google-nexus-5-horizontal-navigation-2x.png", + "front_end/emulated_devices/google-nexus-5-vertical-default-1x.png", + "front_end/emulated_devices/google-nexus-5-vertical-default-2x.png", + "front_end/emulated_devices/google-nexus-5-vertical-keyboard-1x.png", + "front_end/emulated_devices/google-nexus-5-vertical-keyboard-2x.png", + "front_end/emulated_devices/google-nexus-5-vertical-navigation-1x.png", + "front_end/emulated_devices/google-nexus-5-vertical-navigation-2x.png", + "front_end/emulated_devices/google-nexus-5x-horizontal-default-1x.png", + "front_end/emulated_devices/google-nexus-5x-horizontal-default-2x.png", + "front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-1x.png", + "front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-2x.png", + "front_end/emulated_devices/google-nexus-5x-horizontal-navigation-1x.png", + "front_end/emulated_devices/google-nexus-5x-horizontal-navigation-2x.png", + "front_end/emulated_devices/google-nexus-5x-vertical-default-1x.png", + "front_end/emulated_devices/google-nexus-5x-vertical-default-2x.png", + "front_end/emulated_devices/google-nexus-5x-vertical-keyboard-1x.png", + "front_end/emulated_devices/google-nexus-5x-vertical-keyboard-2x.png", + "front_end/emulated_devices/google-nexus-5x-vertical-navigation-1x.png", + "front_end/emulated_devices/google-nexus-5x-vertical-navigation-2x.png", + "front_end/emulated_devices/iPad-landscape.svg", + "front_end/emulated_devices/iPad-portrait.svg", + "front_end/emulated_devices/iPhone5-landscape.svg", + "front_end/emulated_devices/iPhone5-portrait.svg", + "front_end/emulated_devices/iPhone6-landscape.svg", + "front_end/emulated_devices/iPhone6-portrait.svg", + "front_end/emulated_devices/iPhone6Plus-landscape.svg", + "front_end/emulated_devices/iPhone6Plus-portrait.svg", + "front_end/emulated_devices/Nexus5X-landscape.svg", + "front_end/emulated_devices/Nexus5X-portrait.svg", + "front_end/emulated_devices/Nexus6P-landscape.svg", + "front_end/emulated_devices/Nexus6P-portrait.svg", + ] + + devtools_image_files = [ + "front_end/Images/accelerometer-back.svg", + "front_end/Images/accelerometer-bottom.png", + "front_end/Images/accelerometer-front.svg", + "front_end/Images/accelerometer-left.png", + "front_end/Images/accelerometer-right.png", + "front_end/Images/accelerometer-top.png", + "front_end/Images/audits_logo.svg", + "front_end/Images/breakpoint.svg", + "front_end/Images/breakpointConditional.svg", + "front_end/Images/checkboxCheckmark.svg", + "front_end/Images/checker.png", + "front_end/Images/chevrons.svg", + "front_end/Images/chromeDisabledSelect.png", + "front_end/Images/chromeDisabledSelect_2x.png", + "front_end/Images/chromeLeft.png", + "front_end/Images/chromeMiddle.png", + "front_end/Images/chromeRight.png", + "front_end/Images/chromeSelect.png", + "front_end/Images/chromeSelect_2x.png", + "front_end/Images/errorWave.svg", + "front_end/Images/ic_info_black_18dp.svg", + "front_end/Images/ic_warning_black_18dp.svg", + "front_end/Images/largeIcons.svg", + "front_end/Images/mediumIcons.svg", + "front_end/Images/navigationControls.png", + "front_end/Images/navigationControls_2x.png", + "front_end/Images/nodeIcon.png", + "front_end/Images/popoverArrows.png", + "front_end/Images/profileGroupIcon.png", + "front_end/Images/profileIcon.png", + "front_end/Images/profileSmallIcon.png", + "front_end/Images/radioDot.png", + "front_end/Images/resizeDiagonal.png", + "front_end/Images/resizeDiagonal_2x.png", + "front_end/Images/resizeHorizontal.png", + "front_end/Images/resizeHorizontal_2x.png", + "front_end/Images/resizeVertical.png", + "front_end/Images/resizeVertical_2x.png", + "front_end/Images/resourceCSSIcon.png", + "front_end/Images/resourceDocumentIcon.png", + "front_end/Images/resourceDocumentIconSmall.png", + "front_end/Images/resourceJSIcon.png", + "front_end/Images/resourcePlainIcon.png", + "front_end/Images/resourcePlainIconSmall.png", + "front_end/Images/resourcesTimeGraphIcon.png", + "front_end/Images/searchNext.png", + "front_end/Images/searchPrev.png", + "front_end/Images/securityIcons.svg", + "front_end/Images/speech.png", + "front_end/Images/smallIcons.svg", + "front_end/Images/toolbarResizerVertical.png", + "front_end/Images/touchCursor.png", + "front_end/Images/touchCursor_2x.png", + "front_end/Images/treeoutlineTriangles.svg", + "front_end/Images/whatsnew.png", + ] + + resources_out_dir = "$root_out_dir/resources/inspector" + + generated_scripts = [ + "$resources_out_dir/InspectorBackendCommands.js", "$resources_out_dir/SupportedCSSProperties.js", ] - args = - rebase_path(inputs, root_build_dir) + rebase_path(outputs, root_build_dir) -} + generated_aria_properties = + [ "$resources_out_dir/accessibility/ARIAProperties.js" ] -action("aria_properties") { - script = "scripts/build/generate_aria.py" - - inputs = [ - "../core/html/aria_properties.json5", + application_templates = [ + "front_end/devtools_app.html", + "front_end/inspector.html", + "front_end/integration_test_runner.html", + "front_end/js_app.html", + "front_end/ndb_app.html", + "front_end/node_app.html", + "front_end/toolbox.html", + "front_end/worker_app.html", ] - outputs = [ - "$resources_out_dir/accessibility/ARIAProperties.js", + copied_devtools_modules = [ + "$resources_out_dir/browser_sdk/browser_sdk.js", + "$resources_out_dir/browser_sdk/LogManager.js", + "$resources_out_dir/persistence/persistence.js", + "$resources_out_dir/persistence/WorkspaceSettingsTab.js", + "$resources_out_dir/persistence/PlatformFileSystem.js", + "$resources_out_dir/persistence/PersistenceUtils.js", + "$resources_out_dir/persistence/PersistenceImpl.js", + "$resources_out_dir/persistence/PersistenceActions.js", + "$resources_out_dir/persistence/NetworkPersistenceManager.js", + "$resources_out_dir/persistence/IsolatedFileSystemManager.js", + "$resources_out_dir/persistence/IsolatedFileSystem.js", + "$resources_out_dir/persistence/FileSystemWorkspaceBinding.js", + "$resources_out_dir/persistence/EditFileSystemView.js", + "$resources_out_dir/persistence/Automapping.js", + "$resources_out_dir/components/components.js", + "$resources_out_dir/components/TargetDetachedDialog.js", + "$resources_out_dir/components/Reload.js", + "$resources_out_dir/components/Linkifier.js", + "$resources_out_dir/components/JSPresentationUtils.js", + "$resources_out_dir/components/ImagePreview.js", + "$resources_out_dir/components/DockController.js", + "$resources_out_dir/bindings/bindings.js", + "$resources_out_dir/bindings/TempFile.js", + "$resources_out_dir/bindings/StylesSourceMapping.js", + "$resources_out_dir/bindings/SASSSourceMapping.js", + "$resources_out_dir/bindings/ResourceUtils.js", + "$resources_out_dir/bindings/ResourceScriptMapping.js", + "$resources_out_dir/bindings/ResourceMapping.js", + "$resources_out_dir/bindings/PresentationConsoleMessageHelper.js", + "$resources_out_dir/bindings/NetworkProject.js", + "$resources_out_dir/bindings/LiveLocation.js", + "$resources_out_dir/bindings/FileUtils.js", + "$resources_out_dir/bindings/DefaultScriptMapping.js", + "$resources_out_dir/bindings/DebuggerWorkspaceBinding.js", + "$resources_out_dir/bindings/CSSWorkspaceBinding.js", + "$resources_out_dir/bindings/ContentProviderBasedProject.js", + "$resources_out_dir/bindings/CompilerScriptMapping.js", + "$resources_out_dir/bindings/BreakpointManager.js", + "$resources_out_dir/bindings/BlackboxManager.js", + "$resources_out_dir/workspace/workspace.js", + "$resources_out_dir/workspace/WorkspaceImpl.js", + "$resources_out_dir/workspace/UISourceCode.js", + "$resources_out_dir/workspace/FileManager.js", + "$resources_out_dir/services/services.js", + "$resources_out_dir/services/ServiceManager.js", + "$resources_out_dir/sdk/sdk.js", + "$resources_out_dir/sdk/TracingModel.js", + "$resources_out_dir/sdk/TracingManager.js", + "$resources_out_dir/sdk/TargetManager.js", + "$resources_out_dir/sdk/Target.js", + "$resources_out_dir/sdk/SourceMapManager.js", + "$resources_out_dir/sdk/SourceMap.js", + "$resources_out_dir/sdk/ServiceWorkerManager.js", + "$resources_out_dir/sdk/ServiceWorkerCacheModel.js", + "$resources_out_dir/sdk/ServerTiming.js", + "$resources_out_dir/sdk/SecurityOriginManager.js", + "$resources_out_dir/sdk/SDKModel.js", + "$resources_out_dir/sdk/Script.js", + "$resources_out_dir/sdk/ScreenCaptureModel.js", + "$resources_out_dir/sdk/RuntimeModel.js", + "$resources_out_dir/sdk/ResourceTreeModel.js", + "$resources_out_dir/sdk/Resource.js", + "$resources_out_dir/sdk/RemoteObject.js", + "$resources_out_dir/sdk/ProfileTreeModel.js", + "$resources_out_dir/sdk/PerformanceMetricsModel.js", + "$resources_out_dir/sdk/PaintProfiler.js", + "$resources_out_dir/sdk/OverlayModel.js", + "$resources_out_dir/sdk/NetworkRequest.js", + "$resources_out_dir/sdk/NetworkManager.js", + "$resources_out_dir/sdk/NetworkLog.js", + "$resources_out_dir/sdk/LogModel.js", + "$resources_out_dir/sdk/LayerTreeBase.js", + "$resources_out_dir/sdk/IsolateManager.js", + "$resources_out_dir/sdk/HeapProfilerModel.js", + "$resources_out_dir/sdk/HARLog.js", + "$resources_out_dir/sdk/FilmStripModel.js", + "$resources_out_dir/sdk/EmulationModel.js", + "$resources_out_dir/sdk/DOMModel.js", + "$resources_out_dir/sdk/DOMDebuggerModel.js", + "$resources_out_dir/sdk/DebuggerModel.js", + "$resources_out_dir/sdk/CSSStyleSheetHeader.js", + "$resources_out_dir/sdk/CSSStyleDeclaration.js", + "$resources_out_dir/sdk/CSSRule.js", + "$resources_out_dir/sdk/CSSProperty.js", + "$resources_out_dir/sdk/CSSModel.js", + "$resources_out_dir/sdk/CSSMetadata.js", + "$resources_out_dir/sdk/CSSMedia.js", + "$resources_out_dir/sdk/CSSMatchedStyles.js", + "$resources_out_dir/sdk/CPUProfilerModel.js", + "$resources_out_dir/sdk/CPUProfileDataModel.js", + "$resources_out_dir/sdk/CookieParser.js", + "$resources_out_dir/sdk/CookieModel.js", + "$resources_out_dir/sdk/CompilerSourceMappingContentProvider.js", + "$resources_out_dir/sdk/ConsoleModel.js", + "$resources_out_dir/sdk/Connections.js", + "$resources_out_dir/sdk/ChildTargetManager.js", + "$resources_out_dir/protocol/protocol.js", + "$resources_out_dir/protocol/NodeURL.js", + "$resources_out_dir/protocol/InspectorBackend.js", + "$resources_out_dir/host/host.js", + "$resources_out_dir/host/UserMetrics.js", + "$resources_out_dir/host/ResourceLoader.js", + "$resources_out_dir/host/Platform.js", + "$resources_out_dir/host/InspectorFrontendHost.js", + "$resources_out_dir/host/InspectorFrontendHostAPI.js", + "$resources_out_dir/dom_extension/DOMExtension.js", + "$resources_out_dir/root.js", + "$resources_out_dir/Runtime.js", + "$resources_out_dir/platform/utilities.js", + "$resources_out_dir/ui/ui.js", + "$resources_out_dir/common/common.js", + "$resources_out_dir/ui/ZoomManager.js", + "$resources_out_dir/ui/XWidget.js", + "$resources_out_dir/ui/XLink.js", + "$resources_out_dir/ui/XElement.js", + "$resources_out_dir/ui/Widget.js", + "$resources_out_dir/ui/View.js", + "$resources_out_dir/ui/ViewManager.js", + "$resources_out_dir/ui/UIUtils.js", + "$resources_out_dir/ui/Treeoutline.js", + "$resources_out_dir/ui/Tooltip.js", + "$resources_out_dir/ui/Toolbar.js", + "$resources_out_dir/ui/ThrottledWidget.js", + "$resources_out_dir/ui/TextPrompt.js", + "$resources_out_dir/ui/TextEditor.js", + "$resources_out_dir/ui/TargetCrashedScreen.js", + "$resources_out_dir/ui/TabbedPane.js", + "$resources_out_dir/ui/SyntaxHighlighter.js", + "$resources_out_dir/ui/SuggestBox.js", + "$resources_out_dir/ui/SplitWidget.js", + "$resources_out_dir/ui/SoftDropDown.js", + "$resources_out_dir/ui/SoftContextMenu.js", + "$resources_out_dir/ui/ShortcutsScreen.js", + "$resources_out_dir/ui/ShortcutRegistry.js", + "$resources_out_dir/ui/SettingsUI.js", + "$resources_out_dir/ui/SegmentedButton.js", + "$resources_out_dir/ui/SearchableView.js", + "$resources_out_dir/ui/RootView.js", + "$resources_out_dir/ui/ResizerWidget.js", + "$resources_out_dir/ui/ReportView.js", + "$resources_out_dir/ui/RemoteDebuggingTerminatedScreen.js", + "$resources_out_dir/ui/ProgressIndicator.js", + "$resources_out_dir/ui/PopoverHelper.js", + "$resources_out_dir/ui/Panel.js", + "$resources_out_dir/ui/ListWidget.js", + "$resources_out_dir/ui/ListModel.js", + "$resources_out_dir/ui/ListControl.js", + "$resources_out_dir/ui/KeyboardShortcut.js", + "$resources_out_dir/ui/InspectorView.js", + "$resources_out_dir/ui/InplaceEditor.js", + "$resources_out_dir/ui/Infobar.js", + "$resources_out_dir/ui/Icon.js", + "$resources_out_dir/ui/HistoryInput.js", + "$resources_out_dir/ui/GlassPane.js", + "$resources_out_dir/ui/Geometry.js", + "$resources_out_dir/ui/Fragment.js", + "$resources_out_dir/ui/ForwardedInputEventHandler.js", + "$resources_out_dir/ui/FilterSuggestionBuilder.js", + "$resources_out_dir/ui/FilterBar.js", + "$resources_out_dir/ui/EmptyWidget.js", + "$resources_out_dir/ui/DropTarget.js", + "$resources_out_dir/ui/Dialog.js", + "$resources_out_dir/ui/ContextMenu.js", + "$resources_out_dir/ui/Context.js", + "$resources_out_dir/ui/ARIAUtils.js", + "$resources_out_dir/ui/ActionRegistry.js", + "$resources_out_dir/ui/Action.js", + "$resources_out_dir/ui/ActionDelegate.js", + "$resources_out_dir/ui/ContextFlavorListener.js", + "$resources_out_dir/common/App.js", + "$resources_out_dir/common/AppProvider.js", + "$resources_out_dir/common/CharacterIdMap.js", + "$resources_out_dir/common/Color.js", + "$resources_out_dir/common/ContentProvider.js", + "$resources_out_dir/common/EventTarget.js", + "$resources_out_dir/common/JavaScriptMetaData.js", + "$resources_out_dir/common/Linkifier.js", + "$resources_out_dir/common/Object.js", + "$resources_out_dir/common/Console.js", + "$resources_out_dir/common/ParsedURL.js", + "$resources_out_dir/common/Progress.js", + "$resources_out_dir/common/QueryParamHandler.js", + "$resources_out_dir/common/ResourceType.js", + "$resources_out_dir/common/Revealer.js", + "$resources_out_dir/common/Runnable.js", + "$resources_out_dir/common/SegmentedRange.js", + "$resources_out_dir/common/Settings.js", + "$resources_out_dir/common/StaticContentProvider.js", + "$resources_out_dir/common/StringOutputStream.js", + "$resources_out_dir/common/TextDictionary.js", + "$resources_out_dir/common/Throttler.js", + "$resources_out_dir/common/Trie.js", + "$resources_out_dir/common/UIString.js", + "$resources_out_dir/common/Worker.js", ] - args = - rebase_path(inputs, root_build_dir) + rebase_path(outputs, root_build_dir) -} - -action("frontend_protocol_sources") { - script = "scripts/build/code_generator_frontend.py" - deps = [ - "../core/inspector:protocol_version", - ] - inputs = [ - "$blink_core_output_dir/inspector/protocol.json", - ] - outputs = [ - "$resources_out_dir/InspectorBackendCommands.js", + generated_applications = [ + "$resources_out_dir/audits_worker.js", + "$resources_out_dir/devtools_app.html", + "$resources_out_dir/devtools_app.js", + "$resources_out_dir/formatter_worker.js", + "$resources_out_dir/heap_snapshot_worker.js", + "$resources_out_dir/inspector.html", + "$resources_out_dir/inspector.js", + "$resources_out_dir/js_app.html", + "$resources_out_dir/js_app.js", + "$resources_out_dir/node_app.html", + "$resources_out_dir/node_app.js", + "$resources_out_dir/shell.js", + "$resources_out_dir/toolbox.html", + "$resources_out_dir/toolbox.js", + "$resources_out_dir/worker_app.html", + "$resources_out_dir/worker_app.js", ] - args = rebase_path(inputs, root_build_dir) + [ - "--output_js_dir", - rebase_path(resources_out_dir, root_build_dir), - ] -} - -action("build_release_devtools") { - script = "scripts/build/build_release_applications.py" - - deps = [ - ":aria_properties", - ":frontend_protocol_sources", - ":supported_css_properties", + generated_non_autostart_non_remote_modules = [ + "$resources_out_dir/animation/animation_module.js", + "$resources_out_dir/audits/audits_module.js", + "$resources_out_dir/browser_debugger/browser_debugger_module.js", + "$resources_out_dir/changes/changes_module.js", + "$resources_out_dir/protocol_monitor/protocol_monitor_module.js", + "$resources_out_dir/css_overview/css_overview_module.js", + "$resources_out_dir/cm/cm_module.js", + "$resources_out_dir/color_picker/color_picker_module.js", + "$resources_out_dir/console/console_module.js", + "$resources_out_dir/cookie_table/cookie_table_module.js", + "$resources_out_dir/coverage/coverage_module.js", + "$resources_out_dir/data_grid/data_grid_module.js", + "$resources_out_dir/devices/devices_module.js", + "$resources_out_dir/diff/diff_module.js", + "$resources_out_dir/elements/elements_module.js", + "$resources_out_dir/event_listeners/event_listeners_module.js", + "$resources_out_dir/formatter/formatter_module.js", + "$resources_out_dir/har_importer/har_importer_module.js", + "$resources_out_dir/heap_snapshot_model/heap_snapshot_model_module.js", + "$resources_out_dir/help/help_module.js", + "$resources_out_dir/inline_editor/inline_editor_module.js", + "$resources_out_dir/javascript_metadata/javascript_metadata_module.js", + "$resources_out_dir/js_profiler/js_profiler_module.js", + "$resources_out_dir/layer_viewer/layer_viewer_module.js", + "$resources_out_dir/layers/layers_module.js", + "$resources_out_dir/media/media_module.js", + "$resources_out_dir/network/network_module.js", + "$resources_out_dir/node_debugger/node_debugger_module.js", + "$resources_out_dir/object_ui/object_ui_module.js", + "$resources_out_dir/perf_ui/perf_ui_module.js", + "$resources_out_dir/performance_monitor/performance_monitor_module.js", + "$resources_out_dir/profiler/profiler_module.js", + "$resources_out_dir/quick_open/quick_open_module.js", + "$resources_out_dir/resources/resources_module.js", + "$resources_out_dir/search/search_module.js", + "$resources_out_dir/security/security_module.js", + "$resources_out_dir/settings/settings_module.js", + "$resources_out_dir/snippets/snippets_module.js", + "$resources_out_dir/source_frame/source_frame_module.js", + "$resources_out_dir/sources/sources_module.js", + "$resources_out_dir/text_editor/text_editor_module.js", + "$resources_out_dir/timeline_model/timeline_model_module.js", + "$resources_out_dir/timeline/timeline_module.js", + "$resources_out_dir/web_audio/web_audio_module.js", + "$resources_out_dir/workspace_diff/workspace_diff_module.js", ] - helper_scripts = [ - "scripts/build/modular_build.py", - "scripts/build/rjsmin.py", + generated_remote_modules = [ + "$resources_out_dir/accessibility/accessibility_module.js", + "$resources_out_dir/audits_worker/audits_worker_module.js", + "$resources_out_dir/cm_modes/cm_modes_module.js", + "$resources_out_dir/dagre_layout/dagre_layout_module.js", + "$resources_out_dir/emulated_devices/emulated_devices_module.js", + "$resources_out_dir/product_registry_impl/product_registry_impl_module.js", ] - inputs = helper_scripts + all_devtools_files + devtools_test_files + - generated_scripts + generated_aria_properties + application_templates - outputs = - generated_applications + generated_non_autostart_non_remote_modules + - generated_remote_modules + generated_test_modules - - args = devtools_applications + [ - "--input_path", - rebase_path("front_end", root_build_dir), - "--output_path", - rebase_path(resources_out_dir, root_build_dir), - ] -} - -action("copy_devtools_modules") { - script = "scripts/build/copy_devtools_modules.py" - - deps = [ - ":build_release_devtools", + generated_test_modules = [ + "$resources_out_dir/accessibility_test_runner/accessibility_test_runner_module.js", + "$resources_out_dir/application_test_runner/application_test_runner_module.js", + "$resources_out_dir/audits_test_runner/audits_test_runner_module.js", + "$resources_out_dir/axe_core_test_runner/axe_core_test_runner_module.js", + "$resources_out_dir/bindings_test_runner/bindings_test_runner_module.js", + "$resources_out_dir/console_test_runner/console_test_runner_module.js", + "$resources_out_dir/coverage_test_runner/coverage_test_runner_module.js", + "$resources_out_dir/cpu_profiler_test_runner/cpu_profiler_test_runner_module.js", + "$resources_out_dir/data_grid_test_runner/data_grid_test_runner_module.js", + "$resources_out_dir/device_mode_test_runner/device_mode_test_runner_module.js", + "$resources_out_dir/elements_test_runner/elements_test_runner_module.js", + "$resources_out_dir/extensions_test_runner/extensions_test_runner_module.js", + "$resources_out_dir/heap_profiler_test_runner/heap_profiler_test_runner_module.js", + "$resources_out_dir/heap_snapshot_worker/heap_snapshot_worker_module.js", + "$resources_out_dir/integration_test_runner.html", + "$resources_out_dir/integration_test_runner.js", + "$resources_out_dir/layers_test_runner/layers_test_runner_module.js", + "$resources_out_dir/network_test_runner/network_test_runner_module.js", + "$resources_out_dir/performance_test_runner/performance_test_runner_module.js", + "$resources_out_dir/sdk_test_runner/sdk_test_runner_module.js", + "$resources_out_dir/security_test_runner/security_test_runner_module.js", + "$resources_out_dir/sources_test_runner/sources_test_runner_module.js", ] - inputs = all_devtools_modules - outputs = copied_devtools_modules + devtools_applications = [ + "audits_worker", + "devtools_app", + "formatter_worker", + "heap_snapshot_worker", + "inspector", + "integration_test_runner", + "js_app", + "ndb_app", + "node_app", + "shell", + "toolbox", + "worker_app", + ] - args = all_devtools_modules + [ - "--input_path", - rebase_path(".", root_build_dir), - "--output_path", - rebase_path(resources_out_dir, root_build_dir), - ] -} + #------------------------------------------------------------------------------- -if (debug_devtools) { - resources_out_debug_dir = "$root_out_dir/resources/inspector/debug" + visibility = [ "//third_party/blink/*" ] - action("build_debug_devtools") { - script = "scripts/build/build_debug_applications.py" - - inputs = all_devtools_files + application_templates - outputs = [ - "$resources_out_debug_dir/devtools_app.html", - "$resources_out_debug_dir/inspector.html", - "$resources_out_debug_dir/integration_test_runner.html", - "$resources_out_debug_dir/js_app.html", - "$resources_out_debug_dir/ndb_app.html", - "$resources_out_debug_dir/node_app.html", - "$resources_out_debug_dir/toolbox.html", - "$resources_out_debug_dir/worker_app.html", - ] - - args = [ - "--input_path", - rebase_path("front_end", root_build_dir), - "--output_path", - rebase_path(resources_out_debug_dir, root_build_dir), + group("devtools_all_files") { + data = all_devtools_files + all_devtools_modules + deps = [ + ":devtools_frontend_resources_data", ] } - copy("copy_generated_scripts") { - deps = [ + devtools_frontend_resources_deps = [ + ":aria_properties", + ":build_release_devtools", + ":copy_embedder_scripts", + ":copy_emulated_devices_images", + ":copy_htaccess", + ":copy_inspector_images", + ":copy_lighthouse_locale_files", + ":devtools_extension_api", + ":frontend_protocol_sources", + ":supported_css_properties", + ":copy_devtools_modules", + ] + + if (debug_devtools) { + devtools_frontend_resources_deps += [ ":build_debug_devtools", + ":copy_aria_properties", + ":copy_generated_scripts", + ] + } + + group("devtools_frontend_resources") { + public_deps = devtools_frontend_resources_deps + } + + # Do not use this unless you need unpacked devtools at runtime. + group("devtools_frontend_resources_data") { + data_deps = devtools_frontend_resources_deps + } + + copy("copy_embedder_scripts") { + sources = devtools_embedder_scripts + outputs = [ + "$resources_out_dir/{{source_file_part}}", + ] + } + + copy("copy_htaccess") { + sources = [ + "htaccess", + ] + outputs = [ + "$resources_out_dir/.htaccess", + ] + } + + copy("copy_inspector_images") { + sources = devtools_image_files + outputs = [ + "$resources_out_dir/Images/{{source_file_part}}", + ] + } + + copy("copy_emulated_devices_images") { + sources = devtools_emulated_devices_images + outputs = [ + "$resources_out_dir/emulated_devices/{{source_file_part}}", + ] + } + + copy("copy_lighthouse_locale_files") { + sources = lighthouse_locale_files + outputs = [ + "$resources_out_dir/audits_worker/lighthouse/locales/{{source_file_part}}", + ] + } + + action("generate_devtools_grd") { + script = "scripts/build/generate_devtools_grd.py" + + deps = [ + ":devtools_frontend_resources", + ] + + grd_files = + copied_devtools_modules + generated_applications + + generated_non_autostart_non_remote_modules + devtools_embedder_scripts + + [ + "$resources_out_dir/devtools_extension_api.js", + "$resources_out_dir/SupportedCSSProperties.js", + "$resources_out_dir/InspectorBackendCommands.js", + ] + + # Bundle remote modules in ChromeOS. + if (is_chromeos) { + grd_files += generated_remote_modules + devtools_emulated_devices_images + + lighthouse_locale_files + } + + inputs = grd_files + devtools_image_files + outfile = "$root_gen_dir/devtools/devtools_resources.grd" + outputs = [ + outfile, + ] + + relative_path_dirs = [ + resources_out_dir, + "front_end", + ] + + args = rebase_path(grd_files, root_build_dir) + [ "--relative_path_dirs" ] + + rebase_path(relative_path_dirs, root_build_dir) + + [ + "--images", + rebase_path("front_end/Images", root_build_dir), + "--output", + rebase_path(outfile, root_build_dir), + ] + } + + action("devtools_extension_api") { + script = "scripts/build/generate_devtools_extension_api.py" + + devtools_extension_api_files = [ "front_end/extensions/ExtensionAPI.js" ] + inputs = devtools_extension_api_files + outputs = [ + "$resources_out_dir/devtools_extension_api.js", + ] + + args = rebase_path(outputs, root_build_dir) + + rebase_path(devtools_extension_api_files, root_build_dir) + } + + action("supported_css_properties") { + script = "scripts/build/generate_supported_css.py" + + inputs = [ + "//third_party/blink/renderer/core/css/css_properties.json5", + ] + + outputs = [ + "$resources_out_dir/SupportedCSSProperties.js", + ] + + args = rebase_path(inputs, root_build_dir) + + rebase_path(outputs, root_build_dir) + } + + action("aria_properties") { + script = "scripts/build/generate_aria.py" + + inputs = [ + "//third_party/blink/renderer/core/html/aria_properties.json5", + ] + + outputs = [ + "$resources_out_dir/accessibility/ARIAProperties.js", + ] + + args = rebase_path(inputs, root_build_dir) + + rebase_path(outputs, root_build_dir) + } + + action("frontend_protocol_sources") { + script = "scripts/build/code_generator_frontend.py" + deps = [ + "//third_party/blink/renderer/core/inspector:protocol_version", + ] + inputs = [ + "$blink_core_output_dir/inspector/protocol.json", + ] + outputs = [ + "$resources_out_dir/InspectorBackendCommands.js", + ] + + args = rebase_path(inputs, root_build_dir) + [ + "--output_js_dir", + rebase_path(resources_out_dir, root_build_dir), + ] + } + + action("build_release_devtools") { + script = "scripts/build/build_release_applications.py" + + deps = [ + ":aria_properties", ":frontend_protocol_sources", ":supported_css_properties", ] - sources = generated_scripts - outputs = [ - "$resources_out_debug_dir/{{source_file_part}}", + + helper_scripts = [ + "scripts/build/modular_build.py", + "scripts/build/rjsmin.py", ] + + inputs = + helper_scripts + all_devtools_files + devtools_test_files + + generated_scripts + generated_aria_properties + application_templates + outputs = + generated_applications + generated_non_autostart_non_remote_modules + + generated_remote_modules + generated_test_modules + + args = devtools_applications + [ + "--input_path", + rebase_path("front_end", root_build_dir), + "--output_path", + rebase_path(resources_out_dir, root_build_dir), + ] } - copy("copy_aria_properties") { + action("copy_devtools_modules") { + script = "scripts/build/copy_devtools_modules.py" + deps = [ - ":aria_properties", - ":build_debug_devtools", + ":build_release_devtools", ] - sources = generated_aria_properties + inputs = all_devtools_modules + outputs = copied_devtools_modules - outputs = [ - "$resources_out_debug_dir/accessibility/{{source_file_part}}", - ] + args = all_devtools_modules + [ + "--input_path", + rebase_path(".", root_build_dir), + "--output_path", + rebase_path(resources_out_dir, root_build_dir), + ] } -} -group("devtools_closure_compile") { - data = [ - # Needed for isolate script to execute. - "front_end/", - "scripts/build/", - "scripts/closure/", - "scripts/compile_frontend.py", - "scripts/dependency_preprocessor.py", - "scripts/jsdoc_validator/", - "scripts/special_case_namespaces.json", - "scripts/utils.py", - "//testing/scripts/common.py", - "//testing/scripts/run_devtools_check.py", - "//testing/xvfb.py", - "//third_party/blink/renderer/core/inspector/browser_protocol.pdl", - "//third_party/inspector_protocol/pdl.py", - "//v8/include/js_protocol.pdl", - ] -} + if (debug_devtools) { + resources_out_debug_dir = "$root_out_dir/resources/inspector/debug" -if (is_linux && !is_chromeos) { - group("devtools_eslint") { + action("build_debug_devtools") { + script = "scripts/build/build_debug_applications.py" + + inputs = all_devtools_files + application_templates + outputs = [ + "$resources_out_debug_dir/devtools_app.html", + "$resources_out_debug_dir/inspector.html", + "$resources_out_debug_dir/integration_test_runner.html", + "$resources_out_debug_dir/js_app.html", + "$resources_out_debug_dir/ndb_app.html", + "$resources_out_debug_dir/node_app.html", + "$resources_out_debug_dir/toolbox.html", + "$resources_out_debug_dir/worker_app.html", + ] + + args = [ + "--input_path", + rebase_path("front_end", root_build_dir), + "--output_path", + rebase_path(resources_out_debug_dir, root_build_dir), + ] + } + + copy("copy_generated_scripts") { + deps = [ + ":build_debug_devtools", + ":frontend_protocol_sources", + ":supported_css_properties", + ] + sources = generated_scripts + outputs = [ + "$resources_out_debug_dir/{{source_file_part}}", + ] + } + + copy("copy_aria_properties") { + deps = [ + ":aria_properties", + ":build_debug_devtools", + ] + + sources = generated_aria_properties + + outputs = [ + "$resources_out_debug_dir/accessibility/{{source_file_part}}", + ] + } + } + + group("devtools_closure_compile") { data = [ # Needed for isolate script to execute. - ".eslintignore", - ".eslintrc.js", "front_end/", - "scripts/lint_javascript.py", - "scripts/devtools_paths.py", + "scripts/build/", + "scripts/closure/", + "scripts/compile_frontend.py", + "scripts/dependency_preprocessor.py", + "scripts/jsdoc_validator/", + "scripts/special_case_namespaces.json", + "scripts/utils.py", "//testing/scripts/common.py", "//testing/scripts/run_devtools_check.py", "//testing/xvfb.py", - "//third_party/devtools-node-modules/", - "//third_party/node/node.py", - "//third_party/node/linux/node-linux-x64/", + "//third_party/blink/renderer/core/inspector/browser_protocol.pdl", + "//third_party/inspector_protocol/pdl.py", + "//v8/include/js_protocol.pdl", ] } + + if (is_linux && !is_chromeos) { + group("devtools_eslint") { + data = [ + # Needed for isolate script to execute. + ".eslintignore", + ".eslintrc.js", + "front_end/", + "scripts/lint_javascript.py", + "scripts/devtools_paths.py", + "//testing/scripts/common.py", + "//testing/scripts/run_devtools_check.py", + "//testing/xvfb.py", + "//third_party/devtools-node-modules/", + "//third_party/node/node.py", + "//third_party/node/linux/node-linux-x64/", + ] + } + } }
diff --git a/third_party/blink/renderer/devtools/front_end/browser_sdk/LogManager.js b/third_party/blink/renderer/devtools/front_end/browser_sdk/LogManager.js index 592799f..4c99661 100644 --- a/third_party/blink/renderer/devtools/front_end/browser_sdk/LogManager.js +++ b/third_party/blink/renderer/devtools/front_end/browser_sdk/LogManager.js
@@ -5,7 +5,7 @@ /** * @implements {SDK.SDKModelObserver<!SDK.LogModel>} */ -BrowserSDK.LogManager = class { +export default class LogManager { constructor() { SDK.targetManager.observeModels(SDK.LogModel, this); } @@ -17,7 +17,7 @@ modelAdded(logModel) { const eventListeners = []; eventListeners.push(logModel.addEventListener(SDK.LogModel.Events.EntryAdded, this._logEntryAdded, this)); - logModel[BrowserSDK.LogManager._eventSymbol] = eventListeners; + logModel[_eventSymbol] = eventListeners; } /** @@ -25,7 +25,7 @@ * @param {!SDK.LogModel} logModel */ modelRemoved(logModel) { - Common.EventTarget.removeEventListeners(logModel[BrowserSDK.LogManager._eventSymbol]); + Common.EventTarget.removeEventListeners(logModel[_eventSymbol]); } /** @@ -62,8 +62,20 @@ SDK.consoleModel.addMessage(consoleMessage); } } -}; +} -BrowserSDK.LogManager._eventSymbol = Symbol('_events'); +export const _eventSymbol = Symbol('_events'); -new BrowserSDK.LogManager(); +/* Legacy exported object */ +self.BrowserSDK = self.BrowserSDK || {}; + +/* Legacy exported object */ +BrowserSDK = BrowserSDK || {}; + +/** @constructor */ +BrowserSDK.LogManager = LogManager; + +BrowserSDK.LogManager._eventSymbol = _eventSymbol; + +// TODO(crbug.com/1006759): Move out of this module +new LogManager(); \ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/browser_sdk/browser_sdk.js b/third_party/blink/renderer/devtools/front_end/browser_sdk/browser_sdk.js new file mode 100644 index 0000000..9d9f583 --- /dev/null +++ b/third_party/blink/renderer/devtools/front_end/browser_sdk/browser_sdk.js
@@ -0,0 +1,9 @@ +// 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 * as LogManager from './LogManager.js'; + +export { + LogManager, +};
diff --git a/third_party/blink/renderer/devtools/front_end/browser_sdk/module.json b/third_party/blink/renderer/devtools/front_end/browser_sdk/module.json index 7cca023c..6a4b3ab 100644 --- a/third_party/blink/renderer/devtools/front_end/browser_sdk/module.json +++ b/third_party/blink/renderer/devtools/front_end/browser_sdk/module.json
@@ -20,7 +20,9 @@ ] } ], - "scripts": [ + "scripts": [], + "modules": [ + "browser_sdk.js", "LogManager.js" ], "dependencies": [
diff --git a/third_party/blink/renderer/devtools/front_end/components/DockController.js b/third_party/blink/renderer/devtools/front_end/components/DockController.js index a87605e..fbf5412 100644 --- a/third_party/blink/renderer/devtools/front_end/components/DockController.js +++ b/third_party/blink/renderer/devtools/front_end/components/DockController.js
@@ -31,7 +31,7 @@ /** * @unrestricted */ -Components.DockController = class extends Common.Object { +export default class DockController extends Common.Object { /** * @param {boolean} canDock */ @@ -44,15 +44,12 @@ UI.ToolbarButton.Events.Click, Host.InspectorFrontendHost.closeWindow.bind(Host.InspectorFrontendHost)); if (!canDock) { - this._dockSide = Components.DockController.State.Undocked; + this._dockSide = State.Undocked; this._closeButton.setVisible(false); return; } - this._states = [ - Components.DockController.State.DockedToRight, Components.DockController.State.DockedToBottom, - Components.DockController.State.DockedToLeft, Components.DockController.State.Undocked - ]; + this._states = [State.DockedToRight, State.DockedToBottom, State.DockedToLeft, State.Undocked]; this._currentDockStateSetting = Common.settings.moduleSetting('currentDockState'); this._currentDockStateSetting.addChangeListener(this._dockSideChanged, this); this._lastDockStateSetting = Common.settings.createSetting('lastDockState', 'bottom'); @@ -98,8 +95,7 @@ * @return {boolean} */ isVertical() { - return this._dockSide === Components.DockController.State.DockedToRight || - this._dockSide === Components.DockController.State.DockedToLeft; + return this._dockSide === State.DockedToRight || this._dockSide === State.DockedToLeft; } /** @@ -121,21 +117,21 @@ this._savedFocus = document.deepActiveElement(); const eventData = {from: this._dockSide, to: dockSide}; - this.dispatchEventToListeners(Components.DockController.Events.BeforeDockSideChanged, eventData); + this.dispatchEventToListeners(Events.BeforeDockSideChanged, eventData); console.timeStamp('DockController.setIsDocked'); this._dockSide = dockSide; this._currentDockStateSetting.set(dockSide); Host.InspectorFrontendHost.setIsDocked( - dockSide !== Components.DockController.State.Undocked, this._setIsDockedResponse.bind(this, eventData)); - this._closeButton.setVisible(this._dockSide !== Components.DockController.State.Undocked); - this.dispatchEventToListeners(Components.DockController.Events.DockSideChanged, eventData); + dockSide !== State.Undocked, this._setIsDockedResponse.bind(this, eventData)); + this._closeButton.setVisible(this._dockSide !== State.Undocked); + this.dispatchEventToListeners(Events.DockSideChanged, eventData); } /** * @param {{from: string, to: string}} eventData */ _setIsDockedResponse(eventData) { - this.dispatchEventToListeners(Components.DockController.Events.AfterDockSideChanged, eventData); + this.dispatchEventToListeners(Events.AfterDockSideChanged, eventData); if (this._savedFocus) { this._savedFocus.focus(); this._savedFocus = null; @@ -149,9 +145,9 @@ } this.setDockSide(this._lastDockStateSetting.get()); } -}; +} -Components.DockController.State = { +export const State = { DockedToBottom: 'bottom', DockedToRight: 'right', DockedToLeft: 'left', @@ -163,7 +159,7 @@ // after frontend is docked/undocked in the browser. /** @enum {symbol} */ -Components.DockController.Events = { +export const Events = { BeforeDockSideChanged: Symbol('BeforeDockSideChanged'), DockSideChanged: Symbol('DockSideChanged'), AfterDockSideChanged: Symbol('AfterDockSideChanged') @@ -173,7 +169,7 @@ * @implements {UI.ActionDelegate} * @unrestricted */ -Components.DockController.ToggleDockActionDelegate = class { +export class ToggleDockActionDelegate { /** * @override * @param {!UI.Context} context @@ -184,13 +180,13 @@ Components.dockController._toggleDockSide(); return true; } -}; +} /** * @implements {UI.ToolbarItem.Provider} * @unrestricted */ -Components.DockController.CloseButtonProvider = class { +export class CloseButtonProvider { /** * @override * @return {?UI.ToolbarItem} @@ -198,9 +194,29 @@ item() { return Components.dockController._closeButton; } -}; +} + +/* Legacy exported object */ +self.Components = self.Components || {}; + +/* Legacy exported object */ +Components = Components || {}; + +/** @constructor */ +Components.DockController = DockController; + +Components.DockController.State = State; + +/** @enum {symbol} */ +Components.DockController.Events = Events; + +/** @constructor */ +Components.DockController.ToggleDockActionDelegate = ToggleDockActionDelegate; + +/** @constructor */ +Components.DockController.CloseButtonProvider = CloseButtonProvider; /** * @type {!Components.DockController} */ -Components.dockController; +Components.dockController; \ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/components/ImagePreview.js b/third_party/blink/renderer/devtools/front_end/components/ImagePreview.js index a388f49..4d4cb787 100644 --- a/third_party/blink/renderer/devtools/front_end/components/ImagePreview.js +++ b/third_party/blink/renderer/devtools/front_end/components/ImagePreview.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -Components.ImagePreview = class { +export default class ImagePreview { /** * @param {!SDK.Target} target * @param {string} originalImageURL @@ -113,4 +113,13 @@ const imageSourceText = parsedImageURL.isValid ? parsedImageURL.displayName : ls`unknown source`; return ls`Image from ${imageSourceText}`; } -}; +} + +/* Legacy exported object */ +self.Components = self.Components || {}; + +/* Legacy exported object */ +Components = Components || {}; + +/** @constructor */ +Components.ImagePreview = ImagePreview;
diff --git a/third_party/blink/renderer/devtools/front_end/components/JSPresentationUtils.js b/third_party/blink/renderer/devtools/front_end/components/JSPresentationUtils.js index b07d478..4a147ae5a 100644 --- a/third_party/blink/renderer/devtools/front_end/components/JSPresentationUtils.js +++ b/third_party/blink/renderer/devtools/front_end/components/JSPresentationUtils.js
@@ -28,7 +28,6 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -Components.JSPresentationUtils = {}; /** * @param {?SDK.Target} target @@ -37,8 +36,7 @@ * @param {function()=} contentUpdated * @return {{element: !Element, links: !Array<!Element>}} */ -Components.JSPresentationUtils.buildStackTracePreviewContents = function( - target, linkifier, stackTrace, contentUpdated) { +export function buildStackTracePreviewContents(target, linkifier, stackTrace, contentUpdated) { const element = createElementWithClass('span', 'monospace'); element.style.display = 'inline-block'; const shadowRoot = UI.createShadowRootWithCoreStyles(element, 'components/jsUtils.css'); @@ -146,4 +144,14 @@ } return {element, links}; -}; +} + +/* Legacy exported object */ +self.Components = self.Components || {}; + +/* Legacy exported object */ +Components = Components || {}; + +Components.JSPresentationUtils = {}; + +Components.JSPresentationUtils.buildStackTracePreviewContents = buildStackTracePreviewContents;
diff --git a/third_party/blink/renderer/devtools/front_end/components/Linkifier.js b/third_party/blink/renderer/devtools/front_end/components/Linkifier.js index 55b79ce..2c46bbc 100644 --- a/third_party/blink/renderer/devtools/front_end/components/Linkifier.js +++ b/third_party/blink/renderer/devtools/front_end/components/Linkifier.js
@@ -32,7 +32,7 @@ * @implements {SDK.TargetManager.Observer} * @unrestricted */ -Components.Linkifier = class { +export default class Linkifier { /** * @param {number=} maxLengthForDisplayedURLs * @param {boolean=} useLinkDecorator @@ -44,18 +44,18 @@ /** @type {!Map<!SDK.Target, !Bindings.LiveLocationPool>} */ this._locationPoolByTarget = new Map(); this._useLinkDecorator = !!useLinkDecorator; - Components.Linkifier._instances.add(this); + _instances.add(this); SDK.targetManager.observeTargets(this); } /** - * @param {!Components.LinkDecorator} decorator + * @param {!LinkDecorator} decorator */ static setLinkDecorator(decorator) { - console.assert(!Components.Linkifier._decorator, 'Cannot re-register link decorator.'); - Components.Linkifier._decorator = decorator; - decorator.addEventListener(Components.LinkDecorator.Events.LinkIconChanged, onLinkIconChanged); - for (const linkifier of Components.Linkifier._instances) { + console.assert(!_decorator, 'Cannot re-register link decorator.'); + _decorator = decorator; + decorator.addEventListener(LinkDecorator.Events.LinkIconChanged, onLinkIconChanged); + for (const linkifier of _instances) { linkifier._updateAllAnchorDecorations(); } @@ -64,9 +64,9 @@ */ function onLinkIconChanged(event) { const uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data); - const links = uiSourceCode[Components.Linkifier._sourceCodeAnchors] || []; + const links = uiSourceCode[_sourceCodeAnchors] || []; for (const link of links) { - Components.Linkifier._updateLinkDecorations(link); + Linkifier._updateLinkDecorations(link); } } } @@ -74,7 +74,7 @@ _updateAllAnchorDecorations() { for (const anchors of this._anchorsByTarget.values()) { for (const anchor of anchors) { - Components.Linkifier._updateLinkDecorations(anchor); + Linkifier._updateLinkDecorations(anchor); } } } @@ -84,15 +84,15 @@ * @param {!Workspace.UILocation} uiLocation */ static _bindUILocation(anchor, uiLocation) { - Components.Linkifier._linkInfo(anchor).uiLocation = uiLocation; + Linkifier._linkInfo(anchor).uiLocation = uiLocation; if (!uiLocation) { return; } const uiSourceCode = uiLocation.uiSourceCode; - let sourceCodeAnchors = uiSourceCode[Components.Linkifier._sourceCodeAnchors]; + let sourceCodeAnchors = uiSourceCode[_sourceCodeAnchors]; if (!sourceCodeAnchors) { sourceCodeAnchors = new Set(); - uiSourceCode[Components.Linkifier._sourceCodeAnchors] = sourceCodeAnchors; + uiSourceCode[_sourceCodeAnchors] = sourceCodeAnchors; } sourceCodeAnchors.add(anchor); } @@ -101,14 +101,14 @@ * @param {!Element} anchor */ static _unbindUILocation(anchor) { - const info = Components.Linkifier._linkInfo(anchor); + const info = Linkifier._linkInfo(anchor); if (!info.uiLocation) { return; } const uiSourceCode = info.uiLocation.uiSourceCode; info.uiLocation = null; - const sourceCodeAnchors = uiSourceCode[Components.Linkifier._sourceCodeAnchors]; + const sourceCodeAnchors = uiSourceCode[_sourceCodeAnchors]; if (sourceCodeAnchors) { sourceCodeAnchors.delete(anchor); } @@ -132,15 +132,15 @@ locationPool.disposeAll(); const anchors = this._anchorsByTarget.remove(target); for (const anchor of anchors) { - const info = Components.Linkifier._linkInfo(anchor); + const info = Linkifier._linkInfo(anchor); info.liveLocation = null; - Components.Linkifier._unbindUILocation(anchor); + Linkifier._unbindUILocation(anchor); if (info.fallback) { anchor.href = info.fallback.href; anchor.title = info.fallback.title; anchor.className = info.fallback.className; anchor.textContent = info.fallback.textContent; - anchor[Components.Linkifier._infoSymbol] = info.fallback[Components.Linkifier._infoSymbol]; + anchor[_infoSymbol] = info.fallback[_infoSymbol]; } } } @@ -157,7 +157,7 @@ maybeLinkifyScriptLocation(target, scriptId, sourceURL, lineNumber, columnNumber, classes) { let fallbackAnchor = null; if (sourceURL) { - fallbackAnchor = Components.Linkifier.linkifyURL( + fallbackAnchor = Linkifier.linkifyURL( sourceURL, {className: classes, lineNumber: lineNumber, columnNumber: columnNumber, maxLength: this._maxLength}); } @@ -176,8 +176,8 @@ return fallbackAnchor; } - const anchor = Components.Linkifier._createLink('', classes || ''); - const info = Components.Linkifier._linkInfo(anchor); + const anchor = Linkifier._createLink('', classes || ''); + const info = Linkifier._linkInfo(anchor); info.enableDecorator = this._useLinkDecorator; info.fallback = fallbackAnchor; info.liveLocation = Bindings.debuggerWorkspaceBinding.createLiveLocation( @@ -201,7 +201,7 @@ linkifyScriptLocation(target, scriptId, sourceURL, lineNumber, columnNumber, classes) { const scriptLink = this.maybeLinkifyScriptLocation(target, scriptId, sourceURL, lineNumber, columnNumber, classes); return scriptLink || - Components.Linkifier.linkifyURL( + Linkifier.linkifyURL( sourceURL, {className: classes, lineNumber: lineNumber, columnNumber: columnNumber, maxLength: this._maxLength}); } @@ -239,7 +239,7 @@ console.assert(stackTrace.callFrames && stackTrace.callFrames.length); const topFrame = stackTrace.callFrames[0]; - const fallbackAnchor = Components.Linkifier.linkifyURL(topFrame.url, { + const fallbackAnchor = Linkifier.linkifyURL(topFrame.url, { className: classes, lineNumber: topFrame.lineNumber, columnNumber: topFrame.columnNumber, @@ -255,8 +255,8 @@ return fallbackAnchor; } - const anchor = Components.Linkifier._createLink('', classes || ''); - const info = Components.Linkifier._linkInfo(anchor); + const anchor = Linkifier._createLink('', classes || ''); + const info = Linkifier._linkInfo(anchor); info.enableDecorator = this._useLinkDecorator; info.fallback = fallbackAnchor; info.liveLocation = Bindings.debuggerWorkspaceBinding.createStackTraceTopFrameLiveLocation( @@ -274,8 +274,8 @@ * @return {!Element} */ linkifyCSSLocation(rawLocation, classes) { - const anchor = Components.Linkifier._createLink('', classes || ''); - const info = Components.Linkifier._linkInfo(anchor); + const anchor = Linkifier._createLink('', classes || ''); + const info = Linkifier._linkInfo(anchor); info.enableDecorator = this._useLinkDecorator; info.liveLocation = Bindings.cssWorkspaceBinding.createLiveLocation( rawLocation, this._updateAnchor.bind(this, anchor), @@ -298,7 +298,7 @@ this.targetRemoved(target); } SDK.targetManager.unobserveTargets(this); - Components.Linkifier._instances.delete(this); + _instances.delete(this); } /** @@ -306,15 +306,15 @@ * @param {!Bindings.LiveLocation} liveLocation */ _updateAnchor(anchor, liveLocation) { - Components.Linkifier._unbindUILocation(anchor); + Linkifier._unbindUILocation(anchor); const uiLocation = liveLocation.uiLocation(); if (!uiLocation) { return; } - Components.Linkifier._bindUILocation(anchor, uiLocation); + Linkifier._bindUILocation(anchor, uiLocation); const text = uiLocation.linkText(true /* skipTrim */); - Components.Linkifier._setTrimmedText(anchor, text, this._maxLength); + Linkifier._setTrimmedText(anchor, text, this._maxLength); let titleText = uiLocation.uiSourceCode.url(); if (typeof uiLocation.lineNumber === 'number') { @@ -322,24 +322,24 @@ } anchor.title = titleText; anchor.classList.toggle('webkit-html-blackbox-link', liveLocation.isBlackboxed()); - Components.Linkifier._updateLinkDecorations(anchor); + Linkifier._updateLinkDecorations(anchor); } /** * @param {!Element} anchor */ static _updateLinkDecorations(anchor) { - const info = Components.Linkifier._linkInfo(anchor); + const info = Linkifier._linkInfo(anchor); if (!info || !info.enableDecorator) { return; } - if (!Components.Linkifier._decorator || !info.uiLocation) { + if (!_decorator || !info.uiLocation) { return; } if (info.icon && info.icon.parentElement) { anchor.removeChild(info.icon); } - const icon = Components.Linkifier._decorator.linkIcon(info.uiLocation.uiSourceCode); + const icon = _decorator.linkIcon(info.uiLocation.uiSourceCode); if (icon) { icon.style.setProperty('margin-right', '2px'); anchor.insertBefore(icon, anchor.firstChild); @@ -371,8 +371,8 @@ linkText += ':' + (lineNumber + 1); } const title = linkText !== url ? url : ''; - const link = Components.Linkifier._createLink(linkText, className, maxLength, title, url, preventClick); - const info = Components.Linkifier._linkInfo(link); + const link = Linkifier._createLink(linkText, className, maxLength, title, url, preventClick); + const info = Linkifier._linkInfo(link); if (typeof lineNumber === 'number') { info.lineNumber = lineNumber; } @@ -389,8 +389,8 @@ * @return {!Element} */ static linkifyRevealable(revealable, text, fallbackHref) { - const link = Components.Linkifier._createLink(text, '', UI.MaxLengthForDisplayedURLs, undefined, fallbackHref); - Components.Linkifier._linkInfo(link).revealable = revealable; + const link = Linkifier._createLink(text, '', UI.MaxLengthForDisplayedURLs, undefined, fallbackHref); + Linkifier._linkInfo(link).revealable = revealable; return link; } @@ -412,8 +412,8 @@ if (href) { link.href = href; } - Components.Linkifier._setTrimmedText(link, text, maxLength); - link[Components.Linkifier._infoSymbol] = { + Linkifier._setTrimmedText(link, text, maxLength); + link[_infoSymbol] = { icon: null, enableDecorator: false, uiLocation: null, @@ -426,12 +426,12 @@ }; if (!preventClick) { link.addEventListener('click', event => { - if (Components.Linkifier._handleClick(event)) { + if (Linkifier._handleClick(event)) { event.consume(true); } }, false); link.addEventListener('keydown', event => { - if (isEnterKey(event) && Components.Linkifier._handleClick(event)) { + if (isEnterKey(event) && Linkifier._handleClick(event)) { event.consume(true); } }, false); @@ -463,7 +463,7 @@ */ function appendHiddenText(string) { const ellipsisNode = link.createChild('span', 'devtools-link-ellipsis').createTextChild('\u2026'); - ellipsisNode[Components.Linkifier._untruncatedNodeTextSymbol] = string; + ellipsisNode[_untruncatedNodeTextSymbol] = string; } /** @@ -507,7 +507,7 @@ * @return {string} */ static untruncatedNodeText(node) { - return node[Components.Linkifier._untruncatedNodeTextSymbol] || node.textContent; + return node[_untruncatedNodeTextSymbol] || node.textContent; } /** @@ -515,7 +515,7 @@ * @return {?Components._LinkInfo} */ static _linkInfo(link) { - return /** @type {?Components._LinkInfo} */ (link ? link[Components.Linkifier._infoSymbol] || null : null); + return /** @type {?Components._LinkInfo} */ (link ? link[_infoSymbol] || null : null); } /** @@ -527,7 +527,7 @@ if (UI.isBeingEdited(/** @type {!Node} */ (event.target)) || link.hasSelection()) { return false; } - const actions = Components.Linkifier._linkActions(link); + const actions = Linkifier._linkActions(link); if (actions.length) { actions[0].handler.call(null); return true; @@ -539,28 +539,27 @@ * @return {!Common.Setting} */ static _linkHandlerSetting() { - if (!Components.Linkifier._linkHandlerSettingInstance) { - Components.Linkifier._linkHandlerSettingInstance = - Common.settings.createSetting('openLinkHandler', Common.UIString('auto')); + if (!Linkifier._linkHandlerSettingInstance) { + Linkifier._linkHandlerSettingInstance = Common.settings.createSetting('openLinkHandler', ls`auto`); } - return Components.Linkifier._linkHandlerSettingInstance; + return Linkifier._linkHandlerSettingInstance; } /** * @param {string} title - * @param {!Components.Linkifier.LinkHandler} handler + * @param {!Linkifier.LinkHandler} handler */ static registerLinkHandler(title, handler) { - Components.Linkifier._linkHandlers.set(title, handler); - self.runtime.sharedInstance(Components.Linkifier.LinkHandlerSettingUI)._update(); + _linkHandlers.set(title, handler); + self.runtime.sharedInstance(LinkHandlerSettingUI)._update(); } /** * @param {string} title */ static unregisterLinkHandler(title) { - Components.Linkifier._linkHandlers.delete(title); - self.runtime.sharedInstance(Components.Linkifier.LinkHandlerSettingUI)._update(); + _linkHandlers.delete(title); + self.runtime.sharedInstance(LinkHandlerSettingUI)._update(); } /** @@ -568,7 +567,7 @@ * @return {?Workspace.UILocation} */ static uiLocation(link) { - const info = Components.Linkifier._linkInfo(link); + const info = Linkifier._linkInfo(link); return info ? info.uiLocation : null; } @@ -577,7 +576,7 @@ * @return {!Array<{title: string, handler: function()}>} */ static _linkActions(link) { - const info = Components.Linkifier._linkInfo(link); + const info = Linkifier._linkInfo(link); const result = []; if (!info) { return result; @@ -608,14 +607,14 @@ } if (contentProvider) { const lineNumber = uiLocation ? uiLocation.lineNumber : info.lineNumber || 0; - for (const title of Components.Linkifier._linkHandlers.keys()) { - const handler = Components.Linkifier._linkHandlers.get(title); + for (const title of _linkHandlers.keys()) { + const handler = _linkHandlers.get(title); const action = { section: 'reveal', title: Common.UIString('Open using %s', title), handler: handler.bind(null, contentProvider, lineNumber) }; - if (title === Components.Linkifier._linkHandlerSetting().get()) { + if (title === Linkifier._linkHandlerSetting().get()) { result.unshift(action); } else { result.push(action); @@ -636,74 +635,41 @@ } return result; } -}; +} /** @type {!Set<!Components.Linkifier>} */ -Components.Linkifier._instances = new Set(); -/** @type {?Components.LinkDecorator} */ -Components.Linkifier._decorator = null; +export const _instances = new Set(); -Components.Linkifier._sourceCodeAnchors = Symbol('Linkifier.anchors'); -Components.Linkifier._infoSymbol = Symbol('Linkifier.info'); -Components.Linkifier._untruncatedNodeTextSymbol = Symbol('Linkifier.untruncatedNodeText'); +/** @type {?LinkDecorator} */ +export let _decorator = null; -/** - * @typedef {{ - * icon: ?UI.Icon, - * enableDecorator: boolean, - * uiLocation: ?Workspace.UILocation, - * liveLocation: ?Bindings.LiveLocation, - * url: ?string, - * lineNumber: ?number, - * columnNumber: ?number, - * revealable: ?Object, - * fallback: ?Element - * }} - */ -Components._LinkInfo; - -/** - * @typedef {{ - * text: (string|undefined), - * className: (string|undefined), - * lineNumber: (number|undefined), - * columnNumber: (number|undefined), - * preventClick: (boolean|undefined), - * maxLength: (number|undefined) - * }} - */ -Components.LinkifyURLOptions; +export const _sourceCodeAnchors = Symbol('Linkifier.anchors'); +export const _infoSymbol = Symbol('Linkifier.info'); +export const _untruncatedNodeTextSymbol = Symbol('Linkifier.untruncatedNodeText'); /** * The maximum length before strings are considered too long for finding URLs. * @const * @type {number} */ -Components.Linkifier.MaxLengthToIgnoreLinkifier = 10000; +export const MaxLengthToIgnoreLinkifier = 10000; -/** - * @typedef {function(!Common.ContentProvider, number)} - */ -Components.Linkifier.LinkHandler; - -/** @type {!Map<string, !Components.Linkifier.LinkHandler>} */ -Components.Linkifier._linkHandlers = new Map(); +/** @type {!Map<string, !Linkifier.LinkHandler>} */ +export const _linkHandlers = new Map(); /** * @extends {Common.EventTarget} * @interface */ -Components.LinkDecorator = function() {}; - -Components.LinkDecorator.prototype = { +export class LinkDecorator { /** * @param {!Workspace.UISourceCode} uiSourceCode * @return {?UI.Icon} */ linkIcon(uiSourceCode) {} -}; +} -Components.LinkDecorator.Events = { +LinkDecorator.Events = { LinkIconChanged: Symbol('LinkIconChanged') }; @@ -711,7 +677,7 @@ * @implements {UI.ContextMenu.Provider} * @unrestricted */ -Components.Linkifier.LinkContextMenuProvider = class { +export class LinkContextMenuProvider { /** * @override * @param {!Event} event @@ -720,22 +686,22 @@ */ appendApplicableItems(event, contextMenu, target) { let targetNode = /** @type {!Node} */ (target); - while (targetNode && !targetNode[Components.Linkifier._infoSymbol]) { + while (targetNode && !targetNode[_infoSymbol]) { targetNode = targetNode.parentNodeOrShadowHost(); } const link = /** @type {?Element} */ (targetNode); - const actions = Components.Linkifier._linkActions(link); + const actions = Linkifier._linkActions(link); for (const action of actions) { contextMenu.section(action.section).appendItem(action.title, action.handler); } } -}; +} /** * @implements {UI.SettingUI} * @unrestricted */ -Components.Linkifier.LinkHandlerSettingUI = class { +export class LinkHandlerSettingUI { constructor() { this._element = createElementWithClass('select', 'chrome-select'); this._element.addEventListener('change', this._onChange.bind(this), false); @@ -744,12 +710,12 @@ _update() { this._element.removeChildren(); - const names = Components.Linkifier._linkHandlers.keysArray(); + const names = _linkHandlers.keysArray(); names.unshift(Common.UIString('auto')); for (const name of names) { const option = createElement('option'); option.textContent = name; - option.selected = name === Components.Linkifier._linkHandlerSetting().get(); + option.selected = name === Linkifier._linkHandlerSetting().get(); this._element.appendChild(option); } this._element.disabled = names.length <= 1; @@ -760,7 +726,7 @@ */ _onChange(event) { const value = event.target.value; - Components.Linkifier._linkHandlerSetting().set(value); + Linkifier._linkHandlerSetting().set(value); } /** @@ -770,13 +736,13 @@ settingElement() { return UI.SettingsUI.createCustomSetting(Common.UIString('Link handling:'), this._element); } -}; +} /** * @implements {UI.ContextMenu.Provider} * @unrestricted */ -Components.Linkifier.ContentProviderContextMenuProvider = class { +export class ContentProviderContextMenuProvider { /** * @override * @param {!Event} event @@ -791,8 +757,8 @@ contextMenu.revealSection().appendItem( UI.openLinkExternallyLabel(), () => Host.InspectorFrontendHost.openInNewTab(contentProvider.contentURL())); - for (const title of Components.Linkifier._linkHandlers.keys()) { - const handler = Components.Linkifier._linkHandlers.get(title); + for (const title of _linkHandlers.keys()) { + const handler = _linkHandlers.get(title); contextMenu.revealSection().appendItem( Common.UIString('Open using %s', title), handler.bind(null, contentProvider, 0)); } @@ -803,4 +769,65 @@ contextMenu.clipboardSection().appendItem( UI.copyLinkAddressLabel(), () => Host.InspectorFrontendHost.copyText(contentProvider.contentURL())); } -}; +} + +/* Legacy exported object */ +self.Components = self.Components || {}; + +/* Legacy exported object */ +Components = Components || {}; + +/** @constructor */ +Components.Linkifier = Linkifier; + +Components.Linkifier._instances = _instances; +Components.Linkifier._decorator = _decorator; +Components.Linkifier._sourceCodeAnchors = _sourceCodeAnchors; +Components.Linkifier._infoSymbol = _infoSymbol; +Components.Linkifier._untruncatedNodeTextSymbol = _untruncatedNodeTextSymbol; +Components.Linkifier.MaxLengthToIgnoreLinkifier = MaxLengthToIgnoreLinkifier; +Components.Linkifier._linkHandlers = _linkHandlers; + +/** @constructor */ +Components.Linkifier.LinkContextMenuProvider = LinkContextMenuProvider; + +/** @constructor */ +Components.Linkifier.LinkHandlerSettingUI = LinkHandlerSettingUI; + +/** @constructor */ +Components.Linkifier.ContentProviderContextMenuProvider = ContentProviderContextMenuProvider; + +/** @interface */ +Components.LinkDecorator = LinkDecorator; + +/** + * @typedef {{ + * icon: ?UI.Icon, + * enableDecorator: boolean, + * uiLocation: ?Workspace.UILocation, + * liveLocation: ?Bindings.LiveLocation, + * url: ?string, + * lineNumber: ?number, + * columnNumber: ?number, + * revealable: ?Object, + * fallback: ?Element + * }} + */ +Components._LinkInfo; + +/** + * @typedef {{ + * text: (string|undefined), + * className: (string|undefined), + * lineNumber: (number|undefined), + * columnNumber: (number|undefined), + * preventClick: (boolean|undefined), + * maxLength: (number|undefined) + * }} + */ +Components.LinkifyURLOptions; + +/** + * @typedef {function(!Common.ContentProvider, number)} + */ +Components.Linkifier.LinkHandler; \ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/components/Reload.js b/third_party/blink/renderer/devtools/front_end/components/Reload.js index 2fb94e06e..e3e1f84 100644 --- a/third_party/blink/renderer/devtools/front_end/components/Reload.js +++ b/third_party/blink/renderer/devtools/front_end/components/Reload.js
@@ -1,10 +1,19 @@ // 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. -Components.reload = function() { + +export function reload() { if (Components.dockController.canDock() && Components.dockController.dockSide() === Components.DockController.State.Undocked) { Host.InspectorFrontendHost.setIsDocked(true, function() {}); } window.location.reload(); -}; +} + +/* Legacy exported object */ +self.Components = self.Components || {}; + +/* Legacy exported object */ +Components = Components || {}; + +Components.reload = reload;
diff --git a/third_party/blink/renderer/devtools/front_end/components/TargetDetachedDialog.js b/third_party/blink/renderer/devtools/front_end/components/TargetDetachedDialog.js index 5a7f851..cca1fcaf 100644 --- a/third_party/blink/renderer/devtools/front_end/components/TargetDetachedDialog.js +++ b/third_party/blink/renderer/devtools/front_end/components/TargetDetachedDialog.js
@@ -5,7 +5,7 @@ /** * @implements {Protocol.InspectorDispatcher} */ -Components.TargetDetachedDialog = class extends SDK.SDKModel { +export default class TargetDetachedDialog extends SDK.SDKModel { /** * @param {!SDK.Target} target */ @@ -17,7 +17,7 @@ target.registerInspectorDispatcher(this); target.inspectorAgent().enable(); this._hideCrashedDialog = null; - Components.TargetDetachedDialog._disconnectedScreenWithReasonWasShown = false; + TargetDetachedDialog._disconnectedScreenWithReasonWasShown = false; } /** @@ -25,7 +25,7 @@ * @param {string} reason */ detached(reason) { - Components.TargetDetachedDialog._disconnectedScreenWithReasonWasShown = true; + TargetDetachedDialog._disconnectedScreenWithReasonWasShown = true; UI.RemoteDebuggingTerminatedScreen.show(reason); } @@ -56,6 +56,15 @@ this._hideCrashedDialog = null; } } -}; +} -SDK.SDKModel.register(Components.TargetDetachedDialog, SDK.Target.Capability.Inspector, true); +/* Legacy exported object */ +self.Components = self.Components || {}; + +/* Legacy exported object */ +Components = Components || {}; + +/** @constructor */ +Components.TargetDetachedDialog = TargetDetachedDialog; + +SDK.SDKModel.register(TargetDetachedDialog, SDK.Target.Capability.Inspector, true); \ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/components/components.js b/third_party/blink/renderer/devtools/front_end/components/components.js new file mode 100644 index 0000000..1519804 --- /dev/null +++ b/third_party/blink/renderer/devtools/front_end/components/components.js
@@ -0,0 +1,19 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import * as DockController from './DockController.js'; +import * as ImagePreview from './ImagePreview.js'; +import * as JSPresentationUtils from './JSPresentationUtils.js'; +import * as Linkifier from './Linkifier.js'; +import * as Reload from './Reload.js'; +import * as TargetDetachedDialog from './TargetDetachedDialog.js'; + +export { + DockController, + ImagePreview, + JSPresentationUtils, + Linkifier, + Reload, + TargetDetachedDialog, +};
diff --git a/third_party/blink/renderer/devtools/front_end/components/module.json b/third_party/blink/renderer/devtools/front_end/components/module.json index b7b5ca92..77489e0 100644 --- a/third_party/blink/renderer/devtools/front_end/components/module.json +++ b/third_party/blink/renderer/devtools/front_end/components/module.json
@@ -4,7 +4,9 @@ "platform", "ui" ], - "scripts": [ + "scripts": [], + "modules": [ + "components.js", "JSPresentationUtils.js", "DockController.js", "ImagePreview.js",
diff --git a/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewCompletedView.js b/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewCompletedView.js index d568ff5e..3053364 100644 --- a/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewCompletedView.js +++ b/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewCompletedView.js
@@ -6,7 +6,7 @@ * @unrestricted */ CssOverview.CSSOverviewCompletedView = class extends UI.PanelWithSidebar { - constructor(controller) { + constructor(controller, target) { super('css_overview_completed_view'); this.registerRequiredCSS('css_overview/cssOverviewCompletedView.css'); @@ -18,8 +18,23 @@ this.splitWidget().setSidebarWidget(this._sideBar); this.splitWidget().setMainWidget(this._mainContainer); + this._cssModel = target.model(SDK.CSSModel); + this._linkifier = new Components.Linkifier(/* maxLinkLength */ 20, /* useLinkDecorator */ true); + + this._columns = [ + {id: 'text', title: ls`Text`, visible: true, sortable: true, weight: 60}, + {id: 'sourceURL', title: ls`Source`, visible: true, sortable: true, weight: 40} + ]; + + this._mediaQueryGrid = new DataGrid.SortableDataGrid(this._columns); + this._mediaQueryGrid.element.classList.add('media-query-grid'); + this._mediaQueryGrid.setStriped(true); + this._mediaQueryGrid.addEventListener( + DataGrid.DataGrid.Events.SortingChanged, this._sortMediaQueryDataGrid.bind(this)); + this._sideBar.addItem(ls`Overview summary`, 'summary'); this._sideBar.addItem(ls`Colors`, 'colors'); + this._sideBar.addItem(ls`Media queries`, 'media-queries'); this._sideBar.select('summary'); this._sideBar.addEventListener(CssOverview.SidebarEvents.ItemSelected, this._sideBarItemSelected, this); @@ -28,6 +43,16 @@ this._render({}); } + _sortMediaQueryDataGrid() { + const sortColumnId = this._mediaQueryGrid.sortColumnId(); + if (!sortColumnId) { + return; + } + + const comparator = DataGrid.SortableDataGrid.StringComparator.bind(null, sortColumnId); + this._mediaQueryGrid.sortNodes(comparator, !this._mediaQueryGrid.isSortOrderAscending()); + } + _sideBarItemSelected(event) { const section = this._fragment.$(event.data); if (!section) { @@ -43,6 +68,7 @@ _reset() { this._mainContainer.element.removeChildren(); + this._mediaQueryGrid.rootNode().removeChildren(); } _render(data) { @@ -50,7 +76,7 @@ return; } - const {elementStyleStats, elementCount, backgroundColors, textColors, globalStyleStats} = data; + const {elementStyleStats, elementCount, backgroundColors, textColors, globalStyleStats, mediaQueries} = data; // Convert rgb values from the computed styles to either undefined or HEX(A) strings. const nonTransparentBackgroundColors = this._getNonTransparentColorStrings(backgroundColors); @@ -79,8 +105,8 @@ <div class="value">${this._formatter.format(globalStyleStats.styleRules)}</div> </li> <li> - <div class="label">${ls`Media rules`}</div> - <div class="value">${this._formatter.format(globalStyleStats.mediaRules)}</div> + <div class="label">${ls`Media queries`}</div> + <div class="value">${this._formatter.format(mediaQueries.length)}</div> </li> <li> <div class="label">${ls`Type selectors`}</div> @@ -121,9 +147,24 @@ ${nonTransparentTextColors.map(this._colorsToFragment)} </ul> </div> + + <div $="media-queries" class="results-section media-queries"> + <h1>${ls`Media queries`}</h1> + ${this._mediaQueryGrid.element} + </div> </div>`; + // Media Queries. + for (const mediaQuery of mediaQueries) { + const mediaQueryNode = new CssOverview.CSSOverviewCompletedView.MediaQueryNode( + this._mediaQueryGrid, mediaQuery, this._cssModel, this._linkifier); + mediaQueryNode.selectable = false; + this._mediaQueryGrid.insertChild(mediaQueryNode); + } + this._mainContainer.element.appendChild(this._fragment.element()); + this._mediaQueryGrid.renderInline(); + this._mediaQueryGrid.wasShown(); } _colorsToFragment(color) { @@ -168,3 +209,49 @@ this._render(data); } }; + +CssOverview.CSSOverviewCompletedView.MediaQueryNode = class extends DataGrid.SortableDataGridNode { + /** + * @param {!DataGrid.SortableDataGrid} dataGrid + * @param {!Object<string,*>} mediaQueryData + * @param {!SDK.CSSModel} cssModel + * @param {!Components.Linkifier} linkifier + */ + constructor(dataGrid, mediaQueryData, cssModel, linkifier) { + super(dataGrid, mediaQueryData.hasChildren); + + this.data = mediaQueryData; + this._cssModel = cssModel; + this._linkifier = linkifier; + } + + /** + * @override + * @param {string} columnId + * @return {!Element} + */ + createCell(columnId) { + if (this.data.range && columnId === 'sourceURL') { + const cell = this.createTD(columnId); + const link = this._linkifyRuleLocation( + this._cssModel, this._linkifier, this.data.styleSheetId, TextUtils.TextRange.fromObject(this.data.range)); + + if (link.textContent !== '') { + cell.appendChild(link); + } else { + cell.textContent = `${this.data.sourceURL} (not available)`; + } + return cell; + } + + return super.createCell(columnId); + } + + _linkifyRuleLocation(cssModel, linkifier, styleSheetId, ruleLocation) { + const styleSheetHeader = cssModel.styleSheetHeaderForId(styleSheetId); + const lineNumber = styleSheetHeader.lineNumberInSource(ruleLocation.startLine); + const columnNumber = styleSheetHeader.columnNumberInSource(ruleLocation.startLine, ruleLocation.startColumn); + const matchingSelectorLocation = new SDK.CSSLocation(styleSheetHeader, lineNumber, columnNumber); + return linkifier.linkifyCSSLocation(matchingSelectorLocation); + } +};
diff --git a/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewModel.js b/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewModel.js index 484f56db..7881c0b 100644 --- a/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewModel.js +++ b/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewModel.js
@@ -25,12 +25,17 @@ return this._cssAgent.getComputedStyleForNode(nodeId); } + async getMediaQueries() { + // Ignore media queries applied to stylesheets; instead only use declared media rules. + const queries = await this._cssAgent.getMediaQueries(); + return queries.filter(query => query.source !== 'linkedSheet'); + } + async getGlobalStylesheetStats() { // There are no ways to pull CSSOM values directly today, due to its unserializable format, // so instead we execute some JS within the page that extracts the relevant data and send that instead. const expression = `(function() { let styleRules = 0; - let mediaRules = 0; let inlineStyles = 0; let externalSheets = 0; for (const { rules, href } of document.styleSheets) { @@ -43,15 +48,12 @@ for (const rule of rules) { if ('selectorText' in rule) { styleRules++; - } else if ('conditionText' in rule) { - mediaRules++; } } } return { styleRules, - mediaRules, inlineStyles, externalSheets }
diff --git a/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewPanel.js b/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewPanel.js index d163d05a..e69d43b 100644 --- a/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewPanel.js +++ b/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewPanel.js
@@ -11,13 +11,14 @@ this.registerRequiredCSS('css_overview/cssOverview.css'); this.element.classList.add('css-overview-panel'); + const [model] = SDK.targetManager.models(CssOverview.CSSOverviewModel); + this._model = model; + this._controller = new CssOverview.OverviewController(); this._startView = new CssOverview.CSSOverviewStartView(this._controller); this._processingView = new CssOverview.CSSOverviewProcessingView(this._controller); - this._completedView = new CssOverview.CSSOverviewCompletedView(this._controller); + this._completedView = new CssOverview.CSSOverviewCompletedView(this._controller, model.target()); - const [model] = SDK.targetManager.models(CssOverview.CSSOverviewModel); - this._model = model; this._controller.addEventListener(CssOverview.Events.RequestOverviewStart, this._startOverview, this); this._controller.addEventListener(CssOverview.Events.RequestOverviewCancel, this._cancelOverview, this); this._controller.addEventListener(CssOverview.Events.OverviewCompleted, this._overviewCompleted, this); @@ -30,6 +31,7 @@ this._backgroundColors = new Set(); this._textColors = new Set(); this._fontSizes = new Map(); + this._mediaQueries = []; this._elementCount = 0; this._elementStyleStats = { // Simple. @@ -43,7 +45,7 @@ nonSimple: new Set() }; this._cancelled = false; - this._globalStyleStats = {styleRules: 0, mediaRules: 0, inlineStyles: 0, externalSheets: 0}; + this._globalStyleStats = {styleRules: 0, inlineStyles: 0, externalSheets: 0}; this._renderInitialView(); } @@ -73,7 +75,8 @@ globalStyleStats: this._globalStyleStats, elementStyleStats: this._elementStyleStats, fontSizes: this._fontSizes, - elementCount: this._elementCount + elementCount: this._elementCount, + mediaQueries: this._mediaQueries }); } @@ -92,6 +95,11 @@ this._globalStyleStats = globalStyleStats; } + const mediaQueries = await this._model.getMediaQueries(); + if (mediaQueries) { + this._mediaQueries = mediaQueries; + } + // 2. Get the total element count. this._elementCount = document.length;
diff --git a/third_party/blink/renderer/devtools/front_end/css_overview/cssOverviewCompletedView.css b/third_party/blink/renderer/devtools/front_end/css_overview/cssOverviewCompletedView.css index fa6f0d4..5967edf 100644 --- a/third_party/blink/renderer/devtools/front_end/css_overview/cssOverviewCompletedView.css +++ b/third_party/blink/renderer/devtools/front_end/css_overview/cssOverviewCompletedView.css
@@ -46,6 +46,17 @@ font-weight: bold; } +.media-query-grid .header-container, +.media-query-grid .data-container, +.media-query-grid table.data { + position: relative; +} + +.media-query-grid .data-container { + top: 0; + max-height: 400px; +} + .block { width: 65px; height: 25px;
diff --git a/third_party/blink/renderer/devtools/front_end/css_overview/css_overview_strings.grdp b/third_party/blink/renderer/devtools/front_end/css_overview/css_overview_strings.grdp index 87042a3..aa7d406 100644 --- a/third_party/blink/renderer/devtools/front_end/css_overview/css_overview_strings.grdp +++ b/third_party/blink/renderer/devtools/front_end/css_overview/css_overview_strings.grdp
@@ -27,9 +27,6 @@ <message name="IDS_DEVTOOLS_5d50889672f6f860d14f502de3de1957" desc="Title of colors subsection in the CSS Overview Panel"> Colors </message> - <message name="IDS_DEVTOOLS_62d79b9db9edfb64bd8c538cb9ed0190" desc="Label for the number of media rules in the CSS Overview report"> - Media rules - </message> <message name="IDS_DEVTOOLS_6ad170a0581c9c116ca254758bd0c5b9" desc="Label for the number of ID selectors in the CSS Overview report"> ID selectors </message> @@ -57,6 +54,9 @@ <message name="IDS_DEVTOOLS_d4a993a4b0d13c2cc4ce9387af1604ce" desc="Label for the 'Clear overview' button in the CSS Overview report"> Clear overview </message> + <message name="IDS_DEVTOOLS_daee0f0fc555c02342c4e00a1dbf642a" desc="Label for the number of media rules in the CSS Overview report"> + Media queries + </message> <message name="IDS_DEVTOOLS_e9c6934e961dad71d311f68c679dfd3b" desc="Label for the capture button in the CSS Overview Panel"> Capture overview </message>
diff --git a/third_party/blink/renderer/devtools/front_end/css_overview/module.json b/third_party/blink/renderer/devtools/front_end/css_overview/module.json index 4e447cd..7245192 100644 --- a/third_party/blink/renderer/devtools/front_end/css_overview/module.json +++ b/third_party/blink/renderer/devtools/front_end/css_overview/module.json
@@ -13,7 +13,8 @@ "dependencies": [ "elements", "ui", - "sdk" + "sdk", + "data_grid" ], "scripts": [ "CSSOverviewController.js",
diff --git a/third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js b/third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js index 10a21c3..0b186951 100644 --- a/third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js +++ b/third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js
@@ -1075,10 +1075,11 @@ * @param {boolean=} supressSelectedEvent */ select(supressSelectedEvent) { - if (this.expanded) { - this.collapse(); - return; + super.select(supressSelectedEvent); + const firstChildNode = this.traverseNextNode(false, true); + if (firstChildNode && firstChildNode.request()) { + this.parentView().dispatchEventToListeners( + Network.NetworkLogView.Events.RequestSelected, firstChildNode.request()); } - this.expand(); } };
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/Automapping.js b/third_party/blink/renderer/devtools/front_end/persistence/Automapping.js index 6fef8c2..805e1aa 100644 --- a/third_party/blink/renderer/devtools/front_end/persistence/Automapping.js +++ b/third_party/blink/renderer/devtools/front_end/persistence/Automapping.js
@@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -Persistence.Automapping = class { +export default class Automapping { /** * @param {!Workspace.Workspace} workspace - * @param {function(!Persistence.AutomappingStatus)} onStatusAdded - * @param {function(!Persistence.AutomappingStatus)} onStatusRemoved + * @param {function(!AutomappingStatus)} onStatusAdded + * @param {function(!AutomappingStatus)} onStatusRemoved */ constructor(workspace, onStatusAdded, onStatusRemoved) { this._workspace = workspace; this._onStatusAdded = onStatusAdded; this._onStatusRemoved = onStatusRemoved; - /** @type {!Set<!Persistence.AutomappingStatus>} */ + /** @type {!Set<!AutomappingStatus>} */ this._statuses = new Set(); this._statusSymbol = Symbol('Automapping.Status'); this._processingPromiseSymbol = Symbol('Automapping.ProcessingPromise'); @@ -25,9 +25,9 @@ this._sweepThrottler = new Common.Throttler(100); const pathEncoder = new Persistence.PathEncoder(); - this._filesIndex = new Persistence.Automapping.FilePathIndex(pathEncoder); - this._projectFoldersIndex = new Persistence.Automapping.FolderIndex(pathEncoder); - this._activeFoldersIndex = new Persistence.Automapping.FolderIndex(pathEncoder); + this._filesIndex = new FilePathIndex(pathEncoder); + this._projectFoldersIndex = new FolderIndex(pathEncoder); + this._activeFoldersIndex = new FolderIndex(pathEncoder); /** @type {!Array<function(!Workspace.UISourceCode):boolean>} */ this._interceptors = []; @@ -73,7 +73,7 @@ this._sweepThrottler.schedule(sweepUnmapped.bind(this)); /** - * @this {Persistence.Automapping} + * @this {Automapping} * @return {!Promise} */ function sweepUnmapped() { @@ -198,9 +198,9 @@ networkSourceCode[this._processingPromiseSymbol] = createBindingPromise; /** - * @param {?Persistence.AutomappingStatus} status - * @return {!Promise<?Persistence.AutomappingStatus>} - * @this {Persistence.Automapping} + * @param {?AutomappingStatus} status + * @return {!Promise<?AutomappingStatus>} + * @this {Automapping} */ async function validateStatus(status) { if (!status) { @@ -266,8 +266,8 @@ } /** - * @param {?Persistence.AutomappingStatus} status - * @this {Persistence.Automapping} + * @param {?AutomappingStatus} status + * @this {Automapping} */ function onStatus(status) { if (networkSourceCode[this._processingPromiseSymbol] !== createBindingPromise) { @@ -298,7 +298,7 @@ } /** - * @param {!Persistence.AutomappingStatus} binding + * @param {!AutomappingStatus} binding */ _prevalidationFailedForTest(binding) { } @@ -333,20 +333,19 @@ /** * @param {!Workspace.UISourceCode} networkSourceCode - * @return {!Promise<?Persistence.AutomappingStatus>} + * @return {!Promise<?AutomappingStatus>} */ _createBinding(networkSourceCode) { if (networkSourceCode.url().startsWith('file://') || networkSourceCode.url().startsWith('snippet://')) { const decodedUrl = decodeURI(networkSourceCode.url()); const fileSourceCode = this._fileSystemUISourceCodes.get(decodedUrl); - const status = - fileSourceCode ? new Persistence.AutomappingStatus(networkSourceCode, fileSourceCode, false) : null; + const status = fileSourceCode ? new AutomappingStatus(networkSourceCode, fileSourceCode, false) : null; return Promise.resolve(status); } let networkPath = Common.ParsedURL.extractPath(networkSourceCode.url()); if (networkPath === null) { - return Promise.resolve(/** @type {?Persistence.AutomappingStatus} */ (null)); + return Promise.resolve(/** @type {?AutomappingStatus} */ (null)); } if (networkPath.endsWith('/')) { @@ -356,13 +355,13 @@ const similarFiles = this._filesIndex.similarFiles(urlDecodedNetworkPath).map(path => this._fileSystemUISourceCodes.get(path)); if (!similarFiles.length) { - return Promise.resolve(/** @type {?Persistence.AutomappingStatus} */ (null)); + return Promise.resolve(/** @type {?AutomappingStatus} */ (null)); } return this._pullMetadatas(similarFiles.concat(networkSourceCode)).then(onMetadatas.bind(this)); /** - * @this {Persistence.Automapping} + * @this {Automapping} */ function onMetadatas() { const activeFiles = similarFiles.filter(file => !!this._activeFoldersIndex.closestParentFolder(file.url())); @@ -372,7 +371,7 @@ if (activeFiles.length !== 1) { return null; } - return new Persistence.AutomappingStatus(networkSourceCode, activeFiles[0], false); + return new AutomappingStatus(networkSourceCode, activeFiles[0], false); } // Try to find exact matches, prioritizing active folders. @@ -383,7 +382,7 @@ if (exactMatches.length !== 1) { return null; } - return new Persistence.AutomappingStatus(networkSourceCode, exactMatches[0], true); + return new AutomappingStatus(networkSourceCode, exactMatches[0], true); } } @@ -415,12 +414,12 @@ return timeMatches && contentMatches; }); } -}; +} /** * @unrestricted */ -Persistence.Automapping.FilePathIndex = class { +export class FilePathIndex { /** * @param {!Persistence.PathEncoder} encoder */ @@ -458,12 +457,12 @@ return this._reversedIndex.words(longestCommonPrefix) .map(encodedPath => this._encoder.decode(encodedPath.reverse())); } -}; +} /** * @unrestricted */ -Persistence.Automapping.FolderIndex = class { +export class FolderIndex { /** * @param {!Persistence.PathEncoder} encoder */ @@ -520,12 +519,12 @@ const commonPrefix = this._index.longestPrefix(encodedPath, true); return this._encoder.decode(commonPrefix); } -}; +} /** * @unrestricted */ -Persistence.AutomappingStatus = class { +export class AutomappingStatus { /** * @param {!Workspace.UISourceCode} network * @param {!Workspace.UISourceCode} fileSystem @@ -536,4 +535,22 @@ this.fileSystem = fileSystem; this.exactMatch = exactMatch; } -}; +} + +/* Legacy exported object */ +self.Persistence = self.Persistence || {}; + +/* Legacy exported object */ +Persistence = Persistence || {}; + +/** @constructor */ +Persistence.Automapping = Automapping; + +/** @constructor */ +Persistence.Automapping.FilePathIndex = FilePathIndex; + +/** @constructor */ +Persistence.Automapping.FolderIndex = FolderIndex; + +/** @constructor */ +Persistence.AutomappingStatus = AutomappingStatus;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/EditFileSystemView.js b/third_party/blink/renderer/devtools/front_end/persistence/EditFileSystemView.js index 329f21a4..8d453f2a 100644 --- a/third_party/blink/renderer/devtools/front_end/persistence/EditFileSystemView.js +++ b/third_party/blink/renderer/devtools/front_end/persistence/EditFileSystemView.js
@@ -31,7 +31,7 @@ * @implements {UI.ListWidget.Delegate} * @unrestricted */ -Persistence.EditFileSystemView = class extends UI.VBox { +export default class EditFileSystemView extends UI.VBox { /** * @param {string} fileSystemPath */ @@ -166,7 +166,7 @@ * @param {number} index * @param {!HTMLInputElement|!HTMLSelectElement} input * @return {!UI.ListWidget.ValidatorResult} - * @this {Persistence.EditFileSystemView} + * @this {EditFileSystemView} */ function pathPrefixValidator(item, index, input) { const prefix = this._normalizePrefix(input.value.trim()); @@ -196,4 +196,13 @@ } return prefix + (prefix[prefix.length - 1] === '/' ? '' : '/'); } -}; +} + +/* Legacy exported object */ +self.Persistence = self.Persistence || {}; + +/* Legacy exported object */ +Persistence = Persistence || {}; + +/** @constructor */ +Persistence.EditFileSystemView = EditFileSystemView;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/FileSystemWorkspaceBinding.js b/third_party/blink/renderer/devtools/front_end/persistence/FileSystemWorkspaceBinding.js index fdcb551..54c0a86 100644 --- a/third_party/blink/renderer/devtools/front_end/persistence/FileSystemWorkspaceBinding.js +++ b/third_party/blink/renderer/devtools/front_end/persistence/FileSystemWorkspaceBinding.js
@@ -31,7 +31,7 @@ /** * @unrestricted */ -Persistence.FileSystemWorkspaceBinding = class { +export default class FileSystemWorkspaceBinding { /** * @param {!Persistence.IsolatedFileSystemManager} isolatedFileSystemManager * @param {!Workspace.Workspace} workspace @@ -47,7 +47,7 @@ this._isolatedFileSystemManager.addEventListener( Persistence.IsolatedFileSystemManager.Events.FileSystemFilesChanged, this._fileSystemFilesChanged, this) ]; - /** @type {!Map.<string, !Persistence.FileSystemWorkspaceBinding.FileSystem>} */ + /** @type {!Map.<string, !FileSystem>} */ this._boundFileSystems = new Map(); this._isolatedFileSystemManager.waitForFileSystems().then(this._onFileSystemsLoaded.bind(this)); } @@ -66,7 +66,7 @@ */ static relativePath(uiSourceCode) { const baseURL = - /** @type {!Persistence.FileSystemWorkspaceBinding.FileSystem}*/ (uiSourceCode.project())._fileSystemBaseURL; + /** @type {!FileSystem}*/ (uiSourceCode.project())._fileSystemBaseURL; return uiSourceCode.url().substring(baseURL.length).split('/'); } @@ -76,7 +76,7 @@ */ static tooltipForUISourceCode(uiSourceCode) { const fileSystem = - /** @type {!Persistence.FileSystemWorkspaceBinding.FileSystem}*/ (uiSourceCode.project())._fileSystem; + /** @type {!FileSystem}*/ (uiSourceCode.project())._fileSystem; return fileSystem.tooltipForURL(uiSourceCode.url()); } @@ -86,7 +86,7 @@ */ static fileSystemType(project) { const fileSystem = - /** @type {!Persistence.FileSystemWorkspaceBinding.FileSystem}*/ (project)._fileSystem; + /** @type {!FileSystem}*/ (project)._fileSystem; return fileSystem.type(); } @@ -96,7 +96,7 @@ */ static fileSystemSupportsAutomapping(project) { const fileSystem = - /** @type {!Persistence.FileSystemWorkspaceBinding.FileSystem}*/ (project)._fileSystem; + /** @type {!FileSystem}*/ (project)._fileSystem; return fileSystem.supportsAutomapping(); } @@ -106,7 +106,7 @@ * @return {string} */ static completeURL(project, relativePath) { - const fsProject = /** @type {!Persistence.FileSystemWorkspaceBinding.FileSystem}*/ (project); + const fsProject = /** @type {!FileSystem}*/ (project); return fsProject._fileSystemBaseURL + relativePath; } @@ -146,7 +146,7 @@ * @param {!Persistence.PlatformFileSystem} fileSystem */ _addFileSystem(fileSystem) { - const boundFileSystem = new Persistence.FileSystemWorkspaceBinding.FileSystem(this, fileSystem, this._workspace); + const boundFileSystem = new FileSystem(this, fileSystem, this._workspace); this._boundFileSystems.set(fileSystem.path(), boundFileSystem); } @@ -197,21 +197,21 @@ this._boundFileSystems.remove(fileSystem._fileSystem.path()); } } -}; +} /** * @implements {Workspace.Project} * @unrestricted */ -Persistence.FileSystemWorkspaceBinding.FileSystem = class extends Workspace.ProjectStore { +export class FileSystem extends Workspace.ProjectStore { /** - * @param {!Persistence.FileSystemWorkspaceBinding} fileSystemWorkspaceBinding + * @param {!FileSystemWorkspaceBinding} fileSystemWorkspaceBinding * @param {!Persistence.PlatformFileSystem} isolatedFileSystem * @param {!Workspace.Workspace} workspace */ constructor(fileSystemWorkspaceBinding, isolatedFileSystem, workspace) { const fileSystemPath = isolatedFileSystem.path(); - const id = Persistence.FileSystemWorkspaceBinding.projectId(fileSystemPath); + const id = FileSystemWorkspaceBinding.projectId(fileSystemPath); console.assert(!workspace.project(id)); const displayName = fileSystemPath.substr(fileSystemPath.lastIndexOf('/') + 1); @@ -274,12 +274,12 @@ * @return {!Promise<?Workspace.UISourceCodeMetadata>} */ requestMetadata(uiSourceCode) { - if (uiSourceCode[Persistence.FileSystemWorkspaceBinding._metadata]) { - return uiSourceCode[Persistence.FileSystemWorkspaceBinding._metadata]; + if (uiSourceCode[_metadata]) { + return uiSourceCode[_metadata]; } const relativePath = this._filePathForUISourceCode(uiSourceCode); const promise = this._fileSystem.getMetadata(relativePath).then(onMetadata); - uiSourceCode[Persistence.FileSystemWorkspaceBinding._metadata] = promise; + uiSourceCode[_metadata] = promise; return promise; /** @@ -339,7 +339,7 @@ */ fullDisplayName(uiSourceCode) { const baseURL = - /** @type {!Persistence.FileSystemWorkspaceBinding.FileSystem}*/ (uiSourceCode.project())._fileSystemParentURL; + /** @type {!FileSystem}*/ (uiSourceCode.project())._fileSystemParentURL; return uiSourceCode.url().substring(baseURL.length); } @@ -369,7 +369,7 @@ /** * @param {boolean} success * @param {string=} newName - * @this {Persistence.FileSystemWorkspaceBinding.FileSystem} + * @this {FileSystem} */ function innerCallback(success, newName) { if (!success || !newName) { @@ -450,7 +450,7 @@ /** * @param {number} from - * @this {Persistence.FileSystemWorkspaceBinding.FileSystem} + * @this {FileSystem} */ function reportFileChunk(from) { const to = Math.min(from + chunkSize, filePaths.length); @@ -569,7 +569,7 @@ this.addUISourceCode(this.createUISourceCode(path, contentType)); return; } - uiSourceCode[Persistence.FileSystemWorkspaceBinding._metadata] = null; + uiSourceCode[_metadata] = null; uiSourceCode.checkContentUpdated(); } @@ -584,6 +584,20 @@ dispose() { this.removeProject(); } -}; +} -Persistence.FileSystemWorkspaceBinding._metadata = Symbol('FileSystemWorkspaceBinding.Metadata'); +export const _metadata = Symbol('FileSystemWorkspaceBinding.Metadata'); + +/* Legacy exported object */ +self.Persistence = self.Persistence || {}; + +/* Legacy exported object */ +Persistence = Persistence || {}; + +/** @constructor */ +Persistence.FileSystemWorkspaceBinding = FileSystemWorkspaceBinding; + +/** @constructor */ +Persistence.FileSystemWorkspaceBinding.FileSystem = FileSystem; + +Persistence.FileSystemWorkspaceBinding._metadata = _metadata;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystem.js b/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystem.js index 206fdc2cf..faf021d 100644 --- a/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystem.js +++ b/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystem.js
@@ -30,7 +30,7 @@ /** * @unrestricted */ -Persistence.IsolatedFileSystem = class extends Persistence.PlatformFileSystem { +export default class IsolatedFileSystem extends Persistence.PlatformFileSystem { /** * @param {!Persistence.IsolatedFileSystemManager} manager * @param {string} path @@ -64,18 +64,18 @@ * @param {string} type * @param {string} name * @param {string} rootURL - * @return {!Promise<?Persistence.IsolatedFileSystem>} + * @return {!Promise<?IsolatedFileSystem>} */ static create(manager, path, embedderPath, type, name, rootURL) { const domFileSystem = Host.InspectorFrontendHost.isolatedFileSystem(name, rootURL); if (!domFileSystem) { - return Promise.resolve(/** @type {?Persistence.IsolatedFileSystem} */ (null)); + return Promise.resolve(/** @type {?IsolatedFileSystem} */ (null)); } - const fileSystem = new Persistence.IsolatedFileSystem(manager, path, embedderPath, domFileSystem, type); + const fileSystem = new IsolatedFileSystem(manager, path, embedderPath, domFileSystem, type); return fileSystem._initializeFilePaths() .then(() => fileSystem) - .catchException(/** @type {?Persistence.IsolatedFileSystem} */ (null)); + .catchException(/** @type {?IsolatedFileSystem} */ (null)); } /** @@ -120,7 +120,7 @@ * @param {!FileError} error */ function errorHandler(error) { - const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error); + const errorMessage = IsolatedFileSystem.errorMessage(error); console.error(errorMessage + ' when getting file metadata \'' + path); fulfill(null); } @@ -163,7 +163,7 @@ /** * @param {!Array.<!FileEntry>} entries - * @this {Persistence.IsolatedFileSystem} + * @this {IsolatedFileSystem} */ function innerCallback(entries) { for (let i = 0; i < entries.length; ++i) { @@ -224,7 +224,7 @@ _innerCreateFolderIfNeeded(path) { return new Promise(resolve => { this._domFileSystem.root.getDirectory(path, {create: true}, dirEntry => resolve(dirEntry), error => { - const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error); + const errorMessage = IsolatedFileSystem.errorMessage(error); console.error(errorMessage + ' trying to create directory \'' + path + '\''); resolve(null); }); @@ -252,7 +252,7 @@ * @param {string} name * @param {number=} newFileIndex * @return {!Promise<?FileEntry>} - * @this {Persistence.IsolatedFileSystem} + * @this {IsolatedFileSystem} */ function createFileCandidate(name, newFileIndex) { return new Promise(resolve => { @@ -262,7 +262,7 @@ resolve(createFileCandidate.call(this, name, (newFileIndex ? newFileIndex + 1 : 1))); return; } - const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error); + const errorMessage = IsolatedFileSystem.errorMessage(error); console.error( errorMessage + ' when testing if file exists \'' + (this.path() + '/' + path + '/' + nameCandidate) + '\''); @@ -285,7 +285,7 @@ /** * @param {!FileEntry} fileEntry - * @this {Persistence.IsolatedFileSystem} + * @this {IsolatedFileSystem} */ function fileEntryLoaded(fileEntry) { fileEntry.remove(fileEntryRemoved, errorHandler.bind(this)); @@ -297,12 +297,12 @@ /** * @param {!FileError} error - * @this {Persistence.IsolatedFileSystem} + * @this {IsolatedFileSystem} * @suppress {checkTypes} * TODO(jsbell): Update externs replacing FileError with DOMException. https://crbug.com/496901 */ function errorHandler(error) { - const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error); + const errorMessage = IsolatedFileSystem.errorMessage(error); console.error(errorMessage + ' when deleting file \'' + (this.path() + '/' + path) + '\''); resolveCallback(false); } @@ -320,7 +320,7 @@ }, errorHandler.bind(this)); /** - * @this {Persistence.IsolatedFileSystem} + * @this {IsolatedFileSystem} */ function errorHandler(error) { if (error.name === 'NotFoundError') { @@ -328,7 +328,7 @@ return; } - const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error); + const errorMessage = IsolatedFileSystem.errorMessage(error); console.error(errorMessage + ' when getting content for file \'' + (this.path() + '/' + path) + '\''); resolve(null); } @@ -350,7 +350,7 @@ const reader = new FileReader(); const extension = Common.ParsedURL.extractExtension(path); - const encoded = Persistence.IsolatedFileSystem.BinaryExtensions.has(extension); + const encoded = BinaryExtensions.has(extension); const readPromise = new Promise(x => reader.onloadend = x); if (encoded) { reader.readAsBinaryString(blob); @@ -399,7 +399,7 @@ /** * @param {!FileEntry} entry - * @this {Persistence.IsolatedFileSystem} + * @this {IsolatedFileSystem} */ function fileEntryLoaded(entry) { entry.createWriter(fileWriterCreated.bind(this), errorHandler.bind(this)); @@ -407,7 +407,7 @@ /** * @param {!FileWriter} fileWriter - * @this {Persistence.IsolatedFileSystem} + * @this {IsolatedFileSystem} */ async function fileWriterCreated(fileWriter) { fileWriter.onerror = errorHandler.bind(this); @@ -427,10 +427,10 @@ } /** - * @this {Persistence.IsolatedFileSystem} + * @this {IsolatedFileSystem} */ function errorHandler(error) { - const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error); + const errorMessage = IsolatedFileSystem.errorMessage(error); console.error(errorMessage + ' when setting content for file \'' + (this.path() + '/' + path) + '\''); callback(); } @@ -455,7 +455,7 @@ /** * @param {!FileEntry} entry - * @this {Persistence.IsolatedFileSystem} + * @this {IsolatedFileSystem} */ function fileEntryLoaded(entry) { if (entry.name === newName) { @@ -469,7 +469,7 @@ /** * @param {!Entry} entry - * @this {Persistence.IsolatedFileSystem} + * @this {IsolatedFileSystem} */ function dirEntryLoaded(entry) { dirEntry = entry; @@ -484,7 +484,7 @@ } /** - * @this {Persistence.IsolatedFileSystem} + * @this {IsolatedFileSystem} */ function newFileEntryLoadErrorHandler(error) { if (error.name !== 'NotFoundError') { @@ -502,10 +502,10 @@ } /** - * @this {Persistence.IsolatedFileSystem} + * @this {IsolatedFileSystem} */ function errorHandler(error) { - const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error); + const errorMessage = IsolatedFileSystem.errorMessage(error); console.error(errorMessage + ' when renaming file \'' + (this.path() + '/' + path) + '\' to \'' + newName + '\''); callback(false); } @@ -535,7 +535,7 @@ dirReader.readEntries(innerCallback, errorHandler); function errorHandler(error) { - const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error); + const errorMessage = IsolatedFileSystem.errorMessage(error); console.error(errorMessage + ' when reading directory \'' + dirEntry.fullPath + '\''); callback([]); } @@ -550,14 +550,14 @@ /** * @param {!DirectoryEntry} dirEntry - * @this {Persistence.IsolatedFileSystem} + * @this {IsolatedFileSystem} */ function innerCallback(dirEntry) { this._readDirectory(dirEntry, callback); } function errorHandler(error) { - const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error); + const errorMessage = IsolatedFileSystem.errorMessage(error); console.error(errorMessage + ' when requesting entry \'' + path + '\''); callback([]); } @@ -675,20 +675,19 @@ */ contentType(path) { const extension = Common.ParsedURL.extractExtension(path); - if (Persistence.IsolatedFileSystem._styleSheetExtensions.has(extension)) { + if (_styleSheetExtensions.has(extension)) { return Common.resourceTypes.Stylesheet; } - if (Persistence.IsolatedFileSystem._documentExtensions.has(extension)) { + if (_documentExtensions.has(extension)) { return Common.resourceTypes.Document; } - if (Persistence.IsolatedFileSystem.ImageExtensions.has(extension)) { + if (ImageExtensions.has(extension)) { return Common.resourceTypes.Image; } - if (Persistence.IsolatedFileSystem._scriptExtensions.has(extension)) { + if (_scriptExtensions.has(extension)) { return Common.resourceTypes.Script; } - return Persistence.IsolatedFileSystem.BinaryExtensions.has(extension) ? Common.resourceTypes.Other : - Common.resourceTypes.Document; + return BinaryExtensions.has(extension) ? Common.resourceTypes.Other : Common.resourceTypes.Document; } /** @@ -708,19 +707,19 @@ supportsAutomapping() { return this.type() !== 'overrides'; } -}; +} -Persistence.IsolatedFileSystem._styleSheetExtensions = new Set(['css', 'scss', 'sass', 'less']); -Persistence.IsolatedFileSystem._documentExtensions = new Set(['htm', 'html', 'asp', 'aspx', 'phtml', 'jsp']); -Persistence.IsolatedFileSystem._scriptExtensions = new Set([ +export const _styleSheetExtensions = new Set(['css', 'scss', 'sass', 'less']); +export const _documentExtensions = new Set(['htm', 'html', 'asp', 'aspx', 'phtml', 'jsp']); + +export const _scriptExtensions = new Set([ 'asp', 'aspx', 'c', 'cc', 'cljs', 'coffee', 'cpp', 'cs', 'dart', 'java', 'js', 'jsp', 'jsx', 'h', 'm', 'mjs', 'mm', 'py', 'sh', 'ts', 'tsx', 'ls' ]); -Persistence.IsolatedFileSystem.ImageExtensions = - new Set(['jpeg', 'jpg', 'svg', 'gif', 'webp', 'png', 'ico', 'tiff', 'tif', 'bmp']); +export const ImageExtensions = new Set(['jpeg', 'jpg', 'svg', 'gif', 'webp', 'png', 'ico', 'tiff', 'tif', 'bmp']); -Persistence.IsolatedFileSystem.BinaryExtensions = new Set([ +export const BinaryExtensions = new Set([ // Executable extensions, roughly taken from https://en.wikipedia.org/wiki/Comparison_of_executable_file_formats 'cmd', 'com', 'exe', // Archive extensions, roughly taken from https://en.wikipedia.org/wiki/List_of_archive_formats @@ -732,3 +731,18 @@ // Image file extensions 'jpeg', 'jpg', 'gif', 'webp', 'png', 'ico', 'tiff', 'tif', 'bmp' ]); + +/* Legacy exported object */ +self.Persistence = self.Persistence || {}; + +/* Legacy exported object */ +Persistence = Persistence || {}; + +/** @constructor */ +Persistence.IsolatedFileSystem = IsolatedFileSystem; + +Persistence.IsolatedFileSystem._styleSheetExtensions = _styleSheetExtensions; +Persistence.IsolatedFileSystem._documentExtensions = _documentExtensions; +Persistence.IsolatedFileSystem._scriptExtensions = _scriptExtensions; +Persistence.IsolatedFileSystem.ImageExtensions = ImageExtensions; +Persistence.IsolatedFileSystem.BinaryExtensions = BinaryExtensions;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystemManager.js b/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystemManager.js index b2039e0..bb73592 100644 --- a/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystemManager.js +++ b/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystemManager.js
@@ -31,7 +31,7 @@ /** * @unrestricted */ -Persistence.IsolatedFileSystemManager = class extends Common.Object { +export default class IsolatedFileSystemManager extends Common.Object { constructor() { super(); @@ -77,7 +77,7 @@ /** * @param {!Common.Event} event - * @this {Persistence.IsolatedFileSystemManager} + * @this {IsolatedFileSystemManager} */ function onFileSystemsLoaded(event) { const fileSystems = /** @type {!Array.<!Persistence.IsolatedFileSystemManager.FileSystem>} */ (event.data); @@ -135,7 +135,7 @@ /** * @param {?Persistence.PlatformFileSystem} fileSystem - * @this {Persistence.IsolatedFileSystemManager} + * @this {IsolatedFileSystemManager} */ function storeFileSystem(fileSystem) { if (!fileSystem) { @@ -143,7 +143,7 @@ } this._fileSystems.set(fileSystemURL, fileSystem); if (dispatchEvent) { - this.dispatchEventToListeners(Persistence.IsolatedFileSystemManager.Events.FileSystemAdded, fileSystem); + this.dispatchEventToListeners(Events.FileSystemAdded, fileSystem); } return fileSystem; } @@ -155,7 +155,7 @@ */ addPlatformFileSystem(fileSystemURL, fileSystem) { this._fileSystems.set(fileSystemURL, fileSystem); - this.dispatchEventToListeners(Persistence.IsolatedFileSystemManager.Events.FileSystemAdded, fileSystem); + this.dispatchEventToListeners(Events.FileSystemAdded, fileSystem); } /** @@ -192,7 +192,7 @@ } this._fileSystems.delete(fileSystemPath); isolatedFileSystem.fileSystemRemoved(); - this.dispatchEventToListeners(Persistence.IsolatedFileSystemManager.Events.FileSystemRemoved, isolatedFileSystem); + this.dispatchEventToListeners(Events.FileSystemRemoved, isolatedFileSystem); } /** @@ -205,12 +205,12 @@ removed: groupFilePathsIntoFileSystemPaths.call(this, event.data.removed) }; - this.dispatchEventToListeners(Persistence.IsolatedFileSystemManager.Events.FileSystemFilesChanged, urlPaths); + this.dispatchEventToListeners(Events.FileSystemFilesChanged, urlPaths); /** * @param {!Array<string>} embedderPaths * @return {!Platform.Multimap<string, string>} - * @this {Persistence.IsolatedFileSystemManager} + * @this {IsolatedFileSystemManager} */ function groupFilePathsIntoFileSystemPaths(embedderPaths) { const paths = new Platform.Multimap(); @@ -282,7 +282,7 @@ * @return {number} */ registerCallback(callback) { - const requestId = ++Persistence.IsolatedFileSystemManager._lastRequestId; + const requestId = ++_lastRequestId; this._callbacks.set(requestId, callback); return requestId; } @@ -292,7 +292,7 @@ * @return {number} */ registerProgress(progress) { - const requestId = ++Persistence.IsolatedFileSystemManager._lastRequestId; + const requestId = ++_lastRequestId; this._progresses.set(requestId, progress); return requestId; } @@ -357,16 +357,10 @@ callback.call(null, files); this._callbacks.delete(requestId); } -}; - -/** @typedef {!{type: string, fileSystemName: string, rootURL: string, fileSystemPath: string}} */ -Persistence.IsolatedFileSystemManager.FileSystem; - -/** @typedef {!{changed:!Platform.Multimap<string, string>, added:!Platform.Multimap<string, string>, removed:!Platform.Multimap<string, string>}} */ -Persistence.IsolatedFileSystemManager.FilesChangedData; +} /** @enum {symbol} */ -Persistence.IsolatedFileSystemManager.Events = { +export const Events = { FileSystemAdded: Symbol('FileSystemAdded'), FileSystemRemoved: Symbol('FileSystemRemoved'), FileSystemFilesChanged: Symbol('FileSystemFilesChanged'), @@ -374,9 +368,28 @@ ExcludedFolderRemoved: Symbol('ExcludedFolderRemoved') }; -Persistence.IsolatedFileSystemManager._lastRequestId = 0; +export let _lastRequestId = 0; + +/* Legacy exported object */ +self.Persistence = self.Persistence || {}; + +/* Legacy exported object */ +Persistence = Persistence || {}; + +/** @constructor */ +Persistence.IsolatedFileSystemManager = IsolatedFileSystemManager; + +/** @enum {symbol} */ +Persistence.IsolatedFileSystemManager.Events = Events; +Persistence.IsolatedFileSystemManager._lastRequestId = _lastRequestId; + +/** @typedef {!{type: string, fileSystemName: string, rootURL: string, fileSystemPath: string}} */ +Persistence.IsolatedFileSystemManager.FileSystem; + +/** @typedef {!{changed:!Platform.Multimap<string, string>, added:!Platform.Multimap<string, string>, removed:!Platform.Multimap<string, string>}} */ +Persistence.IsolatedFileSystemManager.FilesChangedData; /** - * @type {!Persistence.IsolatedFileSystemManager} + * @type {!IsolatedFileSystemManager} */ Persistence.isolatedFileSystemManager;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/NetworkPersistenceManager.js b/third_party/blink/renderer/devtools/front_end/persistence/NetworkPersistenceManager.js index b8b5088a..b7f730cf 100644 --- a/third_party/blink/renderer/devtools/front_end/persistence/NetworkPersistenceManager.js +++ b/third_party/blink/renderer/devtools/front_end/persistence/NetworkPersistenceManager.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -Persistence.NetworkPersistenceManager = class extends Common.Object { +export default class NetworkPersistenceManager extends Common.Object { /** * @param {!Workspace.Workspace} workspace */ @@ -162,7 +162,7 @@ // encodeURI() escapes all the unsafe filename characters except /:?* let encodedName = encodeURI(pathPart).replace(/[\/:\?\*]/g, match => '%' + match[0].charCodeAt(0).toString(16)); // Windows does not allow a small set of filenames. - if (Persistence.NetworkPersistenceManager._reservedFileNames.has(encodedName.toLowerCase())) { + if (_reservedFileNames.has(encodedName.toLowerCase())) { encodedName = encodedName.split('').map(char => '%' + char.charCodeAt(0).toString(16)).join(''); } // Windows does not allow the file to end in a space or dot (space should already be encoded). @@ -353,7 +353,7 @@ this._updateInterceptionThrottler.schedule(innerUpdateInterceptionPatterns.bind(this)); /** - * @this {Persistence.NetworkPersistenceManager} + * @this {NetworkPersistenceManager} * @return {!Promise} */ function innerUpdateInterceptionPatterns() { @@ -425,7 +425,7 @@ } this._updateActiveProject(); - this.dispatchEventToListeners(Persistence.NetworkPersistenceManager.Events.ProjectChanged, this._project); + this.dispatchEventToListeners(Events.ProjectChanged, this._project); } /** @@ -500,16 +500,28 @@ const blob = await project.requestFileBlob(fileSystemUISourceCode); interceptedRequest.continueRequestWithContent(new Blob([blob], {type: mimeType})); } -}; +} -Persistence.NetworkPersistenceManager._reservedFileNames = new Set([ +export const _reservedFileNames = new Set([ 'con', 'prn', 'aux', 'nul', 'com1', 'com2', 'com3', 'com4', 'com5', 'com6', 'com7', 'com8', 'com9', 'lpt1', 'lpt2', 'lpt3', 'lpt4', 'lpt5', 'lpt6', 'lpt7', 'lpt8', 'lpt9' ]); -Persistence.NetworkPersistenceManager.Events = { +export const Events = { ProjectChanged: Symbol('ProjectChanged') }; -/** @type {!Persistence.NetworkPersistenceManager} */ +/* Legacy exported object */ +self.Persistence = self.Persistence || {}; + +/* Legacy exported object */ +Persistence = Persistence || {}; + +/** @constructor */ +Persistence.NetworkPersistenceManager = NetworkPersistenceManager; + +Persistence.NetworkPersistenceManager._reservedFileNames = _reservedFileNames; +Persistence.NetworkPersistenceManager.Events = Events; + +/** @type {!NetworkPersistenceManager} */ Persistence.networkPersistenceManager;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/PersistenceActions.js b/third_party/blink/renderer/devtools/front_end/persistence/PersistenceActions.js index a14c690..656f8e23 100644 --- a/third_party/blink/renderer/devtools/front_end/persistence/PersistenceActions.js +++ b/third_party/blink/renderer/devtools/front_end/persistence/PersistenceActions.js
@@ -2,13 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -Persistence.PersistenceActions = {}; - /** * @implements {UI.ContextMenu.Provider} * @unrestricted */ -Persistence.PersistenceActions.ContextMenuProvider = class { +export class ContextMenuProvider { /** * @override * @param {!Event} event @@ -53,4 +51,15 @@ Common.UIString('Open in containing folder'), () => Host.InspectorFrontendHost.showItemInFolder(path)); } } -}; +} + +/* Legacy exported object */ +self.Persistence = self.Persistence || {}; + +/* Legacy exported object */ +Persistence = Persistence || {}; + +Persistence.PersistenceActions = {}; + +/** @constructor */ +Persistence.PersistenceActions.ContextMenuProvider = ContextMenuProvider;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/Persistence.js b/third_party/blink/renderer/devtools/front_end/persistence/PersistenceImpl.js similarity index 73% rename from third_party/blink/renderer/devtools/front_end/persistence/Persistence.js rename to third_party/blink/renderer/devtools/front_end/persistence/PersistenceImpl.js index 8a26cc9..8145ee3 100644 --- a/third_party/blink/renderer/devtools/front_end/persistence/Persistence.js +++ b/third_party/blink/renderer/devtools/front_end/persistence/PersistenceImpl.js
@@ -5,7 +5,7 @@ /** * @unrestricted */ -Persistence.Persistence = class extends Common.Object { +export default class PersistenceImpl extends Common.Object { /** * @param {!Workspace.Workspace} workspace * @param {!Bindings.BreakpointManager} breakpointManager @@ -39,39 +39,39 @@ } /** - * @param {!Persistence.PersistenceBinding} binding + * @param {!PersistenceBinding} binding */ addBinding(binding) { this._innerAddBinding(binding); } /** - * @param {!Persistence.PersistenceBinding} binding + * @param {!PersistenceBinding} binding */ addBindingForTest(binding) { this._innerAddBinding(binding); } /** - * @param {!Persistence.PersistenceBinding} binding + * @param {!PersistenceBinding} binding */ removeBinding(binding) { this._innerRemoveBinding(binding); } /** - * @param {!Persistence.PersistenceBinding} binding + * @param {!PersistenceBinding} binding */ removeBindingForTest(binding) { this._innerRemoveBinding(binding); } /** - * @param {!Persistence.PersistenceBinding} binding + * @param {!PersistenceBinding} binding */ _innerAddBinding(binding) { - binding.network[Persistence.Persistence._binding] = binding; - binding.fileSystem[Persistence.Persistence._binding] = binding; + binding.network[_binding] = binding; + binding.fileSystem[_binding] = binding; binding.fileSystem.forceLoadOnCheckContent(); @@ -100,22 +100,22 @@ this._notifyBindingEvent(binding.network); this._notifyBindingEvent(binding.fileSystem); - this.dispatchEventToListeners(Persistence.Persistence.Events.BindingCreated, binding); + this.dispatchEventToListeners(Events.BindingCreated, binding); } /** - * @param {!Persistence.PersistenceBinding} binding + * @param {!PersistenceBinding} binding */ _innerRemoveBinding(binding) { - if (binding.network[Persistence.Persistence._binding] !== binding) { + if (binding.network[_binding] !== binding) { return; } console.assert( - binding.network[Persistence.Persistence._binding] === binding.fileSystem[Persistence.Persistence._binding], + binding.network[_binding] === binding.fileSystem[_binding], 'ERROR: inconsistent binding for networkURL ' + binding.network.url()); - binding.network[Persistence.Persistence._binding] = null; - binding.fileSystem[Persistence.Persistence._binding] = null; + binding.network[_binding] = null; + binding.fileSystem[_binding] = null; binding.network.removeEventListener( Workspace.UISourceCode.Events.WorkingCopyCommitted, this._onWorkingCopyCommitted, this); @@ -131,15 +131,15 @@ this._notifyBindingEvent(binding.network); this._notifyBindingEvent(binding.fileSystem); - this.dispatchEventToListeners(Persistence.Persistence.Events.BindingRemoved, binding); + this.dispatchEventToListeners(Events.BindingRemoved, binding); } /** * @param {!Persistence.AutomappingStatus} status */ _onStatusAdded(status) { - const binding = new Persistence.PersistenceBinding(status.network, status.fileSystem); - status[Persistence.Persistence._binding] = binding; + const binding = new PersistenceBinding(status.network, status.fileSystem); + status[_binding] = binding; this._innerAddBinding(binding); } @@ -147,7 +147,7 @@ * @param {!Persistence.AutomappingStatus} status */ _onStatusRemoved(status) { - const binding = /** @type {!Persistence.PersistenceBinding} */ (status[Persistence.Persistence._binding]); + const binding = /** @type {!PersistenceBinding} */ (status[_binding]); this._innerRemoveBinding(binding); } @@ -163,15 +163,15 @@ * @param {!Workspace.UISourceCode} uiSourceCode */ _syncWorkingCopy(uiSourceCode) { - const binding = uiSourceCode[Persistence.Persistence._binding]; - if (!binding || binding[Persistence.Persistence._muteWorkingCopy]) { + const binding = uiSourceCode[_binding]; + if (!binding || binding[_muteWorkingCopy]) { return; } const other = binding.network === uiSourceCode ? binding.fileSystem : binding.network; if (!uiSourceCode.isDirty()) { - binding[Persistence.Persistence._muteWorkingCopy] = true; + binding[_muteWorkingCopy] = true; other.resetWorkingCopy(); - binding[Persistence.Persistence._muteWorkingCopy] = false; + binding[_muteWorkingCopy] = false; this._contentSyncedForTest(); return; } @@ -180,7 +180,7 @@ if (target.type() === SDK.Target.Type.Node) { const newContent = uiSourceCode.workingCopy(); other.requestContent().then(() => { - const nodeJSContent = Persistence.Persistence.rewrapNodeJSContent(other, other.workingCopy(), newContent); + const nodeJSContent = PersistenceImpl.rewrapNodeJSContent(other, other.workingCopy(), newContent); setWorkingCopy.call(this, () => nodeJSContent); }); return; @@ -190,12 +190,12 @@ /** * @param {function():string} workingCopyGetter - * @this {Persistence.Persistence} + * @this {PersistenceImpl} */ function setWorkingCopy(workingCopyGetter) { - binding[Persistence.Persistence._muteWorkingCopy] = true; + binding[_muteWorkingCopy] = true; other.setWorkingCopyGetter(workingCopyGetter); - binding[Persistence.Persistence._muteWorkingCopy] = false; + binding[_muteWorkingCopy] = false; this._contentSyncedForTest(); } } @@ -215,15 +215,15 @@ * @param {boolean} encoded */ syncContent(uiSourceCode, newContent, encoded) { - const binding = uiSourceCode[Persistence.Persistence._binding]; - if (!binding || binding[Persistence.Persistence._muteCommit]) { + const binding = uiSourceCode[_binding]; + if (!binding || binding[_muteCommit]) { return; } const other = binding.network === uiSourceCode ? binding.fileSystem : binding.network; const target = Bindings.NetworkProject.targetForUISourceCode(binding.network); if (target.type() === SDK.Target.Type.Node) { other.requestContent().then(currentContent => { - const nodeJSContent = Persistence.Persistence.rewrapNodeJSContent(other, currentContent, newContent); + const nodeJSContent = PersistenceImpl.rewrapNodeJSContent(other, currentContent, newContent); setContent.call(this, nodeJSContent); }); return; @@ -232,12 +232,12 @@ /** * @param {string} newContent - * @this {Persistence.Persistence} + * @this {PersistenceImpl} */ function setContent(newContent) { - binding[Persistence.Persistence._muteCommit] = true; + binding[_muteCommit] = true; other.setContent(newContent, encoded); - binding[Persistence.Persistence._muteCommit] = false; + binding[_muteCommit] = false; this._contentSyncedForTest(); } } @@ -250,21 +250,18 @@ */ static rewrapNodeJSContent(uiSourceCode, currentContent, newContent) { if (uiSourceCode.project().type() === Workspace.projectTypes.FileSystem) { - if (newContent.startsWith(Persistence.Persistence._NodePrefix) && - newContent.endsWith(Persistence.Persistence._NodeSuffix)) { - newContent = newContent.substring( - Persistence.Persistence._NodePrefix.length, newContent.length - Persistence.Persistence._NodeSuffix.length); + if (newContent.startsWith(_NodePrefix) && newContent.endsWith(_NodeSuffix)) { + newContent = newContent.substring(_NodePrefix.length, newContent.length - _NodeSuffix.length); } - if (currentContent.startsWith(Persistence.Persistence._NodeShebang)) { - newContent = Persistence.Persistence._NodeShebang + newContent; + if (currentContent.startsWith(_NodeShebang)) { + newContent = _NodeShebang + newContent; } } else { - if (newContent.startsWith(Persistence.Persistence._NodeShebang)) { - newContent = newContent.substring(Persistence.Persistence._NodeShebang.length); + if (newContent.startsWith(_NodeShebang)) { + newContent = newContent.substring(_NodeShebang.length); } - if (currentContent.startsWith(Persistence.Persistence._NodePrefix) && - currentContent.endsWith(Persistence.Persistence._NodeSuffix)) { - newContent = Persistence.Persistence._NodePrefix + newContent + Persistence.Persistence._NodeSuffix; + if (currentContent.startsWith(_NodePrefix) && currentContent.endsWith(_NodeSuffix)) { + newContent = _NodePrefix + newContent + _NodeSuffix; } } return newContent; @@ -298,7 +295,7 @@ if (uiSourceCode.project().canSetFileContent()) { return false; } - if (uiSourceCode[Persistence.Persistence._binding]) { + if (uiSourceCode[_binding]) { return false; } return !!uiSourceCode.hasCommits(); @@ -306,10 +303,10 @@ /** * @param {!Workspace.UISourceCode} uiSourceCode - * @return {?Persistence.PersistenceBinding} + * @return {?PersistenceBinding} */ binding(uiSourceCode) { - return uiSourceCode[Persistence.Persistence._binding] || null; + return uiSourceCode[_binding] || null; } /** @@ -397,17 +394,16 @@ } return this._filePathPrefixesToBindingCount.has(filePath); } -}; +} -Persistence.Persistence._binding = Symbol('Persistence.Binding'); -Persistence.Persistence._muteCommit = Symbol('Persistence.MuteCommit'); -Persistence.Persistence._muteWorkingCopy = Symbol('Persistence.MuteWorkingCopy'); +export const _binding = Symbol('Persistence.Binding'); +export const _muteCommit = Symbol('Persistence.MuteCommit'); +export const _muteWorkingCopy = Symbol('Persistence.MuteWorkingCopy'); +export const _NodePrefix = '(function (exports, require, module, __filename, __dirname) { '; +export const _NodeSuffix = '\n});'; +export const _NodeShebang = '#!/usr/bin/env node'; -Persistence.Persistence._NodePrefix = '(function (exports, require, module, __filename, __dirname) { '; -Persistence.Persistence._NodeSuffix = '\n});'; -Persistence.Persistence._NodeShebang = '#!/usr/bin/env node'; - -Persistence.Persistence.Events = { +export const Events = { BindingCreated: Symbol('BindingCreated'), BindingRemoved: Symbol('BindingRemoved') }; @@ -415,7 +411,7 @@ /** * @unrestricted */ -Persistence.PathEncoder = class { +export class PathEncoder { constructor() { /** @type {!Common.CharacterIdMap<string>} */ this._encoder = new Common.CharacterIdMap(); @@ -436,12 +432,12 @@ decode(path) { return path.split('').map(token => this._encoder.fromChar(token)).join('/'); } -}; +} /** * @unrestricted */ -Persistence.PersistenceBinding = class { +export class PersistenceBinding { /** * @param {!Workspace.UISourceCode} network * @param {!Workspace.UISourceCode} fileSystem @@ -450,7 +446,30 @@ this.network = network; this.fileSystem = fileSystem; } -}; +} -/** @type {!Persistence.Persistence} */ +/* Legacy exported object */ +self.Persistence = self.Persistence || {}; + +/* Legacy exported object */ +Persistence = Persistence || {}; + +/** @constructor */ +Persistence.Persistence = PersistenceImpl; + +Persistence.Persistence._binding = _binding; +Persistence.Persistence._muteCommit = _muteCommit; +Persistence.Persistence._muteWorkingCopy = _muteWorkingCopy; +Persistence.Persistence._NodePrefix = _NodePrefix; +Persistence.Persistence._NodeSuffix = _NodeSuffix; +Persistence.Persistence._NodeShebang = _NodeShebang; +Persistence.Persistence.Events = Events; + +/** @constructor */ +Persistence.PathEncoder = PathEncoder; + +/** @constructor */ +Persistence.PersistenceBinding = PersistenceBinding; + +/** @type {!PersistenceImpl} */ Persistence.persistence;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/PersistenceUtils.js b/third_party/blink/renderer/devtools/front_end/persistence/PersistenceUtils.js index d99ae30..58b16c7 100644 --- a/third_party/blink/renderer/devtools/front_end/persistence/PersistenceUtils.js +++ b/third_party/blink/renderer/devtools/front_end/persistence/PersistenceUtils.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -Persistence.PersistenceUtils = class { +export default class PersistenceUtils { /** * @param {!Workspace.UISourceCode} uiSourceCode * @return {string} @@ -32,7 +32,7 @@ return null; } const icon = UI.Icon.create('mediumicon-file-sync'); - icon.title = Persistence.PersistenceUtils.tooltipForUISourceCode(binding.network); + icon.title = PersistenceUtils.tooltipForUISourceCode(binding.network); // TODO(allada) This will not work properly with dark theme. if (Persistence.networkPersistenceManager.project() === binding.fileSystem.project()) { icon.style.filter = 'hue-rotate(160deg)'; @@ -45,16 +45,16 @@ } const icon = UI.Icon.create('mediumicon-file'); - icon.title = Persistence.PersistenceUtils.tooltipForUISourceCode(uiSourceCode); + icon.title = PersistenceUtils.tooltipForUISourceCode(uiSourceCode); return icon; } -}; +} /** * @extends {Common.Object} * @implements {Components.LinkDecorator} */ -Persistence.PersistenceUtils.LinkDecorator = class extends Common.Object { +export class LinkDecorator extends Common.Object { /** * @param {!Persistence.Persistence} persistence */ @@ -78,6 +78,18 @@ * @return {?UI.Icon} */ linkIcon(uiSourceCode) { - return Persistence.PersistenceUtils.iconForUISourceCode(uiSourceCode); + return PersistenceUtils.iconForUISourceCode(uiSourceCode); } -}; \ No newline at end of file +} + +/* Legacy exported object */ +self.Persistence = self.Persistence || {}; + +/* Legacy exported object */ +Persistence = Persistence || {}; + +/** @constructor */ +Persistence.PersistenceUtils = PersistenceUtils; + +/** @constructor */ +Persistence.PersistenceUtils.LinkDecorator = LinkDecorator; \ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/PlatformFileSystem.js b/third_party/blink/renderer/devtools/front_end/persistence/PlatformFileSystem.js index e37a4e5..a034bb4 100644 --- a/third_party/blink/renderer/devtools/front_end/persistence/PlatformFileSystem.js +++ b/third_party/blink/renderer/devtools/front_end/persistence/PlatformFileSystem.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -Persistence.PlatformFileSystem = class { +export default class PlatformFileSystem { /** * @param {string} path * @param {string} type @@ -191,4 +191,13 @@ supportsAutomapping() { throw new Error('Not implemented'); } -}; +} + +/* Legacy exported object */ +self.Persistence = self.Persistence || {}; + +/* Legacy exported object */ +Persistence = Persistence || {}; + +/** @constructor */ +Persistence.PlatformFileSystem = PlatformFileSystem;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/WorkspaceSettingsTab.js b/third_party/blink/renderer/devtools/front_end/persistence/WorkspaceSettingsTab.js index 748b76a..ea4faf1 100644 --- a/third_party/blink/renderer/devtools/front_end/persistence/WorkspaceSettingsTab.js +++ b/third_party/blink/renderer/devtools/front_end/persistence/WorkspaceSettingsTab.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -Persistence.WorkspaceSettingsTab = class extends UI.VBox { +export default class WorkspaceSettingsTab extends UI.VBox { constructor() { super(); this.registerRequiredCSS('persistence/workspaceSettingsTab.css'); @@ -166,4 +166,13 @@ element.remove(); } } -}; +} + +/* Legacy exported object */ +self.Persistence = self.Persistence || {}; + +/* Legacy exported object */ +Persistence = Persistence || {}; + +/** @constructor */ +Persistence.WorkspaceSettingsTab = WorkspaceSettingsTab;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/module.json b/third_party/blink/renderer/devtools/front_end/persistence/module.json index 9b3b1c94..7e529578 100644 --- a/third_party/blink/renderer/devtools/front_end/persistence/module.json +++ b/third_party/blink/renderer/devtools/front_end/persistence/module.json
@@ -43,14 +43,16 @@ "className": "Persistence.PersistenceActions.ContextMenuProvider" } ], - "scripts": [ + "scripts": [], + "modules": [ + "persistence.js", "PlatformFileSystem.js", "IsolatedFileSystem.js", "IsolatedFileSystemManager.js", "FileSystemWorkspaceBinding.js", "Automapping.js", "NetworkPersistenceManager.js", - "Persistence.js", + "PersistenceImpl.js", "PersistenceActions.js", "PersistenceUtils.js", "EditFileSystemView.js",
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/persistence.js b/third_party/blink/renderer/devtools/front_end/persistence/persistence.js new file mode 100644 index 0000000..56bbe27 --- /dev/null +++ b/third_party/blink/renderer/devtools/front_end/persistence/persistence.js
@@ -0,0 +1,31 @@ +// 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 './PlatformFileSystem.js'; + +import * as Automapping from './Automapping.js'; +import * as EditFileSystemView from './EditFileSystemView.js'; +import * as FileSystemWorkspaceBinding from './FileSystemWorkspaceBinding.js'; +import * as IsolatedFileSystem from './IsolatedFileSystem.js'; +import * as IsolatedFileSystemManager from './IsolatedFileSystemManager.js'; +import * as NetworkPersistenceManager from './NetworkPersistenceManager.js'; +import * as PersistenceActions from './PersistenceActions.js'; +import * as Persistence from './PersistenceImpl.js'; +import * as PersistenceUtils from './PersistenceUtils.js'; +import * as PlatformFileSystem from './PlatformFileSystem.js'; +import * as WorkspaceSettingsTab from './WorkspaceSettingsTab.js'; + +export { + Automapping, + EditFileSystemView, + FileSystemWorkspaceBinding, + IsolatedFileSystem, + IsolatedFileSystemManager, + NetworkPersistenceManager, + Persistence, + PersistenceActions, + PersistenceUtils, + PlatformFileSystem, + WorkspaceSettingsTab, +};
diff --git a/third_party/blink/renderer/devtools/front_end/root.js b/third_party/blink/renderer/devtools/front_end/root.js index 047d265..2459c51 100644 --- a/third_party/blink/renderer/devtools/front_end/root.js +++ b/third_party/blink/renderer/devtools/front_end/root.js
@@ -14,3 +14,6 @@ import './services/services.js'; import './workspace/workspace.js'; import './bindings/bindings.js'; +import './components/components.js'; +import './persistence/persistence.js'; +import './browser_sdk/browser_sdk.js'; \ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/ui/Action.js b/third_party/blink/renderer/devtools/front_end/ui/Action.js index 0e9cb9bbc..60d8394 100644 --- a/third_party/blink/renderer/devtools/front_end/ui/Action.js +++ b/third_party/blink/renderer/devtools/front_end/ui/Action.js
@@ -118,11 +118,11 @@ if (options) { for (const pair of options) { if (pair['value'] !== this._toggled) { - title = pair['title']; + title = ls(pair['title']); } } } - return ls(title); + return title; } /**
diff --git a/third_party/blink/renderer/devtools/tests/front_end/common/TextDictionary.ts b/third_party/blink/renderer/devtools/tests/front_end/common/TextDictionary.ts new file mode 100644 index 0000000..23320ac --- /dev/null +++ b/third_party/blink/renderer/devtools/tests/front_end/common/TextDictionary.ts
@@ -0,0 +1,85 @@ +// 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. + +const {assert} = chai; + +import {default as TextDictionary} from '../../../front_end/common/TextDictionary.js'; +import {default as Trie} from '../../../front_end/common/Trie.js'; + +describe('Text Dictionary', () => { + it('can be created with its basic attributes', () => { + const textDic = new TextDictionary(); + assert.instanceOf(textDic._words, Map, 'did not create a Map named _words'); + assert.instanceOf(textDic._index, Trie, 'did not create a Trie named _index'); + }); + + it('can add a word successfully', () => { + const textDic = new TextDictionary(); + textDic.addWord('test'); + assert.isTrue(textDic.hasWord('test'), 'word was not added successfully'); + }); + + it('can remove a word successfully', () => { + const textDic = new TextDictionary(); + textDic.addWord('test'); + assert.isTrue(textDic.hasWord('test'), 'word was not added successfully'); + textDic.removeWord('test'); + assert.isFalse(textDic.hasWord('test'), 'word was not removed successfully'); + }); + + it('returns nothing when trying to remove a word that does not exist', () => { + const textDic = new TextDictionary(); + assert.isUndefined( + textDic.removeWord('test'), 'removeWord function did not return Undefined for a word not in the dictionaty'); + }); + + it('removes a word that was added twice', () => { + const textDic = new TextDictionary(); + textDic.addWord('test'); + textDic.addWord('test'); + assert.isTrue(textDic.hasWord('test'), 'words were not added successfully'); + textDic.removeWord('test'); + assert.isTrue(textDic.hasWord('test'), 'both words were removed'); + textDic.removeWord('test'); + assert.isFalse(textDic.hasWord('test'), 'the second word was not removed successfully'); + }); + + it('retrieve words with a certain prefix', () => { + const textDic = new TextDictionary(); + textDic.addWord('test'); + textDic.addWord('ten'); + textDic.addWord('nine'); + const foundWords = textDic.wordsWithPrefix('te'); + assert.equal(foundWords[0], 'test', 'first word was not retrieved'); + assert.equal(foundWords[1], 'ten', 'second word was not retrieved'); + }); + + it('retrieve the word count for a certain word', () => { + const textDic = new TextDictionary(); + textDic.addWord('test'); + textDic.addWord('test'); + textDic.addWord('ten'); + assert.equal(textDic.wordCount('test'), 2, 'word count is incorrect'); + }); + + it('retrieve the word count for a certain word that is not in the dictionary', () => { + const textDic = new TextDictionary(); + textDic.addWord('test'); + textDic.addWord('test'); + textDic.addWord('ten'); + assert.equal(textDic.wordCount('testing'), 0, 'word count is incorrect'); + }); + + it('reset the dictionary after adding words to it', () => { + const textDic = new TextDictionary(); + textDic.addWord('test'); + textDic.addWord('test'); + textDic.addWord('ten'); + textDic.reset(); + assert.isFalse(textDic.hasWord('test'), 'first word still in the dictionary'); + assert.isFalse(textDic.hasWord('ten'), 'second word still in the dictionary'); + assert.equal(textDic.wordCount('test'), 0, 'first word still has a count'); + assert.equal(textDic.wordCount('ten'), 0, 'second word still has a count'); + }); +});
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc index d32537c..adcd0d2 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -602,7 +602,7 @@ if (IsA<HTMLMeterElement>(*GetNode())) return ax::mojom::Role::kMeter; - if (IsHTMLProgressElement(*GetNode())) + if (IsA<HTMLProgressElement>(*GetNode())) return ax::mojom::Role::kProgressIndicator; if (IsA<HTMLOutputElement>(*GetNode()))
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc index 5110563a..fbbd98d 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
@@ -1602,6 +1602,10 @@ FinalizeFrame(); scoped_refptr<StaticBitmapImage> snapshot = GetImage(kPreferNoAcceleration); + // GetImagedata is faster in Unaccelerated canvases + if (IsAccelerated()) + DisableAcceleration(); + if (!StaticBitmapImage::ConvertToArrayBufferContents( snapshot, contents, image_data_rect, color_params, IsAccelerated())) { exception_state.ThrowRangeError("Out of memory at ImageData creation");
diff --git a/third_party/blink/renderer/modules/installedapp/installed_app_controller.cc b/third_party/blink/renderer/modules/installedapp/installed_app_controller.cc index b42bbf0..ea97329 100644 --- a/third_party/blink/renderer/modules/installedapp/installed_app_controller.cc +++ b/third_party/blink/renderer/modules/installedapp/installed_app_controller.cc
@@ -8,6 +8,8 @@ #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/common/manifest/manifest.h" +#include "third_party/blink/public/mojom/installedapp/related_application.mojom-blink.h" +#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/local_frame.h"
diff --git a/third_party/blink/renderer/modules/installedapp/installed_app_controller.h b/third_party/blink/renderer/modules/installedapp/installed_app_controller.h index 76b4ede..5d1ff41 100644 --- a/third_party/blink/renderer/modules/installedapp/installed_app_controller.h +++ b/third_party/blink/renderer/modules/installedapp/installed_app_controller.h
@@ -11,8 +11,8 @@ #include "base/memory/scoped_refptr.h" #include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/mojom/installedapp/installed_app_provider.mojom-blink.h" -#include "third_party/blink/public/mojom/installedapp/related_application.mojom-blink.h" -#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h" +#include "third_party/blink/public/mojom/installedapp/related_application.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/callback_promise_adapter.h" #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h" #include "third_party/blink/renderer/core/frame/local_frame.h"
diff --git a/third_party/blink/renderer/modules/locks/lock_manager.h b/third_party/blink/renderer/modules/locks/lock_manager.h index cbb606f1..b3bfa941 100644 --- a/third_party/blink/renderer/modules/locks/lock_manager.h +++ b/third_party/blink/renderer/modules/locks/lock_manager.h
@@ -7,7 +7,7 @@ #include "base/macros.h" #include "mojo/public/cpp/bindings/remote.h" -#include "third_party/blink/public/mojom/locks/lock_manager.mojom-blink.h" +#include "third_party/blink/public/mojom/locks/lock_manager.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_string_sequence.h" #include "third_party/blink/renderer/modules/locks/lock.h" #include "third_party/blink/renderer/modules/locks/lock_options.h"
diff --git a/third_party/blink/renderer/modules/manifest/image_resource_type_converters.cc b/third_party/blink/renderer/modules/manifest/image_resource_type_converters.cc index ab10edb..9dcb4d6 100644 --- a/third_party/blink/renderer/modules/manifest/image_resource_type_converters.cc +++ b/third_party/blink/renderer/modules/manifest/image_resource_type_converters.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/modules/manifest/image_resource_type_converters.h" #include "third_party/blink/public/common/mime_util/mime_util.h" +#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h" #include "third_party/blink/public/platform/web_icon_sizes_parser.h" #include "third_party/blink/public/platform/web_size.h" #include "third_party/blink/public/platform/web_string.h"
diff --git a/third_party/blink/renderer/modules/manifest/image_resource_type_converters.h b/third_party/blink/renderer/modules/manifest/image_resource_type_converters.h index 100eee1..20c7b45c 100644 --- a/third_party/blink/renderer/modules/manifest/image_resource_type_converters.h +++ b/third_party/blink/renderer/modules/manifest/image_resource_type_converters.h
@@ -6,7 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_MANIFEST_IMAGE_RESOURCE_TYPE_CONVERTERS_H_ #include "third_party/blink/public/common/manifest/manifest.h" -#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h" +#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink-forward.h" #include "third_party/blink/renderer/modules/modules_export.h" namespace blink {
diff --git a/third_party/blink/renderer/modules/manifest/manifest_manager.h b/third_party/blink/renderer/modules/manifest/manifest_manager.h index a12a50b..0b35b078 100644 --- a/third_party/blink/renderer/modules/manifest/manifest_manager.h +++ b/third_party/blink/renderer/modules/manifest/manifest_manager.h
@@ -9,7 +9,7 @@ #include "base/macros.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "third_party/blink/public/common/manifest/manifest.h" -#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h" +#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink-forward.h" #include "third_party/blink/public/mojom/manifest/manifest_manager.mojom-blink.h" #include "third_party/blink/public/web/web_manifest_manager.h" #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
diff --git a/third_party/blink/renderer/modules/manifest/manifest_type_converters.cc b/third_party/blink/renderer/modules/manifest/manifest_type_converters.cc index a07f4771..38cc135 100644 --- a/third_party/blink/renderer/modules/manifest/manifest_type_converters.cc +++ b/third_party/blink/renderer/modules/manifest/manifest_type_converters.cc
@@ -8,7 +8,7 @@ #include "third_party/blink/public/common/manifest/manifest.h" #include "third_party/blink/public/common/manifest/manifest_mojom_traits.h" -#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
diff --git a/third_party/blink/renderer/modules/manifest/manifest_type_converters.h b/third_party/blink/renderer/modules/manifest/manifest_type_converters.h index 5acd0f6..3642dc58 100644 --- a/third_party/blink/renderer/modules/manifest/manifest_type_converters.h +++ b/third_party/blink/renderer/modules/manifest/manifest_type_converters.h
@@ -6,7 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_MANIFEST_MANIFEST_TYPE_CONVERTERS_H_ #include "third_party/blink/public/common/manifest/manifest.h" -#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h" +#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink-forward.h" #include "third_party/blink/renderer/modules/modules_export.h" namespace blink {
diff --git a/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.cc b/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.cc index 44637c4..999d75d 100644 --- a/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.cc +++ b/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.h" +#include "third_party/blink/public/mojom/mediasession/media_session.mojom-blink.h" #include "third_party/blink/public/platform/web_icon_sizes_parser.h" #include "third_party/blink/public/platform/web_size.h" #include "third_party/blink/public/platform/web_string.h"
diff --git a/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.h b/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.h index 28c0d45..ac3300b9 100644 --- a/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.h +++ b/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.h
@@ -5,7 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASESSION_MEDIA_METADATA_SANITIZER_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASESSION_MEDIA_METADATA_SANITIZER_H_ -#include "third_party/blink/public/mojom/mediasession/media_session.mojom-blink.h" +#include "third_party/blink/public/mojom/mediasession/media_session.mojom-blink-forward.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" namespace blink {
diff --git a/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.cc b/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.cc index 7076907..e4b9a61 100644 --- a/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.cc +++ b/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.cc
@@ -8,6 +8,7 @@ #include "base/location.h" #include "base/single_thread_task_runner.h" +#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink.h" #include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_source.h" #include "third_party/blink/public/platform/web_media_stream_source.h" #include "third_party/blink/public/platform/web_media_stream_track.h"
diff --git a/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.h b/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.h index 76bc8fa..49c9dd4 100644 --- a/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.h +++ b/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.h
@@ -11,7 +11,7 @@ #include "base/threading/thread_checker.h" #include "media/capture/video_capture_types.h" #include "mojo/public/cpp/bindings/remote.h" -#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink.h" +#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink-forward.h" #include "third_party/blink/public/web/modules/mediastream/media_stream_constraints_util.h" #include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h" #include "third_party/blink/renderer/modules/mediastream/apply_constraints_request.h"
diff --git a/third_party/blink/renderer/modules/mediastream/input_device_info.cc b/third_party/blink/renderer/modules/mediastream/input_device_info.cc index cf2b6e5..77403396 100644 --- a/third_party/blink/renderer/modules/mediastream/input_device_info.cc +++ b/third_party/blink/renderer/modules/mediastream/input_device_info.cc
@@ -8,6 +8,7 @@ #include "build/build_config.h" #include "media/base/sample_format.h" +#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink.h" #include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_processor_options.h" #include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_source.h" #include "third_party/blink/public/platform/web_media_stream_track.h"
diff --git a/third_party/blink/renderer/modules/mediastream/media_device_info.cc b/third_party/blink/renderer/modules/mediastream/media_device_info.cc index bddcf8c..fa1f3dd4 100644 --- a/third_party/blink/renderer/modules/mediastream/media_device_info.cc +++ b/third_party/blink/renderer/modules/mediastream/media_device_info.cc
@@ -25,6 +25,7 @@ #include "third_party/blink/renderer/modules/mediastream/media_device_info.h" +#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_object_builder.h" #include "third_party/blink/renderer/platform/bindings/script_state.h"
diff --git a/third_party/blink/renderer/modules/mediastream/media_device_info.h b/third_party/blink/renderer/modules/mediastream/media_device_info.h index a2f807e..4b47acf6 100644 --- a/third_party/blink/renderer/modules/mediastream/media_device_info.h +++ b/third_party/blink/renderer/modules/mediastream/media_device_info.h
@@ -26,7 +26,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_MEDIA_DEVICE_INFO_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_MEDIA_DEVICE_INFO_H_ -#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink.h" +#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink-forward.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 9be4862..158e3c8 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1468,6 +1468,7 @@ deps = [ ":platform_export", "//base/allocator:buildflags", + "//components/paint_preview/common", "//components/viz/client", "//components/viz/common", "//crypto",
diff --git a/third_party/blink/renderer/platform/bindings/dom_data_store.h b/third_party/blink/renderer/platform/bindings/dom_data_store.h index 0660dd18..166841fc 100644 --- a/third_party/blink/renderer/platform/bindings/dom_data_store.h +++ b/third_party/blink/renderer/platform/bindings/dom_data_store.h
@@ -229,6 +229,11 @@ DOMWorldWrapperReference(v8::Isolate* isolate, v8::Local<v8::Object> handle) : TraceWrapperV8Reference(isolate, handle) {} + ~DOMWorldWrapperReference() { + // Destruction of a reference should clear it immediately. + Clear(); + } + // Move support without write barrier. DOMWorldWrapperReference(DOMWorldWrapperReference&& other) : TraceWrapperV8Reference() {
diff --git a/third_party/blink/renderer/platform/bindings/script_wrappable.h b/third_party/blink/renderer/platform/bindings/script_wrappable.h index 4ab3e0c7..75c6845 100644 --- a/third_party/blink/renderer/platform/bindings/script_wrappable.h +++ b/third_party/blink/renderer/platform/bindings/script_wrappable.h
@@ -161,6 +161,11 @@ return main_world_wrapper_.NewLocal(isolate); } + static_assert( + std::is_trivially_destructible< + TraceWrapperV8Reference<v8::Object>>::value, + "TraceWrapperV8Reference<v8::Object> should be trivially destructible."); + TraceWrapperV8Reference<v8::Object> main_world_wrapper_; DISALLOW_COPY_AND_ASSIGN(ScriptWrappable);
diff --git a/third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h b/third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h index 53cfd74..d11fd0c3 100644 --- a/third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h +++ b/third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h
@@ -11,15 +11,6 @@ #include "third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.h" #include "v8/include/v8.h" -namespace v8 { - -template <typename T> -struct TracedGlobalTrait<v8::TracedGlobal<T>> { - static constexpr bool kRequiresExplicitDestruction = false; -}; - -} // namespace v8 - namespace blink { /** @@ -50,8 +41,8 @@ bool IsEmpty() const { return handle_.IsEmpty(); } void Clear() { handle_.Reset(); } - ALWAYS_INLINE const v8::TracedGlobal<T>& Get() const { return handle_; } - ALWAYS_INLINE v8::TracedGlobal<T>& Get() { return handle_; } + ALWAYS_INLINE const v8::TracedReference<T>& Get() const { return handle_; } + ALWAYS_INLINE v8::TracedReference<T>& Get() { return handle_; } template <typename S> const TraceWrapperV8Reference<S>& Cast() const { @@ -124,7 +115,7 @@ UnifiedHeapMarkingVisitor::WriteBarrier(UnsafeCast<v8::Value>()); } - v8::TracedGlobal<T> handle_; + v8::TracedReference<T> handle_; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/bindings/wrapper_type_info.h b/third_party/blink/renderer/platform/bindings/wrapper_type_info.h index 4b873d3..4782a9e4 100644 --- a/third_party/blink/renderer/platform/bindings/wrapper_type_info.h +++ b/third_party/blink/renderer/platform/bindings/wrapper_type_info.h
@@ -122,7 +122,7 @@ wrapper->SetWrapperClassId(wrapper_class_id); } - void ConfigureWrapper(v8::TracedGlobal<v8::Object>* wrapper) const { + void ConfigureWrapper(v8::TracedReference<v8::Object>* wrapper) const { wrapper->SetWrapperClassId(wrapper_class_id); } @@ -177,7 +177,7 @@ } template <typename T, int offset> -inline T* GetInternalField(const v8::TracedGlobal<v8::Object>& global) { +inline T* GetInternalField(const v8::TracedReference<v8::Object>& global) { DCHECK_LT(offset, v8::Object::InternalFieldCount(global)); return reinterpret_cast<T*>( v8::Object::GetAlignedPointerFromInternalField(global, offset)); @@ -198,7 +198,7 @@ } inline ScriptWrappable* ToScriptWrappable( - const v8::TracedGlobal<v8::Object>& wrapper) { + const v8::TracedReference<v8::Object>& wrapper) { return GetInternalField<ScriptWrappable, kV8DOMWrapperObjectIndex>(wrapper); } @@ -219,7 +219,8 @@ return GetInternalField<void, kV8DOMWrapperObjectIndex>(wrapper); } -inline void* ToUntypedWrappable(const v8::TracedGlobal<v8::Object>& wrapper) { +inline void* ToUntypedWrappable( + const v8::TracedReference<v8::Object>& wrapper) { return GetInternalField<void, kV8DOMWrapperObjectIndex>(wrapper); } @@ -233,7 +234,7 @@ } inline const WrapperTypeInfo* ToWrapperTypeInfo( - const v8::TracedGlobal<v8::Object>& wrapper) { + const v8::TracedReference<v8::Object>& wrapper) { return GetInternalField<WrapperTypeInfo, kV8DOMWrapperTypeIndex>(wrapper); }
diff --git a/third_party/blink/renderer/platform/graphics/DEPS b/third_party/blink/renderer/platform/graphics/DEPS index 5647769..37eff60 100644 --- a/third_party/blink/renderer/platform/graphics/DEPS +++ b/third_party/blink/renderer/platform/graphics/DEPS
@@ -11,6 +11,7 @@ "+base/barrier_closure.h", "+base/callback_helpers.h", "+cc", + "+components/paint_preview/common", "+components/viz/client", "+components/viz/common", "+gpu/config",
diff --git a/third_party/blink/renderer/platform/graphics/graphics_context.cc b/third_party/blink/renderer/platform/graphics/graphics_context.cc index a822cd3..ee1ce96 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_context.cc +++ b/third_party/blink/renderer/platform/graphics/graphics_context.cc
@@ -30,6 +30,7 @@ #include "base/optional.h" #include "build/build_config.h" +#include "components/paint_preview/common/paint_preview_tracker.h" #include "skia/ext/platform_canvas.h" #include "third_party/blink/renderer/platform/fonts/text_run_paint_info.h" #include "third_party/blink/renderer/platform/geometry/float_rect.h" @@ -89,12 +90,14 @@ GraphicsContext::GraphicsContext(PaintController& paint_controller, DisabledMode disable_context_or_painting, - printing::MetafileSkia* metafile) + printing::MetafileSkia* metafile, + paint_preview::PaintPreviewTracker* tracker) : canvas_(nullptr), paint_controller_(paint_controller), paint_state_stack_(), paint_state_index_(0), metafile_(metafile), + tracker_(tracker), #if DCHECK_IS_ON() layer_count_(0), disable_destruction_checks_(false), @@ -102,6 +105,7 @@ disabled_state_(disable_context_or_painting), device_scale_factor_(1.0f), printing_(false), + is_painting_preview_(false), in_drawing_recorder_(false) { // FIXME: Do some tests to determine how many states are typically used, and // allocate several here. @@ -1368,6 +1372,12 @@ return; DCHECK(canvas_); + // Intercept URL rects when painting previews. + if (IsPaintingPreview() && tracker_) { + tracker_->AnnotateLink(link.GetString().Utf8(), dest_rect); + return; + } + sk_sp<SkData> url(SkData::MakeWithCString(link.GetString().Utf8().c_str())); canvas_->Annotate(cc::PaintCanvas::AnnotationType::URL, dest_rect, std::move(url)); @@ -1379,6 +1389,12 @@ return; DCHECK(canvas_); + // Intercept URL rects when painting previews. + if (IsPaintingPreview() && tracker_) { + tracker_->AnnotateLink(dest_name.Utf8(), rect); + return; + } + sk_sp<SkData> sk_dest_name(SkData::MakeWithCString(dest_name.Utf8().c_str())); canvas_->Annotate(cc::PaintCanvas::AnnotationType::LINK_TO_DESTINATION, rect, std::move(sk_dest_name));
diff --git a/third_party/blink/renderer/platform/graphics/graphics_context.h b/third_party/blink/renderer/platform/graphics/graphics_context.h index 950e1f4..5a42e810 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_context.h +++ b/third_party/blink/renderer/platform/graphics/graphics_context.h
@@ -53,6 +53,10 @@ class SkRRect; struct SkRect; +namespace paint_preview { +class PaintPreviewTracker; +} // namespace paint_preview + namespace blink { class FloatRect; @@ -74,7 +78,8 @@ explicit GraphicsContext(PaintController&, DisabledMode = kNothingDisabled, - printing::MetafileSkia* = nullptr); + printing::MetafileSkia* = nullptr, + paint_preview::PaintPreviewTracker* = nullptr); ~GraphicsContext(); @@ -161,6 +166,19 @@ bool Printing() const { return printing_; } void SetPrinting(bool printing) { printing_ = printing; } + // Returns if the context is saving a paint preview instead of displaying. + // In such cases, clipping should not occur. + bool IsPaintingPreview() const { return is_painting_preview_; } + void SetIsPaintingPreview(bool is_painting_preview) { + is_painting_preview_ = is_painting_preview; + } + + // Returns if the context is printing or painting a preview. Many of the + // behaviors required for printing and paint previews are shared. + bool IsPrintingOrPaintingPreview() const { + return Printing() || IsPaintingPreview(); + } + SkColorFilter* GetColorFilter() const; void SetColorFilter(ColorFilter); // ---------- End state management methods ----------------- @@ -498,6 +516,7 @@ PaintRecorder paint_recorder_; printing::MetafileSkia* metafile_; + paint_preview::PaintPreviewTracker* tracker_; #if DCHECK_IS_ON() int layer_count_; @@ -512,6 +531,7 @@ DarkModeFilter dark_mode_filter_; unsigned printing_ : 1; + unsigned is_painting_preview_ : 1; unsigned in_drawing_recorder_ : 1; DISALLOW_COPY_AND_ASSIGN(GraphicsContext);
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.cc b/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.cc index 6b690463..b7b3241 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.cc +++ b/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.cc
@@ -10,9 +10,11 @@ namespace blink { -PaintRecordBuilder::PaintRecordBuilder(printing::MetafileSkia* metafile, - GraphicsContext* containing_context, - PaintController* paint_controller) +PaintRecordBuilder::PaintRecordBuilder( + printing::MetafileSkia* metafile, + GraphicsContext* containing_context, + PaintController* paint_controller, + paint_preview::PaintPreviewTracker* tracker) : paint_controller_(nullptr) { GraphicsContext::DisabledMode disabled_mode = GraphicsContext::kNothingDisabled; @@ -30,12 +32,13 @@ paint_controller_->UpdateCurrentPaintChunkProperties( base::nullopt, PropertyTreeState::Root()); - context_ = std::make_unique<GraphicsContext>(*paint_controller_, - disabled_mode, metafile); + context_ = std::make_unique<GraphicsContext>( + *paint_controller_, disabled_mode, metafile, tracker); if (containing_context) { context_->SetDarkMode(containing_context->dark_mode_settings()); context_->SetDeviceScaleFactor(containing_context->DeviceScaleFactor()); context_->SetPrinting(containing_context->Printing()); + context_->SetIsPaintingPreview(containing_context->IsPaintingPreview()); } }
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.h b/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.h index 521dd79c..42631cf 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.h +++ b/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.h
@@ -19,12 +19,15 @@ class PaintCanvas; } +namespace paint_preview { +class PaintPreviewTracker; +} + namespace blink { class GraphicsContext; class PaintController; class PLATFORM_EXPORT PaintRecordBuilder final : public DisplayItemClient { - public: // Constructs a new builder for the resulting paint record. If |metadata| // is specified, that metadata is propagated to the builder's internal canvas. @@ -39,7 +42,8 @@ // CompositeAfterPaint. PaintRecordBuilder(printing::MetafileSkia* metafile = nullptr, GraphicsContext* containing_context = nullptr, - PaintController* = nullptr); + PaintController* = nullptr, + paint_preview::PaintPreviewTracker* tracker = nullptr); ~PaintRecordBuilder() override; GraphicsContext& Context() { return *context_; }
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc index 6ba306a5..9e803dcc 100644 --- a/third_party/blink/renderer/platform/heap/thread_state.cc +++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -1288,11 +1288,15 @@ value->Reset(); } - void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>& value) final { + void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>&) final { + CHECK(false) << "Blink does not use v8::TracedGlobal."; + } + + void VisitTracedReference(const v8::TracedReference<v8::Value>& value) final { // TODO(mlippautz): Avoid const_cast after changing the API to allow - // modificaton of the TracedGlobal handle. - if (InDeadObject(&const_cast<v8::TracedGlobal<v8::Value>&>(value))) - const_cast<v8::TracedGlobal<v8::Value>&>(value).Reset(); + // modificaton of the handle. + if (InDeadObject(&const_cast<v8::TracedReference<v8::Value>&>(value))) + const_cast<v8::TracedReference<v8::Value>&>(value).Reset(); } private: @@ -1404,11 +1408,15 @@ VisitSlot(value, sizeof(v8::Persistent<v8::Value>)); } - void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>& value) final { + void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>&) final { + CHECK(false) << "Blink does not use v8::TracedGlobal."; + } + + void VisitTracedReference(const v8::TracedReference<v8::Value>& value) final { // TODO(mlippautz): Avoid const_cast after changing the API to allow - // modificaton of the TracedGlobal handle. - VisitSlot(&const_cast<v8::TracedGlobal<v8::Value>&>(value), - sizeof(v8::TracedGlobal<v8::Value>)); + // modificaton of the handle. + VisitSlot(&const_cast<v8::TracedReference<v8::Value>&>(value), + sizeof(v8::TracedReference<v8::Value>)); } private:
diff --git a/third_party/blink/renderer/platform/heap/unified_heap_controller.cc b/third_party/blink/renderer/platform/heap/unified_heap_controller.cc index c76a311..c4b5172 100644 --- a/third_party/blink/renderer/platform/heap/unified_heap_controller.cc +++ b/third_party/blink/renderer/platform/heap/unified_heap_controller.cc
@@ -143,16 +143,19 @@ return is_tracing_done_; } -bool UnifiedHeapController::IsRootForNonTracingGCInternal( - const v8::TracedGlobal<v8::Value>& handle) { +namespace { + +bool IsRootForNonTracingGCInternal( + const v8::TracedReference<v8::Value>& handle) { const uint16_t class_id = handle.WrapperClassId(); - // Stand-alone TracedGlobal reference or kCustomWrappableId. Keep as root as + // Stand-alone reference or kCustomWrappableId. Keep as root as // we don't know better. if (class_id != WrapperTypeInfo::kNodeClassId && class_id != WrapperTypeInfo::kObjectClassId) return true; - const v8::TracedGlobal<v8::Object>& traced = handle.As<v8::Object>(); + const v8::TracedReference<v8::Object>& traced = + handle.template As<v8::Object>(); if (ToWrapperTypeInfo(traced)->IsActiveScriptWrappable() && ToScriptWrappable(traced)->HasPendingActivity()) { return true; @@ -165,8 +168,10 @@ return false; } +} // namespace + void UnifiedHeapController::ResetHandleInNonTracingGC( - const v8::TracedGlobal<v8::Value>& handle) { + const v8::TracedReference<v8::Value>& handle) { const uint16_t class_id = handle.WrapperClassId(); // Only consider handles that have not been treated as roots, see // IsRootForNonTracingGCInternal. @@ -174,15 +179,21 @@ class_id != WrapperTypeInfo::kObjectClassId) return; - const v8::TracedGlobal<v8::Object>& traced = handle.As<v8::Object>(); + const v8::TracedReference<v8::Object>& traced = handle.As<v8::Object>(); ToScriptWrappable(traced)->UnsetWrapperIfAny(); } bool UnifiedHeapController::IsRootForNonTracingGC( - const v8::TracedGlobal<v8::Value>& handle) { + const v8::TracedReference<v8::Value>& handle) { return IsRootForNonTracingGCInternal(handle); } +bool UnifiedHeapController::IsRootForNonTracingGC( + const v8::TracedGlobal<v8::Value>& handle) { + CHECK(false) << "Blink does not use v8::TracedGlobal."; + return false; +} + void UnifiedHeapController::ReportBufferedAllocatedSizeIfPossible() { // Avoid reporting to V8 in the following conditions as that may trigger GC // finalizations where not allowed.
diff --git a/third_party/blink/renderer/platform/heap/unified_heap_controller.h b/third_party/blink/renderer/platform/heap/unified_heap_controller.h index f8ca95c..5ec55f9 100644 --- a/third_party/blink/renderer/platform/heap/unified_heap_controller.h +++ b/third_party/blink/renderer/platform/heap/unified_heap_controller.h
@@ -45,8 +45,9 @@ void RegisterV8References(const std::vector<std::pair<void*, void*>>&) final; bool AdvanceTracing(double) final; bool IsTracingDone() final; + bool IsRootForNonTracingGC(const v8::TracedReference<v8::Value>&) final; bool IsRootForNonTracingGC(const v8::TracedGlobal<v8::Value>&) final; - void ResetHandleInNonTracingGC(const v8::TracedGlobal<v8::Value>&) final; + void ResetHandleInNonTracingGC(const v8::TracedReference<v8::Value>&) final; ThreadState* thread_state() const { return thread_state_; } @@ -59,9 +60,6 @@ void DecreaseAllocatedSpace(size_t) final {} private: - static bool IsRootForNonTracingGCInternal( - const v8::TracedGlobal<v8::Value>& handle); - void ReportBufferedAllocatedSizeIfPossible(); ThreadState* const thread_state_;
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc index b4d6e5d2..55ec5e8 100644 --- a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc +++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc
@@ -265,10 +265,11 @@ } std::vector<uint32_t> spatial_layer_frame_size; - for (int i = 0;; i++) { + size_t max_sl_index = input_image.SpatialIndex().value_or(0); + for (size_t i = 0; i <= max_sl_index; i++) { auto frame_size = input_image.SpatialLayerFrameSize(i); if (!frame_size) - break; + continue; spatial_layer_frame_size.push_back(*frame_size); }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc index 237a11b7..ae46068 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
@@ -14,6 +14,7 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" +#include "base/task/post_task.h" #include "base/task/sequence_manager/test/fake_task.h" #include "base/task/sequence_manager/test/sequence_manager_for_test.h" #include "base/task/task_executor.h" @@ -2124,6 +2125,16 @@ run_loop.Run(); } +TEST_P(MainThreadSchedulerImplTest, CurrentThread) { + EXPECT_EQ(scheduler_->DeprecatedDefaultTaskRunner(), + base::CreateSingleThreadTaskRunner({base::CurrentThread()})); + + // base::TaskPriority is currently ignored in blink. + EXPECT_EQ(scheduler_->DeprecatedDefaultTaskRunner(), + base::CreateSingleThreadTaskRunner( + {base::CurrentThread(), base::TaskPriority::BEST_EFFORT})); +} + class MainThreadSchedulerImplWithMessageLoopTest : public MainThreadSchedulerImplTest { public:
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 7f7551bd..3b3a77f 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
@@ -256,7 +256,7 @@ 'cc::LayerPositionConstraint', 'cc::OverscrollBehavior', 'cc::Scrollbar', - 'cc::ScrollbarLayerInterface', + 'cc::ScrollbarLayerBase', 'cc::ScrollbarOrientation', 'cc::ScrollbarPart', 'cc::StickyPositionConstraint',
diff --git a/third_party/blink/web_tests/MSANExpectations b/third_party/blink/web_tests/MSANExpectations index 5ff0fd8..afed031 100644 --- a/third_party/blink/web_tests/MSANExpectations +++ b/third_party/blink/web_tests/MSANExpectations
@@ -158,6 +158,7 @@ crbug.com/856601 [ Linux ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/idlharness.https.window.html [ Pass Timeout ] crbug.com/856601 [ Linux ] virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Timeout Pass ] crbug.com/856601 [ Linux ] virtual/service-worker-servicification/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Timeout Pass ] +crbug.com/856601 [ Linux ] virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Pass Timeout ] crbug.com/856601 [ Linux ] virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Pass Failure Timeout ] crbug.com/856601 [ Linux ] external/wpt/fetch/api/idl.any.sharedworker.html [ Pass Timeout ] crbug.com/856601 [ Linux ] external/wpt/fetch/cors-rfc1918/idlharness.tentative.https.any.serviceworker.html [ Pass Timeout ] @@ -275,6 +276,8 @@ crbug.com/856601 [ Linux ] virtual/omt-worker-fetch/external/wpt/fetch/api/idl.any.serviceworker.html [ Pass Timeout ] crbug.com/856601 [ Linux ] virtual/omt-worker-fetch/external/wpt/fetch/api/idl.any.worker.html [ Pass Timeout ] crbug.com/856601 [ Linux ] virtual/scalefactor200/external/wpt/css/filter-effects/interfaces.any.worker.html [ Pass Timeout ] +crbug.com/856601 [ Linux ] external/wpt/webrtc-identity/idlharness.https.window.html [ Pass Timeout ] +crbug.com/856601 [ Linux ] virtual/omt-worker-fetch/external/wpt/fetch/api/idlharness.any.worker.html [ Pass Timeout ] # Sheriff 2019-06-28 crbug.com/856601 [ Linux ] external/wpt/battery-status/battery-interface-idlharness.https.window.html [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests index 3dacf150..94fd890 100644 --- a/third_party/blink/web_tests/NeverFixTests +++ b/third_party/blink/web_tests/NeverFixTests
@@ -1920,6 +1920,9 @@ virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/fetch-event-is-reload-navigation-manual.https.html [ WontFix ] virtual/omt-worker-fetch/external/wpt/xhr/send-authentication-existing-session-manual.htm [ WontFix ] virtual/omt-worker-fetch/external/wpt/xhr/send-authentication-prompt-2-manual.htm [ WontFix ] +virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/fetch-event-is-history-backward-navigation-manual.https.html [ WontFix ] +virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/fetch-event-is-history-forward-navigation-manual.https.html [ WontFix ] +virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/fetch-event-is-reload-navigation-manual.https.html [ WontFix ] virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechRecognition-abort-manual.https.html [ WontFix ] virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechRecognition-onerror-manual.https.html [ WontFix ] virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechRecognition-onresult-manual.https.html [ WontFix ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index bc538b4288..b7651de 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -199,6 +199,10 @@ crbug.com/974652 [ Debug ] virtual/gpu/fast/canvas/OffscreenCanvas-copyImage.html [ Pass Failure ] crbug.com/974652 [ Debug ] fast/canvas/OffscreenCanvas-copyImage.html [ Pass Failure ] +crbug.com/1011060 virtual/gpu/fast/canvas/canvas-getImageData-smooth.html [ Pass Failure ] +crbug.com/1011060 virtual/gpu/fast/canvas/bug382588.html [ Pass Failure ] +crbug.com/1011060 virtual/gpu/fast/canvas/canvas-lost-gpu-context.html [ Pass Failure ] + crbug.com/974666 [ Mac10.13 ] http/tests/misc/object-embedding-svg-delayed-size-negotiation-2.htm [ Pass Failure ] crbug.com/974720 [ Mac10.13 ] fast/text/firstline/capitalize-transform-2.html [ Pass Crash ] crbug.com/974720 [ Mac10.13 ] fast/text/firstline/capitalize-transform.html [ Pass Crash ] @@ -834,181 +838,14 @@ # crbug.com/591099 [ Mac10.11 ] media/track/track-cue-rendering-position-auto-rtl.html [ Failure ] crbug.com/591099 [ Mac10.11 ] virtual/audio-service/media/track/track-cue-rendering-position-auto-rtl.html [ Failure ] crbug.com/591099 [ Mac10.11 ] virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/basic/inheritance.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/acid_test.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/border_bottom.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/border_bottom_width_inline.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/border_inline.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/border_left_width_inline.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/border_style_inline.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/border_top_width.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/clear_float.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/float.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/float_margin.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/margin_inline.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/margin_left.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/margin_top_inline.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/padding_left.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/padding_right.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/box_properties/padding_top_inline.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/classification/list_style.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/classification/list_style_image.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/classification/list_style_type.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/color_and_background/background.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/formatting_model/floating_elements.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/formatting_model/horizontal_formatting.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css1/units/percentage_units.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/20110323/table-height-algorithm-024.htm [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t040302-c61-phys-len-00-b.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t051103-dom-hover-01-c-io.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t0602-c13-inh-underlin-00-e.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t0805-c5521-brdr-l-00-a.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t0805-c5521-ibrdr-l-00-a.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t0805-c5522-brdr-02-e.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t0805-c5522-ibrdr-00-a.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t0905-c414-flt-04-c.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t0905-c414-flt-wrap-01-d-g.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t0905-c5525-fltcont-00-d-g.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t0905-c5525-fltwrap-00-b.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t1004-c5524-width-00-b-g.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t1202-counter-08-b.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t1202-counter-15-b.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t1202-counters-13-b.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t1205-c561-list-displ-00-b.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t1205-c565-list-pos-00-b.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t1205-c566-list-stl-01-c-g.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t1508-c527-font-06-b.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css2.1/t1508-c527-font-10-c.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/css3-modsel-35.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/font-feature-settings-rendering.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-168a.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-20.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-35.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-39.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-42.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-42a.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-5.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-7.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-78b.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-80.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-166.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-168a.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-20.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-3.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-39.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-42.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-7.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-153.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-166a.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-168.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-20.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-22.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-3.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-42a.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-66.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-78b.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-79.xml [ Failure ] -crbug.com/591099 [ Mac10.13 ] editing/selection/4402375.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] editing/selection/5232159.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] editing/selection/line-wrap-1.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] editing/selection/select-text-overflow-ellipsis-mixed-in-rtl.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] editing/selection/select-text-overflow-ellipsis.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] external/wpt/css/css-position/position-absolute-replaced-minmax.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] external/wpt/css/css-rhythm/line-height-step-dynamic-001.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/backgrounds/animated-gif-as-background-rounded.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/backgrounds/repeat/negative-offset-repeat-transformed.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/backgrounds/repeat/negative-offset-repeat.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/backgrounds/selection-background-color-of-image-list-style.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/basic/015.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/basic/adding-near-anonymous-block.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/float/002.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/float/028.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/float/independent-align-positioning.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/float/nopaint-after-layer-destruction2.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/006.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/015.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/017.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/019.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/020.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/059.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/103.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/block-inside-inline/005.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/block-inside-inline/016.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/positioning/001.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/positioning/058.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/positioning/absolute-in-inline-rtl-3.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/positioning/absolute-in-inline-rtl.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/positioning/auto/004.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/positioning/auto/006.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/positioning/auto/vertical-rl/004.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/positioning/auto/vertical-rl/006.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/block/positioning/vertical-lr/001.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/borders/border-image-scaled.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/borders/inline-mask-overlay-image-outset.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/borders/inline-mask-overlay-image.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/borders/outline-alpha-block.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/borders/rtl-border-01.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/borders/rtl-border-05.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/canvas/image-object-in-canvas.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/clip/007.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/clip/009.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/clip/010.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/compact/003.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css-generated-content/007.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css-generated-content/009.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css-generated-content/after-duplicated-after-split.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css-generated-content/before-with-first-letter.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css-generated-content/table-cell-before-after-child-add.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/005.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/ZeroOpacityLayers.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/absolute-poition-in-rtl-parent.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/clip-zooming.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/color-correction-on-text-shadow.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/color-correction.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/compare-content-style.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/content/content-quotes-01.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/content/content-quotes-05.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/create_element_align.xhtml [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/find-next-layer.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/first-letter-capitalized.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/first-letter-float-after-float.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/focus-ring-outline-color.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/image-orientation/image-orientation-default.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/last-of-type-pseudo-class.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/only-child-pseudo-class.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/only-of-type-pseudo-class.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/pendingStylesheetFontSize.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/resize-corner-tracking-transformed-iframe.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/resize-corner-tracking-transformed.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/resize-corner-tracking.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/shadow-multiple.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/simple-selector-chain-parsing.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/text-overflow-ellipsis-text-align-center.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/text-overflow-ellipsis-text-align-justify.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/text-overflow-ellipsis-text-align-right.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/text-overflow-ellipsis.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/universal-hover-quirk.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/vertical-text-overflow-ellipsis-text-align-justify.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/vertical-text-overflow-ellipsis-text-align-left.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css/visibility-hit-test.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css3-text/css3-text-justify/text-justify-8bits.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/css3-text/css3-text-justify/text-justify-distribute.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/deprecated-flexbox/009-horizontal.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/deprecated-flexbox/010.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/deprecated-flexbox/018.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/deprecated-flexbox/023.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/dom/Range/collapsed-range-bounding-client-rect.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/dom/children-nodes.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/dom/nodesFromRect/nodesFromRect-basic.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/dynamic/007.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/dynamic/012.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/dynamic/insert-before-table-part-in-continuation.html [ Failure ] -crbug.com/591099 [ Mac10.13 ] fast/dynamic/noninlinebadness.html [ Failure ] crbug.com/591099 [ Mac10.13 ] fast/dynamic/outerHTML-doc.html [ Failure ] #crbug.com/591099 [ Mac ] fast/events/before-unload-return-value-from-listener.html [ Crash Timeout ] +crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-80.html [ Failure ] +crbug.com/591099 [ Mac10.13 ] editing/selection/5232159.html [ Failure ] +crbug.com/591099 [ Mac10.13 ] css2.1/t040302-c61-phys-len-00-b.html [ Failure ] +crbug.com/591099 [ Mac10.13 ] css2.1/t1205-c561-list-displ-00-b.html [ Failure ] +crbug.com/591099 [ Mac10.13 ] css2.1/t1202-counter-08-b.html [ Failure ] +crbug.com/591099 [ Mac10.13 ] css2.1/t0805-c5522-brdr-02-e.html [ Failure ] crbug.com/591099 [ Mac10.13 ] fast/forms/basic-inputs.html [ Failure ] crbug.com/591099 [ Mac10.13 ] fast/forms/button/button-inner-block-reuse.html [ Failure ] crbug.com/591099 [ Mac10.13 ] fast/forms/formmove2.html [ Failure ] @@ -2951,6 +2788,7 @@ # Failure messages are unstable so we cannot create baselines. crbug.com/832071 external/wpt/service-workers/service-worker/worker-client-id.https.html [ Failure ] crbug.com/832071 virtual/navigation-mojo-response/external/wpt/service-workers/service-worker/worker-client-id.https.html [ Failure ] +crbug.com/832071 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/worker-client-id.https.html [ Failure ] crbug.com/832071 virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/worker-client-id.https.html [ Failure ] # failures in external/wpt/css/css-animations/ and web-animations/ from Mozilla tests @@ -3283,6 +3121,7 @@ crbug.com/626703 external/wpt/service-workers/service-worker/ready.https.html [ Timeout ] crbug.com/626703 virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/ready.https.html [ Timeout ] crbug.com/626703 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/ready.https.html [ Timeout ] +crbug.com/626703 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/ready.https.html [ Timeout ] crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html [ Failure ] crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html [ Failure ] crbug.com/626703 [ Win ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html [ Failure ] @@ -4435,11 +4274,13 @@ crbug.com/691944 external/wpt/service-workers/service-worker/update-after-oneday.https.html [ Skip ] crbug.com/691944 virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/update-after-oneday.https.html [ Skip ] crbug.com/691944 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/update-after-oneday.https.html [ Skip ] +crbug.com/691944 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/update-after-oneday.https.html [ Skip ] # These tests (erroneously) see a platform-specific User-Agent header crbug.com/595993 external/wpt/service-workers/service-worker/fetch-header-visibility.https.html [ Failure ] crbug.com/595993 virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/fetch-header-visibility.https.html [ Failure ] crbug.com/595993 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/fetch-header-visibility.https.html [ Failure ] +crbug.com/595993 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/fetch-header-visibility.https.html [ Failure ] crbug.com/619427 [ Mac ] fast/overflow/overflow-height-float-not-removed-crash3.html [ Pass Failure ] @@ -4697,6 +4538,7 @@ # Service worker updates need to handle redirect appropriately. crbug.com/889798 external/wpt/service-workers/service-worker/import-scripts-redirect.https.html [ Skip ] +crbug.com/889798 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/import-scripts-redirect.https.html [ Skip ] crbug.com/889798 virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/import-scripts-redirect.https.html [ Skip ] crbug.com/889798 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/import-scripts-redirect.https.html [ Skip ] @@ -5264,6 +5106,8 @@ crbug.com/873873 external/wpt/service-workers/service-worker/fetch-canvas-tainting-video.https.html [ Timeout Pass ] crbug.com/873873 external/wpt/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html [ Timeout Pass ] +crbug.com/873873 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/fetch-canvas-tainting-video.https.html [ Timeout Pass ] +crbug.com/873873 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html [ Timeout Pass ] crbug.com/875884 [ Linux ] lifecycle/background-change-lifecycle-count.html [ Pass Failure ] crbug.com/875884 [ Win ] lifecycle/background-change-lifecycle-count.html [ Pass Failure ] @@ -5582,6 +5426,7 @@ crbug.com/933880 external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ] crbug.com/933880 virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ] crbug.com/933880 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ] +crbug.com/933880 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ] crbug.com/933880 http/tests/inspector-protocol/network/interception-take-stream.js [ Failure ] crbug.com/933880 http/tests/inspector-protocol/network/xhr-interception-auth-fail.js [ Failure ] # This passes in content_shell but not in chrome with network service disabled, @@ -6180,11 +6025,3 @@ crbug.com/1010655 virtual/disable-deferred-rendering/fast/canvas/canvas-lost-gpu-context.html [ Failure ] crbug.com/1010657 [ Mac ] virtual/disable-deferred-rendering/fast/canvas/image-object-in-canvas.html [ Failure ] crbug.com/1011723 virtual/disable-deferred-rendering/fast/canvas/OffscreenCanvas-copyImage.html [ Failure ] - -# Sheriff 2019-10-04 -crbug.com/1011191 [ Mac ] paint/invalidation/svg/use-clipped-hit.svg [ Pass Failure ] -crbug.com/1011188 [ Mac ] paint/invalidation/svg/svg-background-partial-redraw.html [ Pass Failure ] - -# Sheriff 2019-10-09 -crbug.com/1012638 [ Mac ] paint/invalidation/push-block-with-first-line.html [ Pass Failure ] -
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index eaa7f39..ef89c18 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1090,6 +1090,11 @@ "args": ["--enable-blink-features=CSSVariables2AtProperty"] }, { + "prefix": "cache-storage-sequence", + "base": "external/wpt/service-workers", + "args": ["--disable-features=CacheStorageSequence"] + }, + { "prefix": "conditional-appcache-delay", "base": "http/tests/loading/appcache-delay", "args": ["--enable-features=VerifyHTMLFetchedFromAppCacheBeforeDelay"]
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 11a5480..e9d33fde 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
@@ -124933,9 +124933,6 @@ "common/canvas-tests.js.headers": [ [] ], - "common/css-red.txt": [ - [] - ], "common/domain-setter.sub.html": [ [] ], @@ -125182,15 +125179,6 @@ "compat/webkit-text-fill-color-property-006-ref.html": [ [] ], - "compression/pako/LICENSE": [ - [] - ], - "compression/pako/README": [ - [] - ], - "compression/pako/pako_inflate.min.js": [ - [] - ], "console/META.yml": [ [] ], @@ -151615,6 +151603,12 @@ "encoding/OWNERS": [ [] ], + "encoding/encodeInto.any-expected.txt": [ + [] + ], + "encoding/encodeInto.any.worker-expected.txt": [ + [] + ], "encoding/eof-shift_jis-ref.html": [ [] ], @@ -152164,12 +152158,36 @@ "encoding/resources/utf-32-little-endian-nobom.xml": [ [] ], + "encoding/streams/decode-utf8.any-expected.txt": [ + [] + ], + "encoding/streams/decode-utf8.any.serviceworker-expected.txt": [ + [] + ], + "encoding/streams/decode-utf8.any.sharedworker-expected.txt": [ + [] + ], + "encoding/streams/decode-utf8.any.worker-expected.txt": [ + [] + ], "encoding/streams/resources/readable-stream-from-array.js": [ [] ], "encoding/streams/resources/readable-stream-to-array.js": [ [] ], + "encoding/textdecoder-copy.any-expected.txt": [ + [] + ], + "encoding/textdecoder-copy.any.worker-expected.txt": [ + [] + ], + "encoding/textdecoder-streaming.any-expected.txt": [ + [] + ], + "encoding/textdecoder-streaming.any.worker-expected.txt": [ + [] + ], "encrypted-media/META.yml": [ [] ], @@ -159217,6 +159235,9 @@ "html/semantics/document-metadata/the-style-element/html_style_in_comment-ref.html": [ [] ], + "html/semantics/document-metadata/the-style-element/support/css-red.txt": [ + [] + ], "html/semantics/embedded-content/META.yml": [ [] ], @@ -198339,68 +198360,6 @@ {} ] ], - "compression/compression-stream.any.js": [ - [ - "compression/compression-stream.any.html", - { - "script_metadata": [ - [ - "global", - "worker" - ], - [ - "script", - "pako/pako_inflate.min.js" - ] - ] - } - ], - [ - "compression/compression-stream.any.serviceworker.html", - { - "script_metadata": [ - [ - "global", - "worker" - ], - [ - "script", - "pako/pako_inflate.min.js" - ] - ] - } - ], - [ - "compression/compression-stream.any.sharedworker.html", - { - "script_metadata": [ - [ - "global", - "worker" - ], - [ - "script", - "pako/pako_inflate.min.js" - ] - ] - } - ], - [ - "compression/compression-stream.any.worker.html", - { - "script_metadata": [ - [ - "global", - "worker" - ], - [ - "script", - "pako/pako_inflate.min.js" - ] - ] - } - ] - ], "compression/decompression-bad-chunks.any.js": [ [ "compression/decompression-bad-chunks.any.html", @@ -338521,7 +338480,7 @@ "support" ], "common/README.md": [ - "bbb651d4aff5689628a713e1ae904ee56c03a6e2", + "43bec9eb0af2d648969c9f32983963f09548f73d", "support" ], "common/arrays.js": [ @@ -338572,10 +338531,6 @@ "6805c323df5a975231648b830e33ce183c3cbbd3", "support" ], - "common/css-red.txt": [ - "9ef04cbd12daf19dd8810cae8844bd22f3264926", - "support" - ], "common/domain-setter.sub.html": [ "ad3b9f8b80847ff811aa8f3083dc9c5fcf221f05", "support" @@ -338992,10 +338947,6 @@ "1d3965fca6769c70bc02308a4c70b4e58c8990e5", "reftest" ], - "compression/compression-stream.any.js": [ - "d143241e7606b240908ef366b82b0b9c56b2d59d", - "testharness" - ], "compression/decompression-bad-chunks.any.js": [ "b8954905cbfce79893152e32200cc16e6c3f815b", "testharness" @@ -339024,18 +338975,6 @@ "06c421a82071651429e831daaa20e945e8011efb", "testharness" ], - "compression/pako/LICENSE": [ - "a934ef8db478453e38b2f29af67610916fa9fc99", - "support" - ], - "compression/pako/README": [ - "96028388ebb9d556db918bbe234e8b971734824a", - "support" - ], - "compression/pako/pako_inflate.min.js": [ - "a191a78a8956cddf28adaf7542631123014a04bf", - "support" - ], "console/META.yml": [ "60c95d0d579c57eee3c2c0b47004b371c24d2e56", "support" @@ -419429,7 +419368,7 @@ "testharness" ], "css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html": [ - "062edaf8f2dbe99012483f5a10bbf9c2e98fccac", + "e308c7c004f8415a5bf1ee886b681fb84780717c", "testharness" ], "css/cssom-view/scrollLeftTop-expected.txt": [ @@ -432852,10 +432791,18 @@ "7260b6b155b13de3961d170c3e2868042e229305", "testharness" ], + "encoding/encodeInto.any-expected.txt": [ + "adb30e4f0c26afb144d946e6cd655ca9e368bb1e", + "support" + ], "encoding/encodeInto.any.js": [ - "8b3e743f71b9ce6869810385403e0a7e9c3067c6", + "7ea0b80eeb458d48d0e00e0122ded86a0d26bb81", "testharness" ], + "encoding/encodeInto.any.worker-expected.txt": [ + "adb30e4f0c26afb144d946e6cd655ca9e368bb1e", + "support" + ], "encoding/eof-shift_jis-ref.html": [ "b90f8032a31db260902c2c04b671b30ee9c62c8e", "support" @@ -434049,7 +433996,7 @@ "testharness" ], "encoding/streams/decode-bad-chunks.any.js": [ - "de2ba74c1016a1d44074179ad976987a6220d2ba", + "9f00df2e1495dc9271aa642e47660c7376ca07f3", "testharness" ], "encoding/streams/decode-ignore-bom.any.js": [ @@ -434068,10 +434015,26 @@ "6c022697da65ea10ee72da38609e8edbf695edab", "testharness" ], + "encoding/streams/decode-utf8.any-expected.txt": [ + "67af6ac18498b075fa633d64684d023d46408125", + "support" + ], "encoding/streams/decode-utf8.any.js": [ - "266899c6c965f764b62f4ef149bb4026ccccb339", + "421b98c2eea537eaebb31d1865e9eef499ce98f8", "testharness" ], + "encoding/streams/decode-utf8.any.serviceworker-expected.txt": [ + "67af6ac18498b075fa633d64684d023d46408125", + "support" + ], + "encoding/streams/decode-utf8.any.sharedworker-expected.txt": [ + "67af6ac18498b075fa633d64684d023d46408125", + "support" + ], + "encoding/streams/decode-utf8.any.worker-expected.txt": [ + "67af6ac18498b075fa633d64684d023d46408125", + "support" + ], "encoding/streams/encode-bad-chunks.any.js": [ "868e34b7342969b20145af44fd1d606499ec9ad1", "testharness" @@ -434100,10 +434063,18 @@ "9ef0d73141a0e0ceaafba61cc101986afa32477d", "testharness" ], + "encoding/textdecoder-copy.any-expected.txt": [ + "54db5fca004b95505db390ac1d6d11e8f6d0a348", + "support" + ], "encoding/textdecoder-copy.any.js": [ - "ef8e4fdb3b03eb9e3ca51c97b681e2ffe0ec5cee", + "6ae65119db687c438c0f60595e3614c09434c4b9", "testharness" ], + "encoding/textdecoder-copy.any.worker-expected.txt": [ + "54db5fca004b95505db390ac1d6d11e8f6d0a348", + "support" + ], "encoding/textdecoder-fatal-single-byte.any.js": [ "d3e9ae9c9a7774ee9ab11f3c6275f2c6a0275c8a", "testharness" @@ -434124,10 +434095,18 @@ "ed407a3254792398d5109d0d1ee5fbee5e9ef093", "testharness" ], + "encoding/textdecoder-streaming.any-expected.txt": [ + "cf065370af6b02fa26542c4f7c2b59908d4a1a3a", + "support" + ], "encoding/textdecoder-streaming.any.js": [ - "0863385b9af42db2a43edccfe43e313aa45035ef", + "e0c59472598fbd828305816e4e8a0b161244862f", "testharness" ], + "encoding/textdecoder-streaming.any.worker-expected.txt": [ + "cf065370af6b02fa26542c4f7c2b59908d4a1a3a", + "support" + ], "encoding/textdecoder-utf16-surrogates.any.js": [ "3b8418703da77d2052ebaa5104d8bfd22f131c81", "testharness" @@ -450336,6 +450315,10 @@ "a19b3c86d7542f3b65e81836a94914a8ae7cffa8", "testharness" ], + "html/semantics/document-metadata/the-style-element/support/css-red.txt": [ + "9ef04cbd12daf19dd8810cae8844bd22f3264926", + "support" + ], "html/semantics/document-metadata/the-title-element/title.text-01.html": [ "7f25400ea89ca7835b72fdb1eb21fcb220f2cd01", "testharness" @@ -499909,7 +499892,7 @@ "support" ], "tools/ci/manifest_build.py": [ - "3159dc8f16dd647303f5bcc4172e09ed59209865", + "ade17d6be40d80751de12b0d462a8f531bbe9059", "support" ], "tools/ci/run_tc.py": [ @@ -504401,11 +504384,11 @@ "support" ], "tools/wptrunner/wptrunner/browsers/firefox.py": [ - "1763ff44b4e55c14c8f5d753defb3ba39e017262", + "781d7e31c43c01c0a33328e1dc921f4f536d5296", "support" ], "tools/wptrunner/wptrunner/browsers/firefox_android.py": [ - "30e53a593cff7ec3fa026c2a4f2495402650c1dc", + "30d0825a8ca373d4cd902bbe54966b32be66f22f", "support" ], "tools/wptrunner/wptrunner/browsers/ie.py": [ @@ -504737,7 +504720,7 @@ "support" ], "tools/wptrunner/wptrunner/wpttest.py": [ - "2ce15a0d9c7f85339caadecc017f178ee0245d27", + "80db17a3c7284cd82145a3d20c3532a0e79c82a4", "support" ], "tools/wptserve/LICENSE": [
diff --git a/third_party/blink/web_tests/external/wpt/common/README.md b/third_party/blink/web_tests/external/wpt/common/README.md index bbb651d..43bec9e 100644 --- a/third_party/blink/web_tests/external/wpt/common/README.md +++ b/third_party/blink/web_tests/external/wpt/common/README.md
@@ -1,7 +1,6 @@ The files in this directory are non-infrastructure support files that can be used by tests. * `blank.html` - An empty HTML document. -* `css-red.txt` - A text/plain "CSS" document. * `domain-setter.sub.html` - An HTML document that sets `document.domain`. * `dummy.xhtml` - An XHTML document. * `dummy.xml` - An XML document.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt index 1b32cf43..3a100a48 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt
@@ -1,12 +1,5 @@ This is a testharness.js-based test. -FAIL .grid 1 assert_equals: -<div class="grid"> - <div data-offset-x="5" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div> - <div data-offset-x="180" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="0" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn RTL">X XX X</div> - <div data-offset-x="105" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR RTL">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetLeft expected 180 but got 210 +PASS .grid 1 FAIL .grid 2 assert_equals: <div class="grid RTL"> <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div> @@ -14,7 +7,7 @@ <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div> <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div> </div> -offsetLeft expected 80 but got 110 +offsetLeft expected 35 but got 5 PASS .grid 3 FAIL .grid 4 assert_equals: <div class="grid verticalRL"> @@ -23,6 +16,6 @@ <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div> <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div> </div> -offsetLeft expected 105 but got 75 +offsetTop expected 115 but got 110 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt index 1b32cf43..3a100a48 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt
@@ -1,12 +1,5 @@ This is a testharness.js-based test. -FAIL .grid 1 assert_equals: -<div class="grid"> - <div data-offset-x="5" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div> - <div data-offset-x="180" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="0" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn RTL">X XX X</div> - <div data-offset-x="105" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR RTL">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetLeft expected 180 but got 210 +PASS .grid 1 FAIL .grid 2 assert_equals: <div class="grid RTL"> <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div> @@ -14,7 +7,7 @@ <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div> <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div> </div> -offsetLeft expected 80 but got 110 +offsetLeft expected 35 but got 5 PASS .grid 3 FAIL .grid 4 assert_equals: <div class="grid verticalRL"> @@ -23,6 +16,6 @@ <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div> <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div> </div> -offsetLeft expected 105 but got 75 +offsetTop expected 115 but got 110 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/win/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt rename to third_party/blink/web_tests/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html b/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html index 062edaf..e308c7c0 100644 --- a/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html +++ b/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html
@@ -1,5 +1,5 @@ <!DOCTYPE html> -<title>The maximum value of scrollLeft shouldn't be affected by scrollbar when it's wider than scroller</title> +<title>The maximum value of scrollLeft shouldn't be affected by scrollbar even if it's wider than scroller</title> <meta charset="utf-8"> <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollleft"> @@ -12,5 +12,5 @@ test(function() { scroller.scrollLeft = 1000; assert_equals(scroller.scrollLeft, 100); - }, "Test the maxium value of scrollLeft"); + }, "Test the maxmium value of scrollLeft"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/morphology-mirrored.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/morphology-mirrored.html new file mode 100644 index 0000000..f0338e1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/morphology-mirrored.html
@@ -0,0 +1,15 @@ +<!DOCTYPE html> +<title>feMorphology filter on mirrored content</title> +<link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#feMorphologyElement"> +<link rel="match" href="reference/green-100x100.html"> +<svg> + <filter id="dilate" filterUnits="userSpaceOnUse" + color-interpolation-filters="sRGB"> + <feMorphology operator="dilate" radius="10"/> + </filter> + <rect width="100" height="100" fill="red"/> + <rect x="10" y="10" width="80" height="30" fill="green" filter="url(#dilate)" + transform="translate(0, 50) scale(1, -1)"/> + <rect x="10" y="60" width="80" height="30" fill="green" filter="url(#dilate)" + transform="translate(100, 0) scale(-1, 1)"/> +</svg>
diff --git a/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any-expected.txt new file mode 100644 index 0000000..adb30e4f0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any-expected.txt
@@ -0,0 +1,109 @@ +This is a testharness.js-based test. +Found 105 tests; 63 PASS, 42 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS Invalid encodeInto() destination: DataView, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: DataView, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Int8Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Int8Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Int16Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Int16Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Int32Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Int32Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Uint16Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Uint16Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Uint32Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Uint32Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Uint8ClampedArray, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Uint8ClampedArray, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Float32Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Float32Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Float64Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Float64Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: ArrayBuffer +PASS Invalid encodeInto() destination: SharedArrayBuffer +PASS encodeInto() and a detached output buffer +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.js b/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.js index 8b3e743..7ea0b80 100644 --- a/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.js +++ b/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.js
@@ -74,44 +74,46 @@ "filler": "random" } ].forEach(destinationData => { - test(() => { - // Setup - const bufferLength = testData.destinationLength + destinationData.bufferIncrease, - destinationOffset = destinationData.destinationOffset, - destinationLength = testData.destinationLength, - destinationFiller = destinationData.filler, - encoder = new TextEncoder(), - buffer = new ArrayBuffer(bufferLength), - view = new Uint8Array(buffer, destinationOffset, destinationLength), - fullView = new Uint8Array(buffer), - control = new Array(bufferLength); - let byte = destinationFiller; - for (let i = 0; i < bufferLength; i++) { - if (destinationFiller === "random") { - byte = Math.floor(Math.random() * 256); + ["ArrayBuffer", "SharedArrayBuffer"].forEach(arrayBufferOrSharedArrayBuffer => { + test(() => { + // Setup + const bufferLength = testData.destinationLength + destinationData.bufferIncrease, + destinationOffset = destinationData.destinationOffset, + destinationLength = testData.destinationLength, + destinationFiller = destinationData.filler, + encoder = new TextEncoder(), + buffer = new self[arrayBufferOrSharedArrayBuffer](bufferLength), + view = new Uint8Array(buffer, destinationOffset, destinationLength), + fullView = new Uint8Array(buffer), + control = new Array(bufferLength); + let byte = destinationFiller; + for (let i = 0; i < bufferLength; i++) { + if (destinationFiller === "random") { + byte = Math.floor(Math.random() * 256); + } + control[i] = byte; + fullView[i] = byte; } - control[i] = byte; - fullView[i] = byte; - } - // It's happening - const result = encoder.encodeInto(testData.input, view); + // It's happening + const result = encoder.encodeInto(testData.input, view); - // Basics - assert_equals(view.byteLength, destinationLength); - assert_equals(view.length, destinationLength); + // Basics + assert_equals(view.byteLength, destinationLength); + assert_equals(view.length, destinationLength); - // Remainder - assert_equals(result.read, testData.read); - assert_equals(result.written, testData.written.length); - for (let i = 0; i < bufferLength; i++) { - if (i < destinationOffset || i >= (destinationOffset + testData.written.length)) { - assert_equals(fullView[i], control[i]); - } else { - assert_equals(fullView[i], testData.written[i - destinationOffset]); + // Remainder + assert_equals(result.read, testData.read); + assert_equals(result.written, testData.written.length); + for (let i = 0; i < bufferLength; i++) { + if (i < destinationOffset || i >= (destinationOffset + testData.written.length)) { + assert_equals(fullView[i], control[i]); + } else { + assert_equals(fullView[i], testData.written[i - destinationOffset]); + } } - } - }, "encodeInto() with " + testData.input + " and destination length " + testData.destinationLength + ", offset " + destinationData.destinationOffset + ", filler " + destinationData.filler); + }, "encodeInto() into " + arrayBufferOrSharedArrayBuffer + " with " + testData.input + " and destination length " + testData.destinationLength + ", offset " + destinationData.destinationOffset + ", filler " + destinationData.filler); + }) }); }); @@ -124,14 +126,20 @@ Uint8ClampedArray, Float32Array, Float64Array].forEach(view => { - test(() => { - assert_throws(new TypeError(), () => new TextEncoder().encodeInto("", new view(new ArrayBuffer(0)))); - }, "Invalid encodeInto() destination: " + view.name); - }); + ["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => { + test(() => { + assert_throws(new TypeError(), () => new TextEncoder().encodeInto("", new view(new self[arrayBufferOrSharedArrayBuffer](0)))); + }, "Invalid encodeInto() destination: " + view.name + ", backed by: " + arrayBufferOrSharedArrayBuffer); + }); +}); -test(() => { - assert_throws(new TypeError(), () => new TextEncoder().encodeInto("", new ArrayBuffer(10))); -}, "Invalid encodeInto() destination: ArrayBuffer"); +["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => { + test(() => { + assert_throws(new TypeError(), () => new TextEncoder().encodeInto("", new self[arrayBufferOrSharedArrayBuffer](10))); + }, "Invalid encodeInto() destination: " + arrayBufferOrSharedArrayBuffer); +}); + + test(() => { const buffer = new ArrayBuffer(10),
diff --git a/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.worker-expected.txt new file mode 100644 index 0000000..adb30e4f0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.worker-expected.txt
@@ -0,0 +1,109 @@ +This is a testharness.js-based test. +Found 105 tests; 63 PASS, 42 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 0, filler 0 +FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 4, filler 0 +FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 0, filler 128 +FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 4, filler 128 +FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 0, filler random +FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 4, filler random +FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared. +PASS Invalid encodeInto() destination: DataView, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: DataView, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Int8Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Int8Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Int16Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Int16Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Int32Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Int32Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Uint16Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Uint16Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Uint32Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Uint32Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Uint8ClampedArray, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Uint8ClampedArray, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Float32Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Float32Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: Float64Array, backed by: ArrayBuffer +PASS Invalid encodeInto() destination: Float64Array, backed by: SharedArrayBuffer +PASS Invalid encodeInto() destination: ArrayBuffer +PASS Invalid encodeInto() destination: SharedArrayBuffer +PASS encodeInto() and a detached output buffer +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-bad-chunks.any.js b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-bad-chunks.any.js index de2ba74..9f00df2e 100644 --- a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-bad-chunks.any.js +++ b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-bad-chunks.any.js
@@ -22,20 +22,6 @@ { name: 'array', value: [65] - }, - { - name: 'SharedArrayBuffer', - // Use a getter to postpone construction so that all tests don't fail where - // SharedArrayBuffer is not yet implemented. - get value() { - return new SharedArrayBuffer(); - } - }, - { - name: 'shared Uint8Array', - get value() { - new Uint8Array(new SharedArrayBuffer()) - } } ];
diff --git a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any-expected.txt new file mode 100644 index 0000000..67af6ac --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any-expected.txt
@@ -0,0 +1,13 @@ +This is a testharness.js-based test. +PASS decoding one UTF-8 chunk should give one output string - ArrayBuffer +PASS decoding an empty chunk should give no output chunks - ArrayBuffer +PASS an initial empty chunk should be ignored - ArrayBuffer +PASS a trailing empty chunk should be ignored- ArrayBuffer +FAIL decoding one UTF-8 chunk should give one output string - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +FAIL decoding an empty chunk should give no output chunks - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +FAIL an initial empty chunk should be ignored - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +FAIL a trailing empty chunk should be ignored- SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +PASS decoding a transferred Uint8Array chunk should give no output +PASS decoding a transferred ArrayBuffer chunk should give no output +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.js b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.js index 266899c..421b98c2 100644 --- a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.js +++ b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.js
@@ -4,41 +4,48 @@ 'use strict'; -const emptyChunk = new Uint8Array([]); -const inputChunk = new Uint8Array([73, 32, 240, 159, 146, 153, 32, 115, 116, - 114, 101, 97, 109, 115]); -const expectedOutputString = 'I \u{1F499} streams'; +["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => { + const inputChunkData = [73, 32, 240, 159, 146, 153, 32, 115, 116, + 114, 101, 97, 109, 115] -promise_test(async () => { - const input = readableStreamFromArray([inputChunk]); - const output = input.pipeThrough(new TextDecoderStream()); - const array = await readableStreamToArray(output); - assert_array_equals(array, [expectedOutputString], - 'the output should be in one chunk'); -}, 'decoding one UTF-8 chunk should give one output string'); + const emptyChunk = new Uint8Array(new self[arrayBufferOrSharedArrayBuffer](0)); + const inputChunk = new Uint8Array(new self[arrayBufferOrSharedArrayBuffer](inputChunkData.length)); -promise_test(async () => { - const input = readableStreamFromArray([emptyChunk]); - const output = input.pipeThrough(new TextDecoderStream()); - const array = await readableStreamToArray(output); - assert_array_equals(array, [], 'no chunks should be output'); -}, 'decoding an empty chunk should give no output chunks'); + inputChunk.set(inputChunkData); -promise_test(async () => { - const input = readableStreamFromArray([emptyChunk, inputChunk]); - const output = input.pipeThrough(new TextDecoderStream()); - const array = await readableStreamToArray(output); - assert_array_equals(array, [expectedOutputString], - 'the output should be in one chunk'); -}, 'an initial empty chunk should be ignored'); + const expectedOutputString = 'I \u{1F499} streams'; -promise_test(async () => { - const input = readableStreamFromArray([inputChunk, emptyChunk]); - const output = input.pipeThrough(new TextDecoderStream()); - const array = await readableStreamToArray(output); - assert_array_equals(array, [expectedOutputString], - 'the output should be in one chunk'); -}, 'a trailing empty chunk should be ignored'); + promise_test(async () => { + const input = readableStreamFromArray([inputChunk]); + const output = input.pipeThrough(new TextDecoderStream()); + const array = await readableStreamToArray(output); + assert_array_equals(array, [expectedOutputString], + 'the output should be in one chunk'); + }, 'decoding one UTF-8 chunk should give one output string - ' + arrayBufferOrSharedArrayBuffer); + + promise_test(async () => { + const input = readableStreamFromArray([emptyChunk]); + const output = input.pipeThrough(new TextDecoderStream()); + const array = await readableStreamToArray(output); + assert_array_equals(array, [], 'no chunks should be output'); + }, 'decoding an empty chunk should give no output chunks - ' + arrayBufferOrSharedArrayBuffer); + + promise_test(async () => { + const input = readableStreamFromArray([emptyChunk, inputChunk]); + const output = input.pipeThrough(new TextDecoderStream()); + const array = await readableStreamToArray(output); + assert_array_equals(array, [expectedOutputString], + 'the output should be in one chunk'); + }, 'an initial empty chunk should be ignored - ' + arrayBufferOrSharedArrayBuffer); + + promise_test(async () => { + const input = readableStreamFromArray([inputChunk, emptyChunk]); + const output = input.pipeThrough(new TextDecoderStream()); + const array = await readableStreamToArray(output); + assert_array_equals(array, [expectedOutputString], + 'the output should be in one chunk'); + }, 'a trailing empty chunk should be ignored- ' + arrayBufferOrSharedArrayBuffer); +}); promise_test(async () => { const buffer = new ArrayBuffer(3);
diff --git a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.serviceworker-expected.txt new file mode 100644 index 0000000..67af6ac --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.serviceworker-expected.txt
@@ -0,0 +1,13 @@ +This is a testharness.js-based test. +PASS decoding one UTF-8 chunk should give one output string - ArrayBuffer +PASS decoding an empty chunk should give no output chunks - ArrayBuffer +PASS an initial empty chunk should be ignored - ArrayBuffer +PASS a trailing empty chunk should be ignored- ArrayBuffer +FAIL decoding one UTF-8 chunk should give one output string - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +FAIL decoding an empty chunk should give no output chunks - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +FAIL an initial empty chunk should be ignored - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +FAIL a trailing empty chunk should be ignored- SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +PASS decoding a transferred Uint8Array chunk should give no output +PASS decoding a transferred ArrayBuffer chunk should give no output +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.sharedworker-expected.txt new file mode 100644 index 0000000..67af6ac --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.sharedworker-expected.txt
@@ -0,0 +1,13 @@ +This is a testharness.js-based test. +PASS decoding one UTF-8 chunk should give one output string - ArrayBuffer +PASS decoding an empty chunk should give no output chunks - ArrayBuffer +PASS an initial empty chunk should be ignored - ArrayBuffer +PASS a trailing empty chunk should be ignored- ArrayBuffer +FAIL decoding one UTF-8 chunk should give one output string - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +FAIL decoding an empty chunk should give no output chunks - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +FAIL an initial empty chunk should be ignored - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +FAIL a trailing empty chunk should be ignored- SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +PASS decoding a transferred Uint8Array chunk should give no output +PASS decoding a transferred ArrayBuffer chunk should give no output +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.worker-expected.txt new file mode 100644 index 0000000..67af6ac --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.worker-expected.txt
@@ -0,0 +1,13 @@ +This is a testharness.js-based test. +PASS decoding one UTF-8 chunk should give one output string - ArrayBuffer +PASS decoding an empty chunk should give no output chunks - ArrayBuffer +PASS an initial empty chunk should be ignored - ArrayBuffer +PASS a trailing empty chunk should be ignored- ArrayBuffer +FAIL decoding one UTF-8 chunk should give one output string - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +FAIL decoding an empty chunk should give no output chunks - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +FAIL an initial empty chunk should be ignored - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +FAIL a trailing empty chunk should be ignored- SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared." +PASS decoding a transferred Uint8Array chunk should give no output +PASS decoding a transferred ArrayBuffer chunk should give no output +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any-expected.txt new file mode 100644 index 0000000..54db5fca --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +PASS Modify buffer after passing it in (ArrayBuffer) +FAIL Modify buffer after passing it in (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)' +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.js b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.js index ef8e4fd..6ae6511 100644 --- a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.js +++ b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.js
@@ -1,15 +1,17 @@ -test(() => { - const buf = new ArrayBuffer(2), - view = new Uint8Array(buf), - buf2 = new ArrayBuffer(2), - view2 = new Uint8Array(buf2), - decoder = new TextDecoder("utf-8") - view[0] = 0xEF - view[1] = 0xBB - view2[0] = 0xBF - view2[1] = 0x40 - assert_equals(decoder.decode(buf, {stream:true}), "") - view[0] = 0x01 - view[1] = 0x02 - assert_equals(decoder.decode(buf2), "@") -}, "Modify buffer after passing it in") +["ArrayBuffer", "SharedArrayBuffer"].forEach(arrayBufferOrSharedArrayBuffer => { + test(() => { + const buf = new self[arrayBufferOrSharedArrayBuffer](2), + view = new Uint8Array(buf), + buf2 = new self[arrayBufferOrSharedArrayBuffer](2), + view2 = new Uint8Array(buf2), + decoder = new TextDecoder("utf-8"); + view[0] = 0xEF; + view[1] = 0xBB; + view2[0] = 0xBF; + view2[1] = 0x40; + assert_equals(decoder.decode(buf, {stream:true}), ""); + view[0] = 0x01; + view[1] = 0x02; + assert_equals(decoder.decode(buf2), "@"); + }, "Modify buffer after passing it in (" + arrayBufferOrSharedArrayBuffer + ")"); +});
diff --git a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.worker-expected.txt new file mode 100644 index 0000000..54db5fca --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.worker-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +PASS Modify buffer after passing it in (ArrayBuffer) +FAIL Modify buffer after passing it in (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)' +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any-expected.txt new file mode 100644 index 0000000..cf06537 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any-expected.txt
@@ -0,0 +1,33 @@ +This is a testharness.js-based test. +PASS Streaming decode: utf-8, 1 byte window (ArrayBuffer) +PASS Streaming decode: utf-8, 2 byte window (ArrayBuffer) +PASS Streaming decode: utf-8, 3 byte window (ArrayBuffer) +PASS Streaming decode: utf-8, 4 byte window (ArrayBuffer) +PASS Streaming decode: utf-8, 5 byte window (ArrayBuffer) +PASS Streaming decode: utf-16le, 1 byte window (ArrayBuffer) +PASS Streaming decode: utf-16le, 2 byte window (ArrayBuffer) +PASS Streaming decode: utf-16le, 3 byte window (ArrayBuffer) +PASS Streaming decode: utf-16le, 4 byte window (ArrayBuffer) +PASS Streaming decode: utf-16le, 5 byte window (ArrayBuffer) +PASS Streaming decode: utf-16be, 1 byte window (ArrayBuffer) +PASS Streaming decode: utf-16be, 2 byte window (ArrayBuffer) +PASS Streaming decode: utf-16be, 3 byte window (ArrayBuffer) +PASS Streaming decode: utf-16be, 4 byte window (ArrayBuffer) +PASS Streaming decode: utf-16be, 5 byte window (ArrayBuffer) +FAIL Streaming decode: utf-8, 1 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-8, 2 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-8, 3 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-8, 4 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-8, 5 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16le, 1 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16le, 2 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16le, 3 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16le, 4 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16le, 5 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16be, 1 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16be, 2 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16be, 3 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16be, 4 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16be, 5 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.js b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.js index 0863385b..e0c5947 100644 --- a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.js +++ b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.js
@@ -16,21 +16,25 @@ 0xDF,0xFF] }; -Object.keys(octets).forEach(function(encoding) { - for (var len = 1; len <= 5; ++len) { - test(function() { - var encoded = octets[encoding]; +["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => { + Object.keys(octets).forEach(function(encoding) { + for (var len = 1; len <= 5; ++len) { + test(function() { + var encoded = octets[encoding]; - var out = ''; - var decoder = new TextDecoder(encoding); - for (var i = 0; i < encoded.length; i += len) { - var sub = []; - for (var j = i; j < encoded.length && j < i + len; ++j) - sub.push(encoded[j]); - out += decoder.decode(new Uint8Array(sub), {stream: true}); - } - out += decoder.decode(); - assert_equals(out, string); - }, 'Streaming decode: ' + encoding + ', ' + len + ' byte window'); - } -}); + var out = ''; + var decoder = new TextDecoder(encoding); + for (var i = 0; i < encoded.length; i += len) { + var sub = []; + for (var j = i; j < encoded.length && j < i + len; ++j) + sub.push(encoded[j]); + var uintArray = new Uint8Array(new self[arrayBufferOrSharedArrayBuffer](sub.length)); + uintArray.set(sub); + out += decoder.decode(uintArray, {stream: true}); + } + out += decoder.decode(); + assert_equals(out, string); + }, 'Streaming decode: ' + encoding + ', ' + len + ' byte window (' + arrayBufferOrSharedArrayBuffer + ')'); + } + }); +})
diff --git a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.worker-expected.txt new file mode 100644 index 0000000..cf06537 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.worker-expected.txt
@@ -0,0 +1,33 @@ +This is a testharness.js-based test. +PASS Streaming decode: utf-8, 1 byte window (ArrayBuffer) +PASS Streaming decode: utf-8, 2 byte window (ArrayBuffer) +PASS Streaming decode: utf-8, 3 byte window (ArrayBuffer) +PASS Streaming decode: utf-8, 4 byte window (ArrayBuffer) +PASS Streaming decode: utf-8, 5 byte window (ArrayBuffer) +PASS Streaming decode: utf-16le, 1 byte window (ArrayBuffer) +PASS Streaming decode: utf-16le, 2 byte window (ArrayBuffer) +PASS Streaming decode: utf-16le, 3 byte window (ArrayBuffer) +PASS Streaming decode: utf-16le, 4 byte window (ArrayBuffer) +PASS Streaming decode: utf-16le, 5 byte window (ArrayBuffer) +PASS Streaming decode: utf-16be, 1 byte window (ArrayBuffer) +PASS Streaming decode: utf-16be, 2 byte window (ArrayBuffer) +PASS Streaming decode: utf-16be, 3 byte window (ArrayBuffer) +PASS Streaming decode: utf-16be, 4 byte window (ArrayBuffer) +PASS Streaming decode: utf-16be, 5 byte window (ArrayBuffer) +FAIL Streaming decode: utf-8, 1 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-8, 2 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-8, 3 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-8, 4 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-8, 5 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16le, 1 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16le, 2 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16le, 3 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16le, 4 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16le, 5 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16be, 1 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16be, 2 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16be, 3 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16be, 4 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +FAIL Streaming decode: utf-16be, 5 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/common/css-red.txt b/third_party/blink/web_tests/external/wpt/html/semantics/document-metadata/the-style-element/support/css-red.txt similarity index 100% rename from third_party/blink/web_tests/external/wpt/common/css-red.txt rename to third_party/blink/web_tests/external/wpt/html/semantics/document-metadata/the-style-element/support/css-red.txt
diff --git a/third_party/blink/web_tests/external/wpt/tools/ci/manifest_build.py b/third_party/blink/web_tests/external/wpt/tools/ci/manifest_build.py index 3159dc8..ade17d6 100644 --- a/third_party/blink/web_tests/external/wpt/tools/ci/manifest_build.py +++ b/third_party/blink/web_tests/external/wpt/tools/ci/manifest_build.py
@@ -39,7 +39,7 @@ def compress_manifest(path): for args in [["gzip", "-k", "-f", "--best"], ["bzip2", "-k", "-f", "--best"], - ["zstd", "-k", "-f", "--ultra", "-22"]]: + ["zstd", "-k", "-f", "--ultra", "-22", "-q"]]: run(args + [path])
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox.py index 1763ff44..781d7e31 100644 --- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox.py +++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox.py
@@ -153,18 +153,35 @@ def run_info_extras(**kwargs): - def get_bool_pref(pref): + def get_bool_pref_if_exists(pref): for key, value in kwargs.get('extra_prefs', []): if pref == key: return value.lower() in ('true', '1') - return False + return None + + def get_bool_pref(pref): + pref_value = get_bool_pref_if_exists(pref) + return pref_value if pref_value is not None else False rv = {"e10s": kwargs["gecko_e10s"], "wasm": kwargs.get("wasm", True), "verify": kwargs["verify"], "headless": kwargs.get("headless", False) or "MOZ_HEADLESS" in os.environ, - "fission": get_bool_pref("fission.autostart"), - "sw-e10s": get_bool_pref("dom.serviceWorkers.parent_intercept")} + "fission": get_bool_pref("fission.autostart")} + + # The value of `sw-e10s` defaults to whether the "parent_intercept" + # implementation is enabled for the current build. This value, however, + # can be overridden by explicitly setting the pref with the `--setpref` CLI + # flag, which is checked here. If not supplied, the default value of + # `sw-e10s` will be filled in in `RunInfo`'s constructor. + # + # We can't capture the default value right now because (currently), it + # defaults to the value of `nightly_build`, which isn't known until + # `RunInfo`'s constructor. + sw_e10s_override = get_bool_pref_if_exists("dom.serviceWorkers.parent_intercept") + if sw_e10s_override is not None: + rv["sw-e10s"] = sw_e10s_override + rv.update(run_info_browser_version(kwargs["binary"])) return rv
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py index 30e53a59..30d0825 100644 --- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py +++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py
@@ -67,8 +67,7 @@ def run_info_extras(**kwargs): package = kwargs["package_name"] rv = {"e10s": True if package is not None and "geckoview" in package else False, - "headless": False, - "sw-e10s": False} + "headless": False} rv.update(run_info_browser_version(kwargs["binary"])) return rv
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py index 2ce15a0..80db17a3 100644 --- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py +++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py
@@ -112,6 +112,18 @@ if extras is not None: self.update(extras) + # Until the test harness can understand default pref values, + # (https://bugzilla.mozilla.org/show_bug.cgi?id=1577912) this value + # should by synchronized with the default pref value indicated in + # StaticPrefList.yaml. + # + # Currently for automation, the pref (and `sw-e10s`) defaults to true in + # nightly builds and false otherwise but can be overridden with + # `--setpref`. If overridden, the value would be initialized in + # `run_info_extras` and be supplied in the `extras` parameter. + if "sw-e10s" not in self: + self["sw-e10s"] = self.get("nightly_build", False) + self["headless"] = extras.get("headless", False) self["webrender"] = enable_webrender
diff --git a/third_party/blink/web_tests/fast/css/content/content-quotes-01-expected.txt b/third_party/blink/web_tests/fast/css/content/content-quotes-01-expected.txt index e065ce5..7eb8ae2 100644 --- a/third_party/blink/web_tests/fast/css/content/content-quotes-01-expected.txt +++ b/third_party/blink/web_tests/fast/css/content/content-quotes-01-expected.txt
@@ -10,4 +10,4 @@ ========Marker3======== -FAILED: testWidth=197px; expected 196px +PASSED
diff --git a/third_party/blink/web_tests/fast/css/content/content-quotes-05-expected.txt b/third_party/blink/web_tests/fast/css/content/content-quotes-05-expected.txt index 5ca09ce..e9c2297 100644 --- a/third_party/blink/web_tests/fast/css/content/content-quotes-05-expected.txt +++ b/third_party/blink/web_tests/fast/css/content/content-quotes-05-expected.txt
@@ -8,4 +8,4 @@ ========Marker3======== -FAILED: testWidth=234px; expected 233px +PASSED
diff --git a/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt b/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt index 77334292..f3c84c5 100644 --- a/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt +++ b/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt
@@ -40,9 +40,9 @@ PASS All correct nodes found for rect PASS All correct nodes found for rect PASS All correct nodes found for rect -FAIL Unexpected node #0 for rect [39,202], [2,41] - DIV#d2 -FAIL Unexpected node #1 for rect [39,202], [6,41] - DIV#d2 -FAIL Unexpected node #2 for rect [39,202], [16,41] - DIV#d2 +PASS All correct nodes found for rect +PASS All correct nodes found for rect +PASS All correct nodes found for rect PASS All correct nodes found for rect PASS All correct nodes found for rect PASS All correct nodes found for rect
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/push-block-with-first-line-expected.txt b/third_party/blink/web_tests/paint/invalidation/push-block-with-first-line-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/mac/paint/invalidation/push-block-with-first-line-expected.txt rename to third_party/blink/web_tests/paint/invalidation/push-block-with-first-line-expected.txt
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/canvas/image-object-in-canvas-expected.png deleted file mode 100644 index 1b4260b..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.10/fast/canvas/image-object-in-canvas-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/paint/invalidation/push-block-with-first-line-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.10/paint/invalidation/push-block-with-first-line-expected.txt deleted file mode 100644 index 57b6675..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.10/paint/invalidation/push-block-with-first-line-expected.txt +++ /dev/null
@@ -1,33 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling Contents Layer", - "bounds": [500, 400], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF", - "paintInvalidations": [ - { - "object": "NGPhysicalLineBoxFragment", - "rect": [8, 68, 484, 20], - "reason": "geometry" - }, - { - "object": "NGPhysicalLineBoxFragment", - "rect": [8, 8, 484, 20], - "reason": "geometry" - }, - { - "object": "NGPhysicalTextFragment 'JOCULAR'", - "rect": [8, 68, 140, 20], - "reason": "geometry" - }, - { - "object": "NGPhysicalTextFragment 'JOCULAR'", - "rect": [8, 8, 140, 20], - "reason": "geometry" - } - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/canvas/image-object-in-canvas-expected.png deleted file mode 100644 index 1b4260b..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.11/fast/canvas/image-object-in-canvas-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/paint/invalidation/push-block-with-first-line-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.11/paint/invalidation/push-block-with-first-line-expected.txt deleted file mode 100644 index 57b6675..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.11/paint/invalidation/push-block-with-first-line-expected.txt +++ /dev/null
@@ -1,33 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling Contents Layer", - "bounds": [500, 400], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF", - "paintInvalidations": [ - { - "object": "NGPhysicalLineBoxFragment", - "rect": [8, 68, 484, 20], - "reason": "geometry" - }, - { - "object": "NGPhysicalLineBoxFragment", - "rect": [8, 8, 484, 20], - "reason": "geometry" - }, - { - "object": "NGPhysicalTextFragment 'JOCULAR'", - "rect": [8, 68, 140, 20], - "reason": "geometry" - }, - { - "object": "NGPhysicalTextFragment 'JOCULAR'", - "rect": [8, 8, 140, 20], - "reason": "geometry" - } - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/basic/inheritance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/basic/inheritance-expected.png deleted file mode 100644 index b918d43..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/basic/inheritance-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/acid_test-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/acid_test-expected.png deleted file mode 100644 index f7700d8..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/acid_test-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_bottom-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_bottom-expected.png deleted file mode 100644 index dafeeee..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_bottom-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_bottom_width_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_bottom_width_inline-expected.png deleted file mode 100644 index d88d7fd..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_bottom_width_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_inline-expected.png deleted file mode 100644 index 768c43c1..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_left_width_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_left_width_inline-expected.png deleted file mode 100644 index a218d87..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_left_width_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_style_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_style_inline-expected.png deleted file mode 100644 index 29c038f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_style_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_top_width-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_top_width-expected.png deleted file mode 100644 index 8fbc5f7..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_top_width-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/clear_float-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/clear_float-expected.png deleted file mode 100644 index 642b678..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/clear_float-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/float-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/float-expected.png deleted file mode 100644 index dcd8ec78..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/float-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/float_margin-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/float_margin-expected.png deleted file mode 100644 index 239c9fa..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/float_margin-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_inline-expected.png deleted file mode 100644 index f4a263d..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_left-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_left-expected.png deleted file mode 100644 index c79d8bd3..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_left-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_top_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_top_inline-expected.png deleted file mode 100644 index 237ba1d9..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_top_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_left-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_left-expected.png deleted file mode 100644 index c3aa8bd..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_left-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_right-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_right-expected.png deleted file mode 100644 index 6e620d40..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_right-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_top_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_top_inline-expected.png deleted file mode 100644 index 5cf66bd..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_top_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style-expected.png deleted file mode 100644 index 061f760d..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style_image-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style_image-expected.png deleted file mode 100644 index ec18f7f3..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style_image-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style_type-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style_type-expected.png deleted file mode 100644 index 24897d9..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style_type-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/color_and_background/background-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/color_and_background/background-expected.png deleted file mode 100644 index 9cdb6ec0..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/color_and_background/background-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/formatting_model/floating_elements-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/formatting_model/floating_elements-expected.png deleted file mode 100644 index 7756c4b..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/formatting_model/floating_elements-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/formatting_model/horizontal_formatting-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/formatting_model/horizontal_formatting-expected.png deleted file mode 100644 index 98d09f408..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/formatting_model/horizontal_formatting-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/units/percentage_units-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/units/percentage_units-expected.png deleted file mode 100644 index c81015b0..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/units/percentage_units-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/20110323/table-height-algorithm-024-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/20110323/table-height-algorithm-024-expected.png deleted file mode 100644 index d3b3248..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/20110323/table-height-algorithm-024-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t051103-dom-hover-01-c-io-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t051103-dom-hover-01-c-io-expected.png deleted file mode 100644 index 25644a6..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t051103-dom-hover-01-c-io-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0602-c13-inh-underlin-00-e-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0602-c13-inh-underlin-00-e-expected.png deleted file mode 100644 index 010621b6..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0602-c13-inh-underlin-00-e-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5521-brdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5521-brdr-l-00-a-expected.png deleted file mode 100644 index 87890d7..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5521-brdr-l-00-a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png deleted file mode 100644 index 1ebbc4f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5522-ibrdr-00-a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5522-ibrdr-00-a-expected.png deleted file mode 100644 index f75ed6f6..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5522-ibrdr-00-a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c414-flt-04-c-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c414-flt-04-c-expected.png deleted file mode 100644 index bc4211a..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c414-flt-04-c-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png deleted file mode 100644 index 09ecdb1d..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c5525-fltcont-00-d-g-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c5525-fltcont-00-d-g-expected.png deleted file mode 100644 index 5c0b47e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c5525-fltcont-00-d-g-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c5525-fltwrap-00-b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c5525-fltwrap-00-b-expected.png deleted file mode 100644 index 145b6e0..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c5525-fltwrap-00-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1004-c5524-width-00-b-g-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1004-c5524-width-00-b-g-expected.png deleted file mode 100644 index 823dfbf..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1004-c5524-width-00-b-g-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1202-counter-15-b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1202-counter-15-b-expected.png deleted file mode 100644 index 17461edc..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1202-counter-15-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1202-counters-13-b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1202-counters-13-b-expected.png deleted file mode 100644 index 860bc7f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1202-counters-13-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1205-c565-list-pos-00-b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1205-c565-list-pos-00-b-expected.png deleted file mode 100644 index 73d69fd..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1205-c565-list-pos-00-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1205-c566-list-stl-01-c-g-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1205-c566-list-stl-01-c-g-expected.png deleted file mode 100644 index 1390c4cb..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1205-c566-list-stl-01-c-g-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1508-c527-font-06-b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1508-c527-font-06-b-expected.png deleted file mode 100644 index 11096a6..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1508-c527-font-06-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1508-c527-font-10-c-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1508-c527-font-10-c-expected.png deleted file mode 100644 index a7f09cd..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1508-c527-font-10-c-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/css3-modsel-35-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/css3-modsel-35-expected.png deleted file mode 100644 index c4f07d8b..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/css3-modsel-35-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/font-feature-settings-rendering-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/font-feature-settings-rendering-expected.png deleted file mode 100644 index 45127ce..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/font-feature-settings-rendering-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-168a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-168a-expected.png deleted file mode 100644 index dd901c96..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-168a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-20-expected.png deleted file mode 100644 index 2b8682d..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-20-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-35-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-35-expected.png deleted file mode 100644 index c4f07d8b..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-35-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-39-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-39-expected.png deleted file mode 100644 index 04dc941f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-39-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-42-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-42-expected.png deleted file mode 100644 index fb9a8aa..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-42-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-42a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-42a-expected.png deleted file mode 100644 index fb9a8aa..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-42a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-5-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-5-expected.png deleted file mode 100644 index 7087c35..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-5-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-7-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-7-expected.png deleted file mode 100644 index a4410c7..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-7-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-78b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-78b-expected.png deleted file mode 100644 index 309c0a7..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-78b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-166-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-166-expected.png deleted file mode 100644 index 266114d..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-166-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-168a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-168a-expected.png deleted file mode 100644 index dd901c96..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-168a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-20-expected.png deleted file mode 100644 index 2b8682d..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-20-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-3-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-3-expected.png deleted file mode 100644 index 89289b3e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-39-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-39-expected.png deleted file mode 100644 index 04dc941f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-39-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-42-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-42-expected.png deleted file mode 100644 index fb9a8aa..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-42-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-7-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-7-expected.png deleted file mode 100644 index a4410c7..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-7-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-153-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-153-expected.png deleted file mode 100644 index d9fbc47..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-153-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-166a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-166a-expected.png deleted file mode 100644 index dd01181..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-166a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-168-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-168-expected.png deleted file mode 100644 index 804fdfa6..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-168-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-20-expected.png deleted file mode 100644 index bf18631..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-20-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-22-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-22-expected.png deleted file mode 100644 index 31b3fb0..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-22-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-3-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-3-expected.png deleted file mode 100644 index 45a0932..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-42a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-42a-expected.png deleted file mode 100644 index 6536745..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-42a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-66-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-66-expected.png deleted file mode 100644 index 2684dabe..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-66-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-78b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-78b-expected.png deleted file mode 100644 index 71060ce..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-78b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-79-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-79-expected.png deleted file mode 100644 index dcc504a..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-79-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/4402375-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/4402375-expected.png deleted file mode 100644 index 38d5c6d3..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/4402375-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/4402375-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/4402375-expected.txt deleted file mode 100644 index 464465f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/4402375-expected.txt +++ /dev/null
@@ -1,27 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutNGBlockFlow {HTML} at (0,0) size 800x600 - LayoutNGBlockFlow {BODY} at (8,8) size 784x584 - LayoutNGBlockFlow {P} at (0,0) size 784x36 - LayoutText {#text} at (0,0) size 135x18 - text run at (0,0) width 135: "This is a testcase for " - LayoutInline {A} at (134,0) size 154x18 [color=#0000EE] - LayoutText {#text} at (134,0) size 154x18 - text run at (134,0) width 154: "rdar://problem/4402375" - LayoutText {#text} at (0,0) size 774x36 - text run at (287,0) width 487: " \"REGRESSION (417.8-TOT): finding text sometimes also selects previous" - text run at (0,18) width 139: "image (5127) (6451)\"" - LayoutNGBlockFlow {P} at (0,70) size 784x36 - LayoutText {#text} at (0,0) size 759x36 - text run at (0,0) width 759: "This test uses a right aligned image next to some left aligned text. The image should not be selected, and should not be" - text run at (0,18) width 612: "included in the selection rect (you won't see the selection rect when you run this test manually)." - LayoutNGBlockFlow {DIV} at (0,122) size 784x18 - LayoutImage (floating) {IMG} at (708,0) size 76x103 - LayoutText {#text} at (0,0) size 182x18 - text run at (0,0) width 182: "This text should be selected." -layer at (8,60) size 784x2 clip at (0,0) size 0x0 - LayoutNGBlockFlow {HR} at (0,52) size 784x2 [border: (1px inset #EEEEEE)] -selection start: position 0 of child 1 {#text} of child 6 {DIV} of body -selection end: position 29 of child 1 {#text} of child 6 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png deleted file mode 100644 index bde97c2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/select-text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/select-text-overflow-ellipsis-expected.png deleted file mode 100644 index 9b6b38bd..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/select-text-overflow-ellipsis-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png deleted file mode 100644 index f415ab9..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt deleted file mode 100644 index 3a100a48..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt +++ /dev/null
@@ -1,21 +0,0 @@ -This is a testharness.js-based test. -PASS .grid 1 -FAIL .grid 2 assert_equals: -<div class="grid RTL"> - <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div> - <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div> - <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetLeft expected 35 but got 5 -PASS .grid 3 -FAIL .grid 4 assert_equals: -<div class="grid verticalRL"> - <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div> - <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div> - <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetTop expected 115 but got 110 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt deleted file mode 100644 index 3a100a48..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt +++ /dev/null
@@ -1,21 +0,0 @@ -This is a testharness.js-based test. -PASS .grid 1 -FAIL .grid 2 assert_equals: -<div class="grid RTL"> - <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div> - <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div> - <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetLeft expected 35 but got 5 -PASS .grid 3 -FAIL .grid 4 assert_equals: -<div class="grid verticalRL"> - <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div> - <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div> - <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetTop expected 115 but got 110 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt deleted file mode 100644 index bac9d81..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL Height must change when line-height-step changes assert_not_equals: got disallowed value 28 -PASS Height must not change after relayout -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/animated-gif-as-background-rounded-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/animated-gif-as-background-rounded-expected.png deleted file mode 100644 index 1c340ad..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/animated-gif-as-background-rounded-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/repeat/negative-offset-repeat-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/repeat/negative-offset-repeat-expected.png deleted file mode 100644 index 92e5e871..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/repeat/negative-offset-repeat-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png deleted file mode 100644 index 8dfcc77..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/basic/015-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/basic/015-expected.png deleted file mode 100644 index 7a2dbaa..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/basic/015-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/basic/adding-near-anonymous-block-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/basic/adding-near-anonymous-block-expected.png deleted file mode 100644 index 604e6d8..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/basic/adding-near-anonymous-block-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/028-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/028-expected.png deleted file mode 100644 index dcf831b..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/028-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/independent-align-positioning-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/independent-align-positioning-expected.png deleted file mode 100644 index 323a8a4..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/independent-align-positioning-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/nopaint-after-layer-destruction2-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/nopaint-after-layer-destruction2-expected.png deleted file mode 100644 index a936b73..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/nopaint-after-layer-destruction2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/006-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/006-expected.png deleted file mode 100644 index fb01fd6..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/006-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/015-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/015-expected.png deleted file mode 100644 index 2b3e410..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/015-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/017-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/017-expected.png deleted file mode 100644 index cd5bba7..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/017-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/019-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/019-expected.png deleted file mode 100644 index 3f83783a..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/019-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/020-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/020-expected.png deleted file mode 100644 index 7d9acf0..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/020-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/059-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/059-expected.png deleted file mode 100644 index 4901154..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/059-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/103-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/103-expected.png deleted file mode 100644 index 04fe0565..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/103-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/block-inside-inline/005-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/block-inside-inline/005-expected.png deleted file mode 100644 index cc417cf..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/block-inside-inline/005-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/block-inside-inline/016-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/block-inside-inline/016-expected.png deleted file mode 100644 index 5704a8a..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/block-inside-inline/016-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/001-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/001-expected.png deleted file mode 100644 index 2c852a66..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/001-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/absolute-in-inline-rtl-3-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/absolute-in-inline-rtl-3-expected.png deleted file mode 100644 index f445a6f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/absolute-in-inline-rtl-3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/absolute-in-inline-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/absolute-in-inline-rtl-expected.png deleted file mode 100644 index efed2f8..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/absolute-in-inline-rtl-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/004-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/004-expected.png deleted file mode 100644 index 63d88ab5..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/004-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/006-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/006-expected.png deleted file mode 100644 index 2b558bf1..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/006-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/vertical-rl/004-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/vertical-rl/004-expected.png deleted file mode 100644 index 37a94b4f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/vertical-rl/004-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/vertical-rl/006-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/vertical-rl/006-expected.png deleted file mode 100644 index fb97174..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/vertical-rl/006-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/vertical-lr/001-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/vertical-lr/001-expected.png deleted file mode 100644 index eb93237..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/vertical-lr/001-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/border-image-scaled-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/border-image-scaled-expected.png deleted file mode 100644 index 9cd7b44..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/border-image-scaled-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/inline-mask-overlay-image-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/inline-mask-overlay-image-expected.png deleted file mode 100644 index 2aee97f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/inline-mask-overlay-image-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/outline-alpha-block-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/outline-alpha-block-expected.png deleted file mode 100644 index 936cab3..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/outline-alpha-block-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/rtl-border-01-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/rtl-border-01-expected.png deleted file mode 100644 index 16cb4c1..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/rtl-border-01-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/canvas/image-object-in-canvas-expected.png deleted file mode 100644 index 1b4260b..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/canvas/image-object-in-canvas-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/007-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/007-expected.png deleted file mode 100644 index aae91c2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/007-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/009-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/009-expected.png deleted file mode 100644 index bcb0210d..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/009-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/010-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/010-expected.png deleted file mode 100644 index bcb0210d..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/010-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/compact/003-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/compact/003-expected.png deleted file mode 100644 index 7ceb418..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/compact/003-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/007-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/007-expected.png deleted file mode 100644 index 3a1d3e7..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/007-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/009-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/009-expected.png deleted file mode 100644 index b8c97fc..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/009-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/after-duplicated-after-split-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/after-duplicated-after-split-expected.png deleted file mode 100644 index ab80556..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/after-duplicated-after-split-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/table-cell-before-after-child-add-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/table-cell-before-after-child-add-expected.png deleted file mode 100644 index e4d2542..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/table-cell-before-after-child-add-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/005-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/005-expected.png deleted file mode 100644 index 607e913..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/005-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/ZeroOpacityLayers-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/ZeroOpacityLayers-expected.png deleted file mode 100644 index acc49674..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/ZeroOpacityLayers-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/absolute-poition-in-rtl-parent-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/absolute-poition-in-rtl-parent-expected.png deleted file mode 100644 index 77c54c89..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/absolute-poition-in-rtl-parent-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/color-correction-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/color-correction-expected.png deleted file mode 100644 index 9b3a27e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/color-correction-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/color-correction-on-text-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/color-correction-on-text-shadow-expected.png deleted file mode 100644 index 51acf63..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/color-correction-on-text-shadow-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/compare-content-style-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/compare-content-style-expected.png deleted file mode 100644 index eba8919..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/compare-content-style-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/content/content-quotes-01-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/content/content-quotes-01-expected.txt deleted file mode 100644 index 7eb8ae2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/content/content-quotes-01-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -The texts between the markers should be identical. - -========Marker1======== - -ab 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - -========Marker2======== - -WWaWWbWWWWWWWW 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - -========Marker3======== - -PASSED
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/content/content-quotes-05-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/content/content-quotes-05-expected.txt deleted file mode 100644 index e9c2297..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/content/content-quotes-05-expected.txt +++ /dev/null
@@ -1,11 +0,0 @@ -========Marker1======== - -abc 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - -========Marker2======== - -WWaWWWbWWWWWcWWWW 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - -========Marker3======== - -PASSED
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/create_element_align-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/create_element_align-expected.png deleted file mode 100644 index e927104..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/create_element_align-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/find-next-layer-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/find-next-layer-expected.png deleted file mode 100644 index 25a2dff..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/find-next-layer-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/first-letter-capitalized-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/first-letter-capitalized-expected.png deleted file mode 100644 index ecf952e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/first-letter-capitalized-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/first-letter-float-after-float-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/first-letter-float-after-float-expected.png deleted file mode 100644 index 688a9650..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/first-letter-float-after-float-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/focus-ring-outline-color-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/focus-ring-outline-color-expected.png deleted file mode 100644 index cca9786..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/focus-ring-outline-color-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/image-orientation/image-orientation-default-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/image-orientation/image-orientation-default-expected.png deleted file mode 100644 index 24bb01a..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/image-orientation/image-orientation-default-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/last-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/last-of-type-pseudo-class-expected.png deleted file mode 100644 index 426a716..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/last-of-type-pseudo-class-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/only-child-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/only-child-pseudo-class-expected.png deleted file mode 100644 index fa540f09..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/only-child-pseudo-class-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/only-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/only-of-type-pseudo-class-expected.png deleted file mode 100644 index 8eea776c..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/only-of-type-pseudo-class-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/pendingStylesheetFontSize-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/pendingStylesheetFontSize-expected.png deleted file mode 100644 index 4d98fab..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/pendingStylesheetFontSize-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-expected.png deleted file mode 100644 index 20258cf..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-transformed-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-transformed-expected.png deleted file mode 100644 index 71084936..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-transformed-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-transformed-iframe-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-transformed-iframe-expected.png deleted file mode 100644 index 3aa9666f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-transformed-iframe-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/shadow-multiple-expected.png deleted file mode 100644 index 2d1ad8a..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/shadow-multiple-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/simple-selector-chain-parsing-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/simple-selector-chain-parsing-expected.png deleted file mode 100644 index ba4a5e8..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/simple-selector-chain-parsing-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-expected.png deleted file mode 100644 index 138fb6a..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-center-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-center-expected.png deleted file mode 100644 index 4bab32d..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-center-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-justify-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-justify-expected.png deleted file mode 100644 index 78582770..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-justify-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-right-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-right-expected.png deleted file mode 100644 index ca9eb320..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-right-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/universal-hover-quirk-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/universal-hover-quirk-expected.png deleted file mode 100644 index 2b7e48a..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/universal-hover-quirk-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png deleted file mode 100644 index 7e8cec2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png deleted file mode 100644 index 7e8cec2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/visibility-hit-test-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/visibility-hit-test-expected.png deleted file mode 100644 index e0ea2af..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/visibility-hit-test-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png deleted file mode 100644 index a74bb49..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png deleted file mode 100644 index 5c1eeaa3..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/009-horizontal-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/009-horizontal-expected.png deleted file mode 100644 index a9f5e58..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/009-horizontal-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/010-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/010-expected.png deleted file mode 100644 index 865c628..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/010-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/018-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/018-expected.png deleted file mode 100644 index 233bbde84..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/018-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt deleted file mode 100644 index b64f482..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -PASS Check position for non-collapsed range. -FAIL Check position for collapsed range. assert_equals: Position of collapsed rect should match right edge of non-collapsed range. expected "16, 273.515625" but got "16, 273.5" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/children-nodes-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/children-nodes-expected.png deleted file mode 100644 index 814e969e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/children-nodes-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt deleted file mode 100644 index f3c84c5..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt +++ /dev/null
@@ -1,48 +0,0 @@ -PASS successfullyParsed is true - -TEST COMPLETE - -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/007-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/007-expected.png deleted file mode 100644 index c89d721f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/007-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/insert-before-table-part-in-continuation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/insert-before-table-part-in-continuation-expected.png deleted file mode 100644 index 5947723..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/insert-before-table-part-in-continuation-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/noninlinebadness-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/noninlinebadness-expected.png deleted file mode 100644 index c0f4fe9..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/noninlinebadness-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/basic/inheritance-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/basic/inheritance-expected.png deleted file mode 100644 index b918d43..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/basic/inheritance-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/acid_test-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/acid_test-expected.png deleted file mode 100644 index f7700d8..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/acid_test-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_bottom-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_bottom-expected.png deleted file mode 100644 index dafeeee..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_bottom-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_bottom_width_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_bottom_width_inline-expected.png deleted file mode 100644 index d88d7fd..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_bottom_width_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_inline-expected.png deleted file mode 100644 index 768c43c1..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_left_width_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_left_width_inline-expected.png deleted file mode 100644 index a218d87..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_left_width_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_style_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_style_inline-expected.png deleted file mode 100644 index 29c038f..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_style_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_top_width-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_top_width-expected.png deleted file mode 100644 index 8fbc5f7..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_top_width-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/clear_float-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/clear_float-expected.png deleted file mode 100644 index 642b678..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/clear_float-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/float-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/float-expected.png deleted file mode 100644 index dcd8ec78..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/float-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/float_margin-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/float_margin-expected.png deleted file mode 100644 index 239c9fa..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/float_margin-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_inline-expected.png deleted file mode 100644 index f4a263d..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_left-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_left-expected.png deleted file mode 100644 index c79d8bd3..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_left-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_top_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_top_inline-expected.png deleted file mode 100644 index 237ba1d9..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_top_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_left-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_left-expected.png deleted file mode 100644 index c3aa8bd..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_left-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_right-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_right-expected.png deleted file mode 100644 index 6e620d40..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_right-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_top_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_top_inline-expected.png deleted file mode 100644 index 5cf66bd..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_top_inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style-expected.png deleted file mode 100644 index 061f760d..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style_image-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style_image-expected.png deleted file mode 100644 index ec18f7f3..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style_image-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style_type-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style_type-expected.png deleted file mode 100644 index 24897d9..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style_type-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/color_and_background/background-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/color_and_background/background-expected.png deleted file mode 100644 index 9cdb6ec0..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/color_and_background/background-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/formatting_model/floating_elements-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/formatting_model/floating_elements-expected.png deleted file mode 100644 index 7756c4b..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/formatting_model/floating_elements-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/formatting_model/horizontal_formatting-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/formatting_model/horizontal_formatting-expected.png deleted file mode 100644 index 98d09f408..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/formatting_model/horizontal_formatting-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/units/percentage_units-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/units/percentage_units-expected.png deleted file mode 100644 index c81015b0..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css1/units/percentage_units-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/20110323/table-height-algorithm-024-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/20110323/table-height-algorithm-024-expected.png deleted file mode 100644 index d3b3248..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/20110323/table-height-algorithm-024-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t051103-dom-hover-01-c-io-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t051103-dom-hover-01-c-io-expected.png deleted file mode 100644 index 25644a6..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t051103-dom-hover-01-c-io-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0602-c13-inh-underlin-00-e-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0602-c13-inh-underlin-00-e-expected.png deleted file mode 100644 index 010621b6..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0602-c13-inh-underlin-00-e-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5521-brdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5521-brdr-l-00-a-expected.png deleted file mode 100644 index 87890d7..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5521-brdr-l-00-a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png deleted file mode 100644 index 1ebbc4f..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5522-ibrdr-00-a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5522-ibrdr-00-a-expected.png deleted file mode 100644 index f75ed6f6..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5522-ibrdr-00-a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c414-flt-04-c-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c414-flt-04-c-expected.png deleted file mode 100644 index bc4211a..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c414-flt-04-c-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png deleted file mode 100644 index 09ecdb1d..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c5525-fltcont-00-d-g-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c5525-fltcont-00-d-g-expected.png deleted file mode 100644 index 5c0b47e..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c5525-fltcont-00-d-g-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c5525-fltwrap-00-b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c5525-fltwrap-00-b-expected.png deleted file mode 100644 index 145b6e0..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c5525-fltwrap-00-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1004-c5524-width-00-b-g-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1004-c5524-width-00-b-g-expected.png deleted file mode 100644 index 823dfbf..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1004-c5524-width-00-b-g-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1202-counter-15-b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1202-counter-15-b-expected.png deleted file mode 100644 index 17461edc..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1202-counter-15-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1202-counters-13-b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1202-counters-13-b-expected.png deleted file mode 100644 index 860bc7f..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1202-counters-13-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1205-c565-list-pos-00-b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1205-c565-list-pos-00-b-expected.png deleted file mode 100644 index 73d69fd..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1205-c565-list-pos-00-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1205-c566-list-stl-01-c-g-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1205-c566-list-stl-01-c-g-expected.png deleted file mode 100644 index 1390c4cb..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1205-c566-list-stl-01-c-g-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1508-c527-font-06-b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1508-c527-font-06-b-expected.png deleted file mode 100644 index 11096a6..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1508-c527-font-06-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1508-c527-font-10-c-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1508-c527-font-10-c-expected.png deleted file mode 100644 index a7f09cd..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1508-c527-font-10-c-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/css3-modsel-35-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/css3-modsel-35-expected.png deleted file mode 100644 index c4f07d8b..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/css3-modsel-35-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/font-feature-settings-rendering-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/font-feature-settings-rendering-expected.png deleted file mode 100644 index 45127ce..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/font-feature-settings-rendering-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-168a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-168a-expected.png deleted file mode 100644 index dd901c96..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-168a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-20-expected.png deleted file mode 100644 index 2b8682d..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-20-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-35-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-35-expected.png deleted file mode 100644 index c4f07d8b..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-35-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-39-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-39-expected.png deleted file mode 100644 index 04dc941f..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-39-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-42-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-42-expected.png deleted file mode 100644 index fb9a8aa..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-42-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-42a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-42a-expected.png deleted file mode 100644 index fb9a8aa..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-42a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-5-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-5-expected.png deleted file mode 100644 index 7087c35..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-5-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-7-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-7-expected.png deleted file mode 100644 index a4410c7..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-7-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-78b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-78b-expected.png deleted file mode 100644 index 309c0a7..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-78b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-166-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-166-expected.png deleted file mode 100644 index 266114d..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-166-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-168a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-168a-expected.png deleted file mode 100644 index dd901c96..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-168a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-20-expected.png deleted file mode 100644 index 2b8682d..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-20-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-3-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-3-expected.png deleted file mode 100644 index 89289b3e..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-39-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-39-expected.png deleted file mode 100644 index 04dc941f..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-39-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-42-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-42-expected.png deleted file mode 100644 index fb9a8aa..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-42-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-7-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-7-expected.png deleted file mode 100644 index a4410c7..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-7-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-153-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-153-expected.png deleted file mode 100644 index d9fbc47..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-153-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-166a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-166a-expected.png deleted file mode 100644 index dd01181..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-166a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-168-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-168-expected.png deleted file mode 100644 index 804fdfa6..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-168-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-20-expected.png deleted file mode 100644 index bf18631..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-20-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-22-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-22-expected.png deleted file mode 100644 index 31b3fb0..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-22-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-3-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-3-expected.png deleted file mode 100644 index 45a0932..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-42a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-42a-expected.png deleted file mode 100644 index 6536745..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-42a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-66-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-66-expected.png deleted file mode 100644 index 2684dabe..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-66-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-78b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-78b-expected.png deleted file mode 100644 index 71060ce..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-78b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-79-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-79-expected.png deleted file mode 100644 index dcc504a..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-79-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/editing/selection/4402375-expected.png b/third_party/blink/web_tests/platform/mac-retina/editing/selection/4402375-expected.png deleted file mode 100644 index 38d5c6d3..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/editing/selection/4402375-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/editing/selection/4402375-expected.txt b/third_party/blink/web_tests/platform/mac-retina/editing/selection/4402375-expected.txt deleted file mode 100644 index 464465f..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/editing/selection/4402375-expected.txt +++ /dev/null
@@ -1,27 +0,0 @@ -EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutNGBlockFlow {HTML} at (0,0) size 800x600 - LayoutNGBlockFlow {BODY} at (8,8) size 784x584 - LayoutNGBlockFlow {P} at (0,0) size 784x36 - LayoutText {#text} at (0,0) size 135x18 - text run at (0,0) width 135: "This is a testcase for " - LayoutInline {A} at (134,0) size 154x18 [color=#0000EE] - LayoutText {#text} at (134,0) size 154x18 - text run at (134,0) width 154: "rdar://problem/4402375" - LayoutText {#text} at (0,0) size 774x36 - text run at (287,0) width 487: " \"REGRESSION (417.8-TOT): finding text sometimes also selects previous" - text run at (0,18) width 139: "image (5127) (6451)\"" - LayoutNGBlockFlow {P} at (0,70) size 784x36 - LayoutText {#text} at (0,0) size 759x36 - text run at (0,0) width 759: "This test uses a right aligned image next to some left aligned text. The image should not be selected, and should not be" - text run at (0,18) width 612: "included in the selection rect (you won't see the selection rect when you run this test manually)." - LayoutNGBlockFlow {DIV} at (0,122) size 784x18 - LayoutImage (floating) {IMG} at (708,0) size 76x103 - LayoutText {#text} at (0,0) size 182x18 - text run at (0,0) width 182: "This text should be selected." -layer at (8,60) size 784x2 clip at (0,0) size 0x0 - LayoutNGBlockFlow {HR} at (0,52) size 784x2 [border: (1px inset #EEEEEE)] -selection start: position 0 of child 1 {#text} of child 6 {DIV} of body -selection end: position 29 of child 1 {#text} of child 6 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/mac-retina/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png b/third_party/blink/web_tests/platform/mac-retina/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png deleted file mode 100644 index bde97c2..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/editing/selection/select-text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/mac-retina/editing/selection/select-text-overflow-ellipsis-expected.png deleted file mode 100644 index 9b6b38bd..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/editing/selection/select-text-overflow-ellipsis-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png b/third_party/blink/web_tests/platform/mac-retina/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png deleted file mode 100644 index f415ab9..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt b/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt deleted file mode 100644 index 3a100a48..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt +++ /dev/null
@@ -1,21 +0,0 @@ -This is a testharness.js-based test. -PASS .grid 1 -FAIL .grid 2 assert_equals: -<div class="grid RTL"> - <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div> - <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div> - <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetLeft expected 35 but got 5 -PASS .grid 3 -FAIL .grid 4 assert_equals: -<div class="grid verticalRL"> - <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div> - <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div> - <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetTop expected 115 but got 110 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt b/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt deleted file mode 100644 index 3a100a48..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt +++ /dev/null
@@ -1,21 +0,0 @@ -This is a testharness.js-based test. -PASS .grid 1 -FAIL .grid 2 assert_equals: -<div class="grid RTL"> - <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div> - <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div> - <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetLeft expected 35 but got 5 -PASS .grid 3 -FAIL .grid 4 assert_equals: -<div class="grid verticalRL"> - <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div> - <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div> - <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetTop expected 115 but got 110 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt b/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt deleted file mode 100644 index bac9d81..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL Height must change when line-height-step changes assert_not_equals: got disallowed value 28 -PASS Height must not change after relayout -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/animated-gif-as-background-rounded-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/animated-gif-as-background-rounded-expected.png deleted file mode 100644 index 1c340ad..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/animated-gif-as-background-rounded-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/repeat/negative-offset-repeat-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/repeat/negative-offset-repeat-expected.png deleted file mode 100644 index 92e5e871..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/repeat/negative-offset-repeat-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png deleted file mode 100644 index 8dfcc77..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/basic/015-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/basic/015-expected.png deleted file mode 100644 index 7a2dbaa..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/basic/015-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/basic/adding-near-anonymous-block-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/basic/adding-near-anonymous-block-expected.png deleted file mode 100644 index 604e6d8..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/basic/adding-near-anonymous-block-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/float/028-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/float/028-expected.png deleted file mode 100644 index dcf831b..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/float/028-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/float/independent-align-positioning-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/float/independent-align-positioning-expected.png deleted file mode 100644 index 323a8a4..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/float/independent-align-positioning-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/float/nopaint-after-layer-destruction2-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/float/nopaint-after-layer-destruction2-expected.png deleted file mode 100644 index a936b73..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/float/nopaint-after-layer-destruction2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/006-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/006-expected.png deleted file mode 100644 index fb01fd6..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/006-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/015-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/015-expected.png deleted file mode 100644 index 2b3e410..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/015-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/017-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/017-expected.png deleted file mode 100644 index cd5bba7..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/017-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/019-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/019-expected.png deleted file mode 100644 index 3f83783a..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/019-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/020-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/020-expected.png deleted file mode 100644 index 7d9acf0..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/020-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/059-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/059-expected.png deleted file mode 100644 index 4901154..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/059-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/103-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/103-expected.png deleted file mode 100644 index 04fe0565..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/103-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/block-inside-inline/005-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/block-inside-inline/005-expected.png deleted file mode 100644 index cc417cf..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/block-inside-inline/005-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/block-inside-inline/016-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/block-inside-inline/016-expected.png deleted file mode 100644 index 5704a8a..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/block-inside-inline/016-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/001-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/001-expected.png deleted file mode 100644 index 2c852a66..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/001-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/absolute-in-inline-rtl-3-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/absolute-in-inline-rtl-3-expected.png deleted file mode 100644 index f445a6f..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/absolute-in-inline-rtl-3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/absolute-in-inline-rtl-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/absolute-in-inline-rtl-expected.png deleted file mode 100644 index efed2f8..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/absolute-in-inline-rtl-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/004-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/004-expected.png deleted file mode 100644 index 63d88ab5..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/004-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/006-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/006-expected.png deleted file mode 100644 index 2b558bf1..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/006-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/vertical-rl/004-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/vertical-rl/004-expected.png deleted file mode 100644 index 37a94b4f..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/vertical-rl/004-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/vertical-rl/006-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/vertical-rl/006-expected.png deleted file mode 100644 index fb97174..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/vertical-rl/006-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/vertical-lr/001-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/vertical-lr/001-expected.png deleted file mode 100644 index eb93237..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/vertical-lr/001-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/borders/border-image-scaled-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/borders/border-image-scaled-expected.png deleted file mode 100644 index 9cd7b44..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/borders/border-image-scaled-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/borders/inline-mask-overlay-image-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/borders/inline-mask-overlay-image-expected.png deleted file mode 100644 index 2aee97f..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/borders/inline-mask-overlay-image-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/borders/inline-mask-overlay-image-outset-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/borders/inline-mask-overlay-image-outset-expected.png deleted file mode 100644 index 10a6893d..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/borders/inline-mask-overlay-image-outset-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/borders/outline-alpha-block-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/borders/outline-alpha-block-expected.png deleted file mode 100644 index 936cab3..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/borders/outline-alpha-block-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/borders/rtl-border-01-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/borders/rtl-border-01-expected.png deleted file mode 100644 index 16cb4c1..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/borders/rtl-border-01-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/canvas/image-object-in-canvas-expected.png deleted file mode 100644 index 1b4260b..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/canvas/image-object-in-canvas-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/clip/007-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/clip/007-expected.png deleted file mode 100644 index aae91c2..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/clip/007-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/clip/009-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/clip/009-expected.png deleted file mode 100644 index bcb0210d..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/clip/009-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/clip/010-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/clip/010-expected.png deleted file mode 100644 index bcb0210d..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/clip/010-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/compact/003-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/compact/003-expected.png deleted file mode 100644 index 7ceb418..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/compact/003-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/007-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/007-expected.png deleted file mode 100644 index 3a1d3e7..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/007-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/009-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/009-expected.png deleted file mode 100644 index b8c97fc..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/009-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/after-duplicated-after-split-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/after-duplicated-after-split-expected.png deleted file mode 100644 index ab80556..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/after-duplicated-after-split-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/before-with-first-letter-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/before-with-first-letter-expected.png deleted file mode 100644 index 0ba21a1..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/before-with-first-letter-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/table-cell-before-after-child-add-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/table-cell-before-after-child-add-expected.png deleted file mode 100644 index e4d2542..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/table-cell-before-after-child-add-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/005-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/005-expected.png deleted file mode 100644 index 607e913..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/005-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/ZeroOpacityLayers-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/ZeroOpacityLayers-expected.png deleted file mode 100644 index acc49674..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/ZeroOpacityLayers-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/absolute-poition-in-rtl-parent-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/absolute-poition-in-rtl-parent-expected.png deleted file mode 100644 index 77c54c89..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/absolute-poition-in-rtl-parent-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/clip-zooming-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/clip-zooming-expected.png deleted file mode 100644 index 2d51d6a..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/clip-zooming-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/color-correction-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/color-correction-expected.png deleted file mode 100644 index 9b3a27e..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/color-correction-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/color-correction-on-text-shadow-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/color-correction-on-text-shadow-expected.png deleted file mode 100644 index 51acf63..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/color-correction-on-text-shadow-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/compare-content-style-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/compare-content-style-expected.png deleted file mode 100644 index eba8919..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/compare-content-style-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/content/content-quotes-01-expected.txt b/third_party/blink/web_tests/platform/mac-retina/fast/css/content/content-quotes-01-expected.txt deleted file mode 100644 index 7eb8ae2..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/content/content-quotes-01-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -The texts between the markers should be identical. - -========Marker1======== - -ab 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - -========Marker2======== - -WWaWWbWWWWWWWW 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - -========Marker3======== - -PASSED
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/content/content-quotes-05-expected.txt b/third_party/blink/web_tests/platform/mac-retina/fast/css/content/content-quotes-05-expected.txt deleted file mode 100644 index e9c2297..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/content/content-quotes-05-expected.txt +++ /dev/null
@@ -1,11 +0,0 @@ -========Marker1======== - -abc 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - -========Marker2======== - -WWaWWWbWWWWWcWWWW 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - -========Marker3======== - -PASSED
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/create_element_align-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/create_element_align-expected.png deleted file mode 100644 index e927104..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/create_element_align-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/find-next-layer-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/find-next-layer-expected.png deleted file mode 100644 index 25a2dff..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/find-next-layer-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/first-letter-capitalized-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/first-letter-capitalized-expected.png deleted file mode 100644 index ecf952e..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/first-letter-capitalized-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/first-letter-float-after-float-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/first-letter-float-after-float-expected.png deleted file mode 100644 index 688a9650..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/first-letter-float-after-float-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/focus-ring-outline-color-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/focus-ring-outline-color-expected.png deleted file mode 100644 index cca9786..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/focus-ring-outline-color-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/image-orientation/image-orientation-default-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/image-orientation/image-orientation-default-expected.png deleted file mode 100644 index 24bb01a..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/image-orientation/image-orientation-default-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/last-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/last-of-type-pseudo-class-expected.png deleted file mode 100644 index 426a716..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/last-of-type-pseudo-class-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/only-child-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/only-child-pseudo-class-expected.png deleted file mode 100644 index fa540f09..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/only-child-pseudo-class-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/only-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/only-of-type-pseudo-class-expected.png deleted file mode 100644 index 8eea776c..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/only-of-type-pseudo-class-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/pendingStylesheetFontSize-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/pendingStylesheetFontSize-expected.png deleted file mode 100644 index 4d98fab..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/pendingStylesheetFontSize-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-expected.png deleted file mode 100644 index 20258cf..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-transformed-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-transformed-expected.png deleted file mode 100644 index 71084936..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-transformed-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-transformed-iframe-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-transformed-iframe-expected.png deleted file mode 100644 index 3aa9666f..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-transformed-iframe-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/shadow-multiple-expected.png deleted file mode 100644 index 2d1ad8a..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/shadow-multiple-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/simple-selector-chain-parsing-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/simple-selector-chain-parsing-expected.png deleted file mode 100644 index ba4a5e8..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/simple-selector-chain-parsing-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-expected.png deleted file mode 100644 index 138fb6a..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-center-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-center-expected.png deleted file mode 100644 index 4bab32d..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-center-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-justify-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-justify-expected.png deleted file mode 100644 index 78582770..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-justify-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-right-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-right-expected.png deleted file mode 100644 index ca9eb320..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-right-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/universal-hover-quirk-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/universal-hover-quirk-expected.png deleted file mode 100644 index 2b7e48a..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/universal-hover-quirk-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png deleted file mode 100644 index 7e8cec2..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png deleted file mode 100644 index 7e8cec2..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/visibility-hit-test-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/visibility-hit-test-expected.png deleted file mode 100644 index e0ea2af..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css/visibility-hit-test-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png deleted file mode 100644 index a74bb49..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png deleted file mode 100644 index 5c1eeaa3..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/009-horizontal-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/009-horizontal-expected.png deleted file mode 100644 index a9f5e58..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/009-horizontal-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/010-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/010-expected.png deleted file mode 100644 index 865c628..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/010-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/018-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/018-expected.png deleted file mode 100644 index 233bbde84..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/018-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dom/children-nodes-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/dom/children-nodes-expected.png deleted file mode 100644 index 814e969e..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/dom/children-nodes-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt b/third_party/blink/web_tests/platform/mac-retina/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt deleted file mode 100644 index f3c84c5..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt +++ /dev/null
@@ -1,48 +0,0 @@ -PASS successfullyParsed is true - -TEST COMPLETE - -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/007-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/007-expected.png deleted file mode 100644 index c89d721f..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/007-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/012-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/012-expected.png deleted file mode 100644 index 01fb950f..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/012-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/insert-before-table-part-in-continuation-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/insert-before-table-part-in-continuation-expected.png deleted file mode 100644 index 5947723..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/insert-before-table-part-in-continuation-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/noninlinebadness-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/noninlinebadness-expected.png deleted file mode 100644 index c0f4fe9..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/noninlinebadness-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/push-block-with-first-line-expected.txt b/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/push-block-with-first-line-expected.txt deleted file mode 100644 index ef3da81..0000000 --- a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/push-block-with-first-line-expected.txt +++ /dev/null
@@ -1,33 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling Contents Layer", - "bounds": [800, 600], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF", - "paintInvalidations": [ - { - "object": "NGPhysicalLineBoxFragment", - "rect": [8, 68, 784, 20], - "reason": "geometry" - }, - { - "object": "NGPhysicalLineBoxFragment", - "rect": [8, 8, 784, 20], - "reason": "geometry" - }, - { - "object": "NGPhysicalTextFragment 'JOCULAR'", - "rect": [8, 68, 140, 20], - "reason": "geometry" - }, - { - "object": "NGPhysicalTextFragment 'JOCULAR'", - "rect": [8, 8, 140, 20], - "reason": "geometry" - } - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/platform/mac/css1/basic/inheritance-expected.png b/third_party/blink/web_tests/platform/mac/css1/basic/inheritance-expected.png index 2367fdbb..b918d43 100644 --- a/third_party/blink/web_tests/platform/mac/css1/basic/inheritance-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/basic/inheritance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/acid_test-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/acid_test-expected.png index e5ca7bd..f7700d8 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/acid_test-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/acid_test-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom-expected.png index 84f9191..dafeeee 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom_width_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom_width_inline-expected.png index 45748e41..d88d7fd 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom_width_inline-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom_width_inline-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_inline-expected.png index 9c30b54..768c43c1 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_inline-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_inline-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_left_width_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_left_width_inline-expected.png index 3dfcb8c6..a218d87 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_left_width_inline-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_left_width_inline-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_style_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_style_inline-expected.png index 8d6d04b0..29c038f 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_style_inline-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_style_inline-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_top_width-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_top_width-expected.png index 73d7c6e..8fbc5f7 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_top_width-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_top_width-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/clear_float-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/clear_float-expected.png index c457405b..642b678 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/clear_float-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/clear_float-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/float-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/float-expected.png index 25038d5..dcd8ec78 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/float-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/float-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/float_margin-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/float_margin-expected.png index d4855ce..239c9fa 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/float_margin-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/float_margin-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_inline-expected.png index 0c162df..f4a263d 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_inline-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_inline-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_left-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_left-expected.png index d957d69..c79d8bd3 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_left-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_left-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_top_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_top_inline-expected.png index 43932a1..237ba1d9 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_top_inline-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_top_inline-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_left-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_left-expected.png index 5f8603c..c3aa8bd 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_left-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_left-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_right-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_right-expected.png index d3dd1ba..6e620d40 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_right-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_right-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_top_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_top_inline-expected.png index aab74a1..5cf66bd 100644 --- a/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_top_inline-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_top_inline-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/classification/list_style-expected.png b/third_party/blink/web_tests/platform/mac/css1/classification/list_style-expected.png index 49fc1be..061f760d 100644 --- a/third_party/blink/web_tests/platform/mac/css1/classification/list_style-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/classification/list_style-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/classification/list_style_image-expected.png b/third_party/blink/web_tests/platform/mac/css1/classification/list_style_image-expected.png index eeccd98..ec18f7f3 100644 --- a/third_party/blink/web_tests/platform/mac/css1/classification/list_style_image-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/classification/list_style_image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/classification/list_style_type-expected.png b/third_party/blink/web_tests/platform/mac/css1/classification/list_style_type-expected.png index 2c26b31..24897d9 100644 --- a/third_party/blink/web_tests/platform/mac/css1/classification/list_style_type-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/classification/list_style_type-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/color_and_background/background-expected.png b/third_party/blink/web_tests/platform/mac/css1/color_and_background/background-expected.png index dd92bbeb..9cdb6ec0 100644 --- a/third_party/blink/web_tests/platform/mac/css1/color_and_background/background-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/color_and_background/background-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/formatting_model/floating_elements-expected.png b/third_party/blink/web_tests/platform/mac/css1/formatting_model/floating_elements-expected.png index a3b97f7c..7756c4b 100644 --- a/third_party/blink/web_tests/platform/mac/css1/formatting_model/floating_elements-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/formatting_model/floating_elements-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/formatting_model/horizontal_formatting-expected.png b/third_party/blink/web_tests/platform/mac/css1/formatting_model/horizontal_formatting-expected.png index d188969..98d09f408 100644 --- a/third_party/blink/web_tests/platform/mac/css1/formatting_model/horizontal_formatting-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/formatting_model/horizontal_formatting-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/units/percentage_units-expected.png b/third_party/blink/web_tests/platform/mac/css1/units/percentage_units-expected.png index 26afa66..c81015b0 100644 --- a/third_party/blink/web_tests/platform/mac/css1/units/percentage_units-expected.png +++ b/third_party/blink/web_tests/platform/mac/css1/units/percentage_units-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/20110323/table-height-algorithm-024-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/20110323/table-height-algorithm-024-expected.png index 771e8b7..d3b3248 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/20110323/table-height-algorithm-024-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/20110323/table-height-algorithm-024-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t040302-c61-phys-len-00-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t040302-c61-phys-len-00-b-expected.png index e032fcf..58cb015 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t040302-c61-phys-len-00-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t040302-c61-phys-len-00-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t051103-dom-hover-01-c-io-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t051103-dom-hover-01-c-io-expected.png index 0d905ab..25644a6 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t051103-dom-hover-01-c-io-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t051103-dom-hover-01-c-io-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0602-c13-inh-underlin-00-e-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0602-c13-inh-underlin-00-e-expected.png index e647816..010621b6 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t0602-c13-inh-underlin-00-e-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t0602-c13-inh-underlin-00-e-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-brdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-brdr-l-00-a-expected.png index 3370143..87890d7 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-brdr-l-00-a-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-brdr-l-00-a-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png index 57ae833..1ebbc4f 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-brdr-02-e-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-brdr-02-e-expected.png index 648afb1..33909e8 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-brdr-02-e-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-brdr-02-e-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-ibrdr-00-a-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-ibrdr-00-a-expected.png index ace06377..f75ed6f6 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-ibrdr-00-a-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-ibrdr-00-a-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-04-c-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-04-c-expected.png index 11323076..bc4211a 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-04-c-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-04-c-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png index 9ec84510..09ecdb1d 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltcont-00-d-g-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltcont-00-d-g-expected.png index be2399a..5c0b47e 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltcont-00-d-g-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltcont-00-d-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltwrap-00-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltwrap-00-b-expected.png index 8ff7d240..145b6e0 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltwrap-00-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltwrap-00-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1004-c5524-width-00-b-g-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1004-c5524-width-00-b-g-expected.png index e92b2a3..823dfbf 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t1004-c5524-width-00-b-g-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t1004-c5524-width-00-b-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-08-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-08-b-expected.png index 81c1f51..719ecc1 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-08-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-08-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-15-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-15-b-expected.png index c143f6d..17461edc 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-15-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-15-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1202-counters-13-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1202-counters-13-b-expected.png index f5b8952..860bc7f 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t1202-counters-13-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t1202-counters-13-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1205-c561-list-displ-00-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1205-c561-list-displ-00-b-expected.png index 58a2021..1f81c01 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t1205-c561-list-displ-00-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t1205-c561-list-displ-00-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1205-c565-list-pos-00-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1205-c565-list-pos-00-b-expected.png index 47a6ef1c..73d69fd 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t1205-c565-list-pos-00-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t1205-c565-list-pos-00-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1205-c566-list-stl-01-c-g-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1205-c566-list-stl-01-c-g-expected.png index 53163a79..1390c4cb 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t1205-c566-list-stl-01-c-g-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t1205-c566-list-stl-01-c-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-06-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-06-b-expected.png index 45128a5..11096a6 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-06-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-06-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-10-c-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-10-c-expected.png index 682a0985..a7f09cd 100644 --- a/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-10-c-expected.png +++ b/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-10-c-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/css3-modsel-35-expected.png b/third_party/blink/web_tests/platform/mac/css3/css3-modsel-35-expected.png index b223761..c4f07d8b 100644 --- a/third_party/blink/web_tests/platform/mac/css3/css3-modsel-35-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/css3-modsel-35-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/font-feature-settings-rendering-expected.png b/third_party/blink/web_tests/platform/mac/css3/font-feature-settings-rendering-expected.png index a732e2c..45127ce 100644 --- a/third_party/blink/web_tests/platform/mac/css3/font-feature-settings-rendering-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/font-feature-settings-rendering-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-168a-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-168a-expected.png index 88d1000e..dd901c96 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-168a-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-168a-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-20-expected.png index 13a1db3..2b8682d 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-20-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-20-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-35-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-35-expected.png index b223761..c4f07d8b 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-35-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-35-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-39-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-39-expected.png index 031e3e14..04dc941f 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-39-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-39-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42-expected.png index 38a23fdf..fb9a8aa 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42a-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42a-expected.png index 38a23fdf..fb9a8aa 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42a-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42a-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-5-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-5-expected.png index 14bc45f..7087c35 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-5-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-5-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-7-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-7-expected.png index 35bbdb2f..a4410c7 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-7-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-7-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-78b-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-78b-expected.png index 371a7500..309c0a7 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-78b-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-78b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-80-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-80-expected.png index c255d1d..f35e115 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-80-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-80-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-166-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-166-expected.png index 4c5fbf35..266114d 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-166-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-166-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-168a-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-168a-expected.png index 88d1000e..dd901c96 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-168a-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-168a-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-20-expected.png index 13a1db3..2b8682d 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-20-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-20-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-3-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-3-expected.png index 647f25c..89289b3e 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-3-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-3-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-39-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-39-expected.png index 031e3e14..04dc941f 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-39-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-39-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-42-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-42-expected.png index 38a23fdf..fb9a8aa 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-42-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-42-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-7-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-7-expected.png index 35bbdb2f..a4410c7 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-7-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-7-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-153-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-153-expected.png index ece2cad..d9fbc47 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-153-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-153-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-166a-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-166a-expected.png index d4a1698..dd01181 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-166a-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-166a-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-168-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-168-expected.png index c7f47d8..804fdfa6 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-168-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-168-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-20-expected.png index 2a2e0bd..bf18631 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-20-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-20-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-22-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-22-expected.png index 82c43347..31b3fb0 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-22-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-22-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-3-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-3-expected.png index a2a04a6..45a0932 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-3-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-3-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-42a-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-42a-expected.png index 5d765c3..6536745 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-42a-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-42a-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-66-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-66-expected.png index c0aa0b9..2684dabe 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-66-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-66-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-78b-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-78b-expected.png index bf63709f5..71060ce 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-78b-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-78b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-79-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-79-expected.png index e9e3855..dcc504a 100644 --- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-79-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-79-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.png b/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.png index 51d6f1b..38d5c6d3 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.png +++ b/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.txt index 68ec3afe..464465f 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.txt
@@ -2,9 +2,9 @@ layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x36 + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x36 LayoutText {#text} at (0,0) size 135x18 text run at (0,0) width 135: "This is a testcase for " LayoutInline {A} at (134,0) size 154x18 [color=#0000EE] @@ -13,16 +13,15 @@ LayoutText {#text} at (0,0) size 774x36 text run at (287,0) width 487: " \"REGRESSION (417.8-TOT): finding text sometimes also selects previous" text run at (0,18) width 139: "image (5127) (6451)\"" - LayoutBlockFlow {P} at (0,70) size 784x36 + LayoutNGBlockFlow {P} at (0,70) size 784x36 LayoutText {#text} at (0,0) size 759x36 - text run at (0,0) width 424: "This test uses a right aligned image next to some left aligned text. " - text run at (423,0) width 336: "The image should not be selected, and should not be" + text run at (0,0) width 759: "This test uses a right aligned image next to some left aligned text. The image should not be selected, and should not be" text run at (0,18) width 612: "included in the selection rect (you won't see the selection rect when you run this test manually)." - LayoutBlockFlow {DIV} at (0,122) size 784x18 + LayoutNGBlockFlow {DIV} at (0,122) size 784x18 LayoutImage (floating) {IMG} at (708,0) size 76x103 LayoutText {#text} at (0,0) size 182x18 text run at (0,0) width 182: "This text should be selected." layer at (8,60) size 784x2 clip at (0,0) size 0x0 - LayoutBlockFlow {HR} at (0,52) size 784x2 [border: (1px inset #EEEEEE)] + LayoutNGBlockFlow {HR} at (0,52) size 784x2 [border: (1px inset #EEEEEE)] selection start: position 0 of child 1 {#text} of child 6 {DIV} of body selection end: position 29 of child 1 {#text} of child 6 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/5232159-expected.png b/third_party/blink/web_tests/platform/mac/editing/selection/5232159-expected.png index 1b28bf8..846701e 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/5232159-expected.png +++ b/third_party/blink/web_tests/platform/mac/editing/selection/5232159-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png b/third_party/blink/web_tests/platform/mac/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png index 726790b..bde97c2 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png +++ b/third_party/blink/web_tests/platform/mac/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.png index 2956ec0..9b6b38bd 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.png +++ b/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png b/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png index afe036e9..f415ab9 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png +++ b/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/backgrounds/animated-gif-as-background-rounded-expected.png b/third_party/blink/web_tests/platform/mac/fast/backgrounds/animated-gif-as-background-rounded-expected.png index 07e77598..1c340ad 100644 --- a/third_party/blink/web_tests/platform/mac/fast/backgrounds/animated-gif-as-background-rounded-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/backgrounds/animated-gif-as-background-rounded-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-expected.png b/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-expected.png index a483a39..92e5e871 100644 --- a/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png b/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png index 7d12fc42..8dfcc77 100644 --- a/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/basic/015-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/basic/015-expected.png index b150938..7a2dbaa 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/basic/015-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/basic/015-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/basic/adding-near-anonymous-block-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/basic/adding-near-anonymous-block-expected.png index 1067cc7..604e6d8 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/basic/adding-near-anonymous-block-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/basic/adding-near-anonymous-block-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/float/028-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/float/028-expected.png index 99717474..dcf831b 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/float/028-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/float/028-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/float/independent-align-positioning-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/float/independent-align-positioning-expected.png index 130ca8e..323a8a4 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/float/independent-align-positioning-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/float/independent-align-positioning-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/float/nopaint-after-layer-destruction2-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/float/nopaint-after-layer-destruction2-expected.png index 5ae00310..a936b73 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/float/nopaint-after-layer-destruction2-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/float/nopaint-after-layer-destruction2-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/006-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/006-expected.png index 75d9dea3..fb01fd6 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/006-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/006-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/015-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/015-expected.png index 38e6436..2b3e410 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/015-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/015-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/017-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/017-expected.png index 7d735a2..cd5bba7 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/017-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/017-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/019-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/019-expected.png index 92091a3..3f83783a 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/019-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/019-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/020-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/020-expected.png index 102bc3e..7d9acf0 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/020-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/020-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/059-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/059-expected.png index 83595830..4901154 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/059-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/059-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/103-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/103-expected.png index b9951c0..04fe0565 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/103-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/103-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/005-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/005-expected.png index 7437719..cc417cf 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/005-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/005-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/016-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/016-expected.png index 15c657a..5704a8a 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/016-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/016-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/001-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/001-expected.png index 6f94823..2c852a66 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/001-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/001-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-3-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-3-expected.png index e2f1457..f445a6f 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-3-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-3-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-expected.png index 4a32ae27..efed2f8 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/004-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/004-expected.png index 0a0d632..63d88ab5 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/004-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/004-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/006-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/006-expected.png index 746297a..2b558bf1 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/006-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/006-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/004-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/004-expected.png index c326d6bf..37a94b4f 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/004-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/004-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/006-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/006-expected.png index 6ad14722..fb97174 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/006-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/006-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/vertical-lr/001-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/vertical-lr/001-expected.png index 85b64e8..eb93237 100644 --- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/vertical-lr/001-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/vertical-lr/001-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/border-image-scaled-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/border-image-scaled-expected.png index 602e89a..9cd7b44 100644 --- a/third_party/blink/web_tests/platform/mac/fast/borders/border-image-scaled-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/borders/border-image-scaled-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-expected.png index 55de7565..2aee97f 100644 --- a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-expected.png index d638408..10a6893d 100644 --- a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/outline-alpha-block-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/outline-alpha-block-expected.png index 343efb75..936cab3 100644 --- a/third_party/blink/web_tests/platform/mac/fast/borders/outline-alpha-block-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/borders/outline-alpha-block-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/rtl-border-01-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/rtl-border-01-expected.png index 95dc0a9..16cb4c1 100644 --- a/third_party/blink/web_tests/platform/mac/fast/borders/rtl-border-01-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/borders/rtl-border-01-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/mac/fast/canvas/image-object-in-canvas-expected.png index 11c3318a..1b4260b 100644 --- a/third_party/blink/web_tests/platform/mac/fast/canvas/image-object-in-canvas-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/canvas/image-object-in-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/clip/007-expected.png b/third_party/blink/web_tests/platform/mac/fast/clip/007-expected.png index 3403fa4..aae91c2 100644 --- a/third_party/blink/web_tests/platform/mac/fast/clip/007-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/clip/007-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/clip/009-expected.png b/third_party/blink/web_tests/platform/mac/fast/clip/009-expected.png index c0b12536..bcb0210d 100644 --- a/third_party/blink/web_tests/platform/mac/fast/clip/009-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/clip/009-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/clip/010-expected.png b/third_party/blink/web_tests/platform/mac/fast/clip/010-expected.png index c0b12536..bcb0210d 100644 --- a/third_party/blink/web_tests/platform/mac/fast/clip/010-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/clip/010-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/compact/003-expected.png b/third_party/blink/web_tests/platform/mac/fast/compact/003-expected.png index b47c98a..7ceb418 100644 --- a/third_party/blink/web_tests/platform/mac/fast/compact/003-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/compact/003-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/007-expected.png b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/007-expected.png index 57130a5..3a1d3e7 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/007-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/007-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/009-expected.png b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/009-expected.png index 2dbf108ef..b8c97fc 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/009-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/009-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/after-duplicated-after-split-expected.png b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/after-duplicated-after-split-expected.png index d689b32..ab80556 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/after-duplicated-after-split-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/after-duplicated-after-split-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/before-with-first-letter-expected.png b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/before-with-first-letter-expected.png index 4e401e38..0ba21a1 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/before-with-first-letter-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/before-with-first-letter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/table-cell-before-after-child-add-expected.png b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/table-cell-before-after-child-add-expected.png index 1a9ede1..e4d2542 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/table-cell-before-after-child-add-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/table-cell-before-after-child-add-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/005-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/005-expected.png index befda43..607e913 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/005-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/005-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/ZeroOpacityLayers-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/ZeroOpacityLayers-expected.png index 3b0398c3..acc49674 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/ZeroOpacityLayers-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/ZeroOpacityLayers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/absolute-poition-in-rtl-parent-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/absolute-poition-in-rtl-parent-expected.png index bb5ef68..77c54c89 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/absolute-poition-in-rtl-parent-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/absolute-poition-in-rtl-parent-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/clip-zooming-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/clip-zooming-expected.png index a6e2ead2..2d51d6a 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/clip-zooming-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/clip-zooming-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/color-correction-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/color-correction-expected.png index d8e81c86..9b3a27e 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/color-correction-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/color-correction-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/color-correction-on-text-shadow-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/color-correction-on-text-shadow-expected.png index 8cc2730..51acf63 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/color-correction-on-text-shadow-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/color-correction-on-text-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/compare-content-style-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/compare-content-style-expected.png index f900e76..eba8919 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/compare-content-style-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/compare-content-style-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/create_element_align-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/create_element_align-expected.png index aa9e69d..e927104 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/create_element_align-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/create_element_align-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/find-next-layer-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/find-next-layer-expected.png index cf495e1f..25a2dff 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/find-next-layer-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/find-next-layer-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/first-letter-capitalized-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/first-letter-capitalized-expected.png index b9ab41c..ecf952e 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/first-letter-capitalized-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/first-letter-capitalized-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/first-letter-float-after-float-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/first-letter-float-after-float-expected.png index 68a46fb4..688a9650 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/first-letter-float-after-float-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/first-letter-float-after-float-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/focus-ring-outline-color-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/focus-ring-outline-color-expected.png index db787573..cca9786 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/focus-ring-outline-color-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/focus-ring-outline-color-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/image-orientation/image-orientation-default-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/image-orientation/image-orientation-default-expected.png index b92fd75c..24bb01a 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/image-orientation/image-orientation-default-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/image-orientation/image-orientation-default-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/last-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/last-of-type-pseudo-class-expected.png index 1799735..426a716 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/last-of-type-pseudo-class-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/last-of-type-pseudo-class-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/only-child-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/only-child-pseudo-class-expected.png index f981659..fa540f09 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/only-child-pseudo-class-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/only-child-pseudo-class-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/only-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/only-of-type-pseudo-class-expected.png index 3d1e3ed..8eea776c 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/only-of-type-pseudo-class-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/only-of-type-pseudo-class-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/pendingStylesheetFontSize-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/pendingStylesheetFontSize-expected.png index 1c3da69..4d98fab 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/pendingStylesheetFontSize-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/pendingStylesheetFontSize-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-expected.png index da504dc..20258cf 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-expected.png index c2c2964..71084936 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-iframe-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-iframe-expected.png index 2eff463..3aa9666f 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-iframe-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-iframe-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/shadow-multiple-expected.png index c985202..2d1ad8a 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/shadow-multiple-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/shadow-multiple-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/simple-selector-chain-parsing-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/simple-selector-chain-parsing-expected.png index 511deb1..ba4a5e8 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/simple-selector-chain-parsing-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/simple-selector-chain-parsing-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-expected.png index 92d1173..138fb6a 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-center-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-center-expected.png index b288aa67a3..4bab32d 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-center-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-center-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-justify-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-justify-expected.png index cf53afa..78582770 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-justify-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-justify-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-right-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-right-expected.png index ccfd493..ca9eb320 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-right-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-right-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/universal-hover-quirk-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/universal-hover-quirk-expected.png index 5399409..2b7e48a 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/universal-hover-quirk-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/universal-hover-quirk-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png index 4dc2283f..7e8cec2 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png index 4dc2283f..7e8cec2 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/visibility-hit-test-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/visibility-hit-test-expected.png index b6b9df6..e0ea2af 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/visibility-hit-test-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/visibility-hit-test-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png b/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png index b46d190..a74bb49 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png b/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png index 9b10d25..5c1eeaa3 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/009-horizontal-expected.png b/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/009-horizontal-expected.png index 0eb57da..a9f5e58 100644 --- a/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/009-horizontal-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/009-horizontal-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/010-expected.png b/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/010-expected.png index 86ec6eb5..865c628 100644 --- a/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/010-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/010-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/018-expected.png b/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/018-expected.png index e824d36..233bbde84 100644 --- a/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/018-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/018-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt b/third_party/blink/web_tests/platform/mac/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/mac-retina/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt rename to third_party/blink/web_tests/platform/mac/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt
diff --git a/third_party/blink/web_tests/platform/mac/fast/dom/children-nodes-expected.png b/third_party/blink/web_tests/platform/mac/fast/dom/children-nodes-expected.png index 6419db2..814e969e 100644 --- a/third_party/blink/web_tests/platform/mac/fast/dom/children-nodes-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/dom/children-nodes-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/dynamic/007-expected.png b/third_party/blink/web_tests/platform/mac/fast/dynamic/007-expected.png index 50efa95b..c89d721f 100644 --- a/third_party/blink/web_tests/platform/mac/fast/dynamic/007-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/dynamic/007-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/dynamic/012-expected.png b/third_party/blink/web_tests/platform/mac/fast/dynamic/012-expected.png index 5508d248..01fb950f 100644 --- a/third_party/blink/web_tests/platform/mac/fast/dynamic/012-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/dynamic/012-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/dynamic/insert-before-table-part-in-continuation-expected.png b/third_party/blink/web_tests/platform/mac/fast/dynamic/insert-before-table-part-in-continuation-expected.png index 5660757..5947723 100644 --- a/third_party/blink/web_tests/platform/mac/fast/dynamic/insert-before-table-part-in-continuation-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/dynamic/insert-before-table-part-in-continuation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/dynamic/noninlinebadness-expected.png b/third_party/blink/web_tests/platform/mac/fast/dynamic/noninlinebadness-expected.png index 1d1b253..c0f4fe9 100644 --- a/third_party/blink/web_tests/platform/mac/fast/dynamic/noninlinebadness-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/dynamic/noninlinebadness-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt deleted file mode 100644 index 3a100a48..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt +++ /dev/null
@@ -1,21 +0,0 @@ -This is a testharness.js-based test. -PASS .grid 1 -FAIL .grid 2 assert_equals: -<div class="grid RTL"> - <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div> - <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div> - <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetLeft expected 35 but got 5 -PASS .grid 3 -FAIL .grid 4 assert_equals: -<div class="grid verticalRL"> - <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div> - <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div> - <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetTop expected 115 but got 110 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt deleted file mode 100644 index 3a100a48..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt +++ /dev/null
@@ -1,21 +0,0 @@ -This is a testharness.js-based test. -PASS .grid 1 -FAIL .grid 2 assert_equals: -<div class="grid RTL"> - <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div> - <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div> - <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetLeft expected 35 but got 5 -PASS .grid 3 -FAIL .grid 4 assert_equals: -<div class="grid verticalRL"> - <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div> - <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div> - <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div> - <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div> -</div> -offsetTop expected 115 but got 110 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/fast/css/content/content-quotes-01-expected.txt b/third_party/blink/web_tests/platform/win/fast/css/content/content-quotes-01-expected.txt deleted file mode 100644 index 7eb8ae2..0000000 --- a/third_party/blink/web_tests/platform/win/fast/css/content/content-quotes-01-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -The texts between the markers should be identical. - -========Marker1======== - -ab 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - -========Marker2======== - -WWaWWbWWWWWWWW 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - -========Marker3======== - -PASSED
diff --git a/third_party/blink/web_tests/platform/win/fast/css/content/content-quotes-05-expected.txt b/third_party/blink/web_tests/platform/win/fast/css/content/content-quotes-05-expected.txt deleted file mode 100644 index e9c2297..0000000 --- a/third_party/blink/web_tests/platform/win/fast/css/content/content-quotes-05-expected.txt +++ /dev/null
@@ -1,11 +0,0 @@ -========Marker1======== - -abc 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - -========Marker2======== - -WWaWWWbWWWWWcWWWW 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - -========Marker3======== - -PASSED
diff --git a/third_party/blink/web_tests/platform/win/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt b/third_party/blink/web_tests/platform/win/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt deleted file mode 100644 index f3c84c5..0000000 --- a/third_party/blink/web_tests/platform/win/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt +++ /dev/null
@@ -1,48 +0,0 @@ -PASS successfullyParsed is true - -TEST COMPLETE - -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/push-block-with-first-line-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/push-block-with-first-line-expected.txt deleted file mode 100644 index ef3da81..0000000 --- a/third_party/blink/web_tests/platform/win/paint/invalidation/push-block-with-first-line-expected.txt +++ /dev/null
@@ -1,33 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling Contents Layer", - "bounds": [800, 600], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF", - "paintInvalidations": [ - { - "object": "NGPhysicalLineBoxFragment", - "rect": [8, 68, 784, 20], - "reason": "geometry" - }, - { - "object": "NGPhysicalLineBoxFragment", - "rect": [8, 8, 784, 20], - "reason": "geometry" - }, - { - "object": "NGPhysicalTextFragment 'JOCULAR'", - "rect": [8, 68, 140, 20], - "reason": "geometry" - }, - { - "object": "NGPhysicalTextFragment 'JOCULAR'", - "rect": [8, 8, 140, 20], - "reason": "geometry" - } - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/virtual/cache-storage-sequence/external/wpt/service-workers/README.txt b/third_party/blink/web_tests/virtual/cache-storage-sequence/external/wpt/service-workers/README.txt new file mode 100644 index 0000000..a63f3fc --- /dev/null +++ b/third_party/blink/web_tests/virtual/cache-storage-sequence/external/wpt/service-workers/README.txt
@@ -0,0 +1,3 @@ +This suite runs the ServiceWorker and CacheStorage tests with the +CacheStorageSequence feature disabled. This makes CacheStorage operate on +the IO thread in the browser process.
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index 354693c..a88e5d1 100644 --- a/third_party/freetype/README.chromium +++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@ Name: FreeType URL: http://www.freetype.org/ -Version: VER-2-10-1-66-g5a1a79c0e -Revision: 5a1a79c0e8de8e886cc347ad22801982e8298a06 +Version: VER-2-10-1-67-g1e9229f0f +Revision: 1e9229f0fcb46fd4cd8e0fdc48fb4a44ddb7a8a1 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses" License File: src/docs/FTL.TXT
diff --git a/tools/android/avd/proto/generic_android23.textpb b/tools/android/avd/proto/generic_android23.textpb index 1a47060..00aec6d 100644 --- a/tools/android/avd/proto/generic_android23.textpb +++ b/tools/android/avd/proto/generic_android23.textpb
@@ -19,7 +19,7 @@ avd_package { package_name: "chromium/third_party/android_sdk/public/avds/android-23/google_apis/x86" - version: "6s0XsB3oZnvVldbnVr6tprNLoox0q5qrY3IMfiwE4qoC" + version: "E4QZINcjPpJ-j6SUPCJKGwVBD_jQY--F4sGiIWUPkeoC" dest_path: ".android" } avd_name: "android_23_google_apis_x86"
diff --git a/tools/android/avd/proto/generic_android28.textpb b/tools/android/avd/proto/generic_android28.textpb index 07c1f6e..fe20974 100644 --- a/tools/android/avd/proto/generic_android28.textpb +++ b/tools/android/avd/proto/generic_android28.textpb
@@ -19,7 +19,7 @@ avd_package { package_name: "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86" - version: "ejdvcz2sHZHdwemUpJrA3ydkYlYt1ECevi-7UD6tHcMC" + version: "LZ3LVXWiSLrfF6pHjuQ_LYHdQDoMGnqU1TuCmjp7UTAC" dest_path: ".android" } avd_name: "android_28_google_apis_x86"
diff --git a/tools/grit/grit/format/html_inline.py b/tools/grit/grit/format/html_inline.py index 45c2eebd..9e7aff0 100755 --- a/tools/grit/grit/format/html_inline.py +++ b/tools/grit/grit/format/html_inline.py
@@ -55,13 +55,14 @@ _SRC_RE = lazy_re.compile( r'<(?!script)(?:[^>]+?\s)src="(?!\[\[|{{)(?P<filename>[^"\']*)"', re.MULTILINE) -# This re matches '<img srcset="..."' +# This re matches '<img srcset="..."' or '<source srcset="..."' _SRCSET_RE = lazy_re.compile( - r'<img\b(?:[^>]*?\s)srcset="(?!\[\[|{{|\$i18n{)(?P<srcset>[^"\']*)"', + r'<(img|source)\b(?:[^>]*?\s)srcset="(?!\[\[|{{|\$i18n{)' + r'(?P<srcset>[^"\']*)"', re.MULTILINE) # This re is for splitting srcset value string into "image candidate strings". # Notes: -# - HTML 5.2 states that URL cannot start with comma. +# - HTML 5.2 states that URL cannot start or end with comma. # - the "descriptor" is either "width descriptor" or "pixel density descriptor". # The first one consists of "valid non-negative integer + letter 'x'", # the second one is formed of "positive valid floating-point number + @@ -69,7 +70,9 @@ # that form both of them. # Matches for example "img2.png 2x" or "img9.png 11E-2w". _SRCSET_ENTRY_RE = lazy_re.compile( - r'\s*(?P<url>[^,]\S+)\s+(?P<descriptor>[\deE.-]+[wx])\s*', + r'\s*(?P<url>[^,\s]\S+[^,\s])' + r'(?:\s+(?P<descriptor>[\deE.-]+[wx]))?\s*' + r'(?P<separator>,|$)', re.MULTILINE) _ICON_RE = lazy_re.compile( r'<link rel="icon"\s(?:[^>]+?\s)?' @@ -194,6 +197,7 @@ # Each of them consists of URL and descriptor. # _SRCSET_ENTRY_RE splits srcset into a list of URLs, descriptors and # commas. + # The descriptor part will be None if that optional regex didn't match parts = _SRCSET_ENTRY_RE.split(srcset) if not parts: @@ -206,37 +210,35 @@ # candidate string: [url, descriptor] candidate = []; - for part in parts: - if not part: - continue + # Each entry should consist of some text before the entry, the url, + # the descriptor or None if the entry has no descriptor, a comma separator or + # the end of the line, and finally some text after the entry (which is the + # same as the text before the next entry). + for i in range(0, len(parts) - 1, 4): + before, url, descriptor, separator, after = parts[i:i+5] - if part == ',': - # There must be no URL without a descriptor. - assert not candidate, "Bad srcset format in '%s'" % srcset_match.group(0) - continue - - if candidate: - # descriptor found - if candidate[0]: - # This is not "names_only" mode. - candidate.append(part) - new_candidates.append(" ".join(candidate)) - - candidate = [] - continue + # There must be a comma-separated next entry or this must be the last entry. + assert separator == "," or (separator == "" and i == len(parts) - 5), ( + "Bad srcset format in {}".format(srcset_match.group(0))) + # Both before and after the entry must be empty + assert before == after == "", ( + "Bad srcset format in {}".format(srcset_match.group(0))) if filename_expansion_function: - filename = filename_expansion_function(part) + filename = filename_expansion_function(url) else: - filename = part + filename = url data_url = ConvertFileToDataURL(filename, base_path, distribution, inlined_files, names_only) - candidate.append(data_url) + # This is not "names_only" mode + if data_url: + candidate = [data_url] + if descriptor: + candidate.append(descriptor) - # There must be no URL without a descriptor - assert not candidate, "Bad srcset ending in '%s' " % srcset_match.group(0) + new_candidates.append(" ".join(candidate)) prefix = srcset_match.string[srcset_match.start(): srcset_match.start('srcset')]
diff --git a/tools/grit/grit/format/html_inline_unittest.py b/tools/grit/grit/format/html_inline_unittest.py index e71d87c..89158623 100755 --- a/tools/grit/grit/format/html_inline_unittest.py +++ b/tools/grit/grit/format/html_inline_unittest.py
@@ -597,7 +597,8 @@ def testImgSrcset(self): '''Tests that img srcset="" attributes are converted.''' - # Note that there is no space before "img10.png" + # Note that there is no space before "img10.png" and that + # "img11.png" has no descriptor. files = { 'index.html': ''' <html> @@ -606,6 +607,9 @@ <img src="chrome://theme/img11.png" srcset="img7.png 1x, '''\ '''chrome://theme/img13.png 2x"> <img srcset="img8.png 300w, img9.png 11E-2w,img10.png -1e2w"> + <img srcset="img11.png"> + <img srcset="img11.png, img2.png 1x"> + <img srcset="img2.png 1x, img11.png"> </html> ''', 'img1.png': '''a1''', @@ -618,6 +622,7 @@ 'img8.png': '''a8''', 'img9.png': '''a9''', 'img10.png': '''a10''', + 'img11.png': '''a11''', } expected_inlined = ''' @@ -630,6 +635,9 @@ '''YTc= 1x,chrome://theme/img13.png 2x"> <img srcset="data:image/png;base64,YTg= 300w,data:image/png;base64,'''\ '''YTk= 11E-2w,data:image/png;base64,YTEw -1e2w"> + <img srcset="data:image/png;base64,YTEx"> + <img srcset="data:image/png;base64,YTEx,data:image/png;base64,YTI= 1x"> + <img srcset="data:image/png;base64,YTI= 1x,data:image/png;base64,YTEx"> </html> ''' @@ -681,6 +689,63 @@ util.FixLineEnd(result.inlined_data, '\n')) tmp_dir.CleanUp() + def testSourceSrcset(self): + '''Tests that source srcset="" attributes are converted.''' + + # Note that there is no space before "img10.png" and that + # "img11.png" has no descriptor. + files = { + 'index.html': ''' + <html> + <source src="img1.png" srcset="img2.png 1x, img3.png 2x"> + <source src="img4.png" srcset=" img5.png 1x , img6.png 2x "> + <source src="chrome://theme/img11.png" srcset="img7.png 1x, '''\ + '''chrome://theme/img13.png 2x"> + <source srcset="img8.png 300w, img9.png 11E-2w,img10.png -1e2w"> + <source srcset="img11.png"> + </html> + ''', + 'img1.png': '''a1''', + 'img2.png': '''a2''', + 'img3.png': '''a3''', + 'img4.png': '''a4''', + 'img5.png': '''a5''', + 'img6.png': '''a6''', + 'img7.png': '''a7''', + 'img8.png': '''a8''', + 'img9.png': '''a9''', + 'img10.png': '''a10''', + 'img11.png': '''a11''', + } + + expected_inlined = ''' + <html> + <source src="data:image/png;base64,YTE=" srcset="data:image/png;'''\ + '''base64,YTI= 1x,data:image/png;base64,YTM= 2x"> + <source src="data:image/png;base64,YTQ=" srcset="data:image/png;'''\ + '''base64,YTU= 1x,data:image/png;base64,YTY= 2x"> + <source src="chrome://theme/img11.png" srcset="data:image/png;'''\ + '''base64,YTc= 1x,chrome://theme/img13.png 2x"> + <source srcset="data:image/png;base64,YTg= 300w,data:image/png;'''\ + '''base64,YTk= 11E-2w,data:image/png;base64,YTEw -1e2w"> + <source srcset="data:image/png;base64,YTEx"> + </html> + ''' + + source_resources = set() + tmp_dir = util.TempDir(files) + for filename in files: + source_resources.add(tmp_dir.GetPath(filename)) + + # Test normal inlining. + result = html_inline.DoInline(tmp_dir.GetPath('index.html'), None) + resources = result.inlined_files + resources.add(tmp_dir.GetPath('index.html')) + self.failUnlessEqual(resources, source_resources) + self.failUnlessEqual(expected_inlined, + util.FixLineEnd(result.inlined_data, '\n')) + tmp_dir.CleanUp() + def testConditionalInclude(self): '''Tests that output and dependency generation includes only files not'''\ ''' blocked by <if> macros.'''
diff --git a/tools/json_to_struct/json_to_struct.py b/tools/json_to_struct/json_to_struct.py index 46cfd4a..f3668d0 100755 --- a/tools/json_to_struct/json_to_struct.py +++ b/tools/json_to_struct/json_to_struct.py
@@ -136,6 +136,13 @@ for element_name, element in description['elements'].items(): f.write('extern const %s %s;\n' % (schema['type_name'], element_name)) + if 'generate_array' in description: + f.write('\n') + f.write('extern const %s* const %s[];\n' % (schema['type_name'], + description['generate_array']['array_name'])) + f.write('extern const size_t %s;\n' % + (description['generate_array']['array_name'] + 'Length')) + if namespace: f.write('\n') f.write('} // namespace %s\n' % namespace) @@ -171,6 +178,17 @@ f.write(element_generator.GenerateElements(schema['type_name'], schema['schema'], description)) + if 'generate_array' in description: + f.write('\n') + f.write('const %s* const %s[] = {\n' % (schema['type_name'], + description['generate_array']['array_name'])) + for element_name, _ in description['elements'].items(): + f.write('\t&%s,\n' % element_name) + f.write('};\n') + f.write('const size_t %s = %d;\n' % + (description['generate_array']['array_name'] + 'Length', + len(description['elements']))) + if namespace: f.write('\n') f.write('} // namespace %s\n' % namespace)
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 9136d78..50e0153a 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -24881,6 +24881,7 @@ <int value="3049" label="RenderSubtreeAttribute"/> <int value="3050" label="ARIAAnnotationRoles"/> <int value="3051" label="IntersectionObserverV2"/> + <int value="3052" label="HeavyAdIntervention"/> </enum> <enum name="FeaturePolicyAllowlistType">
diff --git a/tools/metrics/histograms/extract_histograms.py b/tools/metrics/histograms/extract_histograms.py index f45619565..003314f9 100644 --- a/tools/metrics/histograms/extract_histograms.py +++ b/tools/metrics/histograms/extract_histograms.py
@@ -57,7 +57,13 @@ import copy import datetime -import HTMLParser + +try: + import HTMLParser + html = HTMLParser.HTMLParser() +except ImportError: # For Py3 compatibility + import html + import logging import re import xml.dom.minidom @@ -142,7 +148,7 @@ # Unescape using default ASCII encoding. Unescapes any HTML escaped character # like " etc. - return HTMLParser.HTMLParser().unescape(line) + return html.unescape(line) def _NormalizeAllAttributeValues(node):
diff --git a/tools/metrics/histograms/extract_histograms_test.py b/tools/metrics/histograms/extract_histograms_test.py index 7a69dbf..e015c56 100644 --- a/tools/metrics/histograms/extract_histograms_test.py +++ b/tools/metrics/histograms/extract_histograms_test.py
@@ -478,8 +478,8 @@ self.assertFalse(have_errors) self.assertIn('Test.Histogram', hists) self.assertIn('summary', hists['Test.Histogram']) - self.assertEquals('This is a summary with & and " and \'', - hists['Test.Histogram']['summary']) + self.assertEqual('This is a summary with & and " and \'', + hists['Test.Histogram']['summary']) def testNewSuffixWithoutLabel(self): suffix_without_label = xml.dom.minidom.parseString("""
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index c900f8e..e84b597 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -715,7 +715,7 @@ </histogram> <histogram name="AccountManager.InitializationTime" units="microseconds" - expires_after="2020-01-31"> + expires_after="2020-04-05"> <owner>sinhak@chromium.org</owner> <owner>anastasiian@chromium.org</owner> <summary> @@ -766,7 +766,7 @@ </histogram> <histogram name="AccountManager.TokenLoadStatus" - enum="AccountManagerTokenLoadStatus" expires_after="2020-01-31"> + enum="AccountManagerTokenLoadStatus" expires_after="2020-04-05"> <owner>sinhak@chromium.org</owner> <owner>anastasiian@chromium.org</owner> <summary> @@ -1183,7 +1183,7 @@ </histogram> <histogram name="AnchorElementMetrics.Clicked.AreaRank" units="rank" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>chelu@chromium.org</owner> <owner>tbansal@chromium.org</owner> <summary> @@ -1588,7 +1588,7 @@ </histogram> <histogram name="Android.AppNotificationStatus" enum="NotificationAppStatus" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>peter@chromium.org</owner> <summary> Records whether notifications are enabled for Chrome, as the Android app, @@ -1713,7 +1713,7 @@ </histogram> <histogram name="Android.BackgroundTaskScheduler.TaskCreated.WithExpiration" - enum="BackgroundTaskId" expires_after="2020-01-31"> + enum="BackgroundTaskId" expires_after="2020-04-05"> <owner>ioanastefan@chromium.org</owner> <owner>nator@chromium.org</owner> <owner>knollr@chromium.org</owner> @@ -1724,7 +1724,7 @@ </histogram> <histogram name="Android.BackgroundTaskScheduler.TaskCreated.WithoutExpiration" - enum="BackgroundTaskId" expires_after="2020-01-31"> + enum="BackgroundTaskId" expires_after="2020-04-05"> <owner>ioanastefan@chromium.org</owner> <owner>nator@chromium.org</owner> <owner>knollr@chromium.org</owner> @@ -2635,7 +2635,7 @@ </histogram> <histogram base="true" name="Android.FeatureModules.CachedAwakeInstallDuration" - units="ms" expires_after="2020-01-01"> + units="ms" expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="AndroidFeatureModuleName" --> @@ -3013,7 +3013,7 @@ </histogram> <histogram base="true" name="Android.MemoryPressureNotification" - enum="Android.MemoryPressureNotification" expires_after="2020-02-02"> + enum="Android.MemoryPressureNotification" expires_after="2020-04-05"> <owner>ssid@chromium.org</owner> <summary> Memory pressure notifications sent by Android through ComponentCallbacks2. @@ -4301,7 +4301,7 @@ </histogram> <histogram name="AndroidSms.FcmMessageDispatchFailure" - enum="AndroidSmsFcmMessageType" expires_after="2020-02-02"> + enum="AndroidSmsFcmMessageType" expires_after="2020-04-05"> <owner>azeemarshad@chromium.org</owner> <summary> Records message types for which all retry attempts failed when dispatching @@ -4842,7 +4842,7 @@ </summary> </histogram> -<histogram name="Apps.AppLaunch" enum="AppLaunch" expires_after="2020-02-02"> +<histogram name="Apps.AppLaunch" enum="AppLaunch" expires_after="2020-04-05"> <owner>tapted@chromium.org</owner> <owner>benwells@chromium.org</owner> <summary> @@ -4932,7 +4932,8 @@ </summary> </histogram> -<histogram name="Apps.AppList.DriveQuickAccessProvider.Latency" units="ms"> +<histogram name="Apps.AppList.DriveQuickAccessProvider.Latency" units="ms" + expires_after="2020-04-05"> <owner>wrong@chromium.org</owner> <owner>tby@chromium.org</owner> <owner>jiameng@chromium.org</owner> @@ -4999,7 +5000,7 @@ </histogram> <histogram name="Apps.AppList.ZeroStateResults.LaunchedItemType" - enum="ZeroStateResultType"> + enum="ZeroStateResultType" expires_after="2020-04-05"> <owner>wrong@chromium.org</owner> <owner>tby@chromium.org</owner> <owner>jiameng@chromium.org</owner> @@ -5045,7 +5046,7 @@ </histogram> <histogram name="Apps.AppList.ZeroStateResultsList.Clicked" - enum="BooleanClicked"> + enum="BooleanClicked" expires_after="2020-04-05"> <owner>wrong@chromium.org</owner> <owner>tby@chromium.org</owner> <owner>jiameng@chromium.org</owner> @@ -5255,7 +5256,7 @@ </histogram> <histogram name="Apps.AppListHide.InputLatency" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>wutao@chromium.org</owner> <summary> Elapsed time from the input event to hide the launcher UI. This is logged @@ -5550,7 +5551,7 @@ </histogram> <histogram name="Apps.AppListShow.InputLatency" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>wutao@chromium.org</owner> <summary> Elapsed time from the input event to show the launcher UI. This is logged @@ -6397,7 +6398,7 @@ </histogram> <histogram name="Arc.EngagementTime.Background" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>maajid@google.com</owner> <owner>shaochuan@google.com</owner> <owner>shihuis@google.com</owner> @@ -6530,7 +6531,7 @@ </histogram> <histogram name="Arc.IntentHelper.OpenType" enum="ArcIntentHelperOpenType" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>hashimoto@google.com</owner> <owner>shihuis@google.com</owner> <summary> @@ -6626,7 +6627,7 @@ </histogram> <histogram name="Arc.OptInSilentAuthCode" enum="ArcOptInSilentAuthCode" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>elijahtaylor@google.com</owner> <summary> Arc Silent Auth Code status. This status is set during the ARC OptIn flow. @@ -6718,7 +6719,7 @@ </histogram> <histogram base="true" name="Arc.Provisioning.Result" - enum="ArcProvisioningResult" expires_after="2020-02-02"> + enum="ArcProvisioningResult" expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="ArcUserTypes" --> <owner>alexchau@google.com</owner> @@ -7870,7 +7871,7 @@ </histogram> <histogram base="true" name="Ash.SplitViewResize.PresentationTime.MaxLatency" - units="ms" expires_after="2020-02-02"> + units="ms" expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="SplitViewResizeModes" --> <owner>omrilio@chromium.org</owner> @@ -8134,7 +8135,7 @@ </histogram> <histogram name="Ash.TouchView.TouchViewInactiveTotal" units="minutes" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>girard@chromium.org</owner> <summary> The total time that TouchView is not active during a session. @@ -8752,7 +8753,7 @@ </histogram> <histogram name="Assistant.QueryCountPerEntryPoint" enum="AssistantEntryPoint" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>xiaohuic@chromium.org</owner> <owner>meilinw@chromium.org</owner> <summary>Number of queries fired for each entry point.</summary> @@ -9698,7 +9699,7 @@ </histogram> <histogram name="Aura.CreatedGpuBrowserCompositor" enum="CompositorType" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>jbauman@chromium.org</owner> <summary> Whether the browser compositor uses GPU or the software renderer. @@ -9706,7 +9707,7 @@ </histogram> <histogram name="AuthPolicy.ErrorTypeOfAuthenticateUser" - enum="AuthPolicyErrorType" expires_after="2020-01-20"> + enum="AuthPolicyErrorType" expires_after="2020-04-05"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -9734,7 +9735,7 @@ </histogram> <histogram name="AuthPolicy.ErrorTypeOfGetUserKerberosFiles" - enum="AuthPolicyErrorType"> + enum="AuthPolicyErrorType" expires_after="2020-04-05"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -9755,7 +9756,8 @@ </summary> </histogram> -<histogram name="AuthPolicy.ErrorTypeOfJoinADDomain" enum="AuthPolicyErrorType"> +<histogram name="AuthPolicy.ErrorTypeOfJoinADDomain" enum="AuthPolicyErrorType" + expires_after="2020-04-05"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -9824,7 +9826,7 @@ </histogram> <histogram name="AuthPolicy.TimeToAuthenticateUser" units="ms" - expires_after="2020-01-20"> + expires_after="2020-04-05"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -9834,7 +9836,8 @@ </summary> </histogram> -<histogram name="AuthPolicy.TimeToGetUserKerberosFiles" units="ms"> +<histogram name="AuthPolicy.TimeToGetUserKerberosFiles" units="ms" + expires_after="2020-04-05"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -9856,7 +9859,8 @@ </summary> </histogram> -<histogram name="AuthPolicy.TimeToJoinADDomain" units="ms"> +<histogram name="AuthPolicy.TimeToJoinADDomain" units="ms" + expires_after="2020-04-05"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -9868,7 +9872,7 @@ </histogram> <histogram name="AuthPolicy.TimeToRefreshDevicePolicy" units="ms" - expires_after="2020-01-20"> + expires_after="2020-04-05"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -9880,7 +9884,7 @@ </histogram> <histogram name="AuthPolicy.TimeToRefreshUserPolicy" units="ms" - expires_after="2020-01-20"> + expires_after="2020-04-05"> <owner>fsandrade@chromium.org</owner> <owner>ljusten@chromium.org</owner> <owner>tomdobro@chromium.org</owner> @@ -13292,7 +13296,7 @@ </histogram> <histogram name="BackgroundMode.BackgroundApplicationsCount" units="units" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>atwilson@chromium.org</owner> <owner>mvanouwerkerk@chromium.org</owner> <summary> @@ -14766,7 +14770,7 @@ </histogram> <histogram name="Blink.DecodedImage.WebPFileFormat" enum="WebPFileFormat" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>mcasas@chromium.org</owner> <owner>andrescj@chromium.org</owner> <summary> @@ -15168,7 +15172,7 @@ <histogram name="Blink.LazyLoad.CrossOriginFrames.LoadStartedAfterBeingDeferred" - enum="NQEEffectiveConnectionType" expires_after="2020-02-02"> + enum="NQEEffectiveConnectionType" expires_after="2020-04-05"> <owner>sclittle@chromium.org</owner> <summary> Records the effective connection type whenever a lazily-loaded iframe that @@ -15182,7 +15186,7 @@ </histogram> <histogram name="Blink.LazyLoad.CrossOriginFrames.VisibleAfterBeingDeferred" - enum="NQEEffectiveConnectionType" expires_after="2020-02-02"> + enum="NQEEffectiveConnectionType" expires_after="2020-04-05"> <owner>sclittle@chromium.org</owner> <summary> Records the effective connection type whenever a lazily-loaded iframe that @@ -15430,7 +15434,7 @@ </histogram> <histogram name="Blink.OffscreenCanvas.ContextType" enum="CanvasContextType" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>aaronhk@chromium.org</owner> <owner>fserb@chromium.org</owner> <summary> @@ -15440,7 +15444,7 @@ </histogram> <histogram name="Blink.OffscreenCanvas.NewOffscreenCanvas" enum="Boolean" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>aaronhk@chromium.org</owner> <owner>fserb@chromium.org</owner> <summary> @@ -15608,7 +15612,7 @@ </histogram> <histogram name="Blink.ResourceFetcher.StaleWhileRevalidateDuration" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>dtapuska@chromium.org</owner> <owner>kenjibaheux@google.com</owner> <summary>Duration of completed stale revalidation attempts.</summary> @@ -16450,7 +16454,7 @@ </histogram> <histogram name="Blink.VisibleBeforeLoaded.LazyLoadEligibleFrames.BelowTheFold" - enum="NQEEffectiveConnectionType" expires_after="2020-02-02"> + enum="NQEEffectiveConnectionType" expires_after="2020-04-05"> <owner>sclittle@chromium.org</owner> <summary> Records the effective connection type whenever a lazyload-eligible (i.e. @@ -16460,7 +16464,7 @@ </histogram> <histogram name="Blink.VisibleBeforeLoaded.LazyLoadImages.AboveTheFold" - enum="NQEEffectiveConnectionType" expires_after="2020-02-02"> + enum="NQEEffectiveConnectionType" expires_after="2020-04-05"> <owner>sclittle@chromium.org</owner> <owner>rajendrant@chromium.org</owner> <summary> @@ -16470,7 +16474,7 @@ </histogram> <histogram name="Blink.VisibleBeforeLoaded.LazyLoadImages.BelowTheFold" - enum="NQEEffectiveConnectionType" expires_after="2020-02-02"> + enum="NQEEffectiveConnectionType" expires_after="2020-04-05"> <owner>sclittle@chromium.org</owner> <owner>rajendrant@chromium.org</owner> <summary> @@ -16480,7 +16484,7 @@ </histogram> <histogram name="Blink.VisibleLoadTime.LazyLoadEligibleFrames.AboveTheFold" - units="ms" expires_after="2020-02-02"> + units="ms" expires_after="2020-04-05"> <owner>sclittle@chromium.org</owner> <summary> Milliseconds spent waiting for an above the fold iframe to load. Only fires @@ -16490,7 +16494,7 @@ </histogram> <histogram name="Blink.VisibleLoadTime.LazyLoadEligibleFrames.BelowTheFold" - units="ms" expires_after="2020-02-02"> + units="ms" expires_after="2020-04-05"> <owner>sclittle@chromium.org</owner> <summary> Milliseconds spent waiting for a below the fold iframe to load. Only fires @@ -16500,7 +16504,7 @@ </histogram> <histogram base="true" name="Blink.VisibleLoadTime.LazyLoadImages.AboveTheFold" - units="ms" expires_after="2020-02-02"> + units="ms" expires_after="2020-04-05"> <owner>rajendrant@chromium.org</owner> <owner>bengr@chromium.org</owner> <summary> @@ -16512,7 +16516,7 @@ </histogram> <histogram base="true" name="Blink.VisibleLoadTime.LazyLoadImages.BelowTheFold" - units="ms" expires_after="2020-02-02"> + units="ms" expires_after="2020-04-05"> <owner>rajendrant@chromium.org</owner> <owner>bengr@chromium.org</owner> <summary> @@ -18058,7 +18062,7 @@ </histogram> <histogram name="Bookmarks.EntryPoint" enum="BookmarksEntryPoint" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>ianwen@chromium.org</owner> <summary>How users add a new bookmark.</summary> </histogram> @@ -19076,7 +19080,7 @@ </histogram> <histogram name="CaptivePortal.Notification.Status" - enum="CaptivePortalNotificationStatus" expires_after="2020-02-01"> + enum="CaptivePortalNotificationStatus" expires_after="2020-04-05"> <owner>rsorokin@chromium.org</owner> <owner>cros-oac@google.com</owner> <summary> @@ -19086,7 +19090,7 @@ </histogram> <histogram name="CaptivePortal.Notification.UserAction" - enum="CaptivePortalNotificationUserAction" expires_after="2020-02-01"> + enum="CaptivePortalNotificationUserAction" expires_after="2020-04-05"> <owner>rsorokin@chromium.org</owner> <owner>cros-oac@google.com</owner> <summary> @@ -19095,7 +19099,7 @@ </histogram> <histogram name="CaptivePortal.OOBE.DetectionDuration" units="ms" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>rsorokin@chromium.org</owner> <owner>cros-oac@google.com</owner> <summary> @@ -19128,7 +19132,7 @@ </histogram> <histogram name="CaptivePortal.OOBE.PortalToOnlineTransition" units="ms" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>rsorokin@chromium.org</owner> <owner>cros-oac@google.com</owner> <summary> @@ -19138,7 +19142,7 @@ </histogram> <histogram name="CaptivePortal.RedirectTime" units="ms" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>rsorokin@chromium.org</owner> <owner>cros-oac@google.com</owner> <summary> @@ -19148,7 +19152,7 @@ </histogram> <histogram name="CaptivePortal.Session.DetectionDuration" units="ms" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>rsorokin@chromium.org</owner> <owner>cros-oac@google.com</owner> <summary> @@ -25071,7 +25075,7 @@ </histogram> <histogram name="Cookie.TimeDatabaseMigrationToV10" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>pwnall@chromium.org</owner> <summary> The amount of time (ms) to migrate a v9 cookie database to v10. @@ -25828,7 +25832,7 @@ </histogram> <histogram name="Cras.StreamTimeoutMilliSeconds" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>hychao@chromium.org</owner> <owner>chromeos-audio@google.com</owner> <summary> @@ -26057,7 +26061,7 @@ </histogram> <histogram name="CrosDisks.FilesystemType" enum="CrosDisksFilesystemType" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>benchan@chromium.org</owner> <summary> The type of file system that Chrome OS cros-disks daemon is requested to @@ -26093,7 +26097,7 @@ </histogram> <histogram name="CrosDisksClient.MountErrorMountType" - enum="CrosDisksMountTypeError" expires_after="2020-02-02"> + enum="CrosDisksMountTypeError" expires_after="2020-04-05"> <owner>amistry@chromium.org</owner> <summary> The {mount type}x{mount error code} received from the Chrome OS cros-disks @@ -27209,7 +27213,7 @@ </histogram> <histogram name="Cryptohome.TimeToTakeTpmOwnership" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>apronin@chromium.org</owner> <owner>cros-hwsec+uma@chromium.org</owner> <summary> @@ -34405,7 +34409,7 @@ </histogram> <histogram name="Download.ParallelDownloadAddStreamSuccess" - enum="BooleanSuccess" expires_after="2020-01-30"> + enum="BooleanSuccess" expires_after="2020-04-05"> <owner>xingliu@chromium.org</owner> <summary> Records if the byte stream reader of a subsequent request is successfully @@ -34414,7 +34418,7 @@ </histogram> <histogram name="Download.ParallelDownloadRequestCount" units="requests" - expires_after="2020-01-30"> + expires_after="2020-04-05"> <owner>xingliu@chromium.org</owner> <summary> The total number of requests sent for a parallel download, including the @@ -34524,7 +34528,7 @@ </histogram> <histogram name="Download.ResumptionComplete.HasStrongValidators" - enum="BooleanHasStrongValidators" expires_after="2020-01-30"> + enum="BooleanHasStrongValidators" expires_after="2020-04-05"> <owner>qinmin@chromium.org</owner> <owner>xingliu@chromium.org</owner> <summary> @@ -34553,7 +34557,7 @@ </histogram> <histogram name="Download.ResumptionStart.HasStrongValidators" - enum="BooleanHasStrongValidators" expires_after="2020-01-30"> + enum="BooleanHasStrongValidators" expires_after="2020-04-05"> <owner>qinmin@chromium.org</owner> <owner>xingliu@chromium.org</owner> <summary> @@ -37564,7 +37568,7 @@ </histogram> <histogram name="EnterpriseCheck.IsManaged" enum="BooleanEnabled" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>rogerta@chromium.org</owner> <summary> Whether the machine is managed via MDM. This check is performed once at @@ -38226,7 +38230,7 @@ </histogram> <histogram name="Event.Latency.BlockingTime.TouchMoveDefaultAllowed" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tdresser@chromium.org</owner> <summary> Time between the renderer main thread receiving a touchmove event and acking @@ -38259,7 +38263,7 @@ </histogram> <histogram name="Event.Latency.BlockingTime.TouchStartDefaultPrevented" - units="ms" expires_after="2020-02-02"> + units="ms" expires_after="2020-04-05"> <owner>tdresser@chromium.org</owner> <summary> Time between the renderer main thread receiving a touchstart event and @@ -38872,7 +38876,7 @@ </histogram> <histogram name="Event.Latency.EndToEnd.TouchpadPinch" units="microseconds" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>input-dev@chromium.org</owner> <summary> Time between the OS receiving a touchpad pinch event and the resulting GPU @@ -39343,7 +39347,7 @@ </histogram> <histogram name="Event.Latency.ScrollBegin.Touch.GpuSwap2" units="microseconds" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tdresser@chromium.org</owner> <summary> Time between gpu starts to swap the first ScrollUpdate gesture event in a @@ -39544,7 +39548,7 @@ <histogram name="Event.Latency.ScrollBegin.Wheel.RendererSwapToBrowserNotified2" - units="microseconds" expires_after="2020-02-02"> + units="microseconds" expires_after="2020-04-05"> <owner>tdresser@chromium.org</owner> <summary> Time between the renderer starts to swap a frame induced by the first @@ -40033,7 +40037,7 @@ </histogram> <histogram name="Event.Latency.ScrollUpdate.Touch.GpuSwap2" - units="microseconds" expires_after="2020-02-02"> + units="microseconds" expires_after="2020-04-05"> <owner>tdresser@chromium.org</owner> <summary> Time between gpu starts to swap a ScrollUpdate gesture event with touch @@ -41417,7 +41421,7 @@ </histogram> <histogram name="ExploreSites.ClickedNTPCategoryIndex" - enum="MostVisitedTileIndex" expires_after="2020-02-02"> + enum="MostVisitedTileIndex" expires_after="2020-04-05"> <owner>dimich@chromium.org</owner> <summary> 0-based index of a category tile on NTP which was clicked by the user. @@ -47262,7 +47266,7 @@ </histogram> <histogram name="Feedback.RequestSource" enum="FeedbackSource" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>afakhry@chromium.org</owner> <summary>Records the source that requested showing the feedback app.</summary> </histogram> @@ -49204,7 +49208,7 @@ </histogram> <histogram name="GCM.SendWebPushMessagePayloadSize" units="units" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>alexchau@chromium.org</owner> <owner>peter@chromium.org</owner> <summary> @@ -49214,7 +49218,7 @@ </histogram> <histogram name="GCM.SendWebPushMessageResult" enum="SendWebPushMessageResult" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>alexchau@chromium.org</owner> <owner>peter@chromium.org</owner> <summary> @@ -56708,6 +56712,20 @@ </summary> </histogram> +<histogram name="IOS.CRWWKNavigationStatesRemoveOldPending" enum="Boolean" + expires_after="2020-04-05"> + <owner>justincohen@chromium.org</owner> + <owner>gambard@chromium.org</owner> + <summary> + Workaround for a WKWebView bug where WKNavigations can leak, leaving a + permanent pending URL, thus breaking the omnibox. While it is possible for + navigations to finish out-of-order, it's an edge case that should be handled + gracefully, as last committed will appear in the omnibox instead of the + pending URL. This metric records whether there are old navigations to clean + up each time a navigation finishes. See crbug.com/1010765 for details. + </summary> +</histogram> + <histogram name="IOS.Dialogs.JavaScriptDialogClosed" enum="IOSJavaScriptDialogDismissalCause" expires_after="M80"> <owner>kkhorimoto@chromium.org</owner> @@ -58303,7 +58321,7 @@ </histogram> <histogram name="LibraryLoader.PrefetchDetailedStatus" - enum="LibraryLoaderPrefetchDetailedStatus" expires_after="M79"> + enum="LibraryLoaderPrefetchDetailedStatus" expires_after="2020-04-05"> <owner>lizeb@chromium.org</owner> <owner>pasko@chromium.org</owner> <summary> @@ -58410,7 +58428,7 @@ </histogram> <histogram name="LoadingPredictor.PreconnectLearningRecall" units="%" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>alexilin@chromium.org</owner> <summary> When the loading predictor has origins in the local database for a given @@ -58876,7 +58894,7 @@ </histogram> <histogram name="Login.PromptToCompleteLoginTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>achuith@chromium.org</owner> <summary> Time from first display of the login prompt until the user completes signing @@ -58884,7 +58902,7 @@ </summary> </histogram> -<histogram name="Login.PromptToLoginTime" units="ms" expires_after="2020-02-02"> +<histogram name="Login.PromptToLoginTime" units="ms" expires_after="2020-04-05"> <owner>elijahtaylor@google.com</owner> <owner>yusukes@chromium.org</owner> <summary> @@ -58902,7 +58920,7 @@ </histogram> <histogram name="Login.SessionExitType" enum="LoginSessionExitType" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>iby@chromium.org</owner> <summary> Tracks whether a ChromeOS user was logged out because Chrome repeatedly @@ -59002,7 +59020,7 @@ </histogram> <histogram name="MachineLearningService.CpuUsageMilliPercent" - units="1/1000ths of %" expires_after="2020-02-01"> + units="1/1000ths of %" expires_after="2020-04-05"> <owner>alanlxl@chromium.org</owner> <owner>amoylan@chromium.org</owner> <summary> @@ -59014,7 +59032,7 @@ <histogram base="true" name="MachineLearningService.CreateGraphExecutorResult.Event" enum="MachineLearningServiceCreateGraphExecutorResultEvent" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>amoylan@chromium.org</owner> <owner>alanlxl@chromium.org</owner> <summary> @@ -59033,7 +59051,7 @@ </histogram> <histogram base="true" name="MachineLearningService.ExecuteResult.Event" - enum="MachineLearningServiceExecuteResultEvent" expires_after="2020-02-01"> + enum="MachineLearningServiceExecuteResultEvent" expires_after="2020-04-05"> <owner>amoylan@chromium.org</owner> <owner>alanlxl@chromium.org</owner> <summary> @@ -59043,7 +59061,7 @@ <histogram name="MachineLearningService.LoadModelResult" enum="MachineLearningServiceLoadModelResultEvent" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>amoylan@chromium.org</owner> <owner>alanlxl@chromium.org</owner> <summary> @@ -59055,7 +59073,7 @@ <histogram base="true" name="MachineLearningService.LoadModelResult.Event" enum="MachineLearningServiceLoadModelResultEvent" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>amoylan@chromium.org</owner> <owner>alanlxl@chromium.org</owner> <summary> @@ -59064,7 +59082,7 @@ </histogram> <histogram name="MachineLearningService.MojoConnectionEvent" - enum="MachineLearningServiceMojoConnectionEvent" expires_after="2020-02-01"> + enum="MachineLearningServiceMojoConnectionEvent" expires_after="2020-04-05"> <owner>alanlxl@chromium.org</owner> <owner>amoylan@chromium.org</owner> <summary> @@ -59089,7 +59107,7 @@ </histogram> <histogram name="MachineLearningService.PeakTotalMemoryKb" units="KB" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>alanlxl@chromium.org</owner> <owner>amoylan@chromium.org</owner> <owner>honglinyu@chromium.org</owner> @@ -59142,7 +59160,7 @@ </histogram> <histogram name="MachineLearningService.TotalMemoryKb" units="KB" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>alanlxl@chromium.org</owner> <owner>amoylan@chromium.org</owner> <owner>honglinyu@chromium.org</owner> @@ -59274,14 +59292,15 @@ </histogram> <histogram name="Manifest.FetchResult" enum="ManifestFetchResultType" - expires_after="M79"> + expires_after="2020-04-05"> <owner>mlamouri@chromium.org</owner> <summary> Tracks whether the Manifest fetch succeed and why it failed if it failed. </summary> </histogram> -<histogram name="Manifest.HasProperty" enum="Boolean"> +<histogram name="Manifest.HasProperty" enum="Boolean" + expires_after="2020-04-05"> <owner>mlamouri@chromium.org</owner> <summary> Tracks which properties of a Manifest were present when it was parsed. If a @@ -59291,12 +59310,13 @@ </summary> </histogram> -<histogram name="Manifest.IsEmpty" enum="Boolean" expires_after="M79"> +<histogram name="Manifest.IsEmpty" enum="Boolean" expires_after="2020-04-05"> <owner>mlamouri@chromium.org</owner> <summary>Tracks whether the parsed Manifest is the empty Manifest.</summary> </histogram> -<histogram name="Manifest.ParseSuccess" enum="Boolean" expires_after="M79"> +<histogram name="Manifest.ParseSuccess" enum="Boolean" + expires_after="2020-04-05"> <owner>mlamouri@chromium.org</owner> <summary> Tracks the Manifest parsing result. A failure will be recorded if the @@ -59306,7 +59326,7 @@ </histogram> <histogram name="ManualFallback.PresentedOptions.AllPasswords" - units="Credentials" expires_after="2019-12-31"> + units="Credentials" expires_after="2020-04-05"> <owner>javierrobles@chromium.org</owner> <summary> Tracks the number of credentials presented to the user in the "Use @@ -59316,7 +59336,7 @@ </histogram> <histogram name="ManualFallback.PresentedOptions.CreditCards" units="Cards" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <owner>javierrobles@chromium.org</owner> <summary> Tracks the number of cards presented to the user in Manual Fallback. This is @@ -59325,7 +59345,7 @@ </histogram> <histogram name="ManualFallback.PresentedOptions.Passwords" units="Credentials" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <owner>javierrobles@chromium.org</owner> <summary> Tracks the number of credentials presented to the user in the Passwords @@ -59334,7 +59354,7 @@ </histogram> <histogram name="ManualFallback.PresentedOptions.Profiles" units="Profiles" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <owner>javierrobles@chromium.org</owner> <summary> Tracks the number of profiles presented to the user in Manual Fallback. This @@ -59386,7 +59406,8 @@ <summary>Error codes to handle AImage and AImageReader api calls.</summary> </histogram> -<histogram name="Media.Android.BackgroundVideoTime" units="ms"> +<histogram name="Media.Android.BackgroundVideoTime" units="ms" + expires_after="2020-04-05"> <owner>mlamouri@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -59422,7 +59443,7 @@ </histogram> <histogram name="Media.Android.MediaPlayerSuccess" enum="MediaPlayerExitStatus" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tguilbert@chromium.org</owner> <summary>Android: Whether MediaPlayer exited without errors.</summary> </histogram> @@ -59485,7 +59506,8 @@ </summary> </histogram> -<histogram name="Media.Audible.ConcurrentTabsTime" units="ms"> +<histogram name="Media.Audible.ConcurrentTabsTime" units="ms" + expires_after="2020-04-05"> <owner>mlamouri@chromium.org</owner> <summary> Records how long more than one tab is audible at the same time. The @@ -59549,7 +59571,8 @@ </summary> </histogram> -<histogram name="Media.Audio.Autoplay" enum="AutoplaySource"> +<histogram name="Media.Audio.Autoplay" enum="AutoplaySource" + expires_after="2020-04-05"> <owner>mlamouri@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary>Records the autoplay source of audios.</summary> @@ -59608,7 +59631,7 @@ </histogram> <histogram name="Media.Audio.Capture.DetectedMissingCallbacks" - enum="BooleanMissingCallbacks" expires_after="2020-02-02"> + enum="BooleanMissingCallbacks" expires_after="2020-04-05"> <owner>grunell@chromium.org</owner> <summary> Whether missing callbacks where detected during audio capture. Logged when @@ -59631,7 +59654,7 @@ </histogram> <histogram name="Media.Audio.Capture.FramesProvided" units="frames" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>grunell@chromium.org</owner> <summary> The number of captured audio frames that is provided by the operating system @@ -59649,7 +59672,7 @@ </histogram> <histogram name="Media.Audio.Capture.Glitches" units="glitches" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>grunell@chromium.org</owner> <summary> The number of glitches that were detected at the OS level while an audio @@ -59659,7 +59682,7 @@ </histogram> <histogram name="Media.Audio.Capture.HighLatencyCallbackError" - enum="BooleanError" expires_after="2020-02-02"> + enum="BooleanError" expires_after="2020-04-05"> <owner>maxmorin@chromium.org</owner> <summary> A boolean that reflects whether or not an error was reported during audio @@ -59677,7 +59700,7 @@ </histogram> <histogram name="Media.Audio.Capture.LargestGlitchMs" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>grunell@chromium.org</owner> <summary> The length in milliseconds of the largest audio glitch that was detected at @@ -59687,7 +59710,7 @@ </histogram> <histogram name="Media.Audio.Capture.LostFramesInMs" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>grunell@chromium.org</owner> <summary> The combined length in milliseconds of audio glitches that was detected at @@ -59698,7 +59721,7 @@ </histogram> <histogram name="Media.Audio.Capture.LowLatencyCallbackError" - enum="BooleanError" expires_after="2020-02-02"> + enum="BooleanError" expires_after="2020-04-05"> <owner>maxmorin@chromium.org</owner> <summary> A boolean that reflects whether or not an error was reported during audio @@ -59901,7 +59924,8 @@ </summary> </histogram> -<histogram name="Media.Audio.Capture.Win.Open" enum="AudioStreamOpenResult"> +<histogram name="Media.Audio.Capture.Win.Open" enum="AudioStreamOpenResult" + expires_after="2020-04-05"> <owner>tommi@chromium.org</owner> <summary> Success/error cases for opening an audio input stream on Windows. @@ -59932,7 +59956,7 @@ </histogram> <histogram name="Media.Audio.CoreAudioDispatchOverrideLookupEvent" - enum="CoreAudioDispatchOverrideLookupEvent" expires_after="2020-02-01"> + enum="CoreAudioDispatchOverrideLookupEvent" expires_after="2020-04-05"> <owner>ossu@chromium.org</owner> <owner>grunell@chromium.org</owner> <summary> @@ -59959,7 +59983,7 @@ </histogram> <histogram name="Media.Audio.InputBufferSizeWasChangedMac" - enum="BooleanSuccess" expires_after="2020-02-02"> + enum="BooleanSuccess" expires_after="2020-04-05"> <owner>henrika@chromium.org</owner> <summary> Indicates if the size of the audio unit's IO buffer was changed when @@ -60104,7 +60128,7 @@ </histogram> <histogram name="Media.Audio.OutputDeviceAuthorizationTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>olka@chromium.org</owner> <summary> Time delta between the moment output device authorization request is @@ -60114,7 +60138,7 @@ </histogram> <histogram name="Media.Audio.OutputStreamsCanceledByBrowser" units="streams" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>maxmorin@chromium.org</owner> <summary> When a mojo audio stream factory is destructed, the streams it created are @@ -60224,7 +60248,7 @@ </histogram> <histogram name="Media.Audio.Render.AudioInputsPerMixer.LatencyPlayback" - units="inputs" expires_after="2020-02-02"> + units="inputs" expires_after="2020-04-05"> <owner>olka@chromium.org</owner> <summary> Number of simultaneous inputs coming to the AudioRendererMixer which renders @@ -60248,7 +60272,7 @@ </histogram> <histogram name="Media.Audio.Render.AudioMixing.LatencyMap" units="subsets" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>olka@chromium.org</owner> <summary> Subset of audio output latencies encountered by the renderer so far. Logged @@ -60283,7 +60307,7 @@ </histogram> <histogram name="Media.Audio.Render.FramesRequested" units="frames" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tommi@chromium.org</owner> <summary> The number of frames audio is actually rendered at if the number is @@ -60297,7 +60321,7 @@ </histogram> <histogram name="Media.Audio.Render.GetSourceDataTime.WebRTC" - units="microseconds" expires_after="2020-02-02"> + units="microseconds" expires_after="2020-04-05"> <owner>grunell@chromium.org</owner> <summary> The time spent to get audio data from the source. For WebRTC, it's the time @@ -60313,7 +60337,7 @@ </histogram> <histogram name="Media.Audio.Render.GetSourceDataTimeMax.WebRTC" - units="microseconds" expires_after="2020-02-02"> + units="microseconds" expires_after="2020-04-05"> <owner>grunell@chromium.org</owner> <summary> The maximum time spent to get audio data from the source during a session. @@ -60329,7 +60353,7 @@ </histogram> <histogram name="Media.Audio.Render.Glitches" units="glitches" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tommi@chromium.org</owner> <summary> The number of glitches that were detected at the OS level while an audio @@ -60339,7 +60363,7 @@ </histogram> <histogram name="Media.Audio.Render.InputDeviceStartTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>jonasolsson@chromium.org</owner> <owner>maxmorin@chromium.org</owner> <owner>olka@chromium.org</owner> @@ -60350,7 +60374,7 @@ </histogram> <histogram name="Media.Audio.Render.InputDeviceStreamCreationTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>jonasolsson@chromium.org</owner> <owner>maxmorin@chromium.org</owner> <owner>olka@chromium.org</owner> @@ -60362,7 +60386,7 @@ </histogram> <histogram name="Media.Audio.Render.LargestGlitchMs" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tommi@chromium.org</owner> <summary> The length in milliseconds of the largest glitch that was detected at the OS @@ -60372,7 +60396,7 @@ </histogram> <histogram name="Media.Audio.Render.LostFramesInMs" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tommi@chromium.org</owner> <summary> The combined length in milliseconds of audio glitches. This is useful to @@ -60383,7 +60407,7 @@ </histogram> <histogram name="Media.Audio.Render.OutputDeviceAuthorizationTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>maxmorin@chromium.org</owner> <summary> Similar to Media.Audio.OutputDeviceAuthorizationTime, this histogram @@ -60397,7 +60421,7 @@ </histogram> <histogram name="Media.Audio.Render.OutputDeviceAuthorizationTimedOut" - enum="BooleanTimedOut" expires_after="2020-02-02"> + enum="BooleanTimedOut" expires_after="2020-04-05"> <owner>olka@chromium.org</owner> <summary> Whether audio output device timed out waiting for authorization reply from @@ -60406,7 +60430,7 @@ </histogram> <histogram name="Media.Audio.Render.OutputDeviceStartTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>jonasolsson@chromium.org</owner> <owner>maxmorin@chromium.org</owner> <owner>olka@chromium.org</owner> @@ -60417,7 +60441,7 @@ </histogram> <histogram name="Media.Audio.Render.OutputDeviceStatus" - enum="OutputDeviceStatus" expires_after="2020-02-02"> + enum="OutputDeviceStatus" expires_after="2020-04-05"> <owner>olka@chromium.org</owner> <owner>dalecurtis@chromium.org</owner> <summary> @@ -60426,7 +60450,7 @@ </histogram> <histogram name="Media.Audio.Render.OutputDeviceStreamCreationTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>jonasolsson@chromium.org</owner> <owner>maxmorin@chromium.org</owner> <owner>olka@chromium.org</owner> @@ -60438,7 +60462,7 @@ </histogram> <histogram name="Media.Audio.Render.OutputStreamDuration" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>maxmorin@chromium.org</owner> <summary> This histogram measures the duration of every output stream, as seen from @@ -60449,7 +60473,7 @@ <histogram name="Media.Audio.Render.SinkCache.GetOutputDeviceInfoCacheUtilization" - enum="GetOutputDeviceInfoCacheHit" expires_after="2020-02-02"> + enum="GetOutputDeviceInfoCacheHit" expires_after="2020-04-05"> <owner>olka@chromium.org</owner> <summary> Whether a cached sink was used to get audio output device information, or a @@ -60469,7 +60493,7 @@ </histogram> <histogram name="Media.Audio.Render.SinkCache.UsedForSinkCreation" - enum="BooleanUsage" expires_after="2020-02-02"> + enum="BooleanUsage" expires_after="2020-04-05"> <owner>olka@chromium.org</owner> <summary> Whether a sink was created through the sink cache or directly. @@ -60492,7 +60516,7 @@ </histogram> <histogram name="Media.Audio.Render.StreamBrokerDisconnectReason2" - enum="AudioOutputStreamDisconnectReason2" expires_after="2020-02-02"> + enum="AudioOutputStreamDisconnectReason2" expires_after="2020-04-05"> <owner>olka@chromium.org</owner> <owner>maxmorin@chromium.org</owner> <summary> @@ -60502,7 +60526,7 @@ <histogram name="Media.Audio.Render.StreamBrokerDocumentDestroyedAwaitingCreatedTime" - units="ms" expires_after="2020-02-02"> + units="ms" expires_after="2020-04-05"> <owner>olka@chromium.org</owner> <owner>marinaciocea@chromium.org</owner> <owner>maxmorin@chromium.org</owner> @@ -60514,7 +60538,7 @@ </histogram> <histogram name="Media.Audio.Render.StreamBrokerStreamCreationTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>olka@chromium.org</owner> <owner>marinaciocea@chromium.org</owner> <owner>maxmorin@chromium.org</owner> @@ -60537,7 +60561,7 @@ </histogram> <histogram name="Media.Audio.Render.StreamCallbackError2" - enum="AudioRenderDeviceError" expires_after="2020-02-01"> + enum="AudioRenderDeviceError" expires_after="2020-04-05"> <owner>maxmorin@chromium.org</owner> <summary> When AudioOutputDevice is stopped, this stat is recorded with whether an @@ -60659,7 +60683,7 @@ </histogram> <histogram name="Media.AudioCapturerAudioGlitches" enum="AudioGlitchResult" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>grunell@chromium.org</owner> <summary> Whether there is input audio glitches due to dropped input audio data or @@ -60668,7 +60692,7 @@ </histogram> <histogram name="Media.AudioCapturerDroppedData" units="%" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>grunell@chromium.org</owner> <summary> The percentage of input audio data that was dropped at the browser/renderer @@ -60725,7 +60749,7 @@ </histogram> <histogram name="Media.AudioInputController" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>dalecurtis@chromium.org</owner> <summary>Measures the time taken for AudioInputController::</summary> </histogram> @@ -60770,7 +60794,7 @@ </histogram> <histogram name="Media.AudioOutputController.CallbackError" enum="BooleanError" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>maxmorin@chromium.org</owner> <summary> A boolean that reflects whether or not an error was reported during audio @@ -60790,7 +60814,7 @@ </histogram> <histogram name="Media.AudioOutputController.ProxyStreamCreationResult" - enum="AudioOutputStreamCreationResult" expires_after="2020-02-02"> + enum="AudioOutputStreamCreationResult" expires_after="2020-04-05"> <owner>maxmorin@chromium.org</owner> <summary> Whether an AudioOutputController succeeded in creating and opening an output @@ -60803,7 +60827,7 @@ <histogram name="Media.AudioOutputController.ProxyStreamCreationResultForDeviceChange" - enum="AudioOutputStreamCreationResult" expires_after="2020-02-02"> + enum="AudioOutputStreamCreationResult" expires_after="2020-04-05"> <owner>maxmorin@chromium.org</owner> <summary> Whether an AudioOutputController succeeded in creating and opening an output @@ -60812,7 +60836,7 @@ </histogram> <histogram name="Media.AudioOutputControllerDataNotReady" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>dalecurtis@chromium.org</owner> <summary> Time spent waiting in AudioOutputController::WaitTillDataReady() if the data @@ -60821,7 +60845,7 @@ </histogram> <histogram name="Media.AudioOutputControllerPlaybackStartupSuccess" - enum="BooleanSuccess" expires_after="2020-02-02"> + enum="BooleanSuccess" expires_after="2020-04-05"> <owner>dalecurtis@chromium.org</owner> <summary> Whether playback started successfully after stream startup was requested. @@ -60830,7 +60854,7 @@ <histogram name="Media.AudioOutputResampler.OpenLowLatencyStream" enum="AudioOutputResamplerLowLatencyOpenStreamResult" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>olka@chromium.org</owner> <summary> Whether a low latency stream to be rendered through the resampler was opened @@ -60843,7 +60867,7 @@ <histogram name="Media.AudioOutputStreamProxy.GetPreferredOutputStreamParametersWin.CreateClientResult" - enum="Hresult"> + enum="Hresult" expires_after="2020-04-05"> <owner>marinaciocea@chromium.org</owner> <summary> This histogram is the 3nd potential failure step in @@ -60892,7 +60916,7 @@ <histogram name="Media.AudioOutputStreamProxy.GetPreferredOutputStreamParametersWin.GetMixFormatResult" - enum="Hresult"> + enum="Hresult" expires_after="2020-04-05"> <owner>marinaciocea@chromium.org</owner> <summary> This histogram is the 4nd potential failure step in @@ -60921,7 +60945,7 @@ </histogram> <histogram name="Media.AudioRendererAudioGlitches" enum="AudioGlitchResult" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>henrika@chromium.org</owner> <summary> Captures if render-side audio glitches are detected or not. Sampled when a @@ -60939,7 +60963,7 @@ </histogram> <histogram name="Media.AudioRendererImpl.SinkStatus" enum="OutputDeviceStatus" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>olka@chromium.org</owner> <owner>dalecurtis@chromium.org</owner> <summary> @@ -61015,7 +61039,7 @@ </histogram> <histogram name="Media.AudioService.AudioManagerStartupTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>marinaciocea@chromium.org</owner> <owner>maxmorin@chromium.org</owner> <owner>olka@chromium.org</owner> @@ -61065,7 +61089,7 @@ </histogram> <histogram name="Media.AudioService.ObservedDowntime2" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>marinaciocea@chromium.org</owner> <owner>maxmorin@chromium.org</owner> <owner>olka@chromium.org</owner> @@ -61076,7 +61100,7 @@ </histogram> <histogram name="Media.AudioService.ObservedInitialDowntime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>marinaciocea@chromium.org</owner> <owner>maxmorin@chromium.org</owner> <owner>olka@chromium.org</owner> @@ -61104,7 +61128,7 @@ </histogram> <histogram name="Media.AudioService.ObservedStartStatus" - enum="AudioServiceStartStatus" expires_after="2020-02-02"> + enum="AudioServiceStartStatus" expires_after="2020-04-05"> <owner>marinaciocea@chromium.org</owner> <owner>maxmorin@chromium.org</owner> <owner>olka@chromium.org</owner> @@ -61114,7 +61138,7 @@ </histogram> <histogram name="Media.AudioService.ObservedStartupTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>marinaciocea@chromium.org</owner> <owner>maxmorin@chromium.org</owner> <owner>olka@chromium.org</owner> @@ -61127,7 +61151,7 @@ </histogram> <histogram name="Media.AudioService.ObservedUptime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>marinaciocea@chromium.org</owner> <owner>maxmorin@chromium.org</owner> <owner>olka@chromium.org</owner> @@ -61142,7 +61166,7 @@ </histogram> <histogram name="Media.AudioService.SystemInfoClient" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="AudioSystemInfoRequest" --> <owner>marinaciocea@chromium.org</owner> @@ -61156,7 +61180,7 @@ </histogram> <histogram name="Media.AudioService.Uptime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>marinaciocea@chromium.org</owner> <owner>maxmorin@chromium.org</owner> <owner>olka@chromium.org</owner> @@ -61167,7 +61191,7 @@ </histogram> <histogram name="Media.AudioThreadStatus" enum="AudioThreadStatus" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>dalecurtis@chromium.org</owner> <summary> State of the audio thread. A value of "started" is emitted once @@ -61202,7 +61226,7 @@ </histogram> <histogram name="Media.AVDA.FrameInformation" enum="AVDAFrameInformation" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>liberato@chromium.org</owner> <summary> Record a count for each frame sent to the client by AVDA, separated by what @@ -61290,7 +61314,8 @@ <summary>Kb read by media demuxer from MultiBuffer cache.</summary> </histogram> -<histogram name="Media.BytesReadFromNetwork" units="KB"> +<histogram name="Media.BytesReadFromNetwork" units="KB" + expires_after="2020-04-05"> <owner>hubbe@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary>Kb read by from network into MultiBuffer cache.</summary> @@ -61433,7 +61458,8 @@ </summary> </histogram> -<histogram name="Media.Controls.CTR" enum="MediaControlsCTREvent"> +<histogram name="Media.Controls.CTR" enum="MediaControlsCTREvent" + expires_after="2020-04-05"> <owner>mlamouri@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -61509,7 +61535,8 @@ </summary> </histogram> -<histogram name="Media.Controls.Show.Audio" enum="MediaControlsShowReason"> +<histogram name="Media.Controls.Show.Audio" enum="MediaControlsShowReason" + expires_after="2020-04-05"> <owner>mlamouri@chromium.org</owner> <summary> Record whether the default media controls of an audio element were shown and @@ -61519,7 +61546,8 @@ </summary> </histogram> -<histogram name="Media.Controls.Show.Video" enum="MediaControlsShowReason"> +<histogram name="Media.Controls.Show.Video" enum="MediaControlsShowReason" + expires_after="2020-04-05"> <owner>mlamouri@chromium.org</owner> <summary> Record whether the default media controls of a video element were shown and @@ -61538,7 +61566,7 @@ </histogram> <histogram name="Media.D3D11.DecoderLifetimeProgression" - enum="D3D11LifetimeProgression" expires_after="2019-12-31"> + enum="D3D11LifetimeProgression" expires_after="2020-04-05"> <owner>liberato@chromium.org</owner> <owner>tmathmeyer@chromium.org</owner> <summary> @@ -61549,7 +61577,7 @@ </histogram> <histogram name="Media.D3D11.WasVideoSupported" - enum="D3D11VideoNotSupportedReason" expires_after="2019-12-31"> + enum="D3D11VideoNotSupportedReason" expires_after="2020-04-05"> <owner>liberato@chromium.org</owner> <owner>sandersd@chromium.org</owner> <owner>tmathmeyer@chromium.org</owner> @@ -61761,7 +61789,7 @@ </histogram> <histogram name="Media.DXVAVDA.PictureBufferMechanism" - enum="PictureBufferMechanism"> + enum="PictureBufferMechanism" expires_after="2020-04-05"> <owner>liberato@chromium.org</owner> <owner>sandersd@chromium.org</owner> <summary> @@ -61875,12 +61903,12 @@ </histogram> <histogram name="Media.EME.CdmLoadResult" enum="CdmLoadResult" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>media-dev@chromium.org</owner> <summary>The result from an attempt to load a library CDM.</summary> </histogram> -<histogram name="Media.EME.CdmLoadTime" units="ms" expires_after="2020-02-02"> +<histogram name="Media.EME.CdmLoadTime" units="ms" expires_after="2020-04-05"> <owner>media-dev@chromium.org</owner> <summary>The time spent to load a library CDM.</summary> </histogram> @@ -62085,7 +62113,7 @@ </histogram> <histogram name="Media.EME.RequestMediaKeySystemAccess" - enum="RequestMediaKeySystemAccessStatus" expires_after="2020-02-02"> + enum="RequestMediaKeySystemAccessStatus" expires_after="2020-04-05"> <owner>sandersd@chromium.org</owner> <summary> Key system support query status and result, as reported by @@ -62115,7 +62143,7 @@ </histogram> <histogram name="Media.EME.Widevine.VideoCapability.HasEmptyRobustness" - enum="BooleanEmpty" expires_after="2020-02-02"> + enum="BooleanEmpty" expires_after="2020-04-05"> <owner>xhwang@chromium.org</owner> <summary> Whether the robustness level of any video capability in the supported @@ -62485,12 +62513,14 @@ </summary> </histogram> -<histogram name="Media.GpuVideoDecoderError" enum="VideoDecodeAcceleratorError"> +<histogram name="Media.GpuVideoDecoderError" enum="VideoDecodeAcceleratorError" + expires_after="2020-04-05"> <owner>sandersd@chromium.org</owner> <summary>Counts of video decode errors reported to GpuVideoDecoder.</summary> </histogram> -<histogram name="Media.GpuVideoDecoderInitializeStatus" enum="PipelineStatus"> +<histogram name="Media.GpuVideoDecoderInitializeStatus" enum="PipelineStatus" + expires_after="2020-04-05"> <owner>posciak@chromium.org</owner> <summary>Results of attempts to GpuVideoDecoder::Initialize().</summary> </histogram> @@ -62549,7 +62579,7 @@ </histogram> <histogram name="Media.HardwareKeyPressed" enum="MediaHardwareKeyAction" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>steimel@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -62558,7 +62588,8 @@ </summary> </histogram> -<histogram name="Media.HasEverPlayed" enum="BooleanHasPlayed"> +<histogram name="Media.HasEverPlayed" enum="BooleanHasPlayed" + expires_after="2020-04-05"> <owner>dalecurtis@chromium.org</owner> <summary> Whether a given WebMediaPlayer instance, after preload, started playback; @@ -62567,7 +62598,7 @@ </histogram> <histogram name="Media.HighLatencyAudioCaptureStartupSuccess" - enum="AudioCaptureStartupResult" expires_after="2020-02-02"> + enum="AudioCaptureStartupResult" expires_after="2020-04-05"> <owner>maxmorin@chromium.org</owner> <summary> Whether capture started successfully after a high-latency input stream @@ -62626,7 +62657,7 @@ </histogram> <histogram name="Media.InputStreamDurationWithoutCallback" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>maxmorin@chromium.org</owner> <summary> Duration in milliseconds of low-latency audio input streams which never got @@ -62754,7 +62785,8 @@ </summary> </histogram> -<histogram name="Media.LinuxAudioIO" enum="LinuxAudioIO"> +<histogram name="Media.LinuxAudioIO" enum="LinuxAudioIO" + expires_after="2020-04-05"> <owner>dalecurtis@chromium.org</owner> <summary> Audio IO layer used by the Linux OS, sampled once at startup of the browser. @@ -62809,7 +62841,7 @@ </histogram> <histogram name="Media.LowLatencyAudioCaptureStartupSuccess" - enum="AudioCaptureStartupResult" expires_after="2020-02-02"> + enum="AudioCaptureStartupResult" expires_after="2020-04-05"> <owner>maxmorin@chromium.org</owner> <summary> Whether capture started successfully after a low-latency input stream @@ -62818,7 +62850,7 @@ </histogram> <histogram name="Media.MCVD.ForwardVideoFrameTiming" units="ms" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <owner>liberato@chromium.org</owner> <owner>sandersd@chromium.org</owner> <owner>tguilbert@chromium.org</owner> @@ -62829,7 +62861,7 @@ </histogram> <histogram name="Media.MeanTimeBetweenRebuffers" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>dalecurtis@chromium.org</owner> <summary> The total watch time (see Media.WatchTime) of a given playback divided by @@ -62977,7 +63009,7 @@ </histogram> <histogram name="Media.MojoVideoDecoder.ActiveInstances" units="units" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>sandersd@chromium.org</owner> <summary> Records the number of active MojoVideoDecoderService instances that are @@ -63049,7 +63081,7 @@ </histogram> <histogram name="Media.MSE.DetectedShakaPackagerInMp4" enum="BooleanDetected" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>dalecurtis@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -63360,7 +63392,7 @@ </histogram> <histogram name="Media.Notification.ArtworkPresent" enum="Boolean" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <owner>beccahughes@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -63369,7 +63401,8 @@ </summary> </histogram> -<histogram name="Media.Notification.Click" enum="MediaNotificationClickSource"> +<histogram name="Media.Notification.Click" enum="MediaNotificationClickSource" + expires_after="2020-04-05"> <owner>mlamouri@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -63378,7 +63411,7 @@ </histogram> <histogram name="Media.Notification.Count" units="count" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <owner>beccahughes@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -63388,7 +63421,7 @@ </histogram> <histogram name="Media.Notification.MetadataPresent" - enum="MediaNotificationMetadata" expires_after="2019-12-31"> + enum="MediaNotificationMetadata" expires_after="2020-04-05"> <owner>beccahughes@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -63398,7 +63431,7 @@ </histogram> <histogram name="Media.Notification.Source" enum="MediaNotificationSource" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <owner>beccahughes@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -63408,7 +63441,7 @@ </histogram> <histogram name="Media.Notification.UserAction" enum="MediaSessionAction" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <owner>beccahughes@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -63417,7 +63450,7 @@ </histogram> <histogram name="Media.OutputStreamDuration" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>maxmorin@chromium.org</owner> <summary> Duration of an audio output stream. Measured in AudioOutputController from @@ -63476,7 +63509,7 @@ </histogram> <histogram name="Media.PipelineStatus" enum="PipelineStatus" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>prabhur@chromium.org</owner> <owner>dalecurtis@chromium.org</owner> <summary> @@ -63486,7 +63519,7 @@ </histogram> <histogram name="Media.PipelineStatus.Start" enum="PipelineStatus" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>xhwang@chromium.org</owner> <summary> Status of the media pipeline starting process (including demuxer and @@ -63757,7 +63790,8 @@ </summary> </histogram> -<histogram name="Media.RTCVideoEncoderProfile" enum="VideoCodecProfile"> +<histogram name="Media.RTCVideoEncoderProfile" enum="VideoCodecProfile" + expires_after="2020-04-05"> <owner>posciak@chromium.org</owner> <summary>Video codec profile used in RTC video encoder.</summary> </histogram> @@ -64030,7 +64064,7 @@ </histogram> <histogram base="true" name="Media.TimeToFirstFrame" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>dalecurtis@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -64075,7 +64109,7 @@ </histogram> <histogram base="true" name="Media.TimeToPlayReady" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>dalecurtis@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -65177,7 +65211,7 @@ </summary> </histogram> -<histogram name="Media.WatchTime" units="ms" expires_after="2020-02-02"> +<histogram name="Media.WatchTime" units="ms" expires_after="2020-04-05"> <owner>dalecurtis@chromium.org</owner> <summary> Watch time is defined as the amount of elapsed media time for audio+video @@ -65212,7 +65246,7 @@ </histogram> <histogram name="Media.WebMediaPlayerImpl.HLS.HasAccessControl" enum="Boolean" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <owner>sandersd@chromium.org</owner> <owner>tguilbert@chromium.org</owner> <summary> @@ -65224,7 +65258,7 @@ </histogram> <histogram name="Media.WebMediaPlayerImpl.HLS.IsCorsCrossOrigin" enum="Boolean" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <owner>sandersd@chromium.org</owner> <owner>tguilbert@chromium.org</owner> <summary> @@ -65236,7 +65270,7 @@ </histogram> <histogram name="Media.WebMediaPlayerImpl.HLS.IsMixedContent" enum="Boolean" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <owner>sandersd@chromium.org</owner> <owner>tguilbert@chromium.org</owner> <summary> @@ -65267,7 +65301,7 @@ </histogram> <histogram base="true" name="Media.WebMediaPlayerImpl.Memory" units="KB" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>wolenetz@chromium.org</owner> <summary> Amount of memory used by the WebMediaPlayerImpl and its components. @@ -65403,7 +65437,7 @@ </histogram> <histogram name="MediaLauncherActivity.MediaType" - enum="MediaLauncherActivityMediaType"> + enum="MediaLauncherActivityMediaType" expires_after="2020-04-05"> <owner>steimel@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -66143,7 +66177,7 @@ </histogram> <histogram name="Memory.Browser.PrivateSwapFootprint" units="MB" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>erikchen@chromium.org</owner> <owner>ssid@chromium.org</owner> <summary> @@ -66165,7 +66199,8 @@ </summary> </histogram> -<histogram name="Memory.Browser.SharedMemoryFootprint" units="MB"> +<histogram name="Memory.Browser.SharedMemoryFootprint" units="MB" + expires_after="2020-04-05"> <owner>erikchen@chromium.org</owner> <summary> A rough estimate of the shared memory footprint of the browser process. @@ -66312,7 +66347,8 @@ </summary> </histogram> -<histogram name="Memory.DiscardableAllocationSize" units="KB"> +<histogram name="Memory.DiscardableAllocationSize" units="KB" + expires_after="2020-04-05"> <owner>reveman@chromium.org</owner> <summary> The discardable memory allocation size in KB. Recorded each time a new @@ -66354,7 +66390,7 @@ </histogram> <histogram base="true" name="Memory.Experimental.Browser2" units="MB" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" --> <owner>erikchen@chromium.org</owner> @@ -66366,7 +66402,7 @@ </histogram> <histogram base="true" name="Memory.Experimental.Browser2.Small" units="KB" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" --> <owner>erikchen@chromium.org</owner> @@ -66495,7 +66531,7 @@ </histogram> <histogram base="true" name="Memory.Experimental.Gpu2" units="MB" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" --> <owner>erikchen@chromium.org</owner> @@ -66961,7 +66997,8 @@ <summary>V8 memory usage right before intervention.</summary> </histogram> -<histogram base="true" name="Memory.Experimental.Renderer" units="MB"> +<histogram base="true" name="Memory.Experimental.Renderer" units="MB" + expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="RendererMemoryAllocator" --> <owner>keishi@chromium.org</owner> @@ -67001,7 +67038,7 @@ </histogram> <histogram name="Memory.Experimental.Renderer.Uptime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>keishi@chromium.org</owner> <summary> The uptime of a render process in time ticks (excludes extensions). Emitted @@ -67010,7 +67047,7 @@ </histogram> <histogram base="true" name="Memory.Experimental.Renderer2" units="MB" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" --> <owner>erikchen@chromium.org</owner> @@ -67022,7 +67059,7 @@ </histogram> <histogram base="true" name="Memory.Experimental.Renderer2.Small" units="KB" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" --> <owner>erikchen@chromium.org</owner> @@ -67073,7 +67110,8 @@ </summary> </histogram> -<histogram name="Memory.Experimental.Total2.PrivateMemoryFootprint" units="MB"> +<histogram name="Memory.Experimental.Total2.PrivateMemoryFootprint" units="MB" + expires_after="2020-04-05"> <owner>erikchen@chromium.org</owner> <owner>ssid@chromium.org</owner> <summary> @@ -67368,7 +67406,7 @@ </histogram> <histogram name="Memory.Gpu.SharedMemoryFootprint" units="MB" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>erikchen@chromium.org</owner> <owner>ssid@chromium.org</owner> <summary> @@ -67489,7 +67527,7 @@ </histogram> <histogram name="Memory.NativeLibrary.MappedAndResidentMemoryFootprint2" - units="KB" expires_after="2020-02-02"> + units="KB" expires_after="2020-04-05"> <owner>msalama@google.com</owner> <owner>lizeb@chromium.org</owner> <summary> @@ -67501,7 +67539,7 @@ </histogram> <histogram name="Memory.NativeLibrary.NotResidentOrderedCodeMemoryFootprint" - units="KB" expires_after="2019-12-01"> + units="KB" expires_after="2020-04-05"> <owner>lizeb@chromium.org</owner> <summary> The size of the native library code which was ordered, yet is not resident @@ -67587,7 +67625,8 @@ </summary> </histogram> -<histogram name="Memory.OOMKill.Contents.MemGraphicsMB" units="MB"> +<histogram name="Memory.OOMKill.Contents.MemGraphicsMB" units="MB" + expires_after="2020-04-05"> <owner>oshima@chromium.org</owner> <summary> Graphics driver (GEM object) memory right after a renderer was killed by @@ -67779,7 +67818,7 @@ </histogram> <histogram name="Memory.ParkableString.SavingsKb.5min" units="KB" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <obsolete> Deprecated 07/2019. No longer recorded. </obsolete> @@ -67813,7 +67852,7 @@ </histogram> <histogram name="Memory.PartitionAlloc.MainThreadTime.5min" units="ms" - expires_after="2019-12-31"> + expires_after="2020-04-05"> <owner>lizeb@chromium.org</owner> <owner>pasko@chromium.org</owner> <summary> @@ -67916,7 +67955,7 @@ </histogram> <histogram name="Memory.PressureLevel" enum="MemoryPressureLevel" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>chrisha@chromium.org</owner> <summary> The memory pressure level, which is recorded periodically. This shows the @@ -67934,7 +67973,7 @@ </histogram> <histogram name="Memory.ProcessCount" units="processes" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>creis@chromium.org</owner> <owner>nasko@chromium.org</owner> <summary> @@ -68032,7 +68071,8 @@ </summary> </histogram> -<histogram name="Memory.Renderer.SharedMemoryFootprint" units="MB"> +<histogram name="Memory.Renderer.SharedMemoryFootprint" units="MB" + expires_after="2020-04-05"> <owner>erikchen@chromium.org</owner> <owner>ssid@chromium.org</owner> <summary> @@ -68096,7 +68136,7 @@ </histogram> <histogram name="Memory.RendererProcessCount" units="processes" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>creis@chromium.org</owner> <owner>nasko@chromium.org</owner> <summary> @@ -68133,7 +68173,7 @@ </histogram> <histogram name="Memory.RenderProcessHost.Count.All" units="processes" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>alexmos@chromium.org</owner> <owner>creis@chromium.org</owner> <owner>lukasza@chromium.org</owner> @@ -68151,7 +68191,7 @@ </histogram> <histogram name="Memory.RenderProcessHost.Count.InitializedAndNotDead" - units="processes" expires_after="2020-02-02"> + units="processes" expires_after="2020-04-05"> <owner>alexmos@chromium.org</owner> <owner>creis@chromium.org</owner> <owner>lukasza@chromium.org</owner> @@ -68670,7 +68710,7 @@ </summary> </histogram> -<histogram name="Memory.Total" units="MB" expires_after="2016-09-29"> +<histogram name="Memory.Total" units="MB" expires_after="2020-04-05"> <obsolete> Deprecated 09/2016. Replaced by Memory.Total2. </obsolete> @@ -68701,7 +68741,7 @@ </histogram> <histogram name="Memory.Total.RendererPrivateMemoryFootprint" units="MB" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tommckee@chromium.org</owner> <summary> A rough estimate of the private memory footprint of all renderer processes. @@ -68728,7 +68768,7 @@ </histogram> <histogram name="Memory.Total.SharedMemoryFootprint" units="MB" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>erikchen@chromium.org</owner> <owner>ssid@chromium.org</owner> <summary> @@ -68841,7 +68881,8 @@ </summary> </histogram> -<histogram name="MemoryAndroid.DeviceMemoryClass" units="units"> +<histogram name="MemoryAndroid.DeviceMemoryClass" units="units" + expires_after="2020-04-05"> <owner>hajimehoshi@chromium.org</owner> <owner>kenjibaheux@google.com</owner> <owner>kouhei@chromium.org</owner> @@ -69119,7 +69160,8 @@ </summary> </histogram> -<histogram base="true" name="Mobile.DefaultBrowser.BrowserCount" units="units"> +<histogram base="true" name="Mobile.DefaultBrowser.BrowserCount" units="units" + expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="Mobile.DefaultBrowser.Type" --> <owner>dtrainor@chromium.org</owner> @@ -69136,7 +69178,7 @@ </histogram> <histogram base="true" name="Mobile.DefaultBrowser.SystemBrowserCount" - units="units"> + units="units" expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="Mobile.DefaultBrowser.SystemDefaultBrowser.Type" --> @@ -69154,7 +69196,7 @@ </histogram> <histogram base="true" name="Mobile.Messages.Banner.Dismiss" - enum="MobileMessagesBannerDismissType" expires_after="2020-02-01"> + enum="MobileMessagesBannerDismissType" expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="Mobile.Messages.Type" --> <owner>sczs@chromium.org</owner> @@ -69163,7 +69205,7 @@ </histogram> <histogram base="true" name="Mobile.Messages.Banner.Event" - enum="MobileMessagesBannerEvent" expires_after="2020-02-01"> + enum="MobileMessagesBannerEvent" expires_after="2020-04-05"> <!-- Name completed by histogram_suffixes name="Mobile.Messages.Type" --> <owner>sczs@chromium.org</owner> @@ -69172,7 +69214,7 @@ </histogram> <histogram name="Mobile.Messages.Banner.OnScreenTime" units="ms" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>sczs@chromium.org</owner> <owner>thegreenfrog@google.com</owner> <summary> @@ -69250,7 +69292,7 @@ </histogram> <histogram name="Mobile.SystemNotification.Action.Click" - enum="SystemNotificationActionType" expires_after="2020-01-22"> + enum="SystemNotificationActionType" expires_after="2020-04-05"> <owner>dtrainor@chromium.org</owner> <owner>xingliu@chromium.org</owner> <summary> @@ -69275,7 +69317,7 @@ </histogram> <histogram name="Mobile.SystemNotification.Blocked" - enum="SystemNotificationType" expires_after="2020-02-02"> + enum="SystemNotificationType" expires_after="2020-04-05"> <owner>dtrainor@chromium.org</owner> <summary> Android: Represents the number of system notifications that were blocked and @@ -69284,7 +69326,7 @@ </histogram> <histogram name="Mobile.SystemNotification.BlockedAfterShown" - enum="SystemNotificationType" expires_after="2020-02-02"> + enum="SystemNotificationType" expires_after="2020-04-05"> <owner>dtrainor@chromium.org</owner> <summary> Android: Represents the type of notification that was last shown before the @@ -69294,7 +69336,7 @@ </histogram> <histogram name="Mobile.SystemNotification.ChannelBlocked" - enum="SystemNotificationType" expires_after="2020-02-02"> + enum="SystemNotificationType" expires_after="2020-04-05"> <owner>peter@chromium.org</owner> <summary> Android: Represents the number of system notifications by type that we @@ -69341,7 +69383,7 @@ </histogram> <histogram name="Mobile.SystemNotification.Dismiss" - enum="SystemNotificationType" expires_after="2020-02-02"> + enum="SystemNotificationType" expires_after="2020-04-05"> <owner>xingliu@chromium.org</owner> <summary> Records the type of notification when the user dismisses the Android @@ -69363,7 +69405,7 @@ </histogram> <histogram name="Mobile.SystemNotification.Shown" enum="SystemNotificationType" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>dtrainor@chromium.org</owner> <summary> Android: Represents the number of system notifications that will be @@ -69372,7 +69414,7 @@ </histogram> <histogram name="MobileDownload.Background" - enum="MobileDownloadBackgroundDownloadEvent" expires_after="2019-12-05"> + enum="MobileDownloadBackgroundDownloadEvent" expires_after="2020-04-05"> <owner>hnakashima@chromium.org</owner> <owner>hanxi@chromium.org</owner> <owner>yfriedman@chromium.org</owner> @@ -69402,7 +69444,7 @@ </histogram> <histogram base="true" name="MobileDownload.BytesWasted.ChromeNetworkStack" - units="KB"> + units="KB" expires_after="2020-04-05"> <owner>qinmin@chromium.org</owner> <summary> Android: Records the total data wasted during download due to resumptions. @@ -69442,14 +69484,15 @@ </histogram> <histogram name="MobileDownload.DownloadResumption" - enum="MobileDownloadResumption" expires_after="2020-02-02"> + enum="MobileDownloadResumption" expires_after="2020-04-05"> <owner>qinmin@chromium.org</owner> <summary> Android: Records user interaction on the download resumption button. </summary> </histogram> -<histogram name="MobileDownload.DownloadTime" units="ms"> +<histogram name="MobileDownload.DownloadTime" units="ms" + expires_after="2020-04-05"> <owner>qinmin@chromium.org</owner> <summary> Android: Records the total time for a download by completion status. @@ -69492,7 +69535,7 @@ </histogram> <histogram name="MobileDownload.FirstBackground.StartedReason" - enum="InterruptReason" expires_after="2019-12-05"> + enum="InterruptReason" expires_after="2020-04-05"> <owner>hnakashima@chromium.org</owner> <owner>hanxi@chromium.org</owner> <owner>qinmin@chromium.org</owner> @@ -69530,7 +69573,8 @@ </summary> </histogram> -<histogram name="MobileDownload.InterruptionsCount" units="units"> +<histogram name="MobileDownload.InterruptionsCount" units="units" + expires_after="2020-04-05"> <owner>qinmin@chromium.org</owner> <summary> Android: Records the total interruptions for a download by completion @@ -69612,7 +69656,7 @@ </histogram> <histogram base="true" name="MobileDownload.ResumptionsCount" units="units" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>qinmin@chromium.org</owner> <summary> Android: Records the number of resumptions for a download by resumption @@ -69641,7 +69685,8 @@ </summary> </histogram> -<histogram name="MobileFre.Progress" enum="MobileFreProgress"> +<histogram name="MobileFre.Progress" enum="MobileFreProgress" + expires_after="2020-04-05"> <owner>gogerald@chromium.org</owner> <summary> Android: Records which states of the "first run experience" have @@ -69730,7 +69775,7 @@ </histogram> <histogram name="MobileIntent.PageLoadDueToExternalApp" enum="ClientAppId" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tedchoc@chromium.org</owner> <summary> Android: Count of page loads started by intents from external apps. @@ -69761,7 +69806,7 @@ </histogram> <histogram name="MobileOmnibox.PressedClipboardSuggestionAge" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>jdonnelly@chromium.org</owner> <owner>mpearson@chromium.org</owner> <summary> @@ -69835,7 +69880,7 @@ </histogram> <histogram name="MobileStartup.ColdStartupIntent" enum="MobileStartupIntent" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tedchoc@chromium.org</owner> <summary> For cold starts of Chrome (native not initialized at the time of intent), @@ -69860,7 +69905,7 @@ </histogram> <histogram name="MobileStartup.LaunchType" enum="LaunchType" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tedchoc@chromium.org</owner> <summary> The type of launching Chrome mobile app, e.g launch by hitting icon. @@ -69969,7 +70014,7 @@ </histogram> <histogram base="true" name="MobileStartup.ToolbarFirstDrawTime2" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>yusufo@chromium.org</owner> <summary> Android: The time it takes from launch to the completion of first draw for @@ -70440,7 +70485,7 @@ </histogram> <histogram name="MPArch.ChildProcessLaunchFirst" units="units" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>ppi@chromium.org</owner> <summary> The time it takes to spawn the first child subprocess (including sandbox @@ -70611,7 +70656,7 @@ </histogram> <histogram name="MultiDevice.DeviceSyncService.FindEligibleDevices.Result" - enum="BooleanSuccess" expires_after="2020-02-02"> + enum="BooleanSuccess" expires_after="2020-04-05"> <owner>hansberry@chromium.org</owner> <owner>khorimoto@chromium.org</owner> <summary>Result of trying to find eligible devices.</summary> @@ -70708,7 +70753,7 @@ <histogram name="MultiDevice.SecureChannel.BLE.GattConnectionToAuthentication.EffectiveSuccessRateWithRetries" - enum="BooleanSuccess" expires_after="2020-02-02"> + enum="BooleanSuccess" expires_after="2020-04-05"> <owner>hansberry@chromium.org</owner> <owner>khorimoto@chromium.org</owner> <summary> @@ -70972,7 +71017,7 @@ </histogram> <histogram name="MultiProfile.UsersPerSessionIncremental" units="units" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>skuhne@chromium.org</owner> <summary> The number of users simultaneously signed into a multiprofile session on @@ -73426,7 +73471,7 @@ </histogram> <histogram name="NCN.NetworkOperatorMCCMNC" units="units" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tbansal@chromium.org</owner> <owner>bengr@google.com</owner> <summary> @@ -91488,7 +91533,7 @@ </histogram> <histogram name="NQE.WifiSignalStrength.AtECTComputation" - units="Signal Strength Level" expires_after="2020-02-02"> + units="Signal Strength Level" expires_after="2020-04-05"> <owner>tbansal@chromium.org</owner> <summary> Wifi signal strength level reported by the device at the time of ECT @@ -103973,7 +104018,7 @@ <summary>The size of PDF documents opened in the PDF viewer.</summary> </histogram> -<histogram name="PDF.FormType" enum="PDFFormTypes" expires_after="2020-02-02"> +<histogram name="PDF.FormType" enum="PDFFormTypes" expires_after="2020-04-05"> <owner>rharrison@chromium.org</owner> <summary> Tracks what types of forms are present in PDF document, logged when the @@ -109153,7 +109198,7 @@ </histogram> <histogram name="Power.BatteryRemainingAtEndOfSessionOnBattery" units="%" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tbroch@chromium.org</owner> <summary> Chrome OS remaining battery charge as percent of the maximum battery charge, @@ -109171,7 +109216,7 @@ </histogram> <histogram name="Power.BatteryRemainingAtStartOfSessionOnBattery" units="%" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>tbroch@chromium.org</owner> <summary> Chrome OS remaining battery charge as percent of the maximum battery charge, @@ -109923,7 +109968,8 @@ </summary> </histogram> -<histogram name="PowerML.DimImminent.Action" enum="PowerMLDimImminentAction"> +<histogram name="PowerML.DimImminent.Action" enum="PowerMLDimImminentAction" + expires_after="2020-04-05"> <owner>jiameng@chromium.org</owner> <summary> What happens when UserActivityManager receives a screen dim imminent @@ -109932,7 +109978,7 @@ </histogram> <histogram name="PowerML.ModelDim.Result" enum="PowerMLFinalResult" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>jiameng@chromium.org</owner> <summary> What happens after screen is dimmed following model instruction. Only @@ -109940,7 +109986,8 @@ </summary> </histogram> -<histogram name="PowerML.ModelNoDim.Result" enum="PowerMLFinalResult"> +<histogram name="PowerML.ModelNoDim.Result" enum="PowerMLFinalResult" + expires_after="2020-04-05"> <owner>jiameng@chromium.org</owner> <summary> What happens after screen dim is deferred following model instruction. Only @@ -109948,7 +109995,8 @@ </summary> </histogram> -<histogram name="PowerML.NonModelDim.Result" enum="PowerMLFinalResult"> +<histogram name="PowerML.NonModelDim.Result" enum="PowerMLFinalResult" + expires_after="2020-04-05"> <owner>jiameng@chromium.org</owner> <summary> What happens after screen is dimmed by powerd by ignoring the model @@ -109957,7 +110005,7 @@ </histogram> <histogram name="PowerML.PreviousEventLogging.Result" - enum="PowerMLPreviousEventLoggingResult" expires_after="2020-02-02"> + enum="PowerMLPreviousEventLoggingResult" expires_after="2020-04-05"> <owner>jiameng@chromium.org</owner> <summary> Status of logging previous idle event after a screen dim imminent signal is @@ -109966,7 +110014,7 @@ </histogram> <histogram name="PowerML.SmartDimModel.RequestCanceledDuration" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>amoylan@chromium.org</owner> <owner>jiameng@chromium.org</owner> <owner>napper@chromium.org</owner> @@ -109978,7 +110026,7 @@ </histogram> <histogram name="PowerML.SmartDimModel.RequestCompleteDuration" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>amoylan@chromium.org</owner> <owner>jiameng@chromium.org</owner> <owner>napper@chromium.org</owner> @@ -110002,7 +110050,7 @@ </histogram> <histogram name="PowerML.SmartDimParameter.Result" - enum="PowerMLSmartDimParameterResult"> + enum="PowerMLSmartDimParameterResult" expires_after="2020-04-05"> <owner>jiameng@chromium.org</owner> <summary> The result of parsing the dim threshold parameter value. Only applicable to @@ -112798,7 +112846,7 @@ </histogram> <histogram name="PrintPreview.InitialDisplayTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>thestig@chromium.org</owner> <summary> Time from when print preview is intiated until the intial preview is sent to @@ -112991,7 +113039,7 @@ </histogram> <histogram name="PrintPreview.PrintDocumentSize.HTML" units="KB" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>thestig@chromium.org</owner> <summary> The average size of a page in the printed document when the source is HTML. @@ -112999,7 +113047,7 @@ </histogram> <histogram name="PrintPreview.PrintDocumentSize.PDF" units="KB" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>thestig@chromium.org</owner> <summary> The average size of a page in the printed document when the source is PDF. @@ -113078,7 +113126,8 @@ </summary> </histogram> -<histogram name="PrintPreview.RendererError" enum="PrintPreviewFailureType"> +<histogram name="PrintPreview.RendererError" enum="PrintPreviewFailureType" + expires_after="2020-04-05"> <owner>thestig@chromium.org</owner> <summary> Count how frequently a set of pre-defined print preview errors occur. @@ -113086,7 +113135,7 @@ </histogram> <histogram name="PrintPreview.RenderPDFPageTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>thestig@chromium.org</owner> <summary>Time taken to render each PDF page for print preview.</summary> </histogram> @@ -113606,7 +113655,7 @@ </histogram> <histogram name="Profile.NumberOfAccountsPerProfile" units="units" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>msarda@chromium.org</owner> <owner>droger@chromium.org</owner> <summary> @@ -113704,7 +113753,7 @@ </histogram> <histogram name="Profile.NumberOfSignedInProfiles" units="units" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>rogerta@chromium.org</owner> <summary> Counts the number of signed-in profiles on a user's machine at least every @@ -114092,7 +114141,7 @@ </histogram> <histogram name="ProfileChooser.HasProfilesShown" enum="BooleanShown" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>vasilii@chromium.org</owner> <owner>ewald@chromium.org</owner> <summary> @@ -114221,7 +114270,7 @@ </histogram> <histogram name="ProtoDB.LoadKeysSuccess" enum="BooleanSuccess" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>nyquist@chromium.org</owner> <owner>ssid@chromium.org</owner> <summary>Whether a ProtoDB LoadKeys call was successful or not.</summary> @@ -114846,7 +114895,7 @@ </histogram> <histogram name="Quota.DaysBetweenRepeatedOriginEvictions" units="units" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>jarrydg@chromium.org</owner> <summary> The number of days since an origin was last chosen to be evicted from the @@ -122573,7 +122622,7 @@ </summary> </histogram> -<histogram name="SB2.RemoteCall.Elapsed" units="ms" expires_after="2020-02-02"> +<histogram name="SB2.RemoteCall.Elapsed" units="ms" expires_after="2020-04-05"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -138468,7 +138517,7 @@ </histogram> <histogram name="Stability.BadMessageTerminated.Chrome" - enum="BadMessageReasonChrome" expires_after="2020-01-26"> + enum="BadMessageReasonChrome" expires_after="2020-04-05"> <owner>creis@chromium.org</owner> <owner>jamescook@chromium.org</owner> <summary> @@ -139189,7 +139238,7 @@ </histogram> <histogram name="Startup.BrowserMainRunnerImplInitializeLongTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>robliao@chromium.org</owner> <summary> The amount of time that elapsed during BrowserMainRunnerImpl::Initialize. @@ -141991,7 +142040,7 @@ </histogram> <histogram name="Sync.BackendInitializeFirstTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>zea@chromium.org</owner> <summary> Tracks sync backend initialization time during initial sync setup. @@ -142449,7 +142498,7 @@ </histogram> <histogram name="Sync.CryptographerPendingKeys" - enum="SyncCryptographerPendingKeysState" expires_after="2020-02-02"> + enum="SyncCryptographerPendingKeysState" expires_after="2020-04-05"> <owner>zea@chromium.org</owner> <summary> Breakdown of sync users whose cryptographer has pending keys. @@ -143233,7 +143282,7 @@ </histogram> <histogram name="Sync.KeystoreDecryptionFailed" - enum="SyncKeystoreDecryptionFailure" expires_after="2020-02-02"> + enum="SyncKeystoreDecryptionFailure" expires_after="2020-04-05"> <owner>zea@chromium.org</owner> <summary> The reason for a failure decrypting the keystore decryptor token. @@ -143487,7 +143536,7 @@ </histogram> <histogram base="true" name="Sync.ModelTypeMemoryKB" units="KB" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>mastiz@chromium.org</owner> <owner>jkrcal@chromium.org</owner> <summary> @@ -143548,7 +143597,7 @@ </histogram> <histogram name="Sync.NigoriMigrationReason" enum="SyncNigoriMigrationReason" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>mmoskvitin@google.com</owner> <owner>mastiz@chromium.org</owner> <owner>mamir@chromium.org</owner> @@ -143821,7 +143870,7 @@ </histogram> <histogram name="Sync.PassphraseType" enum="SyncPassphraseType" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>treib@chromium.org</owner> <owner>mastiz@chromium.org</owner> <summary>The active sync passphrase type at sync startup.</summary> @@ -143938,7 +143987,7 @@ </histogram> <histogram name="Sync.PostedGetUpdatesOrigin" enum="SyncGetUpdatesOrigin" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>mastiz@chromium.org</owner> <owner>jkrcal@chromium.org</owner> <summary> @@ -144333,7 +144382,7 @@ </histogram> <histogram name="Sync.ShouldTriggerMigrationAfterMigration" enum="Boolean" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>mmoskvitin@google.com</owner> <owner>mastiz@chromium.org</owner> <owner>mamir@chromium.org</owner> @@ -144724,7 +144773,7 @@ </histogram> <histogram base="true" name="Sync.USSMigrationEntityCount" units="entries" - expires_after="2020-02-01"> + expires_after="2020-04-05"> <owner>mastiz@chromium.org</owner> <summary> Counts the number of sync entities per model type successfully migrated from @@ -148881,7 +148930,7 @@ </histogram> <histogram name="Tracing.Background.FinalizationDisallowedReason" - enum="TracingFinalizationDisallowedReason" expires_after="2020-01-30"> + enum="TracingFinalizationDisallowedReason" expires_after="2020-04-05"> <owner>ssid@chromium.org</owner> <summary> Reason why background tracing finalization was not allowed. Also see @@ -149263,7 +149312,7 @@ </histogram> <histogram name="Translate.InitiationStatus.v2" - enum="TranslateInitiationStatus" expires_after="2020-02-02"> + enum="TranslateInitiationStatus" expires_after="2020-04-05"> <owner>kenjibaheux@google.com</owner> <summary> The reason why Chrome decided to perform the next action (e.g., to show @@ -149855,6 +149904,17 @@ <summary>Number of serialized UKM entries when storing a UKM log.</summary> </histogram> +<histogram name="UKM.Entries.SerializedCountFCP" units="entries" + expires_after="2020-07-01"> + <owner>rkaplow@chromium.org</owner> + <owner>ukm-team@google.com</owner> + <summary> + Number of serialized UKM entries that are of type PageLoad that have the + metric PaintTiming.NavigationToFirstContentfulPaint. This is recorded every + time a UKM log is stored. + </summary> +</histogram> + <histogram name="UKM.InitSequence" enum="UmaInitSequence" expires_after="2020-07-01"> <owner>rkaplow@chromium.org</owner> @@ -150829,7 +150889,7 @@ </histogram> <histogram name="UMA.NegativeSamples.Histogram" enum="HistogramNameHash" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asvitkine@chromium.org</owner> <owner>bcwhite@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -150905,7 +150965,7 @@ </histogram> <histogram name="UMA.PersistentHistograms.InitResult" - enum="PersistentHistogramsInitResult" expires_after="2020-02-02"> + enum="PersistentHistogramsInitResult" expires_after="2020-04-05"> <owner>bcwhite@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -151034,7 +151094,7 @@ </histogram> <histogram name="UMA.SubprocessMetricsProvider.SubprocessCount" - units="subprocesses" expires_after="2020-02-02"> + units="subprocesses" expires_after="2020-04-05"> <owner>asvitkine@chromium.org</owner> <owner>bcwhite@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -151082,7 +151142,7 @@ </histogram> <histogram name="UMA.TruncatedEvents.UserAction" units="events" - expires_after="2020-03-29"> + expires_after="2020-04-05"> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -153038,7 +153098,7 @@ </histogram> <histogram name="V8.GCFinalizeMCReduceMemory" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>ulan@chromium.org</owner> <owner>hpayer@chromium.org</owner> <summary> @@ -157143,7 +157203,7 @@ </histogram> <histogram name="WebCore.IndexedDB.BackingStore.OpenStatus" - enum="IDBLevelDBBackingStoreOpenResult" expires_after="2020-02-02"> + enum="IDBLevelDBBackingStoreOpenResult" expires_after="2020-04-05"> <owner>dgrogan@chromium.org</owner> <summary> Count of the different success and failure modes when opening an IndexedDB @@ -157205,7 +157265,7 @@ </histogram> <histogram name="WebCore.IndexedDB.DestroyCorruptBackingStoreStatus" - enum="LevelDBStatus" expires_after="2020-02-02"> + enum="LevelDBStatus" expires_after="2020-04-05"> <owner>cmumford@chromium.org</owner> <summary> Count of the results when attempting to destroy a corrupt Indexed DB backing @@ -157213,6 +157273,18 @@ </summary> </histogram> +<histogram name="WebCore.IndexedDB.ErrorDuringForceCloseAborts" + enum="LevelDBStatus" expires_after="2020-10-08"> + <owner>dmurph@chromium.org</owner> + <summary> + Recorded when there is an error during the force close of IndexedDB for an + origin. A force close can be triggered either from DevTools, or when there + is a disk error. Errors during force close are ignored, as the system is + already being torn down. This metric is the only record of these errors + happening. + </summary> +</histogram> + <histogram name="WebCore.IndexedDB.FrontEndAPICalls" enum="IndexedDatabaseMethods" expires_after="2018-07-23"> <obsolete> @@ -158373,7 +158445,7 @@ </histogram> <histogram name="WebFont.BlankTextShownTime" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>kenjibaheux@chromium.org</owner> <owner>ksakamoto@chromium.org</owner> <summary> @@ -158699,7 +158771,7 @@ </histogram> <histogram name="WebFont.LocalFontUsed" enum="BooleanUsage" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>hajimehoshi@chromium.org</owner> <owner>kenjibaheux@chromium.org</owner> <owner>kouhei@chromium.org</owner> @@ -159110,7 +159182,7 @@ </histogram> <histogram name="WebRTC.Audio.ApmCaptureOutputLevelPeakRms" - units="dBFS (negated)" expires_after="2020-02-02"> + units="dBFS (negated)" expires_after="2020-04-05"> <owner>peah@chromium.org</owner> <summary> This histogram reports the peak RMS of the signal in the output of WebRTC's @@ -159471,7 +159543,7 @@ </histogram> <histogram name="WebRTC.Audio.EchoCanceller.RenderUnderruns" - enum="WebRTCEventFrequency" expires_after="2020-02-02"> + enum="WebRTCEventFrequency" expires_after="2020-04-05"> <owner>peah@chromium.org</owner> <summary> This histogram logs the frequency of underruns in the render buffer of the @@ -159621,7 +159693,7 @@ </histogram> <histogram name="WebRTC.Audio.SpeechExpandRatePercent" units="%" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>hlundin@chromium.org</owner> <summary> Measures the audible expand rate for an incoming WebRTC audio stream. The @@ -159897,7 +159969,7 @@ </histogram> <histogram name="WebRTC.BWE.Types" enum="WebRtcBweType" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>holmer@chromium.org</owner> <summary> The bandwidth estimation used in WebRTC calls. Records whether the BWE is @@ -159917,7 +159989,7 @@ </histogram> <histogram name="WebRTC.Call.BitrateReceivedInKbps" units="kbps" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>holmer@chromium.org</owner> <summary> Average total bitrate received during a call (audio + video + RTCP), counted @@ -159937,7 +160009,7 @@ </histogram> <histogram name="WebRTC.Call.LifetimeInSeconds" units="seconds" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> The lifetime of a call. Recorded when a Call instance is destroyed. @@ -160004,7 +160076,7 @@ </histogram> <histogram name="WebRTC.Call.VideoBitrateReceivedInKbps" units="kbps" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>holmer@chromium.org</owner> <summary> Average video bitrate received during a call, counted from first packet @@ -160164,7 +160236,7 @@ </histogram> <histogram name="WebRTC.PeerConnection.CandidatePairType" - enum="IceCandidatePairTypes" expires_after="2020-02-02"> + enum="IceCandidatePairTypes" expires_after="2020-04-05"> <owner>qingsi@google.com</owner> <owner>jeroendb@google.com</owner> <summary> @@ -160532,7 +160604,7 @@ </histogram> <histogram name="WebRTC.ReceivedAudioTrackDuration" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>perkj@chromium.org</owner> <summary> Durations of audio tracks received over a PeerConnection. The stopwatch @@ -160700,7 +160772,7 @@ </histogram> <histogram name="WebRTC.Video.AdaptChangesPerMinute" units="changes/minute" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> The average number of adaptation changes per minute for a sent video stream. @@ -160709,7 +160781,7 @@ </histogram> <histogram name="WebRTC.Video.AverageRoundTripTimeInMilliseconds" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>holmer@chromium.org</owner> <summary> The average round-trip time of a WebRTC call in milliseconds. Recorded when @@ -160718,7 +160790,7 @@ </histogram> <histogram name="WebRTC.Video.AVSyncOffsetInMs" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> The absolute value of the sync offset between a rendered video frame and the @@ -160751,7 +160823,7 @@ </summary> </histogram> -<histogram name="WebRTC.Video.BadCall.Qp" units="%" expires_after="2020-02-02"> +<histogram name="WebRTC.Video.BadCall.Qp" units="%" expires_after="2020-04-05"> <owner>sprang@chromium.org</owner> <summary> Fraction of time the call was classified as bad because of high qp. @@ -160816,7 +160888,7 @@ </histogram> <histogram name="WebRTC.Video.CurrentDelayInMs" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> Average current delay for a received video stream. This is the actual delay @@ -160825,7 +160897,8 @@ </summary> </histogram> -<histogram name="WebRTC.Video.Decoded.Vp8.Qp" units="qp value"> +<histogram name="WebRTC.Video.Decoded.Vp8.Qp" units="qp value" + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> The average QP (quantizer value) per frame for a received VP8 video stream. @@ -160834,7 +160907,7 @@ </histogram> <histogram name="WebRTC.Video.DecodedFramesPerSecond" units="fps" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> The number of decoded frames per second for a received video stream. @@ -160844,7 +160917,7 @@ </histogram> <histogram name="WebRTC.Video.DecodeTimeInMs" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> The average decode time per frame for a received video stream. Recorded when @@ -160932,7 +161005,7 @@ </histogram> <histogram name="WebRTC.Video.Encoded.Qp" units="qp value" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> The average QP (quantizer value) per frame for a sent video stream. Recorded @@ -160941,7 +161014,7 @@ </histogram> <histogram name="WebRTC.Video.Encoder.CodecType" enum="WebRtcVideoCodecs" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> Configured video codec for a sent video stream. Recorded when a @@ -160951,7 +161024,7 @@ </histogram> <histogram name="WebRTC.Video.EncodeTimeInMs" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> The average encode time per frame for a sent video stream. Recorded when a @@ -161044,7 +161117,7 @@ </histogram> <histogram name="WebRTC.Video.InputFramesPerSecond" units="fps" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> The number of incoming frames per second for a sent video stream. Recorded @@ -161209,7 +161282,7 @@ </histogram> <histogram name="WebRTC.Video.OnewayDelayInMs" units="ms" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> Average delay (network delay (rtt/2) + jitter delay + decode time + render @@ -161938,7 +162011,7 @@ </histogram> <histogram name="WebRTC.Video.SentFramesPerSecond" units="fps" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> The number of sent frames per second for a sent video stream. Recorded when @@ -161976,7 +162049,7 @@ </histogram> <histogram name="WebRTC.Video.SentWidthInPixels" units="pixels" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>asapersson@chromium.org</owner> <summary> The average sent width per frame for a sent video stream. Recorded when a @@ -162196,7 +162269,7 @@ </histogram> <histogram name="WebsiteSettings.AllSitesAction" - enum="WebSiteSettingsAllSitesAction" expires_after="2019-11-27"> + enum="WebSiteSettingsAllSitesAction" expires_after="2020-04-05"> <owner>mxcai@chromium.org</owner> <owner>dominickn@chromium.org</owner> <summary> @@ -162417,7 +162490,7 @@ </histogram> <histogram name="WebUI.CreatedForUrl" enum="WebUIUrlHashes" - expires_after="2020-02-02"> + expires_after="2020-04-05"> <owner>dbeam@chromium.org</owner> <summary>URLs for which Chrome creates WebUIControllers.</summary> </histogram>
diff --git a/ui/gfx/font_fallback_linux.cc b/ui/gfx/font_fallback_linux.cc index e57866aa..c5031e0 100644 --- a/ui/gfx/font_fallback_linux.cc +++ b/ui/gfx/font_fallback_linux.cc
@@ -18,7 +18,7 @@ #include "base/trace_event/trace_event.h" #include "third_party/icu/source/common/unicode/uchar.h" #include "third_party/icu/source/common/unicode/utf16.h" -#include "third_party/skia/include/core/SkTypeface.h" +#include "third_party/skia/include/core/SkFontMgr.h" #include "ui/gfx/font.h" #include "ui/gfx/font_fallback.h" #include "ui/gfx/linux/fontconfig_util.h" @@ -90,9 +90,10 @@ if (entry != cache->end()) return sk_sp<SkTypeface>(entry->second); + sk_sp<SkFontMgr> font_mgr = SkFontMgr::RefDefault(); std::string filename = font_path.AsUTF8Unsafe(); sk_sp<SkTypeface> typeface = - SkTypeface::MakeFromFile(filename.c_str(), ttc_index); + font_mgr->makeFromFile(filename.c_str(), ttc_index); (*cache)[key] = typeface; return sk_sp<SkTypeface>(typeface);
diff --git a/ui/login/display_manager.js b/ui/login/display_manager.js index 9f0942b..d83fa0d 100644 --- a/ui/login/display_manager.js +++ b/ui/login/display_manager.js
@@ -200,7 +200,16 @@ * Whether the virtual keyboard is displayed. * @type {boolean} */ - virtualKeyboardShown: false, + virtualKeyboardShown_: false, + + get virtualKeyboardShown() { + return this.virtualKeyboardShown_; + }, + + set virtualKeyboardShown(shown) { + this.virtualKeyboardShown_ = shown; + document.documentElement.setAttribute('virtual-keyboard', shown); + }, /** * Type of UI.
diff --git a/ui/login/oobe.css b/ui/login/oobe.css index 7e028d9..0ee6e2f 100644 --- a/ui/login/oobe.css +++ b/ui/login/oobe.css
@@ -21,6 +21,7 @@ --shelf-area-height: var(--shelf-area-height-base); } +html[virtual-keyboard=true], html[screen=gaia-signin] { --shelf-area-height: 0; }
diff --git a/ui/ozone/platform/drm/common/drm_overlay_manager.cc b/ui/ozone/platform/drm/common/drm_overlay_manager.cc index 4d0670f..fbb3245 100644 --- a/ui/ozone/platform/drm/common/drm_overlay_manager.cc +++ b/ui/ozone/platform/drm/common/drm_overlay_manager.cc
@@ -9,6 +9,7 @@ #include <utility> #include "base/trace_event/trace_event.h" +#include "build/build_config.h" #include "ui/gfx/geometry/rect_conversions.h" #include "ui/ozone/platform/drm/common/drm_overlay_candidates.h" #include "ui/ozone/public/overlay_surface_candidate.h" @@ -125,6 +126,21 @@ return false; } +#if defined(ARCH_CPU_X86_FAMILY) + // TODO(dcastagna|oshima): Re-enable NV12 format as HW overlay once + // b/113362843 is addressed. + if (candidate.format == gfx::BufferFormat::YUV_420_BIPLANAR) { + // Reject buffer whose cropped horizontal coordinates doesn't fall on + // even pixel boundary. + int nearest_x = gfx::ToFlooredInt(candidate.buffer_size.width() * + candidate.crop_rect.x()); + int nearest_width = gfx::ToFlooredInt(candidate.buffer_size.width() * + candidate.crop_rect.width()); + if (nearest_x % 2 != 0 || nearest_width % 2 != 0) + return false; + } +#endif + return true; }
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html index 78c43b6..18994c6 100644 --- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html +++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html
@@ -20,14 +20,15 @@ box-sizing: border-box; color: var(--google-grey-700); font-size: 13px; - height: 640px; + height: var(--multidevice-setup-height, 640px); line-height: 16px; margin: auto; padding: 60px 32px 32px 32px; - width: 768px; + width: var(--multidevice-setup-width, 768px); } iron-pages { + overflow: auto; padding: 0 32px; } </style>